modbus — Modbus RTU slave protokol

Ovaj modul pruža čistu Python implementaciju Modbus RTU slavea koji komunicira putem UART-a. Održava interno polje holding registara i odgovara na standardne Modbus funkcijske kodove 0x03 (Read Holding Registers), 0x06 (Write Single Register) i 0x10 (Write Multiple Registers). CRC-16 (Modbus polinom) računa se pomoću tablice pretraživanja.

Na primjer:

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)

klasa ModbusRTU

Modbus RTU slave koji čita zahtjeve s UART-a, ažurira svoje interno polje registara i upisuje odgovarajući odgovor natrag na UART.

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

Konstruira ModbusRTU slave.

  • uart je UART instanca (npr. machine.UART ili pyb.UART) koja se koristi za slanje i primanje Modbus okvira. UART mora biti konfiguriran s odgovarajućom brzinom prijenosa (baud), paritetom i istekom vremena prije prosljeđivanja.

  • slave_id je Modbus slave adresa (1-247) na koju će ova instanca odgovarati. Okviri adresirani na druge slave ID-ove se zanemaruju.

  • register_num je broj 16-bitnih holding registara koji podupiru ovaj slave. Registri se pohranjuju u popis REGISTER i inicijaliziraju na nulu.

SLAVE_ID: int

Modbus slave adresa na koju će ova instanca odgovarati. Postavlja se iz konstruktorskog argumenta slave_id.

uart: machine.UART

UART instanca proslijeđena konstruktoru, koja se koristi za sav U/I.

register_num: int

Broj 16-bitnih holding registara, postavljen iz konstruktorskog argumenta register_num.

REGISTER: list[int]

Popis duljine register_num koji sadrži trenutne vrijednosti 16-bitnih registara. Čitanja i pisanja izvršena putem dolaznih Modbus zahtjeva ažuriraju ovaj popis. Aplikacijski kod može izravno čitati iz ovog popisa ili pisati u njega radi razmjene podataka s Modbus masterom.

CRC16_TABLE: list[int]

Unaprijed izračunata tablica pretraživanja s 256 unosa za Modbus CRC-16 polinom, koju koristi crc16().

any() int

Vraća broj bajtova trenutno dostupnih u prijemnom međuspremniku temeljnog UART-a (delegira na uart.any()). Koristite ovo za provjeru dolaznog zahtjeva prije poziva handle().

clear() None

Resetira svaki unos u REGISTER na 0.

crc16(data: bytes | bytearray) bytes

Računa Modbus CRC-16 od data pomoću CRC16_TABLE i vraća ga kao 2-bajtni little-endian bytes objekt prikladan za dodavanje na kraj Modbus okvira.

  • data je bytes/bytearray (ili bilo koji iterabilni objekt cijelih brojeva) koji sadrži bajtove za izračun kontrolnog zbroja.

handle(debug: bool = False) None

Čita jedan Modbus zahtjev s UART-a, ažurira interno polje registara prema potrebi i upisuje odgovarajući odgovor natrag na UART.

Podržani funkcijski kodovi:

  • 0x03 Read Holding Registers — odgovara traženim rasponom vrijednosti registara.

  • 0x06 Write Single Register — upisuje jedan registar i vraća adresu i vrijednost.

  • 0x10 Write Multiple Registers — upisuje neprekinuti raspon registara i odgovara početnom adresom i brojem.

Modbus iznimni odgovori vraćaju se za:

  • Illegal Function (0x01) — nepodržani funkcijski kod.

  • Illegal Data Address (0x02) — indeks registra izvan raspona.

  • Illegal Data Value (0x03) — broj bajtova ne odgovara deklariranoj količini registara.

Okviri čiji se CRC ne podudara ili čija se slave adresa ne podudara s SLAVE_ID tiho se odbacuju.

  • debug ako je True, ispisuje sirovi zahtjev, raščlanjeni funkcijski kod, generirani odgovor i sve pojedinosti o pogreškama u REPL. Zadana vrijednost je False.