modbus — Modbus RTU-slaveprotocol

Deze module biedt een pure-Python-implementatie van een Modbus RTU-slave die communiceert via een UART. Hij houdt een interne holding-registerarray bij en reageert op de standaard Modbus-functiecodes 0x03 (Read Holding Registers), 0x06 (Write Single Register) en 0x10 (Write Multiple Registers). CRC-16 (Modbus-polynoom) wordt berekend met behulp van een lookup-tabel.

Bijvoorbeeld:

from machine import UART
from modbus import ModbusRTU

uart = UART(1, 115200, timeout=10, timeout_char=10)
modbus = ModbusRTU(uart, slave_id=0x01, register_num=30)

while True:
    if modbus.any():
        modbus.handle(debug=False)

class ModbusRTU

Een Modbus RTU-slave die verzoeken van een UART leest, zijn interne registerarray bijwerkt en het bijbehorende antwoord terugschrijft naar de UART.

class modbus.ModbusRTU(uart: machine.UART, slave_id: int = 0x01, register_num: int = 30)

Construeert een ModbusRTU-slave.

  • uart is een UART-instantie (bijv. machine.UART of pyb.UART) die wordt gebruikt om Modbus-frames te verzenden en te ontvangen. De UART moet vóór doorgifte worden geconfigureerd met de juiste baudrate, pariteit en time-outs.

  • slave_id is het Modbus-slaveadres (1-247) waarop deze instantie zal reageren. Frames die aan andere slave-ID’s zijn geadresseerd, worden genegeerd.

  • register_num is het aantal 16-bits holding-registers dat deze slave ondersteunt. Registers worden opgeslagen in de REGISTER-lijst en geïnitialiseerd op nul.

SLAVE_ID: int

Het Modbus-slaveadres waarop deze instantie zal reageren. Ingesteld vanuit het constructorargument slave_id.

uart: machine.UART

De UART-instantie die aan de constructor is doorgegeven, gebruikt voor alle I/O.

register_num: int

Het aantal 16-bits holding-registers, ingesteld vanuit het constructorargument register_num.

REGISTER: list[int]

Lijst met lengte register_num die de huidige 16-bits registerwaarden bevat. Lees- en schrijfacties die via inkomende Modbus-verzoeken worden uitgevoerd, werken deze lijst bij. Applicatiecode mag rechtstreeks uit deze lijst lezen of erin schrijven om gegevens uit te wisselen met de Modbus-master.

CRC16_TABLE: list[int]

Vooraf berekende lookup-tabel met 256 items voor de Modbus CRC-16-polynoom, gebruikt door crc16().

any() int

Geeft het aantal bytes terug dat momenteel beschikbaar is in de ontvangstbuffer van de onderliggende UART (delegeert naar uart.any()). Gebruik dit om op een inkomend verzoek te controleren voordat u handle() aanroept.

clear() None

Stelt elk item in REGISTER terug op 0.

crc16(data: bytes | bytearray) bytes

Berekent de Modbus CRC-16 van data met behulp van CRC16_TABLE en geeft deze terug als een 2-byte little-endian bytes-object dat geschikt is om aan een Modbus-frame toe te voegen.

  • data is een bytes/bytearray (of een willekeurige iterable van gehele getallen) met de bytes waarvan de checksum berekend moet worden.

handle(debug: bool = False) None

Leest één Modbus-verzoek van de UART, werkt de interne registerarray bij waar nodig, en schrijft het bijbehorende antwoord terug naar de UART.

Ondersteunde functiecodes:

  • 0x03 Read Holding Registers — reageert met het gevraagde bereik aan registerwaarden.

  • 0x06 Write Single Register — schrijft één register en stuurt het adres en de waarde terug (echo).

  • 0x10 Write Multiple Registers — schrijft een aaneengesloten bereik aan registers en reageert met het startadres en het aantal.

Modbus-uitzonderingsantwoorden worden teruggegeven voor:

  • Illegal Function (0x01) — niet-ondersteunde functiecode.

  • Illegal Data Address (0x02) — registerindex buiten bereik.

  • Illegal Data Value (0x03) — het bytetal komt niet overeen met het opgegeven aantal registers.

Frames waarvan de CRC niet overeenkomt of waarvan het slaveadres niet overeenkomt met SLAVE_ID worden stilzwijgend genegeerd.

  • debug drukt, indien True, het ruwe verzoek, de geparseerde functiecode, het gegenereerde antwoord en eventuele foutdetails af naar de REPL. Standaard False.