modbus — Modbus RTU slave protokolü

Bu modül, bir UART üzerinden iletişim kuran bir Modbus RTU slave’inin saf Python uygulamasını sağlar. Dahili bir tutma yazmacı dizisi tutar ve standart Modbus fonksiyon kodları 0x03 (Tutma Yazmaçlarını Oku), 0x06 (Tek Yazmaç Yaz) ve 0x10 (Çoklu Yazmaç Yaz) kodlarına yanıt verir. CRC-16 (Modbus polinomu) bir arama tablosu kullanılarak hesaplanır.

Örneğin:

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

Bir UART’tan istekleri okuyan, dahili yazmaç dizisini güncelleyen ve ilgili yanıtı UART’a geri yazan bir Modbus RTU slave’idir.

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

Bir ModbusRTU slave’i oluşturur.

  • uart, Modbus çerçevelerini göndermek ve almak için kullanılan bir UART örneğidir (ör. machine.UART veya pyb.UART). UART, iletilmeden önce uygun baud hızı, parite ve zaman aşımı değerleriyle yapılandırılmalıdır.

  • slave_id, bu örneğin yanıt vereceği Modbus slave adresidir (1-247). Diğer slave kimliklerine adreslenen çerçeveler yok sayılır.

  • register_num, bu slave’i destekleyen 16 bitlik tutma yazmaçlarının sayısıdır. Yazmaçlar REGISTER listesinde saklanır ve sıfıra ilklendirilir.

SLAVE_ID: int

Bu örneğin yanıt vereceği Modbus slave adresi. slave_id yapıcı argümanından ayarlanır.

uart: machine.UART

Tüm G/Ç için kullanılan, yapıcıya iletilen UART örneği.

register_num: int

16 bitlik tutma yazmaçlarının sayısı; register_num yapıcı argümanından ayarlanır.

REGISTER: list[int]

register_num uzunluğunda, geçerli 16 bitlik yazmaç değerlerini tutan liste. Gelen Modbus istekleri aracılığıyla gerçekleştirilen okuma ve yazma işlemleri bu listeyi günceller. Uygulama kodu, Modbus master ile veri alışverişi yapmak için bu listeyi doğrudan okuyabilir veya bu listeye yazabilir.

CRC16_TABLE: list[int]

crc16() tarafından kullanılan, Modbus CRC-16 polinomu için önceden hesaplanmış 256 girişli arama tablosu.

any() int

Alttaki UART’ın alma arabelleğinde şu anda mevcut olan bayt sayısını döndürür (uart.any() fonksiyonuna devreder). handle() çağrılmadan önce gelen bir isteği kontrol etmek için bunu kullanın.

clear() None

REGISTER içindeki her girişi 0 değerine sıfırlar.

crc16(data: bytes | bytearray) bytes

data değerinin Modbus CRC-16 değerini CRC16_TABLE kullanarak hesaplar ve bir Modbus çerçevesine eklenmeye uygun, 2 baytlık little-endian bir bytes nesnesi olarak döndürür.

  • data, sağlama toplamı alınacak baytları içeren bir bytes/bytearray (veya herhangi bir tamsayı yinelenebiliridir) nesnesidir.

handle(debug: bool = False) None

UART’tan tek bir Modbus isteği okur, gerektiği şekilde dahili yazmaç dizisini günceller ve ilgili yanıtı UART’a geri yazar.

Desteklenen fonksiyon kodları:

  • 0x03 Tutma Yazmaçlarını Oku — istenen yazmaç değerleri aralığıyla yanıt verir.

  • 0x06 Tek Yazmaç Yaz — tek bir yazmaç yazar ve adresi ile değeri geri yansıtır.

  • 0x10 Çoklu Yazmaç Yaz — bitişik bir yazmaç aralığı yazar ve başlangıç adresi ile sayıyla yanıt verir.

Modbus istisna yanıtları şunlar için döndürülür:

  • Geçersiz Fonksiyon (0x01) — desteklenmeyen fonksiyon kodu.

  • Geçersiz Veri Adresi (0x02) — yazmaç indisi aralık dışında.

  • Geçersiz Veri Değeri (0x03) — bayt sayısı, beyan edilen yazmaç miktarıyla eşleşmiyor.

CRC değeri eşleşmeyen veya slave adresi SLAVE_ID ile eşleşmeyen çerçeveler sessizce atılır.

  • debug True ise, ham isteği, ayrıştırılmış fonksiyon kodunu, oluşturulan yanıtı ve varsa hata ayrıntılarını REPL’e yazdırır. Varsayılan değeri False şeklindedir.