李偉青 石 揚 葉匯鎵
(廣東電網(wǎng)有限責任公司梅州供電局 廣東 梅州 514021)
配網(wǎng)自動化設(shè)備點多面廣,告警信號量巨大[1],調(diào)度員漏監(jiān)視告警信號情況時有發(fā)生,導致供電所運維人員無法及時掌握設(shè)備異常情況,繼而耽誤搶修復電時間。因此,配電自動化主站系統(tǒng)的短信功能應(yīng)運而生。目前,電網(wǎng)企業(yè)使用的配網(wǎng)自動化系統(tǒng)基本帶有短信功能,但受系統(tǒng)底層架構(gòu)設(shè)計限制,僅支持固定數(shù)量的供電所,如配網(wǎng)自動化系統(tǒng)OPEN3200僅支持32個供電所,D5200僅支持64個供電所。對于配調(diào)集約化的地級市供電公司[2],管理的供電所數(shù)量往往會超過64個,此時,配網(wǎng)自動化系統(tǒng)自帶的短信功能就難以滿足實際需求。為解決上述問題,本文設(shè)計開發(fā)了一套獨立于主站系統(tǒng)、可支持任意供電所數(shù)量的跨平臺短信系統(tǒng)。
本系統(tǒng)主要包括數(shù)據(jù)庫服務(wù)器、Linux工作站和GMS短信模塊等三部分。數(shù)據(jù)庫服務(wù)器和Linux工作站是配網(wǎng)自動化主站系統(tǒng)發(fā)布區(qū)(安全III區(qū))設(shè)備,數(shù)據(jù)庫采用國產(chǎn)達夢數(shù)據(jù)庫(DM7),該數(shù)據(jù)庫以結(jié)構(gòu)化方式存儲了配電設(shè)備跳閘和異常告警信息。工作站安裝了達夢數(shù)據(jù)庫客戶端,借助配網(wǎng)自動化主站系統(tǒng)局域網(wǎng),即可遠程訪問數(shù)據(jù)庫服務(wù)器獲取告警信息。短信系統(tǒng)部署在Linux工作站上,定期讀取數(shù)據(jù)庫相關(guān)數(shù)據(jù)表中的告警記錄,將告警信息處理成短信內(nèi)容后以串口或USB接口輸出至GSM短信模塊,再通過運營商公網(wǎng)發(fā)送至目標接收人手機。系統(tǒng)硬件整體如圖1所示。
圖1 系統(tǒng)硬件連接圖
系統(tǒng)軟件設(shè)計采用“主程序+接口”架構(gòu),可實現(xiàn)主程序與接口之間有效解耦。將主要功能需求劃分為Web控制管理接口、告警信息采集接口、GSM短信模塊接口,主程序只需負責調(diào)用各功能接口,將各接口的數(shù)據(jù)流有序銜接處理,就可實現(xiàn)接口之間各司其職、運行高效、擴展靈活的目標。系統(tǒng)軟件架構(gòu)如圖2所示。
圖2 系統(tǒng)軟件架構(gòu)圖
考慮到數(shù)據(jù)庫類型和數(shù)據(jù)表結(jié)構(gòu)因不同應(yīng)用場景存在差異,將告警信息采集接口做成插件模式,采集信息的具體邏輯由通用的shell腳本實現(xiàn),主程序通過調(diào)用數(shù)據(jù)采集插件即可獲得指定時間段數(shù)據(jù)表中的所有告警信息。在獲取到告警信息后,主程序按照預定的規(guī)則進行匹配,保留真正需要發(fā)送短信的告警信息,從Web載入的excel表格信息找出告警信息接收人,并將告警內(nèi)容和接收人手機號碼存入緩存隊列。再通過調(diào)用GSM短信模塊不斷從緩存隊列中消費數(shù)據(jù),按特定協(xié)議封裝成GSM模塊識別的編碼信息發(fā)出。為提升短信的發(fā)送效率,將GSM模塊設(shè)計成短信發(fā)送集群管理模塊,每個模塊隨機從緩存隊列中取出告警內(nèi)容,自動實現(xiàn)短信發(fā)送負載均衡。人機交互方面,本系統(tǒng)將告警信息預定的匹配規(guī)則和告警短信接收人信息與短信平臺程序解耦,管理員可通過Web控制臺上傳json文件和excel文件,對短信平臺的數(shù)據(jù)采集及線路管理人員信息配置進行管理。此外,短信平臺對每個關(guān)鍵環(huán)節(jié)開啟了日志模式,詳細記錄了告警信息內(nèi)容、短信發(fā)送時間、接收人等信息,并可通過Web控制臺對上述流水日志進行查詢,便于功能調(diào)試和責任追溯。
傳統(tǒng)的基于C/C++為編程語言,使用面向?qū)ο蟮腝T類GUI系統(tǒng)為基礎(chǔ)研發(fā)的客戶端軟件系統(tǒng),在升級換代操作系統(tǒng)時,也面臨著重新適配開發(fā)的工作,軟件的使用和開發(fā)成本都比較高。如果將傳統(tǒng)的客戶端程序做成B/S(Brower/Server)架構(gòu),將軟件功能展示的邏輯交由操作系統(tǒng)發(fā)行版默認的瀏覽器來呈現(xiàn),核心的功能由服務(wù)端來提供,整個軟件系統(tǒng)的開發(fā)將不會局限于某個特定的GUI庫[3-4]。這種開放模式的優(yōu)點也是顯而易見的,一方面可充分利用Web豐富的生態(tài)環(huán)境實現(xiàn)前端展現(xiàn)功能,另一方面,可從QTC++的跨平臺GUI開發(fā)框架解放出來,選擇一個對開發(fā)和維護更加友好的后臺開發(fā)語言來實現(xiàn)核心功能。因此本文選擇了當前廣泛應(yīng)用后臺程序開發(fā)的Golang語言。Golang語言是Google站在C/C++歷史的經(jīng)驗基礎(chǔ)上發(fā)明的專供服務(wù)端開發(fā)的語言,相比于C++的復雜,Golang是大道至簡[5-6]。
為實現(xiàn)主程序與數(shù)據(jù)采集解耦,數(shù)據(jù)查詢的邏輯由shell腳本實現(xiàn),以文本流形式反饋給主程序。主程序中QueryForAlert()函數(shù)是查詢告警的總線程,可根據(jù)配置文件中查詢表信息,產(chǎn)生相應(yīng)線程queryOneTableGenAlert()進行單張表查詢操作,兩個函數(shù)是逐級細化解耦多表查詢操作過程。用戶可通過配置cft.json中的tables結(jié)構(gòu)體信息,實現(xiàn)查詢數(shù)據(jù)庫多張不同表的目的,具有非常靈活的擴展特性。tables配置信息中包括輪詢數(shù)據(jù)庫間隔時間、數(shù)據(jù)庫查詢腳本路徑、對告警內(nèi)容匹配的“白名單”關(guān)鍵字和過濾的“黑名單”關(guān)鍵字等。
shell腳本是實現(xiàn)數(shù)據(jù)庫告警記錄查詢的載體,其主要功能包括實現(xiàn)遠程登錄、查詢指定數(shù)據(jù)表告警信息兩方面。腳本設(shè)計上充分考慮了擴展性,將通用的登錄和文本處理封裝成“exec_query.sh”,而查詢具體數(shù)據(jù)表的操作封裝成一個模板,如查詢事故跳閘告警信息的模板accident.sql.template,再將這兩部分整合成一個具有表名特征的接口查詢腳本,如事故信息表查詢腳本query_accident.sh。
由于腳本查詢數(shù)據(jù)庫的速率比GSM發(fā)送短信的速率快幾個數(shù)量級,兩者之間須要引入一種“降速器”才能解決速率失配的問題——短信緩存隊列。查詢程序調(diào)用系統(tǒng)底層命令執(zhí)行函數(shù)exec.Command()運行shell腳本,將查詢結(jié)果以文本流形式管道標準輸出cmd.StdoutPipe(),并存入csv文件流讀(接收)對象csvreader中。程序逐行讀出csvreader內(nèi)容,按圖3所示流程進行處理,將告警查詢結(jié)果轉(zhuǎn)變成包含告警內(nèi)容主體、接收人號碼、線路名稱等信息的alert結(jié)構(gòu)體,并不斷存入緩存隊列,為下一步的短信封裝(熟數(shù)據(jù))與發(fā)送提供原材料。
考慮到Msg(告警內(nèi)容)和Receivers(接收人)之間存在一對多的映射關(guān)系,每條告警內(nèi)容需根據(jù)接收人數(shù)量生成的多條短信逐一發(fā)送m.SendSMS()。程序中以不帶break的for死循環(huán),不斷從ch隊列中讀取并封裝發(fā)送。
常見的GSM模塊僅支持發(fā)送中文短信字符數(shù)不超過70個[7-8],因此在發(fā)送前對短信內(nèi)容長度進行判斷,將超出70個字符的內(nèi)容分割成多條(SplitMsg),并在每條短信內(nèi)容前標記次序,以便接收人分辨子短信的先后順序(如分割成兩條短信時,標記為1/2、2/2)。SendSMS()循環(huán)調(diào)用sendOneSMS()發(fā)送一個小于70個字符的短信,循環(huán)次數(shù)即為長短信切割成小短信的數(shù)量。
短信系統(tǒng)硬件上采用串口通信,軟件上通過AT指令交互。為避免modem發(fā)送的中文內(nèi)容是亂碼,系統(tǒng)對短信內(nèi)容采用PDU協(xié)議的UCS2編碼。在短信發(fā)送過程中,向一個接收人發(fā)送一條不超過70字符短信封裝成發(fā)送短信的最小操作單元sendOneSMS(),其核心操作包括短信編碼封裝和編碼發(fā)送兩部分。具體發(fā)送流程如圖4所示。
圖4 短信發(fā)送過程流程
AT命令是用于控制TE(Terminal Equipment)和MT(Mobile Terminal)之間交互的協(xié)議,協(xié)議本身采用文本,每個命令均以AT打頭[9-10]。系統(tǒng)采用西門子TC35i系列芯片,涉及的AT指令主要包括以下五個:
AT+CSCA?
//查詢短信服務(wù)中心號碼
AT+CMGF=0
//設(shè)置短信格式為PDU模式
AT+CMGS=length
//發(fā)送短信文本長度
AT+IPR=115 200
//設(shè)置波特率為115 200
AT&W
//保存修改后的配置
為驗證設(shè)計開發(fā)軟件的有效性,將短信系統(tǒng)部署在工作站中,并加入Linux操作系統(tǒng)自啟動列表。短信系統(tǒng)啟動初始化成功后發(fā)送一條提示短信,第一次運行需在accident_last_time文件設(shè)置數(shù)據(jù)庫查詢起始時間,否則按默認時間2020-01-01 00:00:00。GSM模塊采用9針串口線接入工作站COM1,使用Linux系統(tǒng)命令dmesg| grep ttyS查看GSM模塊是否正確掛載在/dev/tt yS0文件中。在測試過程中,為了避免短信誤發(fā)至目標接收人,先對config.xls配置文件中的接收人手機號臨時修改成測試人員手機號。測試結(jié)果如下:圖5為短信系統(tǒng)Web控制管理界面,圖6為配網(wǎng)自動化主站告警信息,圖7為測試人員接收短信。
圖5 Web控制管理界面
圖6 配網(wǎng)自動化主站告警信息
圖7 測試人員接收短信
為提高短信發(fā)布功能的可靠性,短信系統(tǒng)設(shè)置了“看門狗”功能,每天下午5:10(可修改)定時向系統(tǒng)管理員發(fā)送一條“sms station is running”提示短信,以表示短信平臺運行正常;管理員如未收到短信,則說明短信系統(tǒng)自身故障,需現(xiàn)場檢查處理。
自主開發(fā)的短信系統(tǒng)成功部署應(yīng)用,使得配網(wǎng)自動化主站系統(tǒng)具備向任意個供電所按配電線路運維歸屬精準發(fā)送告警短信的能力。高效精確的短信服務(wù)解決了運維單位獲取設(shè)備異常信息手段不足的痛點,為運維單位快速隔離故障和恢復送電贏得寶貴時間,有助于提升公司供電可靠性水平。鑒于短信系統(tǒng)具有良好的擴展性,下一步將豐富短信功能,擴充數(shù)據(jù)查詢腳本對配網(wǎng)主站系統(tǒng)自身告警信息的采集,以提升主站系統(tǒng)安全運行水平。