技术论坛

 【技】学习《博图环境下Modbus-RTU应用入门之任务轮询》有感

返回主题列表
作者 主题
YiMoon
至圣

经验值:11037
发帖数:1221
精华帖:35
楼主    2020-02-09 21:51:17
主题:【技】学习《博图环境下Modbus-RTU应用入门之任务轮询》有感 精华帖 

这个假期真是过舒服了,无聊的把电脑上所有的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


Keep calm and carry on!!!
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。