2014-04-15 116 views
1

我在simulink的每個模擬步驟中收到可變大小的數據。不過,在收到整個數據包之前,我需要等待一定的模擬步驟,因此我需要某種可變大小的緩衝區。我沒有關於我將收到的數據總量的信息。我得到的唯一信息是模擬步驟的數量,我必須等到收到整個數據。可變大小緩衝區simulink

我試圖通過matlab function block和幾個delay blocks來實現它,延遲matlab function block的輸出數據一個模擬步驟。但總是在可變大小約束上失敗(因爲延遲塊不支持它),我也沒有發現任何支持該功能的buffer block,我在這裏需要。

希望你能幫我一把!

+0

您是否希望輸出僅在滿緩衝區可用時更新(即以知道必須等待所有數據到達的速率),還是希望它以相同速率動態變大作爲到達的數據包? –

+0

我想等待4模擬步驟,然後獲取所有接收到的數據並對其進行處理。 – bluhub

回答

1

鑑於您知道您的輸入和輸出採樣率,我會建議編寫一個c-mex S函數。

它不會是微不足道的,但可以

  1. 設置輸入和輸出端口,以具有不同的採樣率
  2. 設置輸入和輸出端口,以具有可變的信號長度
  3. 商店指向std :: vector < ...> P工作向量中的類
  4. std :: vector < ...>使您可以在新輸入數據到達時增加其大小,並在數據被髮布到輸出。

更新基於評論:

用於代碼生成,需要指定的上限爲緩衝區,這使得一個MATLAB功能塊合適的大小。 指定緩衝區的最大大小,並跟蹤使用內部持久變量填充了多少f。

但是在輸入端和輸出端有不同採樣率的塊的唯一方法是編寫一個S函數。對於MATLAB函數方法,我可以考慮兩種方法:

a)編寫代碼,以便它具有一個內部緩衝區,該緩衝區在緩衝區變滿時填充並僅更新輸出。 當然,輸出採樣率將與輸入採樣率相同,但數據只會在您指定時改變。 b)有兩個輸出,一個是緩衝區,一個是「我已經變滿了」邏輯信號。然後通過一個觸發子系統跟隨該塊,該觸發子系統通過它直接饋送緩衝區,並由邏輯信號觸發上升沿。觸發子系統的輸出將僅在緩衝區變滿時執行。

+0

好的謝謝到目前爲止。我不知道我是否可以這樣做,因爲simulink模型的生成代碼將被嵌入式系統使用。你有沒有其他想法,我該如何解決這個問題? – bluhub

+0

您在原始發佈中沒有提及代碼生成。 Simulink編碼器需要知道輸出數組的最大尺寸才能生成代碼,因此您必須對最大尺寸進行猜測/估計,以便生成的代碼始終分配足夠的內存(在編譯時)爲輸出。知道必須這樣做才能使緩衝區更容易創建,因爲現在您可以編寫一個MATLAB函數塊,並分配最大內存,並在新數據到達時填充它。當新數據到達時,使用持久變量來跟蹤下一個要填充的元素。 –

+0

我已經嘗試過這種方式。但我不知道如何設置MATLAB功能塊來等待一定數量的步驟,並用新的輸入數據填充輸出變量。 – bluhub