主要内容

数据存储基础知识

一个数据存储是一个存储库,您可以向其中写入数据,也可以从中读取数据,而不必将输入或输出信号直接连接到数据存储。数据存储可以跨模型级别访问,因此子系统和引用模型可以使用数据存储来共享数据,而无需使用I/O端口。

何时使用数据存储

当模型中不同级别的多个信号需要相同的全局值时,数据存储可能很有用,并且显式地连接所有信号会使模型变得不可接受,或者需要太长时间才能实现。数据存储类似于程序中的全局变量,具有类似的优点和缺点,例如使验证更加困难。

要在可重用算法的实例之间共享数据(例如,自定义库中的子系统或可重用引用模型),可以使用数据存储。有关可重用引用模型的数据共享的详细信息,请参见在引用模型实例之间共享数据

数据存储和软件验证

数据存储可以对软件验证产生重大影响,特别是在数据耦合和控制领域。仅使用输入和输出端口来传递数据的模型和子系统会在生成的代码中产生干净、指定良好且易于验证的接口。

与任何类型的全局数据一样,数据存储使验证变得更加困难。如果您的开发过程包括软件验证,请考虑在设计过程的早期计划数据存储的效果。

有关更多信息,请参见RTCA DO-331,“基于模型的开发和验证对DO-178C和DO-278A的补充”,MB.6.3.3.b节。

转到而且块作为信号路由的替代方案

在某些情况下,你可以使用更简单的技巧,转到块和块,以获得与数据存储提供的结果相似的结果。数据Goto/From链接的主要缺点是它们通常不能跨非虚拟子系统边界访问,而适当配置的数据存储可以在任何地方访问。看到转到而且阻止有关转到/从链接的更多信息的参考页面。

本地和全局数据存储

可以定义两种类型的数据存储:

  • 一个本地数据存储可以从模型层次结构中处于或低于您定义数据存储的级别的任何地方访问,但从引用的模型除外。您可以在模型中以图形方式定义本地数据存储,也可以通过创建模型工作区信号对象(金宝app仿真软件。信号).

  • 一个全局数据存储可从整个模型层次结构(包括从引用的模型)访问。仅在MATLAB中定义全局数据存储®基本工作区,使用信号对象。引用模型可以访问的唯一类型的数据存储是全局数据存储。

通常,将数据存储定位在模型中允许需要访问该数据存储的所有模型部分访问的最低级别。中出现了一些本地和全局数据存储的示例数据存储实例

有关使用引用模型的信息,请参见模型引用

数据存储诊断

关于数据存储诊断

金宝app®提供各种运行时和编译时诊断,可用于帮助避免数据存储方面的问题。诊断可在“模型配置参数”对话框和“数据存储内存”块的参数对话框中找到。Simu金宝applink Model Advisor通过列出由于禁用诊金宝app断而更有可能导致数据存储错误的情况来提供支持。

检测访问顺序错误

可以使用数据存储运行时诊断来检测模拟期间发生的非预期数据存储读写序列。您可以将这些诊断应用于所有数据存储,或者允许每个数据存储内存块设置自己的值。诊断如下:

这些诊断出现在型号配置参数>诊断>数据有效性>数据存储内存块窗格,其中每个都可以有以下值之一:

  • 禁用所有—对模型访问的所有数据存储禁用此诊断。

  • 启用所有警告-在MATLAB命令窗口中以警告的形式显示诊断结果。

  • 启用所有错误—停止模拟,并在错误对话框中显示诊断结果。

  • 使用本地设置—允许每个数据存储内存块为该诊断设置自己的值(默认值)。

同样的诊断也出现在每个数据存储内存块参数对话框中诊断选项卡。可以将每个诊断设置为没有一个警告,或错误.单个块指定的值只有在对应的配置参数为时才生效使用本地设置.看到模型配置参数:数据有效性诊断数据存储内存文档获取更多信息。

最保守的技术是将所有数据存储诊断设置为启用所有错误型号配置参数>诊断>数据的有效性>数据存储内存块.但是,此设置并非在所有情况下都是最佳的,因为它可能将预期的行为标记为错误。例如,下图显示了一个模型,该模型使用块优先级强制数据存储读取块之前执行数据存储写布洛克:

模拟过程中发生错误,原因是数据存储一个数据存储读取数据存储写Block更新存储。如果想要相关的延迟,可以通过设置全局参数来抑制错误先读后写使用本地设置,然后将该参数设置为没有一个诊断面板数据存储内存对话框。如果使用此技术,则将参数设置为错误在所有其他方面数据存储内存除了那些被故意排除在诊断之外的块。

