如何通過Simulink實現(xiàn)數(shù)據(jù)滾動刷新
最近有腳友提問,如何在Simulink中實現(xiàn)數(shù)據(jù)的實時滾動?今天借助這篇文章回答一下。
對于這個問題,用C代碼或者m語言實現(xiàn)可能大家都會,就是把數(shù)據(jù)進行右移和賦值操作。用Simulink基本模塊搭建,以前沒有接觸過的可能會有些困難。所以,本文將介紹如何通過Simulink實現(xiàn)數(shù)據(jù)滾動。
Simulink建模思路跟C代碼實現(xiàn)的方式基本一致,也是主要分為右移、賦值兩部分,最終搭建的模塊如下圖所示。

上圖中紅框中的右移子系統(tǒng)內(nèi)部需要迭代器和分配器配合使用,如下圖所示。

迭代器用于在一個步長內(nèi)連續(xù)輸出N個數(shù)值,可用于遍訪數(shù)組內(nèi)部的數(shù)據(jù),非常適合對數(shù)組進行索引操作,是對數(shù)組類型數(shù)據(jù)處理的神器。
分配器用于對數(shù)組進行指定位置的數(shù)據(jù)賦值。Y0是當前待處理數(shù)組,Idx1是數(shù)組的某一位索引,U是數(shù)組某一位具體的數(shù)值。假設(shè)Idx1=a,U=b,表達的意思就是將數(shù)組Y0的第a位數(shù)值替換為b。
所以上圖中,通過迭代器和分配器配合,在每一個仿真步長,將數(shù)組的每一位向下一位賦值,實現(xiàn)該子系統(tǒng)右移的功能。
上圖綠框中的賦值部分相對就比較簡單,只有一個分配器,即將實時刷新的值賦值到第一位,實現(xiàn)數(shù)據(jù)更新。
下面進行簡單的仿真驗證,先進行模塊基本設(shè)置。
這里設(shè)置滾動的數(shù)組長度為5,初始值為0,所以Delay模塊給定數(shù)組[0 0 0 0 0]。

模型中迭代器長度設(shè)置為4,因為我們只需要對數(shù)組第一位以外的進行處理。

兩處分配器都可以設(shè)置為One-based,Index vector(port)。

實時更新的數(shù)據(jù)我們給定一個線性增長的ramp,初始值為0,斜率為1,然后進行步長為1s的定步長仿真,結(jié)果如下圖。

從圖中可以看出:
- 初始時刻數(shù)組的第一到第五位均為0,即[0 0 0 0 0];
- 1s時,數(shù)組的第一位被刷新為1,即[1 0 0 0 0];
- 2s時,數(shù)組的第一位被刷新為2,第二位被1s時第一位的1覆蓋,即[2 1 0 0 0];
- 3s時,數(shù)組的第一位被刷新為3,第二位被2s時第一位的2覆蓋,第三位被2s時第二位的1覆蓋,即[3 2 1 0 0];
- ……
實現(xiàn)了數(shù)據(jù)的實時滾動刷新。
以上,通過Simulink的方式實現(xiàn)了數(shù)據(jù)的滾動刷新,在MBD開發(fā)過程還是有很大使用前景的。不管是車輛的能耗計算,還是動態(tài)規(guī)劃等算法的實施,你可能都會用到滾動刷新的實時數(shù)據(jù)。