MATLAB/simulink_S函数
S函數是simulink動態系統的核心,可以采用m代碼,C,C++等語言編寫S函數,由一種特定的語法構成,用來描述并實現連續系統,離散系統以及復合系統等動態系統。S函數可以接收來自simulink求解器的相關信息,并對求解器發出的命令做出適當的響應
基礎知識
simulink
simulink是MATLAB中的可視化仿真工具,基于MATLAB采用框圖方式實現動態系統建模、仿真和分析的過程。每個simulink模塊都有三個基本元素:輸入向量,狀態向量和輸出向量。分別用u,x,y表示。
其中狀態向量最為重要,可以分為連續狀態,離散狀態或兩者混合狀態,實際運用中多用離散狀態。
simulink的仿真過程包含兩個主要階段:初始化和運行階段,初始化主要是設置一些基本參數,如系統輸入輸出個數,狀態初值,采樣時間等;運行階段主要是計算輸出,更新離散狀態,計算連續狀態等;
對系統仿真控制是通過系統模型與求解器之間建立對話的方式進行,simulink將系統模型、模塊參數和系統方程傳遞給simulink求解器,求解器將計算出的系統狀態與仿真時間通過simulink傳遞給系統模型本身,通過這樣的交互作用方式完成動態系統仿真。
S函數
過零
動態系統仿真過程中,過零是指系統模型中的信號或系統模型特征的某種改變,包括:1)信號在上一個仿真時間步長之內改變了符號。2)系統模塊在上個仿真時間步長改變了模式。對于離散模塊及其產生的離散信號不需要進行過零檢測
直接饋通(direct feedthrough)
直接饋通:表示系統的輸出或可變采樣時間是否受輸入控制
在編寫S-函數時,初始化函數中需要對sizes.DirFeedthrough 進行設置,如果輸出函數mdlOutputs或者對于變采樣時間的(mdlGetTimeOfNextVarHit)是輸入u的函數,則模塊具有直接饋通的特性sizes.DirFeedthrough=1;否則為0。
S-Function建立
1.通過在simulink中雙擊空白處輸入s function,回車確認,添加s函數,打開空白文件
2.通過library Browser打開,找到s-function examples,打開模板文件,更改函數名字與文件名字一致,另存為xiuMS
S函數模板文件詳解
function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag) %主函數 %主函數包含四個輸出: % sys數組包含某個子函數返回的值(根據flag不同而不同) % x0為所有狀態的初始化向量 % str是保留參數,總是一個空矩陣(一般置空即可) % Ts返回系統采樣時間(是一個1x2的向量,ts(1)是采樣周期,ts(2)是偏移量 %函數的四個輸入分別為采樣時間t、狀態x、輸入u和仿真流程控制標志變量flag(判斷當前狀態) %輸入參數后面還可以接續一系列的附帶參數simStateCompliance %% switch flag,case 0,[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;% flag=0,表示當前處于初始化狀態,此時調用函數mdlInitializeSizes進行初始化,具體見下面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 9,sys=mdlTerminate(t,x,u);otherwiseDAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));end %主函數結束 %下面是各個子函數,即各個回調過程 function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %初始化回調子函數 %提供狀態、輸入、輸出、采樣時間數目和初始狀態的值 %初始化階段,標志變量flag首先被置為0,S-function首次被調用時 %該子函數首先被調用,且為S-function模塊提供下面信息 %該子函數必須存在 sizes = simsizes;%生成sizes數據結構,信息被包含在其中 sizes.NumContStates = 0;%連續狀態數,默認為0 sizes.NumDiscStates = 0;%離散狀態數,默認為0 sizes.NumOutputs = 0;%輸出個數,默認為0 sizes.NumInputs = 0;%輸入個數,默認為0 sizes.DirFeedthrough = 1;%是否存在直饋通道,1存在,0不存在 sizes.NumSampleTimes = 1;%采樣時間個數,至少是一個 sys = simsizes(sizes);%返回size數據結構所包含的信息 x0 = [];%設置初始狀態 str = [];%保留變量,置空即可 ts = [0 0];%設置采樣時間,若采樣周期設為0,則為連續系統 simStateCompliance = 'UnknownSimState';function sys=mdlDerivatives(t,x,u)%計算導數回調子函數(計算連續狀態的微分) %給定t,x,u計算連續狀態的導數,可以在此給出系統的連續狀態方程 %該子函數可以不存在 sys = [];%sys表示狀態導數,即dxfunction sys=mdlUpdate(t,x,u)%狀態更新回調子函數(計算下一個離散狀態) %給定t、x、u計算離散狀態的更新 %每個仿真步內必然調用該子函數,不論是否有意義 %除了在此描述系統的離散狀態方程外,還可以在此添加其他每個仿真步內都必須執行的代碼 sys = [];%sys表示下一個離散狀態,即x(k+1)function sys=mdlOutputs(t,x,u)%計算輸出回調函數,給定t,x,u計算輸出,可以在此描述系統的輸出方程 %該子函數必須存在 sys = [];%sys表示輸出,即yfunction sys=mdlGetTimeOfNextVarHit(t,x,u)%計算下一個采樣時間,僅在系統是變采樣時間系統時調用 sampleTime = 1; %設置下一次采樣時間是在1s以后 sys = t + sampleTime;%sys表示下一個采樣時間點function sys=mdlTerminate(t,x,u)%仿真結束時要調用的回調函數 %在仿真結束時,可以在此完成仿真結束所需的必要工作 sys = [];s函數控制流程圖
實例
以S函數完成對輸入信號運算:y=2u\ y=2 u?y=2u
在模板文件中只需將輸入輸出改為1,在回調函數mdlOutputs中輸入狀態方程 sys=2?u\ sys=2*u?sys=2?u即可
建立如圖所示simulink框圖,得到仿真結果
總結
以上是生活随笔為你收集整理的MATLAB/simulink_S函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工厂模式 + 反射 ?= 灵活多变的数据
- 下一篇: strcpy_s函数