主要内容

空气燃料比与定点数据控制系统

这个例子展示了如何生成和优化的代码一个定点空燃比控制系统设计与仿真软件®和Stateflow®。金宝app模型的详细解释,请参阅:

示例使用嵌入的编码器®系统目标文件(ert.tlc)。

模型的相关部分

图1 - 4显示的相关部分sldemo_fuelsys闭环系统模型,它是一种含有植物子系统和一个控制器子系统。工厂允许工程师验证控制器在设计周期的早期通过模拟。在本例中,生成的代码相关的控制器子系统,fuel_rate_control。图1显示了高层仿真模型。

%开放| sldemo_fuelsys |,设置参数和更新模型图%查看信号的数据类型。close_system (“sldemo_fuelsys”,0)load_system (“sldemo_fuelsys”);rtwconfiguredemo (“sldemo_fuelsys”,“导”,“固定”);sldemo_fuelsys_data (“sldemo_fuelsys”,“switch_data_type”,“固定”);sldemo_fuelsys_data (“sldemo_fuelsys”,“top_level_logging”,“上”);set_param (“sldemo_fuelsys”,“ShowPortDataTypes”,“上”);set_param (“sldemo_fuelsys”,“SampleTimeColors”,“上”);set_param (“sldemo_fuelsys”,“脏”,“关闭”);sldemo_fuelsys ([]、[] [],“编译”);sldemo_fuelsys ([]、[] [],“术语”);

图1:顶级的植物和控制器模型

空燃比控制系统仿真软件和Stateflow块组成。金宝app这是一部分的模型来生成代码。

open_system (“sldemo_fuelsys / fuel_rate_control”);

图2:空气燃料比控制器子系统

进气气流的估计和闭环校正系统包含两个查找表,泵常数和Ki斜坡速度。

open_system (“sldemo_fuelsys / fuel_rate_control / airflow_calc”);

图3:airflow_calc子系统

控制逻辑是Stateflow图表,指定不同的操作模式。

open_system (“sldemo_fuelsys / fuel_rate_control / control_logic”);

图4:燃料比控制器逻辑

删除窗口杂乱。

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 (“是”,“金宝appSimulink.BlockDiagram”);hDemo.c = hDemo.m.find (“是”,“Stateflow.Chart”,“——”,“名字”,“control_logic”);hDemo.c.visible = false;close_system (“sldemo_fuelsys / fuel_rate_control”);

建立空燃比控制系统。代码生成过程完成后,显示一个HTML报告,列出了所生成的代码。代码的主体位于fuel_rate_control.c

slbuild (“sldemo_fuelsys / fuel_rate_control”);
# # #开始构建过程:fuel_rate_control # # #成功完成构建过程:fuel_rate_control模型建立目标:总结构建模型重建行动的原因= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = fuel_rate_control代码生成和编译。代码生成信息文件不存在。1 1模型的建立(0模型已经更新)构建持续时间:0 h 0米14.307秒

图5显示了查找表生成的代码片段注入常数。

看到的代码注入常数,右键单击,选择C / c++代码>导航到C / c++代码

rtwtrace (“sldemo_fuelsys / fuel_rate_control airflow_calc /注入恒定的);

的代码注入常数包含两个断点搜索和二维插值。的SpeedVect断点是不均匀的,虽然PressVect断点是均匀间隔的,没有两个间隔的力量。当前的间距会导致额外的代码(ROM),包括一个部门,要求所有断点的内存(RAM)。

图5:生成的代码注入恒定查找(包含不均匀间隔的断点)

优化代码与等间距的两个断点的力量

您可以通过使用优化生成的代码性能均匀间隔的两个断点的力量。在这个例子中,重测图查找表中的数据基于现有的空燃比控制系统测量数据。

当您加载模型,该模型PostLoadFcn工作区创建了查找表中的数据模型。通过检索原始表数据sldemo_fuelsys_data,修改等间距的两个的力量,并重新分配模型中工作区。

td = sldemo_fuelsys_data (“sldemo_fuelsys”,“get_table_data”);

等间距的计算新表数据的两个断点。

被忽视的热带病。SpeedVect = 64: 2 ^ 5: 640;% 32 rad /秒被忽视的热带病。PressVect = 2 * 2 ^ 5: 2 ^ 5: 1 - (2 * 2 ^ 5);% 0.03酒吧被忽视的热带病。ThrotVect = 0:2 ^ 1:88;% 2度被忽视的热带病。RampRateKiX = 128:2 ^ 7:640;% 128 rad /秒被忽视的热带病。RampRateKiY = 0:2 ^ 2:1;% 0.25酒吧

