主要内容

通过创建数据存储对全局数据建模

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

数据存储实例

概述

下面的示例演示了定义和访问数据存储的技术。看到订单数据存储访问对于随时间控制数据存储访问的技术,例如确保给定的数据存储总是在读取之前被写入。看到数据存储诊断用于帮助检测和纠正潜在数据存储错误的技术,而无需运行任何模拟。

请注意

若要使用全局数据存储在引用的模型之间共享数据,请参见跨多个模型使用数据存储

本地数据存储实例

下面的模型演示了本地数据存储的创建和访问,该数据存储仅在模型或特定子系统中可见。

该模型使用数据存储允许子系统a发出信号表明其输出无效。

如果子系统A的输出无效,则模型使用子系统B的输出。

全局数据存储实例

下面的模型用功能相同的引用模型替换了前面示例中的子系统,以说明如何使用全局数据存储在模型引用层次结构中共享数据。

在本例中,顶层模型使用MATLAB中的信号对象®工作区来定义错误数据存储。这是必要的,因为只有当数据存储是由MATLAB工作区中的信号对象或数据字典定义时,它们才跨模型边界可见。的代码PreLoadFcn创建信号对象的模型回调参数。这段代码在模型加载之前执行。

创建和应用数据存储

请注意

若要将总线和总线阵列与数据存储一起使用,请执行这两个以下程序和建立一个模型来使用带有总线和总线阵列的数据存储

以下是配置数据存储的通用流程。您可以按照不同的顺序执行这些任务,也可以与其他任务分开执行,这取决于您如何使用数据存储。

  1. 在适用的情况下,计划数据存储的使用,以尽量减少它们对软件验证的影响。有关更多信息,请参见数据存储和软件验证

  2. 使用中描述的技术创建数据存储数据存储与数据存储内存块带有信号对象的数据存储.为了获得更高的可靠性,请考虑分配而不是继承数据存储属性,如中所述指定数据存储内存块属性

  3. 在模型中添加数据存储写块和数据存储读块,用于写入和读取数据存储,如中所述使用Simulink块访问数据存储金宝app

  4. 配置模型和访问每个数据存储的块,以避免在读写数据存储时出现并发失败,如中所述订单数据存储访问

  5. 应用中描述的技术数据存储诊断根据需要防止数据存储错误,或者在模拟过程中诊断错误。

  6. 如果您打算为您的模型生成代码,请参见生成代码中的数据存储(金宝app仿真软件编码器)

要创建数据存储,需要创建数据存储内存块或金宝app仿真软件。信号对象。块或信号对象表示数据存储并指定其属性。每个数据存储必须有唯一的名称。

使用数据存储内存块实现的数据存储:

  • 金宝app支持数据存储初始化

  • 在模型层次结构的特定级别上提供对数据存储范围和选项的控制

  • 需要一个块来表示数据存储

  • 不能在引用的模型中访问

  • 不能在For Each subsystem块所代表的子系统中。

使用金宝app仿真软件。信号对象:

  • 提供数据存储范围和选项的模型范围控制

  • 不需要块来表示数据存储

  • 可以在引用的模型中访问,如果数据存储是全局的

注意不要将本地数据存储等同于数据存储内存块,而将全局数据存储等同于内存块金宝app仿真软件。信号对象。这两种技术都可以定义本地数据存储,信号对象可以定义本地或全局数据存储。

数据存储与数据存储内存块

创建数据存储

若要使用数据存储内存块定义数据存储,请将该块的实例拖到希望数据存储可见的最顶层的模型中。结果是一个本地数据存储,在引用的模型中是不可访问的。

  • 若要定义在给定模型的每一层都可见的数据存储(模型块内除外),请将数据存储内存块拖到模型的根层。

  • 若要定义仅在特定子系统及其包含的子系统中可见,但在Model块中不可见的数据存储,请将数据存储内存块拖到子系统中。

添加数据存储内存块之后,使用其参数定义数据存储的属性。的数据存储名称property数据存储写和数据存储读阻止访问的数据存储名称。看到数据存储内存详细信息文档。

属性可以指定数据存储属性,超出数据存储内存块参数可定义的属性数据存储名称必须解析为Simulink信号对象金宝app选项,并使用信号对象作为数据存储名称。看到使用信号对象指定属性获取详细信息。

