Python 如何通过IME修复带有IF96015接口的PyModbus无法解码响应错误

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

我有一个PyModbus在树莓皮3b上运行。我有用于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从/服务器都有一个单元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\u holding\u registers()
    read/write模拟值(16位)
  • 有些地址是十六进制的(可能是
    0x301
    而不是
    301
  • 不要忘记像这样的每个参数后的
    =
    count=1
    而不是
    count 1

在手册2中,地址是
0x301
hex。 尝试
client.read\u线圈地址=769计数=1

地址应以十进制格式给出(十六进制
0x301
=dec
769
)。

我已经找到了解决方案。问题在于机组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)