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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

S-函数的编写规则

發布時間:2023/12/9 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)

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

  • ?

    (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系統仿真權威指南》





    總結

    以上是生活随笔為你收集整理的S-函数的编写规则的全部內容,希望文章能夠幫你解決所遇到的問題。

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