Simulink模型架構指導

Simulink模型架構指導

來自專欄 汽車電子軟體工程師的所見所聞

Simulink模型架構指導

  • 1. Simulink 和 Stateflow的角色
  • 2. 模型結構分層
  • 2.1 層的類型
  • 2.2 頂層劃分方法
  • 2.3 功能層和子功能層建模方法
  • 2.4 調度層建模方法
  • 2.5 控制層建模方法
  • 2.6 選擇層建模方法
  • 2.7 數據流層建模方法
  • 2.8 Simulink 模型和嵌入式實現的關係
  • 3. AUTOSAR 概念
  • 3.1 AUTOSAR 軟體平台概念
  • 3.2 RCP 和 AUTOSAR 軟體平台
  • 4. 單任務和多任務
  • 4.1 單任務
  • 4.2 多任務
  • 4.3 不同運行周期的子系統連接後的影響

LICENCE: 本文根據《JMAAB V4.01》部分章節進行翻譯和整理,文中只是針對MBD開發方式描述了模型架構的綱要和觀念。由於Simulink提供了多種可以滿足需求的模塊及建模方法,所以很難進行詳盡的描述說明,翻譯和整理由Tomato一人完成,歡迎探討,轉載時需要保留本段文字

1. Simulink 和 Stateflow的角色

所有的系統都可以使用Simulink或Stateflow進行建模。

如果使用Stateflow進行建模,Simulink僅僅作為信號的輸入輸出和模擬,在Stateflow中可以使用多種公式和方法來替代simulink進行處理。如果只用Simulink,可以通過使用Switch-Case塊的方法來替代Stateflow實現複雜的狀態變數。

因此,使用Simulink或Stateflow對於特定部分的建模,是主觀依據開發人員對於哪種表達方法更為理解。應該根據整體的團隊水平來實現如上選擇和建模。

在大多數情況下,Stateflow的RAM效率要比Simulink差。因此,Simulink在使用簡單公式的計算中具有優勢。除此之外,Simulink在使用簡單的觸發和切換系統中,對於狀態變數的使用也更具有優勢。當使用Stateflow所建的模型可以用Simulink進行替代建模時,需要考慮如下因素進而做出決定:

  • 確保靜態RAM足夠大,以保證Stateflow 的輸入輸出以及內部變數的正確運行。
  • 當使用內部通用計算公式時,要設計防溢出的保護。
  • 當外部計算完成時,需要對整體進行分塊,以降低這個模塊的理解難度。

在一些情況下,Stateflow能夠比Simulink進行更接近於C語言的表達方法,但是這樣的模型沒有很好的外觀狀態,並不是很容易理解。在這些情況下,使用S-Function會更有利。

Stateflow 可以計算特定的狀態安排,或進行for-loop的計算,在這些層面上要比Simulink更有效率,但是近些年來,使用Matlab語言進行如上計算,也變得更有效率一些。

當使用Simulink進行建模時,如果處理如下所述的狀態,則可通過使用Stateflow來改善可讀性。

  1. 同一個輸入有不同的輸出值
  2. 多個狀態存在 (例如3個及更多)
  3. 對於定義的一個狀態的意義,不是無限的值而是一個離散的數值。
  4. 在狀態內部,要求初始化(首次執行)和後面的 執行狀態期間有所不同。
  5. 除了狀態變數,輸入和輸出變數是可以被可視化的信號.

舉個例子,在觸發器電路中,不同的輸出對應於同一個輸入。而且,狀態變數的值被限定在0和1。 然而,在輸入輸出都為0或1的情況下,仍可以有無限多的狀態分類。此外,在狀態進入和執行兩個動作間沒有區別。換句話說,上訴幾條中僅僅符合第一條,所以這時候應該使用Simulink進行建模。

關於採用Simulink還是Stateflow進行建模可以和幾個人進行溝通協商,並最終取決於需要解決的實際問題。 Stateflow中是採用狀態轉換還是 流程圖函數也需要進行考慮和決定,例如需要 定奪 使用 狀態的轉換和條件分支來 替代 使用狀態的流程圖函數。真值表也被分類為使用條件分支當中的方法。

此外,當使用Stateflow進行如上設計時,需要依據經典的模型樣式進行設計,以便於能夠更好的生成嵌入式代碼。

Stateflow支持生成HDL代碼。在實現HDL編碼器時,應使用Mealy和Moore模式。此外,當需要對內部泄漏進行保護時, Moore 模式更適合。

需要注意,本指南不是針對HDL代碼生成。

2. 模型結構分層

如下示例了模型分層中分割和布局的觀念,可作為開發中的參考。這並不是一個明確的規則,但這是一個建模的基礎方法。

2.1 層的類型

