目录
控制信号数据类型
输入有效数据类型值
使用 Model Data Editor 进行批量编辑
在独立算法、数据路径、模型和总线元素之间共享数据类型
为信号数据重用自定义 C 数据类型
确定使用继承设置的信号的数据类型
尽管设置改变,但数据类型依然为 double
要控制 Simulink® 模型中某个信号的数据类型,可以为对应的模块输出指定数据类型。还可以通过以下方式之一在模型中引入特定数据类型的新信号:
通过根级Inport模块或From Workspace模块,将所需类型的信号数据从MATLAB® 工作区加载到您的模型中。
在您的模型中创建一个Constant模块,并将其参数设置为所需的类型。
使用Data Type Conversion模块将信号转换为所需的数据类型。
默认情况下,Simulink 模块决定了其输出的数据类型。许多模块允许使用一个模块参数(通常称为 Output data type)来覆盖模块的默认类型,并显式指定输出数据类型。例如,Output data type 参数出现在Constant模块对话框的Signal Attributes 窗格中。
有关详细信息,请参阅以下主题:
有关此方面的信息... | 请参阅... |
---|---|
可以指定的有效数据类型值 |
输入有效数据类型值 |
可帮助指定有效数据类型值的助手 |
使用Data Type Assistant指定数据类型 |
同时为多个模块指定有效的数据类型值 |
使用Model Data Editor进行批量编辑 |
一般情况下,您可以将输出数据类型指定为以下任意值:
继承数据类型的规则(参考数据类型继承规则)
内置数据类型的名称(参考内置数据类型)
计算结果为数据类型的表达式(参考数据类型表达式)
有效的数据类型值因模块而异。可以使用模块的数据类型参数关联的下拉菜单来查看该模块支持的数据类型。例如,Data Store Memory 模块对话框中的 Data type 下拉菜单列出了它支持的数据类型,如下所示。
有关特定模块支持的数据类型的详细信息,参考Simulink 文档中有关该模块的说明。
数据类型继承规则
模块可从各种来源继承数据类型,包括它们连接的信号和特定的模块参数。可以将数据类型参数的值指定为一个规则,通过它决定输出信号如何继承其数据类型。要查看模块支持的继承规则,请使用模块对话框中的数据类型下拉菜单。下表列出了可以选择的典型规则。
继承规则 | 说明 |
---|---|
“Inherit:Inherit via back propagation ” |
Simulink在数据类型传播过程中自动确定模块的输出数据类型(参考数据类型传播)。在这种情况下,模块使用下游模块或信号对象的数据类型。 |
“Inherit:Same as input ” |
模块的输出信号使用其唯一的输入信号的数据类型。 |
“Inherit:Same as first input ” |
模块的输出信号使用其第一个输入信号的数据类型。 |
“Inherit:Same as second input ” |
模块的输出信号使用其第二个输入信号的数据类型。 |
“Inherit:Inherit via internal rule ” |
模块使用内部规则确定其输出数据类型。内部规则会根据嵌入式目标硬件的属性选择一种能够优化数值准确性、性能和所生成代码大小的数据类型。本软件并非在任何情况下都能同时优化效率和数值准确性。 |
如果为信号应用继承的数据类型,仅当更新模块图之后,Simulink 才会确定该信号的具体数据类型。
要在模块图上显示此数据类型,参考Port Data Type。
要以可搜索、可排序的表形式查看多个信号的具体数据类型,请使用 Model Data Editor(在 Modeling 选项卡上,点击 Model Data Editor)。Data Type 列的右侧显示每个信号的具体数据类型。有关 Model Data Editor 的详细信息,参考使用Model Data Editor配置数据属性。
内置数据类型
可以将数据类型参数的值指定为内置数据类型(例如,single
或boolean
)的名称。要查看模块支持的内置数据类型,请使用模块对话框中的数据类型下拉菜单。要查看支持的所有内置数据类型的列表,参考Simulink支持的数据类型。
数据类型表达式
可以将数据类型参数的值指定为计算结果为数值数据类型对象的表达式。只需在模块对话框的数据类型字段中输入表达式即可。一般情况下,可以输入以下表达式之一:
fixdt
命令
将数据类型参数的值指定为调用fixdt函数的命令。此函数允许创建描述定点或浮点数据类型的Simulink.NumbericType对象。
数据类型对象名称
将数据类型参数的值指定为表示数据类型的数据对象的名称。从类中实例化的 Simulink 数据对象(例如Simulink.NumericType和Simulink.AliasType)可以简化在模型范围内更改输出数据类型的任务,并允许为数据类型使用自定义别名。有关 Simulink 数据对象的详细信息,参考数据对象。
可以使用Model Data Editor(参考使用Model Data Editor配置数据属性)同时为多个信号指定相同的数据类型。使用这种方法,可以通过一次性配置多个Inport和Outport模块的数据类型和其他属性来设计模型接口(参考Configure Data Interface for Component)。还可以在模块算法中精细控制任意信号的数据类型。
例如,Simulink产品附带的slexAircraftExample模型中包含很多Gain模块。假设要将模型根级别的三个Gain模块的输出数据类型指定为single。可以按下面所示完成此任务:
在 Model Data Editor(在 Modeling 选项卡上,点击 Model Data Editor)中,检查Signals选项卡。
在 Filter contents框旁边,点击Filter using selection按钮切换模式。
在模型的顶层,选择表示三个Gain模块的输出的信号线(标记为Zw
、Mw
和Mq
)。Model Data Editor显示与三个信号对应的三行。
在Model Data Editor中,选择所有三个信号(行)。例如,可以按 Ctrl+A,或按住Shift并点击Source列的首行和尾行。
点击三者之中任一信号在 Data Type 列中的单元格。从下拉列表中,选择 “single
”。Model Data Editor 会将此选择应用于所有选定的行。
要将模型转换为严格的单精度设计,可以参考Validate a Floating-Point Embedded Model。
有些情况下,不能依赖数据类型继承(参考数据类型继承规则)来确保不同数据项(例如 Simulink.Bus 对象中的并行数据路径中的信号线或总线元素)的数据类型相同。这种情况下,可以在工作区或数据字典中创建 Simulink.NumericType或Simulink.AliasType对象。
如果不想通过创建别名来重命名共享的数据类型,可以创建一个 Simulink.NumericType 对象。将 IsAlias 属性设置为 false(默认值)。此示例说明如何使用 Simulink.NumericType 对象在同一模型中的两个查找表模块之间共享输出数据类型。
打开模型示例 sldemo_fuelsys。
sldemo_fuelsys
该模型在基础工作区中创建 Simulink.NumericType 对象。其中一个对象名为 s16En15。
在命令提示符下,检查 s16En15 的属性。
s16En15
s16En15 =
NumericType with properties:
DataTypeMode: 'Single'
IsAlias: 0
DataScope: 'Auto'
HeaderFile: ''
Description: ''
此对象表示内置的 Simulink 数据类型 single
。
在模型中,导航到 fuel_rate_control/airflow_calc 子系统中。
在Modeling选项卡上,点击Model Data Editor。在 Model Data Editor 中,检查Signals选项卡。
在模型中,点击Pumping Constant模块的输出信号。Model Data Editor的Data Type列显示信号数据类型设置为s16En15
。
点击Ramp Rate Ki模块的输出信号。此模块的输出数据类型也设置为 s16En15
。
更新模块图,如有必要,可将Data Type列拉宽。该列的右侧显示两个查找表模块使用数据类型single。
在命令提示符下配置s16En15,以表示数据类型double。
s16En15.DataTypeMode = 'Double';
更新模块图。
两个查找表模块的输出信号现在都使用数据类型double。由于数据类型继承的缘故,其他信号(如 e0 和 e1)获得相同的数据类型。要确保同一模型中的算法或数据路径之间数据类型等同,也可以使用诸如Data Type Porpagation和Data Type Conversion Inherited之类的模块。使用这些模块时,不需要创建和永久存储数据类型对象。但是,不能使用此类模块在不同模型中的信号之间共享数据类型,除非这些模型位于同一个模型引用层次结构中。
在模型中,可以创建符合现有C代码定义的自定义C数据类型(如结构体)的信号。使用这些信号可以:
将现有C代码替换为Simulink 模型。
集成C代码以进行Simulink仿真(例如,通过使用 Legacy Code Tool)。
准备生成可与现有代码集成的代码 (Simulink Coder™)。
使用以下方法匹配自定义数据类型:
对于结构体类型,创建一个Simulink.Bus对象。使用该对象作为总线信号的数据类型。可以参考总线信号的数据类型。
对于枚举,创建一个枚举类并将其用作信号的数据类型。参考在Simulink模型中使用枚举数据。
要匹配表示某基本数据类型的别名的typedef语句,请使用Simulink.AliasType对象作为信号的数据类型。参考Simulink.AliasType。
要创建这些类和对象,可以使用Simulink.importExternalCTypes函数。如果模型中的MATLAB Function模块或 Stateflow® 图使用导入的枚举或结构体类型,请将模型配置参数配置为包含 (#include
) 来自外部头文件的类型定义。参考控制导入的总线和枚举类型定义(对于 MATLAB Function 模块)以及访问Stateflow图中的自定义代码变量和函数 (Stateflow) 和(对于图)。
如果信号使用继承的数据类型设置(例如 “Inherit:Inherit via internal rule”,这是大多数模块的默认设置)确定信号用于仿真的有意义数据类型,则更新模块图,然后使用以下一种或两种方法:
在Simulink Editor中,在Debug选项卡上,选择Information Overlays > Port Data Type。数据类型显示在每个信号旁边的模块图上。参考Port Data Types。
检查Model Data Editor(在 Modeling 选项卡上,点击 Model Data Editor)中Data Type列的右侧。有关Model Data Editor的详细信息,参考使用Model Data Editor配置数据属性。
使用这些方法检查数据类型可以帮助:
从更高的层次上为模型设计数据类型策略。
调试由于量化和溢出而造成的数值问题。
使模型在共享时更容易理解。
double
如果在配置模块参数(如 Output data type)之后,模型中的许多数据项(信号、参数和状态)仍然使用double数据类型,请确认未将该模型配置为覆盖数据类型。参考Control Data Type Override。