赞
踩
read_area(area,dbnumber,start,size)
area:区分读写区域
- areas = ADict({
- 'PE': 0x81, #input 输入区
- 'PA': 0x82, #output 输出区
- 'MK': 0x83, #bit memory 中间存储区(M区)
- 'DB': 0x84, #DB区
- 'CT': 0x1C, #counters
- 'TM': 0x1D, #Timers
- })
dbnumber:只有在对DB块使用时才有用,默认设置为0
start:起始地址为Q0.4的这个0(也就是输出的第几个字节)
size:选择读取的数据类型,下表(为什么选择地址这里没有说要给出Q0.4的4呢?是因为读取数据类型以byte(字节,即至少读取8位)起步,由参数size决定,要对位进行操作可以在读取后采用其他指令对具体某一位做读写)
位bit,音译为“比特”,表示二进制位
字节Byte,音译为“拜特”,习惯上用大写的“B”表示,一个字节由八个二进制位构成,即1个字节等于8个比特(1Byte=8bit),1个字节可以存入一个ASCII码,2个字节可以存放一个汉字国标码
字(word),计算机进行数据处理时,一次存取、加工和传送的数据长度,一个字通常由一个或多个(一般是字节的整数位)字节构成
一个专门用来构建读取和改写的函数,另一个则是用使用构造的函数进行读写操作,比较推荐这种,下次要用直接调用,一行代码实现读写
读取---置换---写入
- from snap7.util import * #对位操作的函数要导入该库
-
- #定义的函数可直接对QX.X一个位进行操作
- def Writeoutput(dev,byte,bit,cmd):
- data=dev.read_area(0x82,0,byte,1)#0x82表示输出Q,byte表示起始地址(Q0),1表示类型为byte,cmd位置的值(True或False)
- set_bool(data,byte,bit,cmd) #置Qbyte.bit(即Q0.4)为cmd(即True)
- dev.write_area(0x82,0,byte,data)#同样,进行写数据操作
-
- #该函数只进行了读操作
- def Readoutput(dev,byte,bit):
- data=dev.read_area(0x82,0,byte,1)
- status=get_bool(data,byte,bit) #获取位状态
- return status
- import snap7
- import plc as PLC #导入前面的plc.py文件(注意两个py文件在一个文件夹)
-
- myplc=snap7.client.Client()
- myplc.connect('192.168.0.1', rack=0,slot=1) #建立连接(相关信息去TIA看,IP,机架和插槽)
- print(myplc.get_connected()) # 测试是否通讯成功
-
- #使用plc.py里构建的两个函数(写、读)
- PLC.Writeoutput(myplc,0,4,True) #该函数效果就是写Q0.4为True
- status=PLC.Readoutput(myplc,0,4) #该函数效果就是读取Q0.4的值
- print(status)
- import snap7
- from snap7.util import *
- from snap7.snap7types import *
-
-
- class DBObject(object): #空对象,用于后面__setattr__使用
- pass
-
- #offset是字典,其内容代表各类型数据所占字节长度
- offset={"Bool":2,"Int":2,"Real":4,"Dint":4,"String":256} #实测所占长度准确
-
- #db表示要读取的信息,由上图得到,中间用Tab隔开,非空格
- db=\
- """
- Temperature Real 0.0
- Cold Bool 4.0
- RPis_to_Buy Int 6.0
- Db_test_String String 8.0
- """
- #get_db_size用来获取DB块内数据长度,由最后一个数据起始地址和它的数据类型得到(这里是8.0和String,长度就是8+256=264),就这一个作用(苦笑)
- def get_db_size(array,bytekey,datatypekey):#bytekey:地址 datatypekey:数据类型
- seq,length=[x[bytekey] for x in array],[x[datatypekey] for x in array]
- idx=seq.index(max(seq)) #index就来检索位置
- lastByte=int(max(seq).split('.')[0])+(offset[length[idx]])
- return lastByte #返回DB块内要读取的最末尾位置,这里是264
-
-
- #DBRead才是用来读取数据的函数,length是获取的最大长度
- def DBRead(myplc,db_num,length,items):
- data=myplc.read_area(0x84,db_num,0,length)
- obj=DBObject()
- for item in items:
- value=None
- offset=int(item['bytebit'].split('.')[0]) #取数据起始位置
-
- ##读取各种数据类型的数据
- if item['data']=='Real':
- value=get_real(data,offset)
- if item['data']=="Bool":
- bit=int(item['bytebit'].split('.')[1])
- value=get_bool(data,offset,bit)
- if item['data']=="Int":
- value=get_int(data,offset)
- if item['data']=='String':
- value=get_string(data,offset,256)
- obj.__setattr__(item['name'],value)#构建obj.item['name']=value形式,方便后续输出
- return obj
-
- if __name__=="__main__":
- myplc=snap7.client.Client()
- myplc.connect('192.168.0.1', rack=0,slot=1)
-
- #过滤器函数,把后面list内的东西放入前面的函数判断,生成返回为True的新list
- itemlist=list(filter(lambda a:a!='',db.split('\n'))) #提取每行数据(一行一个)
- #把每个数据的name(名字)、data(数据类型)bytebit(起始地址)归好类
- items=[
- {
- "name":x.split( )[0], #参数名
- "data":x.split( )[1], #数据类型
- "bytebit":x.split( )[2] #数据起始地址
- } for x in itemlist
- ]
- #调用函数,先获取数据长度,再读取各个数据的值,放在对象实例里面obj
- length=get_db_size(items,'bytebit','data')
- meh=DBRead(myplc,10,length,items)
-
- #输出各个数据
- print('''
- Cold:\t\t\t{}
- Tempeature:\t\t{}
- Rpis_to_Buy:\t\t{}
- Db_test_String:\t{}
- '''.format(meh.Cold,meh.Temperature,meh.RPis_to_Buy,meh.Db_test_String))
- myplc.disconnect();
- def DBRead(myplc,db_num,length,items):
- data=myplc.read_area(0x84,db_num,0,length)
- obj=DBObject()
- for item in items:
- value=None
- offset=int(item['bytebit'].split('.')[0]) #取数据起始位置
-
- ##读取各种数据类型的数据
- if item['data']=='Real':
- value=get_real(data,offset)
- set_real(data,offset,132.032)
- if item['data']=="Bool":
- bit=int(item['bytebit'].split('.')[1])
- value=get_bool(data,offset,bit)
- set_bool(data,offset,0,False)
- if item['data']=="Int":
- value=get_int(data,offset)
- set_int(data,offset,312)
- if item['data']=='String':
- value=get_string(data,offset,256)
- print(offset)
- set_string(data,offset,'Who I am',256)
- myplc.write_area(0x84,db_num,0,data)
- obj.__setattr__(item['name'],value) #构建obj.item['name']=value形式,方便后续输出
- return obj
- import snap7
- from snap7.util import *
- from snap7.snap7types import *
-
- myplc=snap7.client.Client()
- myplc.connect('192.168.0.1', rack=0,slot=1)
-
- data=myplc.read_area(0x84,10,0,256) #知道是DB10了
- value=get_int(data,6) #已经知道6.0 是int型
- print(value)
- set_int(data,6,112)
- myplc.write_area(0x84,10,0,data)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。