首页 文章

PLC / Modbus读线圈状态(modbus tk)

提问于
浏览
-1

希望有一个无聊的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,所以这不可能是正确的 .

我应该使用某种范围的线圈地址吗?任何人都可以解释如何做到这一点?

Teco SG3 Modbus Manual

2 回答

  • 0

    我对你正在做的事情一点也不熟悉,但是快速查看文档表明你没有为READ_COILS命令指定所有必需的参数 - 还有一个“quantity_of_x”参数(要读取的线圈数量) ,对于这个特定的命令),modbus-tk默认为0.所以,你要求总共零线圈的值,这与你得到的结果完全匹配 . 这个参数显然需要是0x10的倍数,所以你不仅要求Q1-Q8值以上 - 其他8个值都是垃圾 .

  • 0

    “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

相关问题