Примеры в этом разделе показывают сгенерированный код для среды IDE PLC CoDeSys версии 2.3. Сгенерированный код для других платформ 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