simulink中S函式格式

2021-09-19 20:45:22 字數 3104 閱讀 7525

s函式是system function的簡稱,用它來寫自己的simulink模組,用來實現simulink中無法直接提供的模組。s函式可以利用matlab的豐富資源,而不僅僅侷限於simulink提供的模組,而用c或c++等語言寫的s函式還可以實現對硬體埠的操作。

在matlab的workspace裡打edit sfuntmpl,就可以看到matlab自己提供的s函式模板,模板中s函式的格式的意義做如下分析。

首先

function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag)
sfuntmpl為自己定義的s函式,作為s-function的主函式,主函式共有4個輸入,4個輸出

下面分別解釋各個變數含義:

輸入變數:

t ——取樣時間

x ——狀態變數

u ——輸入變數,即simulink模組的輸入

flag——**過程的狀態標誌

輸出變數:

sys——sys陣列包含某個子函式返回的值,根據flag而變化

x0——狀態變數的初始值,總是乙個空矩陣

str ——保留引數

ts——返回系統取樣時間,是1*2的向量,ts(1) 是取樣週期,ts(2)是偏移量

ts為乙個兩列的矩陣,包含取樣時間和偏移量兩個引數,如果設定為[0 0],那麼每個連續的取樣時間步都執行,[-1 0]則表示按照所連線的模組的取樣速率進行,[0.25 0.1]表示**開始的0.1s後每0.25s執行一次,取樣時間點為timehit=n*period+offset。

dirfeedthrough,系統的輸出是否直接和輸入相關聯,即輸入是否出現在輸出端的標誌,若是為1,否則為0,一般可以根據在flag=3的時候,mdloutputs函式是否呼叫輸入u來判斷是否直接饋通

switch flag,                  %判斷flag,看當前處於哪個狀態
接下來是各個子函式:

s函式中目前支援的flag選擇有0、1、2、3、4、9等幾個數值,下面說一下在不同的flag情況下s函式的執**況:

在flag = 0的情況下,進行系統的初始化過程,呼叫mdlinitializesizes函式,對引數進行初始化設定,sys是乙個結構體,用它來設定模組的一些引數,各個引數詳細說明如下

case 0,						%初始化狀態

[sys,x0,str,ts]=mdlinitializesizes;

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輸出

x0 = ; %狀態變數設定為空,表示沒有狀態變數

str = ; %保留引數嘛,置就可以了

ts = [0 0]; %取樣週期設為0表示是連續系統

flag=1表示此時要計算連續狀態的微分,呼叫mdlderivatives函式,sys表示狀態導數,即dx

case 1,

sys=mdlderivatives(t,x,u);

flag = 2 表示要進行離散狀態變數的更新,呼叫mdlupdate函式,,sys表示下乙個離散狀態,即x(k+1)

case 2,

sys=mdlupdate(t,x,u);

flag=3表示此時要求取系統的輸出訊號,呼叫mdloutputs函式,sys表示輸出,即y

case 3,

sys=mdloutputs(t,x,u);

flag=4表示此時要計算下一次取樣的時間,只在離散取樣系統中有用(即上文的mdlinit ializesizes中提到的ts設定ts(1)不為0),由sys返回

case 4,

sys=mdlgettimeofnextvarhit(t,x,u);

flag=9表示此時系統要結束,一般來說寫上在mdlterminate函式中寫上sys=就可,如果你在結束時還要設定什麼,就在此函式中寫.

case 9,

sys=mdlterminate(t,x,u);

在實際**過程中,simulink會自動將flag設定為0,進行初始化過程,然後將flag的數值設定為3,計算模組的輸出,乙個**週期後,simulink將flag的數值先後設定為1和2,更新系統的連續和離散狀態,再將其設定為3,計算模組的輸出,如此迴圈直至**結束條件滿足。

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 ,

sys = ;

end

simulink中設定使用全域性變數

參考share data globally simulink中設定乙個全域性變數,在自定義的matlab function中可以直接呼叫,無需定義輸入輸出。具體如下 整個系統為350hz,自定義的matla function 在一秒中執行350次,後一次執行時要呼叫前一次的輸出。需要設定全域性變數 ...

simulink中的mux與的demux

4 總結 對mux與demux的好奇。source.m中輸出兩個訊號 xd cos t 與 yd sin t source.m檔案 如下 function sys,x0,str,ts spacemodel t,x,u,flag function sys,x0,str,ts source t,x,u,...

格式化字串中的大S和小s

輸出中文 char sza 8 wchar szw 8 sprintf sza,s l 和平 亂碼,四個位元組 sprintf sza,s 和平 和平 sprintf sza,s l 和平 零位元組 sprintf sza,s 和平 零位元組 swprintf szw,l s l 和平 和平,四個位...