S-函数的编写规则
S-函數使Simulink的功能大大擴充,除Mmatlab外,用戶還可以用其他語言(C/C++/FORTRAN/Ada)編寫實現算法,很強大的同時也對使用者提出了較高的要求。下面是編寫S-函數的整個流程:
0 基礎知識
(1)Simulink仿真過程Simulnk仿真分為兩步:初始化、仿真循環。仿真是由求解器控制的,求解器主要作用是:計算模塊輸出、更新模塊離散狀態、計算連續狀態。求解器傳遞給系統的信息包括:時間、輸入和當前狀態。系統的作用:計算模塊的輸出、更新狀態、計算狀態導數,然后將這些信息傳遞給求解器。求解器和系統之間的信息傳遞是通過不同標志來控制的。
、(2)S-函數控制流
(3)S-函數的幾個概念
?
1)? 直接饋通
在編寫S-函數時,初始化函數中需要對sizes.DirFeedthrough 進行設置,如果輸出函數mdlOutputs或者對于變采樣時間的mdlGetTimeOfNextVarHit是輸入u的函數,則模塊具有直接饋通的特性sizes.DirFeedthrough=1;否則為0。
?
2)? 采樣時間
仿真步長就是整個模型的基礎采樣時間,各個子系統或模塊的采樣時間,必須以這個步長為整數倍。
連續信號和離散信號對計算機而言其實都是采樣而來的,只是采樣時間不同,連續信號采樣時間可認為趨于0且基于微分方程,離散信號采樣時間比較長基于差分方程。離散信號當前狀態由前一個時刻的狀態決定,連續信號可以通過微分方程計算得到。如果要將連續信號離散化還要考慮下信號能否恢復的問題,即香農定理。
?
采樣時間點的確定:下一個采樣時間=(n*采樣間隔)+ 偏移量,n表示當前的仿真步,從0開始。
對于連續采樣時間,ts可以設置為[0 0],其中偏移量為0;
對于離散采樣時間,ts假設為[0.25 0.1],表示在S-函數仿真開始后0.1s開始每隔0.25s運行一次,當然每個采樣時刻都會調用mdlOutPuts和mdlUpdate函數;
對于變采樣時間,即離散采樣時間的兩次采樣時間間隔是可變的,每次仿真步開始時都需要用mdlGetTimeNextVarHit計算下一個采樣時間的時刻值。ts可以設置為[-2 0]。
對于多個任務,每個任務都可以以不同的采樣速率執行S-函數,假設任務A在仿真開始每隔0.25s執行一次,任務B在仿真后0.1s每隔1s執行一次,那么ts設置為[0.25 0.1;1.0 0.1],具體到S-函數的執行時間為[0 0.1 0.25 0.5 0.75 1.0 1.1…]。
如果用戶想繼承被連接模塊的采樣時間,ts只要設置為[-1 0]。
1 S-函數的編寫
1.1 S函數的輸入輸出參數含義
首先打開M-文件的模版函數:function[sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)
這個是無參的,如果有參數格式為:function[sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag,p1,p2,...)
1.2 子函數的作用
(1)
function[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes sizes = simsizes; sizes.NumContStates = 0; %連續狀態個數 sizes.NumDiscStates = 0; %離散狀態個數 sizes.NumOutputs = 0; %輸出個數 sizes.NumInputs = 0; %輸入個數 sizes.DirFeedthrough = 1; %是否直接饋通 sizes.NumSampleTimes = 1; %采樣時間個數,至少一個 sys = simsizes(sizes); %將size結構傳到sys中 x0 = []; %初始狀態向量,由傳入的參數決定,沒有為空 str = []; ts = [0 0]; %設置采樣時間,這里是連續采樣,偏移量為0 % Specify the blocksimStateCompliance. The allowed values are: % 'UnknownSimState', < The defaultsetting; warn and assume DefaultSimState % 'DefaultSimState', < Same sim state as abuilt-in block % 'HasNoSimState', < No sim state % 'DisallowSimState' < Error out whensaving or restoring the model sim state simStateCompliance = 'UnknownSimState';(2)
functionsys=mdlGetTimeOfNextVarHit(t,x,u) sampleTime = 1; % Example, set the next hit to be one secondlater. sys = t + sampleTime;?
(3)
functionsys=mdlOutputs(t,x,u) sys = [];?
(4)
function sys=mdlUpdate(t,x,u) sys = [];?
(5)
?
(6)
functionsys=mdlTerminate(t,x,u) sys = [];?
2 實例解析
在編寫S-函數之前要確定系統是否有狀態變量、是連續還是離散狀態以及輸入輸出個數、是否傳入參數、采樣時間等因素,針對不同的系統進行初始化、編寫不同的子函數。
以matlab自帶的限制積分函數程序limintm為例,講解S-函數的編寫。
Simulink系統:
S-函數設置:其中傳入的參數2,3,2.5分別表示為積分上限、積分下限和初始積分條件。
輸出圖形:
S-函數分析:
<span style="font-size:18px;">function [sys,x0,str,ts,simStateCompliance]=limintm(t,x,u,flag,lb,ub,xi) %傳入的三個參數放在后面lb,ub,xi的位置 %LIMINTM Limited integrator implementation. % Example MATLAB file S-function implementing a continuous limited integrator % where the output is bounded by lower bound (LB) and upper bound (UB) % with initial conditions (XI). % % See sfuntmpl.m for a general S-function template. % % See also SFUNTMPL.% Copyright 1990-2009 The MathWorks, Inc.
% $Revision: 1.1.6.2 $
switch flag
%%%%%%%%%%%%%%%%%%
% Initialization %
%%%%%%%%%%%%%%%%%%
case 0
[sys,x0,str,ts,simStateCompliance] = mdlInitializeSizes(lb,ub,xi);
%%%%%%%%%%%%%%%
% Derivatives %
%%%%%%%%%%%%%%%
case 1
sys = mdlDerivatives(t,x,u,lb,ub);
%%%%%%%%%%%%%%%%%%%%%%%%
% Update and Terminate %
%%%%%%%%%%%%%%%%%%%%%%%%
case {2,9}
sys = []; % do nothing
%%%%%%%%%%
% Output %
%%%%%%%%%%
case 3
sys = mdlOutputs(t,x,u);
otherwise
DAStudio.error(‘Simulink:blocks:unhandledFlag’, num2str(flag));
end
% end limintm
%
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%
function [sys,x0,str,ts,simStateCompliance] = mdlInitializeSizes(lb,ub,xi)
sizes = simsizes;
sizes.NumContStates = 1;%1個連續狀態,即積分狀態
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
str = [];
x0 = xi; %積分狀態初始條件‘
ts = [0 0]; % sample time: [period, offset]
% speicfy that the simState for this s-function is same as the default
simStateCompliance = ‘DefaultSimState’;
% end mdlInitializeSizes
%
%=============================================================================
% mdlDerivatives
% Compute derivatives for continuous states.
%=============================================================================
%
function sys = mdlDerivatives(t,x,u,lb,ub)
if (x <= lb & u < 0) | (x>= ub & u>0 )
sys = 0;
else
sys = u;
end
% end mdlDerivatives
%
%=============================================================================
% mdlOutputs
% Return the output vector for the S-function
%=============================================================================
%
function sys = mdlOutputs(t,x,u)
sys = x;
% end mdlOutputs
</span>
?
參考:
《基于MATLAB/Simulink系統仿真權威指南》
總結
- 上一篇: BZOJ3511: 土地划分
- 下一篇: 农民第六次拯救中国