Понял. ТО есть для написания на ST в моём случае надо ввести
переменную для состояния и тупо сделать в самом начале CASE и
делать переходы на нужный мне кусок кода.
Типа такого
VAR usSOST :USINT= 1; END_VAR CASE usSOST OF 1: //ЧОТО ТУТ ДЕЛАЕМ ЧТО НАДО В ИНИТЕ ДЕЛАТЬ IF NOT D THEN SIGNAL();(*usSOST делает равным 2 и запускает таймер MyTimer*) //ПО ФАКТУ ЭКВИАВАЛЕНТ БЛОКУ Е НА МОДЕЛИ SFC END_IF IF NOT K THEN KOD();(*usSOST делает равным 3..10 в зависисмости на каком этапе внутри процедуры остаюсь*) //ПО ФАКТУ ЭКВИАВАЛЕНТ БЛОКУ Е НА МОДЕЛИ SFC END_IF 2: IF MyTimer.Q=TRUE THEN MyTimer.IN:=FALSE; usSOST :=1;(*ПЕРЕХОД НА INIT*) END_IF 3..9: KOD();(*usSOST МЕНЯЕТ В ПРЕДЕЛАХ 3..10 в зависисмости на каком этапе внутри процедуры остаюсь*) 10: (*работа блока KOD окнчена была*) IF KN THEN SIGNAL();(*usSOST делает равным 2 и запускает таймер MyTimer*) //ПО ФАКТУ ЭКВИАВАЛЕНТ БЛОКУ Е НА МОДЕЛИ SFC END_IF IF KOK THEN OpenDoor();(*usSOST делает равным 11*) ELSE usSOST :=1;(*переход на init*) END_IF 11: //ПОХОЖЕЕ ДЛЯ БЛОКА OpenDoor 12: //ПОХОЖЕЕ ДЛЯ БЛОКА WaitClose ELSE usSOST :=1;(*переход на init - на всякий случай*) END_CASE
Ну или несколько переменных состяний - то уже на любителя
Вроде бы понял, спасибо