PLC技术资料
    西门子s7-1200串口模块cm1241进行modus-rtu通讯的要点
    发布者:  发布时间:2024/4/11 13:32:59

    最近在用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。

    1.png

    3、端口初始化编程

    注意选择v3.1这一套程序,不要与下面的v2.2程序混用(注意这套程序的版本限制“使用cm1241 自固件版本v2.1起...”)。

    2.png

    初始化程序放置在ob1循环调用的子程序里,官方提醒不要放在ob100(启动程序里),设置好参数(与硬件里的基本一致),自动生成顶部的背景数据块(这里是db1)。

    打开db1,将里面的mode修改成4(设置为485通讯),其他保持默认值(这也是个大坑,谁会想着去修改背景数据块?所有需要修改的应该都通过接口参数开放出来呀!)。

    3.pngmb_db要与后面的modbus_master的背景数据块保持一致,在创建modbus_master时,会自动生成,然后再回过头来修改,我这边为db2。

    4、创建读写指令

    4.png

    我这边用到了轮询,所以,程序相对复杂,会调用多个modbus_master模块(注意:他们必须用相同的背景数据块,不要每次都新建)。如果只是单站读取,req端用时钟脉冲即可。req是上升沿触发,如果常置位,则只会进行一次读取,因此用时钟脉冲可以周期读取。

    mb_addr是从站地址,mode是模式,与data_addr配合,在后台生成标准的modbus指令,比如,我要实现传感器厂家的指令帧:

    5.png

    起始地址是0x800e,转换成十进制地址是32782,功能码是0x03

    通过modbus_master的帮助可以看到,我的mode要选择0,data_addr填写:432782(实际上由于是否从0开始的问题,这儿最终填写的是432783)

    6.png

    这样,就可以读取了。

    5、最快速度轮询时的效果

    我用录波软件plc-recorder对于采集回的值、轮询指令等进行了录波,以20ms的速度记录,从这个波形上可以看到,实际轮询周期能达到100ms(我这里有两个从站):

    7.png将其中一个传感器断电,制造单站故障后的轮询周期大都加长,达到了600ms(因为要等待超时):

    8.png

    版权声明PLC信息网转载作品均注明出处,本网未注明出处和转载的,是出于传递更多信息之目的,并不意味 着赞同其观点或证实其内容的真实性。如转载作品侵犯作者署名权,或有其他诸如版权、肖像权、知识产权等方面的伤害,并非本网故意为之,在接到相关权利人通知后将立即加以更正。联系电话:0571-87774297。
0571-87774297