重新映射表数据。

被忽视的热带病。PumpCon = interp2 (td.PressVect td.SpeedVect,道明。PumpCon, ntd.PressVect ntd.SpeedVect);被忽视的热带病。总统= interp2 (td.ThrotVect td.SpeedVect、td.PressEst ntd.ThrotVect”, ntd.SpeedVect);被忽视的热带病。速度= interp2 (td.PressVect td.ThrotVect、td.SpeedEst ntd.PressVect”, ntd.ThrotVect);被忽视的热带病。ThrotEst = interp2 (td.PressVect td.SpeedVect、td.ThrotEst ntd.PressVect”, ntd.SpeedVect);

再计算斜坡率表数据。

被忽视的热带病。RampRateKiZ =(1:长度(ntd.RampRateKiX)) *(1:长度(ntd.RampRateKiY)) * td.Ki;

抽两个间隔的恒功率

图(“标签”,“CloseMe”);网格(td.PressVect td.SpeedVect td.PumpCon)网格(ntd.PressVect ntd.SpeedVect ntd.PumpCon)包含(“PressVect”),ylabel (“SpeedVect”),zlabel (“PumpCon”)标题(sprintf (”注入常数\ nOriginal间距(%)% d)与权力两个间距(%)% d)的,大小(td.PumpCon, 1),大小(td.PumpCon, 2),大小(ntd.PumpCon, 1),大小(ntd.PumpCon, 2)));

压力估计两个间隔的力量

clf网(td.ThrotVect td.SpeedVect td.PressEst)网格(ntd.ThrotVect ntd.SpeedVect ntd.PressEst)包含(“ThrotVect”),ylabel (“SpeedVect”),zlabel (“总统”)标题(sprintf ('压力估计\ nOriginal间距(%)% d)与权力两个间距(%)% d)的,大小(td.PressEst, 1),大小(td.PressEst, 2),大小(ntd.PressEst, 1),大小(ntd.PressEst, 2)));

速度估计两个间隔的力量

clf网(td.PressVect td.ThrotVect td.SpeedEst)网格(ntd.PressVect ntd.ThrotVect ntd.SpeedEst)包含(“PressVect”),ylabel (“ThrotVect”),zlabel (“速度”)标题(sprintf (的速度估计\ nOriginal间距(%)% d)与权力两个间距(%)% d)的,大小(td.SpeedEst, 1),大小(td.SpeedEst, 2),大小(ntd.SpeedEst, 1),大小(ntd.SpeedEst, 2)));

节流估计两个间隔的力量

clf网(td.PressVect td.SpeedVect td.ThrotEst)网格(ntd.PressVect ntd.SpeedVect ntd.ThrotEst)包含(“PressVect”),ylabel (“SpeedVect”),zlabel (“ThrotEst”)标题(sprintf (“节流估计\ nOriginal间距(%)% d)与权力两个间距(%)% d)的,大小(td.ThrotEst, 1),大小(td.ThrotEst, 2),大小(ntd.ThrotEst, 1),大小(ntd.ThrotEst, 2)));

斜坡率Ki两个间隔的力量

clf网(td.RampRateKiX td.RampRateKiY td.RampRateKiZ’)网格(ntd.RampRateKiX ntd.RampRateKiY ntd.RampRateKiZ”),隐藏的包含(“RampRateKiX”),ylabel (“RampRateKiY”),zlabel (“RampRateKiZ”)标题(sprintf (的斜坡率Ki \ nOriginal间距(%)% d)与权力两个间距(%)% d)的,大小(td.RampRateKiZ, 1),大小(td.RampRateKiZ, 2),大小(ntd.RampRateKiZ, 1),大小(ntd.RampRateKiZ, 2)));

缺省配置导致顶层模型记录仿真数据信号。这些仿真结果存储在工作区中变量sldemo_fuelsys_output。在更新模型空间与新数据之前,保存仿真的结果hDemo.orig_data为以后比较均匀间隔的两个表的模拟。

set_param (“sldemo_fuelsys”,“StopTime”,“8”)sim卡(“sldemo_fuelsys”)hDemo。orig_data = sldemo_fuelsys_output;

重新分配新的表数据模型中的工作区。

