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.UART nebo pyb.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 REGISTER a 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_num obsahují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ím handle().

clear() None

Resetuje každou položku v REGISTER na 0.

crc16(data: bytes | bytearray) bytes

Vypočítá Modbus CRC-16 z data pomocí CRC16_TABLE a vrátí jej jako 2bajtový objekt bytes v 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:

  • 0x03 Read Holding Registers — odpovídá požadovaným rozsahem hodnot registrů.

  • 0x06 Write Single Register — zapíše jeden registr a vrátí adresu a hodnotu.

  • 0x10 Write 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 je False.