搭建層的方法

  • 如果主要目的為調整一層的空間排布,則應盡量避免打包到子系統
  • 如下為層次的概念,子系統需要依據此描述進行分層
  • 不要使用多餘的層
  • 一層模型中,允許複合層的建模概念

層概念

名稱 |層概念 | 層目的

-------|-----------|------------

頂層 |功能層 |大塊功能部分

|調度層 |執行時間的表達(採樣、順序)

底層 |子功能層 |功能的細節表達部分

|控制流層 |根據處理和執行順序劃分(input → judgment → output,等)

|選擇層 | (select output with Merge block) 切換相應被激活的子系統並且執行

|數據流層 |用於不可分離計算的層

2.2 頂層劃分方法

對於頂層劃分,主要有如下三個方法

  • 簡單控制模型

表現為功能層和調度層在同一層中,在這樣的模型里,功能 = 執行單元。

例子: 控制模型只有一個採樣周期,並且各功能模塊都按照執行順序進行排列。

  • 複雜控制模型 α

調度層放在最頂層

這樣會使手寫代碼更容易集成,但是功能模塊被分割,導致模型可讀性降低。

  • 複雜控制模型 β

功能層放在最頂層,並且調度層在各功能模塊下進行構建。

2.3 功能層和子功能層建模方法

  • 根據功能劃分子系統,每個子系統代表「一個獨立功能」
  • 對於執行單元,「一個獨立功能」的子系統是不必要的。因此,各子系統不一定全都設為原子子系統。

    (對於如上列出的 type β, 將功能層子系統設為虛擬子系統更合適一些。如果將他們設為原子子系統,則可能會出現代數環。)
  • 使用注釋,功能概述必須在圖層上描述或包含在子系統概述中,並顯示為注釋。
  • 如果模型里有幾個大的功能模塊,則需要考慮使用模型引用。

2.4 調度層建模方法

需要設置周期間隔和優先順序及順序。

  • 設置多個周期間隔需要注意

在不同周期的連接系統中,有可能發生信號變數會在快周期任務中被調用,此時在慢周期中該信號還沒有被計算出來。當不同周期進行連接時,需要一塊固定的RAM區。因此,需要在頂層為每個不同周期的任務進行進行時間分割,保證底層中沒有不同周期的模塊進行連接。

  • 設置優先順序

在設計多個不同功能的系統時,優先順序設定十分重要。建議盡量根據連接的順序來使系統自動確定運行順序。

對於順序優先順序,如下項需要進行設定:不同周期的優先順序,和同周期的優先順序。

  • 周期間隔和優先順序的設定方法:

如下描述的方法可大體上分為2種類型。

  1. 子系統或模塊的執行周期時間和優先順序設置。
  2. 使用條件子系統,用戶設置獨立的排列順序來匹配任務調度。

幾個條件下存在的模式,例如配置單速率或多速率,原子子系統設置,是否使用模型引用等。這其中啟用哪個功能都會直接影響到生成的C代碼,所以需要根據項目的不同情況進行綜合考量。

受影響的典型因素如下:

  • 模型方面上
  • 是否存在不同的採樣時間?
  • 模型是否需要實現幾個獨立的功能?
  • 使用模型引用
  • 模型數量 (Simulink是否會生成多個源代碼)
  • 源代碼方面上
  • 是否使用實時操作系統
  • 實際採樣周期和理論計算周期的一致性
  • 適用範圍 (應用層或基礎軟體)
  • 源代碼類型:是否符合/支持 AUTOSAR .
  • RAM, ROM 特別是RAM剩餘百分比

進行如上考量後,將會對使用的樣式進行調整。

2.5 控制層建模方法

控制層是用於表示所有輸入處理、中間處理、和輸出處理的層。模塊和子系統的排列十分重要。將多個混合的小功能分組,最後排列成3個大組,包括:輸入處理,中間過程處理,輸出處理。這三個大組構成了控制層的概念基礎。與數據流層相似的排列方法是,都使用水平線代表模塊運行順序和方向,與其不同的是控制流層大多是由複合模塊和子系統構成的。

在控制流程,同一水平線上的根據箭頭所指方向進行順序處理,同一垂直方向的代表有相同的優先順序。

可以使用Area工具進行框選並標註幾個模塊的部分

控制層可以和具有功能的模塊共存。

這些模塊放置在子功能層和數據流層之間的區域。

當模塊的數量特別多,且都在數據流層進行使用,這時可以使用功能單元打包的方式進行控制層的整合。這樣會使模型更容易理解,同時提高了模型的可維護性。

即使僅由模塊構成,不存在子系統和模塊的混合體,如果模型的水平方向結構能夠劃分成 輸入/中間過程/輸出 處理,這樣也可以稱作為控制層。

2.6 選擇層建模方法

