Примеры в этой теме показывают сгенерированный код для IDE CoDeSys Version 2.3 PLC. Сгенерированный код для других платформ IDE выглядит по-другому.
Сгенерируйте код для графика Stateflow® ControlModule в модели plcdemo_stateflow_controller. Вот график:

Можно сопоставить состояния и переходы в графике к сгенерированному коду. Например, переход от Aborting состояния до Aborted появляется в сгенерированном коде как:
ControlModule_IN_Aborting:
rtb_out := sABORTING;
(* During 'Aborting': '<S1>:11' *)
(* Graphical Function 'is_active': '<S1>:73' *)
(* Transition: '<S1>:75' *)
IF NOT drive_state.Active THEN
(* Transition: '<S1>:31' *)
is_c2_ControlModule := ControlModule_IN_Aborted;
(* Entry 'Aborted': '<S1>:12' *)
rtb_out := sABORTED;
(* Graphical Function 'stop_drive': '<S1>:88' *)
(* Transition: '<S1>:90' *)
driveOut.Start := FALSE;
driveOut.Stop := TRUE;
driveOut.Reset := FALSE;
END_IF;
Для получения дополнительной информации о встраивании функций, таких как start_drive, stop_drive и reset_drive в сгенерированном коде, видят Разделы Кода системы управления для функций MATLAB в диаграммах Stateflow.
Сгенерируйте код для диаграммы Stateflow Temporal в модели plcdemo_sf_abs_time. Вот график:

Можно сопоставить состояния и переходы в графике к сгенерированному коду. Например, переход от B состояния до C появляется как:
Temporal_IN_B:
(* During 'B': '<S1>:2' *)
temporalCounter_i1(timerAction := 2, maxTime := 4000);
IF temporalCounter_i1.done THEN
(* Transition: '<S1>:8' *)
is_c2_Temporal := Temporal_IN_C;
temporalCounter_i1(timerAction := 1, maxTime := 0);
ELSE
(* Outport: '<Root>/pulse' *)
pulse := 2.0;
END_IF;Переменная temporalCounter_i1 является экземпляром функционального блока PLC_CODER_TIMER, заданный как:
FUNCTION_BLOCK PLC_CODER_TIMER
VAR_INPUT
timerAction: INT;
maxTime: DINT;
END_VAR
VAR_OUTPUT
done: BOOL;
END_VAR
VAR
plcTimer: TON;
plcTimerExpired: BOOL;
END_VAR
CASE timerAction OF
1:
(* RESET *)
plcTimer(IN:=FALSE, PT:=T#0ms);
plcTimerExpired := FALSE;
done := FALSE;
2:
(* AFTER *)
IF (NOT(plcTimerExpired)) THEN
plcTimer(IN:=TRUE, PT:=DINT_TO_TIME(maxTime));
END_IF;
plcTimerExpired := plcTimer.Q;
done := plcTimerExpired;
3:
(* BEFORE *)
IF (NOT(plcTimerExpired)) THEN
plcTimer(IN:=TRUE, PT:=DINT_TO_TIME(maxTime));
END_IF;
plcTimerExpired := plcTimer.Q;
done := NOT(plcTimerExpired);
END_CASE;
END_FUNCTION_BLOCK