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.UART tai pyb.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_num ja 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 ennen handle()-kutsua.

clear() None

Nollaa jokaisen REGISTER-listan merkinnän arvoon 0.

crc16(data: bytes | bytearray) bytes

Laskee data-arvon Modbus CRC-16:n käyttäen CRC16_TABLE-taulukkoa ja palauttaa sen 2-tavuisena little-endian bytes-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:

  • 0x03 Read Holding Registers — vastaa pyydetyllä rekisteriarvojen alueella.

  • 0x06 Write Single Register — kirjoittaa yhden rekisterin ja kaiuttaa takaisin osoitteen ja arvon.

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