controller调用controller的方法_【笔记】Simulink C语言代码生成与使用方法

导言:Simulink作为极具特色的控制系统设计软件,由于其极易上手以及十分友好的界面设计与简单易用的使用方法颇受研究者以及从业者的喜爱。但在一些特殊应用场景,尤其是像笔者一样需要构建基于C语言的UDF时,很难直接调用Simulink 进行控制系统与非线性动力系统的耦合。 这时候比起重新构建控制函数,使用Simulink 的 Coder Generation 功能可以高效而简洁地生成控制函数。本笔记将对代码生成,以及控制函数的调用进行讲解。

1. 控制Loop的构建

v2-4d852ef72c4ee4b88bd8a19f35052850_b.jpg
图1. 示例回路,包含一个输入与一个输出接口

作为简单的示例以及验证模型,这里建立一个最简单的风车力矩控制模块[1]( Region 2 ),控制区间的关系可由一简单的二次函数来表示:

该控制模型包含两个接口:

Gen speed rad/s | 输入 >> 当前电机的转速
Generator torque demend | 输出 >> 目标电机力矩

2. 控制Loop的C语言代码生成

完成控制loop的构建后,可以在Simulink的APPS栏(本文以Matlab 2020a 版本为例)找到Embedded Coder[2](或Simulink Coder)模块进行C/C++ 代码的生成。

v2-25b7e8c5d9b03324565db9bcefc7270d_b.jpg
图2. Embedded Coder

但在生成代码之前,建议先对Simulink模型的参数配置进行调整。

MODELING > Model Settings > Solver

v2-3df96a4b2dd6f137e49bf4cf1d3384e3_b.png

v2-6dc9ac2c26851254e33e3f8a12b106ff_b.jpg

在这里,步长配置为固定步长(Fixed-step),求解器选为ode4,步长设置为1,终止时间设为inf。对于涉及到积分控制的模型,可以在生成后的代码中对时间步进行更改。之后,需要对代码生成器的设置进行调整。

MODELING > Model Settings > Code Generation

v2-7897142cfa73118e3694706424714aec_b.jpg

生成的系统目标文件可更改为自己想要的名称,这里以默认的ert.tlc作为目标文件。语言选为C语言(根据实际需求也可生成C++代码)。在Build Process中记得一定把 Genenrate Code OnlyPackage code and artifacts 选中。这里是为了将控制模型中涉及到的所有文件打包到一起,防止使用时头文件以及所需的源文件缺失。其他设置可根据需求进行选择。

配置参数设置结束后就可以进行代码的生成了。点击APPS中的Embeded Coder 就会弹出现C CODE 选项页。此时点击 Generate Code,Simulink 就可以生成所需要的代码。若版本为2019以上,则可以直接在右边窗口看到生成的与各模块一一对应的源代码。用鼠标选中相应部分还可以看到高亮的控制组件。

v2-fda4519cfb05a701826149ad69c20b51_b.jpg

v2-0a03c7f4c7781df32461707d11a73c32_b.jpg

代码生成结束后,可以在文件夹中找到以“ert_rtw”为后缀的文件夹,打开该文件就可以找到生成的控制模型源文件与头文件。

v2-09f7ccb6ed296cf5247e036c0f990e7d_b.jpg

其中以 main 结尾的文件为示例文件,在程序设计使用中可以作为参照。至此,代码生成便结束了,接下来将对生成的C语言代码的使用进行介绍。

3. C语言代码的使用

在使用生成的代码前,我们首先观察生成的 "GenTrq_R2_Controller.c" 模型源文件。在源文件中可以看到三个关键函数:

GenTrq_R2_Controller_initialize(void) /* Model initialize function */ GenTrq_R2_Controller_step(void) /* Model step function */ GenTrq_R2_Controller_terminate(void) /* Model terminate function */

其中 initialize 函数与 terminate 函数用于控制函数的初始化与函数的终止。step 函数则包含了模型的控制函数。每执行一次 step 函数将对信号进行一次更新,这里可以理解为一个控制周期。

观察该 GenTrq_R2_Controller_step(void) 函数,我们可以发现,这里包含了两个关键的接口 GenTrq_R2_Controller_YGenTrq_R2_Controller_U。Y U 接口分别代表输出与输入,U.Genspeed 在这里用于输入当前转速,Y.Generatortorque 用于输出目标力矩的控制信号。

/* Model step function */

在理解了控制函数的结构后,便可以在VS中构建测试文件,尝试运行生成的C语言代码。首先在VS中创建空项目,将刚才得到的源文件与头文件放入相同文件夹内,并导入到VS中。

v2-2be12267bac8ce33a2f7d0edd244aae7_b.jpg

在构建测试代码时一定要将最主要的头文件包含到代码中。

#include "GenTrq_R2_Controller.h"

由此我们便可构建一段测试代码,该代码用 for 循环每个周期更新一次输入变量,并输出一次结果并储存。详细代码如下:

#define _CRT_SECURE_NO_WARNINGS

v2-d295c096b5b430a5d0c8522d797acfb8_b.jpg
Simulink 结果与 C 语言代码结果的对比

执行并导出结果后,我们可以绘制得到控制函数在Region 2的输出结果如上图所示。与原控制函数相比,结果完全重合。至此代码的测试与模型的检证便完成了。本次测试案例也只选用较为简单的模型,对于较为复杂的模型,实际的操作方法与生成的C语言代码依据控制系统的复杂程度会有所不同。

4. 测试平台,软件

  • Windows 10 Education ver.2004
  • Matlab 2020a Acadamic
  • Visual Studio 2019 Comunity

注:本文仅为个人研究笔记,难免会遇到错误。有任何问题请在评论中提出,不胜感激。

参考

  1. ^Jonkman, Jason, et al. Definition of a 5-MW reference wind turbine for offshore system development. No. NREL/TP-500-38060. National Renewable Energy Lab.(NREL), Golden, CO (United States), 2009. https://www.nrel.gov/docs/fy09osti/38060.pdf
  2. ^Simulink Embeded Coder https://jp.mathworks.com/products/embedded-coder.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值