日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

S-function入门及案例详解(1)——S-function基础介绍及基本案例

發布時間:2023/12/9 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 S-function入门及案例详解(1)——S-function基础介绍及基本案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

S-function是Simulink最具魅力的地方,為了方便更快速了解Simulink基礎知識,本專題將利用五篇文章對S-function進行介紹及其案例詳解。歡迎關注~

目錄

    • 一、S-Function概述
      • 1.1 簡介
      • 1.2 特點
      • 1.3 Level1與Level2形式
      • 1.4 S-function模塊
    • 二、S-function的幾個相關概念
      • 2.1 直接饋通
      • 2.2 采樣時間與偏移量
    • 三、S-function仿真流程
    • 四、S-function函數詳解
      • 4.1 sfuntmpl函數介紹
      • 4.2 mdlInitializeSizes函數
      • 4.3 mdlDerivatives函數
      • 4.4 mdlUpdate函數
      • 4.5 mdlOutputs函數
      • 4.6 mdlGetTimeOfNextVarHit函數
      • 4.7 mdlTerminate函數
    • 小結

一、S-Function概述

1.1 簡介

S-Function是system-function系統函數的縮寫,是指采用非圖形化的方式(即計算機語言,卻別與Simulink的系統模塊)描述的一個功能塊。說得簡單,S-Function就是用MATLAB所提供的模型不能完全滿足用戶,而提供給用戶自己編寫程序來滿足自己要求模型的接口。

1.2 特點

S-function具有一下特點:
(1)S-function為Simulink的系統函數;
(2)采用非圖形化的方法實現一個動態系統;
(3)可以使用多種語言進行編寫;
(4)能夠響應Simulink求解器命令;
(5)可以開發新的Simulink模塊;
(6)擴展Simulink功能。M文件的S-function可以擴展圖形能力,C-MEX的S-function可以提供與操作系統的接口;
(7)可以與已有的代碼相結合進行仿真;
(8)可以采用文本方式輸入復雜的系統方程;
(9)S-function的語法結構是為實現一個動態系統而設計;

1.3 Level1與Level2形式

M文件形式有兩種,Level1和Level2,二者的包裝模塊是不同的。

類型優點缺點
level1運行速度快,能處理矩陣數據只能處理點數據,不能處理復數以及基于幀的數據
level2能夠處理的數據類型多,包括矩陣、復數以及基于幀的數據運行速度慢

1.4 S-function模塊

S-function模塊,位于Simulink/User-Defined Functions模塊庫中,是使S-function圖形化的模板工具,用于為S-function創建一個定值的對話框和圖標。

S-function模塊使得對S-function外部輸入參數的修改更加靈活,可以看作是S-function的一個外殼或這面板。S-function模塊及其參數對話框如下:

該模塊的參數設置如下:

  • S-function name:填入S-function的函數名稱,這樣就建立了S-function模塊與M文件形式的S-function之間的對應關系;
  • S-function parameters:填入S-function需要輸入的外部參數的名稱,如果有對各變量,則變量中間用逗號隔開,如a,b,c;
  • S-function modules:僅當S-function是用C語言編寫并用MEX工具編譯的C-MEX文件時,才需要填寫該參數;

設置完這些參數后,S-function模塊就成了一個具有指定功能的模塊,它的功能取決于S-function的內容,可以通過修改S-function來改變該模塊的功能。

二、S-function的幾個相關概念

2.1 直接饋通

直接饋通是指輸出直接受控于一個輸入口的值。有一個很好的經驗方法可用于判斷輸入是否為直接饋通:
如果輸出函數(mdlOutputs或flag==3)是輸入u的函數,即,如果輸入u在mdlOutputs中被訪問,則存在直接饋通。

例如,如果系統是y=k*u,其中,u是輸入,k是增益,y是輸出,這就是具有直接饋通輸入的系統。
正確設置直接饋通標志是十分重要的,因為這不僅關系到系統模型中的系統模塊的執行順序,還關系到對代數環的檢測和處理。

2.2 采樣時間與偏移量

采樣時間是按照固定格式成對指定的:[采樣時間 偏移時間]

采樣時間表示意義
[0 0]連續采樣時間
[-1 0]繼承S-function輸入信號或父層模型的采樣時間
[0.5 0.1]離散采樣時間,從0.1s開始每0.5s采樣一次

三、S-function仿真流程

S-function包括主函數和6個功能子函數,包括mdlInitializeSizes(初始化)、mdlDerivatives(連續狀態微分)、mdlUpdate(離散狀態更新)、mdlOutputs(模塊輸出)、mdlGetTimeOfNextVarHit(計算下次采樣時刻)和mdlTerminate(仿真結束)。

