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.UARTataupyb.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
REGISTERdan 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: list[int]¶
Daftar sepanjang
register_numyang 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 memanggilhandle().
- crc16(data: bytes | bytearray) bytes¶
Menghitung CRC-16 Modbus dari data menggunakan
CRC16_TABLEdan mengembalikannya sebagai objekbyteslittle-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:
0x03Read Holding Registers --- merespons dengan rentang nilai register yang diminta.0x06Write Single Register --- menulis satu register dan mengembalikan alamat dan nilainya.0x10Write 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_IDakan 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 adalahFalse.