modbus — Modbus RTU -orjaprotokolla¶
Tämä moduuli tarjoaa puhtaalla Pythonilla toteutetun Modbus RTU -orjan, joka kommunikoi UART:n kautta. Se ylläpitää sisäistä pitorekisteritaulukkoa ja vastaa vakiintuneisiin Modbus-funktiokoodeihin 0x03 (Read Holding Registers), 0x06 (Write Single Register) ja 0x10 (Write Multiple Registers). CRC-16 (Modbus-polynomi) lasketaan hakutaulukon avulla.
Esimerkiksi:
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¶
Modbus RTU -orja, joka lukee pyyntöjä UART:sta, päivittää sisäistä rekisteritaulukkoaan ja kirjoittaa vastaavan vastauksen takaisin UART:iin.
- class modbus.ModbusRTU(uart: machine.UART, slave_id: int = 0x01, register_num: int = 30)¶
Rakentaa
ModbusRTU-orjan.uart on UART-instanssi (esim.
machine.UARTtaipyb.UART), jota käytetään Modbus-kehysten lähettämiseen ja vastaanottamiseen. UART on määritettävä sopivalla siirtonopeudella, pariteetilla ja aikakatkaisuilla ennen sen välittämistä.slave_id on Modbus-orjaosoite (1-247), johon tämä instanssi vastaa. Muille orja-ID:ille osoitetut kehykset ohitetaan.
register_num on tämän orjan taustalla olevien 16-bittisten pitorekisterien lukumäärä. Rekisterit tallennetaan
REGISTER-listaan ja alustetaan nollaan.
- SLAVE_ID: int¶
Modbus-orjaosoite, johon tämä instanssi vastaa. Asetetaan slave_id-konstruktoriargumentista.
- uart: machine.UART¶
Konstruktorille välitetty UART-instanssi, jota käytetään kaikkeen I/O:hon.
- register_num: int¶
16-bittisten pitorekisterien lukumäärä, asetetaan register_num-konstruktoriargumentista.
- REGISTER: list[int]¶
Lista, jonka pituus on
register_numja joka sisältää nykyiset 16-bittiset rekisteriarvot. Saapuvien Modbus-pyyntöjen kautta tehdyt luvut ja kirjoitukset päivittävät tätä listaa. Sovelluskoodi voi lukea tästä listasta tai kirjoittaa siihen suoraan vaihtaakseen dataa Modbus-isännän kanssa.
- CRC16_TABLE: list[int]¶
Esilaskettu 256-merkinnän hakutaulukko Modbusin CRC-16-polynomille, jota
crc16()käyttää.
- any() int¶
Palauttaa taustalla olevan UART:n vastaanottopuskurissa tällä hetkellä saatavilla olevien tavujen lukumäärän (delegoi
uart.any()-funktiolle). Käytä tätä tarkistaaksesi saapuvan pyynnön ennenhandle()-kutsua.
- crc16(data: bytes | bytearray) bytes¶
Laskee data-arvon Modbus CRC-16:n käyttäen
CRC16_TABLE-taulukkoa ja palauttaa sen 2-tavuisena little-endianbytes-objektina, joka soveltuu liitettäväksi Modbus-kehykseen.data on
bytes/bytearray(tai mikä tahansa kokonaislukujen iteroitava), joka sisältää tarkistussummattavat tavut.
- handle(debug: bool = False) None¶
Lukee yhden Modbus-pyynnön UART:sta, päivittää sisäisen rekisteritaulukon tarpeen mukaan ja kirjoittaa vastaavan vastauksen takaisin UART:iin.
Tuetut funktiokoodit:
0x03Read Holding Registers — vastaa pyydetyllä rekisteriarvojen alueella.0x06Write Single Register — kirjoittaa yhden rekisterin ja kaiuttaa takaisin osoitteen ja arvon.0x10Write Multiple Registers — kirjoittaa yhtenäisen rekisterialueen ja vastaa aloitusosoitteella ja lukumäärällä.
Modbus-poikkeusvastaukset palautetaan seuraavissa tapauksissa:
Illegal Function (
0x01) — ei-tuettu funktiokoodi.Illegal Data Address (
0x02) — rekisteri-indeksi alueen ulkopuolella.Illegal Data Value (
0x03) — tavumäärä ei vastaa ilmoitettua rekisterien määrää.
Kehykset, joiden CRC ei täsmää tai joiden orjaosoite ei vastaa
SLAVE_ID-arvoa, hylätään hiljaisesti.debug tulostaa, jos
True, raa’an pyynnön, jäsennetyn funktiokoodin, generoidun vastauksen ja mahdolliset virhetiedot REPL:iin. Oletusarvo onFalse.