Raspberry Pi等のLinuxマシンのIoT GatewayからModbus TCP通信を行うことが多いのですが、繋がらない場合に確認しているポイントを書きます。
ネットワークの基本的な手順なのですが、機器の仕様書読んで、実機繋いで、そこからの手順は大体いつも同じなので誰かの役に立てばと思います。
ネットワーク接続確認
まずは指定されたIPにPingします。
ping -c1 192.168.1.10
繋がっている機器のどれが対象の機器かわからない場合などはarpでHWベンダー調べたりします。
$ arp Address HWtype HWaddress Flags Mask Iface 192.168.1.10 ether xx:xx:xx:xx:xx:xx C eth0
ポート接続確認
netcatでPortに接続できることを確認します。
$ nc -zvt 192.168.1.10 502 Connection to 192.168.1.10 502 port [tcp/*] succeeded!
Modbus接続確認
pymodbusのREPLが便利です。
pymodbus/pymodbus/repl at master · riptideio/pymodbus · GitHub
動作イメージは以下をみていただくとわかると思います。
asciinema.org (リポジトリからリンク引用しています)
以下のような感じで使います。特に個人的経験では unit=x
のパラメータが機器のマニュアルから読み取れずに詰まることが良くあったり、 count=xxx
何件まで取れるかとか調査することがあるので、そういった場合に特にこのツールは便利です。
$ pymodbus.console tcp --host 192.168.1.10 --port 502 > client.read_holding_registers address=1 count=2 unit=1 { "registers": [ 26, 6 ] }
エラーが出たときはtcpdumpとwiresahrkが便利
エラー解決にはtcpdumpも使えます。以下のようなコマンドで取得すると、
tcpdump -i eth0 -s0 -X host 192.168.x.x and port 502 -w /tmp/tcpdump_modbus.out
wiresharkからModbus通信が確認できます。