最近在为PLC-Recorder开发DB变量导入功能时,仔细分析了STEP7和博图里导出的数据块的结构(导出的只是结构,没有偏移地址),并重点分析了偏移地址计算的规则,否则,没法算出变量的地址,都是白扯了。西门子的DB块内的变量除了前篇文章里那些可能的数据类型,还有用户数据类型(UDT)和一些特殊的类型(这在文献里很难找到,软件也就没法处理了)。DB块内的变量是有结构区分的,并且层级可能很深,UDT可以算作层级类型之一,还包括STRUCT、ARRAY(数组),都需要特殊处理,否则地址计算就会出错。对于UDT,由于里面可能嵌套其他UDT、结构,因此,地址计算的程序必须具有递归计算的功能(我这个编程门外汉对于递归是很敬仰的,竟然在这里也实现了递归功能)。总结一下几个核心的规则,分享给大家:
1、从编程软件导出DB源代码要包括引用,这样,所有必要的UDT都会在DB前面列出结构,否则你还要让用户去导出UDT,用户会立马放弃你这个功能。
2、在同一结构层级内,如果变量长度是偶数,则地址从偶数字节开始。如果长度非偶数(只有单字节变量和位符合这个条件),则从紧挨着的字节开始。
3、在同一结构层级内,同类型的变量地址可以连续计算,比如位变量,确定了第一个位变量的起始地址后(比如10.0),后面的就可以连续计算,比如:10.1、10.2...
4、每个结构(包括数组、STRUCT、UDT等)增加一个层级,其变量都是从偶数字节开始,结构退出后的下一个变量起始地址也是偶数。
5、字符串地址从偶数字节开始,但是下一个变量(比如位)可能从非偶数字节开始。
DB块的导入,只是PLC-Recorder的一个细微功能,没想到费了很大的劲。希望朋友们多向工控、工艺的朋友们推荐咱们的数据采集、记录、分析软件,在可能的场合,多去替代那些昂贵的进口软件,软件详情请见连接。
2021年2月4日