找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
问题
取消精华
首页精华问答
取消推荐
高端用户推荐
申请置评
已申请置评
修改
修改标签
添加标签
官方认证
取消官方认证
修改标签
添加标签
转移分类
删除
{{itemCategory}}
我想用西门子200的库编写的程序,其他都好了,就只有那个adr 不知道。如下图红色的地方。
能量表厂家发来
//命令 03 收发的报文格式: (读)
*pc-->mcu: 从机地址(1Byte)+ 功能码(1Byte)+ 起始地址(2By t e)+ 数据度(2By t e)+ CRC 码(2Byte)
*mcu-->pc:从机地址(1Byte)+功能码(1Byte)+字节数(1By t e)+寄存器数据 1(2By te)+…..+ 寄存器数据 n(2Byte)+ CRC 码(2By t e)
1、读取温度值带两位小数的情况
//命令 03H:实现读取“供水温度”数值
发送:01 03 40 20 00 01 90 00
接收:01 03 02 89 D8 DF 8E
解析:
供水温度 = 25.20℃ = 0x89D8&0x7FF;
0x89D8&0x8000=0x1000,最高位为1表示两位小数,即数值扩大100倍。
//命令 03H:实现读取“回水温度”数值
发送:01 03 40 21 00 01 C1 C0
接收:01 03 02 89 EF 9E 58
解析:
回水温度 = 25.43℃= 0x89EF&0x7FF;
0x89EF&0x8000=0x1000,最高位为1表示两位小数,即数值扩大100倍。
问题是正规的modbus 寄存器地址是40001开始的啊,可是报文中的供水温度地址是 4020H, 转化成10进制是16416. 这就不对了啊,求 就比如供水温度 我在库调用的块中 地址填什么 。还是这个库不能用, 只能用自由口自己编程。
收藏({{answerDetail.Q_FavoriteCounts}})
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
专家建议
取消最佳答案
修改
看了您的截图1和说明,归纳起来其实是地址错误。
1. 您用了modbus通信的03功能码,读或写对应的是保持寄存器地址40001-49999。因此您截图中的modbus指令中Addr不能直接写289。必须填写的是modbus通信额保持寄存器地址才行。
2. 报文中的供水温度地址是4020H, 转化成10进制是16416.也许会用到modbus的扩展地址,地址范围为 400001 - 465536
3.关于S7-200 CPU如何访问大于 9999 的保持寄存器地址, 可以看看以下的说明
通常 modbus 协议的保持寄存器地址范围在 40001 - 49999 之间。对于多数应用来说已经够了。但有些 modbus 从站把地址映射到保持寄存器区的地址超过 9999 的部分。
S7-200 modbus Master 协议库支持超过 9999 的保持寄存器地址。地址范围为 400001 - 465536。只需在调用 MBUS_MSG 子程序时给 Addr 参数赋相应的值即可,例如 416768。
等您来回答
换一换
{{item.CoinValue}}西币
{{item.VisitNum}}人想问
本版相关问题
换一换
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!

西门子商城