这个假期真是过舒服了,无聊的把电脑上所有的SIEMENS软件都升级为最新版本了。无耐开工一推再推,于是把之前Zane版发表的《博图环境下Modbus-RTU应用入门之任务轮询》研究了一遍,正好也学习一下VARIANT间接寻址的用法。也借此机会提出自己的一点想法。
主要几个关键程序段:
1. 建立PLC DATA TYPE(UDT)
建立MB_JOB_UDT(见图1),这个UDT主要是用在MODBUS_MASTER这个块接口的
图1
2. 新建数据块MB_Job_DB,以MB_JOB_UDT为数据类型,建立数组。每一个数组可以看成是一条MODBUS报文。见图2
图2
3. 建立FB块(MB_RTU_Master_V31),作为MODBUS的主功能块。
4. MODBUS通讯主要用到了2个功能块,MODBUS_COMM LOAD和MODBUS_MASTER。对于MODBUS_COMM LOAD的接口,可以直接做在FB功能块的接口上,PLC上电初始化时赋值一次就可以了。见图3
图3
5. 接下来就是把要读写的指令和数据,赋给MODBUS_MASTER。主要是用到了MOVE_BLOCK_VARIANT指令(见图4),把DB块内对应数组内的数据,传给内部地址MB_JOB(基于UDT建立的)。FB的接口主要是2个,见图5
图4
图5
6. 给MODBUS_MASTER的接口赋值,见图6
图6
7. 对于读指令,把读回来的数据,再写入MB_Job_DB数据块的对应的数组,这样,读回来的数据就在对应数组的DATA_PTR数组里面了。
对于写指令,只要把MB_Job_DB数据块里,对应数组内赋值(报文指令)就可以了。见图7
图7
8. 最后,MB_JOB_DB内有几个数组(报文指令),就循环几次,完成整个轮询过程。
研究完整个程序,有一个地方觉得不够完美。就是第7点,数据读回来后,要写回MB_Job_DB数据块,这会导致MB_ADDR、MODE、DATA_ADDR、DATA_LEN也会被覆盖。而实际上,只需要把DATA_PTR的数据写回DB块。
假如要通过上位机动态修改报文的读和写,或是读写的数据长度,或地址,那么,这几个数据有时不能一次性修改(就是不能一次修改成功)。因为这几个数据有可能会被上次的数据重新写回去。这是有一定概率的事情。
解决这个问题,最好把MB_Job_DB数据块中的DATA_PTR单独做个PLC DATA TYPE,这样就可以写回我们需要的数据。
以上,就是本人对Zane版所写程序的一点感悟,一点拙见,还请批评指正。也感谢Zane版的无私奉献,让我们能够学习到PORTAL的更高级的编程。
最后,放上修改过的几个截图:
1.把之前的UDT拆成2个独立的UDT
2.修改FB的接口
3.修改DB数据块,并增加一个DATA_PTR的数据块
4.修改FB相关程序
5.最后FB的接口如下图
附:
1. 原程序 V15版本(解压时删除第一个压缩文件后面的.zip后缀)
MB-RTU_Training_20190109_0841.z01.zip
MB-RTU_Training_20190109_0841.zip
2. 修改后的原程序 V16版本,修改部分在PLC_1(解压时删除第一个压缩文件后面的.zip后缀)
MB-RTU_Training_V16_20200209_2138.z01.zip
MB-RTU_Training_V16_20200209_2138.zip