PLC構造化テキスト(ST)ではタイマーはどのように機能しますか?それらをどのように宣言しますか?
私はPLCの規格(IEC 61131-3)を研究していて、STのタイマーについては触れていません。 PLCプログラマーの大多数がラダーロジックでそれらを行うことを知っていますが、この特定のケースでは、STでタイマーを宣言する必要があります。
Rockwell PLCを使用しています。
タイマーに関する説明と、タイマーの使用方法(宣言)は、IDEのヘルプシステムにあります。たとえば、 [〜#〜] codesys [〜#〜] ヘルプでは、標準ライブラリのタイマーについて読むことができます。
一般に、タイマー遅延(TON)は次のように宣言できます。
VAR
MY_TON: TON;
END_VAR
(* standard.library should be added to the project *)
次に、それを使用できます:
MY_TON(IN:= IN_VALUE,PT:= TIME_SET);
(*IN_VALUE - is BOOL variable that activates your timer
TIME_SET - is TIME variable*)
SOME_OUTPUT := MY_TON.Q;
(*Q - is the timer's output, and it can be used as BOOL variable. *)
定数を使用してタイマーを設定することもできます。
MY_TON(IN:= True, PT:= t#5s);
BOOL変数として、タイマーの出力はIFおよびWHILEステートメントで使用できます。
IF MY_TON.Q THEN
(*Some statements...*)
END_IF
WHILE MY_TON.Q DO
(*Some statements...*)
END_WHILE
すべての例は、CODESYS v3.5 SP5およびv2.3で実行されます。他のIDEについては、ニュアンスがあるかもしれません。
タイマーは、TON.Q
が少なくともTON.IN
の期間中継続的に高くなっている場合にのみ、TON.PT
が高くなるように機能します。
これにより、TON.Q
が安定したHigh状態にある場合にのみ、TON.IN
がHighになることが確実になります。
これは、たとえば、ボタンが少なくともTON.PT
の間押された場合にのみ出力が有効になるようにする場合に役立ちます。
私はGx-Works(Mitsubishi/FXCPU)でこのようにそれを解決しました:
TON_1(IN:= Enable_Timer,PT:= PresetTime ,Q:= Output,ET:= TimeLeft);
TON_1を宣言することを忘れないでください:)
通常、事前に設定された時間を設定し、タイマーを有効にします。それが経過すると、trueに設定された一種の完了ビットがあります。イネーブルをリセットすると、時間もリセットされます。
私は、ST言語をサポートするオムロンPLCでこれを行いました。
PLCにタイマー割り込みがあり、それを使用してSTで独自のタイマーを作成したので、PLCの制限をスキップできます。 PLCの電源がオンになると、割り込みタスク内のコードが割り込みごとに実行され、割り込みハンドラー内に「A = A + 1」を書き込むことができます。
タイマーの使用を開始したら、Aの現在のデータを記録します。A1としましょう。間隔は次のとおりです。
Interval= Current_Data_Of_A-A1
次に、Interval
を必要な時間と比較します。 Interval
が必要な時間よりも大きい場合は、次のコードを実行します。
また、PLCが提供するミリ秒カウンターを使用して独自のタイマー構造を構築しているため、PLCの制限が必要な場合に、タイマーの配列(Schneider Electric)を作成できます。
TTIMER
Count: UINT
timclock :INT
OUT :BOOL
IN: BOOL
END_STRUCT;
TIM_SOD=ARRAY[0..1] OF TTIMER;
(*This part runs every cycle of PLC*)
FOR I:=0 TO 1 DO
IF TIM_SOD[I].IN (*timer on*)
THEN
IF (TIM_SOD[I].Count)>0 (*number of seconds left*)
THEN
IF ABS_INT(IN:=timclock-TIM_SOD[I].CLK)>=100 (*timclock -mSec counter*)
THEN aTIM_SOD[I].Count:=TIM_SOD[I].Count-1;
TIM_SOD[I].CLK:=TIM_SOD[I].CLK+100;
END_IF;
ELSE
TIM_SOD[I].IN:=0; (*timer off*)
TIM_SOD[I].Out:=1; (*Timer have run out*)
END_IF;
END_IF;
END_FOR;
(*-------------------------------------------------*)
(*This part runs once when we need start timer*)
TIM_SOD[0].COUNT:=H690; (*delay in seconds*)
TIM_SOD[0].CLK:=TIMCLOCK; (*current value of mSec counter*)
TIM_SOD[0].IN:=True;
(*-------------------------------------------------*)
(*This part runs once when we need stop timer*)
TIM_SOD[0].IN:=False;
(*Checking timer*)
IF TIM_SOD[0].OUT
THEN
(*doing smth......*)
END_IF;