2017-01-20 31 views
0

PLC가 시작될 때마다 코드를 실행해야합니다. 이 코드는 PLC가 다시 시작될 때까지 한 번만 실행 한 다음 다시 실행하면 안됩니다. 일부 전역 변수를 초기화하고 주 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

트윈 캣이 FirstCycle위한 부울을 포함하는 'PlcTaskSystemInfo'구조체를 갖는다. 이를 사용하여 초기화 코드를 한 번만 실행할 수 있습니다.

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이 콜드 리셋/리셋에서 참인지 알고 있습니까? –

+0

ResetCommand를 사용하여 전원을 켰을 때와 FirstCycle 비트가 모두 true인지 99 % 확신합니다. – pboedker

+0

@의 펠릭스 - 카일 다음 프로그램은 모두 나머지 콜드/원산지를 사용 (TRUE 또는 FALSE로 초기화 bCheckForFirstCycle와 그것을 시도) 할 때 FirstCycle가 TRUE 것을 보여줍니다 '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