Понял. ТО есть для написания на 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 Ну или несколько переменных состяний - то уже на любителя
Вроде бы понял, спасибо