劉 詩,李煥奇,李振新
(國網吉林供電公司,吉林 吉林 132011)
在地區電網調度的日常工作中,夜間需要收集地區內所轄發電廠和大用戶前一日相關調度數據,并經一系列計算后制作調度日報表進行上報和發布。這些調度數據既包括發電廠發電量、廠用電量、上網電量、負荷率、廠用率等,又包括大用戶用電量、自備電廠自發自用電量及水電廠的水文信息和地區間交換電量等信息。在傳統調度工作中,這些用于制作調度日報表的數據都是發電廠或大用戶監控值班人員通過電話報送給調度,調度員通過手工記錄、整理與計算形成報表[1]。
近年來,隨著調度自動化水平不斷提高,已有大部分數據已實現自動采集到調度端[2-4],但由于設備老舊、資金不足等原因,仍有部分數據目前沒有合理可行的方案來實現自動采集,只能通過調度電話等方式進行人工報送,并手動錄入,使調度日報表不能實現完全自動生成等流程。為打通電網調度日報表全自動化的最后環節,本文通過微信(或i國網)報送固定格式鍵值對的方式,利用文字識別和機器人流程自動化技術開發了自動接收與整合程序,來實現完整調度日報表自動生成的流程。
自動接收與整合程序利用按鍵精靈2014制作,程序在安裝微信(或i國網)PC版和WPS2019的Windows7或Windows10操作系統上調試。按鍵精靈是可以模擬鼠標和鍵盤動作的應用程序開發工具,通過編寫腳本,能讓開發的程序自動執行預定的動作完成功能,且能編譯生成脫離開發環境運行的可執行文件[5]。使用按鍵精靈調用大漠插件,可以實現圖片查找和文字識別;調用LazyOffice辦公插件,可以實現對WPS表格的各種自動操作。微信(或i國網)PC版用于接收各發電廠和大用戶發送來的信息。WPS表格用于存儲接收的數據和設置信息。
本系統正常運行時屏幕局部效果如圖1所示。左側為PC版微信,右側為自動接收與整合程序的運行界面。當微信中有新的信息時,在頭像右上角會顯示1個內含數字的紅色圓圈,程序按給定秒數循環自動查找圖片來發現這一信息,并通過OCR文字識別到該信息發送者,并遍歷設置表中的用戶數組逐一對比,判斷信息的發出者是否為本系統特定用戶。如果不是,便放過此信息;如果是,則通過一系列模擬鼠標鍵盤操作抓取這一信息,并將其按事先規定的字符分割后生成鍵值對。根據事先預定的一系列規則對信息格式及正確性進行邏輯驗證。如未通過驗證,則讓微信自動回復令其重報;如果通過驗證,則將該信息“值”進行編碼加密,利用LazyOffice辦公插件功能,將其存儲在“數據文件.xlsx”特定單元格中。當設置中的所有用戶當日全部發過信息并均正確接收后,程序自動將當日“數據文件.xlsx”轉換成“傳遞文件.dat”。最后將“傳遞文件.dat”拷貝到U盤。

圖1 系統運行情況
本系統在電腦硬盤中建有1個工作文件夾,文件夾名稱須與設置中“工作目錄”保持一致,文件夾中有3個文件,分別為設置文件.xlsx、數據文件.xlsx和傳遞文件.dat。設置文件中保存的是發電廠或大用戶群名、編號和運行狀態,其編號指定了所報數據在數據文件表中存放行的位置。數據文件用于存放各發電廠或大用戶每日所報數據編碼后的密文。傳遞文件是由完整的數據文件轉換而成的用于在內外網電腦間傳輸數據的純文本文件,是1個由二維數組轉換而來的密文Json字符串[6-7]。系統還設置1個用來保存程序中斷時各變量值的中斷數據保存文件,以使監控程序再次啟動時進程能夠順利接續。
本系統包含系統設置、自動監測與回復、啟動微信PC版、數據集中讀取、傳遞文件生成和傳遞文件拷入U盤等功能模塊。其中,設置模塊獨占選項卡的“設置”頁,其他5個功能模塊設計在選項卡的“應用”頁上,功能均可通過單選鈕和啟停按鈕啟動和停止,見圖1右側。自動監測與回復模塊是本系統最主要的功能模塊,用于實現電網調度數據隨報隨收和自動整合;啟動微信PC版模塊用于自動啟動Windows版微信;數據集中讀取模塊用于實現數據的一次性全部讀取,即當自動監測與回復模塊異常導致數據隨報隨收進程中斷或有遺漏時,可用其一次性將數據全部收集齊全;傳遞文件生成模塊用于將收集齊全的數據文件轉換成純文本的傳遞文件;傳遞文件拷入U盤模塊用于將傳遞文件自動拷貝到內網U盤中。
設置頁面提供1個修改設置內容的交互界面,不但能對工作目錄、日期變更點、監測頻度、定時啟動時間、U盤信息及用戶群的存放區域等進行方便設置,還能對微信應用的安裝路徑以及是明文或密文存儲與傳遞數據進行設置。設置內容保存在Config.W文件中,設置頁面及設置內容如圖2所示。

