matlab中的S函数 - 图文
更新时间:2023-03-15 22:07:01 阅读量: 教育文库 文档下载
S函数的简介及编写 摘自恒润科技S-function的编写
1. S函数模板编辑环境进入:
在MATLAB主界面中直接输入:edit sfuntmpl 即可弹出S函数模板编辑的M文件环境,修改即可。 在MATLAB主界面中直接输入:sfundemos,即可调出S 程例子。
2. S函数模板的相关基础: 1) M文件S函数的引导语句为:
函数的许多编
Function[sys,x0,str,ts]?f(t,x,u,flag,p1,p2,...)
S函数默认的四个输入参数:t ,x ,u ,flag S函数默认的四个输出函数:sys ,x0 ,str ,ts 各个参数的含义如下:
T :代表当前的仿真时间,该输入决定了下一个采样时间; X :表示状态向量,行向量,引用格式:X(1),X(2) U :表示输入向量;
Flag :控制在每一个仿真阶段调用哪一个子函数的参数,由SIMULINK在调用时自动取值;
Sys :通用的返回变量,返回的数值决定Flag值,mdlUpdates里:列向量,引用格式:Sys(1,1),Sys(2,1);mdlOutputs里:行向量,引用格式:Sys =x.
X0 :初始的状态值;列向量,引用格式:X0=[ 0;0;0 ] Str :空矩阵,无具体含义;
Ts :包含模块采样时间和偏差的矩阵。[period, offset]
当Ts为-1时,表示与输入信号同采样周期。 2) S函数工作方式:
Flag = 0时,调用mdlInitializeSizes函数,定义S函数的基本特性,包括采样时间,连续或者离散状态的初始条件和Sizes数组;
Flag = 1时,调用mdlDerivatives函数,计算连续状态变量的微分方程;求所给表达式的等号左边状态变量的积分值的过程。
Flag = 2时,调用mdlUpdate函数,用于更新离散状态,采样时间和主时间步的要求;
Flag = 3时,调用mdlOutputs函数,计算S函数的输出;
Flag = 4时,调用mdlGetTimeOfNextVarHit函数,计算下一个采样点的绝对时间,这个方法仅仅是使用户在mdlInitializeSize 里说明一个可变的离散采样时间;
Flag = 9时,调用mdlTerminate函数,实现仿真任务的结束。 3) S函数仿真过程:
① 初始化:mdlInitializeSizes,初始化S函数
? 初始化SimStruct,包含了S函数的所有信息; ? 设置输入、输出端口数; ? 设置采样时间; ? 分配存储空间。
② 数值积分:mdlDerivatives
? 用于连续状态的求解和非采样过零点;
? 如果存在连续状态,调用mdlDerivatives和mdlOutput两个子函
数;
? 如果存在非采样过零点,调用mdlOutput和mdlZeroCrossings子
函数,以定位过零点。
③ 更新离散状态:mdlUpdate
④ 计算输出:mdlOutputs,计算所有输出端口的输出值。 ⑤ 计算下一个采样时间点:mdlGetTimeOfNextVarHit ⑥ 仿真结束:mdlTerminate,在仿真结束时调用。 3. S函数的编写:
1) 参数初始设定:初始化sizes结构,再调用simsizes函数;
Sizes结构体:
NumContStates:连续状态的个数 NumDiscStates:离散状态的个数 NumOutputs:输出变量的个数 NumInputs:输入变量的个数
DirFeedthrough:有无直接馈入,值为1时表示输入直接传到输出口 NumSampleTimes:采样时间的个数,值为1时表示只有一个采样周期
Simsizes函数的调用:sys = simsizes (sizes) ,即将sizes结构体中的信息传递给sys。
2) 状态的动态更新:
连续模块的状态更新由mdlDerivatives函数来进行;
离散模块的状态更新由mdlUpdate函数来进行; 3) 输出信号的计算:
计算出模块的输出信号,系统的输出仍然由sys变量返回。 4. M文件S函数的模块化:
在动态系统仿真设计,分析中,用户可以使用S-Function模块来调用S-函数。
1) S-Function模块是一个单输入单输出的模块,如果有多个输入与输出信号,
可以使用Mux模块与Demux模块对信号进行组合和分离操作;
2) 在S-Function模块的参数设置对话框中,包含了调用的S函数名和用户输入
的参数列表,如下图所示:
3) S-Function模块是以图形的方式提供给用户一个调用S函数的接口,S函数
中的源文件必须由用户自行编写;
4) S-Function模块中的S-函数名和参数值列表必须与用户填写的S函数源文件
的名称和参数列表完全一致,包括参数的顺序。 5. S-Function模块建立流程:
6、m-file模版编写
附:
创建一个有1输入(2维),2输出(1维),3个参数,还有全局变量的s-function。 1.新建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 \
//程序里面要用到的头文件在这里引用,如“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;//设置输入变量的个数,这里为1 ssSetInputPortWidth(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 */
正在阅读:
matlab中的S函数 - 图文03-15
优秀医生年度个人工作总结精品范文04-26
2016国赛试题 - 图文01-24
c++模板及应用习题答案06-13
本义与引申义10-19
软件安装步骤12-27
利用百科全书查找资料方法10则12-18
我身边的榜样演讲稿01-16
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 函数
- 图文
- matlab
- 2015年上海中考语文《孔孟论学》复习训练题(一)
- 北京科技大学热处理实验报告-45号钢的退火工艺 - 图文
- 河北省统计局财务管理规定
- 湖南科技学院毕业设计(作品、策划类)文字格式要求
- 软件工程中瀑布模型应用之我见 - 图文
- 政府物业服务投标书范本
- 财政学习题库
- ProCurve交换机配置手册
- 标准公文发文格式(带字体、字号、段落格式)
- 假肢矫形器
- 大学英语四六级翻译考试改革对大学英语翻译教学的影响
- 达镇年计划生育工作汇报 定稿
- 李宁公司swot分析
- 《药物化学》习题、作业
- 城管执法局创建市级文明单位汇报材料
- 4技术交底--垫层砼浇筑 - 图文
- 劳动法笔记(自己整理)
- 网上支付与结算练习题与答案
- 2017年河北省会计继续教育《现金管理暂行条例》
- 劝学导学案