主要内容

在生成的代码中实现数组大小的维度变量

维变异

使用符号维来模拟各种维选择集,而不需要为每个集重新生成代码。使用在块和数据对象中指定为符号的维度来设置模型。在模拟过程中,这些符号在整个模型中传播,然后进入生成的代码。模拟过程中符号的建模约束(例如,C = A + B的预处理器条件输出model.h或者是模型_types.h文件。

您可以直接为这些块和数据对象指定尺寸信息作为符号或数值常量:

  • 轮廓尺寸

  • 外港

  • 信号规范

  • 数据存储内存

  • MATLAB解释函数

  • 金宝app仿真软件。信号

  • 金宝app仿真软件。参数

  • 金宝app仿真软件。公共汽车Element

  • AUTOSAR。Parameter

数据存储内存和解释MATLAB函数块也支持变维信号。金宝app对于这些块,符号尺寸控制允许的最大大小。

的初始化代码金宝app仿真软件。参数包含符号维度的对象。为了防止生成的代码初始化这些参数,您必须:

  • 类使用存储类,请配置参数数据范围属性设置为进口,例如ImportedExternImportedExternPointer内置存储类。

  • 类使用存储类,请配置参数数据初始化属性设置为没有一个

你使用金宝app仿真软件。参数对象将维度信息指定为符号。有关信号尺寸的更多信息,请参见确定信号尺寸

必须在编译时修复符号维值。您不能将符号维度解析为另一个变量,然后在运行时更改它,因为您在模拟期间定义了行为。

注意:默认情况下,维度变量功能是开启的。属性可以关闭此功能允许符号维度规范参数。

定义符号维度

本例使用该模型rtwdemo_dimension_variants以展示如何实现符号维。该模型有四种涉及向量和矩阵的建模模式。

  1. 控件上显示块名称调试选项卡,在信息覆盖菜单,清除隐藏自动块名称参数。

  2. 打开嵌入式编码器应用程序。C代码选项卡上,选择代码接口>单个元素代码映射

  3. 在“代码映射”编辑器中参数选项卡,单击刷新按钮。七个金宝app仿真软件。参数对象出现。其中四个对象用于指定符号维度。这些金宝app仿真软件。参数对象有名称一个BC,D.注意,这些参数有一个存储类CompilerFlag

使用金宝app仿真软件。参数对象,它必须在基本工作空间中定义,并具有以下存储类之一:

  • 定义ImportedDefine指定头文件

  • CompilerFlag

  • 用户定义的自定义存储类,它将数据定义为指定头文件中的宏

金宝app仿真软件。参数对象具有ImportedDefine自定义存储类,提供一个头文件的MATLAB路径。中插入头文件的名称HeaderFile字段。金宝app参数对话框。

可以使用MATLAB表达式指定符号维数。有关支持的MATLAB表达式金宝app的列表,请参见中的“变体条件表达式中的操作符和操作数”部分变量控制导论

指定块和数据对象的符号尺寸

  1. 单击导入块In2.在属性检查器上参数选项卡,港维字段包含金宝app仿真软件。参数对象一个.方法中指定符号尺寸港维字段。

  2. 点击导入块In3.的港维字段包含金宝app仿真软件。参数对象B

  3. 单击Constant块。的恒定值参数的值为数据.在“代码映射”编辑器中参数选项卡,单击金宝app仿真软件。参数对象数据.在属性检查器上,Field是字符向量“(1 C)”,等于“[1,5]”因为C值为5.的价值字段包含的数组5值,这与它的维度是一致的。数据对象的维数必须与金宝app仿真软件。参数对象中的字段。请注意,数据有一个存储类ImportedExtern

  4. 打开一维查找表块参数对话框。的表数据字段包含金宝app仿真软件。参数PT.的断点1字段包含金宝app仿真软件。参数PB

  5. 在代码映射编辑器中,单击PB而且PT并查看它们的属性。这些参数包含字符向量“(1 D)”在他们的字段和是由15个值组成的数组。的价值D是否与尺寸一致PB而且PT参数,因为D值为15

  6. 模拟模型。金宝appSimulink在图中象征性地传播维度。在传播过程中,Simulink在符号之间金宝app建立建模约束。金宝app然后,Simulink根据当前的数值分配检查这些约束的一致性。一个建模约束rtwdemo_dimension_variants是,C = A + B.的诊断查看器对任何违反约束的行为产生警告。

  7. 将尺寸规范更改为不同的配置并再次模拟模型。

虽然本例中没有显示,但您可以指定一个n-D维表达式,其中一个或多个维是一个符号(例如,“(A, B, C)”“(1一3)”).要保存多维信息,必须指定一个n-D维表达式,其中要保存的每个维都是一个符号。

为具有维度变量的模型生成代码

通过模型仿真验证了尺寸规范后,生成的代码rtwdemo_dimension_variants

为构建和检查过程创建临时文件夹。

currentDir = pwd;[~,cgDir] = rtwdemodir();

构建模型。

模型=“rtwdemo_dimension_variants”;slbuild(模型)
###开始构建过程:rtwdemo_dimension_variables成功完成构建过程:rtwdemo_dimension_variables构建摘要顶级模型目标构建:模型动作重建原因=========================================================================================================== rtwdemo_dimension_variables生成和编译的代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 14.004s

查看生成的代码。在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提供的头文件金宝app仿真软件。参数对象具有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'注册由:*“< Root > /一维查找表1”* / #如果D < = 1 #错误“预处理器定义' D '必须大于1”# endif / *约束C > 3的注册:* < S2 > /分配的* / #如果C < = 3 #错误“预处理器定义“C”必须大于3”# endif #如果> = 11 #错误“预处理器定义' A '必须小于11”# endif #如果B > = 11 #错误“预处理器定义B必须小于11”# endif / *约束' D < 21 '注册:* '<根>/1-D查找表1' */ #if D >= 21 #错误"预处理器定义'D'必须小于'21'" #endif /*约束'C < 11'注册为:* '/赋值' */ #if C >= 11 #错误"预处理器定义'C'必须小于'11'" #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];real_T rtb_VectorConcatenate_m;int32_T ForEach_itr;int32_T我;int32_T s2_iter;/*增益:'<根>/增益'合并:*输入:'<根>/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 = look1_binlx(Data[ForEach_itr], PB, PT, (uint32_T) (int32_T)(D - 1)) + rtb_VectorConcatenate[ForEach_itr]; /* ForEachSliceAssignment generated from: '/Out1' 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' */ ForEach_itr = ((int32_T)A); if (((int32_T)A) < 0) { ForEach_itr = 0; } /* End of Constant: '/Constant1' */ for (s2_iter = 0; s2_iter < ForEach_itr; s2_iter++) { /* Assignment: '/Assignment' incorporates: * Constant: '/Constant' * Outport: '/Out2' * Product: '/Product' * Selector: '/Selector' */ if (s2_iter == 0) { for (i = 0; i <= (int32_T)((int32_T)(A + B) - 1); i++) { rtY.Out2[i] = rtb_VectorConcatenate[i]; } } rtY.Out2[s2_iter] = rtb_VectorConcatenate[s2_iter] * 2.0; /* End of Assignment: '/Assignment' */ } /* End of Outputs for SubSystem: '/For Iterator Subsystem' */ }

