功能塊
功能塊(function block)是IEC61499 標準中最重要的概念之一。不過功能塊的概念並不是該標準所特有的。在符合IEC61131-3 標準的PLC 中就定義了功能塊編程。功能塊圖(FBD) 本質上是一種圖形化程序設計方法。在NI 的Labview,IBM 的NodeRED,MIT 的Scratch 中都採用了類似功能塊網絡的編程方式。功能塊是一段標準的軟件,它們的引線是輸入數據或者輸出數據。網絡圖的連線表示了個功能塊之間數據引用的方式。它們之間的區別是功能塊網絡的執行方式。大致分爲兩種:
1 時間觸發方式。
週期性地從上之下,從左到右地順序執行功能塊。後面的功能塊會直接應用前面功能塊產生的輸出數據,如果網絡圖中有反饋或者循環,那麼後面功能塊反饋到前面功能輸入端的數據將在下一個週期被應用。IEC61131 的PLC功能塊就是採用的時間觸發方式。
2 數據流執行方式
所謂數據流程序設計是指功能塊的所有數據到達時,功能塊將會被執行。具體實現時,功能塊要記錄所有引腳的更新狀態。當一個功能塊的所有數據更新時執行該功能塊內部的算法並且更新輸出數據。執行程序要不斷地掃描所有功能塊的輸入數據狀態,直到網絡中沒有輸入端都發生改變的功能塊。也就是說,沒有可以進一步執行的功能塊,網絡中輸入輸出數據處於暫時“穩定”的狀態。直到外部有新的數據輸入(比如有按鍵輸入,網絡接口收到新的數據),將打破暫時的穩定。開始計算相關的功能塊。達到新的穩定狀態。這是我們曾經設計的一種數據流計算模型的方法。
不過,實際應用中,情況要複雜的多,有的功能塊只要一個輸入數據發生變化,就需要執行相應的算法。雖然我們在設計功能塊和執行循環時可以處理這樣的功能塊。但是用戶使用這樣的功能塊時,容易產生歧義而混淆。存在不確定性。特別是涉及到分佈式系統中的網絡傳輸時,情況變得更加複雜
3 具有事件輸入輸出的功能塊
這是IEC61499 功能塊採取的方式。該標準在功能塊中增加了事件輸入輸出端。事件用來確定功能塊的狀態變化,只要當輸入事件到達時,纔會改變功能塊的狀態,確定如何執行內部的算法。事件能夠更明確地描述功能塊之間數據和內部算法執行的同步關係。打個比喻,事件就好比數字電路中的時鐘信號。集成電路依據時鐘輸入來同步數據和內部算法。所有的集成電路通過時鐘電路實現同步。事實上,在具體實踐中,事件是一個0~n 變化的整型數。一個數字對應一個“脈衝“。事件功能塊網絡比普通數據流網絡更加明確和容易理解。
IEC61499 功能塊模型
該標準的核心是功能塊(function block)模型。它構成了完整的IEC61499 架構。功能塊可以描述成爲“軟件的功能模塊“。它具有自己的數據結構,並且由一個或者多個算法來處理它們。功能塊類型(function block type)提供了數據結構和算法的形式化描述。功能塊可以有多個實例(instance)。從形式上看,功能塊和C++中的對象非常類似。在工業實踐中,也經常使用功能塊的概念,例如在許多PLC 和工業控制器中就有PID 功能塊。許多廠商提供一個PID 功能塊定義。程序員可以在控制算法中使用多個PID的實例,比如稱爲“Loop1”和“Loop2”,它們相互之間是獨立的。每個PID 實例都有它們自己的參數和內部狀態變量。也共享相同的更新算法。
功能塊又和麪向對象程序設計中的類(class)和對象(object)十分相似。功能塊類型就是一個類。它包含了輸入輸出參數,內部的函數相當於功能塊的內部算法,功能塊的實例就是對象。
對於硬件工程師而言,功能塊比作集成電路,對軟件工程師而言,功能塊比做類和對象。這樣是否要好理解一點。
功能塊的一般特性
IEC61499 定義了若干形式的功能塊。,我們會來詳細地瞭解它們。IEC61499 功能塊的主要特徵總結如下:
- 每個功能塊有一個類型名稱和一個實例名稱。它們在功能塊圖形化描述時,會顯示出來。
- 每一個功能塊都能有事件輸入。它們能夠接收其它功能塊通過事件連接傳遞的事件。
- 每個功能塊都能有事件輸出。它們向其它功能塊傳遞事件。
- 每個功能塊會有數據輸入,傳遞給它其它功能塊內部產生的數據。
- 每個功能塊會有數據輸出,將該功能塊內部產生的數據傳遞該其它功能塊。
- 事件可以使用”WITH“修飾詞與數據關聯。在圖形表示中,將事件和相關聯的數據連接線交叉點畫一個小方塊。對於輸入和輸出的含義如下:
-當一個事件發生時,它關聯的數據更新。其它輸入變量保持它們的值(也就是說,沒有變化)
-當輸出事件觸發時,關聯數據輸出有效,而其它數據沒有發生變化。
-
IEC61131-3的數據類型用作變量的數據類型(見附錄A 可用數據類型)
-
功能塊封裝功能,它們具有內部變量。功能的形式和類型由功能塊類型決定。
-
IEC61499不允許由全局變量
從上面的描述我們可用看出,IEC61499 功能塊的所有操作都是通過事件來同步的。在事件到來之前,相關連的數據已經出現在它們的輸入端。功能塊的內部程序分成兩個部分,一個是執行控制程序段,它根據輸入事件來決定算法的執行,另一部分是算法。算法中會使用到輸入數據,並且會產生輸出數據 。當內部算法執行完成之後,執行控制程序段將更加內部的狀態圖確定輸出事件。
功能塊的行爲和集成電路非常相似,比如一個D觸發器,數據首先呈現在D 輸入端,然後產生時鐘的上升沿將數據置入觸發器,Q 端輸出 D 觸發器新的狀態值。時鐘的上升沿就類似功能塊的事件輸入。數據輸入是於時鐘關聯的。對比集成電路的時鐘電路有助於我們理解IEC61499 功能塊的操作方式。
功能塊的執行模型
如下圖所示,基本功能塊的算法是由功能塊對象中的執行控制程序段響應輸入事件時調用的。一旦算法執行完成,執行控制程序在事件輸出端產生事件。
t1-相應的輸入數據變量值可用
t2-在事件輸入端發生事件
t3-執行控制功能,通知資源調度功能調度一個算法執行。
t4-算法執行開始。
t5 –算法輸出值。
t6 資源調度功能通知算法執行結束。
t7-調度功能調用執行控制功能。
t8-執行控制功能在事件輸出端輸出事件。
一些時間關係
初始化時間 Tsetup=t2-t1
啓動時間 Tstart=t4-t2
算法時間Talg=t6-t4
完成時間 Tfinish=t8-t6
功能塊類型
IEC61499 標準中,定義了三種功能塊:
基本功能塊類型(Basic function block)
複合功能塊類型(Composite function block)
服務接口功能塊類型(Service interface function block types)
功能塊庫
任何一個基於圖形的程序設計方式,能夠在實際應用中使用的一個關鍵因素是它是否具有足夠的功能塊庫,滿足設計各種應用程序的需要。IEC61499 標準文檔中只是在附錄A 中描述了一小部分的事件功能塊。而像eclipse 4DIAC 這樣的開發項目也只是提供了少量的功能塊庫,它們包括:
4diac IDE 中提供了下列功能塊庫
- 轉換(convert)
- 設備(device)
- 事件events
- IEC61131-3
- 輸入輸出io
- 數學運算(math)
- 網絡net
- 重配置(reconfiguration)
- 資源(resource)
- 實時事件rtevents
- 分段Segments
- 輔助(utils)
許多的目錄下的功能塊數量也很少。依靠這些功能庫,編寫不出實際的應用程序。要使得IEC61499 標準付諸實際應用,需要開發更多的功能塊庫,這些功能塊庫分成兩類:
通用的功能塊庫
開發自動控制應用中常用的功能塊庫。這方面可以參考NI 的labVIEW ,它是爲軟件儀器開發的系統,針對各種儀表測量應用,NI 提供大量的功能對象,在LabVIEW 中稱爲功能調色板(functions palette)。小到加減法,大到數字信號處理對象。通過長期的積累,LabVIEW 的對象庫非常豐富,使用這些對象節點,能夠編寫出各種測量方面應用程序。
通用地,IEC61499 標準要面向實際的應用,也必須開發豐富的功能塊圖,個人覺得,至少需要增加如下的庫
1 通用的數字邏輯庫
-AND,OR,INV ,XOR 等基本的邏輯運算
-譯碼器
-解碼器
-各種計數器
-移位寄存器
-數值比較器
可以參照某些74系列集成電路來實現
2 常用的數學運算庫
-三角函數 SIN,COS,..
3 基本的控制算法
-PID 算法
4 數字信號處理庫。
-常用的數字濾波算法
-FFT 變換
5 基本的執行部件控制庫
-步進電機控制
-直流電機控制
-伺服電機驅動
-硬件接口驅動(GPIO,ADC 採樣)
6 與上位機網絡通信的庫
-數據庫讀寫庫
-UI 功能塊庫
-MQTT 協議庫
我個人的看法,IEC61499 功能塊庫,不適合像LabVIEW 分的那麼細,甚至還支持循環,IF-THEN-ELSE 結構化控制功能塊。因爲那麼做的話,功能塊網絡變成了以圖形化編程爲目標了。這樣會導致功能塊網絡過於複雜,而且運行效率不高。IEC61499 功能塊應該提供完整單一的功能。而不提供程序設計的基本語句控制元素(比如IF-THEN-ELSE,SWITCH)。基本的語句在功能塊內部使用動態語句實現,例如java 或者Lua 語言實現。
面向應用的功能塊庫
開發通用功能塊庫是非常困難的,畢竟工業控制應用五花八門,種類繁多。即使你準備了足夠的通用功能塊庫,到編寫程序時還會發現少了那麼幾個。針對具體的行業應用開發功能塊庫是一個好主意。例如:
建築自動化功能塊庫
智能電網功能塊庫
分佈式數字控制
建立功能塊類型
從上面的描述我們可見,開發功能塊庫是IEC61499 標準走向實用的關鍵。各種IEC61499 開發環境都支持功能塊庫的開發。在算法部分可以使用java,lua 這樣的解釋性語言,也可以使用C,C++,Structure Text 這樣的編譯型語言在4DIAC的IDE 中稱爲建立功能塊類型。可以使用C++,ST和Lua 語言開發功能塊類型
動態功能塊類型
。當使用編譯型語言時,建立的功能塊類型最終要export 出來,和運行時一起編譯。這對於應用程序工程師來講,是比較麻煩的過程。在4DIAC 中具有一種稱爲“動態類型裝入”的特性,使用這種方式,新的功能塊不需要編譯就可以直接部署和測試。可以下載lua 代碼到運行時Forte 中,而Forte 內部含有一個Lua 解釋器解釋Lua 代碼。
小結
功能塊是工業控制應用中常用的一種基於圖形的編程方法,和其它項目中的功能塊不同,IEC61499 功能塊之間的執行控制是通過事件和內部的事件狀態圖同步實現的,它更加地明確。
IEC61499 標準和開發工具提供的功能庫是不夠的,無法滿足實際應用的需要,必須開發豐富的功能庫,面向特定的應用領域開發功能塊庫是一個行之有效的方法。
使用C 和ST 語言編寫的功能塊庫需要和運行時一起重新編譯,而4DIAC 同樣提供了“動態功能塊裝入”的性能,用戶可以使用Lua 語言編寫動態功能塊類型的算法,無需編譯直接下載到Forte 運行。在Forte內部保留了一個LuaJIT 即時解釋器。