Air-Fuel Ratio Control System with Stateflow Charts

Generate code for an air-fuel ratio control system designed with Simulink® and Stateflow®.

Figures 1, 2, and 3 show relevant portions of the sldemo_fuelsys model, a closed-loop system containing a plant and controller. The plant validates the controller in simulation early in the design cycle. In this example, you generate code for the relevant controller subsystem, "fuel_rate_control". Figure 1 shows the top-level simulation model.

Use the command rtwdemo_fuelsys to open model sldemo_fuelsys. Then, compile the model to see the signal data types.


Figure 1: Top-level model of the plant and controller

The air-fuel ratio control system is comprised of Simulink® and Stateflow®. The control system is the portion of the model for which you generate code.


Figure 2: The air-fuel ratio controller subsystem

The control logic is a Stateflow® chart that specifies the different modes of operation.


Figure 3: Air-fuel rate controller logic

Close these windows.


Configure and Build the Model with Embedded Coder®

To configure and build production ANSI® C/C++ code for the model, set model configuration parameter System target file to ert.tlc (Embedded Real-Time (ERT)). You can set the System target file parameter programmatically.


Generate and inspect the code. You can navigate to the relevant code segments interactively by using Previous and Next buttons. From the chart context menu (right-click the Stateflow® block), select C/C++ Code > Navigate to C/C++ Code. Programmatically, use the rtwtrace utility.

### Starting build procedure for: fuel_rate_control
### Successful completion of build procedure for: fuel_rate_control

Build Summary

Top model targets built:

Model              Action                       Rebuild Reason                                    
fuel_rate_control  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 33.097s

View the air-fuel ratio control logic in the generated code.

    '/* Function for Chart:','case IN_Warmup:',1,0);
/* Function for Chart: '<S1>/control_logic' */
static void Fueling_Mode(const int32_T *sfEvent)
  /* This state interprets the other states in the chart to directly control the fueling mode. */
  switch (rtDWork.bitsForTID0.is_Fueling_Mode) {
   case IN_Fuel_Disabled:
    rtDWork.fuel_mode = DISABLED;

    /* The fuel is completely shut off while in this state. */
    switch (rtDWork.bitsForTID0.is_Fuel_Disabled) {
     case IN_Overspeed:
      /* Inport: '<Root>/sensors' */
      /* The speed is dangerously high, so shut off the fuel. */
      if ((rtDWork.bitsForTID0.is_Speed == 2) && (rtU.sensors.speed < 603.0F)) {
        if (rtDWork.bitsForTID0.is_Fail != 1) {
          rtDWork.bitsForTID0.is_Fuel_Disabled = IN_NO_ACTIVE_CHILD;
          rtDWork.bitsForTID0.is_Fueling_Mode = IN_Running;
          switch (rtDWork.bitsForTID0.was_Running) {
           case IN_Low_Emissions:
            rtDWork.bitsForTID0.is_Running = IN_Low_Emissions;
            rtDWork.bitsForTID0.was_Running = IN_Low_Emissions;
            rtDWork.fuel_mode = LOW;
            switch (rtDWork.bitsForTID0.was_Low_Emissions) {
             case IN_Normal:
              rtDWork.bitsForTID0.is_Low_Emissions = IN_Normal;
              rtDWork.bitsForTID0.was_Low_Emissions = IN_Normal;

Close the model and code generation report.

clear hDemo;

Related Examples

For related fixed-point examples that use sldemo_fuelsys, see