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
ModbusRTUslave.uart je UART instanca (npr.
machine.UARTilipyb.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
REGISTERi 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_numkoji 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 pozivahandle().
- crc16(data: bytes | bytearray) bytes¶
Računa Modbus CRC-16 od data pomoću
CRC16_TABLEi vraća ga kao 2-bajtni little-endianbytesobjekt 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:
0x03Read Holding Registers — odgovara traženim rasponom vrijednosti registara.0x06Write Single Register — upisuje jedan registar i vraća adresu i vrijednost.0x10Write 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_IDtiho 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 jeFalse.