概述
simulink基于level 2的s-function C语言编写
在MATLAB中有时候用模块搭建实现一个功能不是十分方便,可以通过编写程序来实现,simulink模块库提供了很不错的编程模板供用户使用。我们只需要简单的进行配置就能够利用模板来像C语言一样编写程序了。主要步骤如下
1、创建空白模型
打开simulink,新建一个空白的blank,在library browser(即搜索模块的地方)simulink分支下有user-defined,点击并在右侧选择S-Function Examples
2、然后选择c file S-functions
3、选择basic c-mex
4、打开以后就能看到如下模板
那么我们需要操作的部分有哪些呢,概括起来主要分以下几部分:(和写C语言差不多)
1)文件名
1给自己的s-function起一个函数名称,方便在模型中调用,这里默认是sfuntmpl_basic,如上图所示,我们可以改成自己想要的名字,比如test,作为一个测试来写,在修改这个文件之前先另存一下,不然原来的模板就会被我们改掉了,此外,这个c文件的名字也要改成一样的test,但要注意,不能和simulink 的slx文件也就是仿真模型重名,否则会报错。
2)头文件包含
包含所需的头文件,这里默认是simstruc.h,这个是包含了这个模板所需要的一些结构体变量,但是不要被结构体给吓到。我们并不需要管这个结构体的概念。只要选择自己需要的头文件包含进去就好,比如我需要进行相关的数学计算,需要求sin(x),那么我就需要#include “math.h”,需要注意一下,这里include后面需要有一个空格,不然会报错,其实这个模板里面的英文解释比较详细,有兴趣的可以仔细看一下。
3)设置函数参数
3设置这个函数的参数个数,比如有两个,就把下面的0换成2,这并不是输入的自变量,要分清楚。这里的参数就像是直线的斜率一样,是我们用来对函数进行形容的一些定义量,比如周期时间,特定的含义如恒定加速度为多少之类的。
4)设置输入变量(向量)个数和维数(向量包含的元素个数)
设置输入的变量个数和维数。这里的个数实际上是列数m,维数是行数n,构成一个m*n的列向量,一般是一列。比如我要输入x0,x1两个数,那么就设置(s,1)和(s,0,2),可以自己试一下
5)设置输出变量(向量)个数和维数(向量包含的元素个数)
设置输出变量个数和维数,这个和输入其实是一样的
6)函数功能编写
接下来就是需要重点关注的内容,输出函数的编写,实际上就是对输入变量进行处理后输出,体现我们的控制思路.第一行实际上是对输入变量做了一下指针操作,u[0]就是表示x0,同理指针加1就是u[1]就表示x1.第二行是对输出变量的指针操作,y[0]就是y0,y[1]就是y1.这两行一定不要删掉哦,否则你的函数就不起作用了。我们从y[0]这行开始编写,假如按照刚才的输入,x0,x1.我输出也设置为1 乘2的,也是输出两行一列,分别取2倍和3倍输出,那么就写成:
y[0]=u[0] * 2;
y[1]=u[1] * 3;
到这里输出函数就写好了,然后就是应用。
7)编译c文件
写好了这个c文件之后,需要进行编译,
使用命令:mex funtion_name 进行编译,我这里文件名为Test0126,就在命令窗口
键入:mex Test0126.c ,如果编译没有问题,会显示成功,如下:
如果你的c语言编译环境有问题,可以参考我的这篇文章搭建自己的matlabc运行环境:
matlab simulink写s-function函数时搭建c运行环境,提示错误使用mex,需要安装mingw64-w
8)函数文件应用
从user-defined库中选择,如下,添加到空白模型中。评论中TOOMsky 指出Level-2 MATLAB S-Function才是level-2的s-function,没错,但也不全对,如果你是用matlab语言,那就选择红圈上面的Level-2 MATLAB S-Function,反之,如果你用c语言,那就必须选择我画的红圈s-function。
然后双击,把设置的s-function name填写为test,如下:(下面是0126做的修改,因此文件名为Test0126)
拖动相应的模块输入进去,因为输入设置的1列2行,就需要一个mux(设置为2,1),输入两个不同的常数,然后输出需要加一个demux(设置为1,2),接入1个scope观察一下,假如输入1.5和2,是不是输出的3和6
整体的模型如下:(左边是模型,右边是结果)
从上图的运行结果来看,正好反映了mdlOutputs()函数中的输入输出关系。
为什么选择level2的原因是因为,level2可以多输入多输入出,这个可以百度。
0126补充=================================================================
评论中有朋友问到:用Level-2 MATLAB s-Function模块搭建完成后,编译报错:“Level-2 MATLAB S-function ‘test0126’ does not exist.”但改用S-Function模块后,编译就不会报错,请问这是什么原因呀?
原因如下:(点击S-function的help,查看官方文档,红线部分是关键原因)
使用S-Fcuntion 可以使用c语言编写2级的C MEX S-Function.
报错:S-function ‘test0126’ does not exist
可能的原因:
1)代码写完没有编译
解决办法,可以使用命令:mex funtion_name 进行编译,我这里文件名为Test0126,就在命令窗口
键入:mex Test0126.c ,如果编译没有问题,会显示成功,如下:
如果你的c语言编译环境有问题,可以参考我的这篇文章:
matlab simulink写s-function函数时搭建c运行环境,提示错误使用mex,需要安装mingw64-w
2)代码编写的数据类型有问题
这个需要自己查看算法的中间过程了。
到这里相信你已经会使用基于level 2的s-function编写模块了,如果还是一头雾水请查看下面的链接,链接上传的是本文中的模型及代码,以及官方的2倍正弦波形的例子,需要者自取。
模型及代码链接:S-Function C level 2 SLX test file.zip
上一个文件截图:
编辑:Eric_anxuanxuan
文中显示文件does not exist的原因,参考了MathWorks MATLAB Answers 的回答,有兴趣的可以看看:Error in S-funtion. S-function “Test” does not exist
最后
以上就是怕孤单电脑为你收集整理的Simulink基于level 2的s-function C语言编写的全部内容,希望文章能够帮你解决Simulink基于level 2的s-function C语言编写所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复