PLC/Modbus读线圈状态(MODBUS TK)

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 ,所以这不可能是正确的。

我应该使用线圈地址的某种范围?任何人都可以解释这应该怎么做?

Teco SG3 Modbus Manual

我一点儿也不熟悉,你在做什么,但快速浏览的文档显示,你不为READ_COILS命令指定所有需要的参数 - 也有一个“ quantity_of_x“参数(读取的线圈数量,对于此特定命令),modbus-tk默认为0.因此,您要求总共零个线圈的值,这与您得到的结果完全一致。这个参数显然需要是0x10的倍数,所以你不得不请求更多的Q1-Q8值 - 其他8个值是垃圾。

+0

感谢...你在哪里找到MODBUS-TK的文件。我一直在寻找高和低良好的文档,但没有找到它。 –

+0

我没有看到任何独立文档,但是在https://github.com/ljean/modbus-tk/blob/master/modbus_tk/modbus.py – jasonharper

+0

的源文件中找到了docstrings。线圈为16的倍数是非常尴尬的,非标准行为。无论如何,这是Modbus,每个实现都有其怪癖。只需使用16作为线圈的数量,它应该工作, – Ronaldo

“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