希望那里有一个无聊的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,所以这不可能是正确的。
我应该使用某种范围的线圈地址吗?谁能解释一下应该怎么做?
答案 0 :(得分:0)
我对你正在做的事情一点也不熟悉,但是快速查看文档表明你没有为READ_COILS命令指定所有必需的参数 - 还有一个“quantity_of_x”参数(数量为要读取的线圈,对于这个特定的命令),modbus-tk默认为0.所以,你要求总共零线圈的值,这与你得到的结果完全匹配。这个参数显然需要是0x10的倍数,所以你不仅要求Q1-Q8值以上 - 其他8个值都是垃圾。
答案 1 :(得分:0)
“01H:用户设置起始地址等于10H的倍数,线圈数量也等于10H的倍数”
Modbus实现通常需要完整的寄存器值(我认为你使用的是什么)或偏移量。在这种情况下,您是否尝试通过将基址寄存器乘以16(10h)来获得偏移量?
您是否尝试查看传出和传入的消息以获取线索? Wireshark会自动为您分解Modbus消息。
我没有直接的答案,你必须自己深入研究这些东西,因为每个modbus的实现都有点不同。
我不知道你的技能水平但是我会先从窃听器中取出信息(字节)来确定设备返回的确切内容并验证你要发送的内容。这些信息也可能有所帮助: