ModbusRTU 程序设计及轮询编程
在指令—–通信处理器——ModbusRTU通信【新款】,可以防止轮询卡死,,也有Modbus通信【老款】,无论是做主站还是从站首先调用Modbus_Comm_Load_DB指令;
- PORT添加硬件号,在组态时要添加CM_1241模块才有此项;
- PARITY是奇偶校验位,0是无校验,1是奇校验,2是偶校验;
- RESP_TO 是主站等待从站的响应时间,也就是当主站发送请求帧之后,等1秒的时间,如果在这个时间内从站并没有应答帧的回复,那主站认为这个从站已经丢失了。里面有些信息可以在背景块右击———转到——–定义中查看。
- MB_DB这个是主站与从站关联的管脚;它是标签2数据DB块Modbus_Master_DB中的MB_DB,将这个引脚给标签1即可。
因为是PLC是做主站的,所以还要调用主站指令Modbus_Master指令;
初始化完成以后去触发主站的管脚。
- MB_ADDR 向从站号为1号的设备写数据;
- MODE中0是读1是写;
- DATA_ADDR 从站的数据地址为48093
- DATA_PTR 就是要将这里的数据写到从站的48093处;
在Modbus RTU轮询时,不管有多少步,所有的Modbus Master的背景DB块都是相同的。
完整代码如下图所示:
在第6个标签处是打开Modbus_Comm_Load_DB指令的背景DB块,将里面的模式改为4,代表使用的是485的模式;否则的话这个新的ModbusRTU指令是不会运行的。
在每一步下都要写上故障处理代码,其中move的In口由于是同一个DB块,所以输入都一样;但是Modbus_Comm_Load指令的背景DB不一样,但是每个都是IN脚是背景DB块中的STATUS;
轮询卡死
轮询卡死busy一直为1,无done也无error,断电重启后恢复的可能原因:
1、程序问题,通过时间控制轮询,并未采用指令的done或error,并非上升沿触发Modbus_Master指令的REQ,而是持续的高电平;
2、通信质量不好,如EMC,特征阻抗不匹配造成通信模块宕机;
3、所有问题都排查了,还不能解决,总不能总是断电重启吧