modbus — Modbus RTU slave protokoll

Ez a modul egy Modbus RTU slave tiszta Python megvalósítását nyújtja, amely UART-on keresztül kommunikál. Fenntart egy belső holding-register tömböt, és válaszol a standard Modbus függvénykódokra: 0x03 (Read Holding Registers), 0x06 (Write Single Register) és 0x10 (Write Multiple Registers). A CRC-16 (Modbus polinom) keresőtábla segítségével kerül kiszámításra.

Például:

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

Egy Modbus RTU slave, amely a UART-ról olvassa a kéréseket, frissíti a belső regisztertömbjét, és visszaírja a megfelelő választ a UART-ra.

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

Létrehoz egy ModbusRTU slave objektumot.

  • Az uart egy UART példány (pl. machine.UART vagy pyb.UART), amely a Modbus képkockák küldésére és fogadására szolgál. A UART-ot az átadás előtt megfelelő átviteli sebességgel (baud), paritással és időtúllépésekkel kell konfigurálni.

  • A slave_id a Modbus slave cím (1-247), amelyre ez a példány válaszolni fog. A más slave azonosítóknak címzett képkockák figyelmen kívül maradnak.

  • A register_num a slave-et alátámasztó 16 bites holding regiszterek száma. A regiszterek a REGISTER listában tárolódnak, és nullára inicializálódnak.

SLAVE_ID: int

A Modbus slave cím, amelyre ez a példány válaszolni fog. A slave_id konstruktor argumentumból kerül beállításra.

uart: machine.UART

A konstruktornak átadott UART példány, amelyet minden I/O művelethez használ.

register_num: int

A 16 bites holding regiszterek száma, a register_num konstruktor argumentumból beállítva.

REGISTER: list[int]

register_num hosszúságú lista, amely a 16 bites regiszterek aktuális értékeit tárolja. A beérkező Modbus kérések által végrehajtott olvasások és írások frissítik ezt a listát. Az alkalmazás kódja közvetlenül olvashat ebből a listából vagy írhat bele, hogy adatot cseréljen a Modbus masterrel.

CRC16_TABLE: list[int]

Előre kiszámított, 256 elemű keresőtábla a Modbus CRC-16 polinomhoz, amelyet a crc16() használ.

any() int

Visszaadja az alatta lévő UART vételi pufferében pillanatnyilag rendelkezésre álló bájtok számát (átdelegálja az uart.any() felé). Ezzel ellenőrizhető a beérkező kérés a handle() meghívása előtt.

clear() None

Visszaállít minden bejegyzést a REGISTER listában 0 értékre.

crc16(data: bytes | bytearray) bytes

Kiszámítja a data Modbus CRC-16 értékét a CRC16_TABLE segítségével, és 2 bájtos, little-endian bytes objektumként adja vissza, amely alkalmas egy Modbus képkockához fűzéshez.

  • A data egy bytes/bytearray (vagy egészek bármely iterálható gyűjteménye), amely az ellenőrzőösszeghez tartozó bájtokat tartalmazza.

handle(debug: bool = False) None

Beolvas egyetlen Modbus kérést a UART-ról, szükség szerint frissíti a belső regisztertömböt, és visszaírja a megfelelő választ a UART-ra.

Támogatott függvénykódok:

  • 0x03 Read Holding Registers — a kért regiszterérték-tartománnyal válaszol.

  • 0x06 Write Single Register — egyetlen regisztert ír, és visszatükrözi a címet és az értéket.

  • 0x10 Write Multiple Registers — regiszterek összefüggő tartományát írja, és a kezdőcímmel és a darabszámmal válaszol.

Modbus kivételválaszok kerülnek visszaadásra a következő esetekben:

  • Illegal Function (0x01) — nem támogatott függvénykód.

  • Illegal Data Address (0x02) — a regiszterindex a tartományon kívül esik.

  • Illegal Data Value (0x03) — a bájtszám nem egyezik a regiszterek deklarált mennyiségével.

Azok a képkockák, amelyeknek a CRC-je nem egyezik, vagy amelyeknek a slave címe nem egyezik a SLAVE_ID értékkel, csendben eldobásra kerülnek.

  • A debug ha True, kiírja a nyers kérést, az értelmezett függvénykódot, a generált választ és minden hibarészletet a REPL-be. Alapértelmezett értéke False.