Примеры в этом разделе показывают сгенерированный код для среды 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