基于S函数的simulink仿真
S函数可以用盘算机语言来形貌动态系统。在控制系统筹划中,S函数可以用来形貌控制算法、自适应算法和模子动力学方程。
S函数中使用文本方式输入公式和方程,适合复杂动态系统的数学形貌,并且在仿真过程中可以对仿真参数举行更精确的形貌、
1.1 S函数简介
S函数是系统函数(system function)的简称。可以用MATLAB代码、C、C++等语言来编写S函数。
1.2 S函数的使用步骤
步骤如下:
- 创建S函数源文件
- 在动态系统的simulink模子框图中添加S-function模块,并且举行正确设置
- 在simulink模子框图中按照定义好的功能毗连输入输出端口
1.3 S函数的基本功能及重要参数设定
S函数的基本功能及重要参数设定如下:
- S函数功能模块:各种功能模块完成不同的使命,这些功能模块(函数)称为仿真例程或回调函数(call - back functions),包括初始化(initialization)、导数(mdlDerivative)、输出(mdlOutput)等。
- NumContStates体现S - 函数形貌的模块中连续状态的个数。
- NumDiscStates体现离散状态的个数。
- NumOutputs和NumInputs分别体现模块输出和输入的个数。
- 直接馈通(dirFeedthrough)为输入信号是否在输出端出现的标识,取值为0或1。比方,形如 y = k × u y = k×u y=k×u的系统必要输入(即直接反馈),其中, u u u是输入, k k k是增益, y y y是输出,形如等式 y = x , x ˙ = u y = x,\dot{x}=u y=x,x˙=u的系统不必要输入(即不存在直接反馈),其中, x x x是状态, u u u是输入, y y y为输出。
- NumSampleTimes为模块采样周期的个数,S函数支持多采样周期的系统。 除了sys外,还应设置系统的初始状态变量 x 0 x_0 x0、说明变量str和采样周期变量 t s t_s ts。 t s t_s ts变量为双列矩阵,其中每一行对应一个采样周期。对连续系统和单个采样周期的系统来说,该变量为 [ t 1 , t 2 ] [t_1,t_2] [t1,t2], t 1 t_1 t1为采样周期, t 1 = − 1 t_1 = - 1 t1=−1体现继续输入信号的采样周期, t 2 t_2 t2为偏移量,一样寻常取为0。对连续系统来说, t s t_s ts取为 [ − 1 , 0 ] [-1,0] [−1,0]。
1.4 S函数形貌实例
在控制系统筹划中,S函数可以用于控制器、自适应律和模子形貌。
以模子 J θ ¨ = u + d ( t ) J\ddot{\theta}=u+d(t) Jθ¨=u+d(t)为例,其中, u u u为控制输入, d ( t ) d(t) d(t)为加在控制输入端的扰动,模子输出为 θ 和 θ ˙ \theta和\dot{\theta} θ和θ˙,即转动角度和角速率, J J J为转动惯量,该模子可以形貌如下:
x ˙ 1 = x 2 x ˙ 2 = 1 J ( u + d ( t ) ) \begin{align*} \dot{x}_1&=x_2\\ \dot{x}_2&=\frac{1}{J}(u + d(t)) \end{align*} x˙1x˙2=x2=J1(u+d(t))
其中: x 1 = θ , x 2 = θ ˙ x_1=\theta ,x_2=\dot{\theta} x1=θ,x2=θ˙
1 首先,初始化Initialization函数
接纳S函数来形貌动力学方程,可选取1输人2输出系统,如果角度和角速率的初始值取零,则模子初始化参数写为[0,0],模子初始化S函数形貌如下:(见模板)
2 微分方程形貌的mdlDerivative函数
该函数可用于形貌微分方程并实现数值求解。在控制系统中,可以采样该函数来形貌被控对象和自适应律等,并通过Simulink环境下选择数值分析方法来实现对模子的数值求解
取 J = 2 , d ( t ) = s i n t J=2,d(t)=sint J=2,d(t)=sint,则接纳S函数可以实现模子角度和角速率的求解,形貌如下:
- function sys=mdlDerivatives(t,x,u)
- J=2;
- dt=sin(t);
- ut=u(1);
- sys(1)=x(2);
- sys(2)=1/J*(ut+dt);
- sys = [dx1;dx2];
复制代码
3 用于输出的mdlOutput函数
S函数的mdlOutput函数通常用于形貌控制器或模子的输出。接纳S函数的mdlOutput模块来形貌模子角度和角速率的输出:
- function sys=mdlOutputs(t,x,u)
- sys(1) = x(1);
- sys(2) = x(2);
复制代码
最后,给出S函数模板
- function [sys,x0,str,ts,simStateCompliance] = plant(t,x,u,flag,pa)
- %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 0 is 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 = [0 0, : Continuous sample time.
- % 0 1, : Continuous, but fixed in minor step
- % sample time.
- % PERIOD OFFSET, : Discrete sample time where
- % PERIOD > 0 & OFFSET < PERIOD.
- % -2 0]; : Variable step discrete sample time
- % where FLAG=4 is 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 = [-1 0]. For functions which
- % are held during minor steps, this is done by specifying
- % SYS(7) = 1 and TS = [-1 1].
- %
- % 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 %
- %%%%%%%%%%%%%%%%%%
- case 0,
- [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
- %%%%%%%%%%%%%%%
- % Derivatives %
- %%%%%%%%%%%%%%%
- case 1,
- sys=mdlDerivatives(t,x,u,pa);
- %%%%%%%%%%
- % Update %
- %%%%%%%%%%
- case 2,
- sys=mdlUpdate(t,x,u);
- %%%%%%%%%%%
- % Outputs %
- %%%%%%%%%%%
- case 3,
- sys=mdlOutputs(t,x,u);
- %%%%%%%%%%%%%%%%%%%%%%%
- % GetTimeOfNextVarHit %
- %%%%%%%%%%%%%%%%%%%%%%%
- case 4,
- sys=mdlGetTimeOfNextVarHit(t,x,u);
- %%%%%%%%%%%%%
- % Terminate %
- %%%%%%%%%%%%%
- case 9,
- sys=mdlTerminate(t,x,u);
- %%%%%%%%%%%%%%%%%%%%
- % Unexpected flags %
- %%%%%%%%%%%%%%%%%%%%
- otherwise
- DAStudio.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 = 2;
- sizes.NumDiscStates = 0;
- sizes.NumOutputs = 2;
- sizes.NumInputs = 1;
- sizes.DirFeedthrough = 0;
- sizes.NumSampleTimes = 1; % at least one sample time is needed
- sys = simsizes(sizes);
- %
- % initialize the initial conditions
- %
- x0 = [0,0];
- %
- % str is always an empty matrix
- %
- str = [];
- %
- % initialize the array of sample times
- %
- ts = [0 0];
- % 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 state
- simStateCompliance = 'UnknownSimState';
- % end mdlInitializeSizes
- %
- %=============================================================================
- % mdlDerivatives
- % Return the derivatives for the continuous states.
- %=============================================================================
- %
- function sys=mdlDerivatives(t,x,u,pa)
- k=pa.k;
- m=pa.m;
- x1=x(1);
- x2=x(2);
- dx1=x2;
- dx2=-k/m*x1^3+u/m;
- sys = [dx1;dx2];
- % 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 = x;
- % 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 [-2 0] 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 mdlTerminate
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |