如何使用 pymodbus 从数据寄存器中读取字符串?

How do you read strings from a data register using pymodbus?

我正在尝试使用我的 raspberry pi 作为它与 S7-1200 西门子 plc 之间的 modbus 通信的客户端。我让它从保持寄存器中读取整数,而不是字符串。当我尝试在线搜索有关如何从 plc 保持寄存器读取字符串的解决方案时,没有任何有用的结果。我在网上尝试了一个应该能够做到这一点的程序,但每次我 运行 它时我总是收到错误。谁能帮忙?我有程序的代码和下面的错误消息。

from pymodbus.client.sync import ModbusTcpClient as ModbusClient
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.constants import Endian
from pymodbus.compat import iteritems

if __name__ == '__main__':
    client = ModbusClient("192.168.0.1", port=502, auto_open=True)
    client.connect()
    result  = client.read_holding_registers(1, 1, unit=1)
    print("Result : ",result)
    decoder = BinaryPayloadDecoder.fromRegisters(result.registers, byteorder=Endian.Big, wordorder=Endian.Big)

    decoded = {
        'name': decoder.decode_string(10).decode(),
    }



    for name, value in iteritems(decoded):
        print ("%s\t" % name, value)
    client.close()

Error Message

Data Register

PLC MB Server Block Setup

您不能从 modbus 通信中获取字符串值

例如,您想要读取异步电机的速度并且使用了驱动器。你有一个raspberry pi。您使用 python 和 Modbus TCP 协议。

电机速度注册为40001。

result = client.read_holding_registers(1, 1, unit=1) 你只能读取40001地址。

result = client.read_input_registers(0x01,1, unit=0x01) 你只能读取30001地址。

你的解码没问题。

It's your setup & request that's the issue. PLC Setup looks wrong. You are also only requesting 1 register to read. Your request is not getting any response (including error).

  • 可乐 = b'436f6b65' = [17263, 27493]
  • 披萨 = b'50697a7a6100' = [20585, 31354, 24832]
  • Cookies = b'436f6f6b69657300' = [17263, 28523, 26981, 29440]

用 0 填充以保持寄存器长度相同。 存入plc Modbus寄存器可读

  • 可乐 = b'436f6b6500000000' = [17263, 27493, 0, 0]
  • 披萨 = b'50697a7a61000000' = [20585, 31354, 24832, 0]
  • Cookies = b'436f6f6b69657300' = [17263, 28523, 26981, 29440]

每个字请求 4 个寄存器并解码。