Simulink模型的C++代码化及VS的调用操作

    技术2024-06-24  191

    Simulink模型的C++代码化及VS的调用操作

    1.本文使用软件为matlab2018b和vs2015 2.本文综合了许多参考资料,最终得以实现,侵删 3.代码在博主的上传资源中下载

    一、Simulink模型的C++代码化

    对于Simulink模型本身,首先要注意的是,必须是能够进行C/C++ Coder的模块才能进行代码化,这个能在每个模块的help帮助文档中进行查看。 这里以2自由度PID控制器为例:Simulink模型名称为“Copy_of_preWT”, 输入分别是参考转速wr_ref,实际转速wr,输出为桨距角beta。 在建立好需要进行代码化的模型之后,点击选项卡中的“simulation”–>"Model Configuration Parameters"进行设置:

    模型的求解器必须是定步长的,所以需要在“Solver”–>“Solver selection”–>"Type"中选择“Fixed-step”,这里“Solver”选择“ode4”,同时定步长设置为0.005。

    在“Code Generation”中进行代码生成的详细设置: (1)“Target selection”–>"System target file"选择“grt.tlc”,生成可用于VS待调用的文件 “Language” 选择C++,“Build process”中勾选“Generator code only”和“Package code and artifacts”, “Zip file name”设置为“pid2dof”(可自行定义),来生成一个名为“pid2dof”的压缩包。压缩包包含了所有VS需要引用的文件的,这样比较方便引用,省去了可能需要单独寻找包含文件的麻烦。 (2)“Report”设置:勾选“Create code generation report”和“Open report automatically”,设置之后会在代码生成结束之后生成一份详细的报告,有助于对代码中函数和输入输出数据类型的理解。 (3)依次点击右下角的“Apply”和“OK”,完成设置。

    以上,完成了代码生成的所有设置。但是系统由此生成的变量名称是默认的,导致代码可读行较差。因此,需要对信号进行处理,尤其是输入输出信号进行定义,以生成我们指定的变量名,提升代码可读性。具体步骤如下: (1)在Simulink界面的选项卡中选择“Tool”–>“Model explorer”,得到以下菜单: (2)点击左侧的“Base Workspace”后,点击选项卡中的“Add”–>“Add Custom…” (3)依次添加三个变量名:“wr_ref”, "wr"和“beta”,留作输入输出信号名用。其中“Object name(s)”为变量名;“Object class”为变量类型,选择“mpt.Signal”,点击OK。可以在工作区中看到生成的三个“Signal”类型的变量:wr_ref, wr, beta,以此检查操作是否正确。 (4)回到Simulink主界面,在信号线上右键,选择“Properties”–>"Signal name"添加对应的变量名,勾选“Signal name must resolve to Simulink signal object”,完成添加后,结果如图所示:

    使用快捷键Ctrl + B生成代码,得到的文件夹中有一个和Simulink文件同名的压缩包,里面包含了上文所提到的VS调用所需要的所有文件。

    二、VS完成Simulink模型的调用

    若想在VS中调用Simulink模型,必须包含所有压缩包中的文件,在创建完成工程之后,进行以下设置:

    设置附加包含目录 在压缩包中有两个文件夹,名为Matlab2018b(具体的名字和版本有关系,会有所不同)中的所有"…h"文件都需要被VS创建的工程包含。为了方便起见,将所有Maltab2018b文件夹中的所有.h文件都复制到一个文件夹中,这里我用的文件夹名称为”extendFile“。将文件夹移动到”工程项目.sln“文件所在的目录中,然后在VS2015中右键工程–>属性–>C/C+±->常规–>附加包含目录中,输入…\extendFile

    添加头文件和源文件 将压缩包中的另一个文件夹中的所有文件复制到main.cpp文件所在目录,然后在VS2015的头文件和源文件中分别将压缩包中这个文件夹下所包含的.h和.cpp添加完毕。值得注意的是,在Matlab2018b文件夹中有一个文件名为rt_logging.c,需要将其复制到main.cpp文件所在目录,并添加到工程源文件中.

    调用Simulink模型,只需要用到如下几个函数,不同的Simulink文件名称导出的函数名称会有所不同,但作用相同.函数命名方式为:“Simulink文件名”_initialize()/_step()/_terminate()

    函数名作用Copy_of_preWT_initialize()初始化Slmulink模型Copy_of_preWT_step()运行Simulink模型Copy_of_preWT_terminate()结束调用Simulink模型

    同时还需要用到两个类对象,类对象名称和函数名称一样,“Simulink文件名”_U/_Y

    类名称作用Copy_of_preWT_U输入参数Copy_of_preWT_Y输出参数

    在main函数中编写例程,以测试Simulink模型能否成功调用:

    #include "stdafx.h" #include"Copy_of_preWT.h" #include<iostream> int main() { Copy_of_preWT_initialize()// step1. 初始化Simulink模型 Copy_of_preWT_U.wr_ref = 1.81; // step2. 输入参数赋值 Copy_of_preWT_U.wr = 1.9; Copy_of_preWT_step(); // step3. 运行Simulink模型 std::cout << Copy_of_preWT_Y.beta << std::endl; // step4. 打印Simulink模型输出 Copy_of_preWT_terminate(); // step5. 结束调用Simulink模型 printf("run ritht\n"); getchar(); return 0}

    程序运行结果如下,证明Simulink模型运行成功。

    总结

    详细介绍了如何将Simulink模型转化为C++能够调用的函数的形式,完成了VS项目进行模型调用所需的设置,解释了调用生成代码需要用到的函数和变量,在VS中编写了模型调用的C++例程,并成功运行。

    Processed: 0.019, SQL: 9