在 Simulink 中,将 Inport 模块或 Data Store Memory 模块与 Simulink.Signal
对象关联,并生成全局变量以与底层代码交互,是实现模型与外部代码集成的常见方式。
虽然两者都可用于生成全局变量,但在使用方式、作用域控制和代码生成方面存在显著差异。
Inport 模块映射到 Simulink.Signal 对象
使用方式:
- 在模型中添加 Inport 模块,并在模型配置参数中设置其信号名称。
- 在 MATLAB 基础工作区或数据字典中创建一个同名的
Simulink.Signal
对象,并设置其存储类(如ExportedGlobal
或ImportedExtern
)。 - 在模型配置中启用“信号名称必须解析为 Simulink 信号对象”选项,以确保 Inport 模块的信号名称解析到相应的
Simulink.Signal
对象。
特点:
- 适用于模型的输入信号,通常用于与外部代码的数据交互。
- 生成代码时,Inport 模块对应的信号会作为全局变量出现,便于外部代码访问。
- 适合用于模型的顶层输入接口,便于与外部系统集成。
Data Store Memory 模块与 Simulink.Signal 对象关联
使用方式:
- 在模型中添加 Data Store Memory 模块,并指定数据存储名称。
- 在 MATLAB 基础工作区或数据字典中创建一个同名的
Simulink.Signal
对象,并设置其存储类。 - 在 Data Store Memory 模块的参数中启用“数据存储名称必须解析为 Simulink 信号对象”选项,以确保名称解析到相应的
Simulink.Signal
对象。 - 使用 Data Store Read 和 Data Store Write 模块在模型中读取和写入该数据存储。
特点:
- 适用于模型内部的全局数据共享,允许多个模块访问同一数据存储。
- 可在模型的不同层级中共享数据,支持更复杂的数据交互需求。
- 生成代码时,数据存储会作为全局变量出现,便于外部代码访问或多个模型实例共享数据。
Data Store Memory模块的优点
灵活性高
模型的不同子系统可以通过名称访问相同的 Data Store Memory
,不需要通过显式信号线连接
便于和手写代码集成
很多传统项目都有一定比例的手写代码,Data Store接口与Legacy C代码集成简单
Data Store Memory模块的缺点
数据流难以追踪
使用 Data Store 结构后,变量的读写关系不是通过线连接,而是通过“名字”隐式连接,这让模型的 数据依赖关系不透明。
不利于代码生成和可维护性
在代码生成和模型重构方面,全局数据访问可能带来隐式副作用
不易验证与测试
尤其是 Model-Based Design 中提倡“可追踪、可测试”的架构。