pymodbus 3.11.4 で device_id(Unit ID)を指定して通信する方法

pymodbus 3.11.4 では、Modbus 通信時に device_id(Unit ID)を明示的に指定する方法が以前のバージョンと少し異なる。
この記事では、サーバ・クライアントでデバイスID を指定して読み書きする方法をまとめる。

Modbus の詳細仕様や例外処理には踏み込まず、疎通確認に必要な部分だけを扱う。
なお、シミュレータとクライアントを使い、疎通確認を行う方法は別途以下で記載している。
pymodbusでシミュレータを使いModbus通信する | エクヌツITブログ


このページでできること

  • pymodbus 3.11.4 で Unit ID(device_id)を指定して通信する
  • クライアント側で Unit ID を指定する方法
  • Simulator(ModbusSimulatorServer)で Unit ID を設定する方法
  • 最小構成のコード例で疎通確認ができる

注意事項

  • Modbus のプロトコル詳細は扱わない
  • RTU(シリアル通信)は対象外
  • 3.11.4 固有の仕様に基づく内容

前提環境

  • Python 3.x
  • pymodbus 3.11.4
  • OS は任意(Windows / macOS / Linux)

1. Simulator 側で device_idを設定する

pymodbus 3.11.4 の Simulator は set_up.json のserverにdevice_idを設定することで使用できる。

set_up.jsonの設定例(以下の例は14を指定している):

    "server_list": {
        "server": {
            "device_id":14,
            "comm": "tcp",
            "host": "0.0.0.0",
            "port": 5020,
            "ignore_missing_devices": false,
            "framer": "socket",
            "identity": {
                "VendorName": "pymodbus",
                "ProductCode": "PM",
                "VendorUrl": "https://github.com/pymodbus-dev/pymodbus/",
                "ProductName": "pymodbus Server",
                "ModelName": "pymodbus Server",
                "MajorMinorRevision": "3.1.0"
            }
        }

2.クライアント側で device_id を設定する

pymodbus 3.11.4 では、読み取りメソッドに device_idを指定できる。
以下は[read_coils]での設定例となっている。

from pymodbus.client import ModbusTcpClient


client = ModbusTcpClient(
            host="127.0.0.1",
            port=5020)       # Create client object0
client.connect()                               # connect to device

result = client.read_coils(0, count=16, device_id=14)  # get information from device
print(result.bits)  

3. シミュレータ・クライアント を起動する

シミュレータ・クライアントを起動する。
シミュレータとクライアントを起動して、疎通確認を行う方法は別途以下で記載している。
pymodbusでシミュレータを使いModbus通信する | エクヌツITブログ

3. よくあるつまずき

  • device_idが一致していない
  • Simulator が起動していない

4. 応用(必要な場合のみ)

  • 複数の deviceを1つのシミュレータを同時に設定・実行する。
    →OSSがそのようなサポートをしていないが、OSSのコードを書き換えることで対応可能。
    以下のURLで記載している。
    pymodbusでシミュレータを使いModbus通信する | エクヌツITブログ
  • サーバ側で自発的に値を変える。
    (現在記載中)
  • シミュレータサーバをWeb UI(管理画面)で操作する。
    (現在記載中)
  • シミュレータサーバのログ出力を行う。
    (現在記載中)

5.参考

コメント

タイトルとURLをコピーしました