圖2 系統設置頁面及設置內容
按照設置文件中保存的發電廠或大用戶名稱,在微信應用里創建與之對應的微信群,并把調度報送數據的人全部設置為群員。原來每天報送習慣仍保留,但報送方式改為在微信群中發送信息。
發送信息的格式須分行排列,各行名稱與數值間用冒號分隔;首行為日期,日期為8位數字,作為信息的標識;其他各行為報送數據鍵值對。如測試用戶2022年8月18日電量為168 168 kWh,其在微信群中發送的信息應為
日期:20220818
電量:168168
又如測試電廠2022年9月28日發電:442 450 kWh;上網:338 976 kWh;最大:21 000 kW;最小:15 930 kW;負荷率:87.78%,其在微信群中發送的信息應為
日期:20220928
發電:442450
上網:338976
最大:21000
最小:15930
負荷率:87.78
在接收程序中,對日期標識進行多種容錯格式設置,當無法識別時,會自動向該群回復信息,令其重新報送。
程序開始后首先讀取中斷數據保存文件上次中斷時已報用戶名稱及中斷時刻,判斷當前距上次中斷時的時長,如果已超過8 h,則清空數據文件,按新的一天重新開始,否則接著上次斷點繼續運行。若按新的一天重新開始,則須用腳本先啟動微信(或i國網)應用使其正常運行,并調整運行窗口大小和位置,為信息的正常監測與接收做好準備,同時將隨報隨收程序運行窗口移動到屏幕右側。
如圖3所示,將新收信息群名識別、信息驗證和密文編碼與存儲3個子程序順序置于定時刷新的循環中,其刷新頻率可以設置,默認為20 s刷新一次,直至全部讀取完畢或人為終止才跳出循環。程序通過循環檢查聊天列表區域新出現的紅色圓圈圖片,得到微信新接收的信息,再用大漠OCR[8-9]識別群名序號,進而判斷出新收信息群名;若新收信息確為本系統用戶群所發,則對最新新收信息進行驗證,若通過格式和邏輯驗證,則進行信息分割與解讀,否則自動回復驗證失敗并令其重發。對新收信息進行加密后保存,再向“運行信息”窗口輸出顯示本次讀取成功的數據和已成功讀取的群名集合及尚未報送信息的群名集合。

圖3 信息監測與接收流程
本模塊的功能是在微信聊天列表區域發現新收信息,并識別發送該信息的群名編號,進而得知群名。具體實現方法是用循環等待圖片出現命令查找屏幕上聊天列表區域中的紅色圓圈圖片,找到后用大漠OCR命令識別該群名編號,進而得知該信息是否為本系統用戶所發。如果是本系統用戶所發,則用大漠OCR命令識別所發信息的日期與目標日期進行對比,判斷該信息是否為目標信息,如果對比成功,則將該信息用行分隔符進行分割后,再用鍵值對分隔符分割,得到該信息的全部有效鍵值對。
本模塊的功能是在微信窗口的搜索欄中搜索發電廠或大用戶群名,從而在對話窗口中得到該群的近期對話信息進行讀取。模塊先根據設置得到要讀取數據的目標日期,再用大漠OCR命令識別信息的日期進行對比。若對比失敗,程序會自動回復,使該群重新發送;如果信息日期與目標日期一致,程序則模擬鼠標雙擊對話窗口中最新的目標日期,全選到目標文本;然后模擬復制粘貼剪貼板內容,將目標文本賦值給1個變量,用行分隔符對其進行分割,再用鍵值對分隔符對分得的各行進行分割得到鍵值對,并將其“值”經編碼函數運算進行加密,再將其寫入由群編號確定行位置的數據文件中,并將該群名標記為數據已讀取。
電網企業的信息外網和信息內網間相互隔離,為保證數據安全且不帶病毒,本系統的數據傳遞采用KVM+企業內網U盤為載體,用純文本密文傳遞文件為媒介的策略。對存儲在信息外網電腦上的數據文件設置密碼進行保護,并采用加密存儲機制,且傳遞文件采用純文本文件格式。
從設置文件中讀取日期變更時間變量的值,并與當前日期運算生成編碼密鑰;用LazyOffice辦公插件命令讀取數據文件中傳遞數據區域并將其轉換成二維數組;用事先做好的編碼函數遍歷該二維數組,并將其數值部分逐一轉換為ASCII碼后再與密鑰運算生成新的編碼[10];將其改寫為Json字符串后寫入傳遞文件;經傳遞文件拷入U盤模塊自動將其拷貝到信息內網電腦。
在企業信息內網電腦上,首先從設置文件中讀取日期變更時間變量的值,并與當前日期運算生成解碼密鑰;其次將傳遞文件內容賦值給字符串后進行分割得到二維數組;然后遍歷該二維數組并將其數值部分與解碼密鑰逐一運算,將ASCII碼轉換回數字;最后用LazyOffice辦公插件命令將解密后的二維數組寫入數據文件數據表的數據區域完成解碼。
本系統將地區電網調度傳統方式改為用微信(或i國網)報送,并通過RPA程序自動隨時接收與整合的方式,實現調度零散數據隨報隨收的全自動化。地區電網調度員每個夜班減少接聽電話80多次,減少手工記錄數據260余條,既減少了基層員工的工作量,又提高了數據的準確性和調度日報的制作效率。