指定信号范围
Simulink® 模块允许您为其输出信号指定有效值范围。指定信号范围有助于优化数据类型和改进生成的代码。
如果您有 Embedded Coder®,Simulink Coder™ 可以根据您为信号和参数指定的最小值和最大值来优化从模型生成的代码。此优化可删除算法代码,并影响某些仿真模式(如 SIL 或外部模式)的结果。有关详细信息,请参阅Optimize using the specified minimum and maximum values (Embedded Coder)。
允许信号范围设定的模块
以下模块允许您为其输出信号指定范围:
在模块中使用信号范围
要为大多数模块指定信号范围,请使用模块的输出最小值和输出最大值参数指定模块输出信号的有效值范围。例外包括 Data Store Memory、Inport、In Bus Element、Outport、Out Bus Element 和 Signal Specification 模块,对于这些模块,请使用其最小值和最大值参数指定信号范围。有关适用模块的列表,请参阅允许信号范围设定的模块。
要访问这些参数,请使用属性检查器(在建模选项卡上,在设计下,点击属性检查器)、模型数据编辑器(在建模选项卡上,点击模型数据编辑器)或模块对话框。
将最小值或最大值指定为表达式,该表达式计算为 double
数据类型的标量实数。例如,您可以使用:
字面数字,例如
98.884
。隐式数据类型为double
。数据类型为
double
的数值工作区变量(请参阅通过创建变量来共享和重用模块参数值)。使用此方法可在多个数据项之间共享最小值或最大值。当您使用变量设置
Simulink.ValueType
、Simulink.Signal
或Simulink.BusElement
对象的Min
或Max
属性时,变量的当前值将赋给该对象。对象的Min
和Max
属性不受变量将来更改的影响。
您指定的标量值适用于合成信号的每个元素(例如,当信号是非标量或总线时)。有关标量扩展的信息,请参阅输入信号和参数的标量扩展。
要将信号的最小值或最大值保留为未指定,请使用空矩阵 []
,这是默认值。
为建模结构指定范围
如果使用诸如总线、数据存储和 Stateflow® 图等建模结构,则可以使用不同方法来指定设计范围信息。使用表中的信息。
目标信号的描述 | 方法和详细信息 |
---|---|
数值复信号 | 当为数值复信号指定输出最小值或输出最大值时,指定的最小值和最大值分别适用于复数的实部和虚部。如果数字的实部或虚部中有任一项的值小于最小值或大于最大值,则复数在指定范围之外。不会对实部和虚部的任何组合(如 |
总线中的信号元素 | 如果通过使用 Bus Creator 模块组合总线,则可以对向 Bus Creator 模块馈送信号的上游模块指定范围信息。 无论您使用什么方法组合总线,都可以创建 |
MATLAB Function 模块中的信号 | 使用符号窗格和属性检查器来指定变量的最小值和最大值属性。请参阅Set General Variable Properties。 |
Stateflow 图中的信号 | 设置对应的 Stateflow 数据的最小值和最大值属性。请参阅限制范围 (Stateflow)。 |
与某个对象(如 | 设置 |
数据存储(Data Store Memory 模块或 | 对于 Data Store Memory 模块,请设置最小值和最大值模块参数。对于信号对象,请设置 |
信号范围错误故障排除
Simulink 提供一项名为仿真范围检查的诊断,可对仿真过程中信号超出其指定范围的情况进行检测。如果启用该诊断,Simulink 会将模块输出的信号值与指定范围(请参阅在模块中使用信号范围)和模块数据类型都进行比较。也就是说,Simulink 会执行以下检查:
DataTypeMin ≤ MinValue ≤ VALUE ≤ MaxValue ≤ DataTypeMax
其中
DataTypeMin
是模块数据类型可表示的最小值。MinValue
是模块应输出的最小值,即输出最小值指定的值。VALUE
是模块输出的信号值。MaxValue
是模块应输出的最大值,即输出最大值指定的值。DataTypeMax
是模块数据类型可表示的最大值。
注意
可以指定模块如何处理超过特定范围的信号。例如,您可以为两个信号范围参数都指定值(非默认值),并启用对整数溢出进行饱和处理参数。在这种情况下,Simulink 会显示一条警告消息,建议您禁用对整数溢出进行饱和处理参数。
启用仿真范围检查
要启用仿真范围检查诊断,请执行下列操作:
在您的模型窗口中,在建模选项卡上,点击模型设置。
Simulink 显示“配置参数”对话框。
在“配置参数”对话框左侧的选择树中,点击诊断 > 数据有效性类别。在信号下的右侧,将仿真范围检查诊断设置为错误或警告。
点击确定应用您的更改并关闭“配置参数”对话框。
有关详细信息,请参阅Simulation range checking。
使用仿真范围检查对模型进行仿真
要检查信号范围错误或警告,请执行下列操作:
对模型启用仿真范围检查诊断(请参阅启用仿真范围检查)。
在模型窗口中,点击运行以仿真模型。
Simulink 将仿真模型并执行信号范围检查。如果仿真范围检查诊断指定了错误,则当信号超出其指定范围时,Simulink 将停止仿真并生成错误(例如,在诊断查看器中)。
否则,如果仿真范围检查诊断指定了警告,则当信号超出其指定范围时,Simulink 会在 MATLAB® 命令行窗口中生成警告消息。这两类消息都会标识其输出信号超出其指定范围的模块,以及发生此违规的时间步。
虚拟模块的信号范围传播
某些虚拟模块(请参阅非虚拟和虚拟模块)允许您为其输出信号指定范围,例如 Inport 和 Outport 模块。当为包含这些模块的模型启用仿真范围检查诊断时,虚拟模块的信号范围反向传播到它接收其输出信号的非虚拟模块的第一个实例。如果非虚拟模块为它自己指定了不同的范围值,则 Simulink 会使用其中最窄的范围执行信号范围检查。也就是说,Simulink 使用较大的最小值和较小的最大值来检查信号。
例如,请参考以下模型:
在此模型中,Constant 模块将其输出最大值参数指定为 300,而 Inport 模块的该参数设置为 100。假设您启用仿真范围检查诊断并仿真模型。Inport 模块将其最大值反向传播到它前面的非虚拟模块,即 Constant 模块。然后,Simulink 使用两个最大值中较小者来检查 Constant 模块输出的信号。由于 Constant 模块输出的信号的值 (200) 超过最窄范围,Simulink 会生成错误。
对于精度或范围大于 double
的数据,生成意外错误或警告
当某数据项(信号或参数)使用 double
以外的数据类型时,在比较之前,Simulink 会将数据项和每个设计限制(您指定的最小值或最大值)转换为非双精度数据类型。此方法有助于防止产生不必要的误导性错误和警告。
但是,在比较之前,Simulink 会将设计限制存储为 double
数据类型。如果数据项的数据类型的精度高于 double
(例如,具有 128 位字长和 126 位小数长度的定点数据类型)或范围大于 double
,则 double
不能准确表示设计限制的值,此时 Simulink 可能会生成意外警告和错误。
如果非双精度类型具有更高的精度,请考虑将设计限制舍入为 double
可表示的距离零最远的下一个数字。例如,假设在将最大值设置为 98.8847692348509014
后,信号生成了错误。在命令提示符下,计算 double
可表示的距离零最远的下一个数字。
format long
98.8847692348509014 + eps(98.8847692348509014)
ans = 98.884769234850921
使用舍入后得到的数字 98.884769234850921
替换最大值。