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.UARTofpyb.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_numdie 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 uhandle()aanroept.
- crc16(data: bytes | bytearray) bytes¶
Berekent de Modbus CRC-16 van data met behulp van
CRC16_TABLEen geeft deze terug als een 2-byte little-endianbytes-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:
0x03Read Holding Registers — reageert met het gevraagde bereik aan registerwaarden.0x06Write Single Register — schrijft één register en stuurt het adres en de waarde terug (echo).0x10Write 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_IDworden stilzwijgend genegeerd.debug drukt, indien
True, het ruwe verzoek, de geparseerde functiecode, het gegenereerde antwoord en eventuele foutdetails af naar de REPL. StandaardFalse.