2017-07-17 51 views
1

我需要一個子系統,需要輸出1間隔或30秒或稍微超過30秒。Simulink - 輸出1每30秒,否則爲0

,MATLAB寫代碼,它應該工作一樣,

function y = fcn(time,uplinkTimeInterval) 

%#codegen 

persistent lastTriggerTime 

if isempty(lastTriggerTime) 

    lastTriggerTime = 0; 

end 

if time>=lastTriggerTime || time == 0 

    y = 1; 

    lastTriggerTime = time + uplinkTimeInterval; 
else 

    y = 0; 

end 

end 

其中ulplinkTimeInterval爲30秒。當然,我嘗試使用這個代碼的matlab函數塊,但由於某種原因它不起作用(在調試模式下,我可以看到y取值1,因爲它應該但它不會輸出塊外的值),因此我想用塊,但我不知道該怎麼做。

非常感謝您的幫助

回答

2

你可以用代碼或塊使這個邏輯相對容易。當你請求使用塊的解決方案時,就是這樣!

block diagram

  • 使用clock塊來跟蹤時間,以及一些constant塊,以確定的時間間隔(秒)處,得到的1而不是0
  • 使用memory塊將clock信號延遲1倍步,因此我們可以比較連續步的值。
  • 將時間除以間隔,並向下舍入,以給出間隔如何通過間隔。
  • 最後,使用relational operator比較連續的「間隔數」。如果更多的時間間隔已經超過了上限,那麼你剛剛跨過了間隔門檻。

注:這會爲每一個地方你還沒有越過了一個新的間隔時間步長和1處,你必須每個單獨的時間步返回0。輸出的準確性取決於模型的步長。


編輯:可能更清晰/容易,只需添加memoryfloor塊之後,所以你只是做除法/四捨五入一次。它仍然可以讓你對前一時間步驟進行比較。這將是這樣的:要做到這一點

2nd option

0

最簡單的方式是用只是一個單一的Pulse Generator塊,設置有1每30秒「高」。這顯示爲下圖中的一部分。無論在塊對話框中指定的時間段的百分比如何,信號都會很高。

如果由於某種原因您確實需要使用子系統,請使用觸發和啓用子系統(請參閱圖像右上方)。向觸發器和啓用端口輸入相同的脈衝信號,並將子系統內的輸出端口設置爲Output when disabledreset,並將Initial Output設爲0(請參閱圖像右下方)。

下面的模型顯示瞭如何做到這一點。在這種情況下,脈衝被設置爲30秒,並且每1%發生一次上升沿(請參閱圖像左上角)。

的輸出信號將是高爲每一個輸入上升時間一個時間步(假設觸發器被設定爲上升沿。)

Simulink Model