首页 > 解决方案 > pymodbus 读取仪表寄存器

问题描述

我是 modbus 的新手,但我有一个小项目要做。我需要从能量计中读取一些值。我从网上找到的一些例子写了这个:

import logging
from pymodbus.client.sync import ModbusTcpClient as ModbusClient

logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

client = ModbusClient('192.168.80.210')
client.connect() 
rr = client.read_holding_registers(40012, 1)
print rr

client.close()

它似乎正在连接到仪表,因为这是我的输出:

DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x0 0x1 0x0 0x0 0x0 0x6 0x0 0x3 0x9c 0x4c 0x0 0x1
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Transaction failed. (Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received)) 
DEBUG:pymodbus.framer.socket_framer:Processing: 
DEBUG:pymodbus.transaction:Getting transaction 1
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
Modbus Error: [Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received)

我想从寄存器读取4001240014这是我拥有的 Modbusdbus 映射: Modbus 映射

我感谢您的帮助。问候,

标签: pythonmodbusmodbus-tcppymodbus

解决方案


我认为您应该设置unitandport参数,并使用 获取值rr.registers,因此您需要知道 unit_ID 值和设备端口。

在大多数情况下,unitis1portis502作为 modbus 默认值。

如果您想从 address 读取4001240014,您可以40012使用count=3.


我改进了你的代码,试试看:

from pymodbus.client.sync import ModbusTcpClient

client = ModbusTcpClient('192.168.80.210', port=502)

if client.connect():
    res = client.read_holding_registers(40012, count=3, unit=1)

    if not res.isError():
    '''.isError() was implemented in pymodbus version 1.4.0 and above.'''
        print(res.registers)
    else:
        # handling error
        print(res)

client.close()

推荐阅读