Simulink环境基础知识(⼆⼗三)--控制信号数据类型
⽬录
控制信号数据类型
要控制 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(参考使⽤Model Data Editor配置数据属性)同时为多个信号指定相同的数据类型。使⽤这种⽅法,可以通过⼀次性配置多个Inport和Outport模块的数据类型和其他属性来设计模型接⼝(参考Configure Data Interface for Component)。还可以在模块算法中精细控制任意信号的数据类型。
例如,Simulink产品附带的slexAircraftExample模型中包含很多Gain模块。假设要将模型根级别的三个Gain模块的输出数据类型指定为single。可以按下⾯所⽰完成此任务:
1. 在 Model Data Editor(在 Modeling 选项卡上,点击 Model Data Editor)中,检查Signals选项卡。
2. 在 Filter contents框旁边,点击Filter using selection按钮切换模式。
3. 在模型的顶层,选择表⽰三个Gain模块的输出的信号线(标记为Zw、Mw和Mq)。Model Data Editor显⽰与三个信号对应的三⾏。
4. 在Model Data Editor中,选择所有三个信号(⾏)。例如,可以按 Ctrl+A,或按住Shift并点击Source列的⾸⾏和尾⾏。
5. 点击三者之中任⼀信号在 Data Type 列中的单元格。从下拉列表中,选择 “single”。Model Data Editor 会将此选择应⽤于所有选
定的⾏。
要将模型转换为严格的单精度设计,可以参考Validate a Floating-Point Embedded Model。
在独⽴算法、数据路径、模型和总线元素之间共享数据类型
parameter数据类型有些情况下,不能依赖数据类型继承(参考数据类型继承规则)来确保不同数据项(例如 Simulink.Bus 对象中的并⾏数据路径中的信号线或总线元素)的数据类型相同。这种情况下,可以在⼯作区或数据字典中创建 Simulink.NumericType或Simulink.AliasType对象。
如果不想通过创建别名来重命名共享的数据类型,可以创建⼀个 Simulink.NumericType 对象。将 IsAlias 属性设置为 false(默认值)。此⽰例说明如何使⽤ Simulink.NumericType 对象在同⼀模型中的两个查表模块之间共享输出数据类型。
1. 打开模型⽰例 sldemo_fuelsys。
sldemo_fuelsys
该模型在基础⼯作区中创建 Simulink.NumericType 对象。其中⼀个对象名为 s16En15。
2. 在命令提⽰符下,检查 s16En15 的属性。
s16En15
s16En15 =
NumericType with properties:
DataTypeMode: 'Single'
IsAlias: 0
DataScope: 'Auto'
HeaderFile: ''
Description: ''
此对象表⽰内置的 Simulink 数据类型 single。
3. 在模型中,导航到 fuel_rate_control/airflow_calc ⼦系统中。
4. 在Modeling选项卡上,点击Model Data Editor。在 Model Data Editor 中,检查Signals选项卡。
5. 在模型中,点击Pumping Constant模块的输出信号。Model Data Editor的Data Type列显⽰信号数据类型设置为s16En15。
6. 点击Ramp Rate Ki模块的输出信号。此模块的输出数据类型也设置为 s16En15。
7. 更新模块图,如有必要,可将Data Type列拉宽。该列的右侧显⽰两个查表模块使⽤数据类型single。
8. 在命令提⽰符下配置s16En15,以表⽰数据类型double。
s16En15.DataTypeMode = 'Double';
9. 更新模块图。
两个查表模块的输出信号现在都使⽤数据类型double。由于数据类型继承的缘故,其他信号(如 e0 和 e1)获得相同的数据类型。
要确保同⼀模型中的算法或数据路径之间数据类型等同,也可以使⽤诸如Data Type Porpagation和Data Type Conversion
Inherited之类的模块。使⽤这些模块时,不需要创建和永久存储数据类型对象。但是,不能使⽤此类模块在不同模型中的信号之间共享数据类型,除⾮这些模型位于同⼀个模型引⽤层次结构中。
为信号数据重⽤⾃定义 C 数据类型
在模型中,可以创建符合现有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。