先放结论,两个大坑:
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存储空间。文章来源:https://www.toymoban.com/news/detail-442177.html
案例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。文章来源地址https://www.toymoban.com/news/detail-442177.html
到了这里,关于S7-1200PLC Modbus通信踩坑记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!