0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SCADA学習】Modbus Poller 設計メモ

Posted at

はじめに

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 管理として随時更新予定です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?