1. 写在前面:为什么需要 DataStoreMemory
在 Simulink 建模过程中,我们经常会遇到一个看似简单却容易绕弯的需求:多个子系统之间共享一份数据。
初学阶段,大家习惯直接把信号线从一个模块连到另一个模块,这是最直观的方式。但当系统规模变大后,信号线会越来越密、交叉越来越多,模型可读性会迅速下降。到后期维护时,光是一根根信号线的追踪就得花掉不少时间。另一个典型场景是:整车控制器模型、电池管理系统模型或电机控制模型里,往往有一个全局性的状态量,比如“当前车速”“系统运行模式”“电池 SOC”,这些量需要被很多子系统同时读取甚至写入,如果每条线都手动连线,模型会变得非常庞杂。
这时候,Simulink 常用模块库中的DataStoreMemory(数据存储内存)模块就派上了用场。它相当于在模型中创建了一块全局共享内存区,配合 Data Store Read(数据读取)和 Data Store Write(数据写入)模块,可以让多个子系统在任意位置安全地访问同一份数据,而不需要把信号线一路拖过去。
本文将完整拆解 DataStoreMemory 模块的原理、配置方式、实战案例、常见报错与工程建议。无论你是刚接触 Simulink 的学生,还是在做模型开发与代码生成的工程师,都可以从本文获得一套可直接落地的使用思路。
2. DataStoreMemory 核心概念
2.1 它到底是什么
先给一个通俗的理解:DataStoreMemory 可以类比编程语言里的全局变量,只不过它活在 Simulink 的模型世界里。
在这个比喻下:
- DataStoreMemory 模块负责“声明和存储”这个全局变量。
- Data Store Read 模块负责“读取”该变量的当前值。
- Data Store Write 模块负责“写入”新值到该变量。
把三者组合使用,相当于你给模型开辟了一块公共数据区。不同子系统之间不再需要把信号线绕来绕去,而是直接通过这块公共数据区完成数据交互。
专业一点说,DataStoreMemory 在 Simulink 中是一种数据存储对象,它拥有独立的存储空间和生命周期,并且可以在整个模型层次结构中被解析。它可以在子系统内部、模型引用层次、甚至生成的 C 代码中映射为一块真实内存区域。
2.2 三个模块的分工
先认识一下这三个模块在模块库中的位置:
- Simulink 库浏览器中,路径为
Simulink / Signal Attributes / Data Store Memory。 Data Store Read和Data Store Write同样位于Simulink / Signal Attributes下。
它们的分工非常清晰:
| 模块 | 作用 | 必须条件 |
|---|---|---|
| Data Store Memory | 声明一块数据存储区,并配置数据类型、初始值、存储类型 | 一个模型中至少有一个 |
| Data Store Read | 读取该存储区当前值,输出到下游模块 | 必须关联到某个 Data Store Memory / 数据存储对象 |
| Data Store Write | 将输入端口的数据写入该存储区 | 必须关联到某个 Data Store Memory / 数据存储对象 |
需要注意的是,DataStoreMemory 本身不负责数据的“写入逻辑”,它只是存储容器。真正产生“写”动作的是 Data Store Write 模块,真正产生“读”动作的是 Data Store Read 模块。只要同一模型中没有同名的另一个存储区域,这些 Read 和 Write 都能自动匹配到对应的 DataStoreMemory 上。
2.3 与普通信号线的区别
很多初学者会问:“既然已经有信号线,为什么还要用 DataStoreMemory?”
这张表可以帮你快速理清差异:
| 对比项 | 信号线(Signal Line) | DataStoreMemory |
|---|---|---|
| 连接方式 | 需要通过 Goto/From 或直接连线跨越子系统边界 | 无需连线,通过模块名称关联 |
| 适用场景 | 局部信号传递、流程清晰的小模型 | 全局数据共享、多子系统同步访问 |
| 可维护性 | 线多时模型混乱 | 模块化清晰,但需要管理命名 |
| 代码生成 | 局部变量 | 可映射为全局变量 |
| 调试 | 通过 Signal Logging 查看 | 同样可以通过 Data Store Logging 查看 |
这里有一个非常关键的点:DataStoreMemory 不是用来取代所有信号线的。它适合“少量但多访问点”的数据,比如系统状态、模式字、使能标志、标定值等。如果你把大量连续计算的中间信号也塞进 DataStoreMemory,反而会破坏模型的层级关系,增加耦合度。
3. 环境准备与版本说明
本文所有操作基于常见 MATLAB / Simulink 环境。由于不同 MATLAB 版本之间界面布局有一些差异,本文不会把某个具体版本的全部细节写死,而是展示通用操作路径。
- 操作系统:Windows 10 / 11,或 Linux、macOS 均适用。
- 软件环境:MATLAB 与 Simulink,建议 R2020a 之后的版本(不同版本中模块位置基本一致)。
- 需要安装工具箱:Simulink 基础环境即可,不强制要求额外工具箱。
- 辅助工具:Simulink Scope、Simulink Signal Logging 等基础模块。
如果你的版本较老,比如 R2016a 以下,DataStoreMemory 模块的配置对话框布局可能会有差异,但核心参数是基本一致的。
版本确认方式:在 MATLAB 命令行窗口输入以下命令,可以查看当前版本信息。
ver('simulink')输出结果中包含 Version 和 Release 信息。例如:
Simulink Version 10.6 (R2022a)如果你是学生或评估用户,也可以直接使用 MATLAB Online 进行练习,DataStoreMemory 相关操作是一致的。
4. DataStoreMemory 模块参数详解
4.1 从模块库中拖入模型
打开 Simulink 库浏览器:
simulink在弹出的 Library Browser 中,定位到:
Simulink / Signal Attributes / Data Store Memory直接拖拽到模型画布中即可。同样的方式,在 Signal Attributes 库中还可以找到 Data Store Read 和 Data Store Write。
如果你更喜欢用命令行方式快速添加模块,可以在 MATLAB 命令行中执行脚本,例如:
% 创建新模型 new_system('demo_dsm'); open_system('demo_dsm'); % 添加 Data Store Memory add_block('simulink/Signal Attributes/Data Store Memory', ... 'demo_dsm/DataStoreMemory1'); % 添加 Data Store Read add_block('simulink/Signal Attributes/Data Store Read', ... 'demo_dsm/DataStoreRead1'); % 添加 Data Store Write add_block('simulink/Signal Attributes/Data Store Write', ... 'demo_dsm/DataStoreWrite1');这种方式适合需要批量搭建模型或做模型自动化的用户。
4.2 核心参数设置
双击 DataStoreMemory 模块,打开参数对话框,主要关注以下配置项。
数据存储名称(Data store name)
这是最重要的参数。Data Store Read 和 Data Store Write 通过这个名字自动关联到相应的 DataStoreMemory。命名建议使用有业务含义的英文标识符,例如VehicleSpeed、BatterySOC、SystemMode。
初始值(Initial value)
该数据区域在仿真开始时的默认值。支持写成 MATLAB 表达式,例如0、[0 0 0]、ones(4,1)等。如果留空,则使用数据类型的默认值,但工程上建议显式指定初始值,避免不可控行为。
数据类型(Data type)
可以是内置类型,例如double、single、int32、boolean,也可以指定总线类型Bus: xxx,或者使用Simulink.AliasType自定义的别名类型。对于控制逻辑模型,推荐根据实际需求选择合适位宽,不要一律用 double。
信号属性(Signal Attributes)
这里可以指定存储类型(Storage Class),比如:
Auto:由 Simulink 自动决定。SimulinkGlobal:映射为生成的 C 代码中全局变量。ExportedGlobal:导出为外部可访问的全局变量。
在普通仿真阶段,通常保持 Auto 即可。在做 Embedded Coder 代码生成时,才会用到 Storage Class 相关配置。
作用域(Scope)
DataStoreMemory 可以放在模型的顶层,也可以放在子系统内部。两者区别在于可见范围:
- 放在顶层时,整个模型及其所有子系统都能访问。
- 放在某个子系统内部时,默认情况下,该子系统及其下层子系统可以访问,但模型其他部分不能直接读。
如果不希望全局共享,建议把 DataStoreMemory 放在所需子系统内部,缩小作用域,降低耦合。
4.3 Data Store Read / Write 的关联逻辑
Data Store Read 和 Data Store Write 模块的参数对话框中,同样需要填写 Data store name。只要名称一致,Simulink 就会自动建立关联。
在一个模型中,允许存在多个 Read 和多个 Write 对应同一个 DataStoreMemory。也就是说,读取点可以有多个,写入点也可以有多个。但在同一仿真时刻、同一数据存储区域上,如果有多个 Write 同时写入,可能出现数据竞争问题,Simulink 会报错或产生不确定结果。具体见第 7 节。
4.4 Data Store Memory 模块外观显示
当模型中有多个 Data Store Read / Write 模块时,建议打开模块的名称显示,方便追踪。选中模块后,按键盘快捷键Ctrl+Shift+F或右键选择 Format,可以调整名称显示方式。
另外,DataStoreMemory 模块默认会显示一个带有“信号线”风格的端口图标。我们可以通过Display / Blocks / Port Values来开启模块端口的实时值显示,这在调试时非常有用。
5. 工作原理与数据流分析
5.1 数据写读的先后关系
在 Simulink 中,Data Store Write 和 Data Store Read 的执行顺序不是随意的,它由模型的数据依赖关系决定。如果 Read 模块直接依赖 Write 模块的输入,那么 Simulink 会在同一仿真步内先执行 Write,再执行 Read。
考虑下面一个场景:
- 子系统 A 中有一个 Data Store Write,写入
SystemMode = 1。 - 子系统 B 中有一个 Data Store Read,读取
SystemMode并送入显示模块。
如果 A 和 B 之间没有任何直接信号连接,Simulink 会尝试通过数据依赖关系自动推断排序。但这里有一个常见坑点:如果多个 Write 在同一个仿真步内以无依赖的顺序执行,Simulink 将无法判断哪一个值最终生效,从而报错或产生随机结果。
因此,在设计阶段就要想清楚写入逻辑,尽量保证同一存储区在同一个仿真步内只有一个写入源。
5.2 仿真过程中的内存行为
从仿真角度理解,DataStoreMemory 的值在仿真开始时被初始化为你设定的 Initial value。每个仿真步内,如果有 Data Store Write 执行,则该存储区的值被更新。Data Store Read 读到的值,是当前仿真步中已经更新后的值,或在没有写入时读取初始值。
我们可以用下面这个简单的数据流来理解:
[子系统A] --Data Store Write--> [DataStoreMemory] --Data Store Read--> [子系统B]这个过程中,DataStoreMemory 本身并不参与计算,它只是一块“共享内存”。
5.3 示例:物理世界中的类比
我们在做整车模型时经常用 DataStoreMemory 存储“当前车速”。底盘子系统根据轮速计算车速,写入 DataStoreMemory;仪表显示子系统、车身控制子系统、动力控制子系统都通过 Data Store Read 读取这个车速值。
这种模式下,各子系统之间不需要连接复杂的信号线。只要定义了统一的 Data Store 名称和数据类型,任何一个子系统都能获取到当前车速值。这也是 DataStoreMemory 在大型模型中最常见的用途之一。
6. 完整实战案例:电机控制系统中的工作模式共享
下面我们通过一个完整的案例,演示 DataStoreMemory 从建模到仿真的全过程。
6.1 案例需求
假设我们要搭建一个简单的电机控制模型,包含三个部分:
- 模式决策子系统:根据外部输入决定电机工作模式(0 表示停机,1 表示正转,2 表示反转)。
- 功率计算子系统:根据工作模式和输入转速,计算当前输出功率。
- 结果显示区:通过 Display 模块查看工作模式与功率。
在这个模型中,MotorMode将由模式决策子系统写入 DataStoreMemory,而功率计算子系统和结果显示区分别通过 Data Store Read 读取该值。
6.2 创建模型与添加模块
首先创建新模型:
new_system('demo_motor_dsm'); open_system('demo_motor_dsm');然后添加以下模块:
- 一个 Constant 模块作为模式源输入。
- 一个 Data Store Memory,命名
MotorMode。 - 一个 Data Store Write,用于写入模式。
- 一个 Data Store Read,用于读取模式。
- 一个 Constant 模块作为转速输入。
- 一个 Product(乘法)模块计算功率。
- 两个 Display 模块分别显示模式与功率。
- 一个子系统(Subsystem),里面包含 Data Store Write 和其输入逻辑。
为了让操作更清晰,这里直接用脚本搭建模型底框:
% 添加常量模块:模式指令 add_block('simulink/Sources/Constant', 'demo_motor_dsm/ModeCmd'); set_param('demo_motor_dsm/ModeCmd', 'Value', '1'); % 添加常量模块:转速 add_block('simulink/Sources/Constant', 'demo_motor_dsm/Speed'); set_param('demo_motor_dsm/Speed', 'Value', '200'); % 添加 Data Store Memory add_block('simulink/Signal Attributes/Data Store Memory', ... 'demo_motor_dsm/MotorModeMem'); set_param('demo_motor_dsm/MotorModeMem', 'DataStoreName', 'MotorMode'); set_param('demo_motor_dsm/MotorModeMem', 'InitialValue', '0'); % 添加 Data Store Write add_block('simulink/Signal Attributes/Data Store Write', ... 'demo_motor_dsm/MotorModeWrite'); set_param('demo_motor_dsm/MotorModeWrite', 'DataStoreName', 'MotorMode'); % 添加 Data Store Read add_block('simulink/Signal Attributes/Data Store Read', ... 'demo_motor_dsm/MotorModeRead'); set_param('demo_motor_dsm/MotorModeRead', 'DataStoreName', 'MotorMode'); % 添加 Product 模块:功率 = 模式系数 * 转速 add_block('simulink/Math Operations/Product', 'demo_motor_dsm/PowerCalc'); % 添加 Display 模块 add_block('simulink/Sinks/Display', 'demo_motor_dsm/ModeDisplay'); add_block('simulink/Sinks/Display', 'demo_motor_dsm/PowerDisplay');6.3 完成信号连接
上面的脚本生成的是未连接的模块。要完成实际模型,可以直接在 Simulink 窗口中连线,也可以使用add_line命令连线。
从连线角度,我们需要建立以下关系:
ModeCmd常量输出连接到MotorModeWrite的输入。MotorModeWrite输出连接到MotorModeRead的输入(用于在顶层拉通数据流,实际上 Data Store Read 并不需要物理输入,但为了模型层次完整,可以这样安排,也可以直接用 Display 接收 Read 输出)。MotorModeRead输出连接到ModeDisplay。Speed常量输出连接到PowerCalc的第一个输入。MotorModeRead输出连接到PowerCalc的第二个输入(用模式值作为功率系数)。PowerCalc输出连接到PowerDisplay。
使用命令补齐部分连线:
add_line('demo_motor_dsm', 'ModeCmd/1', 'MotorModeWrite/1', 'autorouting', 'on'); add_line('demo_motor_dsm', 'MotorModeWrite/1', 'MotorModeRead/1', 'autorouting', 'on'); add_line('demo_motor_dsm', 'MotorModeRead/1', 'ModeDisplay/1', 'autorouting', 'on'); add_line('demo_motor_dsm', 'Speed/1', 'PowerCalc/1', 'autorouting', 'on'); add_line('demo_motor_dsm', 'MotorModeRead/1', 'PowerCalc/2', 'autorouting', 'on'); add_line('demo_motor_dsm', 'PowerCalc/1', 'PowerDisplay/1', 'autorouting', 'on');如果不习惯命令行建图,直接在图窗中拖拽连线也可以。连线完成后,模型结构大致如下:
- 左侧是控制信号源。
- 中间是 DataStoreMemory 及其读写模块。
- 右侧是显示与计算模块。
6.4 运行仿真与验证
设置仿真停止时间,比如10,然后运行:
set_param('demo_motor_dsm', 'StopTime', '10'); sim('demo_motor_dsm');仿真结束后,观察ModeDisplay和PowerDisplay。由于ModeCmd恒为 1,MotorMode被写为 1,所以ModeDisplay显示 1。转速恒为 200,功率则等于MotorMode * Speed = 1 * 200 = 200,因此PowerDisplay显示 200。
这个案例虽然简单,但已经完整展示了 DataStoreMemory 的读写流程。你可以将ModeCmd改为 Pulse Generator 等动态信号源,观察模式值在仿真过程中的动态变化。
6.5 添加数据记录
如果需要记录数据存储的值,可以在 DataStoreMemory 模块上右键,选择Properties,然后在日志记录(Logging)选项卡中勾选记录数据存储数据。也可以用命令设置:
set_param('demo_motor_dsm/MotorModeMem', 'DataLogging', 'on');仿真后,获取记录结果:
out = sim('demo_motor_dsm');在out返回的结果中,可以通过日志变量查看到MotorMode的变化序列。这对于分析与调试非常有帮助。
7. 常见问题与排查思路
在实际使用中,DataStoreMemory 相关报错出现频率很高。下面整理了几个常见问题。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 模型报错:Data store memory not found | Data Store Read/Write 中填写的名称在模型中没有对应的 DataStoreMemory | 检查名称拼写与大小写,确认 DataStoreMemory 是否在模型的当前层次结构或上层结构中 |
| 报错:Multiple writes to the same data store | 同一个仿真步内多个 Write 模块写同一个存储区,且无法确定执行顺序 | 梳理写入逻辑,保证同一存储区同一时间只有一个写入源;必要时合并写入点 |
| Data Store Read 读到的初始值不变 | Write 模块没有执行;或者 Write 与 Read 之间存在执行顺序错误 | 检查 Write 模块是否在 enabled 子系统内部且子系统未触发;检查是否存在数据依赖关系 |
| 代码生成时出现全局变量冲突 | Data Store 的 Storage Class 设置与其他模块变量重名 | 在 Embedded Coder 中设置合理的 Storage Class 与命名空间 |
| DataStoreMemory 放在子系统内但其他子系统读取不到 | 作用域限制导致 | 将 DataStoreMemory 放到模型顶层,或使用模型级数据存储对象 |
| 初始值设置后提示类型不匹配 | 初始值字符串与数据类型不兼容 | 将初始值字符串改为明确类型匹配的表达式,例如uint8(0) |
| 仿真速度异常变慢且有大量数据记录 | 打开了过多 Data Store 的日志记录 | 只对需要分析的数据存储开启 DataLogging |
7.1 排查示例:初始值一直不更新
一个比较典型的排查过程如下。
现象:模型中 ModeDisplay 一直显示 0,但 ModeCmd 已经改为 1。
排查步骤:
- 双击 DataStore Write 模块,确认 Data store name 拼写正确。
- 检查 DataStore Write 的输入是否正确连接。
- 检查 DataStore Write 是否处于 enabled 子系统内,以及子系统是否被触发。
- 在仿真前将 StopTime 设为合适值,打开 Data Store Logging,查看实际写入值。
- 如果发现某个仿真步确实没有写入,就需要检查子系统外层是否被 disable。
通过这种逐步排查,大多数“读取不到新值”的问题都能定位到触发条件或连接错误上。
7.2 多写入点冲突的解决思路
如果模型要求允许多个模块写入同一个状态,可以采用“仲裁”设计:
- 将所有写入请求集中到同一个 Data Store Write 模块,由上游模块先完成逻辑运算,再用最终值写入。
- 或者把一个状态拆分为多个独立 Data Store,例如
MotorModeCmd和MotorModeActual,在不同阶段分别写入。
这种设计能规避 Simulink 对多写点的限制,也让模型逻辑更清晰。
8. 进阶应用:与代码生成、数据字典的配合
8.1 代码生成中的数据存储
如果使用 Simulink Coder / Embedded Coder 生成 C 代码,DataStoreMemory 会对应生成一个全局变量。默认情况下,生成的变量名通常基于 Data store 名称,经过一定规范化。例如,名为MotorMode的 DataStoreMemory,生成的变量可能类似rtDW_MotorMode或直接为MotorMode,具体取决于配置。
在模型配置参数中:
Code Generation > Interface > Data Store可以调整数据存储的存储类型、全局变量命名规则等。如果希望变量在生成代码中保持易读的名字,建议 Data store 名称遵循 C 语言标识符规范,不要包含中文或特殊字符。
8.2 利用数据字典统一管理
在大型项目中,通常不建议把 DataStoreMemory 直接散落在模型的各个层面,而是通过 Simulink 数据字典(.sldd)统一管理数据存储对象。
在数据字典中,可以创建一个Simulink.Signal对象,并勾选Data Store相关的属性,然后在模型中使用Data Store Memory时选择引用该对象。这样便于统一数据类型、初始值、存储类型,方便团队协作和版本管理。
具体操作路径:
- 使用
Simulink.DataDictionary.create创建或打开已有字典。 - 在字典中添加
Simulink.Signal对象,命名MotorMode。 - 设置其 DataType、InitialValue。
- 在模型中的 DataStoreMemory 模块中,勾选“从数据字典解析名称”。
- 将数据字典关联到模型的 Model Properties 中。
这样当多个模型共享同一个数据字典时,DataStoreMemory 的定义可以被复用,避免每个模型各自维护一份初始值,一致性更好。
8.3 在模型引用(Model Reference)中的注意事项
如果你的项目使用了 Model Reference,也就是将多个子模型作为独立模型引用,那么 DataStoreMemory 的作用域管理就变得更加重要。
- 被引用模型内部定义的 DataStoreMemory,默认只能在该模型内部使用,外部模型不可见。
- 如果希望在不同模型之间共享数据,应使用数据字典定义数据存储对象。
- 建议被引用模型的接口尽量通过输入输出端口传递数据,DataStoreMemory 只用于模型内部共享状态,避免跨模型的数据耦合。
这些细节在实际项目开发中直接影响编译与集成效率。
9. 最佳实践与工程建议
DataStoreMemory 用得好,模型会非常清爽;用不好,模型会出现隐晦的数据竞争和维护难题。下面几条经验来自实际开发中的沉淀。
9.1 命名规范
Data Store 的名称本质上是全局标识符。推荐使用“模块前缀 + 业务含义”的命名方式,例如:
Ctrl_MotorModeCtrl_VehicleSpeedBMS_SOCVCU_SystemState
建议方案:
- 使用英文,不包含中文。
- 统一使用驼峰或者下划线风格,不要混用。
- 在命名中包含所属系统缩写,避免多个系统之间重名。
- 禁止使用
data1、temp这类无意义名称。
9.2 合理控制作用域
不在模型顶层放置过多的 DataStoreMemory。只在真正需要跨子系统共享的数据上使用。如果一个数据只在某个子系统内部使用,就把它定义在该子系统内部。
这样做的好处是:
- 降低模型耦合度。
- 避免误写导致的全局状态污染。
- 让模型在代码生成时更容易优化。
9.3 显式设置初始值与数据类型
不要依赖默认值,每个 DataStoreMemory 都应显式设置:
- DataType 与源数据保持一致。
- InitialValue 根据业务逻辑定义,不能留空。
- 存储类型按代码生成需求设置。
对于不同的系统状态,建议为每个 DataStoreMemory 写一行注释,说明:
- 该数据由谁来写入。
- 该数据被哪些模块读取。
- 取值范围与含义。
9.4 避免同一个存储区多个写入点
在多写入点不可避免时,建议通过中间计算模块统一合并。例如,将多个触发条件下的数据写入请求先经过逻辑运算,得到唯一的最终值,再通过一个 Data Store Write 写入。这样可以规避顺序问题。
如果从架构上无法合并,则要考虑使用 Function-Call 子系统或 Stateflow 来管理写入顺序,保证同一时刻只有一个模块写同一个 DataStoreMemory。
9.5 利用日志与可视化调试
调试阶段,建议开启关键 DataStoreMemory 的 Data Logging,导出曲线查看变化规律。Simulink 中 Data Store Read 模块的输出也可以直接连接到 Scope 模块,实时观察。定位问题时,建议按下面的顺序排查:
- 确认 Data Store 名称与大小写。
- 确认初始值是否合理。
- 确认 Write 模块是否执行。
- 确认 Write 与 Read 的执行顺序。
- 确认存储作用域是否覆盖目标模块。
9.6 模型评审时多问几个问题
在代码评审或模型评审时,可以针对 DataStoreMemory 问几个问题:
- 这个数据除了 Write 和 Read,还有没有人悄悄修改?
- 如果初始值改掉,会不会影响其他模块?
- 生成的代码中,这个变量是全局变量,是否有重名风险?
- 是否可以用普通信号线或 Bus 代替?
这几个问题能帮助你判断 DataStoreMemory 的使用是否合理。
10. 总结与下一步学习方向
本文围绕 Simulink 常用模块库中的 DataStoreMemory 模块,从概念、参数、工作原理到实战案例,完成了完整的拆解。你现在应该能够理解:
- DataStoreMemory、Data Store Read、Data Store Write 三者的角色划分。
- 如何配置一个 DataStoreMemory 并完成跨子系统数据共享。
- 如何排查多写冲突、初始值不更新等常见问题。
- 如何在代码生成和数据字典管理中使用 DataStoreMemory。
下一步,你可以继续学习这些相关内容:
- Simulink 子系统封装与模块库自定义。
- Stateflow 状态机与 DataStoreMemory 的配合使用。
- Bus 对象与数据字典综合建模。
- Simulink Coder 代码生成中 Storage Class 的配置。
动手练习时,建议从今天这个电机控制案例开始,尝试把模式源改为信号发生器,观察数据存储的动态变化;再尝试在同一个模型中建立两个不同名称的 DataStoreMemory,分别测试作用域差异。只有亲手改过、跑过、报错过,对 DataStoreMemory 的理解才会真正沉淀下来。