S7-1200PLC Modbus通信踩坑记录

目录

  • 485接线
  • TIA Portal函数块的选用
  • MODBUS标准帧结构
  • 叠加地址基数
  • 根据情况,给地址加一
  • 案例1:从力传感器读取重量值
  • 案例2:变频电机控制
  • 先放结论,两个大坑:


    1.数据地址加4万或40万,来帮助PLC确定Modbus功能代码;
    2.和某些设备通信时,需要给数据地址+1。

    本文内容:帮读者找到通信失败的原因,不是完整的教程。
    硬件设备:CPU1212C,485通信模块CM1241,Modbus从机(比如变送器,变频器)。
    编程软件:TIA Portal

    485接线

    CM1241带一个DB9接头,接线按照 "3号管脚是485+,8号是485-"进行,不要看AB。2根线就够,不用接GND。

    TIA Portal函数块的选用

    如下图,函数区里有两个MODBUS的文件夹,上面的带(RTU)的和下面的那个。在使用的时候只用一个文件夹里的函数,不要混用,而且两组函数的用法不太一样。

    Modbus编程,大致步骤是先用MB_COMM_LOAD初始化,再用MB_MASTER将PLC作为主机向从机发起通信,具体做法可以网上搜到。新版函数需要设置背景数据块 “Modbus_Comm_Load_DB”.MODE=4,表示485半双工通信方式,算个小坑。

    MODBUS标准帧结构

    Modbus数据帧的一般结构是:


    根据命令码的不同,上面“数据内容”会有不同的划分。最常用的命令码是03和06。03表示主机读取从机里多个字(英文word)的数据,一个字就是2个字节。03功能码的示例:

    06表示主机向从机写入1个字的数据:

    叠加地址基数

    MB_MASTER函数块:

    了解了帧结构之后,如果直接把起始地址输入到函数里,会通信失败。这时候就需要看西门子的文档了。

    可以发现,函数上不能直接输入Modbus功能码,而且多了一个MODE输入。看一下函数的参数说明:


    可见,需要通过指定MODE和数据地址,来间接的确定功能码。上表种的“Modbus地址”就是数据地址。

    在Modbus帧结构里,数据地址一般是占用1个字,所以理论上地址可以是0~0xFFFF种的任意一个数,最大值0xFFFF对应十进制的65535。

    这时候直接输入原始的数据地址就会出错。比如在MODE=0的情况下,数据地址是2000,PLC就以为要读取一个位;地址是30001,PLC以为要读取一个字,完全混乱了。

    为了避免混乱,正确做法是给数据地址加上一个“基数”,再输入到函数。 具体加什么基数要看上面的表格。比如原地址是2000,想要把功能码设为03,就要把MODE设为0,数据地址加4万或40万,变成42000或402000,让PLC能根据MODE和地址,定位到功能码03。PLC在实际发送的时候会自动减掉基数。

    为什么有4万和40万两个基数?根据前面的分析,原数据地址最大能到65535,这时候如果加4万,变成105535,就超出表格里40001~49999的范围了。如果加40万,变成465535,正好在表格里40万地址区间之内。所以基数40万适用于所有的Modbus从机,4万可以用于地址范围比较小的设备。

    根据情况,给地址加一

    解决基数问题之后,还是一直报错,直到看到一篇教程上说:
    DATA_ADDR–从站的起始地址(需将从站的地址由16进制转换为10进制,转换成10进制后,数据加1(因为从站地址是从0开始的,而PLC的地址是从1开始的,所以要加1)) ;
    于是破案了。至于数据地址要不要加一,需要看具体设备的说明书。一般地址从个位数1开始的,就是已经加过1了,可以直接用;从整数开始的就要自己加1。不确定就做个实验。

    最后放两个案例:

    案例1:从力传感器读取重量值

    查看变送器说明书:

    现在想要读取重量。
    确定MODE: 是读取操作,需要功能码03,所以MODE设为0.
    确定DATA_ADDR:
    根据变送器说明书,数据的原地址是1.
    根据变送器说明书,数据地址都在一万以内,所以基数采用4万或40万都行。这里采用4万,叠加后地址变为40001. 而且这个数据地址不需要再加一了。
    确定DATA_LEN: 重量数据占用4个字节,所以DATA_LEN=2(字)。
    通信成功后,数据会被放到DATA_PTR指向的PLC存储空间。

    案例2:变频电机控制

    查阅变频器说明书:

    现想要控制电机正转运行。
    确定MODE: 是写入操作,MODE=1。
    确定DATA_ADDR: 数据原地址是2000H(16进制),转换为10进制是8192。
    观察发现,说明书上地址是从个位为0的整数开始的,所以地址要加1.
    观察发现,变频器上的数据地址范围比较大,超过了1万,所以统一加基数40万。
    综上,输入到PLC函数的数据地址是:400,000+8192+1=408,193.
    确定DATA_LEN:命令信息占用1个字,所以DATA_LEN=1.
    数据值 :在DATA_PTR指向的变量里,设置命令值0001。

    物联沃分享整理
    物联沃-IOTWORD物联网 » S7-1200PLC Modbus通信踩坑记录

    发表评论