PLC/Modbus读线圈状态(MODBUS TK)
希望有在那里谁需要一些娱乐无聊的PLC MODBUS专家..我要疯了试图弄清楚这一点。PLC/Modbus读线圈状态(MODBUS TK)
我想读一个东元SG2 20VR-d的输出线圈Q1至Q8的状态。
我在Python中使用Modbus-TK,我可以很容易地与PLC通信写入线圈,读取寄存器等。但我无法弄清楚怎么读出输出线圈Q1-Q8,所以我可以检查他们的状态。
地址表在附件PDF第29/31页。我的单位是V3型。
如果你读了29页的小字有关于通过10小时乘以一些晦涩的消息????帮帮我!
当我使用这个命令时,我得到一个简单的元组,其唯一值为零。
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 ,所以这不可能是正确的。
我应该使用线圈地址的某种范围?任何人都可以解释这应该怎么做?
我一点儿也不熟悉,你在做什么,但快速浏览的文档显示,你不为READ_COILS命令指定所有需要的参数 - 也有一个“ quantity_of_x“参数(读取的线圈数量,对于此特定命令),modbus-tk默认为0.因此,您要求总共零个线圈的值,这与您得到的结果完全一致。这个参数显然需要是0x10的倍数,所以你不得不请求更多的Q1-Q8值 - 其他8个值是垃圾。
“01H:用户设定10H的起始地址等于多发,线圈也10H平等多数量”
的Modbus实现通常期望无论是全寄存器值(使用的是什么,我认为)或抵消。您是否尝试通过将基址寄存器乘以16(10h)来获得偏移量?
您是否尝试查看传出和传入消息的线索? Wireshark会自动为您分解Modbus消息。
我没有直接回答你,有很多这方面的东西,你必须潜入它自己,因为每个Modbus通信协议是一个有点不同。
我不知道你的技能水平,但我会通过法医采摘除了在Wireshark的消息(字节)要弄清楚到底是什么设备正在恢复,并验证您要发送什么开始。该信息还可以帮助:
感谢...你在哪里找到MODBUS-TK的文件。我一直在寻找高和低良好的文档,但没有找到它。 –
我没有看到任何独立文档,但是在https://github.com/ljean/modbus-tk/blob/master/modbus_tk/modbus.py – jasonharper
的源文件中找到了docstrings。线圈为16的倍数是非常尴尬的,非标准行为。无论如何,这是Modbus,每个实现都有其怪癖。只需使用16作为线圈的数量,它应该工作, – Ronaldo