李偉青 石 揚 葉匯鎵
(廣東電網有限責任公司梅州供電局 廣東 梅州 514021)
配網自動化設備點多面廣,告警信號量巨大[1],調度員漏監視告警信號情況時有發生,導致供電所運維人員無法及時掌握設備異常情況,繼而耽誤搶修復電時間。因此,配電自動化主站系統的短信功能應運而生。目前,電網企業使用的配網自動化系統基本帶有短信功能,但受系統底層架構設計限制,僅支持固定數量的供電所,如配網自動化系統OPEN3200僅支持32個供電所,D5200僅支持64個供電所。對于配調集約化的地級市供電公司[2],管理的供電所數量往往會超過64個,此時,配網自動化系統自帶的短信功能就難以滿足實際需求。為解決上述問題,本文設計開發了一套獨立于主站系統、可支持任意供電所數量的跨平臺短信系統。
本系統主要包括數據庫服務器、Linux工作站和GMS短信模塊等三部分。數據庫服務器和Linux工作站是配網自動化主站系統發布區(安全III區)設備,數據庫采用國產達夢數據庫(DM7),該數據庫以結構化方式存儲了配電設備跳閘和異常告警信息。工作站安裝了達夢數據庫客戶端,借助配網自動化主站系統局域網,即可遠程訪問數據庫服務器獲取告警信息。短信系統部署在Linux工作站上,定期讀取數據庫相關數據表中的告警記錄,將告警信息處理成短信內容后以串口或USB接口輸出至GSM短信模塊,再通過運營商公網發送至目標接收人手機。系統硬件整體如圖1所示。

圖1 系統硬件連接圖
系統軟件設計采用“主程序+接口”架構,可實現主程序與接口之間有效解耦。將主要功能需求劃分為Web控制管理接口、告警信息采集接口、GSM短信模塊接口,主程序只需負責調用各功能接口,將各接口的數據流有序銜接處理,就可實現接口之間各司其職、運行高效、擴展靈活的目標。系統軟件架構如圖2所示。

圖2 系統軟件架構圖
考慮到數據庫類型和數據表結構因不同應用場景存在差異,將告警信息采集接口做成插件模式,采集信息的具體邏輯由通用的shell腳本實現,主程序通過調用數據采集插件即可獲得指定時間段數據表中的所有告警信息。在獲取到告警信息后,主程序按照預定的規則進行匹配,保留真正需要發送短信的告警信息,從Web載入的excel表格信息找出告警信息接收人,并將告警內容和接收人手機號碼存入緩存隊列。再通過調用GSM短信模塊不斷從緩存隊列中消費數據,按特定協議封裝成GSM模塊識別的編碼信息發出。為提升短信的發送效率,將GSM模塊設計成短信發送集群管理模塊,每個模塊隨機從緩存隊列中取出告警內容,自動實現短信發送負載均衡。人機交互方面,本系統將告警信息預定的匹配規則和告警短信接收人信息與短信平臺程序解耦,管理員可通過Web控制臺上傳json文件和excel文件,對短信平臺的數據采集及線路管理人員信息配置進行管理。此外,短信平臺對每個關鍵環節開啟了日志模式,詳細記錄了告警信息內容、短信發送時間、接收人等信息,并可通過Web控制臺對上述流水日志進行查詢,便于功能調試和責任追溯。
傳統的基于C/C++為編程語言,使用面向對象的QT類GUI系統為基礎研發的客戶端軟件系統,在升級換代操作系統時,也面臨著重新適配開發的工作,軟件的使用和開發成本都比較高。如果將傳統的客戶端程序做成B/S(Brower/Server)架構,將軟件功能展示的邏輯交由操作系統發行版默認的瀏覽器來呈現,核心的功能由服務端來提供,整個軟件系統的開發將不會局限于某個特定的GUI庫[3-4]。這種開放模式的優點也是顯而易見的,一方面可充分利用Web豐富的生態環境實現前端展現功能,另一方面,可從QTC++的跨平臺GUI開發框架解放出來,選擇一個對開發和維護更加友好的后臺開發語言來實現核心功能。因此本文選擇了當前廣泛應用后臺程序開發的Golang語言。Golang語言是Google站在C/C++歷史的經驗基礎上發明的專供服務端開發的語言,相比于C++的復雜,Golang是大道至簡[5-6]。
為實現主程序與數據采集解耦,數據查詢的邏輯由shell腳本實現,以文本流形式反饋給主程序。主程序中QueryForAlert()函數是查詢告警的總線程,可根據配置文件中查詢表信息,產生相應線程queryOneTableGenAlert()進行單張表查詢操作,兩個函數是逐級細化解耦多表查詢操作過程。用戶可通過配置cft.json中的tables結構體信息,實現查詢數據庫多張不同表的目的,具有非常靈活的擴展特性。tables配置信息中包括輪詢數據庫間隔時間、數據庫查詢腳本路徑、對告警內容匹配的“白名單”關鍵字和過濾的“黑名單”關鍵字等。
shell腳本是實現數據庫告警記錄查詢的載體,其主要功能包括實現遠程登錄、查詢指定數據表告警信息兩方面。腳本設計上充分考慮了擴展性,將通用的登錄和文本處理封裝成“exec_query.sh”,而查詢具體數據表的操作封裝成一個模板,如查詢事故跳閘告警信息的模板accident.sql.template,再將這兩部分整合成一個具有表名特征的接口查詢腳本,如事故信息表查詢腳本query_accident.sh。
由于腳本查詢數據庫的速率比GSM發送短信的速率快幾個數量級,兩者之間須要引入一種“降速器”才能解決速率失配的問題——短信緩存隊列。查詢程序調用系統底層命令執行函數exec.Command()運行shell腳本,將查詢結果以文本流形式管道標準輸出cmd.StdoutPipe(),并存入csv文件流讀(接收)對象csvreader中。程序逐行讀出csvreader內容,按圖3所示流程進行處理,將告警查詢結果轉變成包含告警內容主體、接收人號碼、線路名稱等信息的alert結構體,并不斷存入緩存隊列,為下一步的短信封裝(熟數據)與發送提供原材料。
考慮到Msg(告警內容)和Receivers(接收人)之間存在一對多的映射關系,每條告警內容需根據接收人數量生成的多條短信逐一發送m.SendSMS()。程序中以不帶break的for死循環,不斷從ch隊列中讀取并封裝發送。
常見的GSM模塊僅支持發送中文短信字符數不超過70個[7-8],因此在發送前對短信內容長度進行判斷,將超出70個字符的內容分割成多條(SplitMsg),并在每條短信內容前標記次序,以便接收人分辨子短信的先后順序(如分割成兩條短信時,標記為1/2、2/2)。SendSMS()循環調用sendOneSMS()發送一個小于70個字符的短信,循環次數即為長短信切割成小短信的數量。
短信系統硬件上采用串口通信,軟件上通過AT指令交互。為避免modem發送的中文內容是亂碼,系統對短信內容采用PDU協議的UCS2編碼。在短信發送過程中,向一個接收人發送一條不超過70字符短信封裝成發送短信的最小操作單元sendOneSMS(),其核心操作包括短信編碼封裝和編碼發送兩部分。具體發送流程如圖4所示。

