2017-01-20 13 views
0

PLCが起動するたびに、いくつかのコードを実行する必要があります。このコードは、PLCが再起動されるまで1回だけ実行してから再実行しないでください。いくつかのグローバル変数を初期化し、メインPLCの実行を許可する前に永続データを検証します。これは、これらの変数のいくつかが正しく設定されていないと、マシンの動作が損害を被る可能性があるためです。TwinCAT 3 PLCからのタスクの開始/終了

他のPLCタスクを開始/停止する方法はありますか?私はTwinCATがPLCタスクの初期化とシャットダウン割り込みをサポートしていないことに気付きました。

答えて

0

個々のPLCタスクを開始/停止する方法はわかりません。あなたはランタイムを開始/停止することができます。

おそらく、このコードは以下のように簡単です。これは、PLCの起動時にのみ実行されます。

VAR initialized: BOOL := FALSE; 

IF NOT initialized THEN 
    (* Run your initialization code here *) 
    initialized := TRUE; 
END_IF 

(* Rest of your program here *) 

編集:

私は、タスク許容時間の問題を支援するために初期化コード内のステートマシンを使用。

例:

VAR 
    Initialized : BOOL := FALSE; 
    Init_State : UINT := 0; 
END_VAR 

IF NOT Initialized THEN 
    (* Initialization State Machine *) 
    CASE Init_State OF 
    0: (* First step in initialization *) 
     Init_State := Init_State + 1; 
    1: (* Second step in initialization *) 
     Init_State := Init_State + 1; 
    . 
    . 
    . 
    n: (* Last step in initialization *) 
     Initialized := TRUE; 
    END_CASE 
END_IF 
2

のTwinCATはFirstCycleのブールを含む 'PlcTaskSystemInfo' 構造体を有しています。これを使用して、初期化コードを1回だけ実行することができます。

VAR fbGetCurTaskIdx: GETCURTASKINDEX; (* Further example+explanation in Infosys *) 

fbGetCurTaskIdx(); 
IF _TaskInfo[fbGetCurTaskIdx.index].FirstCycle THEN 
    (* Initialization code here *) 
ELSE 
    (* Normal code here *) 
END_IF; 
+0

興味深い! FirstCycleがReset Cold/Originで真であるかどうか知っていますか? –

+0

電源投入時とリセットコマンド使用時にFirstCycleビットが真であることを99%確信しています。 – pboedker

+0

次のプログラムは、(TRUEまたはFALSEに初期化bCheckForFirstCycleでそれを試してみてください)、両方の休息コールド/起源を使用しているときFirstCycleがTRUEであることを実証している フェリックス-Keil社@: 'VAR fbGetCurTaskIdx:GETCURTASKINDEX。 i:INT:= 23; bCheckForFirstScan:BOOL:= TRUE; END_VAR; fbGetCurTaskIdx(); IF _TaskInfo [fbGetCurTaskIdx.index] .FirstCycleおよびbCheckForFirstScan (*初期化コードはこちら*) \t i:= 17; ELSE (*ノーマルコードはこちら*) \t i:= i; END_IF; ' – pboedker

関連する問題