はじめに
PLC シミュレータ(Modbus TCP 対応)を自作し、
それに接続する SCADA 学習用の Poller(データ収集ループ) を実装しています。
本記事は
「Poller を SCADA っぽく作るには何が必要か」 を整理した技術メモです。
現在の Poller 構成
全体構成
PLC(Modbus)
↓
poller(←現在集中開発中)
↓
DB(items / history / event_logs)
↓
UI
Poller は 監視ロジックの中核として位置付けています。
現在実装できている機能
現時点での Poller の機能は以下です。
- asyncio による複数 PLC の並列ポーリング
- Modbus TCP 接続管理
- アイテム(タグ)単位の値取得
- 値変化時のみ履歴(history)を保存
- 閾値超過/復旧によるイベント生成
- DB 書き込みの bulk 化による負荷軽減
# ポーリングの流れ(簡略)
while running:
connect to PLC
read modbus values
evaluate alarm condition
write history & current value
sleep(interval)
Poller を SCADA 観点で見ると何が足りないか
ここからが本題です。
実務 SCADA の視点で見ると、Poller にはまだ多くの設計要素が不足しています。
ネット情報を読み漁った結果見えてきた不足機能について
以下、論点ごとに整理します。
① ポーリング制御(最重要)
アイテムごとの取得周期(interval)
現状は 1 秒固定ですが、実 SCADA では:
| 種別 | 取得周期例 |
|---|---|
| 電流・圧力 | 1 秒 |
| 温度 | 5 秒 |
| 状態フラグ | 10 秒 |
のように タグごとに周期が異なります。
さらに、
- アラート発生中は取得周期を短縮
- 通常時は負荷軽減のため間引く
といった制御も必要になります。
TODO
- アイテム定義に interval を持たせる
- 動的な interval 変更対応
② Modbus 通信の実務対応
レジスタ種別対応
現状は Holding Register のみ。
実務では以下を使い分けます。
- Holding Register
- Input Register
- Coil
- Discrete Input
TODO
- アイテム定義に register_type を追加
- Poller 側で read 関数を切り替える
ビット展開(超重要)
16bit レジスタを以下のように扱うケースが多いです。
- D100.0 : 運転中
- D100.1 : 異常
- D100.2 : 手動モード
数値監視ではなく状態監視になるため、
Poller 側でのビット展開が必須です。
TODO
- bit_index 定義
- bool アイテムとして評価
「数値」ではなく「状態」を監視する感覚を身に着ける
③ データの意味づけ
スケーリング・単位変換
PLC の生値:
253
SCADA 表示値:
25.3 ℃
この変換は UI ではなく Poller 側で行うのが基本です。
TODO
- scale / offset / unit 定義
- Poller で正規化値を生成
デッドバンド(Deadband)
微小な変動をすべて履歴保存すると、
履歴テーブルがすぐに肥大化します。
TODO
- deadband 設定
- 一定変化量以上のみ履歴保存
④ 障害・不安定さの再現
通信障害の段階化
- 一時的なタイムアウト
- 接続不可
- PLC 停止
これらをすべて「None」で済ませるのは NG。
SCADA の価値は「異常をどう扱うか」にある
TODO
- 通信エラー種別の定義
- 通信状態アイテムの追加
欠損データの扱い
選択肢は複数あります。
- 欠損を NULL として保存
- 前回値を保持
- 欠損率を算出
「値がない」こと自体が重要な情報
TODO
- 欠損時の振る舞いをポリシー化
⑤ イベント・アラートの進化
アラート条件の多様化
現状は単純な閾値判定。
実務では以下が必要です。
- 上限/下限
- 上昇率
- 継続時間(○秒超過)
TODO
- 条件タイプの拡張
- 判定ロジックの分離
ACK・メンテナンスモード
- ACK による通知抑止
- メンテ中はアラート停止
TODO
- アラート状態管理
- メンテナンスフラグ追加
⑥ パフォーマンス可視化
ポーリング性能ログ
Poller 自体の性能も監視対象です。
- 通信時間
- DB 書き込み時間
- 実取得周期
TODO
- Poller 内部メトリクスのログ化
明日以降の自分用ロードマップ
Phase 1(最優先)
- アイテム別 interval
- レジスタ種別対応
- スケーリング
Phase 2(理解が深まる)
- ビット展開
- デッドバンド
- アラート条件拡張
Phase 3(実務レベル)
- 通信障害分類
- ACK/メンテモード
- 欠損データ戦略
まとめ
Poller は単なる「値取得ループ」ではなく、
- 何を
- どの頻度で
- どう解釈し
- どう異常と判断するか
を決める 監視ロジックそのものです。
SCADA 学習において、
Poller を作り込むことは設計思考の良い訓練になると感じています。
本記事は、今後の実装のための 設計メモ兼 TODO 管理として随時更新予定です。