确定在何处存储 Simulink 模型的变量和对象
Simulink® 数据是指您在工作区(例如,基础工作区或数据字典)中创建的对象和变量。Simulink 数据包括:
模块参数(如
Simulink.Parameter
对象和 MATLAB® 变量)的数值信号,如
Simulink.Signal
对象由
Simulink.ValueType
对象定义的值类型数据类型
模型配置集
仿真输入和输出数据
您可以在适合自己设计的位置存储、分区和共享模型数据。您选择的存储位置可以取决于:
您的建模目的
模型架构(引用模型、子系统以及其他分区策略)和组件结构
您使用的数据类型
数据类型
仿真数据是指仿真的一组输入数据以及仿真生成的一组输出数据。例如,您可以使用变量来存储仿真通过 Inport 模块获取的输入数据,还可以使用 Outport 模块、To Workspace 模块和记录的信号来导出输出数据。有关加载、生成和存储仿真数据的详细信息,请参阅Comparison of Signal Loading Techniques和保存仿真数据。
设计数据是指您用来指定模型及其生成的代码中的模块参数和信号特性的一组变量和数据对象。例如,设计数据包括 MATLAB 数值变量、值类型对象、参数和信号数据对象。
您可以将设计数据存储在基础工作区、模型工作区或数据字典的“设计数据”部分。要永久存储模型的本地设计数据,请使用模型工作区。要在模型之间共享设计数据,请使用数据字典或基础工作区。数据字典会永久存储数据。通过使用数据字典,您可以对数据进行分区,以提高易读性并简化维护工作,还可以跟踪更改。如果您使用基础工作区,要永久存储数据,则必须将其保存在 MAT 文件中,或创建一个可以重新生成数据的 MATLAB 脚本。
架构数据由模型接口组成,如端口接口、数据类型、系统级常量及其平台属性,这些属性在 Simulink 和架构模型之间共享。
您可以将模型的架构数据存储在 Simulink 数据字典的“架构数据”部分中。要添加、编辑或删除此数据,您可以使用Architectural Data Editor。有关详细信息,请参阅Graphically Manage Shared Interfaces, Data Types, and Constants。您还可以使用对象 API
Simulink.dictionary.ArchitecturalData
。有关详细信息,请参阅Create Architectural Data Object and Use It to Configure Architectural Data。要将设计数据移至“架构数据”部分,请在模型资源管理器中右键点击设计数据对象,然后从上下文菜单中选择视为架构数据。配置
配置集是指一组模型配置参数。默认情况下,配置集位于模型文件中,因此您不需要将配置集与模型分开存储。但是,您不能与其他模型共享配置集。
要在模型之间共享配置集,必须创建
Simulink.ConfigSet
对象。每个对象代表一个独立的配置集。您可以将这些对象存储在基础工作区或数据字典的 Configurations 分区。如果使用数据字典,您可以定义每个配置集的范围、比较配置集的不同之处,还可以跟踪更改。数据字典本身会将配置集与其他类型的数据放入不同的分区中。变体配置对象存储有关变体配置、激活变体和默认变体设置以及与每一种配置关联的控制项变量定义的相关信息。您可以使用变体管理器在数据字典或基础工作区中创建和编辑变体配置对象。有关详细信息,请参阅Variant Manager for Simulink。
数据存储的类型
数据存储的类型包括:
MATLAB 基础工作区 - 当您使用临时模型进行试验时,可使用基础工作区存储变量。
模型工作区 - 使用模型工作区永久存储模型的局部数据。
数据字典 - 使用数据字典永久存储全局数据、在模型之间共享数据,并跟踪对数据所做的更改。
下表比较每个存储位置的特点。
数据存储类型 | 文件存储 | 模型-数据分离 | 与磁盘上的源文件同步 | 不同模型对应不同数据 | 可见性 |
---|---|---|---|---|---|
基础工作区 |
| 是 | 否 | 否 | 全局 |
模型工作区 | 模型文件 (.slx )、.m 或 .mat | 可选: | 是(模型初始化时同步) | 是 | 局部 |
数据字典 | Simulink 数据字典文件 (.sldd ) | 是 | 是 | 是 | 共享 |
除了这些特点,数据字典还提供:
配置集的更改跟踪
需求链接
有关模型如何与工作区和工作区变量进行交互的信息,请参阅符号解析。
临时数据:基础工作区
在以下情况下,请使用基础工作区临时存储数据:
当您学习使用 Simulink 时
当您使用建模技术进行试验需要快速建模变量时
当您不需要永久存储数据时
要在基础工作区中创建变量,您可以使用 MATLAB 命令提示符或模型资源管理器。默认情况下,所有打开的模型都可以使用您在基础工作区中创建的数据。要封装您的模型,您可以选择禁用对基础工作区的访问(请参阅继续使用基础工作区的共享数据)。
如果您使用变量来指定模型中的数值模块参数,您可以在仿真过程中通过在命令提示符下使用命令以编程方式更改参数值。
要在结束 MATLAB 会话之前永久存储基础工作区数据,请将数据保存到 MAT 文件或脚本文件中。在以后的会话中,您可以从该文件中加载数据。但是,如果您对基础工作区中的数据进行了更改,则必须重新将数据保存到该文件中。随着工程规模的扩大,您可以考虑改用模型工作区或数据字典来永久存储数据。
局部数据:模型工作区
每个模型都有自己的工作区,用于存储变量值。模型工作区中的变量仅在该模型的作用域中可见。模型工作区从数据源初始化,该数据源可以是模型文件、MATLAB 文件或存储在模型文件中的 MATLAB 代码。
使用模型工作区存储仅在关联模型中使用的数据。这些数据可以包括:
模型参数,例如您用于指定模块参数值的数值变量
数据对象,例如您用于控制参数特性的
Simulink.Parameter
对象模型参量
通过将数据存储在模型工作区中,可以提高模型的可移植性并确定数据的所有权。在这种情况下,模型文件永久存储数据。
在模型引用层次结构中,每个模型工作区相当于一个唯一的命名空间。因此,您可以在多个模型工作区中使用同一个变量名称。然后,您可以为每个模型赋予不同值。
您可以使用模型资源管理器来操作模型工作区数据。也可以将命令提示符或脚本与模型工作区编程接口结合使用。
有关使用模型工作区存储局部数据的详细信息,请参阅模型工作区。
全局数据和共享数据:数据字典
数据字典是一个独立的文件,用于永久存储数据。与头文件类似,数据字典在模型之外提供可以存储和共享数据定义的位置。可以使用数据字典代替基础工作区来分区数据、跟踪更改、控制访问和共享数据。如果将模型链接到数据字典,仍可以通过配置从模型或字典访问的基础工作区使用基础工作区中的变量。请参阅继续使用基础工作区的共享数据。
可以使用数据字典存储多个模型或系统组件共享的数据。这些数据可以包括:
多个模型用来指定模块参数值的数值变量。
您用来同时为多个模型指定数据类型的
Simulink.AliasType
和Simulink.NumericType
对象。数据对象,包括使用
Auto
之外的存储类的信号对象(例如Simulink.Signal
)。如果您拥有 Simulink Coder™ 许可证,则这些对象可以代表在生成的代码中显示为全局变量的信号和可调参数。Simulink.ValueType
和Simulink.Bus
对象,用于定义模型组件(如引用模型)的接口。您用来在多个模型之间维护配置参数一致性的
Simulink.ConfigSet
对象。您使用
Simulink.data.dictionary.EnumTypeDefinition
对象存储的枚举类型定义。
要使用数据字典中定义的数据,必须将数据字典关联到模型。您可以使用这种关联在一组特定模型之间共享数据。
如果您使用数据字典,则可以通过将数据存储在其他引用字典中对数据进行分区。由于一个层次结构中的各数据字典共享相同的命名空间,因此,数据字典层次结构中的每个条目都必须使用唯一名称。同一个符号的多个定义只有在其类类型和属性值相同的情况下才可使用。有关详细信息,请参阅模型层次结构中的数据一致性。
此外,您还可以使用数据字典将数据与自定义模块库相关联。如果您在关联到库的数据字典中定义了数据对象(如总线和枚举类型),则当库用户将模块从库拖到其模型时,他们将自动获得对该数据字典中包含的数据类型的访问权限。有关详细信息,请参阅Attach Data Dictionary to Custom Libraries。
使用模型资源管理器编辑字典数据。也可以将命令提示符或脚本与数据字典编程接口结合使用。
有关数据字典的详细信息,请参阅什么是数据字典?
自定义外部文件源
如果您使用 Simulink.SimulationInput
对象通过不同变量集对模型进行仿真,则可以将这些变量集存储在自定义外部文件源中。要从外部文件加载数据,请执行以下操作:
针对您的自定义文件格式(例如
.xlsx
或 XML)编写、测试和注册文件适配器。有关详细信息,请参阅Create External File Adapter for Loading Variables into Simulink.SimulationInput Object。使用您的自定义文件适配器,通过
loadVariablesFromExternalSource
加载仿真变量。
代码生成的注意事项
如果您打算从模型生成 C 代码 (Simulink Coder),请考虑下列注意事项。
如果将
Auto
以外的存储类应用于信号对象(例如Simulink.Signal
)来控制生成代码中的信号或模块状态的出现,则不能将对象存储在模型工作区中,而应将对象存储在基础工作区或数据字典中。有关信号和状态的存储类的详细信息,请参阅C Data Code Interface Configuration for Model Interface Elements (Simulink Coder)。如果将
Auto
以外的存储类应用于参数对象(例如Simulink.Parameter
),则可以将对象存储在基础工作区、模型工作区或数据字典中。但是,如果将对象存储在模型工作区中,则代码生成器将假定此模型拥有该参数。有关详细信息,请参阅存储位置对参数对象的代码生成的影响 (Simulink Coder)。如果您将
AUTOSAR.Parameter
对象存储在模型工作区中,代码生成器将忽略您为该对象指定的存储类。
管理工程的数据存储
对于小型工程,基础工作区便于存储设计数据。特别是,基础工作区适用于下列各项:
非正式工作流
快速原型
快速参数调节
单人开发工程
基础工作区提供了易访问性和全局可见性。但是,基础工作区中的数据存储是临时性的。为了在会话之间保留该数据,必须将其保存到脚本或 MAT 文件中。
小型工程的其他选择包括:
模型工作区 - 通过在模型中提供永久的设计数据存储,以提高独立模型的可移植性。
数据字典 - 在模型外提供永久的设计数据存储。
您可以同时将模型工作区和数据字典与基础工作区结合使用。这样做就提供了一个桥梁,让您可以随着工程复杂度的增加,将数据单独迁移到模型工作区和数据字典。
虽然基础工作区适用于小型单用户工程和快速原型构建,但是,对于需要封装、分布式开发和限定作用域的数据的更复杂工程,该解决方案的扩展性不佳。复杂工程涉及到引用模型或子系统引用的层次结构。无论层次结构包含何种类型的模型,您都可以根据数据的预期可见性来确定设计数据分布。为了构建可扩展的系统,设计数据分布的目标是尽可能保持数据的局部可见性。
下表显示了存储、分区以及管理设计数据和配置集时可以选择的方式。
建模场景 | 场景描述 | 存储位置和方式 |
---|---|---|
快速原型和模型试验 | 您在学习如何使用 Simulink,您希望创建一些临时数据,例如,用来指定数值模块参数的变量。 您要使用各种建模技术进行试验。 您不需要永久存储创建的数据。 | 将数据存储在基础工作区中,从而可以快速创建和更改数据。 |
独立模型 | 您有一个模型,它不依赖于其他系统中的数据。该模型是独立的,因为它不属于一个大系统的一部分。 | 将数据存储在模型工作区中,以提高模型的可移植性。对于不能存储在模型工作区中的数据,可以使用数据字典来存储。 也可以将所有模型数据都存储在数据字典中。 |
一个分解成多个模型的系统 | 大型系统分解成多个模型,这些模型位于引用模型的层次结构中,数据定义在父模型和子模型之间共享。 | 将本地模型数据存储在每个模型工作区中。 将系统范围内的定义(如公共类型、参数和常量)存储在由所有模型引用(直接或通过另一个数据字典)的一个数据字典中。 将模型共享数据(如总线对象和配置集)存储在数据字典中。将层次结构中的所有模型与数据字典链接起来。 |
组件系统 | 可重用的组件,例如库或模型引用,它们是为实现团队或组织间的高度重用而设计的。 | 将本地模型数据存储在模型工作区中。 通过使用封装参数或模型参量来参数化库模块或模型模块。 对于每个可重用的组件,将该组件的接口所需的数据类型存储在单独的数据字典中,并将模型或库与该数据字典相关联。 |
模型层次结构中的数据一致性
模型层次结构中的数据字典可以包含同一符号的多个定义。对于要更新的模型,对单个模型可见的重复符号定义(来自基础工作区、连接的 Simulink 数据字典或可见库字典)必须一致。当符号名称、类类型和属性值相同时,符号定义是一致的。
例如,模型 M1
可以在两个存储位置看到变量 K
的定义。在这种情况下,K
的定义必须一致。
如果同一符号的定义是一致的,您可以在普通、加速和快速加速模式下仿真模型,并为模型生成代码。不支持在接口字典或链接到架构模型的数据字典中定义的重复符号。
注意
当一个模型可以看到一个符号的多个一致定义时,模型数据编辑器只显示其中一个定义并以 Simulink.findVars
形式返回该定义。模型在仿真期间使用的就是此定义。
只要在同一模型中可见的重复符号是一致的,通过将模型属性 EnforceDataConsistency
设置为 off
,当前模型及其在模型层次结构中的下级模型可以使用名称相同但值不同的符号。在“模型属性”对话框中的外部数据选项卡上,清除在引用模型之间强制应用一致的数据定义复选框。您也可以通过使用 set_param
函数以编程方式将该参数设置为 off
。
set_param(bdroot,'EnforceDataConsistency','off');
例如,模型 M2
和 M3
各有变量 K
的单个定义,但模型层次结构中存在 K
的多个定义。通过在模型 M1
中关闭数据一致性检查,模型 M2
和 M3
可以继续采用变量 K
的不同值。
您可以关闭数据一致性检查,以集成来自不同供应商的使用相似变量名称的组件。您可以使数据一致性检查处于打开状态,以在一个组织内集成组件,从而确保这些组件在相同的条件下运行。
默认情况下,EnforceDataConsistency
参数设置为 on
。对于模型,您不能将 EnforceDataConsistency
设置为 on
,除非其每个引用模型及其变体也将 EnforceDataConsistency
设置为 on
。
将 EnforceDataConsistency
设置为 off
会导致以下错误:
代码生成
软件在环 (SIL) 和处理器在环 (PIL) 仿真
受保护模型的仿真
创建模型引用仿真目标时(针对仿真期间的加速和快速加速模式),如果某个符号有多个一致的定义,Simulink 会通过将数据字典名称与符号名称串联起来为该符号生成唯一标识符。如果生成的标识符超出 64 个字符的最大允许长度,Simulink 将强制应用数据一致性,而不管 EnforceDataConsistency
设置如何。