此示例显示如何将子系统关联在具有函数名称和文件的模型中。
学习如何:
在生成的代码中指定函数和文件名。
确定集成所需的生成代码的部分。
生成原子子系统的代码。
识别执行生成函数所需的数据。
有关本系列中的示例模型和其他示例的信息,请参见从嵌入式系统的控制算法生成C代码.
中的示例模型从嵌入式系统的控制算法生成C代码和在生成的代码中配置数据接口用虚拟子系统.虚拟子系统可视化地组织模块,但不影响模型的功能。原子子系统将模型中包含的块作为一个单元进行评估。使用原子子系统,您可以指定附加的函数分区信息。在模型中,原子子系统以粗体边框显示。
打开示例模型rtwdemo_PCG_Eval_P3.
将模型的副本保存到可写文件夹中。
这个例子展示了如何替换虚拟子系统功能呼叫子系统.函数调用子系统:
都是原子的子系统
使您能够控制子系统执行顺序
执行时函数调用信号触发器
通过控制子系统的执行顺序,您可以将模型与具有特定执行顺序的现有系统匹配。
该图标识函数调用子系统(1)PI_ctrl_1
,PI_ctrl_2
, 和pos_command_arbitration.
.
这个版本的模型包含了新的子系统Execution_Order_Control.
(2),其中包含一个statflow®图表,建模调度程序的调用功能。子系统通过函数调用信号控制函数调用子系统的执行顺序(3)。在本例的后面,您将了解改变执行顺序如何改变模拟结果。
这个版本的模型包含新的信号转换块(4)在PI控制器的输出。有了这些额外的块,代码生成器就可以为PI控制器生成一个可重入函数。
在从嵌入式系统的控制算法生成C代码和在生成的代码中配置数据接口,代码生成器创建一个单个模型
_步
函数,该函数包含控制算法代码。但是,许多应用程序需要对函数的文件位置进行更高级别的控制。通过修改原子子系统的参数,您可以在单个模型中指定多个函数。
图中显示了的子系统参数PI_ctrl_1
.
当作原子单位对待
使其他子菜单。对于原子子系统,将自动选择并禁用此参数。
样品时间
指定执行的采样时间。不适用于功能呼叫子系统。
功能包装选项
汽车
- 确定子系统如何出现在生成的代码中。此值是默认值。
内联
——将子系统代码与其余的模型代码内联。
函数
——作为函数生成子系统的代码。
可重复使用的功能
——从子系统生成可重用(可重入)函数。该函数通过形式参数传递所有输入和输出数据。函数不直接访问全局变量。
函数名的选择
选择函数
或可重复使用的功能
为函数包装启用功能名称选项。
汽车
- 确定功能。
使用子系统名称
——基于子系统名称的功能。
用户指定
——应用指定的文件名。
文件名称选项
选择函数
或可重复使用的功能
为函数包装启用文件名选项。
汽车
——将函数定义放在为父系统生成的模块中,或者,如果模型根是父系统,则放在model.c
.
使用子系统名称
——生成一个单独的文件。文件的名称是子系统或库块的名称。
使用函数名
——生成一个单独的文件。文件的名称是您使用的名称函数名的选择.
用户指定
- 应用指定的唯一文件名。
具有独立数据的函数
设置时启用函数包装来函数
.当选择时,代码生成器将子系统的内部数据(例如信号)从父模型的数据中分离出来。子系统拥有这些独立的数据。
嵌入式编码器®支持金宝app可重入代码.可重入代码是多个程序可以同时使用的可重用编程例程。可重入代码用于操作系统和其他使用多线程处理并发事件的系统软件。可重入代码不维护状态数据,因此函数中没有持久变量。调用程序维护状态变量,并且必须将状态数据传递给函数。多个用户或进程可以共享一个可重入函数的副本。
要生成重播代码,必须首先通过配置子系统参数来指定子系统作为可重用的函数包装.
在某些情况下,模型的配置会阻止可重用代码。该表列出了常见问题。
原因解决方案
在数据子系统和全局信号之间添加一个信号转换块。
生成的函数通过指针模型接收数据选择配置参数>(正式参数)引用>通过用于代码生成的值来通过固定大小标量根输入。
子系统使用全局信号数据在子系统内部算法中使用端口将全局数据进出。
要在可重用库块或子系统的范围之外定义算法参数数据(例如增益或系数),您可以应用面具,并创建掩码参数。然后可以为块或子系统的每个实例指定不同的参数值。每个掩码参数作为可重入函数的形式参数出现在生成的代码中。
在这个版本的模型中,子系统PI_ctrl_1
和PI_ctrl_2
被掩盖了。在每个面具中,值的值P
和我
收益由数据对象设置,例如i_gain_2
和P_Gain_2
.
在从嵌入式系统的控制算法生成C代码和在生成的代码中配置数据接口,您在模型的根级别生成代码。或者,您可以构建特定子系统。
要启动子系统构建,请使用上下文菜单。您可以选择以下选项:
构建此子系统:将子系统视为单独的模式,并创建完整的源C文件和头文件。这个选项不支持函数调用子系统。金宝app
生成功能:为子系统生成C代码,并创建S-Function包装器。然后可以在原始模型中模拟代码。这个选项不支持函数调用子系统。金宝app
导出功能生成C代码,而不需要调度代码构建此子系统选择。使用此选项构建使用触发器的子系统,例如函数调用子系统。
或者,选择子系统和上C代码选项卡上,单击建造.
此示例将为完整系统生成的文件与导出的功能生成的文件进行比较。您还检查了屏蔽数据如何出现在代码中。
运行这三个选项的构建脚本。然后,通过单击超链接检查生成的文件。
rtwdemo_PCG_Eval_P3.c
完整的构建:是的,阶跃函数
pi_ctrl_1:没有
pos_command_arbitration:没有
pi_ctrl_1.c.
完全建立:没有
PI_ctrl_1:是的触发函数
pos_command_arbitration:没有
pos_command_arbitration.c
完全建立:没有
pi_ctrl_1:没有
Pos_Command_Arbitration:是的,初始化和函数
pi_ctrl_reusable.c.
ert_main.c.
eval_data.c
(1)eval_data.c
在完整和导出函数构建中具有不同的内容。完整构建包括模型使用的所有参数。导出函数仅包含子系统使用的变量。
在生成的代码中屏蔽数据
在文件中rtwdemo_PCG_Eval_P3.c
,重新选址功能的呼叫站点使用数据对象P_Gain
,I_Gain
,P_Gain_2
, 和i_gain_2
作为参数。
默认情况下,Simuli金宝appnk®按此顺序执行子系统:
PI_ctrl_1
PI_ctrl_2
pos_command_arbitration.
对于此示例,您可以指定两个替代的执行顺序之一。然后,您可以使用测试线束观察执行顺序对仿真结果的效果。子系统Execution_Order_Control.
有两个控制执行顺序的配置。要选择配置,请使用子系统上下文菜单。
更改执行顺序并观察结果。
仿真结果(随时间随时间的节流位置)根据执行顺序而略有不同。当油门请求更改时,您可以看到最清楚的差异。
有关本系列的下一个示例,请参见从模型和生成的代码调用外部C代码.