web-dev-qa-db-ja.com

PLCのタイマー-構造化テキスト

PLC構造化テキスト(ST)ではタイマーはどのように機能しますか?それらをどのように宣言しますか?

私はPLCの規格(IEC 61131-3)を研究していて、STのタイマーについては触れていません。 PLCプログラマーの大多数がラダーロジックでそれらを行うことを知っていますが、この特定のケースでは、STでタイマーを宣言する必要があります。

Rockwell PLCを使用しています。

5
Yoanribeiro

タイマーに関する説明と、タイマーの使用方法(宣言)は、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については、ニュアンスがあるかもしれません。

8
nadein

タイマーは、TON.Qが少なくともTON.INの期間中継続的に高くなっている場合にのみ、TON.PTが高くなるように機能します。

これにより、TON.Qが安定したHigh状態にある場合にのみ、TON.INがHighになることが確実になります。

これは、たとえば、ボタンが少なくともTON.PTの間押された場合にのみ出力が有効になるようにする場合に役立ちます。

1
Adam.at.Epsilon

私はGx-Works(Mitsubishi/FXCPU)でこのようにそれを解決しました:

TON_1(IN:= Enable_Timer,PT:= PresetTime ,Q:= Output,ET:= TimeLeft);

TON_1を宣言することを忘れないでください:)

1
Richard87

通常、事前に設定された時間を設定し、タイマーを有効にします。それが経過すると、trueに設定された一種の完了ビットがあります。イネーブルをリセットすると、時間もリセットされます。

0
tkezy

私は、ST言語をサポートするオムロンPLCでこれを行いました。

PLCにタイマー割り込みがあり、それを使用してSTで独自のタイマーを作成したので、PLCの制限をスキップできます。 PLCの電源がオンになると、割り込みタスク内のコードが割り込みごとに実行され、割り込みハンドラー内に「A = A + 1」を書き込むことができます。

タイマーの使用を開始したら、Aの現在のデータを記録します。A1としましょう。間隔は次のとおりです。

Interval= Current_Data_Of_A-A1

次に、Intervalを必要な時間と比較します。 Intervalが必要な時間よりも大きい場合は、次のコードを実行します。

0
Sunh Hao

また、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;
0
to1234go