基於模型設計——電力電子的利器

本人是電力電子專業,跳到了汽車行業,做著電力電子在汽車行業應用的工作。之前只聽說汽車開發要求很高,標準很嚴,畢竟人命關天,進入行業後,才知道門道太多了,不過也算開了眼界,知道了一些能提高效率的開發方法,回過頭來才發現以前的自己好土鱉。今天分享一下感觸最深的控制軟體編程的問題。

控制軟體是電力電子的核心之一,所有的演算法邏輯都會通過控制軟體去實現,可以認為軟體是一個實現演算法的工具。對軟體的要求,就是能準確、高效的實現我們的想法就可以了。

軟體方面,我的成長過程分了五個階段。

第一個階段是隨心所欲。 當初還在高校實驗室的時候,為了做原型機,基本上就是找晶元的常式,在中斷裡面添代碼,能輸出PWM,能實現控制效果、示波器能捕捉想要的波形就達到目的了。太原始了……

第二階段是模塊化編程。

參加工作後,開始思考代碼的高聚合、低耦合、復用性。代碼開始做模塊化編程,比如把PI調節器進行封裝,設計模塊的輸入、輸出、參數和調用方式,對模塊進行測試和編寫設計文檔。

第三階段是系統編程。

這時候,開始思考嵌入式晶元的控制軟體應該怎麼規劃,怎麼設計硬體層、服務層、應用層,怎麼用操作系統,是否需要資料庫。因為不是搞嵌入式軟體出身,搞這個太痛苦。為此學習了好多高級C語言編程、操作系統等知識。

第四階段是基於模型設計。

基於模型設計的對立面,是基於軟體設計。我前面三個階段所做的,都是基於軟體設計,工作的核心內容,就是在設計軟體,重複做定義變數、定義函數等工作。我覺得效率很低,因為相當於我大部分時間在學習工具,核心的控制演算法反而沒有太多精力和時間去提升。

目前比較土鱉的程序設計思路是這樣的:先在simulink中搭建模擬模型,用模型去實現演算法;模擬沒問題後,開始將模型人工翻譯成C語言;燒寫到晶元中,進行調試。當然,稍微好一點的會做Sfunction的模擬。

基於模型設計,是在simulink中搭建模擬模型,直接進行測試,如果滿足要求後,用工具直接生產C代碼,然後在晶元中直接使用。當然,如果是汽車行業,不能這麼簡單粗暴,還有各種測試和驗證,不過在大部分電力電子行業,代碼基本是可以直接用的,和模擬結果基本一致。(本著嚴謹的態度,用了「基本」二字,但我還沒發現不一致的)。

這簡直是電力電子工程師的福音,只用關心控制演算法,由於編程而引起的各種bug減小到了最低。我知道,你肯定會懷疑生產代碼的效率。請放心,代碼的水平會略高於一個中級水平的C程序員,我見過好多公司的演算法開發人員,C代碼水平還停留在初級階段。而且即使你是一個高級水平的C程序員,看不起自動代碼的水平,但代碼自動生成在幾秒內完成的工作,你可能好幾天還干不完,把多餘的時間拿來陪陪女朋友、老婆和孩子、看看書多好。我知道,你肯定會問,自動生成的代碼能看懂嗎?我想說,確實很難看懂,大部分我只能看明白這一塊代碼大概是幹嘛的,具體每一行代碼或者某個變數的作用,基本看不懂。可是我為什麼要看懂代碼呢?我只要能看懂模型就可以了,C代碼只是模型翻譯成的一種中間語言而已,我不用看懂。編譯器還會把C代碼翻譯成彙編,現在還有誰會去一行一行的看彙編代碼呢。那看不懂代碼會影響調試嗎?不影響。功能性bug會在模型階段都解決了,如真有問題,輸出看兩個變數就能進行問題定位。

基於模型設計真這麼好,是不是不用在費心搞C語言這些了?恰恰相反,我認為對C代碼越熟悉,越能利用工具生成更高效的C代碼。有些代碼生成選項,是建立在對C代碼深刻認識上的。畢竟吃飽肚子的,不是最後一塊餅。

基於模型設計難學嗎?我覺得入門還算難,特別是如果你對simulink的各種參數定義不是很了解、C語言水平不是很高。不過好在現在互聯網時代,網上各種資源很多。建議多去看看matlab的官網,上面有視頻做一些基礎的入門講解。

第五階段是規範建模。

不再手敲代碼後,每天都跟建模打交道,期間總覺得自己的模型看著彆扭,每天都想重構。後來接觸了MAAB(Mathwork Automotive Advisory Board),一個matlab寫的一個關於汽車行業建模規範,包括simulink和stateflow的建模規範,裡面內容很多,跟MISRA差不多,就是一些怎麼命名、連線、布局的規範。這兒貼一個裡面關於建模層次結構的規範。

模型應分為四層,包括頂層、觸發層、結構層和數據流層。頂層應該是說明模型的輸入、輸出介面,和模型功能的描述。觸發層是各功能塊的觸發條件、執行時間周期等。結構層就是各個功能塊了,各功能塊應該是原子系統。數據流層就是最底層,描述了數據如何計算處理。有興趣的去網上看看這個文檔吧,百度文庫有,matlab網站上也有。

---------------------------------------------------------------------------------------------------------------------

後續:

1、MBD(Model based design)主要用來生成演算法、邏輯相關的代碼,這也是控制軟體最想要做的事情,這部分和晶元關係不大。唯一的關係在於,需要設定晶元的數據類型定義,就是C語言中int數據類型,在特定的晶元中是8位的還是16位的。MBD 不擅長做和晶元底層、外設相關的設計,這部分最好是手工編寫平台性代碼,或者用晶元廠家提供的底層代碼。MBD開發人員需要設計好介面函數即可。

2、有人問MAAB在哪兒下載?我想問這個問題的人,是習慣了互聯網嗟來之食。具有獨立思考和創新的第一步,就是要學會用搜索引擎。

3、我的文章第一次得到了這麼多人的關注,還被收錄了,很開心。其實我所寫的,對於做汽車軟體的人來說都是理當如此的,只是我想這個好東西應該被更多做電力電子的人知道,我也相信遲早會在行業裡面推廣起來的。題外話:話說matlab的這個工具,由於利益關係,mathwork公司在汽車行業裡面大範圍推廣、開論壇講座,卻很少把它推廣到電力電子領域,這是因為咱們電力電子行業要求不高,各公司沒有購買matlab服務的需求。

歡迎關注公眾號:電力電子雜談


推薦閱讀:

矢量控制(Siemens)VS 直接轉矩控制(ABB)
學習PLC應該樹立的幾個正確觀念
什麼叫做負阻特性?
學習PLC,不光要意會,更要在實踐中神會!

TAG:电力电子技术 | 建模 | 电气工程 |