作者 | 主题 |
---|---|
davelyu 侠士 经验值:1589 发帖数:162 精华帖:3 |
楼主 2019-06-14 20:48:09
主题:python读取S7-1200 DB块 通过Python实现DB区读操作版权声明 无需授权随便转载 读DB区使用的方法依旧是read_area
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方法
第一个bytearray参数是read_area的返回值,byte_index参数是DB块中变量的偏移量,bool_index参数是位变量的地址。 先来看一个简单的例子,DB块中有两个变量,一个浮点数,一个布尔量 main函数中的代码如下
运行后如下 但是这样操作很麻烦,需要提前计算好DB块中的数据长度,需要将每个数据的偏移量和数据类型都填好,这里希望有一个简单的方法,定义好DB块的数据名称,数据类型,数据偏移量,之后运行程序后,自动计算长度,对应数据类型和偏移量,从而获取正确的结果。 DB块中的数据名称及数据类型,偏移量如下图 定义DB块数据格式
数据格式定义好后,需要从这个数据格式中得到read_area方法要的参数,这里通过字典是很容易实现的,我们可以定义一个字典的列表,列表中每一个字典都是一个数据,字典的键值可以是name,datatype,bytebit,数据结构如下
之后可以通过for方法依次取出每一个键值,传递到read_area方法中。 定义DBRead()函数这里希望DBRead函数中的参数如下代码所示:
dev参数是设备名称,db_num是DB块编号,db_len是DB块中所有数据总长度,db_items是DB块中数据,它的数据结构应该和上图所示的字典列表一致。 首先通过read_area获取DB块中的数据,代码如下
通过for循环以此取出db_items中的字典,通过键判断数据类型和偏移量,之后调用对应的get方法,代码如下
完整DBRead函数的代码如下
DBRead函数中还需要知道db_len的值,所以还需要定义一个函数去获得DB块中数据的总长度 定义get_db_len()函数通过下图 可以看出,数据的总长度其实就是最后一个数据的偏移量的数值加上自生所占的数据长度,如图五个数据的总长度应该是264 + 4 = 268,所以get_db_len()函数只要找到偏移量最大的数,在获得这个偏移量对用的数据类型所占的内存长度,相加后就可以得到整个数据长度。
db_items和DBRead函数中的一致,bytebit和datatype是db_items中字典的两个键名,通过
获得偏移量和数据类型的列表,结果应该如下
因为获取的offset值均为字符串,所有没法正确获取最大值,需要将字符串列表转换为整数的列表,代码如下
之后通过index方法获得offset中最大值的索引值,通过此索引值获得datatype列表中的数据类型,代码如下
为了得到不同数据类型占用内存的长度,需要先定义一个字典,可以通过不同的数据类型取出对应的内存长度,如下
之后便可获得DB块中数据总长度,如下
完整的get_db_len()函数如下
至此,两个函数全部定义完了,接下来需要在主函数中构造db_items列表 主函数通过如下的代码构造db_items列表
通过上面的两个函数获得DB块中的数据
最终结果如下 完整代码
个人微信公众号 "iLearning爱学习",头像就是公众号二维码
|