一但使用上了PORTAL,就爱上了它,但编程还是经典STEP7的思维,慢慢改变吧。最近一直在研究PORTAL的指针(VARIANT),跟STEP7指针跟本不一样,感觉要使用PORTAL,还是忘了以前的STEP7吧。
这几天研究了SIEMENS官网的一个关于DB_ANY的资料,里面有一段介绍modbus_tru轮询的代码,说一下自己的感悟和发现的一些错误。
现把一些要点和主要程序段描述一下:
1. 新建2个PLC_DATA_TYPE(UDT),如下图:
图1
![](/club/bbs/upload/image/20200211/6371702227653490045196027.jpg)
2. 新建MODBUS_PARA数据块,定义一个结构数组,每一个数组对应一个报文和存储数据的DB块号。以modbus_Instu_UDT新建DB数据块,用来存放读取的数据或要写入的数据,DB块数量根据报文数量(MODBUS_PARA数据块中数组数量)来定。
图3
![](/club/bbs/upload/image/20200211/6371702231365982704837923.jpg)
图4
![](/club/bbs/upload/image/20200211/6371702234927042454450807.jpg)
3. 新建FB块,作为MODBUS的主程序块,主要接口如下图(原PDF文件没有说清楚InOut_1接口的定义):
图5
![](/club/bbs/upload/image/20200211/6371702236833377649208755.jpg)
4. 主程序中,主要几个程序如下:
调用MODBUS_COMM_LOAD块,并给参数赋值
图6
![](/club/bbs/upload/image/20200211/6371702240633438847751303.jpg)
读取MODBUS_PARA数据块内数组的上下限
图7
![](/club/bbs/upload/image/20200211/6371702241986507903617138.jpg)
调用MODBUS_MASTER块,并给参数赋值(原PDF文件中,对InOut_1参数引用有错误),#Static_2是存储读取数据和写入数据的临时变量,赋给DATA_PTR接口:
图8
![](/club/bbs/upload/image/20200211/6371702245264912776999118.jpg)
程序中分别对读和写进行了编程:
写从站:把(METER_1(DB42))数据块引用给VARIANT变量,再把DB块内的数据进行序列化给中间变量#Static_2
图9
![](/club/bbs/upload/image/20200211/6371702250515332799808919.jpg)
读从站:把(METER_1(DB42))数据块引用给VARIANT变量,再把读取的数据#Static_2进行反序列化到VARIANT变量,最后再写入(METER_1(DB42))数据块
图10
![](/club/bbs/upload/image/20200211/6371702251257318149072027.jpg)
5. 最后在OB1中调用 FB2
图11
![](/club/bbs/upload/image/20200211/6371702252307246924879836.jpg)
学习完这段程序,对我受益非浅,对VARIANT和DB_ANY的使用也有了进一步了解。在这里,也对原PDF中的一些错误进行了修改,原PDF的代码输入到PORTAL,版本是V16。
附件1:修改后的DB_ANY pdf文件(下载后删除前面2个压缩包的.zip后缀)
DB_ANY.z01.zip
DB_ANY.z02.zip
DB_ANY.zip
附件2:代码程序V16
DB_ANY_20200211_1120.zip