MATLAB中的S-Function的用法(C语言)

1. S-Function简介  

S-Function是system-function的缩写。说得简单,S-Function就是用MATLAB所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口。

 

2. MEX函数与M文件的区别

第一,  MEX 函数能实现的回调函数比M-文件能实现的回调函数要多得多;

第二,  MEX 函数直接访问内部数据结构SimStruct,SimStruct 是Simulink 用来保存关于S-function 信息的一个数据结构;

第三,  MEX 函数也可使用MATLAB MEX 文件API 直接来访问MATLAB 的工作空间。

如果一个C MEX文件与一个M文件具有相同的名字,则C MEX文件被优先使用,即在S-Function块中使用的是C MEX文件。

 

3. 基础知识

3.1 直接馈通(direct feedthrough)

 直接馈通表示系统的输出或可变采样时间是否受到输入的控制

a.  输出函数(mdlOutputs或flag==3)是输入u的函数。即,如果输入u在mdlOutputs中被访问,则存在直接馈通。

b.  对于一个变步长S-Function的“下一个采样时间”函数(mdlGetTimeOfNextVarHit或flag==4)中可以访问输入u。

例如,一个需要其输入的系统(也就是具有直接馈通)是运算y=kXu,其中,u是输入,k是增益,y是输出。

又如,一个不需要其输入的系统(也就是没有直馈通)是一种简单的积分运算:

输出:y=x;

导数:dx/dt=u

其中,x是状态,dx/dt是状态对时间的导数,u是输入,y是输出。

正确设置直接馈通标志是十分重要的,因为它影响模型中块的执行顺序,并可用检测代数环。

3.2 dynamically sized inputs 

主要是给出:输入连续状态数目(size.NumContStates),离散状态数目(size.NumDiscStates) ,输出数目(size.NumOutputs),输入数目(size.NumInputs),Direct Feedthrough(size.Dir Feedthrough)。 

3.3 setting sample times and offsets

setting smaple times and offsets主要设置采样时间.

3.4 Level-1 和Level-2

Level 1 提供一个简单的接口,可与少部分的S函数API交互。Matlab对于这种方式的支持更多的是为了保持与以前版本的兼容,现在推荐采用的是Level 2 S函数。

 

4. S-Function实例

S-Function的仿真流程

例如要创建一个有1输入(2维),2输出(1维),3个参数,还有全局变量的S-Function。 过程如下:

a. 新建sfunction的C语言文件

打开simulink,点击User-Defined Functions里面的S-Function Examples。这个里面有多个语言版本的模板,有C,C++,Ada,Fortran和M语言的版本,其实都大同小异,只要了解几个函数就很容易使用了。 选择C语言的版本:从S-function模块中选择C-file S-functions里面的Basic C-MEX template。打开后,另存为自己的模块名字,如test.c 。下面我们来分析代码: 

复制代码
#define S_FUNCTION_NAME  test//这里把文件名sfuntmpl_basic修改为test
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
//程序里面要用到的头文件在这里引用,如“math.h”等。
float global_var; //定义全局变量
static void mdlInitializeSizes(SimStruct *S)
{//这个函数用来设置输入、输出和参数的。ssSetNumSFcnParams(S, 3);  /*设置参数个数,这里为3 */if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {return;}ssSetNumContStates(S, 0);//设置连续状态的个数,缺省为0;ssSetNumDiscStates(S, 0);//设置离散状态的个数,缺省为0;if (!ssSetNumInputPorts(S, 1)) return;//设置输入变量的个数,这里为1ssSetInputPortWidth(S, 0, 2); //设置输入变量0的维数为2
ssSetInputPortRequiredContiguous(S, 0, true); //设置input0的访问方式,true就是临近访问,这样指针的增量后就可以直接访问下个input端口了。
ssSetInputPortDirectFeedThrough(S, 0, 1);// 设置输入端口的信号是否mdlOutputs函数中使用,这儿设置为true。if (!ssSetNumOutputPorts(S, 2)) return;//设置输出变量的个数
ssSetOutputPortWidth(S, 0, 1);//设置输出变量0的维数为1维ssSetOutputPortWidth(S, 1, 1);//设置输出变量1的维数为1维
ssSetNumSampleTimes(S, 1); //设置采样时间,此处为1s。ssSetNumRWork(S, 0);//不管ssSetNumIWork(S, 0);ssSetNumPWork(S, 0);ssSetNumModes(S, 0);ssSetNumNonsampledZCs(S, 0);
ssSetOptions(S, 0);
//下面可以写全局变量的初始化程序
global_var=1;
}
static void mdlInitializeSampleTimes(SimStruct *S)//暂时不管
{ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);ssSetOffsetTime(S, 0, 0.0);}
#define MDL_INITIALIZE_CONDITIONS   /* Change to #undef to remove function */
#if defined(MDL_INITIALIZE_CONDITIONS)static void mdlInitializeConditions(SimStruct *S)//暂时不管
  {}