hDemo。探测= get_param (“sldemo_fuelsys”,“ModelWorkspace”);hDemo.hWS.assignin (“总统”,ntd.PressEst);hDemo.hWS.assignin (“PressVect”,ntd.PressVect);hDemo.hWS.assignin (“PumpCon”,ntd.PumpCon);hDemo.hWS.assignin (“速度”,ntd.SpeedEst);hDemo.hWS.assignin (“SpeedVect”,ntd.SpeedVect);hDemo.hWS.assignin (“ThrotEst”,ntd.ThrotEst);hDemo.hWS.assignin (“ThrotVect”,ntd.ThrotVect);hDemo.hWS.assignin (“RampRateKiX”,ntd.RampRateKiX);hDemo.hWS.assignin (“RampRateKiY”,ntd.RampRateKiY);hDemo.hWS.assignin (“RampRateKiZ”,ntd.RampRateKiZ);

重新配置为均匀间隔的数据查找表。

hDemo。lookupTables = find_system (get_param (“sldemo_fuelsys”,“处理”),“BlockType”,“Lookup_n-D”);(hDemo.lookupTables) hDemo hDemo_blkIdx = 1:长度。blkH = hDemo.lookupTables (hDemo_blkIdx);set_param (hDemo.blkH“IndexSearchMethod”,“等间距的点”)set_param (hDemo.blkH“InterpMethod”,“没有——平”)set_param (hDemo.blkH“ProcessOutOfRangeInput”,“没有”)结束

重新运行的模拟均匀间隔的两个实现的力量,并将模拟的结果存储在hDemo.pow2_data

sim卡(“sldemo_fuelsys”)hDemo。pow2_data = sldemo_fuelsys_output;

比较的结果模拟燃料流量和空气燃料比。仿真执行泵常数和斜坡率Ki查找表,并展示了一个优秀的匹配两个断点的等间距的力量相对于原表数据。

图(“标签”,“CloseMe”);次要情节(2,1,1);情节(hDemo.orig_data.get (“燃料”).Values.Time,hDemo.orig_data.get (“燃料”).Values.Data,的r -);持有情节(hDemo.pow2_data.get (“燃料”).Values.Time,hDemo.pow2_data.get (“燃料”).Values.Data,“b -”);ylabel (“FuelFlowRate (g /秒)”);标题(“燃油控制系统:表数据比较”);传奇(“原始”,“甚至权力两个”);轴([0 8。2.25]);次要情节(2,1,2);情节(hDemo.orig_data.get (“air_fuel_ratio”).Values.Time,hDemo.orig_data.get (“air_fuel_ratio”).Values.Data,的r -);持有情节(hDemo.pow2_data.get (“air_fuel_ratio”).Values.Time,hDemo.pow2_data.get (“air_fuel_ratio”).Values.Data,“b -”);ylabel (空气/燃料比的);包含(的时间(秒));传奇(“原始”,“即使是2的幂”,“位置”,“东南”);轴([0 8 11 16]);
当前情节举行当前情节

重建空燃比控制系统和比较在代码生成的查找表的区别。

slbuild (“sldemo_fuelsys / fuel_rate_control”);
# # #开始构建过程:fuel_rate_control # # #成功完成构建过程:fuel_rate_control模型建立目标:总结构建模型重建行动的原因= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = fuel_rate_control代码生成和编译。生成的代码是过时了。1 1模型的建立(0模型已经更新)构建持续时间:0 h 0米12.669秒

图6显示了相同的片段生成的代码注入恒定的查找表。生成的代码为等间距的两个断点的力量明显比不均匀间隔的断点的情况下更有效。两个简单的断点的代码包含计算和直接索引2 d查找表的数据。贵司不需要避免和断点数据在内存中。

rtwtrace (“sldemo_fuelsys / fuel_rate_control airflow_calc /注入恒定的);

图6:生成的代码注入恒定查找(均匀间隔的两个断点的力量)

关闭的例子。

关闭(findobj (0,“标签”,“CloseMe”));清晰的hDemo *道明被忽视的热带病close_system (“sldemo_fuelsys”,0);rtwdemoclean;

模型顾问代码效率

提高代码效率,采用等间距的两个断点的力量是定点的几个重要的优化代码生成。Advi金宝appsor仿真软件模型是一个伟大的工具来识别其他方法提高代码效率的仿真软件和Stateflow模型。确保运行嵌入式编码器文件夹下的检查或仿真软件编码器™。金宝app

相关的话题