主要内容

固定点燃料速率控制系统

此示例显示了如何执行使用Simulink®和StateFlow®设计的燃料速率控制系统的浮点和固定点仿真。金宝app控制器利用Simulink数字类型在浮点和定点仿真金宝app之间轻松切换。熟悉燃料速率控制模型的熟悉建模容错燃料控制系统

打开并编译模型

SLDEMO_FUELSYS模型是包含“工厂”和“控制器”的闭环系统。在此示例中,该工厂是根模型,控制器是“Fuel_Rate_Control”子系统。该工厂用于连续验证控制器的设计。该工厂还促进了浮点对固定点类型的转化。最初,该模型被配置用于浮点模拟,如信号线上的数据类型显示所见。让我们来看看前两级层次结构的数据类型。

通过fxpdemo_fuelsys打开sldemo_fuelsys并编译图以查看信号数据类型。最初,控制器被配置为使用单个精度数据类型。

fxpdemo_fuelsys sldemo_fuelsys ([],[],[],'编译');sldemo_fuelsys([],[],[],“术语”);

查看浮点燃料率控制系统

Open_System('sldemo_fuelsys / fuel_rate_control');

查看浮点气流计算

Open_System(“sldemo_fuelsys / fuel_rate_control / airflow_calc”);

查看浮点燃料计算

Open_System('sldemo_fuelsys / fuel_rate_control / fuel_calc');

查看浮点控制逻辑

Open_System('sldemo_fuelsys / fuel_rate_control / control_logic');

现在让我们移除窗口杂物。

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''金宝appsimulink.blockdiagram');hdemo.c = hdemo.m.find('-ISA''stateflow.chart'“——”“名字”'control_logic');hdemo.c.visible = false;
close_system('sldemo_fuelsys / fuel_rate_control');

将数据类型从浮点型切换到定点型

使用固定点顾问将控制器转换为从浮点实现到等效的定点实现。看fxpdemo_fpa有关固定点顾问的详细信息。您还可以使用固定点工具优化和探索固定点设计。看fxpdemo_feedback有关定点工具的详细信息。

工厂使用双精度数据类型进行模拟。如上所述,“fuel_rate_control”子系统的配置使它很容易在浮点数据类型和定点数据类型之间切换。这是通过配置块来引用MATLAB®工作空间中的Simulink数值类型来完成的。金宝app

此模型使用四个缩放来计算其计算:

  • U8EN7(无符号8位,二进制点7缩放)

  • s16En3(带符号的16位,二进制点3缩放)

  • s16En7(带符号的16位,二进制点7缩放)

  • s16En15(带符号的16位,二进制点15缩放)

在MATLAB®工作区中查看这些对象。

U8EN7.s16En3s16En7s16En15
名称大小字节类属性S16EN15 1x1 91 Simulink.numericType S16金宝appEN3 1x1 91 Simulink.NumericType S16EN7 1x1 91 Simulink.numerictype U8EN7 1x1 91 Simulink.numerIncype

对于浮点模拟,数值类型被设置为单精度。Simulink数值对象的DataTypeMode属性被设置为使用金宝app“Single”。或者,您可以将它们设置为double。

u8En7 = fixdt ('单身的');s16en3 = fixdt('单身的');%#好的s16En7 = fixdt ('单身的');%#好的s16en15 = fixdt('单身的');%#好的disp (u8En7)
具有属性的NumericType:DataTypeMode:'单次'Isalias:0 Datascope:'Auto'标题文件:''描述:''

该模型被配置为对顶级信号进行仿真数据,从而将模拟结果存储在Workspace变量SLDEMO_FUELSYS_OUTPUT中。我们将在HDEMO.FLT_OUT中省略模拟结果,以便与定点仿真进行比较。

set_param('sldemo_fuelsys'“StopTime”'8') sim卡('sldemo_fuelsys') hDemo。flt_out = sldemo_fuelsys_output;

要切换到定点模拟,将Simulink数值类型设置为定点值。金宝app具体来说,DataTypeMode被设置为使用二进制点缩放。

u8En7 = fixdt (0 8 7);s16En3 = fixdt(1、16日3);s16En7 = fixdt(7) 1, 16日;s16En15 = fixdt(15) 1, 16日;disp (u8En7)
DataTypeMode: '定点:二进制点缩放' signed: '无符号' WordLength: 8 FractionLength: 7 IsAlias: 0 DataScope: 'Auto' HeaderFile: " Description: "

