
这种方法比较常见,首先从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对应用层函数同时调用,实现了代码模型的模块化开发。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)