今回の記事ではExST(Extended Structured Text)の文法について説明します。
TwinCAT3のST エディタは、IEC-61131-3 プログラミング言語 “Structured Text (ST) “または “Extended Structured Text “で POU をプログラミングするために使用します。そのExtended Structured Textは、標準の IEC 61131-3 言語から特定の追加機能を提供する、TwinCAT独自の仕様でもあります。
さ、はじめよう!
Reference Video
Implementation
Assignment S=
こちらのOperatorを使用し変数をSetすることができ、例えS=をTriggerする変数がTrue>Falseに変わっても、Trueでセットされたことがわからないままになります。
ラダー言語のSET命令に近い機能を持っています。
Example
こちらのExampleではb2がTrueになると変数b1をTrueにSetします。
VAR b1,b2,b3,b4:BOOL; END_VAR b1 S=b2; |
Result
b2がTrueになると、b1も同時にTrueになります。
そしてb2がFalseに戻ってもb1がTrueのままKeepします。
ExST assignment R=
こちらのOperatorを使用し変数をResetすることができ、例えR=をTriggerする変数がTrue>Falseに変わっても、Falseでセットされたことがわからないままになります。
ラダー言語のReset命令に近い機能を持っています。
Example
こちらのExampleではb3がTrueになると変数b1をFalseにResetします。
VAR b1,b2,b3,b4:BOOL; END_VAR b1 R=b3; |
Result
b3がTrueになると、b1も同時にFalseになります。
そしてb2がFalseに戻ってもb1がFalseのままKeepします。
S=,R=?
実際S=とR=が同時に実行する場合、SetとResetがどっち優先になるでしょうか。それはS=が先に実行されるか、それともR=が先に実行されるかによります。当たり前の話ですが、最後に実行された命令は変数の最後の状態になります。
Example S= First
例えば、こちらはS=を実行してからR=を実行する場合です。
b1 S=b2; b1 R=b3; |
Result
当然b1の最終結果はFalseになります。
Example R= First
こちらはR=を実行してからS=を実行する場合です。
b1 R=b3; b1 S=b2; |
Result
当然b1の最終結果はTrueになります。
Multiple Assignment as expression‐1
こちらはSiemensのST言語にもある仕様で、複数の変数を同時に現在値を同じ数字に変更する文法です。
Example
こちらのExmapleではv4の現在値+5、そして一行でv1・v2・v3にその計算結果を渡します。
VAR b1,b2,b3,b4:BOOL; v1,v2,v3,v4,v5:INT; END_VAR v4:=100; v1:=v2:=v3:=v4+5; |
Result
Done!v1 v2 v3の現在値はv4の現在値を+5になりました。
Multiple Assignment as expression2
実は異なるデータ・タイプの変数も先程の文法で一括に現在値を同じ数字に変更できます。
Example
先程のExampleと同じですが、一括変更されたのは実数データ・タイプの変数です。
VAR b1,b2,b3,b4:BOOL; v1,v2,v3,v4,v5:INT; r1,r2,r3,r4,r5:LREAL; END_VAR r1:=r2:=r3:=r4:=v1; |
Result
Done!同じ結果が得られます。
Condition Statement
ST言語ではIF文で条件判断することがよくあります。実はTwinCATでは複数の条件をまとめて判断しBool変数にTrueやFalseに渡すことができます。
Example
下記のExampleではもしv5=100であれば、b4がTrueになり、b5がTrueになります。逆にv5が100でなければb5がFalseになります。
VAR b1,b2,b3,b4,b5:BOOL; v1,v2,v3,v4,v5:INT; r1,r2,r3,r4,r5:LREAL; END_VAR IF b4:=(v5=100) THEN b5:=TRUE; ELSE b5:=FALSE; END_IF |
Result
Done!v5が100ではない場合、b5がFalseになります。
そしてv5が100であれば、v5がTrueになります。
REF=
最後は紹介するのREF=です。簡単にいいますと、REF=を使用することによって変数のPointerを取得し該当する変数に間接アクセスするような感じです。
国産PLCでは三菱のD0Z0のように異なる変数をアクセスするような形で、違うのはREF=は取得する変数の必ず同じデータ・タイプであることです。その制限によって、無効なPointerアクセスのせいでRuntimeがエラーになることを避けられます。
Example
こちらのExampleではrDUT2 というREF変数を定義し、PointerをmyDut2にします。
そしてプログラム内ではrDUT2の各変数にアクセスし、現在値を変更します。
注意するのはプログラムの中に直接myDut2にアクセスしていないことです。
TYPE DUT_Test : STRUCT Data1,Data2:REAL; v1,v2:INT; END_STRUCT END_TYPE rDUT2 REF=myDut2; rDUT2.Data1:=100; rDUT2.Data2:=200; rDUT2.v1:=300; rDUT2.v2:=122; rDUT2 REF=myDUT3; rDUT2.Data1:=500; rDUT2.Data2:=600; rDUT2.v1:=12345; rDUT2.v2:=666; |
Result
結果としてはmyDUTとrDUT2が同じの現在値になります。