希望有一个无聊的PLC modbus专家在那里需要一些娱乐......我会疯狂地试图解决这个问题 .
我试图在teco SG2 20VR-D上读取输出线圈Q1到Q8的状态 .
我在python中使用Modbus-TK,我可以轻松地与plc通信以写入线圈,读取寄存器等 . 但我无法弄清楚如何读取输出线圈Q1-Q8以便我可以检查它们的状态 .
地址表位于随附PDF的第29/31页 . 我的单位是V3类型 .
如果您阅读第29页上的小字,有一些关于乘以10h的神秘信息?救命!
当我使用这个命令时,我得到一个简单的元组,其值为零 .
slave_address = 1
command = 1 #read coils
coil_address = 11312 # this is 2c30h converted to decimal. 2c30h is the address for Q1 according to the pdf
master.execute(slave_address, command, coil_address)
(当我在Pycharm中评估表达式时...这就是我得到的)返回:
result = {tuple} <type 'tuple'>:()
__len__ = {int} 0
问题是Q1通电(关闭)所以它应该显示1或65280而不是0,所以这不可能是正确的 .
我应该使用某种范围的线圈地址吗?任何人都可以解释如何做到这一点?
2 回答
我对你正在做的事情一点也不熟悉,但是快速查看文档表明你没有为READ_COILS命令指定所有必需的参数 - 还有一个“quantity_of_x”参数(要读取的线圈数量) ,对于这个特定的命令),modbus-tk默认为0.所以,你要求总共零线圈的值,这与你得到的结果完全匹配 . 这个参数显然需要是0x10的倍数,所以你不仅要求Q1-Q8值以上 - 其他8个值都是垃圾 .
“01H:用户设置起始地址等于10H的倍数,线圈数量也等于10H的倍数”
Modbus实现通常期望完整的寄存器值(我认为您使用的是什么)或偏移量 . 在这种情况下,您是否尝试通过将基址寄存器乘以16(10h)来获得偏移量?
您是否尝试查看传出和传入的消息以获取线索? Wireshark将自动为您分解Modbus消息 .
我没有直接的答案,你需要自己深入研究这些东西,因为每个modbus的实现都有一点不同 .
我不知道你的技能水平,但我会从法庭上挑选wireshark中的消息(字节)来确定设备返回的确切内容并验证你发送的内容 . 此信息也可能有所帮助:
http://support.autosoln.com/support/index.php?/Knowledgebase/Article/View/63/0/modbus-protocol-overview-debugging-your-acm-configuration-by-dissecting-modbus-messages