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