modbus — protokol Modbus RTU slave¶
Tento modul poskytuje implementaci Modbus RTU slave v čistém Pythonu, která komunikuje přes UART. Udržuje interní pole holding registrů a odpovídá na standardní Modbus funkční kódy 0x03 (Read Holding Registers), 0x06 (Write Single Register) a 0x10 (Write Multiple Registers). CRC-16 (Modbus polynom) se počítá pomocí vyhledávací tabulky.
Například:
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)
třída ModbusRTU¶
Modbus RTU slave, který čte požadavky z UART, aktualizuje své interní pole registrů a zapisuje odpovídající odpověď zpět na UART.
- class modbus.ModbusRTU(uart: machine.UART, slave_id: int = 0x01, register_num: int = 30)¶
Vytvoří Modbus RTU slave
ModbusRTU.uart je instance UART (např.
machine.UARTnebopyb.UART) používaná k odesílání a přijímání Modbus snímků. UART musí být před předáním nakonfigurován s odpovídající přenosovou rychlostí (baud rate), paritou a timeouty.slave_id je Modbus adresa slave (1-247), na kterou bude tato instance odpovídat. Snímky adresované jiným slave ID jsou ignorovány.
register_num je počet 16bitových holding registrů zálohujících tento slave. Registry jsou uloženy v seznamu
REGISTERa inicializovány na nulu.
- SLAVE_ID: int¶
Modbus adresa slave, na kterou bude tato instance odpovídat. Nastaveno z argumentu konstruktoru slave_id.
- uart: machine.UART¶
Instance UART předaná konstruktoru, používaná pro veškerý I/O.
- register_num: int¶
Počet 16bitových holding registrů, nastavený z argumentu konstruktoru register_num.
- REGISTER: list[int]¶
Seznam délky
register_numobsahující aktuální 16bitové hodnoty registrů. Čtení a zápisy prováděné prostřednictvím příchozích Modbus požadavků tento seznam aktualizují. Aplikační kód může z tohoto seznamu přímo číst nebo do něj zapisovat za účelem výměny dat s Modbus masterem.
- CRC16_TABLE: list[int]¶
Předpočítaná vyhledávací tabulka s 256 položkami pro Modbus polynom CRC-16, používaná metodou
crc16().
- any() int¶
Vrací počet bajtů aktuálně dostupných v přijímacím bufferu podkladového UART (deleguje na
uart.any()). Použijte ji ke kontrole příchozího požadavku před zavolánímhandle().
- crc16(data: bytes | bytearray) bytes¶
Vypočítá Modbus CRC-16 z data pomocí
CRC16_TABLEa vrátí jej jako 2bajtový objektbytesv little-endian formátu vhodný k připojení k Modbus snímku.data je
bytes/bytearray(nebo libovolný iterovatelný objekt celých čísel) obsahující bajty k vytvoření kontrolního součtu.
- handle(debug: bool = False) None¶
Přečte jeden Modbus požadavek z UART, podle potřeby aktualizuje interní pole registrů a zapíše odpovídající odpověď zpět na UART.
Podporované funkční kódy:
0x03Read Holding Registers — odpovídá požadovaným rozsahem hodnot registrů.0x06Write Single Register — zapíše jeden registr a vrátí adresu a hodnotu.0x10Write Multiple Registers — zapíše souvislý rozsah registrů a odpoví počáteční adresou a počtem.
Modbus výjimkové odpovědi se vracejí pro:
Illegal Function (
0x01) — nepodporovaný funkční kód.Illegal Data Address (
0x02) — index registru mimo rozsah.Illegal Data Value (
0x03) — počet bajtů neodpovídá deklarovanému množství registrů.
Snímky, jejichž CRC nesouhlasí nebo jejichž adresa slave neodpovídá
SLAVE_ID, jsou tiše zahozeny.debug pokud
True, vypíše surový požadavek, parsovaný funkční kód, vygenerovanou odpověď a případné podrobnosti o chybách do REPL. Výchozí hodnota jeFalse.