simulink中如何輸出兩個上升沿之間的時間差?或記住某一時刻。用s函數么。請見下面詳細描述,謝謝

1、在matlab的simulink中如何輸出兩個上升沿的時間差?

(若用s函數,請詳細說明示範下,因為不太會編寫,謝謝)

2、如何在simulink中記住之前的某一時間值?

3、如何在simulink的S-function(s函數)裡面使用全局變數?

例如:我用的s-function是.m文件(y=2*u的例子--times two)

編寫時:

································

function sys = mdlOutputs(t,x,u)

a=0;

b=0;

if(u==1)

b=t-a;

a=t;

end

sys=b;

%輸入u接收的是 檢測上升沿模塊hit crossing的輸出信號,b是想要的倆脈衝上升沿的時間差,這裡我只想給a、b賦一次初值,但現在每一次運行此s-function都會對a、b重新賦值,所以b總是=當前時間t-0,所以輸出結果sys不對。全局變數應該能解決此問題吧,咋用呀?

4、從未系統學過s-function,請問咋學呀?(+如何更好的學simulink)


先佔個位,等會兒幫你解答

============= 正式解答如下 ==================

我先提供我的完整的S-function和運行結果, 然後再解釋你的問題. 以下是Level 2 MATLAB S-function。你之前用的是Level 1的,可以考慮用Level 2, 語法相對簡單很多。

我就不寫注釋了,要解釋起來太長。有什麼不明白的請直接問。關鍵的邏輯部分在Output哪個函數里,我寫了一些注釋。這個邏輯應該不是最優的,僅供參考。

function detect_two_rising_edge(block)
setup(block);
end

function setup(block)

%% Register number of input and output ports
block.NumInputPorts = 1;
block.NumOutputPorts = 1;

block.InputPort(1).Dimensions = 1;
block.InputPort(1).DirectFeedthrough = false;
block.OutputPort(1).Dimensions = 1;

%% Set block sample time to discrete
block.SampleTimes = [0.1 0];

%% Set the block simStateCompliance to default (i.e., same as a built-in block)
block.SimStateCompliance = "DefaultSimState";

%% Register methods
block.RegBlockMethod("PostPropagationSetup", @DoPostPropSetup);
block.RegBlockMethod("Outputs", @Output);
end

function DoPostPropSetup(block)
%% Setup Discrete states
block.NumDworks = 2;
block.Dwork(1).Dimensions = 1;
block.Dwork(1).Name = "previous_input";
block.Dwork(1).DatatypeID = 0;
block.Dwork(1).Complexity = "Real";
block.Dwork(2).Dimensions = 1;
block.Dwork(2).Name = "Rising_time";
block.Dwork(2).DatatypeID = 0;
block.Dwork(2).Complexity = "Real";
end

function Output(block)
if block.InputPort(1).Data &> block.Dwork(1).Data %比較輸入信號和上一步的輸入信號
if block.Dwork(2).Data &> 0 %如果之前有rising edge,計算時間
block.OutputPort(1).Data = block.CurrentTime - block.Dwork(2).Data;% 輸出計算結果。
end
block.Dwork(2).Data = block.CurrentTime;
end
block.Dwork(1).Data = block.InputPort(1).Data;
end

用來測試的模型如下

模擬結果如下:Scope的第一個信號是測試信號,第二個顯示的是S-function輸出的兩個rising edge的時間差,這裡為0.7秒。

下面回答你的問題。其實可以歸結為兩個問題

1. 怎麼記住某一刻的值,能否用全局變數?

2. 怎麼學習s-function?

回答1: (應該)不能也不建議用全局變數。如你所見,我在S-function里聲明了兩個Dwork變數, 它們表示兩個離散的狀態。第一個狀態我用來記錄上一步的輸入,以便和當前的輸入做對比來檢測rising edge. 第二個狀態用來記錄上一個rising edge的觸發時間(初始值為0,由此可判斷之前是否有rising edge).

回答2. 建議多看文檔,特別是自帶的例子(輸入sfundemos能打開所有自帶例子)。另外可以通過文檔學習一下Simulink的工作原理,明白模擬的每一步Simulink在做什麼,S-function裡面的每個函數都是在什麼情況下被調用的。這個一開始學起來會比較困難,但是熟練以後會發現它的功能很強大。最後請關注知乎MATLAB專欄,我正準備有空寫一些相關的科普文章。


我極其討厭用SFunction,因此給出使用StateFlow的一種方法。

源文件:edge_detection_r2010a.mdl

http://pan.baidu.com/s/1nu62jBb


推薦閱讀:

matlab中的randn函數如何重複前一次的隨機數?
Matlab求解方程組?
Python有沒有類似Matlab中xlswrite這種寫入數據到Excel的方式?
機械的學生,MATLAB 應該學些什麼?
四旋翼可不可以用地面站(PC機)來實現姿態結算和控制,機載處理器只做讀數據和收發數據用?

TAG:MATLAB | simulink | Matlab2013A |