最近在用1200通过modbus-rtu采集某流量传感器的数据,西门子侧选择的是cm1241(rs422/485)(订货号是6es7 241-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(因为要等待超时):