Modbus TCPでLinuxから機器に対して接続確認する時の確認手順

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通信が確認できます。

f:id:yomon8:20210615223710p:plain