Generated Code Structure for Stateflow Charts
The examples in this topic show generated code for the CODESYS Version 2.3 PLC IDE. Generated code for other IDE platforms looks different.
Stateflow Chart with Event Based Transitions
Generate code for the Stateflow® chart ControlModule
in the model
plcdemo_stateflow_controller
. To open the model,
enter:
openExample('plcdemo_stateflow_controller');
You can map the states and transitions in the chart to the generated code. For
instance, the transition from the state Aborting
to
Aborted
appears in the generated code
as:
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;
For more information on the inlining of functions such as
start_drive
, stop_drive
, and
reset_drive
in the generated code, see Control Code Partitions for MATLAB Functions in Stateflow Charts.
Stateflow Chart with Absolute Time Temporal Logic
Generate code for the Stateflow chart Temporal
in the model
plcdemo_sf_abs_time
. To generate code, see Generate Structured Text Code for a Stateflow Chart That Uses Absolute-Time Temporal Logic. Here is the chart:
You can map states and transitions in the chart to the generated code. For
instance, the transition from state B
to C
appears
as:
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;
The variable temporalCounter_i1
is an instance of the function
block PLC_CODER_TIMER
defined
as:
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