关闭模型和代码生成报告。

bdclose rtwdemoclean(模型);cd (currentDir)

根据变量选择设置参数值

当您使用符号指定模型中参数的维度时,必须确保参数值与维度值一致。若要模拟维度值的不同选择,必须手动更正参数值。

例如,在rtwdemo_dimension_variants模型,金宝app仿真软件。参数对象数据存储一个向量值,[1 2 3 4 5],并使用符号维度C带初始值5.如果你改变C,要模拟模型,必须确保向量值中的元素数目与的新值相匹配C

以减少在更改值时的维护工作C,可设置的值数据到一个包含C

  1. 打开模型。

    rtwdemo_dimension_variants

  2. 在命令提示符下,检查的初始值数据而且C.的价值数据一个整数向量是从1C

    数据。价值
    Ans = 1 2 3 4 5
    C.Value
    Ans = 5

  3. 在MATLAB®的值数据1: C.要保持参数对象之间的这种关系,请设置的值数据通过使用slexpr函数。

    数据。价值= slexpr(“1:C”);

  4. 为防止数据类型传播错误,可将数据类型设置为数据明确,这是参数在将参数值设置为表达式之前获取的数据类型。

    数据。数据Type =“双”

  5. 设置的值C换一个不同的数字,比如6.由于模型中的维度约束,您必须设置另一个维度符号的值,一个,3.

    C.Value = 6;A.Value = 3;

  6. 模拟模型。方框图显示的值数据现在有六个元素。

对于更复杂的应用程序,您可以编写自己的MATLAB函数,根据维度符号返回参数值。将参数data的值设置为调用函数的表达式。

有关使用表达式设置值的一般信息金宝app仿真软件。参数对象,看到使用数学表达式设置变量值

代码生成优化注意事项

当您创建具有符号维的模型时,请注意以下优化注意事项:

  • 仅当维度传播在缓冲区之间建立了等价性时,代码生成器才重用缓冲区。

  • 两个具有符号环界计算的循环只有在共享等效的符号表达式时才会融合在一起。

  • 优化不会消除基于符号维的当前值的符号表达式或条件检查。

向后兼容性

如果现有模型使用金宝app仿真软件。参数对象来指定维度,则它可能与维度变量不兼容。以下是两种常见的场景:

  • 只有块的子集接受符号尺寸规范。如果块与符号维不兼容,则会导致更新图错误。

  • 金宝app仿真软件。参数用于定义符号维或具有符号维的对象必须具有本示例中描述的存储类之一。如果不满足这些规范,模型的构建过程将在代码生成期间失败。

