OpenAI Codex でPLCの通信ライブラリを作ってみた。
ここ最近はCodexでいくつかソフトを作っていて、その中でPLC通信のライブラリも作成した。
ライブラリ一覧
MELSEC MC Protocol(Serial)
MELSEC SLMP(Seamless Message Protocol)(Ethernet)
- https://github.com/fa-yoshinobu/plc-comm-slmp-python
- https://github.com/fa-yoshinobu/plc-comm-slmp-dotnet
- https://github.com/fa-yoshinobu/plc-comm-slmp-cpp-minimal
- https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-slmp
- https://github.com/fa-yoshinobu/plc-comm-slmp-rust
TOYOPUC Computer-Link(Ethernet)
- https://github.com/fa-yoshinobu/plc-comm-computerlink-python
- https://github.com/fa-yoshinobu/plc-comm-computerlink-dotnet
Keyence Host Link Protocol(Ethernet)
- https://github.com/fa-yoshinobu/plc-comm-hostlink-python
- https://github.com/fa-yoshinobu/plc-comm-hostlink-dotnet
- https://github.com/fa-yoshinobu/node-red-contrib-plc-comm-kvhostlink
- https://github.com/fa-yoshinobu/plc-comm-hostlink-rust
なぜライブラリを作るのか
SLMPのライブラリはGitHubにいくつかあるが、対応デバイスが限定的なものが多い。
- あまり使われないデバイスは未対応
- iQ-Rで追加された仕様が未対応
- バッファメモリ未対応
といったケースが多い。
そのため、バッファメモリまで含めて扱えるものはオープンソースではほぼ無いと思う。
今回のライブラリは以下を前提にしている。
- 可能な限り多くのデバイスに対応
- バッファメモリ対応
- 他局指定対応
作り方と苦労
最初はマニュアルを読ませてPythonベースで作成・動作検証する。
その後他の言語へ水平展開して作成する。
理由は、
- 実験しやすい
- 修正が速い
ため。
マニュアル通りに実装しても動かないことがあるので、まずは試行しやすい環境で作る。
DやMなどの基本デバイスはここで一通り動く。
問題はその先。
対応デバイスを増やしていくと、通信エラーが増えていく。
主な要因は以下。
- デバイス指定が特殊(例:Un\Gn)
- ブロック単位でしか読めないデバイス(ロングタイマなど)
- 機種ごとのコマンド対応差
- そもそもマニュアルの意味が分からない
他局指定
他局指定も素直ではない。
- iQ-Rでは動く
- それ以外では不安定、または動かない場合がある
マニュアルを読んでも、
- どの構成で使えるか
- どの条件で使えないか
が分かりにくい。
マニュアル通りに実装しても動かないとき
マニュアル通りに実装しても、どうしても読み書きできないデバイスが出てくることがある。
まず思いつくのは、
GX Works3 で実際に読み書きする、その通信を Wireshark でキャプチャして解析するといった方法。
問題点
この方法はそのままでは使えない。
三菱の純正ツールはSLMPではなく、非公開のMELSOFT接続で通信しているため。
そのためキャプチャしても、
SLMPのパケットではなく参考にならないという結果になる。
対処方法
ドライバにSLMPを指定
対象デバイスを読み書きさせる
通信をWiresharkでキャプチャする
これでSLMPとしての実通信を確認できる。
マニュアルの記述だけでは分からない部分は、この方法で潰していくしかない。
動作確認
動作確認もそれなりに手間がかかる。
MELSECのEthernetだけでも対象が複数ある。
MELSEC-Q: QJ71E71-100, QnUDE, QnUDV
MELSEC-L: L02CPU~L26CPU, LJ71E71-100
MELSEC iQ-R: RnCPU, RJ71EN71
MELSEC iQ-F: FX5S, FX5UJ, FX5U, FX5UC
KEYENCE KVシリーズ, KV-XLE02(SLMP対応)
- ユニットごとに挙動が違う
- パラメータ設定も微妙に違う
- マニュアルに対応関係がまとまっていない
検証環境について
ユニットによって挙動が違うため、機材を多く持っているほど検証範囲は広がる。
- マルチCPU構成
- CC-Link IEコントローラネットワーク経由の他局指定
特にマルチCPU構成や他局指定を検証する場合は、それなりの構成を組める環境が必要になる。


増えすぎたライブラリ
ライブラリが増えすぎたのでSLMPについては送受信内容がライブラリ間で同じかをチェックする謎プログラムを作り品質を担保しようとする作戦をやってます。なのでそれなりにイケてるはず。
スマホアプリへ
デバッグ用のIOモニタアプリも製作中です。これのためにRustのライブラリも作った

最後に
いろいろな条件で動作確認しながら作成したライブラリ。
マニュアルもAIに生成させているため、部分的に分かりやすかったり分かりにくかったりする。
もしよければ使ってみてください。

