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语言编写相关推荐

  1. 单片机c语言出租车计时程序,基于单片机出租车计价器课题设计c语言编写(样例3)...

    <基于单片机出租车计价器课题设计(c语言编写).doc>由会员分享,可免费在线阅读全文,更多与<基于单片机出租车计价器课题设计(c语言编写)>相关文档资源请在帮帮文库(www. ...

  2. Matlab/simulink 基于光伏和蓄电池的三端口

    Matlab/simulink 基于光伏和蓄电池的三端口 ID:451644997541623电气小学弟

  3. Linux下基于Libmad库的MP3音乐播放器编写

    linux下基于Libmad库的MP3音乐播放器编写 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer.xmms等都是使用这个开源库进行解码的: ...

  4. 基于C99规范,最全C语言预处理知识总结

    基于C99规范,最全C语言预处理知识总结 00. 前言 1. 语法形式 2. 描述 3. 约束 4. 语义 01. 条件包含 01.1 关于`defined` 01.2 关于`#if/#elif/#e ...

  5. 基于openssl的EVP对称加密C语言单独实现

    基于openssl的EVP对称加密C语言单独实现 代码实现 运行结果 说明 在 <基于openssl的EVP对称加密C语言实战案例>这篇博客的基础上将代码提出到独立的.c文件,可以单独进行 ...

  6. R语言编写自定义函数基于ggsumarystats函数计算每个分组的统计值、自定义可视化分组分面条形图,并在X轴标签下方添加分组对应的统计值(样本数N、中位数median、四分位数的间距iqr)

    R语言编写自定义函数基于ggsumarystats函数计算每个分组的统计值.自定义可视化分组分面条形图,并在X轴标签下方添加分组对应的统计值(样本数N.中位数median.四分位数的间距iqr) 目录

  7. R语言编写自定义分组统计函数(customize statistics function)可视化分组箱图并在X轴标签下方添加分组对应的统计值(样本数N、中位数median、四分位数的间距iqr)

    R语言编写自定义分组统计函数(customize statistics function)可视化分组箱图并在X轴标签下方添加分组对应的统计值(样本数N.中位数median.四分位数的间距iqr) 目录

  8. ibe加密原理_ibe 基于身份的IBE加密源代码,采用C++语言编写,能够运行。 Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...

    文件名称: ibe下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Visual C++ 文件大小: 3128 KB 上传时间: 2014-06-08 下载次数: 8 详细说明:基于身份 ...

  9. 软件工程-c语言--基于at89c51单片机c语言编写的计算器,基于AT89C1单片机C语言编写的计算器.doc...

    基于AT89C1单片机C语言编写的计算器 #include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; ...

  10. 太空java游戏_JavaSpaceWar 一个基于 语言编写的太空战争游戏,包含所有图像和声音资源,便 习理解使用 Game Program 238万源代码下载- www.pudn.com...

    文件名称: JavaSpaceWar下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 506 KB 上传时间: 2014-03-18 下载次数: 0 提 供 者: ...

最新文章

  1. python数据库应用开发实例_纯Python开发的nosql数据库CodernityDB介绍和使用实例
  2. 人工智能中常见的误区
  3. git 解决远程和本地冲突
  4. leetcode刷题六z字形变换
  5. 用string存取二进制数据
  6. 2018-2019-2 20175311 实验一《Java开发环境的熟悉》实验报告
  7. Android 仿 新闻阅读器 菜单弹出效果(附源码DEMO)
  8. Javascript特效:响应式改变页面背景颜色
  9. C语言函数字符型形参,char (*str)[ ]跟char *str[ ]作函数形参的区别
  10. pyqt界面语言中英文转换
  11. 更新macOS Monterey后,Flutter页面崩溃、白屏
  12. 以太网帧各字段的含义_车载以太网(上)
  13. 为知笔记-艾宾浩斯遗忘曲线复习插件
  14. wamp mysql创建数据库_在wamp中创建数据库
  15. 关于小米 Mi4 手机的评测
  16. 简单的nodejs+socket.io给指定的人发送消息
  17. Python 实现图的深度优先和广度优先搜索
  18. win7系统端口映射
  19. OLED 之 概念介绍
  20. 欧几里德算法 扩展欧几里德算法

热门文章

  1. notepad下载(官网进不去)
  2. SQL Server 进程无法连接到 Subscriber “xxxxxx”
  3. Ubuntu系统中如何删除一个用户
  4. python打开xls_python读取XLS文件或CSV文件
  5. 数据库一对一、一对多、多对多关系
  6. wamp php 7.0,wamp如何尝鲜php7
  7. 微信WIFI小程序开发
  8. 【3D目标检测】Rethinking Pseudo-LiDAR Representation
  9. 新浪微博首席架构师漫谈微博底层架构
  10. C++——运算符的重载