导言: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。YU 接口分别代表输出与输入,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

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

  1. python字符串截取方法_如何使用python语言中的字符串方法截取字符串

    在我们使用python语言中的字符串方法时,可能会判断某个字符串是否以什么开头,可以使用什么进行截取等.下面利用几个实例说明字符串中的方法的用法,操作如下: 工具/原料 python 截图工具 方法/ ...

  2. controller调用controller的方法_你想过 Controller 这些方法里的参数是如何工作的吗?...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 前言 SpringMVC是目前主流的Web MVC框架之一.Spr ...

  3. go 调用c 编译器找不到方法_深度解密Go语言之关于 interface 的10个问题

    这次文章依然很长,基本上涵盖了 interface 的方方面面,有例子,有源码分析,有汇编分析,前前后后写了 20 多天.洋洋洒洒,长篇大论,依然有些东西没有涉及到,比如文章里没有写到反射,当然,后面 ...

  4. python3中format方法_[翻译]python3中新的字符串格式化方法-----f-string

    从python3.6开始,引入了新的字符串格式化方式,f-字符串. 这使得格式化字符串变得可读性更高,更简洁,更不容易出现错误而且速度也更快. 在本文后面,会详细介绍f-字符串的用法. 在此之前,让我 ...

  5. java的equals方法_在Java中编写完美的equals方法

    相对于C++,Java并没有重载操作符,所以对于非基本类型都需要使用equals方法比较相等性.Object提供了equals方法比较两个对象,但对于用户自定义类而言Object提供的版本仅仅比较两个 ...

  6. java中的invoke方法_详解Java中Method的Invoke方法

    在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到M ...

  7. dwr框架查看外放方法_硬核!教你三种方法,实现微信自定义修改地区!

    前几天,有小伙伴问怎样自定义修改微信地区?当时说的第二天分享,结果在录制第二种方法的时候,突发意外,出现"微信以停止运行"的状况,明明早上还好好的,怎么就打不开了呢?也木有做任何操 ...

  8. 台式计算机无法开机原因,台式电脑无法启动的原因和解决方法_电脑不能启动的原因与解决方法...

    电脑开不了机是一件很让人头疼的事情,相信许多人都遇到过这样的情况,而很多朋友却不知道如何解决此问题,其实电脑无法启动的原因多种多样,弄明白问题是由硬件还是软件引起有助于解决问题.那么台式电脑无法启动的 ...

  9. 单片机定时器精准定时_单片机入门-C51语言采用定时器查询方法获取1秒精准定时...

    原标题:单片机入门-C51语言采用定时器查询方法获取1秒精准定时 视频如下: 51系列单片机含有专用的 定时器/计数器,定时器/计数器是一个二进制的加1寄存器,当启动后就开始从所设 定的计数初始值开始 ...

  10. html语言的网页制作方法与技巧探讨,HTML语言的网页制作方法与技巧探讨

    HTML语言的网页制作方法与技巧探讨 匡成宝 [期刊名称]<电脑迷> [年(卷),期]2017(000)003 [摘要]现代社会网络应用已经是极为常见的,甚至是不可缺少的,无论是工作还是生 ...

最新文章

  1. server sql 数据c盘迁移d盘_oracle 11g dbf数据文件从C盘迁移到D盘
  2. 安装 ssh 的公开密匙到 iPhone 上
  3. 揭开ASP.NET生成随机密码的面纱
  4. tomcat集群 (自带Cluster集群)
  5. ultraedit26 运行的是试用模式_如何并行运行你的自动化测试?
  6. windbg script ---- 禁用IsDebuggerPresent
  7. android模拟器上传,电脑文件怎么传到夜神android模拟器 文件上传夜神模拟器
  8. javascript框架比较(四)
  9. linux下I2C驱动架构全面分析
  10. 美团取消支付宝支付是“合情合理”?
  11. 计算机VFP基础知识,计算机二级《VFP》考试基础知识:VisualFoxPro基础
  12. 用python画钢铁侠_Matplotlib绘制漫威英雄战力图,带你飞起来!
  13. vue 一个动态链接url转成二维码
  14. android导入库项目,如何在android studio项目中导入开源库?
  15. 百度云服务器远程密码忘记,2020-11-17 新买了百度云服务器,如何用ssh远程登陆...
  16. 《LaneAF:Robust Multi-Lane Detection with Affinity Fields》论文笔记
  17. 怎么把游戏隐藏到计算机,怎么将电脑游戏隐藏桌面
  18. ERROR: Unable to launch the RTL Schematic process. The input NGR file, Can not fnd the module的解决方法
  19. 表格数据深度学习框架-DeepTables
  20. 用计算机进行计算ppt,苏教版四上周濮玉(用计算器计算)PPT.ppt

热门文章

  1. 第14章 学习scikit-learn文档
  2. 传智播客 sklearn数据集与机器学习组成
  3. property属性学习
  4. Word2013无法正常加载mathtype
  5. 190311每日一句
  6. 坚持就是成功,没有成功就是你失败的次数太少
  7. unity每次运行总是game窗口最大化怎么解决?
  8. 番茄助手破解找到VA_X.dll的位置
  9. Atitit java func interface sumup 目录 1. 函数式接口 1 1.1.1. 什么是函数式接口? 1 1.2.  Function, Supplier, Cons
  10. Atitit 项目培训与学校的一些思路总结