S函数编辑流程及相关

S函数编辑流程及相关
1. S函数模板编辑环境进入:
在MATLAB主界面中直接输入:edit sfuntmpl
即可弹出S函数模板编辑的M文件环境,修改即可。
在MATLAB主界面中直接输入:sfundemos,即可调出S
2. S函数模板的相关基础:
1)
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 :空矩阵,无具体含义;
2)
3)
① 初始化:mdlInitializeSizes,初始化S函数
l
l
l
l
② 数值积分:mdlDerivatives
l
l
l
③ 更新离散状态:mdlUpdate
④ 计算输出:mdlOutputs,计算所有输出端口的输出值。
⑤ 计算下一个采样时间点:mdlGetTimeOfNextVarHit
⑥ 仿真结束:mdlTerminate,在仿真结束时调用。
3. S函数的编写:
1)
Sizes结构体:
NumContStates:连续状态的个数
NumDiscStates:离散状态的个数
NumOutputs:输出变量的个数
NumInputs:输入变量的个数
DirFeedthrough:有无直接馈入,值为1时表示输入直接传到输出口
NumSampleTimes:采样时间的个数,值为1时表示只有一个采样周期
2)
3)
4. M文件S函数的模块化:
1)
2)
http://s9/mw690/001NTKUYzy6KPN9cf0s28&690
3)
4)
5. S-Function模块建立流程:
http://s7/mw690/001NTKUYzy6KPNcj5GK36&690
创建一个有1输入(2维),2输出(1维),3个参数,还有全局变量的s-function。
选择C语言的版本:从S-function模块中选择C-file S-functions里面的Basic C-MEX template。打开后,另存为自己的模块名字,如test.c。
下面我们来分析代码:
#define
S_FUNCTION_NAME
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
//程序里面要用到的头文件在这里引用,如“math.h”等。
float global_var; //定义全局变量
static void mdlInitializeSizes(SimStruct *S)
{
ssSetInputPortRequiredCo
ssSetInputPortDirectFeed
ssSetOutputPortWidth(S, 0, 1);//设置输出变量0的维数为1维
ssSetNumSampleTimes(S, 1); //设置采样时间,此处为1s。
ssSetOptions(S, 0);
//下面可以写全局变量的初始化程序
global_var=1;
}
static void
mdlInitializeSampleTimes
{
}
#define
MDL_INITIALIZE_CONDITIONS
#if defined(MDL_INITIALIZE_CONDITIONS)
#endif
#define
MDL_START
#if defined(MDL_START)
#endif
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
real_T
y1[0]=u[0]*para1[0]+u[1]*para2[0];
y2[0]=u[1]*para3[0]+u[0]*para1[0];
}
#define
MDL_UPDATE
#if defined(MDL_UPDATE)
#endif
#define
MDL_DERIVATIVES
#if defined(MDL_DERIVATIVES)
#endif
static void mdlTerminate(SimStruct *S)//这里需要把global变量全部初始化,否则下次运行程序时,全局变量还是之前的值。
{
}
#ifdef
#include
"simulink.c"
#else
#include
"cg_sfun.h"
#endif
2.编译
在matlab的command window 里面输入“mex test.c”,即可将test.c编译为mex文件。
3.调用sfunction