Python 如何通过IME修复带有IF96015接口的PyModbus无法解码响应错误
我有一个PyModbus在树莓皮3b上运行。我有用于Nemo 96HD数字万用表的IF96015以太网接口。当我尝试使用PyModbus控制台通过ModbusTCP连接到它时,我可以询问它是否已连接,它会显示“true”,但我无法从中读取任何数据 根据手册,第一个使用的地址是Python 如何通过IME修复带有IF96015接口的PyModbus无法解码响应错误,python,tcp,modbus,modbus-tcp,pymodbus,Python,Tcp,Modbus,Modbus Tcp,Pymodbus,我有一个PyModbus在树莓皮3b上运行。我有用于Nemo 96HD数字万用表的IF96015以太网接口。当我尝试使用PyModbus控制台通过ModbusTCP连接到它时,我可以询问它是否已连接,它会显示“true”,但我无法从中读取任何数据 根据手册,第一个使用的地址是301,当我试图阅读.Coil()时,我得到: "original_function_code": "1 (0x1)", "error": "[Input/Output] No Response received from
301
,当我试图阅读.Coil()
时,我得到:
"original_function_code": "1 (0x1)",
"error": "[Input/Output] No Response received from the remote unit/Unable to decode response"
打开控制台:pymodbus.console tcp --host 192.168.178.200 --port 502
检查连接:
client.connect
尝试读取线圈:
client.read_coils address 301 count 1
输出:
"original_function_code": "1 (0x1)",
"error": "[Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received)"
[注意]: IF96015的手册:
每个Modbus从/服务器都有一个单元ID,因此您需要将其添加到
.read\u coil()
方法中
在许多情况下,unit
参数在Modbus从机端默认等于1
以下是一个示例(Modbus客户端):
下面是另一个使用
.read\u holding\u registers()
及其解码器进行多次读取的示例:
client.read_holding_registers count=4 address=9 unit=1
{
"registers": [
60497,
47134,
34091,
15424
]
}
result.raw
{
"registers": [
15626,
55203,
28733,
18368
]
}
result.decode word_order=little byte_order=little formatters=float64
28.17
[注意]:
读取/写入数字值(1位)读取线圈()
read/write模拟值(16位)read\u holding\u registers()
- 有些地址是十六进制的(可能是
而不是0x301
)301
- 不要忘记像这样的每个参数后的
(=
而不是count=1
)count 1
0x301
hex。
尝试client.read\u线圈地址=769计数=1
。
地址应以十进制格式给出(十六进制
0x301
=dec769
)。我已经找到了解决方案。问题在于机组ID的默认值。可在中找到的手册显示了机组ID值设置为“1”的Modbus TCP数据包格式示例
但装置ID的出厂设置为“255”。您可以在菜单中更改默认地址,密码3002。现在,我可以使用以下Python代码读取值:
message = tcp.read_holding_registers(slave_id=255, starting_address=0x1000, quantity=6)
response = tcp.send_message(message, sock)
你能加上密码吗?你指的是哪种密码?因为它在pymodbus控制台中运行。我有一个示例代码rom pymodbus.client.sync导入ModbusTcpClient=ModbusTcpClient('192.168.178.200')结果=客户端。读取线圈(0x301)打印(结果)客户端。关闭()这将给我一个输出:Modbus错误:[输入/输出]Modbus错误:[无效消息]收到不完整消息,至少应为8个字节(接收到0个字节)安装pyModBus时,您可以键入pyModBus.console以获得控制台提示。我添加了我使用过的所有命令。您可以在手册2中确定301是寄存器还是线圈吗?当我尝试client.read\u holding\u registers时,我得到这个>client.read\u holding\u registers address=301 count=1 unit=1{“原始功能代码”:“3(0x3)”,“错误”:“[Input/Output]Modbus错误:[无效消息]收到的消息不完整,预期至少8个字节(收到0)”}>对于0x301,我得到:>client.read\u holding\u registers address=0x301 count=1 unit=1 ValueError(“以10为基数的int()的文本无效:'0x301'”)这与寄存器相同。您的示例是如何使用此设备的多个寄存器?
message = tcp.read_holding_registers(slave_id=255, starting_address=0x1000, quantity=6)
response = tcp.send_message(message, sock)