modbus --- Protokol slave Modbus RTU

Modul ini menyediakan implementasi murni-Python dari slave Modbus RTU yang berkomunikasi melalui UART. Modul ini mempertahankan array register penahan internal dan merespons kode fungsi Modbus standar 0x03 (Read Holding Registers), 0x06 (Write Single Register), dan 0x10 (Write Multiple Registers). CRC-16 (polinomial Modbus) dihitung menggunakan tabel pencarian.

Sebagai contoh:

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

Slave Modbus RTU yang membaca permintaan dari UART, memperbarui array register internalnya, dan menulis respons yang sesuai kembali ke UART.

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

Membuat slave ModbusRTU.

  • uart adalah instans UART (misalnya machine.UART atau pyb.UART) yang digunakan untuk mengirim dan menerima bingkai Modbus. UART harus dikonfigurasi dengan laju baud, paritas, dan batas waktu yang sesuai sebelum diberikan.

  • slave_id adalah alamat slave Modbus (1-247) yang akan direspons oleh instans ini. Bingkai yang ditujukan ke ID slave lain akan diabaikan.

  • register_num adalah jumlah register penahan 16-bit yang mendukung slave ini. Register disimpan dalam daftar REGISTER dan diinisialisasi ke nol.

SLAVE_ID: int

Alamat slave Modbus yang akan direspons oleh instans ini. Diatur dari argumen konstruktor slave_id.

uart: machine.UART

Instans UART yang diberikan ke konstruktor, digunakan untuk semua I/O.

register_num: int

Jumlah register penahan 16-bit, diatur dari argumen konstruktor register_num.

REGISTER: list[int]

Daftar sepanjang register_num yang menyimpan nilai register 16-bit saat ini. Pembacaan dan penulisan yang dilakukan melalui permintaan Modbus masuk akan memperbarui daftar ini. Kode aplikasi dapat membaca dari atau menulis ke daftar ini secara langsung untuk bertukar data dengan master Modbus.

CRC16_TABLE: list[int]

Tabel pencarian 256 entri yang telah dihitung sebelumnya untuk polinomial CRC-16 Modbus, digunakan oleh crc16().

any() int

Mengembalikan jumlah byte yang saat ini tersedia dalam buffer penerimaan UART yang mendasarinya (mendelegasikan ke uart.any()). Gunakan ini untuk memeriksa adanya permintaan masuk sebelum memanggil handle().

clear() None

Mengatur ulang setiap entri dalam REGISTER menjadi 0.

crc16(data: bytes | bytearray) bytes

Menghitung CRC-16 Modbus dari data menggunakan CRC16_TABLE dan mengembalikannya sebagai objek bytes little-endian 2-byte yang sesuai untuk ditambahkan ke bingkai Modbus.

  • data adalah bytes/bytearray (atau iterable integer apapun) yang berisi byte untuk diperiksa checksumnya.

handle(debug: bool = False) None

Membaca satu permintaan Modbus dari UART, memperbarui array register internal sesuai kebutuhan, dan menulis respons yang sesuai kembali ke UART.

Kode fungsi yang didukung:

  • 0x03 Read Holding Registers --- merespons dengan rentang nilai register yang diminta.

  • 0x06 Write Single Register --- menulis satu register dan mengembalikan alamat dan nilainya.

  • 0x10 Write Multiple Registers --- menulis rentang register yang bersebelahan dan merespons dengan alamat awal dan jumlahnya.

Respons pengecualian Modbus dikembalikan untuk:

  • Illegal Function (0x01) --- kode fungsi yang tidak didukung.

  • Illegal Data Address (0x02) --- indeks register di luar jangkauan.

  • Illegal Data Value (0x03) --- jumlah byte tidak sesuai dengan jumlah register yang dideklarasikan.

Bingkai yang CRC-nya tidak cocok atau alamat slave-nya tidak sesuai dengan SLAVE_ID akan diabaikan secara diam-diam.

  • debug jika True, mencetak permintaan mentah, kode fungsi yang diurai, respons yang dihasilkan, dan detail kesalahan apa pun ke REPL. Defaultnya adalah False.