吳夢龍,劉福泉,李宗昌(中國石油四川石化有限責任公司生產三部,四川 成都 611930)
隨著煉化生產技術不斷進步,生產過程自動化控制程度越來越高,生產過程數據報表多、數據量大的特點愈發凸顯,數據處理的難度不斷加大,傳統數據處理方法不但費時費力,而且無法滿足生產指導性數據的超高準確性要求。
Microsoft Excel是Microsoft為使用Windows和Apple Macintosh操作系統的電腦編寫的一款電子表格軟件。直觀的界面、出色的計算功能和圖表工具,使Excel成為最流行的個人計算機數據處理軟件[1]。利用其自帶的函數和透視表等數據處理功能,能滿足用戶對數據處理的基礎要求,但是處理效率不高。
VBA(visual basic for application)是編程語言VB的子集,“寄生于”已有的應用程序,例如:Excel、Powerpoint和Word等,其語法結構與VB非常相似,簡單易懂,且可以靈活調用Off ice自帶的函數功能,調試簡單,不存在兼容性問題。利用Excel VBA創建個性化的數據處理方案,簡單易行,快捷高效。
Python是一種跨平臺的計算機程序設計語言,簡單易學且功能強大,它擁有高效的高級數據結構,并且能夠用簡單而又高效的方式進行面向對象編程。Python的語法簡單,代碼可讀性高,容易入門門檻低,擁有眾多優秀的庫以及工具可直接調用,逐漸成為近年來數據分析領域入門級的首選編程語言[2]。
Excel函數與數據透視表在處理格式統一、規律性很強能直接套用自帶函數或利用透視表分類的數據時具有操作簡單、執行效率高的優勢,但是對于無明顯規律或格式不統一的數據處理明顯力不從心。VBA和Python同為編程語言,但是VBA源自VB與常用操作系統兼容性更好,執行效率更高,而且不需要單獨安裝IDE(集成開發環境),與Excel更是結合的天衣無縫,可以直接在Excel中編寫、調試代碼,可以做到所見及所得,每一步操作結果都能即時呈現出來。而Python則需要單獨安裝編譯環境,并且具備一定的編程調試基礎知識才能使用,且程序執行速度比VBA代碼慢,但是具有跨平臺適用的優勢,比較適合具有一定編程基礎的團隊使用。
綜合考慮,VBA編程更適合生產技術專業人員用來采集和處理生產運行數據。
隨著煉化行業技術不斷發展進步,自動化程度也越來越高,尤其是以DCS為代表的分散控制系統的成功應用,給生產控制系統帶來了質的飛躍。依托系統強大的數據存儲功能,為日常操作優化、性能監控評估、事故原因分析等提供了數據支撐,但是典型化工生產流程日報數據動輒涉及成千上萬個控制點,每個控制點每分鐘取一個數據,有些關鍵參數取數頻率甚至更高,對應產生的總數據量非常巨大,而數據則是按服務商預先設計的存儲方式儲存的,沒有明顯的規律。
日報數據是裝置重要運行參數記錄,是工藝管理不可或缺的基礎數據,也是月報分析的主要數據來源。技術人員通過月報表的數據分析可以直觀的了解裝置運行情況,同時為下一步調整操作提供參考依據,但需要從眾多日報數據中獲取對應的數據進行采集、處理、計算,數據處理量大、準確度要求高。每月DCS數據由數十個文件夾組成,每個文件夾包含若干各按天生成的Excel表,每個Excel表囊括100~300個參數小時數據、均值、最大值和最小值等數據,總數據量達數十萬個。傳統的數據區里方法是Excel的“數據引用”方法,需要打開每日Excel表格,取出數據“Average”行后面的平均值,然后逐一粘貼到月報對應位置,需要重復操作數千次,工作量巨大,且極易出錯。
月報分析的另一個重要數據來源是化驗分析數據。每個月的化驗分析數據至少有15 000行,每行有7個數據,數據總量超十萬個。傳統數據獲取方法是用“篩選”的方法,篩選出需要的數據,然后再“復制—粘貼”到月報對應位置,完成月報數據需要重復操作上千次。
想要從海量數據中獲取目標數據,首先要對月報數據結構有深入的了解,并熟練掌握其內在關聯方式;然后嘗試在原始數據中找到單個目標數據的位置,對于不同來源的數據需要分別進行處理;接下需要通過多次數據比對找到最佳的可編程數據獲取方法;最后利用VBA編寫、調試、修改代碼,實現一鍵自動取數功能(如圖1所示)。

圖1 一鍵自動取數功能流程
3.2.1 原始數據結構分析
我們通過查看數據文件可以分析得知日報數據是分裝置分單元存儲的、數據文件是以存儲日期命名,且不同文件夾內數據文件名稱基本一致、數據文件內各控制點參數數據的存儲相對位置是固定的;而化驗分析數據可以按取樣時間分為“08:30”“20:00”和其他三大類、相同采樣位號的分析項目是一致的、分析數據是按時間先后順序排序的。
3.2.2 構思數據獲取邏輯
月報中需要的是各控制點參數的日均值和關鍵采樣位號各分析指標數值,可以通過查找指定控制點位號或采樣位號來定位數值的大概位置,再通過數組相對引用將對應的數值獲取,最終賦值到月報的相應單元格,完成數值獲取。最后編寫代碼、調試、驗證結果。
3.2.3 編寫、調試、驗證VBA代碼
利用VBA與Excel的依托關系,參照報表本身制作程序版Excel報表,然后保存為“Excel啟用宏的工作簿(*.xlsm)”,將代碼寫入“工作簿-開發工具-VisualBasic-模塊”中,然后根據操作界面提示選擇源數據所在的文件夾,點擊“運行”,即可得到當月的報表數據和化驗分析數據。
(1)獲取原始數據路徑。由于月報各部分數據來自不同文件,且各月的數據存放位置也是不一樣的,因此我們需要先給程序指定日報數據存儲的地址。通過以下代碼即可實現。

(2)獲取對應日報數據。根據數據綜合分析結果,確定通過查找“儀表位號”來定位目標數據在日報表中的相對位置,然后利用相對引用賦值,獲取目標數據的地址,最后通過賦值函數將目標數據采集到月報表指定的單元格完成數據采集,通過變量循環實現對其他數據的采集匯總工作。
(3)獲取化驗分析數據。化驗分析數據獲取按照取樣時間特點劃分為“08:30”和“20:00”兩大類,首先用數組將所有符合采樣時間為“08:30”或“20:00”的化驗分析數據提取出來,然后采用與上面類似的思路和方法,通過查找采樣位號分析項目獲取目標數據的相對位置,再進行引用和賦值,實現一鍵批量獲取化驗分析數據功能。
通過開發運用VBA代碼,日報數據獲取時間由24 h左右減少至5 min;化驗分析數據獲取由6 h縮短至3 min,工作效率顯著提高,同時正確率達到100%,助力裝置及時、準確的獲取第一手生產數據。
鑒于VBA編程在月報數據處理中的應用效果,根據工作需要目前已完成《報警分級臺賬》《化驗分析臺賬》《異常報警臺賬》等報表的編程自動化取數工作,極大提高了工作效率。
文章介紹了VBA編程在化工生產報表中的應用,通過數據分析確定解決思路,巧妙利用簡短的代碼完成枯燥的重復工作,利用數據校驗功能實現獲取的數據100%正確。通過代碼模塊化編輯,方便初學者調用,使VBA編程更廣泛的應用到各類數據處理場景中,實現數據處理自動化,提高工作效率。