指定数据存储内存块属性

一个数据存储内存块可以从其对应的数据存储读块和数据存储写块继承三个数据属性。可继承的属性为:

  • 数据类型

  • 复杂性

  • 样品时间

但是,允许继承这些属性可能会导致难以调试的意外结果。若要防止此类错误,请使用“数据存储内存”块对话框或金宝app仿真软件。信号对象来显式指定属性。

使用块参数指定属性

可以使用“数据存储内存”块对话框或“模型数据编辑器”数据存储TAB(在建模选项卡上,单击模型数据编辑器),指定数据存储的数据类型和复杂性。在下一个图中,块对话框设置数据类型uint16信号类型真正的

使用信号对象指定属性

你可以使用金宝app仿真软件。信号对象指定数据存储内存块的数据存储属性。

提示

要建立隐式数据存储,请参见带有信号对象的数据存储,使用与显式地将信号对象与数据存储内存块关联时相同的通用方法。

下一个图显示了一个数据存储内存块,该块指定解析为金宝app仿真软件。信号对象,名为一个.若要为数据存储使用信号对象,请设置数据存储名称到信号对象的名称。要进行编译时检查,请打开信号的属性选项卡,并选择数据存储名称必须解析为Simulink信号对象金宝app参数。

或者,在模型数据编辑器上数据存储TAB(在建模选项卡上,单击模型数据编辑器),在编辑数据存储名称时,单击附近的操作按钮并选择创造和解决.2 .在“创建新数据”对话框中设置价值金宝app仿真软件。信号

signal对象指定数据存储将继承的所有三个数据属性的值。在本例中,定义了本地数据存储金宝app仿真软件。信号对象一个具有以下继承属性:数据类型复杂性,SampleTime

A = 金宝appSimulink。信号(handle) CoderInfo: [1x1 Simulink.CoderInfo] Description: '' DataType: 'auto' Min: [] Max: [] Unit: '' Dimensions: 1 DimensionsMode: 'auto' Complexity: 'auto' SampleTime: -1 InitialValue: 0

有关为本地和全局数据存储指定信号对象属性的详细信息,请参见数据存储的信号对象属性

使用模型数据编辑器进行配置数据存储内存列表中的块。使用数据存储项的参数配置数据存储内存块。使用此技术可以配置数据存储,而无需将其定位到模型中,并将数据存储与其他接口元素一起配置,例如轮廓尺寸而且外港块。模型数据编辑器还向您显示数据存储读取而且数据存储写块在同一个列表中。

打开模型数据编辑器,在建模选项卡上,单击模型数据编辑器

带有信号对象的数据存储

创建数据存储

使用金宝app仿真软件。信号对象来定义数据存储而不使用数据存储内存块,在工作空间中创建信号对象,该对象对需要访问该数据存储的每个组件都是可见的。关联数据存储的名称是信号对象的名称。可以在数据存储读块和数据存储写块中使用此名称,就好像它是数据存储名称数据存储内存块。金宝app动态仿真模块®当使用信号对象进行数据存储时,创建关联的数据存储。

本地和全局数据存储

你可以使用金宝app仿真软件。信号对象定义本地或全局数据存储。

  • 如果在MATLAB基本工作空间或数据字典中定义对象,则结果是一个全局数据存储,它可以在Simulink中的每个模型中访问,包括所有引用的模型。金宝app

  • 如果您在模型工作区中创建对象,结果是一个本地数据存储,除了任何引用的模型之外,它可以在模型的每个级别上访问。

数据存储的信号对象属性

信号对象没有定义的那些数据存储属性具有与数据存储内存块中相同的默认值。用作数据存储的信号对象的属性值有不同的要求,具体取决于数据存储是本地的还是全局的。

创建对象之后,将信号对象的属性设置为您希望对应的数据存储属性具有的值。例如,以下命令定义名为错误在MATLAB基础工作空间中:

错误= Simu金宝applink.Signal;错误。Description = '用于表示子系统输出无效';错误。DataType = 'boolean';错误。复杂性=“真实”;错误。尺寸= 1;错误。SampleTime = 0.1;