選擇層可以垂直或水平方向構建。(There is no significance to which orientation is chosen)

選擇層是和控制層進行混合而成。

下圖紅色框內,根據條件只有一個子系統能夠運行,所以這被稱作為選擇層。這層模型雖然能夠被劃分成 initial processing/intermediate processing (conditional control flow)/output processing這三個處理模塊組,但是稱為控制層並不恰當,因為在控制層,水平方向代表不同的處理,並且具有相同優先順序的並行處理在垂直方向上進行排列。而在選擇層,垂直方向上的並不一定是並行處理,而是每次僅選擇其中一個進行運行。

例子:

  • Switching of coupled functions between running upwards or downwards, changing in chronological order.
  • Switching to setting where the computation switches after the first time (immediately after reset) and second time.
  • Switching between destination A and destination B.

2.7 數據流層建模方法

數據流層是在選擇層/控制層之下的一層。

當僅表現為一個功能,並作為輸入/中間過程/輸出處理的具體實現,且不能再進行劃分,則這樣的一層被稱作為數據流層。舉個例子,一個持續計算不能被分割的系統。除一些特殊情況下,數據流層不允許出現子系統。

特殊情況:如下情況允許在數據流層出現子系統。

  • 子系統被設為重用子系統。
  • Simulink 標準庫里存在的子系統。
  • 用戶自定義庫中存在的子系統。

簡單數據流層 例子

複雜數據流層 例子

當遇到輸入處理和中間過程處理不能夠清晰進行劃分的時候,就如上面的例子所示,展開為數據流層。

當同時計算一個信號的前端反饋和後端反饋時,數據流層會變得複雜。甚至此種情況會有很多模塊在同一層, 但是為了清晰的表達計算,仍舊不能在數據流層進行子系統的創建。當能夠通過劃分模型進行整合的時候,應該被打包成控制層而不是數據流層。

2.8 Simulink 模型和嵌入式實現的關係

在真實的嵌入式系統中運行,需要Simulink模型生成嵌入式C代碼。這有很大一部分受到Simulink配置項的影響,根據Simulink針對相關功能進行何種程度的建模,以及如何嵌入和真實系統的時間設定。

如果嵌入式系統里使用的任務與Simulink模型里調度的任務不同,這將產生很嚴重的影響。

3. AUTOSAR 概念

本文中,並不對AUTOSAR標準進行解釋,而會說明AUTOSAR的概念。用戶不必完全符合AUTOSAR標準,但必須了解它,並作為建模中的參考。

3.1 AUTOSAR 軟體平台概念

當設計一個控制模型的時候,必須要遵循AUTOSAR 軟體平台的概念,並要審查所設計的模型是歸類到應用軟體還是基礎軟體。

如果模型混合了應用和基礎軟體,需要在設計階段就進行劃分。

AUTOSAR 軟體平台概念

  • 高容量,低速,常規的處理在應用軟體層
  • 高速,非常規驅動的處理在基礎軟體層

AUTOSAR軟體平台如下圖所示

舉個例子,設計引擎控制模型的時候,不建立以中斷執行任務方式的模型,而是在應用軟體層計算所有氣缸共享的變數。例如,計算當前排放狀態或目標力矩。當不規則中斷從基礎軟體區發生,通過RTE傳遞到應用層時,計算結果能夠被調用,實際的驅動器也能夠被激活。AUTOSTAR的概念使得基礎軟體區的通用計算能夠儘可能簡單的放到應用層。

當Simulink模型全部構建好之後, 建議在中斷服務區添加盡量簡單的計算。中斷服務程序的簡單可以減少其所佔時間,這樣能保證系統調用任務時間間隔的準確性。如果可以,中斷中不要包含標準的PID計算,推薦放置僅執行設定動作的函數。當然,不能缺少必要的計算。舉個例子,對於錯誤診斷,即使是複雜計算,在該執行的時刻還是必須要診斷出結果的。

對於那些比中斷服務程序慢的部分,和接收指令要比執行速度快的部分,不應該給出直接執行的代碼,而是要讓目標值或階段值在下一個命令到來之前,通過線性插值的方法傳遞出去。

3.2 RCP 和 AUTOSAR 軟體平台

使用RCP等設備建模類似於AUTOSAR中軟體更新的概念。當然,生成的代碼不符合AUTOSAR規範。例如,RCP的I/O軟體允許供應商提供的S函數進行鏈接,並且允許用戶設置應用程序區域。應用程序中用戶自定義函數和S函數能夠在Simulink中直接連接,不需要考慮對RAM等因素的影響。

生成的C代碼在實時操作系統上運行,Simulink 里I/O相關會生成在不同的源代碼文件中,實時操作部分和作為中斷處理的部分會自然分離。用戶不必考慮那些平台;廠商創建的 I/O S-function會在需要的時候運行,並且對於 應用程序建模,不用考慮I/O處理的內容和時間。

