Simulink Data Store Memory:跨子系统数据共享与代码生成最佳实践
发布时间:2026/9/3 21:08:04 作者:尧图编辑部 阅读量:1,286

这次我们来看 Simulink 模块库里一个很实用但经常被忽略的模块Data Store Memory。在复杂模型里子系统之间除了用信号线连来连去还有一类很常见的需求——多个模块共同访问同一个变量。比如控制器子系统写入某个状态量另一个子系统需要读取这个状态量再比如整个模型都要维护一个运行标志位。如果这些都用信号线去拉模型连线会越来越乱维护起来也很痛苦。Data Store Memory 解决的就是这一类“全局数据共享”问题。它的工作原理可以理解成在模型内部开了一块“命名内存”。你创建一个 Data Store Memory 之后就得到了一个有名字的存储区域其他模块通过 Data Store Read 读取它通过 Data Store Write 写入它。读写过程不依赖信号线也不受子系统边界限制。相比 Goto/From 这类信号路由模块Data Store Memory 更接近真正的“存储”它支持数组、结构体、总线数据还能在代码生成时映射成 C 语言里的全局变量或结构体字段非常适合自动代码生成场景。这篇文章会把 Data Store Memory 的创建、配置、读写方式、典型示例、批量仿真、常见报错和排查思路完整过一遍。如果你正在用 Simulink 做多子系统协同建模或者准备做 Embedded Coder 代码生成这篇文章值得收藏。文中的操作步骤和脚本都是通用写法具体参数名和库路径需要以你本机 MATLAB 版本为准。1. 核心能力速览能力项说明模块全名Data Store Memory所属模块库Simulink / Signal Attributes可在 Simulink 库浏览器搜索框输入模块名快速定位主要功能定义全局或局部数据存储供 Data Store Read / Data Store Write 模块读写支持数据类型标量、数组、矩阵、结构体、总线对象等存储定义位置模块内部、模型工作区、数据字典典型应用场景跨子系统共享状态、参数缓存、模式切换标志、代码生成全局变量代码生成支持 Embedded Coder 生成 C 代码可映射为全局变量或结构体字段硬件要求无独立硬件要求运行开销取决于数据大小和读写频率适合人群Simulink 建模工程师、自动代码生成使用者、控制算法开发人员使用门槛熟悉 Simulink 基本模型编辑即可不需要额外安装工具箱从上面表格可以看出Data Store Memory 本身不是一个“功能复杂”的模块它的作用更像是一个数据中转站。但用好它模型结构会清爽很多代码生成后的 C 代码也更符合常规嵌入式工程习惯。2. 适用场景与使用边界2.1 适合什么场景Data Store Memory 最典型的场景是跨子系统共享数据。在 Simulink 中如果两个子系统不在同一层级信号线连接需要经过模型的根层级或使用 Goto/From 标签路由。子系统层级一深Goto 标签管理就会变得繁琐。这时候用 Data Store Memory把需要共享的数据集中定义到一个命名存储区任何子系统内部都能通过 Data Store Read 和 Data Store Write 访问模型边界清晰很多。另一个典型场景是状态保持。Data Store Memory 可以在仿真周期之间保存数据相当于在模型内部实现了一个“持久变量”。相比直接用 MATLAB 工作区的全局变量Data Store Memory 的可视化程度更高模型打开后能直接看到这块存储而且在代码生成阶段更容易控制存储映射。第三个场景是与 Stateflow 配合使用。Stateflow 状态机内部可以通过 Data Store Read/Write 访问模型中的 Data Store Memory实现状态机与普通 Simulink 模块之间的数据交换。这种用法在模式切换逻辑、状态机联动控制里很常见。2.2 不适合什么场景Data Store Memory 不是信号线的替代品。如果你只是想把一个信号从模型的一个位置传到另一个位置Goto/From 或者直接连线更合适。Data Store Memory 适合的是“多对多共享”而不是“点对点路由”。也不要在一个模型里滥用大量 Data Store Memory。存储全部集中到一个全局命名空间后模型的可读性会下降。别人打开模型时如果不逐个搜索 Data Store Read/Write很难判断某个数据在哪里被写入、在哪里被读取。过度使用全局存储模型就变成了“全局变量满天飞”的状态调试起来非常痛苦。另外高频数据流也不建议走 Data Store Memory。因为 Data Store Memory 本质上是公共存储区读写访问存在并发和一致性问题。高频信号建议走常规信号线配合速率转换模块和缓冲机制更稳妥。Data Store Memory 更偏向低频状态量、配置参数、模式标志这类数据。2.3 与 Goto/From 的区别很多人刚接触时会混淆 Data Store Memory 和 Goto/From。简单来说Goto/From 是信号标签路由工具它传递的是信号值没有“存储”语义。Data Store Memory 是真正的数据存储区域有初始值、数据类型和存储属性可以跨仿真周期保持数值。从代码生成角度看Goto/From 最终生成的代码通常只是变量名的展开和传递而 Data Store Memory 可以控制成特定 Storage Class 的全局变量配合 Embedded Coder 的配置映射到具体的 C 变量或结构体字段。这也是 Data Store Memory 在自动代码生成中更受重视的原因。3. 环境准备与前置条件3.1 软件环境使用 Data Store Memory 需要安装 MATLAB 和 Simulink。建议使用较新的 MATLAB 版本因为不同版本对数据字典、总线对象和模块库布局的支持会有差异。新版本在数据字典管理和代码生成配置上更完善报错信息也更友好。如果只是建模和仿真基础 Simulink 就够。如果要生成 C 代码需要额外安装 Embedded Coder。如果要用到总线数据建议了解 Simulink.Bus 的定义方法因为 Data Store Memory 和 Data Store Read/Write 在数据结构体模式下需要依赖总线对象。3.2 工作目录组织建议为每个模型单独建一个工作目录目录下至少区分以下内容模型文件目录用来存放 .slx / .mdl 模型文件数据字典目录用来存放 .sldd 数据字典文件脚本目录用来存放初始化脚本和批量仿真脚本结果输出目录用来存放仿真输出和日志这样做的原因很简单Data Store Memory 的对象可以定义在数据字典或模型工作区中如果在工程里多人协作数据字典的路径问题会直接导致模型解析失败。比如“找不到数据字典 can.sldd”这类报错很多时候就是因为模型文件和数据字典的路径关系没维护好。3.3 前置检查清单开始操作前建议按下面清单检查一遍环境MATLAB 能否正常启动Simulink 是否已安装并可用是否配置好模型和工作目录是否已经打开需要操作的模型或者准备好新建模型是否知道当前 MATLAB 版本下 Data Store Memory 模块的库路径如果目标模型已经有数据字典确认数据字典路径是否正确这些检查不需要额外工具打开 MATLAB 命令窗口和 Simulink 库浏览器就能完成。4. Data Store Memory 模块创建与配置4.1 打开 Simulink 库并添加模块在 MATLAB 命令窗口输入simulink打开 Simulink 起始页然后新建一个空白模型。在模型窗口的工具栏中点击库浏览器按钮或者在模型窗口内按CtrlShiftL打开库浏览器。在库浏览器的搜索框中直接输入Data Store Memory搜索结果会定位到该模块。把模块拖入模型画布即可。同样的方法你还需要添加 Data Store Read 和 Data Store Write 模块。这三个模块在库中的位置是同一组 Signal Attributes 相关的模块目录。这里补充一个命令行方式。如果你在开发自动化脚本可以用add_block添加模块。不过不同 MATLAB 版本的库路径可能有差异直接写死路径不够稳。建议先用库浏览器搜索模块右键查看模块路径再写进脚本。% 示例新建模型并尝试添加 Data Store Memory 模块 % 注意库路径需要按当前 MATLAB 版本确认 new_system(ds_demo); open_system(ds_demo); % 如果当前版本的库路径是 simulink/Signal Attributes/Data Store Memory add_block(simulink/Signal Attributes/Data Store Memory, ds_demo/DSM);如果这个库路径在你的 MATLAB 版本中报错不要纠结直接打开库浏览器手动拖拽即可。很多 Simulink 模块在版本升级后库的归类会微调脚本里写死路径本来就是一种需要维护的做法。4.2 配置 Data Store Memory 参数双击模型中的 Data Store Memory 模块会打开参数对话框。这里有几个关键参数需要关注。首先是 Data Store 名称。这个名称是全局的标识Data Store Read 和 Data Store Write 模块要通过这个名称来定位存储区域。命名要见名知义比如DSM_EngineSpeed、DSM_WorkMode。建议统一加DSM_前缀避免和普通信号名混在一起。其次是数据类型。Data Store Memory 支持多种数据类型包括内置的 double、single、int8、uint8、boolean也支持通过总线对象定义的结构体类型。如果只是存一个计数器或者标志位用内置数据类型足够。如果要存放一组带有关联关系的参数结构体类型更合适。然后是初始值。初始值指定仿真开始前存储区域内保存的数值。这个参数在仿真中很重要因为 Data Store Memory 是保持状态的数据区如果某个子系统在第一个仿真步就读取存储区那么读到的就是初始值。最后是存储区域定义位置。Data Store Memory 可以定义在模型工作区也可以定义在数据字典中。如果定义在数据字典中多个模型可以共享同一个存储对象这在大型工程里非常实用。如果定义在模型工作区里数据的作用范围限定在当前模型内。下面给出一个通用配置示例。具体参数名和选项以实际版本为准。% 假设模型名是 ds_demoData Store Memory 模块名叫 DSM % 修改初始值 set_param(ds_demo/DSM, InitialValue, 0); % 查询当前模块支持的全部参数名 get_param(ds_demo/DSM, ObjectParameters)get_param会列出模块所有可配置参数你可以根据实际需要修改。不要凭记忆硬写参数名因为不同 MATLAB 版本、不同模块版本之间会有差异。4.3 添加 Data Store Read 和 Data Store WriteData Store Memory 本身只负责存储真正读写它的模块是 Data Store Read 和 Data Store Write。把一个 Data Store Read 模块拖入模型画布双击打开在 Data Store 名称中填入和 Data Store Memory 相同的名称它会自动关联到同一个存储区。Data Store Write 模块也是一样的操作。一个 Data Store Memory 可以连接多个 Data Store Read 和多个 Data Store Write。也就是说多个子系统可以同时读也可以同时写。但这里要特别注意多个写入源同时访问同一个 Data Store会引入数据冲突问题需要仔细设计读写时序和采样时间。4.4 局部 Data Store MemoryData Store Memory 不一定是全局的。如果你把一个 Data Store Memory 放在一个子系统内部并且不把它关联到模型工作区或数据字典中的全局对象它就变成了局部数据存储只能在这个子系统内部被 Data Store Read / Data Store Write 访问。局部 Data Store Memory 是很好的实践它既能享受 Data Store 的存储便利又能把数据访问范围限制在局部避免全局命名空间越来越乱。建议默认优先使用局部 Data Store Memory只有当多个子系统确实需要共享时才提升为全局对象。4.5 在数据字典中创建 Data Store在大型工程中我更推荐在数据字典中创建 Data Store Memory 对象。这样做的优点是可以把存储定义、数据类型、初始值和存储属性集中管理不依赖某个具体模型文件。打开数据字典后在 MATLAB 命令窗口可以用类似下面的方法操作% 打开数据字典文件按实际路径替换 dictObj Simulink.data.dictionary.open(project_data.sldd); % 在数据字典中创建一个名为 DSM_Global 的 Data Store Memory 对象 dDataSect getSection(dictObj, Design Data); addEntry(dDataSect, DSM_Global, Simulink.Signal);这只是一个通用示例。实际使用时还需要配置 Simulink.Signal 对象的数据类型、初始值等属性。使用数据字典后模型里的 Data Store Memory 模块可以通过“解析到数据字典对象”的方式关联到同一个存储区。5. 典型模型示例跨子系统共享数据这里给一个很典型的示例两个子系统通过 Data Store Memory 共享数据。在这个例子里我们做如下设定子系统 Writer 内部有一个 Data Store Write负责把数据写入 Data Store Memory。子系统 Reader 内部有一个 Data Store Read负责从 Data Store Memory 读取数据。Data Store Memory 放在模型根层级作为全局存储区。Reader 读取到的数据通过 Scope 显示出来。搭建步骤是这样的新建模型ds_demo.slx。在模型根层级添加 Data Store Memory命名为DSM_Value初始值设置为 0。在模型根层级添加两个 Subsystem 模块分别重命名为Writer和Reader。打开 Writer添加一个 Constant 模块和一个 Data Store Write 模块。设置 Constant 值为 5设置 Data Store Write 名为DSM_Value把 Constant 连到 Data Store Write 的输入。打开 Reader添加一个 Data Store Read 模块和一个 Scope 模块。设置 Data Store Read 名为DSM_Value把 Data Store Read 连到 Scope。更新模型图按CtrlD然后运行仿真。运行仿真后可以看到 Scope 输出了值 5。这是因为 Writer 子系统把常量 5 写入了DSM_ValueReader 子系统读取到 5 并显示出来。这个例子虽然简单但已经完整演示了 Data Store Memory 的创建、写入、读取和显示全过程。如果你想验证初始值的作用可以先把 Writer 子系统里的 Constant 断开或者直接把 Constant 改成 0看看 Scope 是否显示初始值。不过要记住如果 Writer 始终存在且每个仿真步都写入了值那么读到的永远是写入值初始值只会在写入动作发生之前被读到。更接近工程实际的用法是在状态机切换中使用。比如用 Stateflow 状态机控制一个模式字Simulink 模型其他部分用 Data Store Read 读取模式字以此决定后续逻辑。这种模式下Data Store Memory 保存的是持久状态很多模块都会用到。6. 功能测试与效果验证6.1 仿真前检查数据存储类模块最容易出的问题就是读写冲突和存储解析失败。所以在仿真之前建议先做一次完整的模型更新。在模型窗口中按CtrlD或者用命令行执行set_param(ds_demo, SimulationCommand, update);如果模型能正常更新说明 Data Store Memory、Data Store Read 和 Data Store Write 之间的名称关联已经正确。如果报错多半是某个 Data Store Read/Write 使用的名称在模型里没有对应定义。6.2 运行仿真并查看结果仿真运行可以使用工具栏的“运行”按钮也可以在命令行使用sim函数simOut sim(ds_demo);如果模型中已经配置了信号记录可以从simOut中获取仿真结果。不同 MATLAB 版本获取结果的方式稍有不同。常见写法如下% 获取输出信号按实际版本调整 y simOut.yout{1}.Values.Data; plot(y);如果使用 Scope 模块显示直接打开 Scope 看波形即可。建议在验证 Data Store 相关逻辑时不仅看最终波形还要重点检查初始时刻、触发时刻和写入时刻的数值变化。6.3 验证初始值验证初始值的方法很简单在 Data Store Memory 参数里把初始值改成某个固定值例如 100然后去掉模型中的写入源或者让写入源在仿真开始一段时间后才写值。运行仿真后检查读取端在写入发生前是否输出 100。如果输出不是 100说明存储区没有正确解析到模块参数或存在其他同名 Data Store 对象覆盖了模块设置。初始值不生效是 Data Store Memory 使用中很常见的坑。出现这个问题的原因通常是数据字典或模型工作区中已经存在同名 Data Store 对象而对象的初始值和模块里显示的初始值不一致。解析优先级会优先采用字典或工作区对象定义模块里的设置被忽略。6.4 验证结构体数据如果要通过 Data Store Memory 共享结构体数据需要先定义总线对象。Simulink 中定义总线对象可以使用Simulink.Bus对象。下面是通用示例% 创建一个总线对象 elems(1) Simulink.BusElement; elems(1).Name speed; elems(1).DataType double; elems(2) Simulink.BusElement; elems(2).Name temp; elems(2).DataType double; busObj Simulink.Bus; busObj.Elements elems;然后在 Data Store Memory 的数据类型里选择这个总线对象。Data Store Write 端可以用 Bus Creator 或常量结构体提供输入Data Store Read 端可以用 Bus Selector 取出具体字段。结构体数据的验证重点在于数据类型的严格匹配任何一个字段类型不对更新模型时都会报错。7. 接口 API 与批量任务很多人听到“接口 API”会以为 Simulink 模块能直接提供 HTTP 服务其实不是。Simulink 的“接口能力”更多指的是 MATLAB 脚本控制、命令行仿真、数据字典访问以及代码生成后的外部接口。对 Data Store Memory 来说批量任务和接口操作主要体现在三个方向。7.1 用 MATLAB 脚本批量修改 Data Store 参数在参数扫描或工况测试中你经常需要修改 Data Store Memory 的初始值或写入值然后批量跑仿真。用 MATLAB 脚本可以自动化完成这件事。% 批量修改 Data Store Memory 初始值并运行仿真的通用框架 initValues [0, 10, 50, 100]; results []; for i 1:length(initValues) % 修改模块初始值 % 注意不同版本参数名可能不同先用 get_param 查询 set_param(ds_demo/DSM, InitialValue, num2str(initValues(i))); % 运行仿真 simOut sim(ds_demo); % 保存结果 results(i).initValue initValues(i); results(i).data simOut.yout{1}.Values.Data; end这种循环仿真方式适合小规模参数扫描。如果模型很大每个仿真周期很长建议用 Simulink 的parsim做并行仿真能节省大量时间。7.2 通过数据字典操作 Data Store 对象当 Data Store 定义在数据字典中时可以在 MATLAB 脚本里直接操作数据字典里的对象修改初始值、数据类型等属性然后更新模型。% 打开数据字典 dictObj Simulink.data.dictionary.open(project_data.sldd); % 获取 Design Data 区段 dDataSect getSection(dictObj, Design Data); % 获取 Data Store 对应的 Simulink.Signal 对象 sigObj getEntry(dDataSect, DSM_Global); % 修改初始值 sigObj.Value 25;修改完后模型在下一次更新时会自动读取新的数据字典值。需要注意如果数据字典被其他同事或进程占用写入时会遇到冲突具体报错要看数据字典的访问权限设置。7.3 代码生成后的外部接口如果使用 Embedded Coder 生成代码Data Store Memory 会映射成全局变量或数据结构体。其他代码模块可以通过读写这个全局变量来访问 Simulink 内部数据。这实际上就是 Data Store Memory 对外提供的“接口”。不过生成的 C 变量名称、类型和存储位置取决于你在代码映射中配置的 Storage Class。要让生成的全局变量在外部 C 代码中稳定访问需要统一定义命名规则和头文件位置。这部分涉及 Embedded Coder 的详细配置建议先在一个小模型上验证清楚再扩展到大的项目。8. 资源占用与性能观察8.1 仿真阶段的开销Data Store Memory 在仿真阶段相当于一块内存数据区开销主要取决于数据的大小和访问次数。标量数据的开销基本可以忽略大数组、结构体或包含大量字段的总线数据在每次读写时会发生数据拷贝会带来额外的内存和 CPU 开销。如果你的模型里有多个子系统反复读写同一块大型数据可以尝试把数据访问集中在同一个子系统内部减少跨子系统的频繁拷贝。或者换一种设计只在某一个子系统中通过 Data Store Read 读取数据然后通过输出端口把数据传给其他模块减少公共存储区的访问频率。8.2 代码生成后的资源占用代码生成后Data Store Memory 对应的全局变量占用 RAM。多个 Data Store 会生成多个全局变量。如果不对 Storage Class 做控制生成的代码会出现大量结构体或宏定义对嵌入式工程来说会增加命名冲突和内存碎片化风险。更稳妥的做法是在生成代码之前给每个 Data Store 明确 Storage Class。对于只读参数可以考虑映射到Const或Parameter对于读写状态映射到可读写全局变量。这些设置在 Simulink.Signal 对象的 Storage Class 属性里配置配合代码生成报告可以清晰看到每个全局变量的映射位置。8.3 性能观察方法要观察 Data Store Memory 对仿真性能的影响可以使用 Simulink Profiler。打开 Profiler运行一小段仿真查看各个模块的耗时。如果在 Data Store Read/Write 模块上出现了明显耗时说明数据访问频率或数据拷贝量需要优化。但注意导致模块耗时的原因不一定是 Data Store 本身也可能是与之相连的下游模块处理了大型数据。定位问题时要把 Data Store 模块和上下游模块放在一起分析不要单独看一个模块的耗时。8.4 降低资源占用的方法想降低资源占用可以这样做尽量用标量或较小的数组避免存储过大的结构体数据访问频率高时在读写路径上增加缓冲或速率转换能用局部 Data Store 就不用全局 Data Store对于常量类数据优先使用常量对象而不是 Data Store生成代码前统一检查 Storage Class 和内存映射这些方法不复杂但很有效。9. 常见问题与排查方法问题现象可能原因排查方式解决方案更新模型报错 “Data store xxx cannot be resolved”Data Store Read/Write 使用的名称没有对应 Data Store Memory 定义查看模型中所有 Data Store Memory 模块的名称在模型中添加 Data Store Memory 并设置相同名称或在数据字典中创建同名对象报错 “找不到数据字典 xxx.sldd”模型关联的数据字典路径错误或文件未加载检查模型资源管理器中数据字典路径确认 .sldd 文件存在重新挂载数据字典或把 .sldd 放到模型同目录下初始值不生效数据字典或模型工作区中存在同名 Data Store 对象覆盖了模块参数查看数据字典和模型工作区中的同名对象删除不需要的重名对象或统一修改数据字典中的初始值读写结果不稳定多个 Data Store Write 同时写同一个存储区或读写采样时间不一致在模型更新后用数据依赖分析工具查看读写顺序规范读写时序使用 Function-Call 子系统或调整采样时间Data Store Memory 模块找不到MATLAB 版本库路径变化在库浏览器搜索框中直接搜索模块名不要依赖固定库路径用搜索方式拖入模块结构体数据更新失败总线对象定义不一致或者字段类型不匹配检查 Data Store Memory 和 Data Store Read/Write 之外的总线对象定义统一使用同一个 Simulink.Bus 对象在数据字典中集中管理生成代码后出现全局变量冲突多个 Data Store 使用了相同名称或 Storage Class 配置不合理查看生成的 C 代码中变量声明位置和命名统一命名规范为每个 Data Store 配置独立 Storage Class仿真时 Data Store 写入端报维度错误写入数据维度和 Data Store Memory 定义维度不匹配检查 Data Store Memory 参数中数据维度和写入端输入信号维度调整 Data Store 维度定义或修改写入端信号的维度模型在低版本 MATLAB 中打开报错使用了高版本新增的 Data Store 属性查看报错模块和属性位置在低版本中重建 Data Store或避免使用高版本独有属性代码生成报告中 Data Store 未映射为预期变量Storage Class 设置不当或未生成完整配置检查 Simulink.Signal 对象和 Embedded Coder 映射配置重新配置 Storage Class生成代码前预览映射关系这张表覆盖了 Data Store Memory 最常见的几类问题。遇到问题第一步不是翻代码而是先做一次模型更新看报错信息里指向哪个模块。Simulink 的报错信息一般会给出模块路径和数据对象名称根据路径能快速定位。10. 最佳实践与使用建议10.1 命名规范Data Store 名称建议使用统一前缀例如DSM_。这样在模型里搜索、在代码生成报告里查找、在数据字典里管理都会很清晰。不同团队可以约定自己的前缀规则但一定要统一。Data Store Read/Write 模块的命名也尽量带上存储名方便反向追踪。10.2 尽量缩小数据作用范围能用局部 Data Store 解决的问题就不要定义成全局 Data Store。局部 Data Store 的作用范围只在当前子系统内不会污染全局命名空间。多个子系统之间真正需要共享的数据才提升到模型根层级或数据字典。10.3 优先使用数据字典在一个多人协作或者长期维护的工程里建议把全局 Data Store 定义到数据字典。数据字典可以进行版本管理也方便不同模型复用同一批数据定义。如果用模型工作区保存数据定义模型文件本身会承载太多设计数据出现多人同时编辑模型时很容易冲突。10.4 仔细规划读写时序读写冲突是 Data Store 使用中比较隐蔽的问题。如果数据会在同一个仿真步内被写入和读取建议明确写入优先还是读取优先。对于更复杂的时序可以使用 Function-Call 子系统或 Stateflow 来调度读写动作。不要把所有读写逻辑都堆在连续模块里否则运行结果可能与预期不一致。10.5 生成代码前的检查代码生成不是点一下“生成”就结束。生成前要检查每个 Data Store 的 Storage Class、初始值、数据字典路径和全局命名冲突。建议先在小模型上生成一次代码打开生成的 .c 和 .h 文件确认变量名和存储位置符合预期再进入正式工程。10.6 合规与数据安全如果 Data Store 中存储的数据来自真实设备、试验数据或第三方系统要注意数据脱敏和授权问题。尤其在做外部展示、博客案例和公开文档时不要暴露真实型号、真实编号和敏感业务参数。模型文件本身也属于技术资产分享前要确认不涉及公司保密信息。11. 总结与下一步Data Store Memory 是 Simulink 建模中很实用的数据共享工具尤其适合跨子系统状态共享和数据字典集中管理。它和信号线、Goto/From 是有明确分工的理解了它适合处理“多对多共享数据”这个定位就能在建模时少走弯路。建议你拿到这个模块后先搭一个最小模型一个 Data Store Memory、一个 Data Store Write、一个 Data Store Read、一个 Scope。把写入、读取、初始值、局部和全局存储这几件事验一遍。这个最小模型就是以后排查问题的基准环境。接下来再尝试把它放进数据字典结合 Stateflow 或 Embedded Coder 做一次完整流试验证。最容易踩的坑是命名不一致和读写冲突更新模型时报错时先看模块名称是否完全一致。想深入的话后续可以继续看 Data Store Resets、局部存储的数据字典映射、以及 Simulink 代码生成中的 Storage Class 配置。这些内容都能和 Data Store Memory 的能力相互衔接。