PLC (Modbus TCP)~
AoTはModbus TCPでPLC、リレーボード、ゲートウェイ、メーターと通信します。読み取りには Modbus TCP (PLC) 入力を、切り替えには On/Off: Modbus TCP Coil (PLC) 出力を 使います。どちらも標準搭載で、プラグインのインストールは不要です。
Modbusには認証も暗号化もありません
ネットワーク上でその機器に到達できる人は誰でも、すべてのレジスタを読み書きできます。 PLCは必ず隔離されたネットワーク(VLANまたはファイアウォールの許可リスト)に置き、 インターネットに公開しないでください。
始める前に~
ベンダーのドキュメントからレジスタマップを入手してください。扱いたい値ごとに、次の 情報が必要です。
- どのテーブルにあるか — コイル、ディスクリート入力、保持レジスタ、入力レジスタ
- そのアドレス
- 16ビットを超える値の場合は、データ型とワード順序
最初の接続でほぼ誰もがつまずくポイントが2つあります。
- アドレスの基準。 ベンダーのドキュメントは1始まりのアドレスを使っていることが よくあります(
40001が保持レジスタ0を意味し、00001がコイル0を意味する、 など)。AoTは実際に通信で使われる0始まりのアドレスを使います。 - ワード順序。 32ビット値では、上位ワードを先に置くベンダーと下位ワードを先に 置くベンダーがあります。アドレスは合っているのに値がおかしい場合、ほとんどこれが 原因です — Word Orderオプションを切り替えてもう一度読み取ってみてください。
値の読み取り~
Modbus TCP (PLC) タイプの入力を追加し、次を設定します。
| オプション | 補足 |
|---|---|
| Host / Port | 機器のアドレスです。ポート502が標準です |
| Unit ID | 機器を直接指定する場合は通常1、シリアルゲートウェイの先にある場合はそのスレーブアドレスです |
| Timeout / Retries | 機器が遅くない限り1.0秒・1回のままにしてください。タイミングを参照 |
| Period | ポーリングの間隔(秒)です。1〜5秒から始め、PLCの負荷を見ながら調整してください |
読み取りたいレジスタの数だけ測定値の数を設定し、各チャンネルを次のように設定します。
| チャンネルのオプション | 補足 |
|---|---|
| Register Type | CoilとDiscrete Inputはビット、HoldingとInput Registerは16ビットのワードです |
| Register Address | そのテーブル内での0始まりのアドレスです |
| Data Type | コイルとディスクリート入力は Bit、レジスタは int16/uint16/int32/uint32/float32 です |
| Word Order | 32ビット型のみ対象です。値がおかしく見える場合は反対を試してください |
| Scale Factor | 生の値に掛け合わされます。10分の1単位で報告する機器には 0.1 を使います |
ビットは 1.0 と 0.0 として保存されるため、他の測定値と同じようにグラフ化したり 機能で利用したりできます。
読み取りに失敗すると、AoTはそのチャンネルに何も保存しません — 仮の値を入れることは ありません。その「何も無い」ことこそが機器のオフラインを示す印であり、埋め合わせの値を 入れてしまうとその停止を隠してしまいます。あるチャンネルの失敗が他のチャンネルの 読み取りを止めることはありません。
コイルの切り替え~
On/Off: Modbus TCP Coil (PLC) タイプの出力を追加します。Host、Port、Unit ID、 Timeout、Retriesの意味は入力と同じです。Number of Channels に制御したいコイルの 数を設定して保存すると、コイルごとに1行が現れ、それぞれに必要なのは Coil Address だけです。
AoTはコマンドを送るたびにコイルへ書き込み、直後に読み戻します。この読み戻しが 確認そのものです。
- 読み戻した値がコマンドと一致すれば、チャンネルの状態は推測ではなく機器から 確認された値になります。
- 一致しなければ、そのコマンドは失敗として報告されます。多くの場合、PLC側の プログラムがそのコイルを自ら制御しているか、アドレスが間違っています。
- 機器に到達できない場合はコマンドが失敗し、チャンネルは直前の状態を保ちます — PLCが一度も受け入れていない状態が表示されることはありません。
読み戻しはレジスタを確認するもので、リレーを確認するものではありません
コイルを読み戻すことは、PLCがその値を受け入れたことの証明にはなりますが、 リレーが実際に動いたことや配線が正しいことの証明にはなりません。そこまで 確認したい場合は、フィードバック接点を配線して別の入力として読み取り、 比較してください。
Startup State と Shutdown State は他の出力と同じように動作します。PLCでは Startup Stateを「何もしない」のままにしておくのが通常は適切です — そうすると AoTはコイルを読み取り、上書きするのではなくPLCがすでに持っている状態をそのまま 採用します。
デーモンが起動した直後は、AoTがバックグラウンドで実際の状態を読み取っている間、 チャンネルが一時的に不明として表示されます。これは意図的な動作で、まだ読み取って いないコイルをオフだと決めつけないようにするためです。
接続の共有~
同じホストとポートを指す入力と出力は、自動的に1本のTCP接続を共有し、その上の リクエストは順番に処理されます。これを行うために設定する必要は何もなく、これが 理由となって、1台のPLCが多数の入力・出力の背後にあっても、ほとんどの機器が課している 同時接続数の上限を使い切らずに済みます。
知っておくべき点が1つあります。タイムアウトとリトライは機器の登録ごとではなく 接続ごとに決まります。同じホストとポートを共有するものの中で最初に有効化された 入力または出力の設定が、それを共有する全体に適用されます。
通信状態~
応答しなくなったPLCは、特別な設定なしに検出されます。
- 出力は、リンクが切れると同時に、そのPLC上のすべてのチャンネルを異常として 表示します。コマンドを送っていないときでも同様です。ただし1回のフレーム落ちだけ では不十分で、連続2回失敗して初めてリンク切れと判定されます。
- 入力は測定値の新しさで判定されます。ポーリング周期が何回か過ぎても新しい 測定値が来ない場合、その入力は通信不能とみなされます。
デーモンは、機器が通信障害の状態に入った、またはそこから復帰したときにも 管理者宛のメールを送信します。アラートを参照してください。
タイミング~
1回のリクエストにかかる時間は最大で timeout × (retries + 1)、接続にかかる時間は 最大で timeout です。デフォルト値(1.0秒、リトライ1回)では、PLCに到達できない コマンドは約3秒であきらめます。
リトライ回数を増やすと、応答のない機器がブロックする時間もその分だけ長くなります。 制御コマンドは同期的に実行されるため、リトライをもう1回稼ぐことよりも、この積が デーモンのコマンド処理の予算に十分収まるようにすることの方が重要です — 本当に 遅い機器であれば、リトライ回数ではなくタイムアウトの方を長くしてください。
トラブルシューティング~
| 症状 | 考えられる原因 |
|---|---|
| 値が大きく間違っているが安定している | ワード順序、またはそのレジスタに合わないデータ型 |
| 値が10倍・100倍ずれている | Scale Factorが設定されていない |
| 読み取りはできるが書き込みで不一致が報告される | PLC側のプログラムがそのコイルを制御している、またはコイルアドレスが間違っている |
| すべてタイムアウトし、まったく接続できない | ホスト/ポートが間違っている、またはファイアウォールが接続を落としている |
| 接続はできるがすべてのリクエストが失敗する | Unit IDが間違っている |
| アドレスがすべて1つずつずれている | ベンダーのドキュメントが1始まりである — 1を引いてください |
入力または出力のデバッグログを有効にすると、各リクエストとその結果をログで確認できます。