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 リストに格納され、ゼロに初期化されます。

SLAVE_ID: int

このインスタンスが応答する Modbus スレーブアドレスです。コンストラクタ引数 slave_id から設定されます。

uart: machine.UART

すべての I/O に使用される、コンストラクタに渡された UART インスタンスです。

register_num: int

16ビット保持レジスタの数で、コンストラクタ引数 register_num から設定されます。

REGISTER: list[int]

現在の16ビットレジスタ値を保持する、長さ register_num のリストです。受信した Modbus リクエストによって実行される読み出しと書き込みがこのリストを更新します。アプリケーションコードは、このリストから直接読み出したり書き込んだりして、Modbus マスターとデータを交換できます。

CRC16_TABLE: list[int]

Modbus CRC-16 多項式用に事前計算された256エントリのルックアップテーブルで、crc16() によって使用されます。

any() int

基礎となる UART の受信バッファで現在利用可能なバイト数を返します(uart.any() に委譲します)。handle() を呼び出す前に、これを使用して受信リクエストを確認してください。

clear() None

REGISTER のすべてのエントリを 0 にリセットします。

crc16(data: bytes | bytearray) bytes

CRC16_TABLE を使用して data の Modbus CRC-16 を計算し、Modbus フレームに付加するのに適した2バイトのリトルエンディアン bytes オブジェクトとして返します。

  • data は、チェックサムを計算するバイトを含む bytesbytearray(または整数の任意のイテラブル)です。

handle(debug: bool = False) None

UART から単一の Modbus リクエストを読み取り、必要に応じて内部のレジスタ配列を更新し、対応する応答を UART に書き戻します。

サポートされている機能コード:

  • 0x03 保持レジスタの読み出し --- 要求されたレジスタ値の範囲で応答します。

  • 0x06 単一レジスタの書き込み --- 単一のレジスタに書き込み、アドレスと値をエコーバックします。

  • 0x10 複数レジスタの書き込み --- 連続したレジスタ範囲に書き込み、開始アドレスと数で応答します。

Modbus 例外応答が返されるのは次の場合です:

  • 不正な機能(0x01) --- サポートされていない機能コード。

  • 不正なデータアドレス(0x02) --- レジスタインデックスが範囲外です。

  • 不正なデータ値(0x03) --- バイト数が宣言されたレジスタ数と一致しません。

CRC が一致しないフレーム、またはスレーブアドレスが SLAVE_ID と一致しないフレームは、警告なく破棄されます。

  • debugTrue の場合、生のリクエスト、解析された機能コード、生成された応答、およびすべてのエラー詳細を REPL に出力します。デフォルトは False です。