重新运行定点实现的模拟。可以看到信号上的定点数据类型。我们将把模拟结果存储在hDemo.fxp_out中。

如果~ hasFixedPointDesigner () DAStudio.error (“金宝app模型:fixedandfloat: FxDLicenseRequired”);结尾sim卡('sldemo_fuelsys') hDemo。fxp_out = sldemo_fuelsys_output;

查看定点燃油率控制系统

Open_System('sldemo_fuelsys / fuel_rate_control');

查看定点气流计算

Open_System(“sldemo_fuelsys / fuel_rate_control / airflow_calc”);

查看定点燃料计算

Open_System('sldemo_fuelsys / fuel_rate_control / fuel_calc');

比较浮点结果和定点结果

让我们对燃料流速和空燃比进行比较模拟结果。

数字('标签''博物馆');次要情节(2,1,1);情节(hDemo.flt_out.get ('燃料').values.time,hdemo.flt_out.get('燃料').values.data,的r -);保持绘图(hdemo.fxp_out.get('燃料').values.time,hdemo.fxp_out.get('燃料').values.data,'b-');ylabel ('fuelflowrate(g / sec)');标题(“燃油控制系统:浮点与定点比较”);传奇('漂浮''固定的')轴([0 8 .75 2.25]);次要情节(2,1,2);情节(hDemo.flt_out.get ('air_fuel_ratio').values.time,hdemo.flt_out.get('air_fuel_ratio').values.data,的r -);保持绘图(hdemo.fxp_out.get('air_fuel_ratio').values.time,hdemo.fxp_out.get('air_fuel_ratio').values.data,'b-');ylabel (空气/燃料比的);包含('时间(秒)')传说('漂浮''固定的'“位置”'东南')轴([0 8 11 16]);
当前地块已持有当前地块已持有

使用灵活的数据类型策略

您已经看到,可以配置模型使用Simulink数值类型在浮点数据和定点数据之间进行切换。金宝app在一个闭环模型中,比如这个,必须注意要有这样的灵活性。在本例中,双精度数据使用数据类型转换块与工厂之间进行转换。在控制器的两侧,转换块的输出数据类型设置为继承:通过反向传播继承.这允许控制系统更改数据类型实现而不与工厂数据类型冲突。

Simulink总线信号的特殊考虑因素金宝app

同样值得注意的是这个模型中使用的Simulink总线对象的数据类型的配置:EngSensors。金宝app使用前面讨论过的Simulink数值对象指定单个总线元素数据类型。金宝app这个总线有四个元素。

EngSensors.Elements(1)) disp(EngSensors.Elements(2))
BusElement with properties: Name: 'throttle' Complexity: 'real' Dimensions: 1 DataType: 's16En3' Min: [] Max: [] dimension mode: 'Fixed' Unit: 'deg' Description: " BusElement with properties: Name: 'speed' Complexity: 'real' Dimensions: 1 DataType: 's16En3' Min: [] Max: [] dimension mode: 'Fixed' Unit: 'rad/s' Description:BusElement with properties: Name: 'ego' Complexity: 'real' Dimensions: 1 DataType: 's16En7' Min: [] Max: [] dimension mode: 'Fixed' Unit: 'V' Description: " BusElement with properties: Name: 'map' Complexity: 'real' Dimensions: 1 DataType: 'u8En7' Min: [] Max: [] dimension mode: 'Fixed' Unit: 'bar' Description: "

查看控制器输入转换

数据类型转换块将工厂与控制器隔离。使用速率转换块,还从连续转换采样时间。

Open_System('sldemo_fuelsys / to controller'

查看控制器输出转换

数据类型转换块将控制器与工厂隔离开来。采样时间也通过速率转换块从离散时间转换为连续时间。

Open_System(“sldemo_fuelsys /植物”

关闭与示例相关的模型、图形和工作区变量

close_system('sldemo_fuelsys', 0);关闭(findobj (0,'标签''博物馆'));清晰的HDEMO.

闭幕词

您可以使用EmbeddedCoder®生成生产C / C ++代码。有关使用SLDEMO_FUELSYS的相关定点示例,请参阅