西门子S7-1200串口模块CM1241进行Modus-RTU通讯的要点
近在用1200通过Modbus-RTU采集某流量传感器的数据,西门子侧选择的是CM1241(RS422/485)(订货号是6ES7241-1CH32-0XB0,固件版本V2.2),CPU是1214C,固件版本是V4.2,自认为调试应该很简单,却花费了很多时间,并查阅了很多资料、视频,才实现了通讯。下面逐步介绍一下步骤,可能的坑及解决办法。
1、硬件接线
通讯卡9针插座的3和8针用于485通讯(Modbus的通讯),西门子手册上标识为:3+(B),8-(A),流量传感器上标识为A+、B-。通讯不通时,我在这儿折腾了很久,后来用万用表直接测量电压搞定,原则:不用理会AB,直接测量电压,+对+,-对-即可。未通讯时,电压在3-5VDC之间。
2、硬件配置
基本配置(要与从站保持一致),记下硬件标识符:这里是269。
3、端口初始化编程
注意选择V3.1这一套程序,不要与下面的V2.2程序混用(注意这套程序的版本限制“使用CM1241自固件版本V2.1起...”)。
初始化程序放置在OB1循环调用的子程序里,官方提醒不要放在OB100(启动程序里),设置好参数(与硬件里的基本一致),自动生成顶部的背景数据块(这里是DB1)。
打开DB1,将里面的MODE修改成4(设置为485通讯),其他保持默认值(这也是个大坑,谁会想着去修改背景数据块?所有需要修改的应该都通过接口参数开放出来呀!)。
MB_DB要与后面的Modbus_Master的背景数据块保持一致,在创建Modbus_Master时,会自动生成,再回过头来修改,我这边为DB2。
4、创建读写指令
我这边用到了轮询,程序相对复杂,会调用多个Modbus_Master模块(注意:他们必须用相同的背景数据块,不要每次都新建)。如果只是单站读取,REQ端用时钟脉冲即可。REQ是上升沿触发,如果常置位,则只会进行一次读取,用时钟脉冲可以周期读取。
MB_ADDR是从站地址,MODE是模式,与DATA_ADDR配合,在后台生成标准的MODBUS指令,比如,我要实现传感器厂家的指令帧:
起始地址是0x800E,转换成十进制地址是32782,功能码是0x03
通过Modbus_Master的帮助可以看到,我的MODE要选择0,DATA_ADDR填写:432782(实际上由于是否从0开始的问题,这儿终填写的是432783)
这样,就可以读取了。
5、快速度轮询时的效果
我用录波软件PLC-Recorder对于采集回的值、轮询指令等进行了录波,以20ms的速度记录,从这个波形上可以看到,实际轮询周期能达到100ms(我这里有两个从站):
将其中一个传感器断电,制造单站故障后的轮询周期大都加长,达到了600ms(因为要等待超时):
6、如果通讯怎么都不通时,怎么判断?
要利用调试软件测试PLC和传感器。对于传感器,可以用厂家调试软件,配合USB转485的接口进行测试,确定通讯参数和状态好坏。
对于PLC,有朋友利用MODBUS从站模拟软件进行测试(我没有找到),也可以打开模块上部的盖板,查看发送灯是否亮来判断,模块是不是已经启用。正常轮询时,发送和接收都会黄灯闪烁的。