Funktion "read_holding_registers" von pymodbusPython

Python-Programme
Anonymous
 Funktion "read_holding_registers" von pymodbus

Post by Anonymous »

Ich versuche, Modbus RTU vom seriellen Gerät zu lesen. Dies ist ein Beispiel für ein einfaches Lesen aus Port "com7". Dieser Port ist falsch, von einem Bluetooth -Gerät.
Ich kann nicht feststellen, dass er falsch ist. Mit dem Schreibport von RS-485 Adpter funktioniert es einwandfrei oder einige weitere Ports von PC. < /P>

Code: Select all

from pymodbus.client import ModbusSerialClient
from pymodbus.exceptions import ModbusException
import logging

# Configure logging for debugging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def read_holding_registers(port, slave_id, start_address, count):
"""
Reads Holding Registers from a Modbus device.

Args:
port (str): COM port (e.g., 'COM7' or '/dev/ttyUSB0' on Linux).
slave_id (int): Modbus Slave ID (default = 1).
start_address (int): Starting register address (0x0000).
count (int): Number of registers to read.

Returns:
list[int] | None: List of register values or None if an error occurs.
"""
# Initialize Modbus RTU client
client = ModbusSerialClient(

port=port,          # Serial port (e.g., 'COM7')
baudrate=9600,      # Baud rate (adjust if needed)
stopbits=1,         # Stop bits (usually 1 or 2)
bytesize=8,         # Data bits (usually 8)
parity='N',         # Parity ('N' = None, 'E' = Even, 'O' = Odd)
timeout=2           # Response timeout (seconds)
)

try:
# Connect to the device
if not client.connect():
logger.error("Failed to connect to the device.")
return None

# Read Holding Registers (Function Code 0x03)
response = client.read_holding_registers(
address=start_address,
count=count,
slave=slave_id
)

# Check for Modbus errors
if response.isError():
logger.error(f"Modbus Error: {response}")
return None

logger.info(f"Successfully read {len(response.registers)} registers.")
return response.registers

except ModbusException as e:
logger.error(f"Modbus Exception: {e}")
return None
except Exception as e:
logger.error(f"Unexpected Error: {e}")
return None
finally:
client.close()  # Ensure the connection is closed

if __name__ == "__main__":
# Example usage
PORT = 'COM7'           # Serial port (adjust as needed)
SLAVE_ID = 1            # Slave ID (check your device manual)
START_ADDR = 0          # First register address (0x0000)
REG_COUNT = 10          # Number of registers to read

print(f"Reading {REG_COUNT} Holding Registers starting from address {START_ADDR}...")
registers = read_holding_registers(PORT, SLAVE_ID, START_ADDR, REG_COUNT)

if registers is not None:
# Print register values in decimal and hex
for i, reg in enumerate(registers):
print(f"Register {START_ADDR + i}: {reg} (0x{reg:04X})")
else:
print("Failed to read registers. Check connection and parameters.")

Ich habe versucht, eine Ausnahme auszusetzen, es hat nicht funktioniert

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post