matlab中的S函数
matlab中的S函数
S函数的简介及编写摘自恒润科技S-function的编写1. S函数模板编辑环境进入:在MATLAB主界面中直接输入:edit sfuntmpl即可弹出S函数模板编辑的M文件环境,修改即可。
在MATLAB主界面中直接输入:sfundemos,即可调出S 函数的许多编程例子。
2. S函数模板的相关基础:1)M文件S函数的引导语句为:xtflagfuFunction[psysxstrtsp,,12,...),,,0,],(,S函数默认的四个输入参数:t ,x ,u ,flagS函数默认的四个输出函数: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函数,实现仿真任务的结束。
第九章 MATLAB S-函数PPT
4.回调函数mdlDerivatives
下述语句的含义是:sys表示状态的导数,如 x (x1x2 x3...xn )T,则 sys (sys(1)sys(2)...sys(n))T .
其中 sys(i) x (i = 1,2,…,n); 等号右边的“[]”表示导数的表达式。
sys = [];
7.回调函数mdlGetTimeOfNextVarHit
下述语句的含义是,sampleTime表示采样步长,sys表示下一步的采样时间, t+sampleTime的位置为下一步采样时间的表达式,这里表示下一步的采样时间 为在当前采样时间的基础上增加1秒。
sampleTime = 1;
sys = [];
9.3.2 编写方法
本小节主要针对9.3.1节中模板的各部分加以详细解释。编写S-函数就是根据需求, 用相应的代码去代替模板中对应部分的代码。
1.函数声明 第一行“function[sys,x0,str,ts] = sfuntmpl(t,x,u,flag)”是函数的声明。 同时完整的函数声明如下所示: [sys,x0,str,ts] = sfunc(t,x,u,flag,p1,…,pn) 其中p1,…,pn为S-函数模块的参数。
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 0;
第9章 S-函数
S-函数,即S-Function,是system-function的缩写。说得简单,S-函数就是用MATLAB所 提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口。
matlab中s函数模板 -回复
matlab中s函数模板-回复"S函数模板"是一种在MATLAB中使用的编程工具,用于创建自定义的模块,以满足特定的应用需求。
这个模板提供了一个框架,其中包含了必要的函数和变量,使得用户可以使用自己的代码逻辑来实现特定的功能。
在本文中,我们将逐步回答有关"S函数模板"的问题,并探索其用途和实际应用。
第一步是了解"S函数模板"的基本概念和用途。
S函数模板实际上是一种MATLAB函数,它可以在Simulink中使用。
Simulink是一个MATLAB 工具箱,用于建模、仿真和分析动态系统。
S函数模板可以用于创建自定义的、嵌入式的MATLAB代码模块,以实现模块化的系统设计和方便的代码复用。
下一步是了解"S函数模板"的结构和关键组成部分。
S函数模板由一系列必要的函数和变量组成。
主要的函数包括`mdlInitializeSizes`、`mdlInitializeSampleTimes`、`mdlOutputs`和`mdlTerminate`。
其中,`mdlInitializeSizes`函数用于指定输入、输出端口的数量和属性,`mdlInitializeSampleTimes`函数用于指定模块的采样时间,`mdlOutputs`函数用于实现模块的功能,`mdlTerminate`函数在模块结束时释放资源。
接下来是了解如何使用"S函数模板"来实现自定义的功能。
用户可以根据自己的需求在`mdlOutputs`函数中编写MATLAB代码。
该函数将接收来自输入端口的信号,并根据代码逻辑进行处理,然后将结果传递到输出端口。
用户可以在这里实现各种算法、控制逻辑和信号处理操作,以满足特定的应用需求。
使用"S函数模板"的另一个关键方面是了解如何在Simulink模型中使用它。
用户可以通过简单地将"S函数模板"放置在Simulink模型中来使用它。
MATLAB第5章S函数
• function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag) • switch flag • case 0 • [sys,x0,str,ts]=mdlInitializeSizes; • case 1 • sys=mdlDerivatives(t,x,u); • case 2 • sys=mdlUpdate(t,x,u); • case 3
• sys=mdlOutputs(t,x,u);
• • • • • • • • • • case 4 sys=mdlGetTimeOfNextVarHit(t,x,u); case 5 sys=mdlTerminate(t,x,u); otherwise error(['Unhandled flag = ',num2str(flag)]); end % 主函数结束 % 下面是各个子函数,即各个仿真例程 % 1. 初始化例程子函数:提供状态、输入、输出、 采样时间数目和初始状态的值。必须有该子函数。
• 要打开模板文件,可在MATLAB命令行下输入: • >>edit sfuntmpl • 或 者 双 击 \S-function demos\M-file functions\M-file template 块。 S-
• 下面是删除了其原有注释的代码,结构反而更为清晰 紧凑。 • function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag) % 主函数
第5章
S-函 数
• 5.1 S-函数概述 • 5.2 S-函数的工作原理 • 5.3 编写M文件S-函数
5.1
•
•
S-函数概述
5.1.1 S-函数的基本概念
matlab中s函数模板
matlab中s函数模板在Matlab中,s函数是一种用于执行数学运算和计算的函数模板,它提供了一种方便快捷的方式来实现各种数学运算和算法。
通过使用s函数模板,您可以轻松地编写自己的自定义函数,并将其集成到Matlab应用程序中。
本文将介绍Matlab中s函数模板的使用方法、示例和注意事项。
一、s函数模板概述Matlab中的s函数模板提供了一种灵活的编程方式,可以方便地实现各种数学运算和算法。
它基于Simulink的s-functionblock,允许您使用Matlab代码编写自定义函数,并将其嵌入到Simulink模型中。
s函数模板支持多种数据类型和运算符,包括矩阵运算、向量运算、三角函数、指数和对数等。
二、使用s函数模板要使用s函数模板,您需要按照以下步骤进行操作:1.编写Matlab代码实现所需的数学运算和算法。
确保代码具有可读性和可维护性,以便于后续的维护和扩展。
2.将Matlab代码保存为.m文件。
确保文件名以s开头,以表示它是s函数的模板。
3.在Simulink模型中添加s-functionblock,并指定要使用的s函数模板文件名。
4.根据需要配置s-functionblock的其他参数,如输入输出端口、数据类型等。
5.运行Simulink模型,即可使用s函数模板执行数学运算和计算。
三、示例以下是一个简单的示例,展示如何使用s函数模板实现矩阵求逆运算:1.编写Matlab代码实现矩阵求逆运算:```matlabfunctiony=inv_matrix(A)%矩阵求逆函数模板%输入:矩阵A(m*n)%输出:矩阵的逆(m*n)[m,n]=size(A);y=eye(m)-A*A';end```2.将上述代码保存为s函数模板文件inv_matrix.m。
3.在Simulink模型中添加s-functionblock,并指定inv_matrix.m为s函数模板文件名。
4.根据需要配置s-functionblock的其他参数,如输入输出端口、数据类型等。
MATLAB中S函数使用
最后一个,在 sfuntmpl 的 130 行
case 9,
sys=mdlTerminate(t,x,u);
flag=9 表示此时系统要结束,一般来说写上在 mdlTerminate 函数中写上 sys=[]就可,如果你 在结束时还要设置什么,就在此函数中写
关于 sfuntmpl 这个 s 函数的模板讲完了。
sizes.DirFeedthrough = 0; sizes.NumSampleTimes = 0; sys = simsizes(sizes); x0 = [0 6 1 0];%x(1)时间 0 开始;x(2)幅值;x(3)切换标志位;x(4)周期标志位; str = []; ts = []; function sys=mdlUpdate(t,x,u) T=0.000125;%周期设置 k=x(4); s=x(2); i=x(3); if mod(i,2)==1 p1=1.56*10^(-6); p2=-1.295*10^(-6); p3=-7.847*10^(-6);
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
在 matlab 的 workspace 里打 edit sfuntmpl(这是 matlab 自己提供的 s 函数模板),我们看它 来具体分析 s 函数的结构。 它的第一行是这样的:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag) . 先讲输入与输出变量的含义:t 是采样时间,x 是状态变量,u 是输入(是做成 simulink 模块的输 入),flag 是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys 输出根据 flag 的 不同而不同 (下面将结合 flag 来讲 sys 的含义) , x0 是状态变量的初始值, str 是保留参数 (mathworks 公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts 是一个 1×2 的向 量,ts(1)是采样周期,ts(2)是偏移量。
matlab中S函数的实现
Level 1 M文件S函数----这种方式提供了一个简单的M文件接口,可以与少部分的S函数API交互。Matlab对于这种方式的支持更多的是为了保持与以前版本的兼容,现在推荐采用的是Level 2 M文件S函数。
A Level-2 M-file S-function provides access to a more extensive set of the S-function API and supports code generation. In most cases, use a Level-2 M-file S-function when you want to implement your S-function in M.
The S-Function Builder is a graphical user interface for programming a subset of S-function functionality. If you are new to writing C MEX S-functions, you can use the S-Function Builder to generate new S-functions or incorporate existing C or C++ code without interacting with the S-function API. The S-Function Builder can also generate TLC files for inlining your S-function during code generation with the Real-Time Workshop product.
matlab中s函数模板 -回复
matlab中s函数模板-回复MATLAB中的s函数模板是一种用于编写自定义模块的工具,它允许用户以自己的方式定义系统的动态行为。
本文将详细介绍s函数模板的具体操作步骤和相关注意事项。
首先,为了能够使用s函数模板,我们需要在MATLAB工作区创建一个新的模型或打开一个已有的模型。
然后,我们可以按照以下步骤进行s函数模板的编写。
第一步,创建s函数模板文件。
在MATLAB的命令窗口中输入以下命令:sfunctionname这将会创建一个名为"sfunctionname.m"的文件,其中"sfunctionname"是我们给s函数模板命名的名称。
第二步,打开s函数模板文件,并编辑其内容。
在"function"关键字下方的行中,可以定义输入输出参数以及任何需要的局部变量。
例如,以下是一个基本的s函数模板:function [sys,x0,str,ts] = sfunctionname(t,x,u,flag)switch flagcase 0 初始化模型[sys,x0,str,ts] = mdlInitializeSizes; 调用模型初始化函数case 1 计算模型状态方程sys = mdlDerivatives(t,x,u);case 2 计算模型输出方程sys = mdlOutputs(t,x,u);case 3 处理模型状态信息sys = mdlUpdate(t,x,u);case 4 处理模型输出信息sys = mdlGetTimeOfNextVarHit(t,x,u);case 9 处理模型示意图sys = mdlTerminate(t,x,u);otherwiseerror(['Unhandled flag = ',num2str(flag)]);endend在上述代码中,我们定义了四个输入参数t、x、u和flag,以及四个输出参数sys、x0、str和ts。
Matlab调试s函数的方法
在 s 函数编写完成后,需要调试,分析 s 函数是否按照编程者的 想法运行,各个变量的值是否正确,这时,单步运行是一种非常有效 的方法,下面进行简单介绍。
双击 s 函数封装,点击 Edit 打开 s 函数编辑器
在编辑器中单击行号可以设置断点
在 Simulink 点击运行按钮,则 Sg 菜单下可以进行单步,连续等操作,同时可以用鼠标指向要观察的变量会显示出 变量此时的具体数值
点击 Matlab 命令界面中的 Debug 菜单下的 Exit Debug Mode 可退出调试模式
也可以在代码界面上进行单步、连续、退出调试等操作
matlab中的S函数
S函数的简介及编写摘自恒润科技S-function的编写1. S函数模板编辑环境进入:在MATLAB主界面中直接输入:edit sfuntmpl即可弹出S函数模板编辑的M文件环境,修改即可。
在MATLAB主界面中直接输入:sfundemos,即可调出S 函数的许多编程例子。
2. S函数模板的相关基础:1)M文件S函数的引导语句为:xtflagfuFunction[psysxstrtsp,,12,...),,,0,],(,S函数默认的四个输入参数:t ,x ,u ,flagS函数默认的四个输出函数: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函数,实现仿真任务的结束。
matlab中的sfunction的用法(C语言)
}
#define MDL_INITIALIZE_CONDITIONS
/* Change to #undef to r
emove function */
#if defined(MDL_INITIALIZE_CONDITIONS)
static void mdlInitializeConditions(SimStruct *S)//暂时不管
*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
[原创]matlab 每日一贴(仿真函数篇二)S-Function
在 User-Defined Function 里面还有 matlab function 模块,这个模块支持 matlab 函数和 自定义的函数,缺点就是 input,output 都是一个端口, 模块上不能显示输入输出的 label。 还有 fcn 模块,它支持简易的函数表达式。
matlab中s函数模板 -回复
matlab中s函数模板-回复MATLAB中的s函数模板是用于创建自定义仿真功能的一种强大工具。
它允许用户在Simulink环境中自定义一个或多个模型,以实现特定的功能。
在本文中,我们将逐步回答下述问题:什么是s函数模板?如何创建s函数模板?如何在s函数模板中实现自定义功能?1. 什么是s函数模板?s函数模板是MATLAB提供的一种函数模板,用于在Simulink中创建自定义仿真模型。
它是一种灵活且强大的工具,可以让用户实现自定义功能。
s函数模板允许用户编写MATLAB代码,以定义仿真模型中的各个部分的行为。
用户可以通过s函数模板执行各种操作,例如计算、控制和调整参数。
2. 如何创建s函数模板?要创建s函数模板,可以按照以下步骤操作:a. 打开MATLAB并转到Simulink库浏览器。
b. 单击“新建”按钮,然后选择“S函数”模块。
c. 在弹出的对话框中选择“从模板创建”,然后单击“确定”按钮。
d. 在“名称”字段中输入自定义的s函数名称,并选择保存的位置。
e. 单击“确定”按钮后,MATLAB会在指定的位置创建一个新的s函数模板。
3. 如何在s函数模板中实现自定义功能?在s函数模板中实现自定义功能,需要编写MATLAB代码来定义模型行为。
步骤如下:a. 打开创建的s函数模板文件,可以看到模板代码的结构。
b. 根据需要修改s函数模板的输入、输出和参数。
c. 在s函数模板中插入自定义MATLAB代码,以实现所需的功能。
例如,可以在模板代码中添加计算、控制和状态更新等操作。
d. 定义MATLAB代码所需的变量,并确保正确引用了输入、输出和参数。
e. 通过编译s函数模板,可以检查代码是否正确并生成可在Simulink 中使用的可执行文件。
f. 将s函数模块拖拽到Simulink模型中,连接其他模块,如输入输出和信号处理块,以实现完整的仿真模型。
使用s函数模板可以实现各种自定义功能,例如控制器设计、系统建模和参数估计等。
matlab s-function参数
MATLAB S-Function是一种特殊的M文件函数,用于创建自定义的Simulink模块。
它允许用户编写自己的Simulink块,以扩展Simulink的功能和适应特定的应用需求。
在MATLAB中,S-Function通过定义M文件和一组参数来实现。
在使用MATLAB S-Function时,参数起着至关重要的作用。
参数用于在S-Function和Simulink模型之间进行数据传递和通信。
它们可以控制S-Function的行为,影响模型的仿真结果,以及改变模型的外部接口。
了解和熟练使用S-Function参数是使用MATLAB进行模型开发和仿真的重要技能。
接下来,我们将详细介绍MATLAB S-Function参数的使用方法和技巧,帮助用户更好地理解和应用S-Function。
一、S-Function参数的作用S-Function参数是S-Function的输入和输出。
它们可以用于以下几个方面:1. 控制S-Function的行为。
通过设置参数来开启或关闭某些功能,调整模型的参数等。
2. 设置S-Function的输入和输出端口。
参数可以指定输入和输出端口的数量、名称、类型等。
3. 传递数据到S-Function中。
参数可以作为S-Function的输入,传递数据到S-Function中,影响S-Function的行为和输出结果。
4. 从S-Function中获取数据。
参数可以作为S-Function的输出,将S-Function的计算结果返回给Simulink模型其他部分使用。
二、S-Function参数的定义和声明在编写S-Function时,首先需要定义和声明参数。
通常,参数的定义和声明是在S-Function的初始化函数中完成的。
以下是一个简单的示例:```matlabfunction [sys,x0,str] = sfun(t,x,u,flag,param1,param2,param3) switch flagcase 0 Initialization[sys,x0,str] = mdlInitializeSizes(param1,param2,param3);case 3 Outputssys = mdlOutputs(t,x,u,param1,param2,param3);case {1, 2, 4, 9} Unused flagssys = [];otherwiseerror(['Unhandled flag = ',num2str(flag)]); endendfunction [sys,x0,str,ts] = mdlInitializeSizes(param1,param2,param3) Initialize the state xx0 = 0;sys = 0;Return the details of the S-functionsizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 1;sizes.NumOutputs = 1;sizes.NumInputs = 1;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1;sys = simsizes(sizes);str = [];ts = [0 0];endfunction sys = mdlOutputs(t,x,u,param1,param2,param3)Compute the output of the S-functiony = u(1) + param1 * u(1) + param2 * u(1)^2 + param3 * u(1)^3; sys = y;end```在上面的例子中,我们定义了三个参数param1、param2和param3,并在初始化函数和输出函数中使用了这些参数。
matlabs函数的用法
matlabs函数的用法一、Matlab简介Matlab是一种高级的数学软件,常用于科学计算、数据分析和可视化。
它具有强大的数学计算能力和丰富的工具箱,可以处理各种类型的数据,包括数字、图像、音频和视频等。
Matlab还提供了一种易于使用的编程语言,可以帮助用户快速地编写复杂的算法和应用程序。
二、Matlab函数的基本用法1.函数格式Matlab函数通常采用以下格式:function [输出参数1, 输出参数2, ...] = 函数名(输入参数1, 输入参数2, ...)其中,方括号内表示可选项。
如果函数没有输出参数,则方括号可以省略。
2.调用函数在Matlab中调用函数非常简单。
只需输入函数名并提供所需的输入参数即可。
例如:output = myfunction(input1, input2);其中,myfunction是自定义的函数名,input1和input2是输入参数,output是输出参数。
3.查看帮助文档在使用Matlab函数时,可以通过查看帮助文档来了解该函数的详细信息。
只需在命令窗口中输入“help 函数名”即可查看该函数的帮助文档。
三、常用Matlab函数及其用法1.基本数学运算函数(1)abs(x):返回x的绝对值。
(2)sqrt(x):返回x的平方根。
(3)exp(x):返回e的x次幂。
(4)log(x):返回x的自然对数。
(5)sin(x)、cos(x)、tan(x):分别返回x的正弦、余弦和正切值。
(6)ceil(x)、floor(x):分别返回不小于和不大于x的最小整数。
2.矩阵和向量运算函数(1)eye(n,m):返回一个n行m列的单位矩阵。
(2)zeros(n,m):返回一个n行m列的全零矩阵。
(3)ones(n,m):返回一个n行m列的全一矩阵。
(4)rand(n,m):返回一个n行m列的随机矩阵,元素值在0和1之间。
(5)reshape(A,n,m):将矩阵A重塑为n行m列的新矩阵。
matlab中s函数编写心得(转)
matlab中s函数编写心得(转)Part I:所谓s函数是system Function的简称, 用它来写自己的simulink模块. s函数可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)< xmlnamespace prefix ="o" ns="urn:schemas-microsoft-com:office:office" />先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束.在matlab的workspace里输入edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构.1. 函数的函数头函数的第一行:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag) , 先讲输入与输出变量的含义:t是采样时间, x是状态变量, u是输入(是做成simulink模块的输入), flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等) sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义), x0是状态变量的初始值, str是保留参数(mathworks公司还没想好该怎么用它, 一般在初始化中将它置空就可以了, str=[]), ts是一个1×2的向量, ts(1)是采样周期, ts(2)是偏移量2. 函数分析下面结合sfuntmpl.m中的代码来讲具体的结构:switch flag, %判断flag,看当前处于哪个状态case 0,[sys,x0,str,ts]=mdlInitializeSizes;// 解释说明flag=0表示当前处于初始化状态,此时调用函数mdlInitializeSizes进行初始化,此函数在该文件的第149行定义. 其中的参数sys是一个结构体,它用来设置模块的一些参数,各个参数详细说明如下size = simsizes;%用于设置模块参数的结构体用simsizes来生成sizes.NumContStates = 0; %模块连续状态变量的个数sizes.NumDiscStates = 0; %模块离散状态变量的个数sizes.NumOutputs = 0; %模块输出变量的个数sizes.NumInputs = 0; %模块输入变量的个数sizes.DirFeedthrough = 1; %模块是否存在直接贯通sizes.NumSampleTimes = 1; %模块的采样时间个数, 至少是一个sys = simsizes(sizes); %设置完后赋给sys输出举个例子,考虑如下模型:dx/dt=fc(t,x,u) 也可以用连续状态方程描述:dx/dt=A*x+B*u x(k+1)=fd(t,x,u) 也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k)y=fo(t,x,u) 也可以用输出状态方程描述:y=C*x+D*u设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为(一般连续状态与离散状态不会一块用, 我这儿是为了方便说明):sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1;其他的可以不变, 继续在mdlInitializeSizes函数中往下看:x0 = []; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改为x0=[0,0](离散和连续的状态变量我们都设它初值为0)str = []; %保留参数, 置[]就可以了, 没什么用ts = [0 0]; %采样周期设为0表示是连续系统, 如果是离散系统在下面的mdlGetTimeOfNextVarHit函数中具体介绍case 1,sys=mdlDerivatives(t,x,u);//flag=1表示此时要计算连续状态的微分, 即上面提到的dx/dt=fc(t,x,u)中的dx/dt, 找到193行的函数mdlDerivatives,如果设置连续状态变量个数为0, 此处只需sys=[]就可以了, 按我们上述讨论的那个模型, 此处改成sys=fc(t,x(1),u)或sys=A*x(1)+B*u, 我们这儿x(1)是连续状态变量, 而x(2)是离散的, 这儿只用到连续的, 此时的输出sys就是微分case 2,sys=mdlUpdate(t,x,u);//flag=2表示此时要计算下一个离散状态, 即上面提到的x(k+1)=fd(t,x,u), 找到mdlUpdate函数, 它这儿sys=[]表示没有离散状态, 我们这儿可以改成sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即为x(k+1)case 3,sys=mdlOutputs(t,x,u);//flag=3表示此时要计算输出, 即y=fo(t,x,u), 找到218行的mdlOutputs函数. 如果sys=[]表示没有输出, 我们改成sys=fo(t,x,u)或sys=C*x+D*u %sys此时为输出ycase 4,sys=mdlGetTimeOfNextVarHit(t,x,u);//flag=4表示此时要计算下一次采样的时间, 只在离散采样系统中有用(即上文的mdlInitializeSizes中提到的ts设置ts(1)不为0), 连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys=[]. 这个函数主要用于变步长的设置, 具体实现大家可以用edit vsfunc看vsfunc.m这个例子case 9,sys=mdlTerminate(t,x,u);//flag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=[]就可, 如果你在结束时还要设置什么,就在此函数中写完了.Part II此外, s函数还可以带用户参数, 下面给个例子, 它和simulink下的gain模块功能一样function [sys,x0,str,ts] = sfungain(t,x,u,flag,gain)switch flag,case 0,sizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 1;sizes.NumInputs = 1;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1;sys = simsizes(sizes);x0=[];str=[];ts=[0,0];case 3,sys=gain*u;case {1,2,4,9},sys = [];end做好了s函数后, simulink --> user-defined function下拖一个S-Function到你的模型, 就可以用了. 在simulink -->user-defined function还有个s-Function Builder, 他可以生成用c 语言写的s函数. 或者在matlab的workspace下打sfundemos, 可以看到很多演示s函数的程序Part IIISIMULINK s-function的设计Simulink为用户提供了许多内置的基本库模块, 通过这些模块进行连接而构成系统的模型. 对于那些经常使用的模块进行组合并封装可以构建出重复使用的新模块, 但它依然是基于Simulink原来提供的内置模块.而Simulink s-function是一种强大的对模块库进行扩展的新工具.(一) s-function的概念s-function是一个动态系统的计算机语言描述, 在MATLAB里, 用户可以选择用m文件编写, 也可以用c或mex文件编写, 在这里只给大家介绍如何用m文件编写s-function.S-function提供了扩展Simulink模块库的有力工具, 它采用一种特定的调用语法, 使函数和Simulink解法器进行交互.S-function最广泛的用途是定制用户自己的Simulink模块. 它的形式十分通用, 能够支持连续系统、离散系统和混合系统.(二) 建立m文件s-function1. 使用模板文件:sfuntmp1.m, 其格式为[sys,x0]=function(t,x,u,flag). 该该模板文件位于MATLAB根目录下toolbox/simulink/blocks目录下模板文件里s-function的结构十分简单, 它只为不同的flag的值指定要相应调用的m文件子函数. 比如当flag=3时, 即模块处于计算输出这个仿真阶段时, 相应调用的子函数为sys=mdloutputs(t,x,u).模板文件使用switch语句来完成这种指定, 当然这种结构并不唯一, 用户也可以使用if语句来完成同样的功能. 而且在实际运用时, 可以根据实际需要来去掉某些值, 因为并不是每个模块都需要经过所有的子函数调用.模板文件只是Simulink为方便用户而提供的一种参考格式, 并不是编写s-function的语法要求, 用户完全可以改变子函数的名称, 或者直接把代码写在主函数里, 但使用模板文件的好处是, 比较方便, 而且条理清晰.使用模板编写s-function, 用户只需把s-函数名换成期望的函数名称, 如果需要额外的输入参量, 还需在输入参数列表的后面增加这些参数, 因为前面的4个参数是simulink调用s-function时自动传入的.对于输出参数, 最好不做修改. 接下去的工作就是根据所编s-function要完成的任务, 用相应的代码去替代模板里各个子函数的代码即可.Simulink在每个仿真阶段都会对s-function进行调用. 在调用时, Simulink会根据所处的仿真阶段为flag传入不同的值, 而且还会为sys这个返回参数指定不同的角色. 也就是说尽管是相同的sys变量, 但在不同的仿真阶段其意义却不相同, 这种变化由simulink自动完成.m文件s-function可用的子函数说明如下:mdlInitializeSizes(flag=0) -- 定义s-function模块的基本特性, 包括采样时间、连续或者离散状态的初始条件和sizes数组mdlDerivatives(flag=1) -- 计算连续状态变量的微分方程mdlUpdate(flag=2) -- 更新离散状态、采样时间和主时间步的要求mdlOutputs(flag=3) -- 计算s-function的输出mdlGetTimeOfNextVarHit(flag=4) -- 计算下一个采样点的绝对时间, 这个方法仅仅是在用户在mdlInitializeSizes 里说明了一个可变的离散采样时间概括说来, 建立s-function可以分成两个分离的任务: 第一, 初始化模块特性包括输入输出信号的宽度, 离散连续状态的初始条件和采样时间. 第二, 将算法放到合适的s-function子函数中去。
MATLAB的S函数
s函数s函数是system Function的简称,用它来写自己的simulink模块。
可以用matlab、C、C++、Fortran、Ada等语言来写,这儿只介绍怎样用matlab语言来写吧(主要是它比较简单)先讲讲为什么要用s函数,用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:第一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。
在matlab的workspace里打edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。
它的第一行是这样的:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag)先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据flag的不同而不同(下面将结合flag来讲sys 的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。
下面结合sfuntmpl.m中的代码来讲具体的结构:switch flag, %判断flag,看当前处于哪个状态case 0,[sys,x0,str,ts]=mdlInitializeSizes;flag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sfuntmpl.m的149行我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下size = simsizes;%用于设置模块参数的结构体用simsizes来生成sizes.NumContStates = 0;%模块连续状态变量的个数sizes.NumDiscStates = 0;%模块离散状态变量的个数sizes.NumOutputs = 0;%模块输出变量的个数sizes.NumInputs = 0;%模块输入变量的个数sizes.DirFeedthrough = 1;%模块是否存在直接贯通(直接贯通我的理解是输入能直接控制输出)sizes.NumSampleTimes = 1;%模块的采样时间个数,至少是一个sys = simsizes(sizes); %设置完后赋给sys输出举个例子,考虑如下模型:dx/dt=fc(t,x,u) 也可以用连续状态方程描述:dx/dt=A*x+B*ux(k+1)=fd(t,x,u) 也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k) y=fo(t,x,u) 也可以用输出状态方程描述:y=C*x+D*u设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为:(一般连续状态与离散状态不会一块用,这儿是为了方便说明)sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes. NumInputs=1;其他的可以不变。
matlab中s函数的用法
matlab中s函数的用法MATLAB中的S函数是一种特殊类型的函数,它是用于创建自定义模块的一种方法。
在这篇文章中,我们将会详细讨论在MATLAB中使用S函数的用途及其用法。
1. S函数的作用S函数是MATLAB中用于模拟模块的一种方法。
S函数的作用是将外部参数转化为内部参数,然后将计算结果输出到模块之外。
S函数是用于通过S函数编辑器来编辑S函数的,通过S函数编辑器,你可以自定义输入和输出端口,并编写MATLAB代码来处理这些端口的输入和输出。
2. 为什么要使用S函数?使用S函数有以下几个优点:- S函数可以让你将任意MATLAB代码封装成一种可重用的模块。
- S函数可以让你将多个MATLAB文件整合成一个单独的文件,以方便管理和维护。
- S函数可以让你自定义输入和输出端口,这样你就可以将模块中的参数自由地连接到其他模块。
- S函数可以让你在模块中使用MATLAB的高级功能,例如向量化运算、矩阵计算等。
- S函数可以让你通过传递参数的方式重复利用代码,避免代码的重复编写。
3. 如何编写S函数?编写S函数需要使用MATLAB中的S函数编辑器。
以下是编写S函数的一般步骤:- 打开S函数编辑器:在MATLAB中打开S函数编辑器,该编辑器可以在MATLAB工具栏的"应用程序"菜单中找到。
- 定义输入和输出端口:使用S函数编辑器,你可以定义一个或多个输入和输出端口。
这些端口将用于连接模块到其他模块或者系统中。
- 编写MATLAB代码:使用MATLAB代码编辑器,你可以在S函数中编写MATLAB代码来处理输入和输出端口的信息。
- 调试代码:使用MATLAB中的调试工具来调试你的S函数代码。
在调试代码时,你可以使用MATLAB中提供的一些特殊工具,例如断点、观察窗口、变量查看器等。
- 保存S函数:一旦你完成了S函数的编写和调试,就可以保存它并在其他MATLAB程序中使用它了。
4. 注意事项在使用S函数时有以下一些注意事项:- S函数在MATLAB中并非一种原生的函数类型,而是一种特殊的自定义函数类型。
MATLAB S函数编写示范
otherwiseDAStudio.error('Simulink:blocks:unhandledFlag',num2str(flag));endfunction[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizessizes=simsizes;sizes.NumContStates=2;sizes.NumDiscStates=0;sizes.NumOutputs=1;sizes.NumInputs=1;sizes.DirFeedthrough=1;sizes.NumSampleTimes=1;%at least one sample time is neededsys=simsizes(sizes);x0=[00];str=[];ts=[00];simStateCompliance='UnknownSimState';function sys=mdlDerivatives(t,x,u)sys=[-3*x(1)-x(2)+u;2*x(1)];//注意此处传递的是x向量,包含了x1和x2,引用时使用x(1),x(2),下标从1开始function sys=mdlUpdate(t,x,u)sys=[];function sys=mdlOutputs(t,x,u)sys=[x(2)];//x向量function sys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;%Example,set the next hit to be one second later.sys=t+sampleTime;function sys=mdlTerminate(t,x,u)sys=[];2.C语言S函数让我们做一个两个输入,两个输出,两个参数的例子。
在MATLAB命令行输入edit sfuntmpl_basic.c即可打开C语言S函数模板。
Matlab中S-函数的使用sfuntmpl
Matlab中S-函数的使⽤sfuntmpl function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)%SFUNTMPL General MATLAB S-Function Template% With MATLAB S-functions, you can define you own ordinary differential% equations (ODEs), discrete system equations, and/or just about% any type of algorithm to be used within a Simulink block diagram.%% The general form of an MATLAB S-function syntax is:% [SYS,X0,STR,TS,SIMSTATECOMPLIANCE] = SFUNC(T,X,U,FLAG,P1,...,Pn)%% What is returned by SFUNC at a given point in time, T, depends on the% value of the FLAG, the current state vector, X, and the current% input vector, U.%% FLAG RESULT DESCRIPTION% ----- ------ --------------------------------------------% 0 [SIZES,X0,STR,TS] Initialization, return system sizes in SYS,% initial state in X0, state ordering strings% in STR, and sample times in TS.% 1 DX Return continuous state derivatives in SYS.% 2 DS Update discrete states SYS = X(n+1)% 3 Y Return outputs in SYS.% 4 TNEXT Return next time hit for variable step sample% time in SYS.% 5 Reserved for future (root finding).% 9 [] Termination, perform any cleanup SYS=[].%%% The state vectors, X and X0 consists of continuous states followed% by discrete states.%% Optional parameters, P1,...,Pn can be provided to the S-function and% used during any FLAG operation.%% When SFUNC is called with FLAG = 0, the following information% should be returned:%% SYS(1) = Number of continuous states.% SYS(2) = Number of discrete states.% SYS(3) = Number of outputs.% SYS(4) = Number of inputs.% Any of the first four elements in SYS can be specified% as -1 indicating that they are dynamically sized. The% actual length for all other flags will be equal to the% length of the input, U.% SYS(5) = Reserved for root finding. Must be zero.% SYS(6) = Direct feedthrough flag (1=yes, 0=no). The s-function% has direct feedthrough if U is used during the FLAG=3% call. Setting this to 0is akin to making a promise that% U will not be used during FLAG=3. If you break the promise% then unpredictable results will occur.% SYS(7) = Number of sample times. This is the number of rows in TS.%%% X0 = Initial state conditions or [] if no states.%% STR = State ordering strings which is generally specified as [].%% TS = An m-by-2 matrix containing the sample time% (period, offset) information. Where m = number of sample% times. The ordering of the sample times must be:%% TS = [00, : Continuous sample time.% 01, : Continuous, but fixed in minor step% sample time.% PERIOD OFFSET, : Discrete sample time where% PERIOD > 0 & OFFSET < PERIOD.% -20]; : Variable step discrete sample time% where FLAG=4is used to get time of% next hit.%% There can be more than one sample time providing% they are ordered such that they are monotonically% increasing. Only the needed sample times should be% specified in TS. When specifying more than one% sample time, you must check for sample hits explicitly by% seeing if% abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD)% is within a specified tolerance, generally 1e-8. This% tolerance is dependent upon your model's sampling times% and simulation time.%% You can also specify that the sample time of the S-function% is inherited from the driving block. For functions which% change during minor steps, this is done by% specifying SYS(7) = 1 and TS = [-10]. For functions which% are held during minor steps, this is done by specifying% SYS(7) = 1 and TS = [-11].%% SIMSTATECOMPLIANCE = Specifices how to handle this block when saving and% restoring the complete simulation state of the% model. The allowed values are: 'DefaultSimState',% 'HasNoSimState' or 'DisallowSimState'. If this value% is not speficified, then the block's compliance with% simState feature is set to 'UknownSimState'.% Copyright 1990-2010 The MathWorks, Inc.%% The following outlines the general structure of an S-function.%switch flag,%%%%%%%%%%%%%%%%%%% Initialization %%%%%%%%%%%%%%%%%%%case0,[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;%%%%%%%%%%%%%%%% Derivatives %%%%%%%%%%%%%%%%case1,sys=mdlDerivatives(t,x,u);%%%%%%%%%%% Update %%%%%%%%%%%case2,sys=mdlUpdate(t,x,u);%%%%%%%%%%%% Outputs %%%%%%%%%%%%case3,sys=mdlOutputs(t,x,u);%%%%%%%%%%%%%%%%%%%%%%%% GetTimeOfNextVarHit %%%%%%%%%%%%%%%%%%%%%%%%case4,sys=mdlGetTimeOfNextVarHit(t,x,u);%%%%%%%%%%%%%% Terminate %%%%%%%%%%%%%%case9,sys=mdlTerminate(t,x,u);%%%%%%%%%%%%%%%%%%%%% Unexpected flags %%%%%%%%%%%%%%%%%%%%%otherwiseDAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));end% end sfuntmpl%%============================================================================= % mdlInitializeSizes% Return the sizes, initial conditions, and sample times for the S-function.%============================================================================= %function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes%% call simsizes for a sizes structure, fill it in and convert it to a% sizes array.%% Note that in this example, the values are hard coded. This is not a% recommended practice as the characteristics of the block are typically% defined by the S-function parameters.%sizes = simsizes;sizes.NumContStates = 0;sizes.NumDiscStates = 0;sizes.NumOutputs = 0;sizes.NumInputs = 0;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1; % at least one sample time is neededsys = simsizes(sizes);%% initialize the initial conditions%x0 = [];%% str is always an empty matrix%str = [];%% initialize the array of sample times%ts = [00];% Specify the block simStateCompliance. The allowed values are:% 'UnknownSimState', < The default setting; warn and assume DefaultSimState% 'DefaultSimState', < Same sim state as a built-in block% 'HasNoSimState', < No sim state% 'DisallowSimState' < Error out when saving or restoring the model sim statesimStateCompliance = 'UnknownSimState';% end mdlInitializeSizes%%=============================================================================% mdlDerivatives% Return the derivatives for the continuous states.%=============================================================================%function sys=mdlDerivatives(t,x,u)sys = [];% end mdlDerivatives%%=============================================================================% mdlUpdate% Handle discrete state updates, sample time hits, and major time step% requirements.%=============================================================================%function sys=mdlUpdate(t,x,u)sys = [];% end mdlUpdate%%=============================================================================% mdlOutputs% Return the block outputs.%=============================================================================%function sys=mdlOutputs(t,x,u)sys = [];% end mdlOutputs%%=============================================================================% mdlGetTimeOfNextVarHit% Return the time of the next hit for this block. Note that the result is% absolute time. Note that this function is only used when you specify a% variable discrete-time sample time [-20] in the sample time array in% mdlInitializeSizes.%=============================================================================%function sys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime = 1; % Example, set the next hit to be one second later.sys = t + sampleTime;% end mdlGetTimeOfNextVarHit%%=============================================================================% mdlTerminate% Perform any end of simulation tasks.%=============================================================================%function sys=mdlTerminate(t,x,u)sys = [];% end mdlTerminateS-函数的⼏个概念:1)直接馈通在编写S-函数时,初始化函数中需要对sizes.DirFeedthrough进⾏设置,如果输出函数mdlOutputs或者对于变采样时间的mdlGetTimeOfNextVarHit是输⼊u的函数,则模块具有直接馈通的特性sizes.DirFeedthrough=1;否则为0。
MATLAB S函数学习
最近看了一下无刷直流电机的相关概念及仿真,看到大多数的文献仿真中都使用到了S函数,因此下了点资料看了一番,在本博文中简单地说一下S函数的概念及使用。
S函数即系统函数System Function的意思,为什么要使用S函数呢?是因为在研究中,有时需要用到复杂的算法设计等,而这些算法因为其复杂性不适合用普通的Simulink模块来搭建,即matlab所提供的Simulink模块不能满足用户的需求,需要用编程的形式设计出S函数模块,将其嵌入到系统中。如果恰当地使用S函数,理论上,可以在Simulink下对任意复杂的系统进行仿真。
sizes.NumOutputs = 3; %输出变量个数
sizes.NumInputs = 2; %输入信号个数
sizes.DirFeedthrough = 1; %输入直接传入输出信号否
sizes.NumSampleTimes = 1; % at least one sample time is neededWO一般来说为1个
sys = simsizes(sizes);
x0=[]; %状态初始化
str=[];
ts=[-1 0]; %采样周期若写成-1表示继承其输入信号
%%%%%%在flag=1的时候进行连续系统状态的更新
function sys=mdlDerivatives(t,x,u)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S函数的简介及编写摘自恒润科技S-function的编写1. S函数模板编辑环境进入:在MATLAB主界面中直接输入:edit sfuntmpl即可弹出S函数模板编辑的M文件环境,修改即可。
在MATLAB主界面中直接输入:sfundemos,即可调出S 函数的许多编程例子。
2. S函数模板的相关基础:1)M文件S函数的引导语句为:xtflagfuFunction[psysxstrtsp,,12,...),,,0,],(,S函数默认的四个输入参数:t ,x ,u ,flagS函数默认的四个输出函数: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 "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的维数为2ssSetInputPortRequiredContiguous(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_DERIV ATIVES /* Change to #undef to remove function */#if defined(MDL_DERIV ATIVES)static void mdlDerivatives(SimStruct *S){}#endif /* MDL_DERIV ATIVES */static void mdlTerminate(SimStruct *S)//这里需要把global变量全部初始化,否则下次运行程序时,全局变量还是之前的值。