#endif /* MDL_INITIALIZE_CONDITIONS */
#define MDL_START  /* Change to #undef to remove function */
#if defined(MDL_START) static void mdlStart(SimStruct *S)//暂时不管
  {}
#endif /*  MDL_START */
static void mdlOutputs(SimStruct *S, int_T tid)//这里填入相关的运算、算法等
{
real_T *para1 = mxGetPr(ssGetSFcnParam(S,0));
real_T *para2 = mxGetPr(ssGetSFcnParam(S,1));
real_T *para3 = mxGetPr(ssGetSFcnParam(S,2));
const real_T *u = (const real_T*) ssGetInputPortSignal(S,0);
real_T       *y1 = ssGetOutputPortSignal(S,0);
real_T       *y2 = ssGetOutputPortSignal(S,1);
y1[0]=u[0]*para1[0]+u[1]*para2[0];
y2[0]=u[1]*para3[0]+u[0]*para1[0];
}
#define MDL_UPDATE  /* Change to #undef to remove function */
#if defined(MDL_UPDATE)static void mdlUpdate(SimStruct *S, int_T tid){}
#endif /* MDL_UPDATE */
#define MDL_DERIVATIVES  /* Change to #undef to remove function */
#if defined(MDL_DERIVATIVES)static void mdlDerivatives(SimStruct *S){}
#endif /* MDL_DERIVATIVES */
static void mdlTerminate(SimStruct *S)//这里需要把global变量全部初始化,否则下次运行程序时,全局变量还是之前的值。
{
}#ifdef  MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */
#include "simulink.c"      /* MEX-file interface mechanism */
#else
#include "cg_sfun.h"       /* Code generation registration function */
#endif
复制代码

 b. 编译

在matlab的command window 里面输入“mex test.c”,即可将test.c编译为mex文件。

c.调用sfunction

在simulink空间里面拉入sfunction,在s-function name里面填入test,参数里面填入要设定的参数,然后仿真即可。


//

 转载:http://www.cnblogs.com/xpvincent/archive/2013/01/18/2866978.html



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm国内镜像介绍

这个也是网上搜的,亲自试过,非常好用! 镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry …

一文读懂民航客机飞控系统

来源:传感器技术摘要:埃塞俄比亚航空公司波音737 MAX 8型客机当地时间10日坠毁,这是时隔不到5个月,波音同一型号飞机发生的第二起空难。鉴于两起事故具有明显的相似性,越来越多的将目标指向了该型号的设计缺陷——飞控…

VC创建DLL动态链接库及其调用

1.1 创建dll项目 1.2 为dll项目编写源文件 头文件dllDemo.hextern "C" _declspec(dllexport) int Sum(int a,int b);//加法函数。extern "C" _declspec(dllexport) int Max(int a, int b);//取较大值函数extern "C" _declspec(dllexport) int Mi…

10个免费开源的JS音乐播放器插件

点这里 音乐播放器在网页设计中有时候会用到,比如一些时尚类、音乐或影视类等项目,但这些 网页播放器 插件比较少见,所以这里为大家整理一个集合,也许会有用到的时候。 下面整理的播放器有些是支持自适应的,如果需要用…

用上AI、用好AI!AiRiA研究院“普惠AI,芯向边缘”战略发布会圆满举行

近年来,在万物智联的趋势下,物联网产业从概念炒作进入加速落地的实质性阶段,端侧数据处理能力与云端数据处理能力已变的同等重要,而AI芯片从“云端”走向“边缘”已呈现出不可逆的趋势。值此AI落地初探之年,为把“高高…

设置DIV半透明CSS代码:

设置DIV半透明CSS代码: div{filter:alpha(Opacity80);-moz-opacity:0.5;opacity: 0.5;} 说明: 1、filter:对win IE设置半透明滤镜效果,filter:alpha(Opacity80)代表该对象80%半透明,火狐浏览器不认 2、-moz-opacity&am…

百年科技的历史回顾与哲学反思

来源:科学的历程摘要:科学的社会化和社会的科学化是科学的世纪里两个基本的标志。回顾百年科技历程,不只是讲述一个历史故事,更是反省我们当下的处境。19世纪是第一个科学的世纪,二十世纪是第二个,当然也是…