本地数据存储的属性。对于本地数据存储,对于下面列出的每个参数,可以显式地设置值,也可以让数据存储从数据存储写块和数据存储读块继承值。

  • 数据类型

  • 复杂性

  • SampleTime

类的信号对象若要使用数据存储内存块定义本地数据存储数据存储名称参数。对于编译时检查,请在信号的属性选项卡,选择数据存储必须解析为Simulink信号对象金宝app参数。的数据存储必须解析为Simulink信号对象金宝app如果Simulink无法找到信号对金宝app象或信号对象属性与信号对象属性不一致,则该参数将导致Simulink显示错误并停止编译。

全局数据存储的属性。全局数据存储的参数要求如下表所示。

参数 全局数据存储价值
数据类型 必须显式设置。
复杂性 必须显式设置。
可以设置或继承
SampleTime 可以设置或继承

修改信号对象定义的数据存储属性。可以使用模型数据编辑器(在建模选项卡上,单击模型数据编辑器),以修改及检查数据储存的属性,数据存储读取,数据存储写块。在数据存储选项卡,以显示通过使用信号对象(如金宝app仿真软件。信号),按显示/刷新其他信息按钮。那么,如果数据存储读取数据存储写数据表中显示的块是指由信号对象定义的数据存储,表中包含与该对象对应的行。

有关更多信息,请参见模型数据编辑器

访问数据存储金宝app

写入数据存储

在每个时间步设置数据存储的值。

  1. 的实例数据存储写块在计算值的模型级别。

  2. 设置数据存储写块数据存储名称参数设置为要将数据写入其中的数据存储的名称。

  3. 将计算值的块的输出连接到数据存储写块的输入。

从数据存储中读取

获取每个时间步的数据存储的值。

  1. 的实例数据存储读取在需要该值的模型级别上阻塞。

  2. 设置数据存储读块数据存储名称参数设置为要从中读取数据的数据存储的名称。

  3. 将数据存储读块的输出连接到需要该数据存储值的块的输入。

访问全局数据存储

当连接到全局数据存储(由MATLAB工作区中的信号对象定义的数据存储)时,数据存储读或数据存储写块将显示单词全球数据存储名称上方。

订单数据存储访问

关于数据存储访问顺序

为了从数据存储中获得正确的结果,必须控制数据存储读写的执行顺序。如果数据存储的读操作发生在写操作之前,则算法中会引入延迟:读操作获得的是在前一个时间步骤中计算和存储的值,而不是在当前时间步骤中计算和存储的值。

这种延迟可能会导致系统的行为与设计不同,并且在某些情况下可能会使系统不稳定。即使这些问题没有发生,从一个Simulink版本到下一个版本,不受控制的访问顺序也可能发生变化。金宝app

本节描述显式控制数据存储读写执行顺序的几种策略。看到数据存储诊断用于在不运行模拟的情况下检测和纠正潜在数据存储错误的技术。

使用函数调用子系统排序访问

您可以使用函数调用子系统来控制访问数据存储的模型组件的执行顺序。下图展示了这种技巧:

子系统之前包含数据存储写入和状态流®Chart在调用该子系统之前调用该子系统,其中包含数据存储Read。

使用块优先级排序访问

您可以将数据存储读写嵌入到原子子系统或Model块中,其优先级指定了它们的相对执行顺序。

模型块beforeDSM优先级更低afterDSM,所以它保证先执行。自beforeDSM是原子的,它的所有操作,包括数据存储写入,将在afterDSM以及它的所有操作,包括数据存储读取。

带有总线和总线阵列的数据存储

将数据存储与总线和总线阵列一起使用的好处包括:

  • 通过将多个信号与单个数据存储相关联来简化模型布局

  • 生成生成的代码,将存储数据中的数据表示为反映总线层次结构的结构

  • 在不创建数据副本的情况下对数据存储进行写入和读取,从而实现更高效的数据访问

不能使用包含以下内容的总线或总线数组:

  • 变尺度信号

  • 不定位信号

建立一个模型来使用带有总线和总线阵列的数据存储

此过程适用于本地和全局数据存储,以及由数据存储内存块或数据存储内存块定义的数据存储金宝app仿真软件。信号对象。在执行此过程之前,必须了解如何在模型中使用数据存储,如中所述创建和应用数据存储

