使用 Stateflow 图的空燃比控制系统
为使用 Simulink® 和 Stateflow® 设计的空燃比控制系统生成代码。
图 1、2 和 3 显示了 sldemo_fuelsys 模型(包含被控对象和控制器的闭环系统)的相关部分。被控对象在设计周期早期阶段的仿真过程中验证控制器。在此示例中,您将为相关控制器子系统 fuel_rate_control 生成代码。图 1 显示顶层仿真模型。
打开并配置 sldemo_fuelsys
模型。然后,编译模型以查看信号数据类型。
model = 'sldemo_fuelsys'; open_system(model) coder.example.configure(model,'ERT','float'); set_param(model,'ShowPortDataTypes','on'); set_param(model,'SampleTimeColors','on'); sldemo_fuelsys([],[],[],'compile'); sldemo_fuelsys([],[],[],'term');
图 1:被控对象和控制器的顶层模型
空燃比控制系统由 Simulink 和 Stateflow 组成。控制系统是指您为其生成代码的模型部分。
open_system('sldemo_fuelsys/fuel_rate_control');
图 2:空燃比控制器子系统
控制逻辑是指定不同操作模式的 Stateflow 图。
open_system('sldemo_fuelsys/fuel_rate_control/control_logic');
图 3:空燃比控制器逻辑
关闭这些窗口。
close_system('sldemo_fuelsys/fuel_rate_control/airflow_calc'); close_system('sldemo_fuelsys/fuel_rate_control/fuel_calc'); close_system('sldemo_fuelsys/fuel_rate_control/control_logic'); hDemo.rt=sfroot;hDemo.m=hDemo.rt.find('-isa','Simulink.BlockDiagram'); hDemo.c=hDemo.m.find('-isa','Stateflow.Chart','-and','Name','control_logic'); hDemo.c.visible=false; close_system('sldemo_fuelsys/fuel_rate_control');
使用 Embedded Coder 配置并构建模型
要为模型配置和编译生产 ANSI® C/C++ 代码,请将模型配置参数系统目标文件设置为 ert.tlc
(嵌入式实时 (ERT))。您可以通过编程方式设置系统目标文件参数。
coder.example.configure('sldemo_fuelsys','ERT');
生成并检查代码。您可以使用上一步和下一步按钮,以交互方式导航到相关的代码段。从图上下文菜单(右键点击 Stateflow 模块)中,选择 C/C++ 代码 > 导航至 C/C++ 代码。以编程方式使用 rtwtrace
实用工具。
slbuild('sldemo_fuelsys/fuel_rate_control'); rtwtrace('sldemo_fuelsys/fuel_rate_control/control_logic')
### 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 24.513s
查看生成的代码中的空燃比控制逻辑。
coder.example.extractLines('fuel_rate_control_ert_rtw/fuel_rate_control.c',... '/* Function for Chart:','case IN_Warmup:',1,0);
/* Function for Chart: '<S1>/control_logic' */ static void Fueling_Mode(const int32_T *sfEvent) { switch (rtDWork.bitsForTID0.is_Fueling_Mode) { case IN_Fuel_Disabled: rtDWork.fuel_mode = DISABLED; switch (rtDWork.bitsForTID0.is_Fuel_Disabled) { case IN_Overspeed: /* Inport: '<Root>/sensors' */ if ((rtDWork.bitsForTID0.is_Speed == IN_normal) && (rtU.sensors.speed < 603.0F)) { if (rtDWork.bitsForTID0.is_Fail != IN_Multi) { rtDWork.bitsForTID0.is_Fuel_Disabled = IN_NO_ACTIVE_CHILD; rtDWork.bitsForTID0.is_Fueling_Mode = IN_Running; /* The fuel is actively controlled while in this state. */ 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; /* All sensors are in correct operating modes, so effective closed-loop mixture control can be used. */ break;
关闭模型和代码生成报告。
clear hDemo; close_system('sldemo_fuelsys',0);