主要内容

用启动激活时间从变量块生成代码

此示例显示了如何生成代码启动变体激活时间。生成的代码包含所有具有常规的变体选择如果陈述。

模型

打开模型slexvariantsourceandsinkwithstartup.slx..的变体源1有条件X = = 1X = = 2对于其输入端口。块命名变体源1有一个更新图激活时间。X是一个变体控制变量,并在其中定义PostLoadFcn文件->模型属性->回调.的Sine3.当块处于活动状态时X = = 1是真的吗Sine4.当块处于活动状态时X = = 2是真的。

在命名为变体source2.块时,第一个输入端口是活动的V = = 1是真的。第二个输入端口处于活动状态时V = = 2是真的。的变体source2.有一个启动激活时间。

块命名变体汇有条件W = = 1W = = 2在输出端口上。这些条件被传播到连接的块。的Gain5块被分配了条件W = = 1的第二个输出端口变体汇块有条件W = = 2.这种情况被传播到Out4堵塞。如果你选择允许零主动变式控制变体汇块,然后是Sine5.Gain4块将被赋值为变量条件w == 1 | w == 2

Open_System(“slexVariantSourceAndSinkWithStartup.slx”);

生成代码

您可以通过单击“生成代码”构建ert.或者构建生物利用.内联变量块变体source2.变体汇使用具有参数的变体条件表达式VW.这些参数有一个'ExportedGlobal'存储类规范。当您指定一个条件表达式来确定活动选择时,表达式的每个变量控制变量都有一个与之关联的存储类。通过使用存储类,您可以控制生成代码中变量控制变量的外观和位置。存储类还可以防止优化,例如消除生成代码中对变量控制变量的存储。变量条件表达式中使用的变量必须满足特定的条件,才能用Simulink Coder或Embedded Coder生成代码。金宝app的存储类规范的详细信息启动激活时间,看到用于不同变体激活时间的存储类

自从以来变体source2.变体汇块有启动激活时间,所有选项都是可用的,从嵌入式编码器(ERT)或Simulink编码器(GRT)生成的代码将有规则金宝app如果条件。

用Embedded Coder生成的代码运行所选的变量。

if(V == 2) {rtb_Gain5 = sin((real_T)slexVariantSourceAndSinkWith_DW.);计数器* 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) {/* Sin: '/Sine1' */ rtb_Sine6 = Sin ((real_T)slexVariantSourceAndSinkWith_DW。Counter_c * 2.0 * 3.1415926535897931 / 10.0);}
if((v == 1)||(v == 2)){slexvariantsourceandsinkwiths_y.out1 = 3.0 * RTB_SINE6;}

您可以通过通过自定义代码选择活动变量系统Initiliaze堵塞。改变价值VW使用自定义代码,导航到>代码生成>自定义代码.指定#include“readvarcontrol.h”标题文件ReadVarControl.c源文件

源文件ReadVarControl.c应该包含一些代码来读取值V或者W基于要求并设置主动变体值。

#include“rtwtypes.h”extern int32_t v;extern int32_t w;void setValueOfVARControls(){//可以从传感器或硬件读取V和W的值//为简单起见,它是硬编码的。v = 2;w = 2;}

在模型初始化函数中,您可以找到设置所需值的代码VW,如下图所示。

void slexvarinatsourceandsinkwithstartup_initialize(void){setvalueofvarcontrols();utassert((w == 1)+(w == 2)== 1);utassert((v == 1)+(v == 2)<= 1);}

笔记-

1生成的代码中没有保护模型初始化函数。

2SetUpRuntimeResources开始, 和初始化调用块的方法与启动变量的激活无关。在代码生成中,这些方法不会被有条件地保护。

3.在启动激活中用作变量控制变量的参数将不会出现在生成的文件中生产技术或者ASAP2.接口。

初始化模型后,的值VW不要改变步进方法。如果您需要确保变量控制的值不会在步骤中更改,那么您必须向生成的代码添加检查,以确保变量控制的值不会在步骤中更改。

Utassert.模型初始化函数中的语句确保为变量块生成的代码行为与仿真匹配。例如,utAssert((V == 1) + (V == 2) <= 1)确保您不能拥有多个活动变量变体source2.

如果允许零主动变体控制没有选择,Utassert.语句检查对于这样的变量块,至少有一个变量选择是活动的。如果允许零主动变体控制选择了,它生成代码以确保您不能具有多个活动变量。