From 0ee9c8edfa89cb74ad95cc40798968fadb23ee6a Mon Sep 17 00:00:00 2001 From: Benjamin Koch <bbbsnowball@gmail.com> Date: Mon, 29 May 2023 19:05:37 +0200 Subject: [PATCH] convert Modbus test script to pymodbus (instead of modbus-tk) --- firmware/rust1/rtumaster_pymodbus.py | 80 ++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 firmware/rust1/rtumaster_pymodbus.py diff --git a/firmware/rust1/rtumaster_pymodbus.py b/firmware/rust1/rtumaster_pymodbus.py new file mode 100644 index 0000000..15131a6 --- /dev/null +++ b/firmware/rust1/rtumaster_pymodbus.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# -*- coding: utf_8 -*- + +# based on https://github.com/pymodbus-dev/pymodbus/blob/dev/examples/client_sync.py + +import logging +import time +import sys +import pymodbus +from pymodbus.exceptions import ModbusException +from pymodbus.client import ModbusSerialClient +from pymodbus.file_message import FileRecord + +PORT = '/dev/ttyUSB0' +DEVICE_ADDR = 1 + +logger = logging.getLogger() +logger.setLevel(logging.INFO) +log_handler = logging.StreamHandler(sys.stdout) +#log_handler.setFormatter(logging.Formatter("%(asctime)s\t%(levelname)s\t%(module)s.%(funcName)s\t%(threadName)s\t%(message)s")) +logger.addHandler(log_handler) + +def main(): + try: + client = ModbusSerialClient( + port=PORT, + timeout=0.2, + # Common optional paramers: + # framer=ModbusRtuFramer, + # timeout=10, + # retries=3, + # retry_on_empty=False, + # close_comm_on_error=False, + # strict=True, + baudrate=19200, + parity="E", + ) + client.connect() + logger.info("connected") + + x = client.read_holding_registers(address=1, count=1, slave=DEVICE_ADDR) + logger.info("holding reg 1: %s: %r", x, x.registers) + + x = client.read_file_record([ + # documentation says tuple of: Reference type, File number, Record Number, Record Length + # but actually an object is expected: + FileRecord(file_number=0, record_number=0, record_length=7), + FileRecord(file_number=0, record_number=1, record_length=5), + FileRecord(file_number=0, record_number=2, record_length=3), + ], slave=DEVICE_ADDR) + logger.info("file 0: %s:", x) + for r in x.records: + logger.info(" %s: %r", r, r.record_data) + + logger.info("Bootloader state partition:") + x = client.read_file_record([ + FileRecord(file_number=1, record_number=int(0x6000/2), record_length=20), + ], slave=DEVICE_ADDR) + logger.info("file 1 @ bootloader state partition: %s:", x) + for r in x.records: + logger.info(" %s: %r", r, r.record_data) + + toggle = True + while True: + logger.info(client.write_coil(address=0, value=toggle, slave=DEVICE_ADDR)) + toggle = not toggle + + x = client.read_discrete_inputs(address=0, count=5, slave=DEVICE_ADDR) + logger.info("read_discrete_inputs: %s: %r", x, x.bits) + + x = client.read_input_registers(address=0, count=25, slave=DEVICE_ADDR) + logger.info("read_input_registers: %s: %r", x, x.registers) + + time.sleep(0.1) + + except ModbusException as exc: + logger.error("%s", exc) + +if __name__ == "__main__": + main() -- GitLab