轉自:http://yleesun.blog.163.com/blog/static/2941340220094695359894/

組態軟體部分作為自動化網路平臺客戶端的實現部分,僅僅是其中的一小部分,即HMI介面部分,也只有這部分是基於Qt實現的,所以這個帖子主要介紹的就是這一部分,當然先就整體部分做個介紹

1本系統目的是建立一個通用SCADA系統平臺。
2
本系統(自動化網路平臺系統),主要由實時資料庫、引數資料庫、組態軟體等幾個部分。
a)   
面向服務設計,實時資料庫、引數資料庫等作為一個個服務存在於系統中,新增一個服務所需要作的僅僅是定義介面(類似於idl),實現你的介面即可。可以線上新增服務、線上刪除服務,不需要重啟整個系統。
b)   
單個服務支援主備冗餘,對於使用服務的程式來說則完全是透明的,其僅僅需要知道服務名(標識)即可,一個服務不可用時自動切換到另一個服務。
c)   
實時資料庫提供了python介面,支援python表示式,效率相當高。支援數十萬資料點,同時支援外掛,即當對於實時資料有不同的處理要求時,可以載入自己寫的外掛,比如處理最大最小值,越限告警等等,使用外掛而不是介面的原因當然是效率,因為在同一個程序,資料處理速度更快。
d)   
實現了一個系統級的引數資料庫,非常靈活。所有的資料型別都是可以配置的,更改一個表結構所需要做的僅僅是更改配置,而配置檔案本身就是作為引數的一部分。支援具有任何資料結構的引數表,你也可以把exe檔案儲存在引數資料庫,應用的時候再取出來,當然主備冗餘、資料同步是不可少的。
e)   
本系統的設計目的:實現一個自動化網路監控平臺,可以用於電力、鍋爐、自來水等等所有的自動監控系統。曾經接觸過一家國內非常有名的模擬系統平臺,本系統不做任何修改即可勝任,呵呵,並且配置非常方便,比較麻煩的則是很多模擬模組的具體實現,一個模擬模組其實就是對實時資料庫若干點的輸入、處理後若干點的輸出,其實現可以通過python表示式,也可以通過外掛實現。
f)   
最後如果您的企業在開發類似的東西,並且對這套系統感興趣,歡迎和我聯絡,當然如果您個人在做類似的工作,期望您的交流。

組態軟體本質上就是實現一個向量圖形編輯器,實現若干個基本圖元,例如矩形、圓、線、多邊形、點陣圖、連線線,然後基於這些基本圖元可以組合為任意的新的圖元,即組合圖元(group);組合圖元本身也是圖元,這正是經典的組合模式。每個圖元一般會關聯到實時資料庫中的一個點或者一個物件,然後定時或者其它方式重新整理這些值,根據這些值的不同圖元則顯示為不同的形狀或顏色或其它,此所謂的監視,而控制的實現一般為當點選某按鈕時向實時庫或者前置機發送一個命令。軟體一般分為兩個部分,即編輯器部分和執行態部分,編輯器支援基本的編輯功能,例如移動、選中、copy-cut-paste、成組、放大縮小、旋轉、等等,經編輯後,儲存為某種格式,而執行態元件多實現為dll,其載入編輯器生成的檔案,顯示執行,沒有編輯功能,當然也是不允許編輯的。一般組態軟體都包含一個腳本系統,以應對很多個性化的東西,有了腳本系統,組態軟體通常看起來都很強大,可以做一些簡單的遊戲,等等等等,實際上其實現往往並不複雜。選擇Qt做組態軟體的原因:
1
天然的跨平臺,目前很多監控軟體都要求運行於Unix系統,尤其是在電力行業。
2
   Qt提供的Graphics View模組好像為組態軟體的實現量身定做,呵呵,應用該模組,效率非常高,支援數十萬級別的item
3
   QSA指令碼,與Qt的天然整合,太完美了。
4
   Qt提供的undo模組,經典的命令模式的實現,用在組態軟體的undoredo不費吹灰之力。
5
這些還不夠嗎,以上任何一點都夠一個開發小組工作一段時間,更重要的是重複發明輪子的意義到底有多大?輪子也未必正常行駛,呵呵設計時幾個主要的環節:
1
組合模式,即若干圖元的組合還是一個圖元,這個有QGraphicsItemGroup這個類,基本上工作量小的多了
2
命令模式,即undo/redo的實現,當然有了QUndoStack這些類,就容易的多
3
圖元大小的改變,即可以由滑鼠的拖動改變一個圖元的大小,這個相對難一點,因為矩形、橢圓、線處理方式不一樣,要分開處理
4
   QGraphicsItem的擴充套件,由於所有的item都是基於這個類的,但是我們在實現的時候往往需要更多的虛擬函式,這個實現可以說是必須的,在實現的時候也想到的幾種方法,比如擴充套件某一個虛擬函式,比如多繼承,或者修改Qt這部分的原始碼,最後採用的是一種非繼承的組合方法即MyItem基類,包含一個QGraphicsItem *成員,這個是目前個人感覺最好的辦法。
5
模版實現,即若干圖元組合後的新圖元可以儲存到模版,用的時候拖放過來即可。
6
儲存格式,一般由二進位制、xml檔案,這兩種各有優缺點,我則直接儲存為qsa指令碼,load進來後頁面也建立了,兼兩種格式的優點。

呵呵,其實、引數庫、實時資料、包括各個服務等等都可以做成可組態的,系統可以面向服務,而針對於各個組成部分的實現可以基於元件,比如一個客戶端程式,選單、工具欄、各個widget都是可配置的,這對於一個可複用、通用程式來說是必要的。

.