通过Python实现DB区读操作
版权声明
无需授权随便转载
读DB区
使用的方法依旧是read_areadef read_area(self, area, dbnumber, start, size)
area是PLC内各寄存区的代码,具体参考下表
dbnumber是DB块编号,可以在DB块属性中常规选项中查看到,start为寄存区起始地址,size是DB块完整的长度,因为DB块中可以有各种数据类型,所以长度参数一定要准确,否则返回数据会出现问题。
要访问DB块,必须取消DB块属性中的优化的块访问选项
针对的是DB块,所有area参数需要使用0x84,size参数需要通过DB块内的数据数量和数据类型具体计算出来
因为read_area方法返回的是byteArray类型的结果,可以通过get_bool,get_int,get_read,get_dword方法直接将byteArray类型转换成对应的数据类型
比如针对get_bool方法def get_bool(_bytearray, byte_index, bool_index)
第一个bytearray参数是read_area的返回值,byte_index参数是DB块中变量的偏移量,bool_index参数是位变量的地址。
先来看一个简单的例子,DB块中有两个变量,一个浮点数,一个布尔量
main函数中的代码如下def main():
s71200 = snap7.client.Client()
connect(s71200, '192.168.2.110', 0, 1) while True: try:
data = s71200.read_area(0x84, 1, 0, 5)#此处5代表DB块中数据长度,浮点数4个byte,布尔量一个byte
print(data)
value = get_real(data, 0)#此处0是浮点数的偏移量
value2 = get_bool(data, 4, 0)#此处4是布尔量的偏移量
print(value, value2)
sleep(5) except Snap7Exception as e:
connect(s71200, '192.168.2.110', 0, 1)if __name__ == '__main__':
main()
运行后如下
但是这样操作很麻烦,需要提前计算好DB块中的数据长度,需要将每个数据的偏移量和数据类型都填好,这里希望有一个简单的方法,定义好DB块的数据名称,数据类型,数据偏移量,之后运行程序后,自动计算长度,对应数据类型和偏移量,从而获取正确的结果。
DB块中的数据名称及数据类型,偏移量如下图
定义DB块数据格式db = \"""
DB001 Real 0.0
DB002 Bool 4.0
DB003 Int 6.0
DB004 String 8.0
DB005 Real 264.0
"""
数据格式定义好后,需要从这个数据格式中得到r