使用带有数据存储的总线和总线阵列:

  1. 使用Type Editor定义一个总线对象,该对象的属性与要写入和从数据存储中读取的总线数据相匹配。详细信息请参见创建并指定Simulink。金宝app总线对象

  2. 添加数据存储(使用数据存储内存块或金宝app仿真软件。信号对象)用于存储总线数据。

  3. 将总线对象指定为数据存储的数据类型。详细信息请参见指定总线对象数据类型

  4. 如果使用MATLAB结构作为数据存储的初始值,则设置配置参数>诊断>数据的有效性>先进的参数>未指定初始化检测简化.详细信息请参见指定总线元素的初始条件而且未指定初始化检测

  5. (可选)选择要写入或从数据存储中读取的各个总线元素。详细信息请参见访问特定的总线和矩阵元素

访问特定的总线和矩阵元素

选择特定的总线或矩阵元素

默认情况下,模型将所有总线和矩阵元素写入和读取数据存储。

要选择要写入数据存储或从数据存储中读取的特定总线或矩阵元素,请使用元素赋值面板数据存储写Block和元素选择面板数据存储读取块。选择特定的总线或矩阵元素提供以下好处:

  • 减少模型中的块数。例如,您可以为想要访问的每个特定总线元素消除数据存储读和总线选择器块对或数据存储写和总线分配块对)。

  • 更快地模拟具有大型总线和总线阵列的模型。

将特定元素写入数据存储

请注意

以下步骤介绍如何使用数据存储写块接口将特定元素写入数据存储。方法也可以在命令行上执行此任务DataStoreElements参数指定元素。详细信息请参见使用命令行规范

指定特定的总线或矩阵元素写入数据存储:

  1. 选择数据存储写块,并在参数对话框中选择元素赋值窗格。例如,假设您正在使用一个总线,其数据存储名为需求侧管理

    “数据存储写块参数”对话框的“元素分配”选项卡。“总线中的信号”窗格显示了一个未展开的总线DSM。

  2. 元素中的所有元素展开总线中的信号列表。

    “数据存储写块参数”对话框的“元素分配”选项卡。“总线中的信号”窗格显示了总线DSM的所有元素的展开视图。

  3. 指定要写入数据存储的元素。例如:

    • 总线中的信号列表中,点击B.然后单击选择> >要选择元素B

    • 写出的所有元素A2(在一个嵌套总线),选择A2(5、1).然后单击选择> >

    • 写…的第二个元素A2C2嵌套总线,选择A2(5、1)元素。在指定要赋值的元素文本框,编辑文本说DSM.C.C2.A2 (2, 1)

    “数据存储写块参数”对话框的“元素分配”选项卡。“总线中的信号”窗格显示了总线DSM的所有元素的展开视图。“Assigned element(s)”窗格显示了总线DSM的3个指定元素。

    有关更多示例,请参见指定要分配或选择的元素

  4. (可选)重新排序已分配的元素,这将改变端口的顺序数据存储写块。

    • 控件中的已分配元素重新排序分配元素(年代)列表中,选择要移动的元素,然后单击向上下来

    • 若要删除已分配的元素,单击删除

  5. 若要应用分配的元素,请单击好吧

    数据存储写Block为每个指定的元素都有一个端口。与每个端口相对应的所选元素的名称出现在块图标中。如果您分配了几个信号,这些添加可能会降低模型的可读性。为了提高可读性,可以扩展块的大小或创建多个块数据存储写块。

从数据存储中读取特定元素

从数据存储中读取特定元素涉及的步骤非常类似于将特定元素写入数据存储.的数据存储读取块略有不同数据存储写块。一个数据存储读取块有:

  • 一个元素选择窗格而不是元素赋值窗格

  • 一个所选元素(s)列表而不是分配元素(年代)列表

指定要分配或选择的元素

使用MATLAB矩阵元素语法指定具体的元素。有关在MATLAB中指定矩阵的详细信息,请参见创建、连接和扩展矩阵

请注意

方法选择具有动态索引的矩阵元素数据存储读取而且数据存储写块,选择启用索引元素选择/元素赋值窗格中的块参数对话框。一次只能选择一个元素进行动态索引。看到数据存储读取而且数据存储写

