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(管理画面)で操作する。
(現在記載中) - シミュレータサーバのログ出力を行う。
(現在記載中)

コメント