具有這種軟體結構的真實的控制模型/軟體,會有更多的優勢。由於RCP能夠集中精力開發應用程序,而不必考慮軟體結構,他們會自然的選擇AUTOSAR 平台。換言之,如果你的產品不滿足AUTOSAR 標準,並且在RCP上使用AUTOSAR的概念進行開發,你必須自定義生成的代碼,並且從MBD開發成果的共享中分離出來。

4. 單任務和多任務

嵌入式軟體調度器設計中,有單任務和多任務的概念。

4.1 單任務

對於單任務,假定基礎周期為2ms,當2ms、8ms、10ms在系統中存在時,這些時間片都是基於2ms的計時器進行創建的。每2ms的執行順序為:8ms的任務下每4個2ms任務後執行一次,10ms就是每5個2ms。需要注意的是,要使用低頻率的任務片來處理複雜的運算,並且2ms、8ms、10ms都是由相同的2ms進行周期計算。因為所有的運算都要在2ms內完成,以便保證嵌入式軟體的實時性,在這種情況下8ms和10ms的任務被分割成了幾段,以保證所有2ms的計算量基本持平。在這種方法下,可以通過分區來減少每個周期的計算量,並且使得CPU負載平均分配。

基於如上原因,10ms的任務片被分成如下幾個部分。

|Fundamental frequency |Offset |

|---------------------- |-------|

|10ms |0ms |

|10ms |2ms |

|10ms |4ms |

|10ms |6ms |

|10ms |8ms |

同理可知,8ms的任務片被分割成了4部分。

當然,絕對的平均分配是不現實的,某些運算功能不能夠被分配到所有周期,但重要的是報保證CPU的平均一致的負載率

如何設置任務的運行頻率

設置Tasking mode for periodic sample times 為 Single Tasking

然後在子系統的「Sample Time」中輸入 「sampling period, offset」 的值。可以指定運行周期的子系統為 原子子系統。

4.2 多任務

多任務為使用實時操作系統的情況下,系統支持多任務周期設定。如之前介紹單任務中所述,在單任務系統中,平衡CPU負載率不是自動的,需要進行巧妙的設定。而在多任務系統中,CPU會根據當前狀態進行自動計算,並且不需要進行特殊的任務分配和設定。系統會從優先順序高的任務開始計算並給出結果,任務的優先順序由開發人員進行設定。大多數情況下,需要快速執行的任務被分配高的優先順序。

在周期內完成計算是十分重要的,包括慢任務,和當高優先順序任務執行計算且CPU 釋放時,執行下一個優先順序任務的計算。高優先順序任務會打斷低優先順序任務,並會先執行完高優先順序的計算。

4.3 不同運行周期的子系統連接後的影響

如果子系統B有20ms的運行周期,使用了10ms運行周期的子系統A的輸出,當B還在進行計算的時候A可能會有不同的輸出。如果在運算過程中發生了值得改變,子系統B可能會運算出一個錯誤的結果。舉個例子,在B中如果存在首次計算值與A的輸出比較的運算,且最終輸出依據比較的結果,此時有可能發生在B計算過程中A的值發生改變,導致最終輸出不正確的情況。為了避免此種情況發生,如果任務主體發生改變,從A得到的輸出值需要在被B使用之前進行固定。換言之,即便在B運算過程中A的輸出值發生改變,因為調用了不同的RAM區,最終的計算結果也不受影響。

當在Simulink中創建模型並且在Simulink中連接了具有不同運行周期的子系統時,Simulink會自動保留所需的RAM。

當然,如果不同運行周期的輸入值獲得是通過 手寫代碼集成的方式,則相應嵌入式軟體工程師需要進行相應RAM區保留的設置。在AUTOSAR中的RTW層,就是在接收和發送出口方面都定義了了不同的RAM。

單任務

2ms循環內信號值相同,但是需要注意不同的2ms運算值和上一個2ms的值可能不同。如果2-1 、 2-2 使用了F 1中的信號A,則 2-1 、 2-2 會使用不同2ms任務計算出的值,此處要進行影響識別。

多任務

對於多任務,不能夠指定使用計算結果的時間點。在多任務系統中,無論是否為不同運行周期,總是需要給信號變數和傳遞變數分配不同的RAM。

在執行任務的新計算之前,所有的值都會一次性複製一遍。


推薦閱讀:

有哪些對 MATLAB 的常見誤解?
用自定義快捷鍵增強 MATLAB 編輯器功能
Matlab如何對二維數據分類
Matlab小練習:按斜線方向依次賦值矩陣
Matlab如何從曲線圖中提取原始數據

TAG:建模 | simulink | MATLAB |