TwinCAT 3 Запуск / остановка задачи с ПЛК

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

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


person DevLocus    schedule 20.01.2017    source источник


Ответы (2)


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

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

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
person stevenv    schedule 20.01.2017

TwinCAT имеет структуру PlcTaskSystemInfo, содержащую логическое значение для FirstCycle. Вы можете использовать это для запуска кода инициализации только один раз.

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

fbGetCurTaskIdx();
IF _TaskInfo[fbGetCurTaskIdx.index].FirstCycle THEN
  (* Initialization code here *)
ELSE
  (* Normal code here *)
END_IF;
person pboedker    schedule 20.01.2017
comment
Интересно! Вы знаете, верен ли FirstCycle при Reset Cold / Origin? - person Felix Keil; 21.01.2017
comment
Я на 99% уверен, что бит FirstCycle верен как при включении питания, так и при использовании команд сброса. - person pboedker; 22.01.2017
comment
@ felix-keil Следующая программа демонстрирует, что FirstCycle имеет значение TRUE при использовании и Rest Cold / Origin (попробуйте его с bCheckForFirstCycle, инициализированным значением TRUE или FALSE): VAR fbGetCurTaskIdx: GETCURTASKINDEX; i: INT := 23; bCheckForFirstScan: BOOL := TRUE; END_VAR; fbGetCurTaskIdx(); IF _TaskInfo[fbGetCurTaskIdx.index].FirstCycle AND bCheckForFirstScan THEN (* Initialization code here *) i := 17; ELSE (* Normal code here *) i := i; END_IF; - person pboedker; 22.01.2017
comment
Это план Б, но он не допускает всего того, что может позволить прерывание инициализации или программа. Большинство ПЛК, которые имеют прерывание / программу инициализации, позволяют прерыванию / программе нарушать нормальное время циклической программы (например, программа с циклом 10 мс позволяет программе инициализации выполняться намного дольше без исключения времени цикла). Это полезно для настройки более быстрых задач (например, задача управления движением составляет 1 мс, а инициализация структур привода может занять 10 мс). - person DevLocus; 23.01.2017
comment
@DevLocus затем взгляните на FB_init, FB_reinit, FB_exit, доступные для FunctionBlocks. Эти методы не вызываются в обычных циклах задач. См. Infosys. - person Felix Keil; 23.01.2017
comment
Это сработает, если у меня была только одна задача, но у меня есть несколько, которым нужно дождаться инициализации всех задач, прежде чем перейти в режим свободного запуска. По-прежнему похоже, что мне придется выполнить план B (глобальная переменная, чтобы все задачи не запускали код бесплатного запуска до тех пор, пока не будет завершена вся инициализация). - person DevLocus; 23.01.2017