如何修复 PyModbus 无法通过 IME 使用 IF96015 接口解码响应错误
How do I fix a PyModbus Unable to decode Response-Error with IF96015 Interface by IME
我在 Raspberry PI 3b 上有一个 PyModbus 运行。我有用于 Nemo 96HD 数字万用表的 IF96015 以太网接口。当我尝试使用 PyModbus 控制台通过 ModbusTCP 连接到它时,我可以询问它是否已连接并且它显示 "true" 但我无法从中读取任何数据。
根据手册,第一个使用的地址是 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 slave/server 都有一个 unit_ID,因此您需要在 .read_coil()
方法中添加它。
在许多情况下,unit
参数等于 1
作为 Modbus 从站的默认值。
这里是一个例子(Modbus 客户端):
pymodbus.console tcp --host 192.168.178.200 --port 502
client.connect
client.read_coils address=301 count=1 unit=1
这是另一个使用 .read_holding_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
[注意]:
read_coil()
read/write 数字值(1 位)
read_holding_registers()
read/write 模拟值(16 位)
- 一些地址是十六进制的(可能
0x301
而不是 301
)
- 不要在每次这样的争论之后忘记
=
(count=1
而不是 count 1
)
在手册 2 中,地址是 0x301
十六进制。
尝试 client.read_coils address = 769 count = 1
。
地址应以十进制格式给出 (hex 0x301
= dec 769
).
我找到了解决办法。问题在于单元 ID 的默认值。可以在 vendor's website 找到的手册显示了一个示例 Modbus TCP 数据包格式,单元 ID 值设置为“1”。
但设备 ID 的出厂设置为“255”。您可以在菜单中更改默认地址,密码 3002。现在,我可以使用以下 Python 代码读取值:
message = tcp.read_holding_registers(slave_id=255, starting_address=0x1000, quantity=6)
response = tcp.send_message(message, sock)
我在 Raspberry PI 3b 上有一个 PyModbus 运行。我有用于 Nemo 96HD 数字万用表的 IF96015 以太网接口。当我尝试使用 PyModbus 控制台通过 ModbusTCP 连接到它时,我可以询问它是否已连接并且它显示 "true" 但我无法从中读取任何数据。
根据手册,第一个使用的地址是 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 slave/server 都有一个 unit_ID,因此您需要在 .read_coil()
方法中添加它。
在许多情况下,unit
参数等于 1
作为 Modbus 从站的默认值。
这里是一个例子(Modbus 客户端):
pymodbus.console tcp --host 192.168.178.200 --port 502
client.connect
client.read_coils address=301 count=1 unit=1
这是另一个使用 .read_holding_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
[注意]:
read_coil()
read/write 数字值(1 位)read_holding_registers()
read/write 模拟值(16 位)- 一些地址是十六进制的(可能
0x301
而不是301
) - 不要在每次这样的争论之后忘记
=
(count=1
而不是count 1
)
在手册 2 中,地址是 0x301
十六进制。
尝试 client.read_coils address = 769 count = 1
。
地址应以十进制格式给出 (hex 0x301
= dec 769
).
我找到了解决办法。问题在于单元 ID 的默认值。可以在 vendor's website 找到的手册显示了一个示例 Modbus TCP 数据包格式,单元 ID 值设置为“1”。
但设备 ID 的出厂设置为“255”。您可以在菜单中更改默认地址,密码 3002。现在,我可以使用以下 Python 代码读取值:
message = tcp.read_holding_registers(slave_id=255, starting_address=0x1000, quantity=6)
response = tcp.send_message(message, sock)