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.