圖4 短信發送過程流程
AT命令是用于控制TE(Terminal Equipment)和MT(Mobile Terminal)之間交互的協議,協議本身采用文本,每個命令均以AT打頭[9-10]。系統采用西門子TC35i系列芯片,涉及的AT指令主要包括以下五個:
AT+CSCA?
//查詢短信服務中心號碼
AT+CMGF=0
//設置短信格式為PDU模式
AT+CMGS=length
//發送短信文本長度
AT+IPR=115 200
//設置波特率為115 200
AT&W
//保存修改后的配置
為驗證設計開發軟件的有效性,將短信系統部署在工作站中,并加入Linux操作系統自啟動列表。短信系統啟動初始化成功后發送一條提示短信,第一次運行需在accident_last_time文件設置數據庫查詢起始時間,否則按默認時間2020-01-01 00:00:00。GSM模塊采用9針串口線接入工作站COM1,使用Linux系統命令dmesg| grep ttyS查看GSM模塊是否正確掛載在/dev/tt yS0文件中。在測試過程中,為了避免短信誤發至目標接收人,先對config.xls配置文件中的接收人手機號臨時修改成測試人員手機號。測試結果如下:圖5為短信系統Web控制管理界面,圖6為配網自動化主站告警信息,圖7為測試人員接收短信。

圖5 Web控制管理界面

圖6 配網自動化主站告警信息

圖7 測試人員接收短信
為提高短信發布功能的可靠性,短信系統設置了“看門狗”功能,每天下午5:10(可修改)定時向系統管理員發送一條“sms station is running”提示短信,以表示短信平臺運行正常;管理員如未收到短信,則說明短信系統自身故障,需現場檢查處理。
自主開發的短信系統成功部署應用,使得配網自動化主站系統具備向任意個供電所按配電線路運維歸屬精準發送告警短信的能力。高效精確的短信服務解決了運維單位獲取設備異常信息手段不足的痛點,為運維單位快速隔離故障和恢復送電贏得寶貴時間,有助于提升公司供電可靠性水平。鑒于短信系統具有良好的擴展性,下一步將豐富短信功能,擴充數據查詢腳本對配網主站系統自身告警信息的采集,以提升主站系統安全運行水平。