您可以通过以下方法解决这些向后兼容性问题:

  • 属性关闭维度变量功能允许符号维度规范参数。

  • 更新金宝app仿真软件。参数定义符号维度或具有符号维度规范的对象。

  • 更新模型,使只有受支持的块具有符号维度或传播符号维度。金宝app

金宝app支撑块

有关支持的块的列表,请参见块金宝app支持表。要访问该表中的信息,请输入showblockdatatypetable在MATLAB命令提示符。不支金宝app持的块(例如,MATLAB函数)仍然可以在包含符号维度的模型中工作,只要这些块不直接与符号维度交互。

在以下情况下,受支持的块不传播符号维度。金宝app

  • 赋值而且选择器Blocks,你设置块的参数>指数的选择参数索引向量(对话框).为选择器而且赋值块,如果您为Index参数指定了符号维数,代码生成器将不支持所生成代码中的符号维数。

  • 产品块时,指定一个值1块的参数>输入数量参数,然后设置用在参数指定的尺寸

  • ForEach块时,您可以为分区宽度参数。

请注意,以下建模模式属于可能导致Simulink出错的建模模式:金宝app

  • 开关块,一个输入信号或阈值参数具有符号维度,您可以进行选择允许不同的数据输入大小(导致输出信号大小变)

  • 一个数据存储读取块选择元素金宝app仿真软件。公共汽车具有符号维度的信号。

  • 查找表块,在块的参数>算法选项卡,选择参数对所有输入数据使用一个输入端口

限制

以下产品和软件功能支持维度变下载188bet金宝搏量,因为它们作用于符号维度的数值。金宝app这些特性不支持在模型模拟期间传播符号维,也不金宝app支持在生成的代码中保存符号维。

  • 查找表的代码替换

  • 软件在环(SIL)和处理器在环(PIL)模拟

  • 加速器和快速加速器模拟模式

  • 范围和模拟观察(例如,测井、SDI等)

  • 模型覆盖

  • 金宝appSimulink设计验证器

  • 定点设计师

  • 数据字典

  • 金宝appSimulink PLC编码器

  • 高密度脂蛋白编码器

以下参数不支持维度变量:金宝app

  • 系统对象

  • 使用MATLAB作为动作语言的状态流程图

  • 物理建模

  • 离散事件仿真

  • 帧数据

  • MATLAB函数

下面的限制也适用于使用符号维的模型。

  • 对于模拟,符号维的大小可以等于1。对于代码生成,符号维的大小必须大于1

  • 如果符号维是包含算术表达式和关系表达式或逻辑表达式的MATLAB表达式,则必须添加+ 0在MATLAB表达式的关系或逻辑部分之后。如果不加+ 0,模型在模拟过程中会出现错误,因为您不能混合布尔整数或的数据类型数据类型。添加+ 0表达式的关系或逻辑部分的数据类型从布尔到一个

    例如,假设在导入块参数对话框中港维参数具有表达式[(C = = 8) * D + E, 3].的数据类型参数设置为.自C = = 8是关系表达式,必须将表达式更改为(((C = = 8) + 0) * D + E, 3]防止模型在模拟过程中产生误差。

  • 金宝appSimulink为整个结构或矩阵传播符号维度,但不为结构或矩阵的一部分传播符号维度。例如,金宝app仿真软件。参数P是一个2 x3具有符号维数的矩阵[暗淡,Dim1]

    p 金宝app=仿真软件。参数(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将传播符号维度金宝app[暗淡,Dim1].如果你指定:年利(1), 金宝appSimulink传播数值维度3.但不是象征层面,Dim1

  • MATLAB表达式(:)不维护符号维信息。使用一个代替。

  • MATLAB表达式P (2:)不维护符号维信息。请使用选择器块。

  • MATLAB表达式: P(2日)不是可调表达式,因此它不维护符号维信息。

  • 假设你设置了一个掩码参数的值,myMaskParam,通过使用结构的字段或使用结构数组中的结构的子集。对象中存储结构或结构数组金宝app仿真软件。参数对象,以便您可以使用金宝app仿真软件。公共汽车对象将符号维应用于结构字段。在掩码下,配置块参数以使用具有符号维度的字段之一。下表显示了一些例子。

    描述 掩码参数(myMaskParam 块参数的值
    myStruct结构是带域的吗收益,它使用符号维。 myStruct.gains myMaskParam
    myStruct结构是否具有字段层次结构myStruct.subStruct.gains.这个领域收益使用符号维。 myStruct.subStruct myMaskParam.gains
    myStructs是结构的数组。每个结构都有一个字段收益,它使用符号维。 myStructs (2) myMaskParam.gains

    在这些情况下,您不能从模型生成代码。作为一种变通方法,选择以下技术之一:

    • 使用整个结构(myStruct)或结构的数组(myStructs)作为mask参数的值。在掩码下,配置块参数,以便使用表达式从掩码参数中解引用目标字段myMaskParam.subStruct.gains

    • 对目标字段使用文字尺寸而不是符号尺寸(收益).

    类中的模型参数值时,此限制也适用于使用结构的字段或结构数组中的结构子集模型块。

相关的话题