Beckhoff#TwinCAT3 ExSTを使ってみよう

今回の記事では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

Beckhoff.TwinCAT ExST 使ってみよう

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が同じの現在値になります。

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする