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
ModbusRTUslave objektumot.Az uart egy UART példány (pl.
machine.UARTvagypyb.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
REGISTERlistá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_numhosszú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 ahandle()meghívása előtt.
- crc16(data: bytes | bytearray) bytes¶
Kiszámítja a data Modbus CRC-16 értékét a
CRC16_TABLEsegítségével, és 2 bájtos, little-endianbytesobjektumké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:
0x03Read Holding Registers — a kért regiszterérték-tartománnyal válaszol.0x06Write Single Register — egyetlen regisztert ír, és visszatükrözi a címet és az értéket.0x10Write 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ékeFalse.