在S-function仿真過程中,利用switch-case語句,根據不同階段對應的flag值(仿真流程標志向量)來調用S-function的不同子函數,以完成對S-function模塊仿真流程的控制。
S-function仿真流程如下:

一個更直觀的流程圖如下,大家可以好好理解一下:

四、S-function函數詳解

利用命令

edit sfuntmpl

可以進入sfuntmpl函數中,這個函數由一個主函數和六個子函數構成,下面進行一一介紹。

4.1 sfuntmpl函數介紹

函數名sfuntmpl可以自由定義,但文件名要與函數名一致。函數如下:

function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)switch flag,% Initialization %case 0,[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;% Derivatives %case 1,sys=mdlDerivatives(t,x,u);% 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 %otherwiseDAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));end

輸入量:
t——當前時間;
x——狀態向量;
u——輸入向量;
flag——標志位(默認為0);
輸出量:
sys——一個通用的返回參數。返回值取決于flag的值。例如:flag=3,sys則包含了S-function的輸出;
x0——狀態初始值(如果系統中沒有狀態,則向兩位空);
str——默認為空,無需設置;
ts——采樣時間,包含采樣時間和偏移量;
simStateComplicance——附加變量;

case 0:調用mdlInitializeSizes函數,初始化子函數,必須執行;

case1:調用mdlDerivatives函數,連續狀態的導數;

case2:對離散狀態進行更新,更新到x(n+1);

case3:調用mdlOutputs函數,系統輸出y;

case4:調用mdlGetTimeOfNextVarHit函數,下一個采樣時間點;

case9:調用mdlTerminate函數,函數終止;


接下來對這五個子函數進行分別介紹。

4.2 mdlInitializeSizes函數

mdlInitializeSizes函數代碼如下:

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; % at least one sample time is neededsys = simsizes(sizes);% initialize the initial conditions x0 = [];% str is always an empty matrix str = [];% initialize the array of sample times ts = [0 0];simStateCompliance = 'UnknownSimState';

其中size屬性如下:
sizes.NumContStates = 0; %連續狀態的數量
sizes.NumDiscStates = 0; %離散狀態的數量
sizes.NumOutputs = 0; %輸出的數量
sizes.NumInputs = 0; %輸入的數量
sizes.DirFeedthrough = 1; %輸出y和輸入u是否是直通
sizes.NumSampleTimes = 1; %采樣時間

x0表示初始狀態;ts表示采樣時刻;
【注意】:
ts的第一個數字表示采樣時間,第二個數字表示偏移量
[0 0]——表示默認采樣時間(默認為0.2秒采樣一次);
[-1 0] ——表示根據連接模塊的采樣頻率進行采樣;

4.3 mdlDerivatives函數

連續狀態的導數,默認為空。
函數代碼如下:

function sys=mdlDerivatives(t,x,u)sys = [];

4.4 mdlUpdate函數

離散狀態的更新。
函數代碼如下:

function sys=mdlUpdate(t,x,u)sys = [];

4.5 mdlOutputs函數

輸出。
函數代碼如下:

function sys=mdlOutputs(t,x,u)sys = [];

4.6 mdlGetTimeOfNextVarHit函數

下一個采樣時間點,在一秒鐘之后進行下一次采樣。
函數代碼如下:

function sys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime = 1; % Example, set the next hit to be one second later. sys = t + sampleTime;

4.7 mdlTerminate函數

終止函數。
函數代碼如下:

function sys=mdlTerminate(t,x,u)sys = [];

小結

flag子函數說明
0mdlInitializeSizes定義S-function模塊的基本特性,包括采樣時間,連續和離散狀態的初始化條件,以及sizes數組
1mdlDerivatives計算連續狀態變量的導數
2mdlUpdate更新離散狀態、采樣時間、主步長等必需條件
3mdlOutputs計算S-function的輸出
4mdlGetTimeOfNextVarHit計算下一個采樣點的絕對時間,只有當在mdlInitializeSizes中指定了變步長離散采樣時間時,才使用該程序
9mdlTerminate執行Simulink終止時所需的任何任務

ok!下一篇文章S-function入門及案例詳解(2)——S-function基本案例介紹將介紹一下S-function的基礎案例。

如果對你有所幫助,記得點個贊喲~

總結

以上是生活随笔為你收集整理的S-function入门及案例详解(1)——S-function基础介绍及基本案例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。