如何修复使用IME的IF96015接口时出现的PyModbus无法解码响应错误问题

2024-05-29 03:34:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个PyModbus运行在Raspberry Pi3B上。我有IF96015以太网接口,用于Nemo 96HD数字万用表。当我试图通过ModbusTCP和PyModbus控制台连接到它时,我可以询问它是否已连接,它显示“true”,但我无法从中读取任何数据。在

根据手册,第一个使用的地址是301,当我试图阅读.Coil()时,我得到:

"original_function_code": "1 (0x1)", 
"error": "[Input/Output] No Response received from the remote unit/Unable to decode response"

打开控制台:

^{pr2}$

检查连接:

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手册:

Manual_1

Manual_2


Tags: clientinputoutputcodefunctionerror手册manual
3条回答

在手册2中,地址是0x301十六进制。 尝试client.read_coils address = 769 count = 1。 地址应以十进制格式给出(十六进制0x301=dec769)。在

每个Modbus从站/服务器都有一个单元ID,因此您需要在.read_coil()方法中添加这个。在

{{cd2>在许多情况下,Modbus-side}默认等于^ cd2}。在


以下是一个示例(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()及其解码器进行多次读取的示例:

^{pr2}$

[注意]:

  • read_coil()读/写数字值(1位)
  • read_holding_registers()读/写模拟值(16位)
  • 有些地址是十六进制的(可能是0x301而不是{})
  • 不要忘记这样的每个参数后的=count=1而不是count 1

我找到了解决办法。问题出在设备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)

相关问题 更多 >

    热门问题