Java知多少(28)super关键字

super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类。super 可以用在子类中,通过点号(.)来获取父类的成员变量和方法。super 也可以用在子类的子类中,Java 能自动向上层类追溯。父类行为被调用,就…

怎样写出简洁的css代码??★★★★

base.css 设置各种默认值: html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, …

《中国大数据产业白皮书及百强榜单》:一览中国大数据产业发展全局

来源:网络大数据摘要:近日,赛迪顾问重磅发布了《中国大数据产业白皮书及百强榜单》。《中国大数据产业白皮书及百强榜单》从大数据整体市场方向分享了相关洞见,对大数据产业未来发展趋势进行了分析和预测。并梳理中国大数据投资价…

MVC3学习 八 Action和result过滤器及日志处理

在项目中很多地方需要用到面向切面的思想,比如说身份验证、日志功能这些。 过滤器可以理解为在执行某个功能时,额外执行的一段代码,在MVC中有Action和result过滤器, 分别都是在执行前和执行后进行过滤的,具体代码如下&…

万字报告做空特斯拉:马斯克在操盘一场“庞氏骗局”|硅谷封面

来源: 腾讯科技摘要:美国价值投资人俱乐部VIC日前发表文章,从产品需求减弱、安全性能差、资金缺口巨大、伊隆马斯克或被免职等多个角度着手进行分析,称目前是全力做空特斯拉(纳斯达克证券代码:TSLA&#xf…

内存对齐的规则以及作用

首先由一个程序引入话题&#xff1a; 1 //环境&#xff1a;vc6 windows sp2 2 //程序13 #include <iostream>4 5 using namespace std;6 7 struct st1 8 {9 char a ;10 int b ;11 short c ;12 };13 14 struct st215 {16 short c ;17 char a ;18 …

中国AI创新者论坛成功举办!这里有一份AI教育和医疗的落地秘籍

来源&#xff1a;THU数据派3月21日&#xff0c;由网易新闻、网易有道、清华数据院共同举办的以“创新&#xff0c;无界”为主题的“中国AI创新者论坛”在清华大学罗姆楼三层报告厅成功举办。律回岁晚冰霜少&#xff0c;春到人间草木知&#xff0c;初春的北京&#xff0c;顶级人…

C语言有参函数调用时参数间数据传递问题

C语言中在发生有参函数调用时&#xff0c;实参变量与形参变量之间的数据都是单向的“值传递”方式。包括指针变量和数组名作参数的情况。 C语言要求函数的实参要有确定的值&#xff0c;在函数调用时给形参分配相应的内存单元&#xff0c;同时将实参的“值”赋&#xff08;复制&…

windows下jenkins slave 搭建

一 创建新的Slave 注意Jenkins中slave称为note。 所以下面文章中的slave和node指的是一回事。 1&#xff09;在Manage Jenkins-->Manage Nodes -->New Node下&#xff1a;输入Node Name&#xff0c;且选择Dumb Slave作为Slave的类型&#xff0c;然后OK。 2&#xff09;在…

MEMS:万物智联技术关键

来源&#xff1a;Research摘要&#xff1a;MEMS技术在汽车电子、生物医疗、智慧家庭、工业物联网、消费电子等领域都有着广阔的市场前景。随着万物互联时代的加快到来&#xff0c;MEMS传感器将迎来新的浪潮。一、MEMS 是什么1、MEMS 定义MEMS&#xff08;Microelectromechanica…

C语言 变量声明和定义的区别

变量的声明有两种情况&#xff1a; 1、一种是需要建立存储空间的。例如&#xff1a;int a 在声明的时候就已经建立了存储空间。 2、另一种是不需要建立存储空间的。 例如&#xff1a;extern int a 其中变量a是在别的文件中定义的。 前者是“定义性声明&#xff08;defining dec…

2019年25大人工智能趋势!一文看到未来

来源&#xff1a;智东西摘要&#xff1a;2019年25个AI趋势。人工智能的下一步是什么&#xff1f;上周&#xff0c;知名机构CBinsights的分析师分析各个行业&#xff0c;得到了2019年最值得关注的25个人工智能趋势。虽然人工智能正在各个行业蔓延&#xff0c;经常成为头条新闻&a…

tomcat server.xml配置详解

元素名属性解释serverport指定一个端口&#xff0c;这个端口负责监听关闭tomcat的请求shutdown指定向端口发送的命令字符串servicename指定service的名字Connector(表示客户端和service之间的连接)port指定服务器端要创建的端口号&#xff0c;并在这个断口监听来自客户端的请求…