modbus --- Modbus RTU スレーブプロトコル¶
このモジュールは、UART 経由で通信する Modbus RTU スレーブの純粋な Python 実装を提供します。内部の保持レジスタ配列を維持し、標準の Modbus 機能コード 0x03(保持レジスタの読み出し)、0x06(単一レジスタの書き込み)、および 0x10(複数レジスタの書き込み)に応答します。CRC-16(Modbus 多項式)はルックアップテーブルを用いて計算されます。
例えば:
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¶
UART からリクエストを読み取り、内部のレジスタ配列を更新し、対応する応答を UART に書き戻す Modbus RTU スレーブです。
- class modbus.ModbusRTU(uart: machine.UART, slave_id: int = 0x01, register_num: int = 30)¶
ModbusRTUスレーブを構築します。uart は、Modbus フレームの送受信に使用される UART インスタンス(例:
machine.UARTまたはpyb.UART)です。UART は渡される前に、適切なボーレート、パリティ、およびタイムアウトで構成されている必要があります。slave_id は、このインスタンスが応答する Modbus スレーブアドレス(1~247)です。他のスレーブ ID 宛のフレームは無視されます。
register_num は、このスレーブを支える16ビット保持レジスタの数です。レジスタは
REGISTERリストに格納され、ゼロに初期化されます。
- uart: machine.UART¶
すべての I/O に使用される、コンストラクタに渡された UART インスタンスです。
- REGISTER: list[int]¶
現在の16ビットレジスタ値を保持する、長さ
register_numのリストです。受信した Modbus リクエストによって実行される読み出しと書き込みがこのリストを更新します。アプリケーションコードは、このリストから直接読み出したり書き込んだりして、Modbus マスターとデータを交換できます。
- any() int¶
基礎となる UART の受信バッファで現在利用可能なバイト数を返します(
uart.any()に委譲します)。handle()を呼び出す前に、これを使用して受信リクエストを確認してください。
- crc16(data: bytes | bytearray) bytes¶
CRC16_TABLEを使用して data の Modbus CRC-16 を計算し、Modbus フレームに付加するのに適した2バイトのリトルエンディアンbytesオブジェクトとして返します。data は、チェックサムを計算するバイトを含む
bytes/bytearray(または整数の任意のイテラブル)です。
- handle(debug: bool = False) None¶
UART から単一の Modbus リクエストを読み取り、必要に応じて内部のレジスタ配列を更新し、対応する応答を UART に書き戻します。
サポートされている機能コード:
0x03保持レジスタの読み出し --- 要求されたレジスタ値の範囲で応答します。0x06単一レジスタの書き込み --- 単一のレジスタに書き込み、アドレスと値をエコーバックします。0x10複数レジスタの書き込み --- 連続したレジスタ範囲に書き込み、開始アドレスと数で応答します。
Modbus 例外応答が返されるのは次の場合です:
不正な機能(
0x01) --- サポートされていない機能コード。不正なデータアドレス(
0x02) --- レジスタインデックスが範囲外です。不正なデータ値(
0x03) --- バイト数が宣言されたレジスタ数と一致しません。
CRC が一致しないフレーム、またはスレーブアドレスが
SLAVE_IDと一致しないフレームは、警告なく破棄されます。debug が
Trueの場合、生のリクエスト、解析された機能コード、生成された応答、およびすべてのエラー詳細を REPL に出力します。デフォルトはFalseです。