在生成的代码中实现数组大小的维度变量
维变异
使用符号维来模拟各种维选择集,而不需要为每个集重新生成代码。使用在块和数据对象中指定为符号的维度来设置模型。在模拟过程中,这些符号在整个模型中传播,然后进入生成的代码。模拟过程中符号的建模约束(例如,C = A + B
的预处理器条件输出model.h
或者是模型
_
types.h
文件。
您可以直接为这些块和数据对象指定尺寸信息作为符号或数值常量:
轮廓尺寸
外港
信号规范
数据存储内存
MATLAB解释函数
万博1manbetx仿真软件。信号
万博1manbetx仿真软件。参数
万博1manbetx仿真软件。公共汽车Element
AUTOSAR。Parameter
数据存储内存和解释MATLAB函数块也支持变维信号。万博1manbetx对于这些块,符号尺寸控制允许的最大大小。
您必须提供的代码万博1manbetx仿真软件。参数
包含符号维度的对象。方法提供此代码ImportedExtern
或ImportedExternPointer
内置存储类。
你使用万博1manbetx仿真软件。参数
对象将维度信息指定为符号。有关信号尺寸的更多信息,请参见信号的维度(万博1manbetx模型)。
必须在编译时修复符号维值。您不能将符号维度解析为另一个变量,然后在运行时更改它,因为您在模拟期间定义了行为。
注意:默认情况下,维度变量功能是开启的。属性可以关闭此功能允许符号维度规范(万博1manbetxSimulink)参数。
定义符号维度
本例使用该模型rtwdemo_dimension_variants
以展示如何实现符号维。该模型有四种涉及向量和矩阵的建模模式。
控件上显示块名称显示菜单,取消选择隐藏自动名称.
打开模型资源管理器。选择基本工作区窗格。
在基本工作空间中,有四个
万博1manbetx仿真软件。参数
对象,用于指定符号维度。这些万博1manbetx仿真软件。参数
对象有名称一个
,B
,C
,D
.选择
万博1manbetx仿真软件。参数
对象一个
.复习Simulink中的信息。万博1manbetx参数对话框。一个
有存储类的CompilerFlag
.重复步骤4
万博1manbetx仿真软件。参数
对象B
,C
,D
.为
万博1manbetx仿真软件。参数
对象具有ImportedDefine
自定义存储类,提供一个头文件的MATLAB路径。中插入头文件的名称HeaderFile字段。万博1manbetx参数对话框。
使用Simulin万博1manbetxk。参数对象for dimension specification, it must be defined in the base workspace and have one of these storage classes:
定义
或ImportedDefine
指定头文件CompilerFlag
用户定义的自定义存储类,它将数据定义为指定头文件中的宏
可以使用MATLAB表达式指定符号维数。有关支持的MATLAB表达式万博1manbetx的列表,请参见中的“变体条件表达式中的操作符和操作数”部分变量控制导论(万博1manbetx模型)。
指定块和数据对象的符号尺寸
打开“导入块”对话框
In2
.在信号的属性选项卡,港维字段包含万博1manbetx仿真软件。参数
对象一个
.方法中指定符号尺寸港维字段。打开“导入块”的“源块参数”对话框
In3
.在信号的属性选项卡,港维字段包含万博1manbetx仿真软件。参数
对象B
.在基本工作区中,选择
万博1manbetx仿真软件。参数
对象数据
.在Simuli万博1manbetxnk中。参数dialog box for数据
,维度字段有字符向量“(1 C)”
,等于“[1,5]”
因为C
值为5
.的价值字段包含的数组5
的维数C
尺寸是否一致数据
对象。的尺寸数据
对象的值必须始终与万博1manbetx仿真软件。参数
对象中的数据
对象维字段。数据
有一个存储类的ImportedExtern
.一个万博1manbetx仿真软件。参数
对象。万博1manbetx仿真软件。参数
对于符号维,规范必须具有任意一个的存储类ImportedExtern
或ImportedExternPointer
.的“块参数”对话框
一维查找表
块。的表数据字段包含万博1manbetx仿真软件。参数
,PT
.的断点1字段包含万博1manbetx仿真软件。参数
,PB
.在基本工作空间中,查看Simulink中的信息。万博1manbetx参数对话框。
PB
而且PT
.这些参数包含字符向量“(1 D)”
在他们的维字段和是由15个值组成的数组。的维度D
尺寸是否一致PB
而且PT
参数,因为D
值为15
.模拟模型。万博1manbetxSimulink在图中象征性地传播维度。在传播过程中,Simulink在符号之间万博1manbetx建立建模约束。万博1manbetx然后,Simulink根据当前的数值分配检查这些约束的一致性。一个建模约束
rtwdemo_dimension_variants
是,C = A + B
.的诊断查看器对任何违反约束的行为产生警告。将尺寸规范更改为不同的配置并再次模拟模型。
虽然本例中没有显示,但您可以指定一个n-D维表达式,其中一个或多个维是一个符号(例如,“(A, B, C)”
或“(1一3)”
).
为具有维度变量的模型生成代码
通过模型仿真验证了尺寸规范后,生成的代码rtwdemo_dimension_variants
.
为构建和检查过程创建临时文件夹。
currentDir = pwd;[~,cgDir] = rtwdemodir();
构建模型。
模型=“rtwdemo_dimension_variants”;rtwbuild(模型)
##开始模型的构建过程:rtwdemo_dimension_variables成功完成模型的构建过程:rtwdemo_dimension_variables
查看生成的代码。在rtwdemo_dimension_variants.h
文件中,符号维在数据声明中。
hfile = fullfile(cgDir,“rtwdemo_dimension_variants_ert_rtw”,...“rtwdemo_dimension_variants.h”);rtwdemodbtype (hfile'/*外部输入',/ *实时的, 1, 0);
/*外部输入(默认存储的根输入信号)*/ typedef struct {real_T In2[A];/* '/In2' */ real_T In3[B];/* ' /In3' */} ExtU;/*外部输出(根输出由默认存储的信号提供)*/ typedef struct {real_T Out1[A + B];/* ' /Out1' */ real_T Out2[A + B];/* ' /Out2' */} ExtY;
的rtwdemo_dimension_variants.h
文件包含数据定义和预处理器条件,用于定义模拟期间在符号之间建立的约束。这些约束之一是符号维的值必须大于1
.该文件还包括用户为any提供的头文件万博1manbetx仿真软件。参数
对象具有ImportedDefine
自定义存储类。
hfile = fullfile(cgDir,“rtwdemo_dimension_variants_ert_rtw”,...“rtwdemo_dimension_variants.h”);rtwdemodbtype (hfile#如果未定义的,/*用于访问的宏, 1, 0);
ifndef #错误的变量参数“A”没有定义# endif ifndef B #误差参数的变量“B”没有定义# endif ifndef c#误差参数的变量“C”没有定义# endif ifndef D #误差参数的变量“D”没有定义# endif / * *约束为部门业务维度变量* / #如果(1 = = 0)| | (((A + B) % 1) ! = 0) #错误“预处理器定义' 1 '不能等于零的部门“(A + B)”' 1 '一定没有余数。”#endif /* *维度变量的注册约束*/ /*约束'C == (A+B)'注册由:* '<根>/1-D查找表1' */ #if C != (A+B) #错误"预处理器定义'C'必须等于'(A+B)'" #endif #如果A <= 1 #错误"预处理器定义'A'必须大于'1'" #endif #如果B <= 1 #错误"预处理器定义'B'必须大于'1'" #endif /*约束'D > 1'注册由:* '<根>/1-D查找表1' */ #如果D <= 1 #错误"预处理器定义'D'必须大于'1'" #endif /*约束'C > 1'注册为:* '/赋值' */ #如果C <= 1 #错误"预处理器定义'C'必须大于'1'" #endif
在rtwdemo_dimension_variants.c
文件,符号维度参与循环绑定计算,数组大小和索引偏移计算,以及参数化实用函数(例如,查找表块)计算。
cfile = fullfile(cgDir,“rtwdemo_dimension_variants_ert_rtw”,...“rtwdemo_dimension_variants.c”);rtwdemodbtype(用'/*模拟步骤',/*模型初始化, 1, 0);
/*模型步长函数*/ void rtwdemo_dimension_variants_step(void) {real_T rtb_VectorConcatenate[A + B];int32_T s2_iter;int32_T ForEach_itr;real_T rtb_VectorConcatenate_m;/*增益:'<根>/增益'合并:*输入:'<根>/In2' */ for (ForEach_itr = 0;ForEach_itr <= (int32_T)(A - 1);ForEach_itr++) {rtb_VectorConcatenate[ForEach_itr] = 2.0 * rtU.In2[ForEach_itr];} /* End of Gain: '/Gain' */ /* Gain: ' /Gain1'合并:* Inport: ' /In3' */ for (ForEach_itr = 0;ForEach_itr <= (int32_T)(B - 1);ForEach_itr++) {rtb_VectorConcatenate[(int32_T)(A + ForEach_itr)] = 3.0 * rtU.In3[ForEach_itr]; } /* End of Gain: ' /Gain1' */ /* Outputs for Iterator SubSystem: ' /For Each Subsystem' incorporates: * ForEach: ' /For Each' */ for (ForEach_itr = 0; ForEach_itr <= (int32_T)((int32_T)(A + B) - 1); ForEach_itr++) { /* Sum: ' /Add' incorporates: * Constant: ' /Constant' * Lookup_n-D: ' /1-D Lookup Table1' */ rtb_VectorConcatenate_m = rtb_VectorConcatenate[ForEach_itr] + look1_binlx (Data[ForEach_itr], PB, PT, (uint32_T)((uint32_T)D - 1U)); /* ForEachSliceAssignment: ' /ImpAsg_InsertedFor_Out1_at_inport_0' incorporates: * MATLAB Function: ' /MATLAB Function' */ /* MATLAB Function 'For Each Subsystem/MATLAB Function': ' :1' */ /* ' :1:4' y = 2*u; */ rtY.Out1[ForEach_itr] = 2.0 * rtb_VectorConcatenate_m; /* Sum: ' /Add' */ rtb_VectorConcatenate[ForEach_itr] = rtb_VectorConcatenate_m; } /* End of Outputs for SubSystem: ' /For Each Subsystem' */ /* Outputs for Iterator SubSystem: ' /For Iterator Subsystem' incorporates: * ForIterator: ' /For Iterator' */ /* Constant: ' /Constant1' */ for (s2_iter = 0; s2_iter < ((int32_T)A); s2_iter++) { /* Assignment: ' /Assignment' incorporates: * Constant: ' /Constant' * Outport: ' /Out2' * Product: ' /Product' * Selector: ' /Selector' */ if (s2_iter == 0) { for (ForEach_itr = 0; ForEach_itr <= (int32_T)((int32_T)(A + B) - 1); ForEach_itr++) { rtY.Out2[ForEach_itr] = rtb_VectorConcatenate[ForEach_itr]; } } rtY.Out2[s2_iter] = rtb_VectorConcatenate[s2_iter] * 2.0; /* End of Assignment: ' /Assignment' */ } /* End of Constant: ' /Constant1' */ /* End of Outputs for SubSystem: ' /For Iterator Subsystem' */ }
关闭模型和代码生成报告。
bdclose rtwdemoclean(模型);cd (currentDir)
根据变量选择设置参数值
当您使用符号指定模型中参数的维度时,必须确保参数值与维度值一致。若要模拟维度值的不同选择,必须手动更正参数值。
例如,在rtwdemo_dimension_variants
模型,万博1manbetx仿真软件。参数
对象数据
存储一个向量值,[1 2 3 4 5]
,并使用符号维度C
带初始值5
.如果你改变C
,要模拟模型,必须确保向量值中的元素数目与的新值相匹配C
.
以减少在更改值时的维护工作C
,可设置的值数据
到一个包含C
.
打开模型。
rtwdemo_dimension_variants
在命令提示符下,检查的初始值
数据
而且C
.的价值数据
一个整数向量是从1
来C
.数据。价值
Ans = 1 2 3 4 5
C.Value
Ans = 5
在MATLAB®的值
数据
是1: C
.要保持参数对象之间的这种关系,请设置的值数据
通过使用slexpr
函数。数据。价值= slexpr(“1:C”);
为防止数据类型传播错误,可将数据类型设置为
数据
明确双
,这是参数在将参数值设置为表达式之前获取的数据类型。数据。数据Type =“双”;
设置的值
C
换一个不同的数字,比如6
.由于模型中的维度约束,您必须设置另一个维度符号的值,一个
,3.
.C.Value = 6;A.Value = 3;
模拟模型。方框图显示的值
数据
现在有六个元素。
对于更复杂的应用程序,您可以编写自己的MATLAB函数,根据维度符号返回参数值。将参数data的值设置为调用函数的表达式。
有关使用表达式设置值的一般信息万博1manbetx仿真软件。参数
对象,看到使用数学表达式设置变量值(万博1manbetx模型)。
代码生成优化注意事项
当您创建具有符号维的模型时,请注意以下优化注意事项:
仅当维度传播在缓冲区之间建立了等价性时,代码生成器才重用缓冲区。
两个具有符号环界计算的循环只有在共享等效的符号表达式时才会融合在一起。
优化不会消除基于符号维的当前值的符号表达式或条件检查。
向后兼容性
如果现有模型使用万博1manbetx仿真软件。参数
对象来指定维度,则它可能与维度变量不兼容。以下是两种常见的场景:
只有块的子集接受符号尺寸规范。如果块与符号维不兼容,则会导致更新图错误。
万博1manbetx仿真软件。参数
用于定义符号维或具有符号维的对象必须具有本示例中描述的存储类之一。如果不满足这些规范,模型的构建过程将在代码生成期间失败。
您可以通过以下方法解决这些向后兼容性问题:
属性关闭维度变量功能允许符号维度规范参数。
更新
万博1manbetx仿真软件。参数
定义符号维度或具有符号维度规范的对象。更新模型,使只有受支持的块具有符号维度或传播符号维度。万博1manbetx
万博1manbetx支撑块
有关支持的块的列表,请参见块万博1manbetx支持表。要访问该表中的信息,请输入showblockdatatypetable
在MATLAB命令提示符。不支万博1manbetx持的块(例如,MATLAB函数)仍然可以在包含符号维度的模型中工作,只要这些块不直接与符号维度交互。
在以下情况下,受支持的块不传播符号维度。万博1manbetx
为
单位延迟
Blocks,你指定a万博1manbetx仿真软件。信号
对象的符号维块的参数>状态属性>国家的名字参数。为赋值而且选择器Blocks,你设置块的参数>指数的选择参数
索引向量(对话框)
.为选择器而且赋值块,如果您为Index参数指定了符号维数,代码生成器将不支持所生成代码中的符号维数。为总和Block,你指定
|+
为块的参数>症状清单参数,然后设置块的参数>求和参数指定的尺寸
.为产品块时,指定一个值
1
为块的参数>输入数量参数,然后设置用在参数指定的尺寸
.为ForEach块时,您可以为分区宽度参数。
请注意,以下建模模式属于可能导致Simulink出错的建模模式:万博1manbetx
为开关块,一个输入信号或阈值参数具有符号维度,您可以进行选择允许不同的数据输入大小(导致输出信号大小变).
一个数据存储读取块选择元素
万博1manbetx仿真软件。公共汽车
具有符号维度的信号。为查找表块,在块的参数>算法选项卡,选择参数对所有输入数据使用一个输入端口.
限制
以下产品和软件功能支持维度变s manbetx 845量,因为它们作用于符号维度的数值。万博1manbetx这些特性不支持在模型模拟期间传播符号维,也不万博1manbetx支持在生成的代码中保存符号维。
查找表的代码替换
软件在环(SIL)和处理器在环(PIL)模拟
加速器和快速加速器模拟模式
范围和模拟观察(例如,测井、SDI等)
模型覆盖
万博1manbetxSimulink设计验证器
定点设计师
数据字典
万博1manbetxSimulink PLC编码器
高密度脂蛋白编码器
以下参数不支持维度变量:万博1manbetx
系统对象
Stateflow
物理建模
离散事件仿真
帧数据
MATLAB函数
下面的限制也适用于使用符号维的模型。
对于模拟,符号维的大小可以等于1。对于代码生成,符号维的大小必须大于
1
.如果符号维是包含算术表达式和关系表达式或逻辑表达式的MATLAB表达式,则必须添加
+ 0
在MATLAB表达式的关系或逻辑部分之后。如果不加+ 0
,模型在模拟过程中会出现错误,因为您不能混合布尔
整数或的数据类型双
数据类型。添加+ 0
表达式的关系或逻辑部分的数据类型从布尔
到一个双
.例如,假设在导入块参数对话框中港维参数具有表达式
[(C = = 8) * D + E, 3]
.的数据类型参数设置为双
.自C = = 8
是关系表达式,必须将表达式更改为(((C = = 8) + 0) * D + E, 3]
防止模型在模拟过程中产生误差。万博1manbetxSimulink为整个结构或矩阵传播符号维度,但不为结构或矩阵的一部分传播符号维度。例如,
万博1manbetx仿真软件。参数
P
是一个2 x3
具有符号维数的矩阵[暗淡,Dim1]
.p 万博1manbetx=仿真软件。参数(struct('A',[1 2 3;4 5 6])) p.DataType='Bus:bo' bo=Simulink.Bus bo.Elements(1).Name='A' bo.Elements(1).Dimensions='[Dim,Dim1]' Dim=Simulink.Parameter(2) Dim1=Simulink.Parameter(3) p.CoderInfo.StorageClass='Custom' p.CoderInfo.CustomStorageClass='Define' Dim.CoderInfo.StorageClass='Custom' Dim.CoderInfo.CustomStorageClass='Define' Dim1.CoderInfo.StorageClass='Custom' Dim1.CoderInfo.CustomStorageClass='Define'
如果你指定
年利
对于维度参数,Simulink将传播符号维度万博1manbetx[暗淡,Dim1]
.如果你指定:年利(1)
, 万博1manbetxSimulink传播数值维度3.
但不是象征层面,Dim1
.MATLAB表达式
(:)
不维护符号维信息。使用一个
代替。MATLAB表达式
P (2:)
不维护符号维信息。请使用选择器块。MATLAB表达式
: P(2日)
不是可调表达式,因此它不维护符号维信息。假设你设置了一个掩码参数的值,
myMaskParam
,通过使用结构的字段或使用结构数组中的结构的子集。对象中存储结构或结构数组万博1manbetx仿真软件。参数
对象,以便您可以使用万博1manbetx仿真软件。公共汽车
对象将符号维应用于结构字段。在掩码下,配置块参数以使用具有符号维度的字段之一。下表显示了一些例子。描述 掩码参数( myMaskParam
)块参数的值 myStruct
结构是带域的吗收益
,它使用符号维。myStruct.gains
myMaskParam
myStruct
结构是否具有字段层次结构myStruct.subStruct.gains
.这个领域收益
使用符号维。myStruct.subStruct
myMaskParam.gains
myStructs
是结构的数组。每个结构都有一个字段收益
,它使用符号维。myStructs (2)
myMaskParam.gains
在这些情况下,您不能从模型生成代码。作为一种变通方法,选择以下技术之一:
使用整个结构(
myStruct
)或结构的数组(myStructs
)作为mask参数的值。在掩码下,配置块参数,以便使用表达式从掩码参数中解引用目标字段myMaskParam.subStruct.gains
.对目标字段使用文字尺寸而不是符号尺寸(
收益
).
类中的模型参数值时,此限制也适用于使用结构的字段或结构数组中的结构子集模型块。