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.

(9) 报错:S-function ‘test0126’ does not exist

可能的原因:

(9-1)代码写完没有编译

解决办法,可以使用命令:mex funtion_name 进行编译,我这里文件名为Test0126,就在命令窗口
键入:mex Test0126.c ,如果编译没有问题,会显示成功,如下:
在这里插入图片描述
如果你的c语言编译环境有问题,可以参考我的这篇文章:
matlab simulink写s-function函数时搭建c运行环境,提示错误使用mex,需要安装mingw64-w

(9-2)代码编写的数据类型有问题

这个需要自己查看算法的中间过程了。

到这里相信你已经会使用基于level 2的s-function编写模块了,如果还是一头雾水请查看下面的链接,链接上传的是本文中的模型及代码,以及官方的2倍正弦波形的例子,需要者自取。

模型及代码链接:S-Function C level 2 SLX test file.zip
上一个文件截图:
在这里插入图片描述

文中显示文件does not exist的原因,参考了MathWorks MATLAB Answers 的回答,有兴趣的可以看看:Error in S-funtion. S-function “Test” does not exist

编辑:Eric_anxuanxuan

5【文末彩蛋】

更多Matlab & Simulink 文章:

  • 27
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值