从变异生成代码块与启动激活时间
这个例子向您展示了如何模拟和生成代码变体街区启动激活时间。
启动与离散块变异
这个例子向您展示了如何模拟和生成代码的变体选择启动变体块组成的离散块。生成的代码包含所有与普通变量的选择如果
语句。
打开模型slexVariantSourceAndSinkWithStartup.slx
。的变体Source1
有条件X = = 1
和X = = 2
为其输入端口。块命名变体Source1
有一个更新图
激活时间。X
控制变量是一个变体中定义的吗PostLoadFcn
的文件- >模型属性- >回调。的Sine3
块是活跃的时X = = 1
是真的,吗Sine4
块是活跃的时X = = 2
是真的。
块的命名变体Source2
块,第一个输入端口是活跃的时候V = = 1
是真的。第二个输入端口是活跃的时候V = = 2
是真的。的变体Source2
有一个启动
激活时间。
块命名变体水槽
有条件W = = 1
和W = = 2
输出端口。这些条件是传播到连接块。的Gain5
块分配条件W = = 1
,第二输出端口变体水槽
块的条件W = = 2
。这个条件是传播到Out4
块。如果您选择允许控制零活跃的变体在变体水槽
块,然后Sine5
和Gain4
块将被指派变异状况W = = 1 | W = = 2
。
open_system (“slexVariantSourceAndSinkWithStartup.slx”);
你可以通过点击生成代码构建ERT或构建生物利用。内联块变体变体Source2
和变体水槽
用参数变异条件表达式V
和W
。这些参数有“ExportedGlobal”
存储类规范。当你指定一个条件表达式来确定主动选择,每个变量表达式的控制变量都有一个与之关联的存储类。通过使用存储类,您可以控制变异的外观和位置控制变量在生成的代码中。存储类也防止存储的优化,如消除变异控制变量在生成的代码中。变异条件表达式中使用的变量必须满足一定标准来生成代码与仿真软件编码器或嵌入式编码器。金宝app有关存储类规范的更多信息启动
激活时间,看到存储类激活时间为不同的变体。
自变体Source2
和变体水槽
块有启动
激活时间,所有的选择,和生成的代码嵌入编码器(ERT)或仿真软件编码器(GRT)将会定期金宝app如果
条件。
采用嵌入式编码生成的代码运行选中的变体。
如果(V = = 2) {rtb_Gain5 =罪(slexVariantSourceAndSinkWith_DW (real_T)。反* 2.0 * 3.1415926535897931/10.0);rtb_Gain4 =罪(slexVariantSourceAndSinkWith_DW (real_T)。counter_h * 2.0 * 3.1415926535897931/10.0);rtb_Sine6 = rtb_Gain5 + rtb_Gain4;}else if (V = = 1){/ *罪:“< Root > / Sine1”* / rtb_Sine6 =罪(slexVariantSourceAndSinkWith_DW (real_T)。counter_c * 2.0 * 3.1415926535897931/10.0);}
如果((V = = 1) | | (V = = 2)) {slexVariantSourceAndSinkWithS_Y。着干活= 3.0 * rtb_Sine6;}
您可以选择使用定制代码通过活跃的变体系统Initiliaze
块。改变的价值V
和W
使用自定义代码,导航到模型设置> >自定义代码生成代码。指定# include“ReadVarControl.h”
下头文件和ReadVarControl.c
下源文件。
源文件ReadVarControl.c
应该包含一些代码来读的价值吗V
或W
根据要求,设置活动变异值。
# include“rtwtypes。h”走读生int32_T V;走读生int32_T W;空白SetValueOfVarControls () {/ / V和W的值可以从传感器读取或硬件/ /为简单起见它是硬编码的。V = 2;W = 2;}
在模型中初始化函数,你会发现代码集所需的值V
和W
,如下所示。
空白slexVarinatSourceAndSinkWithStartup_initialize (void) {SetValueOfVarControls ();utAssert (W = = (1) + (W = = 2) = = 1);utAssert (V = = (1) + (V = = 2) < = 1);}
请注意- - - - - -
1。模型初始化函数是在生成的代码中不谨慎。
2。的SetUpRuntimeResources
,开始
,初始化
块的方法被称为无论激活启动变体。不谨慎的有条件地代码生成的方法。
3所示。在启动激活参数作为变量控制变量将不会出现在生成的生产技术
或ASAP2
接口。
4所示。不同控制变量的值应该只有在改变model_initialize
函数。你不应该改变变量值的控制model_step
函数使用任何自定义代码,因为生成的代码可能不处理状态的手之间的变异。您可以添加一个检查生成的代码,以避免任何改变变量值的控制model_step
功能,但这可能会影响生成的代码的性能。
5。的utAssert
语句在模型中初始化函数确保生成的代码块匹配与仿真行为变体。例如,utAssert (V = = (1) + (V = = 2) < = 1)
确保你不能有一个以上的活跃的变体变体Source2
。
6。如果允许控制零活跃的变体没有选择,utAssert
声明检查至少一个变体的选择是积极的变体。如果允许控制零活跃的变体被选中时,它生成的代码来确保你不能有一个以上的活跃的变体。
启动变异与连续状态块
这个例子向您展示了如何模拟和生成代码的变体选择启动变体阻塞组成的连续状态。在生成的代码中,所有的衍生品连续块设置为0,然后分配适当的值在常规如果
语句。
考虑这个模型包含源数据块的一个变体启动
激活时间。模型包含连续块Integ1
与它的初始条件设置为0
和Integ2
与它的初始条件设置为1
。变异源块使您可以激活或禁用您的模型的某些部分包括块连续状态。在仿真过程中,输入端口的变异源块时变得活跃V = = 1
计算结果为真正的
和变异源的输入端口块变得不活跃的时候V = = 1
计算结果为假
。不活跃的状态连续块初始化为零。
生成的代码的变体选择启动变体阻塞由连续状态,设置解算器类型固定步
和代码生成目标non-ERT目标等grt.tlc
。连续的块的衍生品在生成的代码设置为0。
空白test_cont2_abs_derivatives (void) {XDot_test_cont2_abs_T * _rtXdot;_rtXdot = ((XDot_test_cont2_abs_T *) test_cont2_abs_M - >引出);
/ *衍生品为积分器:“< Root > / Integrator1”* / _rtXdot - > Integrator1_CSTATE = 0.0;
/ *衍生品为积分器:“< Root > /集成商”* / _rtXdot - > Integrator_CSTATE = 0.0;
/ *衍生品为积分器:“< Root > / Integrator1”包含:*积分器:“< Root > /集成商”* /如果(test_cont2_abs_P。V = = 1。0) { _rtXdot->Integrator1_CSTATE = test_cont2_abs_B.Integrator; _rtXdot->Integrator_CSTATE = test_cont2_abs_B.Gain; } }