これまでWebシステムや業務アプリケーションの開発を中心に仕事をしてきましたが、
最近「AI時代において価値のあるエンジニアとは何か」を考えるようになり、
SCADAというキーワードを知り、触ってみたいと思い立ったときに立ちはだかった、
PLCというキーワード。。。
これを理解するために、シミュレーターを作って理解してみたことの整理・アウトプットのリンク集です。
このシミュレータを使って複数PLCでの環境実行をした記事のまとめはこちらです。
なぜ、シミュレータを作ったのか?
PLC(プログラマブルロジックコントローラ)やSCADA(監視制御システム)の世界は、実機が高価であったり、独自の作法があったりと、ソフトウェアエンジニアにとっては少し敷居が高い分野です。
「実機がないなら、Pythonで作ればいいじゃないか」
そんな思いつきから始まりました。
このアウトプットでは、PLCのメモリモデルの実装から、独自のラダー言語パーサー、Modbus通信、さらには現場の通信遅延を再現する仕組みなど、
想像・妄想範囲で思いついたあったほうが楽しいかも!という 「産業用制御システムのミニチュア」 をフルスクラッチで構築しました。
本記事は、その全ステップを俯瞰するためのインデックス(目次)です。
システム構成図
今回の開発で実装した機能の全体像です。
コード類はこちらに公開しています。
遊んでみたい方がいらっしゃれば使ってみてください。
各記事の紹介
SCADA開発学習のために、PLCシミュレータへ「freeze障害」を入れた理由
- PLCがフリーズする状況を再現した話です。
- この記事まででいったん、PLCシミュレータの作成はFixさせてSCADA学習を本格化させます。
【激ハマり&大反省】PLCシミュレータ自作:Modbus標準アドレス対応と「入力注入(SIM_INJECT)」機能の対応
- 作ったシミュレータを本格的に使ったときに発生した modbus仕様理解の甘さが招いた仕様バグと対峙した話です。
1. WebエンジニアがSCADAに興味を持ち、PLCを理解するために自作シミュレータを作った話
- なんでシミュレータを作ろうと思ったかの初めの記事です。
2.Pythonで自作したPLCシミュレータを「Docker風」にオーケストレーションしてみた 〜カオスエンジニアリングを添えて〜
- 複数のシミュレーターを個別に実行することに疲れたときに作ってみた機能の話です。
3.WebエンジニアのためのPLC入門:自作エミュレータの実装でわかった「通信」と「スキャン」の正体
知識ゼロベースのWebエンジニアがPLCシミュレートして理解したことの話です。
4. 全体の司令塔:Orchestrator編
- 複数のPLCやシミュレータをYAML定義から一括起動する「オーケストレータ」の実装の話です。
5. Larkパーサーで作る「俺々ラダー言語」の実装編
- Larkライブラリを使い、テキスト形式のラダー図を抽象構文木(AST)へ変換するパーサーの自作の話です。
6. Modbusメモリマッピングと意図的な「遅延」を生むカオス・コンテキスト編
- Pymodbusを使った通信の実装と、ラッパーによる「意図的な通信遅延(カオス注入)」の仕組みの話です。
7.現場を模倣する:デバイスシミュレータ編
- センサーのON/OFFパターン再現と、ハートビート監視による安全な停止制御の実装の話です。
最後に:この開発を通じて得られたもの
「PLCとは何か?」というゼロベースの問いから始まり、自作を通じて 「産業用制御は、いかに泥臭い時間の制御とメモリの奪い合いで成り立っているか」 を肌で感じることができました。
次にやりたいこと
今後はこのシミュレータをバックエンドに、htmxでのリアルタイム監視画面の作成や、時系列データとしてのロギング基盤構築にも挑戦してみたいです。
また、pythonのmodbusライブラリを活用してplcから受信するデータをイベント化して、扱いやすくする機能にも挑戦してみたいです。