有效的元素规范。下表显示了指定要赋值或选择的元素的有效语法示例。这些例子使用A2的嵌套总线一个中使用的总线层次结构所示将特定元素写入数据存储

“数据存储写块参数”对话框的“元素分配”选项卡。“总线中的信号”窗格显示了总线DSM的所有元素的展开视图。

有效的语法 描述
DSM.A.A2 (::)

选择每个维度中的所有元素

DSM.A.A2(1、3、5,1)

选择第一个、第三个和第五个元素

DSM.A.A2 (2:5, 1)

选择第二个到第五个元素

无效的元素规范。下表显示了指定要赋值或选择的元素的无效语法示例。这些例子使用A2的嵌套总线一个中使用的总线层次结构所示将特定元素写入数据存储

无效的语法 语法无效的原因
DSM.A.A2 (:)

必须为每个维度指定冒号。对于这些示例中使用的总线层次结构,必须使用两个冒号。

DSM.A.A2(2:结束,1)

您不能使用结束操作符。

DSM.A.A2 (idx, 1)

不能使用变量指定索引。通过选择考虑使用动态索引启用索引元素选择/元素赋值窗格中的块参数对话框。看到数据存储读取而且数据存储写

DSM.A.A2 (1, 1)

维度1不在有效维度边界内。

使用命令行规范。要设置要写入或从中读取的元素,请使用DataStoreElements参数。使用#分隔多个元素。例如,选择数据存储写数据存储读取块中指定元素,并输入命令,例如:

set_param(gcb, 'DataStoreElements', 'DSM.A#DSM.B#DSM.C(3,4)')

该规范导致块现在有三个端口对应于您指定的元素。

重命名数据存储

重命名按块定义的数据存储

重命名数据存储所使用的位置数据存储读取而且数据存储写模型中的块。

  1. 中的“数据存储内存”块对话框中,键入新名称数据存储名称框,然后单击重命名所有

  2. 重命名所有对话框中,确认新的数据存储名称新名字字段,然后单击好吧

请注意

你不能使用重命名所有创建数据存储时,重命名数据存储金宝app仿真软件。信号对象来控制为数据存储生成的代码。相反,必须重命名对应的金宝app仿真软件。信号对象使用模型资源管理器。有关示例,请参见重命名信号对象定义的数据存储

重命名信号对象定义的数据存储

属性定义的数据存储的重命名方法金宝app仿真软件。信号对象。您可以使用Model Explorer重命名对象所使用的位置数据存储读取而且数据存储写模型或模型引用层次结构中的块。

  1. 打开模型sldemo_mdlref_dsm.该模型创建一个金宝app仿真软件。信号对象ErrorCond在MATLAB基本工作空间中使用对象作为模型引用层次结构中的全局数据存储。

    openExample(“sldemo_mdlref_dsm”)
  2. 打开模型浏览器。

  3. 模型层次结构窗格中,选择基本工作区。

  4. 内容窗格中,右键单击数据存储ErrorCond并选择重命名所有

  5. 选择一个系统对话框中,单击模型的名称sldemo_mdlref_dsm选择它作为重命名数据存储的上下文ErrorCond

  6. 选择在引用模型中搜索ErrorCond是在引用模型中使用的全局数据存储。点击好吧

    更新关系图以包括最近的更改复选框默认情况下被清除,以避免不必要的模型图更新,从而节省时间。选中复选框,通过强制图更新来合并您对模型所做的最近更改。

  7. 点击好吧以响应该消息来更新模型图。

    因为您刚刚打开了模型,所以在重命名变量之前,您必须至少更新模型图一次ErrorCond.你可以选择更新关系图以包括最近的更改选择一个系统对话框强制初始图更新,不过当您在执行多个变量重命名操作时对模型进行更改时,通常会使用该选项。

  8. 重命名所有对话框中,输入数据存储的新名称新名字方框并单击好吧

生成代码中的自定义数据存储访问函数

嵌入式编码器®提供可用于在生成的代码中指定自定义数据存储访问函数的存储类。看到使用结构存储类将参数数据组织到结构中(嵌入式编码)而且通过存储类为GetSet的函数访问数据(嵌入式编码)

另请参阅

对象

相关的话题