您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > SIMULINK仿真中S函数的使用
SIMULINK仿真中S函数的使用王云峰2015/07/02内容SIMULINK仿真流程S函数简介如何使用S函数创建S函数源文件S函数中的关键函数S函数工作原理小结SIMULINK仿真流程Simulink仿真模块通常,Simulink仿真系统包括输入(Input)、状态(states)和输出(Output)三个部分。·输入模块:即信号源模块,包括常数字信号源和用户自定义信号;·状态模块:即被模拟的系统模块,是系统建模的核心和主要部分;·输出模块:即信号显示模块,它能够以图形方式、文件格式进行显示。注意:在设计一个模型时,必须先确定这三个部分,以及它们之间的联系;Simulink的仿真模型并非一定要完全包括这三个部分,它可以缺少其中一个或者两个;Simulink的状态模块可以是连续的、离散的,或者它们二者的结合。SIMULINK仿真流程1.初始化阶段①对模型的参数进行估计,得到它们实际计算的值。②展开模型的各个层次;③按照更新的次序对模型进行排序;④确定那些显式化的信号属性,并检查每个模块是否能够接受连接它们输入端的信号;⑤确定所有非显式的信号采样时间模块的采样时间;⑥分配和初始化存储空间,以便存储每个模块的状态和当前值的输出。2.模型执行阶段模型仿真是通过数值积分来进行完成的,计算数值积分可以采用以下两步来进行:①按照秩序计算每个模块的积分;②根据当前输入和状态来决定状态的微分,得到微分矢量,然后把它返回给解法器以计算下一个采样点的状态矢量。在每一个时间步中,Simulink依次解决下列问题:·按照秩序更新模块的输出;·按照秩序更新模块的状态;·检查模块连续状态的不连续点;·计算下一个仿真时间步的时间。S函数简介S函数在模块库中的位置S函数模块设置S函数简介S函数是Systemfunction系统函数的简称,是指采用非图形化(即计算机语言,而非Simulink系统模块)的方式描述的功能模块。它采用一种特殊的调用语法,使函数和Simulink求解器进行交互。这种交互与求解器和Simulink仿真模型间的交互相类似:S函数接受来自Simulink求解器的相关信息,并对求解器发出的命令做出适当的响应。S函数作为与其它语言结合的接口,可以使用这个语言所提供的强大功能。S函数中采用非图形化的方式描述系统,其内部采用文本方式输入描述系统的公式、方程,这种方式非常适合复杂动态系统的数学描述,且可以在仿真过程中对仿真进行精确的控制。如何使用S函数一、在系统的Simulink仿真框图中添加S函数模块,并进行正确的设置;二、创建S-函数源文件。创建S函数源文件的方法有多种。用户可以按照S函数的语法格式自行编写代码,但是这样做很麻烦,且容易出错。Simulink在S-functionExamples模型库中为用户提供了针对不同语言的很多S函数模板和例子,用户可以根据自己的需要修改相应的模板或例子即可完成S函数源文件的编写工作;三、在系统的Simulink仿真框图中按照定义好的功能连接输入输出端口。注意:S-function模块中S函数名称必须和用户建立的S函数源文件的名称完全相同,S-function模块中的S函数参数列表必须按照S函数源文件中的参数顺序赋值,且参数之间需要用逗号隔开。如何使用S函数一个S函数必须包含必要的callback(子函数),做:1.1初始化(Initialization)1.2计算步长(非必须)1.3计算系统的输出1.4更新系统状态1.5与系统其他模块整合S函数的特征创建S函数源文件S-函数分类(1/2)M-fileS-函数通过functionhandles实现MEX-fileS-函数C,C++,Ada,Fortran;S-functionAPI实现优点:简单,容易上手可以调用Matlab里的工具箱缺点:比较慢不太适合硬件开发优点:速度快可以调用任何开源代码适合硬件开发缺点:对初学者比较难创建S函数源文件S-函数分类(2/2)ALevel-1M-fileS-functionmatlabroot/toolbox/simulink/blocks/sfuntmpl.mALevel-2M-fileS-functionmatlabroot/toolbox/simulink/blocks/msfuntmpl_basic.mAhand-writtenCMEXS-function(推荐)matlabroot/simulink/src/sfuntmpl_doc.cTheS-FunctionBuilder(新手)TheLegacyCodeTool创建S函数源文件%主函数function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag)switchflag,case0,[sys,x0,str,ts]=mdlInitializeSizes;%初始化例程子函数case1,sys=mdlDerivatives(t,x,u);%计算导数例程子函数case2,sys=mdlUpdate(t,x,u);%状态更新例程子函数case3,sys=mdlOutputs(t,x,u);%计算输出例程子函数case4,sys=mdlGetTimeOfNextVarHit(t,x,u);%计算下一个采样时间case9,sys=mdlTerminate(t,x,u);%仿真结束调用的例程函数otherwiseerror(['Unhandledflag=',num2str(flag)]);endS函数中的关键函数function[sys,x0,str,ts]=mdlInitializeSizessizes=simsizes;%生成sizes数据结构sizes.NumContStates=0;%连续状态数,缺省为0sizes.NumDiscStates=0;%离散状态数,缺省为0sizes.NumOutputs=0;%输出量个数,缺省为0sizes.NumInputs=0;%输入量个数,缺省为0sizes.DirFeedthrough=1;%有无直接馈入,有取1,无取0,缺省为1sizes.NumSampleTimes=1;%采样时间个数,至少取1sys=simsizes(sizes);%返回sizes数据结构所包含的信息x0=[];%设置初始状态str=[];%保留变量,置为空矩阵ts=[00];%采样时间:取0表示为连续系统初始化例程子函数S函数中的关键函数functionsys=mdlDerivatives(t,x,u)sys=[];%sys表示连续状态导数计算导数例程子函数状态更新例程子函数functionsys=mdlUpdate(t,x,u)sys=[];%sys表示下一个离散状态,即x(k+1)计算输出例程子函数functionsys=mdlOutputs(t,x,u)sys=[];%sys表示系统输出yS函数的工作原理应用实例:蹦极跳是一种挑战身体极限的运动,蹦极者系着一根弹力绳从高处的桥梁或山崖向下跳。如果蹦极者系在一个弹性系数为k的弹力绳索上。定义绳索下端的初始位置为0,整个蹦极跳系统的数学模型为S函数的工作原理编写S函数的源文件function[sys,x0,str,ts]=jumping(t,x,u,flag,l,m,d,k)case0,[sys,x0,str,ts]=mdlInitializeSizes(l,m,d,k);case1,sys=mdlDerivatives(t,x,u,l,m,d,k);case3,sys=mdlOutputs(t,x,u,l,m,d,k);S函数的工作原理初始化例程子函数function[sys,x0,str,ts]=mdlInitializeSizes(l,m,d,k)sizes.NumContStates=2;sizes.NumDiscStates=0;sizes.NumOutputs=1;sizes.NumInputs=0;sizes.DirFeedthrough=1;x0=[-l;0];S函数的工作原理计算导数例程子函数functionsys=mdlDerivatives(t,x,u,l,m,d,k)ifx(1)=0b=-k*x(1);elseb=0;endsys=[x(2);10+b/m-1/m*x(2)-1/m*abs(x(2))*x(2)];S函数的工作原理计算输出例程子函数functionsys=mdlOutputs(t,x,u,l,m,d,k)sys=[d-l-x(1)];
本文标题:SIMULINK仿真中S函数的使用
链接地址:https://www.777doc.com/doc-5151264 .html