现在在测试S7200,224XPPLC通过RS485通讯与能量表通讯,PLC做主站,能量表做从站,PLC读能量表的数据。能量表本身是M-BUS协议,通过一个转换硬件,变成标准的RS485。
通讯线:2芯屏蔽双绞线。
硬件接口:RS-485
波特率:默认:9600bps
字节格式默认:
起始位(1bit)+数据位(8bit)+偶校验(1bit)+停止位(1bit)根据客户要求修改
传输模式:RTU
MDU地址:1~247
功能码:02H03H06H10H
CRC:CRC-16(这个是能量表转化后的协议)。
但他们发来的地址是报文形式的,看不懂找不到地址啊
我想用西门子200的库编写的程序,其他都好了,就只有那个adr不知道。如下图红色的地方。
能量表厂家发来
//命令03收发的报文格式:(读)
*pc–>mcu:从机地址(1Byte)+功能码(1Byte)+起始地址(2Byte)+数据度(2Byte)+CRC码(2Byte)
*mcu–>pc:从机地址(1Byte)+功能码(1Byte)+字节数(1Byte)+寄存器数据1(2Byte)+…..+寄存器数据n(2Byte)+CRC码(2Byte)
1、读取温度值带两位小数的情况
//命令03H:实现读取“供水温度”数值
发送:0103402000019000
接收:01030289D8DF8E
解析:
供水温度=25.20℃=0x89D8&0x7FF;
0x89D8&0x8000=0x1000,最高位为1表示两位小数,即数值扩大100倍。
//命令03H:实现读取“回水温度”数值
发送:010340210001C1C0
接收:01030289EF9E58
解析:
回水温度=25.43℃=0x89EF&0x7FF;
0x89EF&0x8000=0x1000,最高位为1表示两位小数,即数值扩大100倍。
问题是正规的MODBUS寄存器地址是40001开始的啊,可是报文中的供水温度地址是4020H,转化成10进制是16416.这就不对了啊,求就比如供水温度我在库调用的块中地址填什么。还是这个库不能用,只能用自由口自己编程。
图片说明:
e0a1325ded2f7fac0de5462518f4fbfd
最佳答案
看了您的截图1和说明,归纳起来其实是地址错误。
1.您用了modbus通信的03功能码,读或写对应的是保持寄存器地址40001-49999。因此您截图中的modbus指令中Addr不能直接写289。必须填写的是modbus通信额保持寄存器地址才行。
2.报文中的供水温度地址是4020H,转化成10进制是16416.也许会用到modbus的扩展地址,地址范围为400001–465536
3.关于S7-200CPU如何访问大于9999的保持寄存器地址,可以看看以下的说明
通常modbus协议的保持寄存器地址范围在40001–49999之间。对于多数应用来说已经够了。但有些modbus从站把地址映射到保持寄存器区的地址超过9999的部分。
S7-200modbusMASter协议库支持超过9999的保持寄存器地址。地址范围为400001–465536。只需在调用MBUS_MSG子程序时给Addr参数赋相应的值即可,例如416768。
提问者对于答案的评价:
后来也这样弄好了
专家置评
已阅,最佳答案正确。