技术论坛

 S7-1214C的Modbus rtu通讯一例

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

经验值: 71501
发帖数: 7980
精华帖: 145
楼主    2022-05-04 07:53:33
主题:S7-1214C的Modbus rtu通讯一例

S7-1214C的Modbus rtu通讯一例

  今天下午借到s7-1200的RS485模块(6ES7241-1AH32-0XB0)一个,正好拿来与刚刚前几天买来的导轨式温、湿度传感器(带Modbus rtu通讯功能)做一次通讯验证。

硬件组件:

1) S7-1214C的cpu版本V4.2(6ES7212-1HE40-0XB0)一个,扩展通讯模块RS485(6ES7241-1AH32-0XB0)一个,固件版本V2.2;

2) 第三方温、湿度传感器一个,支持Modbus rtu通讯协议,其中,湿度数据长度一个字,温度数据长度一个字,站地址通过专用软件已经设置为:5,其它参数同样符合S7-1200的Modbus rtu通讯协议;

3) 西门子电源模块(6EP1334-3BA10)一个,连接导线若干。

测试软件Portal V15版本。

通讯组态:

1) 创建一个测试项目,根据测试条件,插入相应的cpu及通讯模块并组态通讯选项:

 2) 勾选“系统时钟”的标志字节,等一下编写程序时需要,图示:

 

3) 在OB1中编写通讯程序,也可以在合适的FB/FC/OB中调用,这个没有特别的要求,合适自己就好,另外,再创建一个数据块_1,方便存放通讯指令的标志位及数据,仍然没有特殊要求,纯粹是个人的喜好。图示:

   填写相应的管脚,这个在西门子S7-1200的plus文档中有非常强大的描述,这里不再说明,只是在填写Modbus_Comm_load指令的MB_DB管脚时,需要在“系统块”---“程序资源”下,找到“Modbus_Master_DB”中的MB_DB,把它拖拽到管脚就可以了。其中,Modbus_Master的管脚填写是根据第三方温、湿度传感器的填写协议内容填写即可。另外,有一点我之前有遇到的是Modbus_Comm_load的Static变量的MODE(数据类型)USInt由原来的16#00改为16#04,与硬件组态的半双工两线制模式保持一致。哦,对了,我在V15的Protal版本寻找Modbus_Comm_load指令的PORT管脚时,没有查询到硬件标设信息,可能是软件版本的原因问题,这个是在实际填写管脚过程的下拉菜单中可以选择到,图示:

 4) 再创建一个变量表,方便填写需要的数据监控。用导线根据硬件手册及传感器说明书内容连接好测试的所有硬件连接,上电后将用户程序保存、编译、下载到cpu,进行监控,因为该传感器只是读取温度和湿度数据,所以只需要调用一个Modbus_Master指令就能够满足通讯要求了:

 

 数据块_1中,DB2.DBW0 = 湿度数据,DB2.DBW2 = 温度数据。

今天,在200smart版区与一个爱好者讨论是关于Modbus rtu通讯之CTRL指令done位的应用问题。于是,想起是否可以用Modbus_Comm_load指令的done位,作为Modbus_Master通讯指令的REQ管脚触发,修改变量再次下载,通讯仍然可以实现,图示: 

读取到的温度与湿度数据,仍然与用200smart读取到的一致,实际数据需要除10处理。如果项目中需要读取多个数据,那么,在调用Modbus_Master指令中仍然沿用轮询机制,即上一个Modbus_Master的done位及Status值关联下一个Modbus_Master的REQ管脚,构成一个相对闭合的触发链路,首次第一个Modbus_Master指令的触发可以用Modbus_Comm_load指令的done位进行,也可以用其它标志位来做。

上述程序仅仅只是列举了Modbus通讯程序的框架,而并不是一个完整的程序段落,完整程序还需要提取STATUS的状态值及error位值,作为检测通讯是否存在故障和继续轮询的触发的依据,同时利用这个特点(正常情况下STATUS = 16#7000空闲或者16#7002正忙)的非逻辑,触发Modbus_Maste这里的REQ管脚,图示:

 


当通讯连接断开后,M2.3 = 1,无条件再次触发Modbus_Master指令的REQ管脚,直到通讯再次连接成功,当然,增加通讯中断的报警程序也是一件非常有必要的事情。


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