Pilz PSS4000 紹介の第5話です。前回はSafety Pilz PSS4000のFunction Blcok FS_EmergencyStopを使用した、簡単なESTOP安全アプリケーションの組み方を紹介しました。ですが、そのESTOPの状態を自分のPOUS以外、つまり他のPOUs間にもシェアしたい場合はどうすればよいでしょうか。Pilz PSS4000ではResource global variablesの機能があり、CodesysやTwinCATのGVLと似てる機能ですが、少し特徴があります。今回の記事ではResource global variables・VAR_TEMP・Instruction listについて紹介します。
よろしくお願いします。
Thanks!
この記事で使用するRevPI ConnectはPILZ JAPANが貸してくださった機材です。
PILZ
PILZは安全およびオートメーション技術のソリューションでトータルソリューションサプライヤとしてのFA現場を支え、人の安全だけではなく、機械、および環境の安全を保証し、機械や設備をいかに安全に稼働させます。ピルツは全世界に42の現地法人や支社を設置し、包装、自動車産業、ロボットアプリケーション、さらに風力発電、鉄道技術など様々な分野で活躍しています。
Office:
ピルツジャパン株式会社
〒222-0033
横浜市港北区新横浜3-17-5
いちご新横浜ビル 4階
HP
Reterence Link
Resource global Variables
Resource global variablesはPOUs間でシェア・よみかきできるGlobal変数です。POUs内使用したい場合は、各POUSにVAR_EXTERNAL内でResource global variablesと同じ変数を定義する必要があります。
ですが、IEC61131 programmingでもGlobal変数はできるだけ使わないようにすると言いましたが、特にPI 変数(いわゆるモジュールなどにMappingされるもの)はResource global variablesに定義すると、プログラムが変更すると面倒になります。
VAR_GLOBALでは以下のAttributeを定義できます。
- CONSTANT
- RETAIN PERSISTENT
- PERSISTENT RETAIN
VAR_EXTERNAL
Resource global variablesのVAR_GLOBALエリアに変数が宣言されたら、POU内にVAR_EXTERNALエリアに同じ変数を定義すればResource global variablesの変数を使用できます。
注意するのはVAR_EXTERNALとVAR_GLOBALに定義した変数は必ず変数名・データ・タイプも100%一致する(配列の長さも含めて))必要があります。
VAR_TEMP
VAR_TEMPエリア内に定義された変数はPOU・FB・FCなどに呼びされるたびに初期値に戻ります。VAR_TEMP内の変数はプログラムで使用する前に初期値を与えてあげましょう。
Instruction list?
今回の記事ではInstruction listを使用しました。Instruction listも一応IEC61131 に含まれているテキストベースのプログラム言語で、イメージ的にはアセンブリ言語に似ています。
Define Resource Global Variables
Resource global variablesを定義するため、ツールからResource global variablesをクリックします。
IDEが起動しました。
このようにいくつの変数を定義します。
Edit in POU2
前回の緊急停止を制御するFS_EmergencyStop Function BlockがあるPOU_2を開きます。
VAR_EXTERNALにResource global variablesと同じ変数を定義します。
次はFS_EmergencyStop Function Blockの出力状態をそのままVAR_EXTERNALの変数に転送します。つまり、別のプログラムにもDevice_0_ESTOP_Enable…などの変数を使用できるようになります!
New POU
IEC61131 programming>New>POUで新しいプログラムを作成します。
プログラム名を入力し、Programming LanguageをIL(Instruction List)で、TypeはProgramします。
Instruction list Editorが表示されました。
Define External
プログラムの宣言エリアにVAR_EXTERNALでResource Global Variablesと同じ変数名の変数を定義します。
実際のコンセプトは下図のようです。Resource Global Variablesからいくつの変数を定義し、そしてPOU_2(FS_EmergencyStop)にVAR_EXTERNALエリアからResource Global Variablesを同じ名前の変数を定義しました。なのでPOU_3で更新した、VAR_EXTERNAL内の変数群はResource Global Variablesとして更新します。
最後にPOU_2はまたVAR_EXTERNALエリアからResource Global Variablesを同じ名前の変数を定義し、Resource Global Variablesも現在値を読み取ります。
VAR_EXTERNALエリアでResource Global Variablesに定義されていない変数を入れたらエラーになります。
エラーメッセージでもResource Global Variables内に該当する変数が定義されていないとエラーになります。
Define VAR
次はVARエリアで必要な変数を定義します。
Define VAR_TEMP
VARとVAR_TEMPの違いを比べるためにVAR_TEMPにTempCounter変数を作成します。
Program
こちらはプログラムです。ILはいまあまり使わていないが、慣れたら結構便利です。
こちらのプログラムは単純なAND回路だけです。例えばDevice_0_ESTOP_Enableの現在値をそのままESTOP_Enableに転送する。
こちらは少々複雑に見えますが、実際はDevice_0_Reset_Button_LAMP_OUTPUTがTrueなら、LABEL_LAMPOUT Labelの場所までJUMPし、RESET_Button_LAMP_OUTPUT変数をTrueにセットしNEXT1 Label位置にJumpします。
Device_0_Reset_Button_LAMP_OUTPUTがFalseであれば、RESET_Button_LAMP_OUTPUT変数をFalseにリセットしNEXT1 Label位置にJumpします。
こちらのプログラムはVARCounterとTempCounterをINT#1をPlusし加算します。
Trips1 Auto Refill
プラスアルファですが、Ctrl+Spaceで自動補完できます。
Trips2 Show Line Numbers
IDEを右クリックしShow Line NumbersでLine数を表示できます。
このような操作です。
Resource Assignment
次はCPUにPOU_3が実行されるようにResourceを調整します。
Hardware Configuration>Your Device>ST Resourceをクリックします。
POU_3は安全プログラムでもないのでそのままST Resourceに追加してもよいではないかなと思ってたら…
エラーが出ました。つまり、Resource global variablesでFSのプログラムにも使用していますので、STも同じくFS resourceに呼び出す必要があります。
POU_3をFS_Resourceに追加します。
Done!
Build
Build>Build AllでProjectコンパイルしましょう。
Download
Target>Direct Project DownloaでプロジェクトをCPUにDownloadします。
Start Downloadで始まります。
I accept a change to the FS device projectsのCheckbox入れ、Confirmします。
しばらく待ちます…
Done!
Result
Dymaic program Displayで結果を確認しましょう。
問題なさそうですね。
最初にも書いた通り、VARCounterはPOU内で演算結果が記憶されるので、VARCounterの与えはずっと加算されます。逆にVAR_TEMPにあるTempCounterは不明値になっています。