Codesysで再利用可能なFBを作る
[注意]Codesys初心者で勉強用の記録なので正しい作法かは不明です。もっと良い方法あるよ!等アドバイスいただければ嬉しいです。
やりたいこと/やったこと
1つのFunctionBlock(以降FB)を同一の機構に対して使い回せる形で作成しました。
現実環境が用意できないのでFactory IOのコンベアを使ってテストを行い、下記の赤枠で囲った別々のコンベアを1つのFBでRUN/STOPする方法を解説します。
- 使用環境
- PLC:WAGO CC100(Codesys SP19)
- デバッグ機器:Factory IO(OPC UA通信)
結論サマリ
FBの変数部分に参照渡しを行うVAR_IN_OUTを追加する
公式マニュアル:https://content.helpme-codesys.com/ja/CODESYS Development System/_cds_vartypes_var_in_out.html
上図はbRefTest0, 1をaaaに参照渡しして、aaaがOFFすることでbRefTest0, 1がOFFするサンプルです。FB作成時デフォルトだとVAR_IN_OUTは作られないため自分で追加する必要があります。変数aaaは別々のインスタンス内で使用される変数であり、互いに影響することはありません。
解説
FactoryIOのコンベアはRUN/STOPしか無いので本来FBを作る必要はありませんが、速度等のパラメータを持つアクチュエータの練習のためにコンベアを題材にPLCOpenのサーボFBに近い形を目指してFBを作成しました。
構造体(DUT), PRGでの呼び出し方, FBがポイントです。
DUT
構造体のRUNをFactory IOのコンベアに割り当てます。もし他のパラメータを追加する場合はこの構造体に変数を追加する形になると思います。
PRG
PRG部ではWAGO CC100のInputのスイッチでコンベアをRUN/STOPしており、今回の実装はコンベアの変数に対して参照渡しを行うFBのインスタンスを生成していると言えます。
FB
FBはLDで作成しており内部ではステップラダーを組んでいます。ちなみに今回のようなFBをLDで作った例を見つけられなかったので、このあたりはSTを使うのが主流なのかもしれません。サマリで示したように参照渡しをされた変数に対してSET/RESETし、コンベアをRUN/STOPさせています。タイマ処理は現実だとここに動作確認用の信号が入るケースが多いのでセンサのかわりに入れています。
感想
IEC61131-3非対応の従前型のPLCだとアクチュエータ数だけ同じ処理をコピペしてデバイスを打ち替えるような作業が必要あり、今回のように1つのFBで済む方法は制御の製作時はもちろん修正時にも非常に強力です。IEC61131-3対応の機器だとこのようにPLCプログラミングにオブジェクト指向的な概念を持ち込むことができるので、個人的に今後の選定機会では対応したPLCを選択していきたいですね。
参考
Codesys 公式ドキュメント:
オブジェクト指向FB関係: ->もっと機能を抽象化して継承を活用できると活用の幅が広がる感触があります。
Discussion