バイトでPLCとの通信を担当した時に得られた知見を共有します
PLCはキーエンスを使いましたが他社製でも変わらないと思います
PLCの通信とは
一方的な通信であれば「PLCのセンサーなどから値を取得してDBに突っ込むだけのロガー」の様な通信などがあります
今回は相互に作用する通信であれば「PCから遮断機に対して命令を送って制御」などがあります
遮断機制御が相互は理由は下降と上昇の命令と完了したかどうかの応答があるからです
回転灯などを制御するPLCでは一方的な通信になります、ONしたら回ってOFFしたら止まるからです
まずPLCとの通信ですがWeb APIの様にイケているフォーマットが無いです
レジスタのアドレスを指定して値をIO出来るだけです
命令と応答
通信として成立させるには命令用のアドレスと結果用のアドレスを配置する必要があります
当たり前のことですが、最初は意識していなかったので応答用のアドレスを定義していませんでした
命令: 遮断機を下降させる用のアドレス
応答: 遮断機が下り切ったことを知らせるアドレス
同じアドレスに相互に書き込むのはダメ
命令と応答パターン以外にも通信はあります
Watchdogの様な通信もPLC用のアドレスとPC用のアドレスは分けましょう
分けないとPCの変更をPLCが上書きしてしまう可能性があります(もちろん逆もあります)
非揮発性設定
PLCのレジスタの状態は揮発性設定と非揮発性で選べます
状態が消えてしまっても問題ない部分は良いですが重要な部分は保存するようにしましょう
停電検出用のアドレスを用意しよう
停電検出用のアドレスを用意して揮発性設定にしておきます
PCとPLCとの通信が始まったら検出用のアドレスに0以外のデータを書き込みます
通信に失敗してリトライ処理をする際は停電チェックをしてから通信を再開する
停電したらTCP Serverが止まるので通信が失敗します、ただ失敗しただけでは停電とは限りません
## 通信のリトライ処理
検出用アドレスが0に戻っていない確認する
通信に失敗したら戻る ↑
通信に成功して電源が切断されていたら色んな処理を辞める(プログラムによって違うと思います)
電源切断されてなかったら、本来やろうとした通信をやる
停電チェックの時に検出用のアドレスが0に戻っていたら停電して状態が消えています
その場合は処理をキャンセルしないと無限ループになる可能性があります
前述のとおり命令と応答の概念を持たせています
応答を待機しても停電して状態が無くなっているので待っても応答は来ません
終わりに
ハードは何も分からない、ITの学生が書きました
停電を想定する仕組みは試行錯誤しないとたどり着かなかったため誰かの役に立てれば嬉しいです
間違っていたらコメントお願いします