一个数据存储是一个存储库,您可以向其中写入数据,也可以从中读取数据,而无需将输入或输出信号直接连接到数据存储。数据存储可以跨模型级别访问,因此子系统和引用的模型可以使用数据存储来共享数据,而不需要使用I/O端口。是否使用数据存储请参见数据库基础知识.
下面的示例说明了定义和访问数据存储的技术。看到订单数据存储访问用于在一段时间内控制数据存储访问的技术,例如确保给定的数据存储总是在读取之前写入。看到数据存储诊断对于技术,您可以使用来帮助检测和纠正潜在的数据存储错误,而无需运行任何模拟。
请注意
除以下示例外,请参见sldemo_mdlref_dsm.模型,它展示了如何使用全局数据存储在引用模型之间共享数据。
以下模型说明了本地数据存储的创建和访问,该存储器仅在模型或特定子系统中可见。
这个模型使用一个数据存储来允许子系统a发出其输出无效的信号。
如果子系统A的输出无效,则模型使用子系统B的输出。
下面的模型用功能相同的引用模型替换了前面示例的子系统,以说明如何使用全局数据存储来共享模型引用层次结构中的数据。
在本例中,top模型使用MATLAB中的信号对象®工作区来定义错误数据存储。这是必要的,因为只有当数据存储由MATLAB工作空间中的信号对象或数据字典定义时,它们才能跨模型边界可见。模型指定的代码PreLoadFcn
创建信号对象的模型回调参数。这段代码在模型加载之前执行。
请注意
要使用带有数据存储的总线和总线阵列,请执行两个都以下程序和设置模型以使用带有公共汽车和总线数组的数据存储.
以下是配置数据存储的常规工作流程。您可以以不同的顺序执行任务,或者与其余部分单独执行,具体取决于您使用数据存储的方式。
在可行的情况下,规划数据存储的使用,将其对软件验证的影响降到最低。有关更多信息,请参见数据存储和软件验证.
使用中描述的技术创建数据存储数据存储与数据存储内存块或带有信号对象的数据存储.为了提高可靠性,考虑分配而不是继承数据存储属性,如下所述指定数据存储内存块属性.
向模型添加数据存储写和数据存储读块,以便向数据存储写入和从数据存储读取数据,如使用Simulink块访问数据存储金宝app.
配置模型和访问每个数据存储的块,以避免在读写数据存储时发生并发故障,如订单数据存储访问.
应用中描述的技术数据存储诊断根据需要防止数据存储错误,或者如果在仿真期间发生,则诊断它们。
如果您想为您的模型生成代码,请参见生成代码中的数据存储(金宝app仿真软件编码器).
要创建数据存储,请创建一个数据存储数据存储内存块或金宝app仿真软件。信号
对象。块或信号对象表示数据存储并指定其属性。每个数据存储必须有一个唯一的名称。
一个数据存储内存块实现本地数据存储。看到数据存储与数据存储内存块.
一个金宝app仿真软件。信号
对象可以作为本地或全局数据存储。看到带有信号对象的数据存储.
使用数据存储内存块实现的数据存储:
金宝app支持数据存储初始化
在模型层次结构的特定级别提供对数据存储范围和选项的控制
需要一个块来表示数据存储
不能在引用的模型中访问
不能位于For Each subsystem块所代表的子系统中。
数据存储由金宝app仿真软件。信号
对象:
提供对数据存储范围和选项的模型范围控制
不需要块来表示数据存储
可以在引用的模型中访问,如果数据存储是全局的
注意不要将本地数据存储等同于数据存储内存块,而将全局数据存储等同于金宝app仿真软件。信号
对象。这两种技术都可以定义本地数据存储,信号对象可以定义本地数据存储或全局数据存储。
若要使用Data Store Memory块来定义数据存储,请将该块的实例拖放到希望数据存储可见的最高层模型中。结果是一个本地数据存储,在引用的模型中是不可访问的。
要定义在给定模型的每个级别(除了模型块)都可见的数据存储,请将data store Memory块拖动到模型的根级别。
要定义一个数据存储,它只在特定的子系统和它所包含的子系统中可见,而不在模型块中可见,请将数据存储内存块拖到子系统中。
一旦添加了数据存储内存块,使用它的参数来定义数据存储的属性。的数据存储名称属性指定数据存储写和读块访问的数据存储的名称。看到数据存储内存文档的细节。
属性,可以指定数据存储属性以外的可定义数据存储内存块参数数据存储名称必须解析为Simulink信号对象金宝app选项,并使用信号对象作为数据存储名称。看到使用信号对象指定属性获取详细信息。
数据存储内存块可以从其相应的数据存储读块和数据存储写块继承三个数据属性。可继承属性有:
数据类型
复杂性
样品时间
但是,允许继承这些属性可能会导致难以调试的意外结果。为了防止这样的错误,使用数据存储内存块对话框或金宝app仿真软件。信号
对象以显式指定属性。
使用块参数指定属性
您可以使用数据存储内存块对话框或模型数据编辑器数据存储选项卡(在建模选项卡上,单击模型数据编辑器),以指定数据存储的数据类型和复杂性。在下一个图中,块对话框设置数据类型来uint16
和信号类型来真正的
.
使用信号对象指定属性
你可以用金宝app仿真软件。信号
对象指定数据存储内存块的数据存储属性。
提示
建立隐式数据存储,如带有信号对象的数据存储,使用与显式将信号对象与数据存储内存块关联时相同的一般方法。
下一个图显示了一个数据存储内存块,它指定分辨率为金宝app仿真软件。信号
对象,命名一个
.若要使用信号对象作为数据存储,请设置数据存储名称转换为信号对象的名称。要进行编译时检查,请打开信号属性选项卡并选择数据存储名称必须解析为Simulink信号对象金宝app参数。
或者,在模型数据编辑器上数据存储选项卡(在建模选项卡上,单击模型数据编辑器),同时编辑数据存储名称,单击附近的操作按钮并选择创建和解决.在“创建新数据”对话框中,设置价值来
金宝app仿真软件。信号
.
信号对象指定数据存储将继承的所有三个数据属性的值。在本例中,它定义了一个本地数据存储金宝app仿真软件。信号
对象一个
具有以下继承属性:数据类型
,复杂性
,SampleTime
.
一个=仿金宝app真软件。信号(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 = '用来表示子系统输出无效';错误。数据类型=“布尔”;错误。复杂性=“真实”;错误。尺寸= 1;错误。SampleTime = 0.1;
本地数据存储属性。对于本地数据存储,对于下面列出的每个参数,可以显式设置值,也可以让数据存储从数据存储写和数据存储读块继承值。
数据类型
复杂性
SampleTime
要使用数据存储内存块定义本地数据存储,可以使用信号对象数据存储名称参数。为编译时检查,在信号属性选项卡中,选择数据存储必须解析为Simulink信号对象金宝app参数。的数据存储必须解析为Simulink信号对象金宝app参数导致Simulink显示错误并金宝app停止编译,如果Simulink找不到信号对象或信号对象属性与信号对象属性不一致。
全局数据存储的属性。下表介绍了全局数据存储的参数要求。
参数 | 全局数据存储值 |
---|---|
数据类型 |
必须明确设置 |
复杂性 |
必须明确设置 |
维 |
可以设置或继承 |
SampleTime |
可以设置或继承 |
修改信号对象定义的数据存储属性。您可以使用模型数据编辑器(在建模选项卡上,单击模型数据编辑器)来修改和检查数据存储的属性,数据存储读取,数据存储写入块。在数据存储选项卡,以显示通过使用信号对象(例如金宝app仿真软件。信号
),点击显示/刷新其他信息按钮。然后,如果一个数据存储读取或数据存储写入数据表中显示的数据块指由信号对象定义的数据存储,该表包括与该对象相对应的行。
有关更多信息,请参见模型数据编辑器.
设置每个时间步长的数据存储值。
对象的实例数据存储写入块在计算该值的模型级别。
设置数据存储写块数据存储名称参数设置要将数据写入的数据存储的名称。
将计算值的块的输出连接到数据存储写块的输入。
在每个时间步骤中获取数据存储的值:
对象的实例数据存储读取在需要该值的模型级别上阻塞。
设置数据存储读取块数据存储名称参数设置为要从中读取的数据存储的名称。
连接数据存储读块的输出到需要数据存储值的块的输入。
连接到全局数据存储(由MATLAB工作空间中的信号对象定义的数据存储),数据存储读取或数据存储写块显示单词全球
在数据存储名称之上。
为了从数据存储获得正确的结果,需要控制数据存储读写的执行顺序。如果数据存储的读发生在写之前,则算法引入延迟:读获得的是前一个时间步骤中计算并存储的值,而不是当前时间步骤中计算并存储的值。
这种延迟可能导致系统行为除了设计之外,在某些情况下可能使系统稳定。即使不会发生这些问题,即使发生这些问题,也可以从一个版本的Simulink到下一个释放来改变一个不受控制的访问顺序。金宝app
本节介绍几种显式控制数据存储读写执行顺序的策略。看到数据存储诊断用于在不运行模拟的情况下检测和纠正潜在的数据存储错误的技术。
您可以使用函数调用子系统来控制访问数据存储的模型组件的执行顺序。下图展示了这种技术:
子系统之前
包含数据存储写和状态流®图表在调用子系统之前调用子系统后
,其中包含“数据存储读”。
您可以将数据存储的读和写嵌入到原子子系统或模型块中,它们的优先级指定了它们的相对执行顺序。
该模型块beforeDSM
有较低的优先级吗afterDSM
,因此它保证首先执行。自beforeDSM
是原子的,它的所有操作,包括数据存储写,将在afterDSM
以及它的所有操作,包括读数据存储。
使用带有总线和总线阵列的数据存储的好处包括:
通过将多个信号与单个数据存储相关联来简化模型布局
生成代码,将存储数据中的数据表示为反映总线层次结构的结构
在不创建数据副本的情况下对数据存储进行写入和读取,从而实现更有效的数据访问
不能使用包含以下内容的总线或总线数组:
变尺度信号
不定位信号
这个过程适用于本地和全局数据存储,以及用数据存储内存块或数据存储块定义的数据存储金宝app仿真软件。信号
对象。在执行该过程之前,您必须了解如何在模型中使用数据存储,如创建和应用数据存储.
使用带有数据存储的总线和总线阵列:
使用总线编辑器定义一个总线对象,该对象的属性与要写入或从数据存储读取的总线数据相匹配。有关详细信息,请参见创建和指定Simulink。金宝app总线对象.
添加数据存储(使用数据存储内存块或金宝app仿真软件。信号
对象)以存储总线数据。
指定总线对象作为数据存储的数据类型。有关详细信息,请参见指定总线对象数据类型.
如果使用MATLAB结构作为数据存储的初始值,则设置配置参数>诊断>数据的有效性>高级参数>未指定初始化检测来简化
.有关详细信息,请参见指定总线元素的初始条件和未指定初始化检测.
(可选)选择要写入或从数据存储读取的单个总线元素。有关详细信息,请参见访问特定的总线和矩阵元素.
默认情况下,模型向数据存储写入和读取所有总线和矩阵元素。
要选择要写入或从数据存储中读取的特定总线或矩阵元素,请使用元素作业面板的数据存储写入块和元素选择面板的数据存储读取堵塞 。选择特定总线或矩阵元素提供以下优点:
减少模型中的块数。例如,您可以为要访问的每个特定总线元素消除数据存储读取和总线选择块对或数据存储编写和总线分配块对。
更快的模拟模型与大型总线和总线阵列。
请注意
下面的过程描述如何使用数据存储写块接口将特定元素写入数据存储。属性也可以在命令行执行此任务DataStoreElements
参数指定元素。有关详细信息,请参见使用命令行规范.
分配特定总线或矩阵元素以写入数据存储:
选择数据存储写入块,并在参数对话框中,选择元素作业窗格。例如,假设您正在使用一个带有名为需求侧管理
:
中的所有元素展开总线信号列表。
指定要写入数据存储的元素。例如:
在总线信号列表中,点击B
.然后单击选择>>选择元素B
.
写出…的所有元素A2
(在一个
嵌套总线),选择A2(5、1)
.然后单击选择>>.
写下第二个元素A2
在里面C2
嵌套总线,选择A2(5、1)
元素。在指定要分配的元素文本框,编辑文本说DSM.C.C2.A2 (2, 1)
.
有关更多示例,请参见指定要分配或选择的元素.
(可选)重新排序分配的元素,这将改变端口的顺序数据存储写入块。
方法中重新排列已赋值元素的方法分配元素(年代)列表,选择要移动的元素,然后单击向上或下来.
要删除指定的元素,请单击删除.
要应用分配的元素,单击好吧.
的数据存储写入块为每个指定的元素具有一个端口。与每个端口相对应的选定元素的名称出现在块图标中。如果您分配了几个信号,这些添加可能会降低模型的可读性。为了提高可读性,您可以扩展块的大小或创建多个块数据存储写入块。
从数据存储中读取特定元素涉及非常类似于向数据存储写入特定元素.的数据存储读取块略有不同于数据存储写入块。一个数据存储读取块有:
一个元素选择窗格而不是元素作业窗格
一个所选元素(s)列表而不是一个分配元素(年代)列表
使用MATLAB Matrix元素语法指定特定元素。有关在MATLAB中指定矩阵的详细信息,请参阅创建、连接和扩展矩阵.
规范有效的元素。下表显示了指定要分配或选择的元素的有效语法示例。这些例子使用A2
的嵌套总线一个
中的总线层次结构所示向数据存储写入特定元素.
有效的语法 | 描述 |
---|---|
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) |
维度 |
使用命令行规范。设置要写入或读取的元素,请使用DataStoreElements
参数。使用英镑符号(#)来分隔多个元素。例如,选择数据存储写入或数据存储读取块,您要为其指定元素并输入命令,例如:
set_param (gcb, DataStoreElements”、“DSM.A # DSM.B # DSM.C(3、4)')
该规范导致块现在有三个端口,对应于您指定的元素。
在数据存储被使用的任何地方重命名它数据存储读取和数据存储写入模型中的块。
在“数据存储内存块”对话框中,在数据存储名称框,然后单击重命名所有.
在重命名所有对话框中,确认新数据存储的名称新名字字段中,然后单击好吧
请注意
你不能使用重命名所有重命名数据存储如果您创建金宝app仿真软件。信号
对象,以控制为数据存储生成的代码。相反,您必须重命名相应的金宝app仿真软件。信号
对象使用Model Explorer。例如,看到重命名信号对象定义的数据存储.
此示例显示如何重命名由a定义的数据存储金宝app仿真软件。信号
对象。您可以使用模型资源管理器在使用对象的任何地方重命名该对象数据存储读取和数据存储写入块在模型或模型引用层次结构中。
打开模型sldemo_mdlref_dsm.
.模型创建一个金宝app仿真软件。信号
对象ErrorCond
在MATLAB基础工作空间中使用对象作为模型参考层次结构中的全局数据存储。
模型浏览器打开。
在模型层次结构窗格中,选择基本工作区。
在内容窗格中,右键单击数据存储ErrorCond
并选择重命名所有.
在选择一个系统对话框,单击模型的名称sldemo_mdlref_dsm.
选择它作为重命名数据存储的上下文ErrorCond
.
选择在参考模型中搜索自ErrorCond
是在引用模型中使用的全局数据存储。点击好吧.
的更新图表以包含最近的更改复选框在默认情况下被清除,以避免不必要的模型图更新,从而节省时间。选择复选框以通过强制更新关系图来合并您最近对模型所做的更改。
点击好吧以响应更新模型图的消息。
由于您刚刚打开模型,必须在重命名变量之前至少更新一次模型图,例如ErrorCond
.你可以选择更新图表以包含最近的更改在里面选择一个系统对话框强制初始关系图更新,不过当您在执行多个变量重命名操作时,通常会使用该选项。
在重命名所有对话框中,键入数据存储的新名称新名字框,然后单击好吧.
嵌入式编码器®提供一个存储类,您可以使用该存储类在生成的代码中指定定制的数据存储访问函数。看到通过使用结构存储类将参数数据组织成结构(嵌入式编码)和通过使用存储类GetSet的函数访问数据(嵌入式编码).
数据存储内存|数据存储读取|数据存储写入|金宝app仿真软件。信号