从具有启动激活时间的可变块生成代码
此示例向您展示如何使用启动
变体激活时间。生成的代码包含所有使用regular的变量选择如果
语句。
模型
打开模型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
的第二个输出端口变体水槽
Block的条件是W = = 2
.该条件被传播到Out4
块。如果您选择允许零活动变量控件在变体水槽
块,然后Sine5
而且Gain4
块将被分配变量条件W = = 1 | W = = 2
.
open_system (“slexVariantSourceAndSinkWithStartup.slx”);
生成代码
您可以通过单击生成代码构建ERT或构建生物利用.内联变量块变体Source2
而且变体水槽
使用带参数的可变条件表达式V
而且W
.这些参数有一个“ExportedGlobal”
存储类规范。当您指定一个条件表达式来确定主动选择时,表达式的每个变量控制变量都有一个与其关联的存储类。通过使用存储类,您可以控制生成代码中变量控制变量的外观和位置。存储类还防止优化,例如消除生成代码中变量控制变量的存储。变量条件表达式中使用的变量必须满足一定的条件,才能用Simulink Coder或Embedded Coder生成代码。有关存储类规范的详细信息启动
激活时间,看到不同变量激活时间的存储类.
自变体Source2
而且变体水槽
块有启动
激活时间,所有的选择都是可用的,从嵌入式Coder (ERT)或Simulink Coder (GRT)生成的代码将有规则如果
条件。
用Embedded Coder生成的代码运行所选的变体。
if(V == 2) {rtb_Gain5 = sin((real_T)slexVariantSourceAndSinkWith_DW. if(V == 2) {rtb_Gain5 = sin((real_T)slexVariantSourceAndSinkWith_DW.)Counter * 2.0 * 3.1415926535897931 / 10.0);rtb_Gain4 =罪(slexVariantSourceAndSinkWith_DW (real_T)。Counter_h * 2.0 * 3.1415926535897931 / 10.0);rtb_sin6 = 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. if((V == 1) || (V == 2)) {Out1 = 3.0 * rtb_sin6;}
方法使用自定义代码选择活动变体系统Initiliaze
块。改变…的值V
而且W
使用自定义代码,导航到型号设置>代码生成>自定义代码.指定# include“ReadVarControl.h”
下头文件而且ReadVarControl.c
下源文件.
源文件ReadVarControl.c
应该包含一些代码来读取的值V
或W
根据需求并设置活动变量值。
#include "rtwtypes.h" extern int32_T V;走读生int32_T W;// V和W的值可以从传感器或硬件读取//为了简单,它是硬编码的。V = 2;W = 2;}
在模型初始化函数中,您可以找到设置所需值的代码V
而且W
,如下图所示。
void slexVarinatSourceAndSinkWithStartup_initialize(void) {SetValueOfVarControls();utAssert((W == 1) + (W == 2) == 1);utAssert((V == 1) + (V == 2) <= 1);}
请注意-
1模型初始化函数在生成的代码中不受保护。
2的SetUpRuntimeResources
,开始
,初始化
调用块的方法与启动变量激活无关。这些方法在代码生成中没有条件保护。
3.在启动激活中用作变量控制变量的参数将不会出现在生成的生产技术
或ASAP2
接口。
的值初始化模型之后V
而且W
在步进法中不要改变。如果您需要确保变量控制的值不随步骤更改,那么您必须向生成的代码添加一个检查,以确保变量控制的值不随步骤更改。
的utAssert
模型初始化函数中的语句确保为变量块生成的代码行为与模拟匹配。例如,utAssert((V == 1) + (V == 2) <= 1)
确保您不能有多个活动的变体变体Source2
.
如果允许零主动变量控制未被选中时,utAssert
语句检查对于此类变量块,至少有一个变量选择是活动的。如果允许零主动变量控制时,它生成代码以确保您不能有多个活动变量。