c引用外部函数

c引用外部函数,第1张

方法一------编写level 2的s-function:

这种方法比较常见,首先从help里找到s-function level 2的模板,在output函数中写下您的算法,当然这里要特别注意你的算法有多少输入输出,在s-function中也要一致。等到您自信C代码圆满后,回到Matlab命令行,mex你的C文件(编译一下,当然前提是你安装了mex,方法么,就是mex -setup,这个很简单,掠过……)。

之后假如您的C文件OK,那么在模型路径下会生成mexw32或mexw64文件以证明编译通过,

最后您便可以在model里使用你自定义的s-function了。

方法二------在stateflow里调用C文件:

这种方法就是将需要调用您自定义C文件的地方,加入一个state,然后在stateflow里调用。注意,一定要在配置中声明你的C文件(可能还有相应的H文件)。

怎么设置呢,打开stateflow---->tools------>open simulation target------->custom code选项,然后在Include list of additional里的路径和source files里填上相应的路径和C文件,建议将C文件和您的model放在同一路径下,这样路径就可以不填了,直接填写Source files里的内容(您C文件的名字,不用加路径)。

这样就可以在stateflow里引用C文件里的函数了。

需求分析

在Simulink仿真开发中,我们经常会遇到需要调用已有的c代码或是出现仿真模型不易实现的c代码情形。此时,如果使用模块或是m语言开发,将会降低开发效率。

2 解决方案现状

基于以上情况,在的maltab2018b后版本中,推出的C Caller模块可以支持用户快捷实现外部c代码的调用。而在老的版本中,常用的有legacy code tool、s-function和stateflow等调用方法。

相比于legacy code tool、s-function的方式,stateflow的调用方法简单直观且不用编写m文件,底层的实现方式和C Caller是相似的,因此本文对stateflow调用C代码的方法进行阐述。

3 仿真案例

3.1 模型文件的路径结构

在simulink环境中以SVPWM调制信号的实现方式为例。首先在模型的文件夹路径下新建文件夹Custom_Code,将需要调用的c代码放在该文件夹下。

模型及c文件路径

3.2 文件内容示例

在顶层头文件中声明各个功能模块头文件,并在各功能模块头文件中声明应用层函数。

顶层头文件

功能模块头文件

3.3 模型参数配置

同时打开模型的设置界面,在simulation target选项卡下进行设置。对于Insert custom C code in generated选项卡,该处的语句会在运行时添加进stateflow生成的代码中,最终嵌入到编译生成的动态链接库里面。对于Additional build information选项卡,需要填写头文件路径、.c文件、库文件和宏定义,表示除了自动生成的文件外还需要编译的文件和文件所在的路径。

将模块化c文件中顶层的头文件的声明添加在Insert custom C code in generated->Header Flie中,若需要在模型初始化阶段和终止阶段执行相关指令可在Initialize function和Terminate function中进行添加。同时在Additional build information->Include directories中添加头文件的路径。将模块化c文件中的源文件添加在Additional build information->Source file中。

此处需要说明的是,在Code Generation的选项卡中,也存在类似的custom code选项卡,该处填写相关文件信息只会在代码生成的文件中体现,不会在仿真运行中调用。

头文件添加

源文件添加

3.4 stateflow相关设置

在stateflow中,将运行语言设置为c语言,采样时间和代码执行周期保持一致,在代码中有位运算时可以使能位运算。

stateflow配置

在stateflow的状态流中调用应用函数。

stateflow调用应用函数

3.5 仿真结果

运行仿真后,可以看到stateflow已经成功调用了c代码。

仿真结果

4 结论

本文展示了一种stateflow调用用户自定义c代码的方法,通过配置模型、代码文件的相关设置,实现了c代码在simulink仿真中的快速集成。该方法可以实现c文件的模块化调用,快速构建清晰的c文件及仿真模型架构,提升代码开发和算法调试的效率。

注:(1) 在代码修改后,有时会遇到stateflow不会重新编译的问题,需要删除上一次运行产生的动态链接库文件,或者通过对stateflow状态流进行修改,触发stateflow重新编译生成新的动态链接库。

(2) 该方法可以直接将c代码中常用的结构体、宏定义、联合体和枚举量嵌入,无需任何修改即可进行仿真。

(3) 该方法可以在simulink模型中,使用不同的chart对应用层函数同时调用,实现了代码模型的模块化开发。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/7907873.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-11
下一篇2023-04-11

发表评论

登录后才能评论

评论列表(0条)

    保存