使用变体子系统生成的代码,使用C预处理器条件
这个例子展示了如何使用仿真软件®变体子系统生成C预处理器控制金宝app哪一个孩子条件变体子系统的子系统是活跃在生成的代码产生的仿真软件®编码器™。
概述不同子系统
一块变体子系统子系统包含两个或两个以上的孩子,一个孩子是活跃在模型执行。活动被称为孩子子系统活跃的变体。您可以通过编程方式开关活跃变体子系统的变体块通过改变变量的值基本工作空间,或通过手动覆盖变体选择使用不同的子系统块对话框。的活跃的变体是通过编程的方式连接到不同子系统的轮廓尺寸和外港块仿真软件模型编译期间®。金宝app
以编程的方式控制变量的选择,金宝appSimulink.Variant
对象与每个孩子在不同子系统子系统块对话框。金宝appSimulink.Variant
在MATLAB®基础工作区中创建对象。这些对象有一个属性命名条件
,一个表达式,其计算结果为一个布尔值,用于确定积极的变异孩子子系统。
默认情况下,生成的代码只包含活动的变体。或者,您可以参数化的选择积极的变体,并使它依赖于变量的值和基MATLAB®工作空间中的对象。生成代码时,您可以生成代码的所有变体和推迟活动变体的选择,直到时间来编译代码。
指定变体的一个子系统
打开示例模型rtwdemo_preprocessor_subsys
将运行PostLoadFcn”文件中定义:ModelProperties:回调”对话框。工作区底部填充的变量变异子系统模块。
open_system (“rtwdemo_preprocessor_subsys”)
LeftController变体子系统包含两个子子系统:线性和非线性。LeftController /线性孩子子系统仿真软件时执行。金宝app变体对象线性评估真正的
,LeftController /非线性子子系统仿真软件时执行。金宝app变体对象非线性评估真正的
。
金宝appSimulink.Variantobjects are specified for the LeftController subsystem by right-clicking the LeftController subsystem and selecting子系统参数
,这将打开LeftController子系统块对话框。
open_system (“rtwdemo_preprocessor_subsys / LeftController”);
LeftController子系统块对话框中创建了一个协会之间的线性和非线性子系统两个仿真软件。金宝app变体的对象,线性
和非线性
,工作区中存在的基础。这些对象有一个属性命名条件
,一个表达式,其计算结果为一个布尔值,确定活动的变体孩子子系统(线性或非线性)。子系统中所示的条件也是块对话框。在这个例子中,的条件线性
和非线性
是“VSSMODE = = 0”和“VSSMODE = = 1”,分别。
在这个例子中,仿真软件。金宝app不同的对象are created in the base workspace.
线性= Simul金宝appink.Variant;线性的。条件=“VSSMODE = = 0”;非线性= Simulin金宝appk.Variant;非线性。条件=“VSSMODE = = 1”;
控制变量指定一个变体
变体对象允许您重用模型在任意复杂的条件。多个变体子系统模块可以使用相同的模型。金宝app变体的对象,allowing you to toggle the activation of choices as a set. You can toggle the set prior to simulation by changing the value ofVSSMODE
在MATLAB环境中或在编译生成的代码时,在下一节中解释。在这个例子中,LeftController RightController引用相同的变量对象,这样你可以同时切换它们。
非线性控制器子系统实现磁滞,而线性控制器子系统作为简单的低通滤波器。打开左边通道子系统。子系统的通道是相似的。
生成的代码访问控制变量的变体VSSMODE
作为一个用户定义的宏。在这个例子中,rtwdemo_importedmacros.h
供应VSSMODE
。在MATLAB环境中,您指定VSSMODE
使用一个金宝appSimulink.Parameter
对象。它的值将被忽略,当生成代码包括预处理条件。然而,该值用于模拟。遗留的头文件指定使用宏的值在编译生成的代码时,最终激活指定的两个变体之一嵌入式可执行。
变量可以定义为控制变量金宝appSimulink.Parameter
与其中一个对象存储类:
定义
或ImportedDefine
指定头文件CompilerFlag
SystemConstant (AUTOSAR)
用户定义的自定义存储类,它定义了数据作为一个宏指定头文件
VSSMODE = 金宝appSimulink.Parameter;VSSMODE。值= 1;VSSMODE。数据类型=“int32”;VSSMODE.CoderInfo。StorageClass =“自定义”;VSSMODE.CoderInfo。CustomStorageClass =“ImportedDefine”;VSSMODE.CoderInfo.CustomAttributes。HeaderFile =“rtwdemo_importedmacros.h”;
模拟模型与不同的变体
因为你设置的值VSSMODE
1,在仿真模型使用非线性控制器。
sim卡(“rtwdemo_preprocessor_subsys”)youtnl =你;
如果你改变的价值VSSMODE
为0,在仿真模型使用线性控制器。
VSSMODE。值= int32 (0);sim卡(“rtwdemo_preprocessor_subsys”)youtl =你;
你可以情节和比较线性和非线性控制器的响应:
图(“标签”,“CloseMe”);情节(吹捧,youtnl.signals (1) . values,的r -吹捧,youtl.signals (1) . values,“b -”)标题(“左通道线性和非线性控制器的响应”);ylabel (“响应”);包含(的时间(秒));传奇(“非线性”,“线性”轴([0 100 -0.8 - 0.8]);
使用C预处理器条件
这个示例模型配置为生成C预处理条件。为模型,生成代码C代码将来发布的选项卡选择构建。
激活代码生成的预处理条件,检查以下条件是否正确:
选择一个嵌入式编码器®目标代码生成目标文件>系统在配置参数对话框
在不同子系统块参数对话框,设置变体激活时间参数
代码编译
。
在本例中,生成的代码包括对模型的引用。金宝app不同的对象线性
和非线性
宏的定义,以及相应的变体。这些定义依赖的价值VSSMODE
提供的外部头文件rtwdemo_importedmacros.h
。活跃的变体是由在宏使用预处理条件(#如果)(#定义)线性
和非线性
。
的宏线性
和非线性
在生成的定义吗rtwdemo_preprocessor_subsys_types.h
头文件:
的ifndef线性#定义线性(VSSMODE = = 0) # endif
#如果未定义非线性#定义非线性(VSSMODE = = 1) # endif
在生成的代码中,代码相关的变体是守卫的C预处理条件。例如,在rtwdemo_preprocessor_subsys.c
,调用步骤和每个变量的初始化函数是有条件地编译:
/ *输出原子子系统:< Root > / LeftController的线性/ * * / #如果输出和更新原子系统:< S1 > /线性的非线性/ * * / # elif输出和更新原子系统:< S1 > /非线性的* / # endif
关闭模型、图和工作空间变量的例子。
bdclose (“rtwdemo_preprocessor_subsys”)密切(findobj (0,“标签”,“CloseMe”));清晰的线性非线性VSSMODE清晰的吹捧你youtlyoutnl