2017-01-20 2 views
0

Мне нужно запускать код каждый раз, когда начинается ПЛК. Этот код следует запускать только один раз, а затем снова никогда, пока ПЛК не будет перезапущен. Я инициализирую некоторые глобальные переменные и проверяю постоянные данные, прежде чем разрешить запуск основного ПЛК. Это связано с тем, что действия машины могут быть повреждены, если некоторые из этих переменных не настроены правильно.TwinCAT 3 Task Start/Stop от PLC

Есть ли способ запустить/остановить другие задачи ПЛК? Я заметил, что TwinCAT не поддерживает прерывания инициализации и остановки для задач ПЛК.

ответ

0

Я не знаю, как запустить/остановить отдельные задачи ПЛК. Однако вы можете запустить/остановить выполнение.

Но, возможно, это может быть так же просто, как этот код ниже, который будет работать только при запуске вашего ПЛК.

VAR initialized: BOOL := FALSE; 

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

(* Rest of your program here *) 

Edit:

Я использовал государственную машину внутри кода инициализации, чтобы помочь с задачей разрешенного времени выпуска.

Пример:

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 имеет-структуру марки '' PlcTaskSystemInfo, содержащий логическое значение для FirstCycle. Вы можете использовать это для запуска инициализирующего кода только один раз.

+0

Интересно! Вы знаете, является ли FirstCycle истинным при перезагрузке Cold/Origin? –

+0

Я на 99% уверен, что бит FirstCycle является истинным как при включении питания, так и при использовании команд сброса. – pboedker

+0

@ феликс-Keil Следующая программа показывает, что FirstCycle ИСТИНА при использовании как Rest холодной/Origin (попробуйте с bCheckForFirstCycle инициализируется ИСТИНА или ЛОЖЬ): 'VAR fbGetCurTaskIdx: GETCURTASKINDEX; i: INT: = 23; bCheckForFirstScan: BOOL: = TRUE; END_VAR; fbGetCurTaskIdx(); IF _TaskInfo [fbGetCurTaskIdx.index] .FirstCycle AND bCheckForFirstScan THEN (* здесь код инициализации *) \t i: = 17; ELSE (* Нормальный код здесь *) \t i: = i; END_IF; ' – pboedker