1. 程式人生 > >基於Qt的組態監控軟體實現以及分析(轉)

基於Qt的組態監控軟體實現以及分析(轉)

轉自: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都是可配置的,這對於一個可複用、通用程式來說是必要的。

相關推薦

基於Qt監控軟體實現以及分析

轉自:http://yleesun.blog.163.com/blog/static/2941340220094695359894/ 組態軟體部分作為自動化網路平臺客戶端的實現部分,僅僅是其中的一小部分,即HMI介面部分,也只有這部分是基於Qt實現的,所以這個帖子主要介紹的

基於Qt的OpenGL可編程管線學習3- 使用Instanced方式繪制

qt opengl shader instanced 繪制多個重復的模型時,使用Instanced方式繪制可以大大加快顯然速度。繪制效果如下圖所示:1、Vertex Shader中定義如下:attribute vec3 pos; attribute vec2 coord; attribute

基於Qt的OpenGL可編程管線學習9- X射線

qt opengl shader x射線 X射線也就是輪廓線,效果如下圖所示原理:物體表面的法線與人眼睛縮成的角度為90度時,剛好能看到物體的輪廓Fragment shader代碼如下:uniform sampler2D U_MainTexture; varying vec2 M_coord

基於Qt的OpenGL可編程管線學習5- FBO的使用

qt opengl shader fbo FBO: Frame Buffer Object,默認繪制在1號FBO中,自定義的FBO是可以做讀寫操作的。繪制到自定義的FBO,然後顯示出來,如下圖所示:Qt中有關於FBO的類,QOpenGLFrameBufferObjectFBO的創建m_Fram

基於Qt的OpenGL可編程管線學習10- 膨脹與腐蝕

qt opengl shader 腐蝕 膨脹 膨脹:取一個像素周圍的點,取最亮的點為當前的點顏色,為膨脹效果腐蝕:取一個像素周圍的點,取最暗的點為當前的點顏色,為腐蝕效果膨脹Fragment Shadervarying vec2 M_coord; varying vec3 M_normal

基於Qt的OpenGL可編程管線學習4- 使用Subroutine繪制不同光照的模型

qt opengl shader subroutine 使用Subroutine在shader中封裝不同的函數,在CPU端選擇調用那個函數效果如下圖所示左側:環境光中間:環境光 + 漫反射右側:環境光 + 漫反射 + 高光1、Subroutine 在shader中的內容subroutine v

基於Visual C++之Windows核心程式設計程式碼分析1實現裝置管理器列舉裝置

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux中dpkg工具update-alternatives實現符號連結軟體版本的切換

一、功能作用 update-alternatives是dpkg的實用工具,用來維護系統命令的符號連結,以決定系統預設使用什麼命令。 在Debian系統中,我們可能會同時安裝有很多功能類似的程式和可選配置,如Web瀏覽器程式(firefox,konqueror)、視窗管理器(wmaker、metacity)

Qt多國語言的實現與切換國際化

1、建立語言檔案   開啟.pro檔案,加入以下: TRANSLATIONS+=cn.ts   工具->外部->Qt語言家->更新翻譯,將生成翻譯檔案cn.ts 2、編輯翻譯檔案   啟動Linguist(Qt語言家),開啟cn.ts,然後進行

頁面重繪和回流以及優化

圖片大小 處理流 create 意圖 borde 基本上 nal arch 似的 源文章地址:http://www.css88.com/archives/4996 在討論頁面重繪、回流之前。需要對頁面的呈現流程有些了解,頁面是怎麽把html結合css等顯示到瀏覽器上的,下面

Elasticsearch+logstash+kibana實現日誌分析實驗

elasticsearch logstash kibana Elasticsearch+logstash+kibana實現日誌分析(實驗)一、前言 Elastic Stack(舊稱ELK Stack),是一種能夠從任意數據源抽取數據,並實時對數據進行搜索、分析和可視化展現的數據分析框架。(h

用Java實現AES加密

密鑰 工具 mex 嚴格 keys 生產 ner for 創建 一)什麽是AES? 高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),是一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。 那麽為什麽

Nginx 和 IIS 實現動靜分離

host rar web應用 localhost nginx服務器 .net 復雜 jpeg post 轉載地址:https://www.cnblogs.com/paul8339/p/5825201.html 動靜分離,說白了,就是將網站靜態資源(HTML,JavaScr

java中使用相對路徑讀取文件的寫法總結 ,以及getResourceAsStream()

protected 9.png pre ring details 使用 ide 技術分享 相對 https://blog.csdn.net/my__sun_/article/details/74450241 讀取文件的寫法,相對路徑 在當前的目錄結構中讀取test.txt的

基於FormsAuthentication的用戶、角色身份認證

就會 攻擊 context public contex onf decrypt 數據 分用 一般情況下,在我們做訪問權限管理的時候,會把用戶的正確登錄後的基本信息保存在Session中,以後用戶每次請求頁面或接口數據的時候,拿到 Session中存儲的用戶基本信息,查看

Ubuntu下實現軟路由

firewall 為我 control ble iptable display audio 並且 target 參考:http://www.openwrt.pro/post-292.html 個人看法: 1、實現路由在Linux下必須要用到iptables進行轉發,這才

基於Websocket+SpringMVC4推送部標Jt808終端報警

握手 就會 adding 交換 連接 top 只需要 cell 2.4 原文地址:http://www.jt808.com/?p=1263 在開發部標監控平臺的時候,我們要及時的將部標終端報警推送到web界面上,以彈窗的形式提供給用戶顯示,要將報警顯示在界面上,部標808協

C++函式引數傳遞的3種方式以及優缺點

寫函式時遇到給予函式的引數變數無法被修改的問題,轉自:https://blog.csdn.net/zhaoxun91/article/details/75417492 1 函式引數傳遞的3種方式比較 1.1 按值傳遞 #include <iostream> using names

Guava TreeMultiSet實現原理分析2

5 count,size AvlNode為資料統計提供了多個便利引數,不需要遍歷所有的子節點就可以獲得相關的個數資訊。 AvlNode的統計屬性: elemCount:統計key相同的元素個數。 distinctElements:統計子樹中所有節點的個數,即ke

SQL實現 模糊查詢

在進行資料庫查詢時,有完整查詢和模糊查詢之分。 一般模糊查詢語句如下: SELECT 欄位 FROM 表 WHERE 某欄位 Like 條件 其中關於條件,SQL提供了四種匹配模式: 1,% :表示任意0個或多個字元。可匹配任意型別和長度的字元,有些情況下若是中文