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
ModbusRTUslave’i oluşturur.uart, Modbus çerçevelerini göndermek ve almak için kullanılan bir UART örneğidir (ör.
machine.UARTveyapyb.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
REGISTERlistesinde 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_numuzunluğ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.
- crc16(data: bytes | bytearray) bytes¶
data değerinin Modbus CRC-16 değerini
CRC16_TABLEkullanarak hesaplar ve bir Modbus çerçevesine eklenmeye uygun, 2 baytlık little-endian birbytesnesnesi 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ı:
0x03Tutma Yazmaçlarını Oku — istenen yazmaç değerleri aralığıyla yanıt verir.0x06Tek 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_IDile eşleşmeyen çerçeveler sessizce atılır.debug
Trueise, 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ğeriFalseşeklindedir.