西门子 TIA Portal Modbus RTU 轮询读写多个从站设备的实用例程与仿真测试
描述
本文将介绍西门子 TIA Portal Modbus RTU 轮询读写多个从站设备的一种实用例程的设计与仿真测试的方法。
第1步:
添加 PLC 设备。
选择西门子 CPU 1214C。
设置 IP 地址:192.168.18.18。
设置子网掩码:255.255.255.0。
第2步:
添加通信模块。
选择 CM1241(RS422/485)。
在属性中选择协议和操作模式,而事实上在 Modbus 通信中该属性页的参数无效,也就是说可以设置成任意参数,有效参数需要在调用Modbus_Comm_Load 时进行设置。
在属性中设置串口参数,而事实上在 Modbus 通信中该属性页的参数无效,也就是说可以设置成任意参数,有效参数需要在调用Modbus_Comm_Load 时进行设置。
第3步:
1.添加全局数据块,命名为:GdbSlave1Data。
在以上数据块中添加两个含有 8 个字元素的数组,分别用来作为从 1# 从站读取数据的缓冲区和待写入 1#从站的数据缓冲区,分别命名为:readDatas 和 writeDatas。数据缓冲区的长度应根据需求定义。
2.添加全局数据块,命名为:GdbSlave2Data。
在以上数据块中添加两个含有 8 个字元素的数组,分别用来作为从 2# 从站读取数据的缓冲区和待写入 2#从站的数据缓冲区,分别命名为:readDatas 和 writeDatas。数据缓冲区的长度应根据需求定义。
第4步:
编写 Modbus RTU 主站轮询通信程序。添加一个FB 函数块,命名为:ModbusMaster。
1.添加接口变量。
添加布尔型变量 statInit,初始值设置为 true,用作第一个扫描周期的初始化。
添加无符号整型数 statStep,用来控制通讯轮询的步骤。
添加 Modbus 通信端口初始化的实例 instMbComLoad,版本 V3.0。
添加 Modbus 主站通信的实例 instMbMaster,版本 V2.4。
无论轮询多少个从站设备,都将只使用一个 Modbus 主站通信实例。
2.编写程序。
第一段:
以上代码完成对 Modbus 端口的初始化,初始化成功后为通信轮询步 statStep 赋值1,将使能第一个 Modbus主站通信请求。需要注意的是通讯端口模式和通信参数只有在程序代码中设置才有效,在硬件属性页中设置无效。
第二段:
利用轮询步等于 1 触发 Modbus 主站通信请求,读取 1# 从站保持寄存器 40001 地址开始的 2个字长的数据。第一步完成位或错误位作为条件转到第二步,将使能第二个 Modbus 主站通信请求。
第三段:
利用轮询步等于 2 触发 Modbus 主站通信请求,将指针指向的 2 个字长的数据写入到 1# 从站 40003开始的保持寄存器。第二步完成位或错误位作为条件转到第三步,将使能第三个 Modbus 主站通信请求。
第四段:
利用轮询步等于 3 触发 Modbus 主站通信请求,读取 2# 从站保持寄存器 40001 地址开始的 2个字长的数据。第三步完成位或错误位作为条件转到第四步,将使能第四个 Modbus 主站通信请求。
第五段:
利用轮询步等于 4 触发 Modbus 主站通信请求,将指针指向的 2 个字长的数据写入到 2# 从站 40003开始的保持寄存器。第四步完成位或错误位作为条件转到第一步,将使能第一个 Modbus 主站通信请求,至此完成 Modbus通信轮询的一个循环。如果有更多从站读写数据,则重复以上步骤。
第5步:
在循环组织块 OB1 Main 中调用以上 FBModbusMaster,背景数据块命名为:InstModbusMaster。
第6步:
功能测试。
用 RS485 串口线连接电脑和 CM1241 通信模块。
打开 Modbus Slave 工具软件,并配置两个从站,从站地址分别设置为 1 和 2,数据显示格式选择十六进制。
下载程序到 PLC 并启动运行。
1.在 Modbus Slave 1# 从站地址 40001 和 40002 中分别输入 0x0111 和0x0222,可以看到数据被成功读取到 PLC 对应的数据块 GdbSlave1Data 的 readDatas 中。
在 PLC 对应的数据块 GdbSlave1Data 的 writeDatas 中输入 16#0012 和16#0021,可以看到数据被成功写入到 Modbus Slave 1# 从站地址 40003 和 40004 中。
2.在 Modbus Slave 2# 从站地址 40001 和 40002 中分别输入 0x0777 和0x0888,可以看到数据被成功读取到 PLC 对应的数据块 GdbSlave1Data 的 readDatas 中。
在 PLC 对应的数据块 GdbSlave1Data 的 writeDatas 中输入 16#0078 和16#0087,可以看到数据被成功写入到 Modbus Slave 2# 从站地址 40003 和 40004 中。
3.断线测试,拔掉 RS485 串口线后连接,通信能够自动恢复。
该例程简单实用,但并不符合标准化设计的思想,后面文章将介绍 Modbus RTU轮询读写从站的一种标准化设计的方法。