Modbus TCP
Modbus は最も歴史が長く、最も広く使われている産業通信プロトコルです。ほぼすべての計測器 / インバータ / 一般産業機器が Modbus に対応しています。
このゲートウェイは Modbus TCP (イーサネット) と Modbus UDP に対応しています。シリアル (RS-485) のみの機器は、Modbus ゲートウェイ (RS-485 → イーサネット) を経由する必要があります。
登録フォームの入力値
| 入力欄 | 何を入力するか | 例 |
|---|---|---|
| IP アドレス | Modbus スレーブの IP | 192.168.0.50 |
| ポート | Modbus ポート | 502 (標準) |
| 応答タイムアウト (request-timeout) | スレーブの応答を待つ最大時間 (ms) | 5000 (5秒) |
Modbus には ユーザー / パスワードの概念がありません。IP が到達できれば誰でも値を読み取れます。
タグの PLC アドレス表記
Modbus はメモリ領域ごとに次の 4 種類があります。
| 領域 | 表記の先頭 | 意味 |
|---|---|---|
| Holding Register | holding-register:N | 16-bit、読み書き可 — 最も一般的 |
| Input Register | input-register:N | 16-bit、読み取り専用 |
| Coil | coil:N | 1 ビット、読み書き可 |
| Discrete Input | discrete-input:N | 1 ビット、読み取り専用 |
N はスレーブのマニュアルに記載されたアドレス番号です (通常は 1 から始まります)。
データ型まで明示した表記
同じメモリ領域でも 16-bit / 32-bit / 実数 / 文字列などで解釈が異なる場合があるため、データ型を併記できます。
| 表記 | 意味 |
|---|---|
holding-register:1 | 単純な 16-bit 整数 (signed) |
holding-register:1:UINT | 16-bit 符号なし整数 |
holding-register:1:DINT | 32-bit 整数 (メモリ 2 ワード分を使用) |
holding-register:1:REAL | 32-bit 実数 (メモリ 2 ワード分を使用) |
holding-register:1:LREAL | 64-bit 実数 (メモリ 4 ワード分を使用) |
holding-register:100:STRING[10] | 100~109 の ASCII 文字列 |
coil:1 | コイル 1 番 (1 ビット) |
データ型を明示しない場合は 16-bit 整数として解釈されます。32-bit 以上の値の場合は必ず明示してください。
データ形式 / 形式補助
タグ登録 の [データ形式] と [形式補助] の欄は、次のように対応させると分かりやすいです。
| PLC の値 | データ形式 | 形式補助 | PLC アドレス例 |
|---|---|---|---|
| コイル / ビット入力 | Boolean | (空欄) | coil:1 または discrete-input:1 |
| 16-bit 整数 | Integer | (空欄) | holding-register:1 |
| 16-bit 符号なし整数 | Integer | UI | holding-register:1:UINT |
| 32-bit 整数 | Integer | DW | holding-register:1:DINT |
| 32-bit 実数 (最も一般的) | Float | REAL | holding-register:1:REAL |
| 64-bit 実数 | Double | LREAL | holding-register:1:LREAL |
| 文字列 N 文字 | String | STR[N] | holding-register:10:STRING[N] |
よくある問題と解決方法
| 症状 / メッセージ | 考えられる原因 | 解決方法 |
|---|---|---|
| 「Read timeout」/ 応答が遅い | スレーブの応答遅延、ケーブル / ファイアウォール / ポート(502) の遮断 | ping、telnet <ip> 502 で到達性を確認。応答タイムアウトを延ばして再試行 |
| アドレス表記の誤り (Invalid address) | 書式の入力ミス | holding-register:1 のようにコロンを正確に記述 |
値が常に 0 しか出ない | 領域種別の mismatch (holding なのに input で読んでいる等) | スレーブのマニュアルで「FC 03 / 04 / 01 / 02」のどれかを確認 |
| 32-bit 実数が化けて出る | スレーブの byte / word 順序が異なる | スレーブが little-endian の場合はデータ型を :UDINT_LSWORD_FIRST などに変更 |
byte 順序の問題はスレーブのメーカーごとに異なるため、マニュアルを確認するか、他のツール (Modbus Poll など) で比較検証するのが最も早い方法です。
シミュレータで試す
PLC がなくても Modbus シミュレータで動作検証ができます。
- [接続追加] 時のカード一覧から シミュレータ → Modbus シミュレータ を選択すると、ゲートウェイが自動的にシミュレータプロセスを起動して接続します。
- 外部ツールを別途用意せずに、そのまま holding register にダミー値が入ってきます。
さらに詳しい例 / 自動登録
高度 — REST API の Modbus 例を参照してください。