加速模式中引用的数据存储诊断和模型。对于加速器模式中引用的模型,Simulink忽略以下内容金宝app配置参数>诊断>数据的有效性>数据存储内存块参数,如果将其设置为禁用所有

  • 先读后写(ReadBeforeWriteMsg

  • 读后检测写(WriteAfterReadMsg

  • 在写入之后检测写入(WriteAfterWriteMsg

您可以使用Model Advisor来识别在Accelerator模式中引用的模型,对于这些模型,Simulink会忽略上面列出的配置参数。金宝app

  1. 在Simuli金宝appnk编辑器中建模选项卡上,单击模型的顾问

  2. 选择按照任务

  3. 运行检查在加速模型参考仿真过程中忽略的诊断设置检查。

数据存储诊断和MATLAB函数块。所使用的数据存储内存的诊断可能更为保守MATLAB函数块。例如,如果将数据存储内存数组传递给MATLAB函数,则优化如A = foo(A)可能导致MATLAB将数组的整个内容标记为已读或已写,即使只有一些元素被访问。

检测多任务访问错误

如果在一个任务中读取数据存储,在另一个任务中写入数据存储,则可能会影响数据完整性。例如,假设:

  1. 任务正在向数据存储写入数据。

  2. 第二个任务中断了第一个任务。

  3. 第二个任务从该数据存储中读取数据。

如果第一个任务在第二个任务中断时只更新了部分数据存储,则数据存储中的结果数据不一致。例如,如果值是一个向量,那么它的一些元素可能已经在当前时间步骤中写入,而其余元素则在前一步中写入。如果值是一个多字,它可能处于不一致的状态,甚至部分正确。

除非您确定任务抢占不会导致数据完整性问题,否则请设置编译时诊断型号配置参数>诊断>数据有效性>数据存储内存块>多任务数据存储警告(默认值)或错误.此诊断标记在不同任务中读取和写入的数据存储的任何情况。下一个图说明了设置检测到的问题多任务数据存储错误

因为数据存储一个在快速任务中写入,在慢速任务中读取,将报告一个错误,并提供建议的补救措施。即使在数据存储读写位于条件子系统内部的情况下,这种诊断也适用。金宝appSimulink正确地识别块正在执行的任务,并使用该任务来评估诊断。

下一个图显示了上述问题的一种解决方案:在数据存储读取之后放置一个速率转换块,该块之前以较慢的速率访问数据存储。

通过此更改,数据存储写入可以继续以更快的速度进行。如果必须在模型的其他地方以更快的速度读取数据存储,这可能很重要。

多任务数据存储诊断还适用于引用模型中的数据存储读写。如果两个不同的子模型在不同的任务中执行数据存储的读写,则在Simulink编译它们的公共父模型时将检测到错误。金宝app

检测重复的名称错误

由于在模型中重复使用数据存储名称,可能会发生数据存储错误。例如,当不同嵌套作用域中的两个或多个数据存储内存具有相同的数据存储名称时,就会发生数据存储阴影。在这种情况下,低级别数据存储读写块引用的数据存储内存可能不是预期的存储。

为防止数据存储名称重复导致错误,请设置编译时诊断型号配置参数>诊断>数据有效性>数据存储内存块>数据存储名称重复警告错误.缺省情况下,diagnostic的值为没有一个,抑制重复名称检测。下一个图显示了通过设置检测到的问题数据存储名称重复错误

在子系统层次结构的最底层读取的数据存储引用名为一个,并且同一模型中的两个数据存储内存块具有该名称,因此将报告错误。这个诊断可以防止假设读数据存储指的是模型顶层的数据存储内存块。读实际上是指中间级别的数据存储内存块,它在范围上更接近于数据存储读块。

模型顾问中的数据存储诊断

Model Advisor提供了几种可用于数据存储的诊断方法。有关数据存储的Model Advisor诊断的信息,请参阅以下部分:

检查数据存储内存块是否存在多任务处理、强类型和阴影问题

检查数据存储块采样次数以确定建模错误

检查数据存储块是否开启读写诊断功能

指定数据存储的初始值

通常,要为数据存储指定初始值,可以使用与用于其他块相同的技术。看到初始化信号和离散状态

对于大多数块,您可以利用标量展开来最大限度地减少为非标量信号指定初始值的工作。当您指定一个标量初值时,信号中的每个元素都使用该标量。

但是,当你设置参数-1在一个数据存储内存块(默认值),则不能使用标量展开。相反,您必须指定一个与存储信号具有相同维度的初始值。若要利用初始值的标量展开,请设置参数设置为特定值,例如(1 2)[1 myDim](对于符号维度)。

另请参阅

|||

相关的话题