楊昌洪,楊勝忠,黃大衛
(貴州省黔東南苗族侗族自治州氣象局,貴州 凱里 556000)
近年來,貴州省野外無人值守的地面氣象觀測站(自動氣象站、土壤站、交通氣象站等)因供電系統故障造成的數據缺測占據了近一半的故障,土壤站更是達到了60%以上。目前貴州省自動站主要使用的是36AH的鉛酸蓄電池,該電池的使用壽命一般是5~6 a,但是在實際的使用過程中,蓄電池的使用壽命還是會以不正常的曲線下滑,虧電的現象時有發生。目前對于自動站的運行情況,維護人員只能通過報文是否缺測來判斷,對于故障原因,只能趕赴現場排查,尚未實現對臺站供電狀態的監控[1]。因此,開展自動站供電狀態系統的研究顯得尤為必要,在提高維護效率和加強監控力度上起著重要的意義。同時對供電系統的實時監控可以有效分析全省各個考核站點的供電情況和趨勢,了解太陽能板、蓄電池的充放電情況,實現對站點的供電狀況以及故障原因進行提前的研判。微信作為當下最常用的社交軟件,將承擔站點報警信息推送功能。通過研制自動站供電狀態實時監控系統,加入到現有觀測設備中,對區域自動站太陽能板、蓄電池、負載端電壓進行三路采集,并集成溫濕度傳感器監控機箱內部環境數據,利用后臺編程設定報警閾值,通過微信將站點運行狀態和故障信息通知相關保障人員。
本次設計的自動氣象站供電狀態監控系統主要由溫濕度傳感器、AD轉換系統、數據采集器、GPRS通信模塊以及微信報警系統組成 。在系統的設計上,主要分為3個階段來完成,分別是硬件模塊的設計與搭建、服務器物聯網運行環境的搭建以及微信客戶端報警信息推送功能的設計與實現,主要涉及到電子通信技術、計算機軟件相關技術[1]。在數據的采集和處理上采用型號為AT89C52的8位單片機,溫濕度的采集用的是型號為DHT11的數字溫濕度傳感器,是一款含有已校準數字信號輸出的溫濕度復合傳感器。三路電壓的采集上利用電阻分壓原理,通過PCF8591進行模擬量到數字量的轉換,數據傳輸通過GPRS無線傳輸方式[2],系統總體的結構如圖1所示。

圖1 系統構成圖Fig.1 system composition
系統采集的數據有機箱內部的溫濕度,蓄電池、太陽能板及負載輸出端的電壓。首先在溫濕度的采集上,選用了DHT11數字式溫濕度傳感器,工作電壓3.3~5V,濕度測量范圍20%~95%,溫度測量范圍0~50 ℃,該傳感器具有體積小、穩定性高、功耗低的特點。DHT11數字式溫濕度傳感器在與微控制器連接時只需要一個數據線就可以實現與單片機的通信,通過單總線協議完成,將傳感器輸出的數字信號直接送入I/O口;三路電壓的采集采用電阻分壓原理,匹配的是13 K和91 K的電阻進行分壓,電壓測量設計的范圍是0~40 V,需要將被測量電壓通過分壓原理轉換成0~5 V的模擬量,再通過PCF8591 AD 轉換模塊將0~5 V的電壓模擬量轉換成0~255的數字量,利用相應的公式計算出實際電壓,從而將電壓信號轉換成數字量[1]。
單片機采集到相應的數據后,通過串口通信送到GPRS通訊模塊。數據發送的方式采用的是字符形式發送。數據是以二進制的形式存儲,在用串口發送數據的時候首先將數據轉換為對應的ASCII碼,然后再將這些ASCII碼按照二進制的方式一位一位地發送出去,字符串的打包格式如下表1所示。

表1 數據打包格式Tab.1 data packaging format
如上表所示,溫度、濕度占2字節,三路電壓各4個字節,當GPRS模塊打包發送的數據與后臺幀頭接收設置幀頭相同時,將此幀數據接收并存入數據庫,并準備下一幀數據的接收。
Workerman是一款高性能的PHP socket服務器框架,Workerman基于PHP多進程以及libevent事件輪詢庫,PHP開發者只要實現一兩個接口,便可以開發出自己的網絡應用,實現采集端與服務器終端的數據傳輸。Workerman支持TCP和UDP兩種傳輸層協議,只需要更改配置的一個字段,便可以更換傳輸層協議。本次設計基于Workerman開發,搭建了終端設備到服務器端的數據傳輸平臺,從而實現了站點運行狀態數據的采集傳輸,運行示例如下:
use WorkermanWorker;
require_once __DIR__ . '/Autoloader.php';
require_once __DIR__ . '/vendor/autoload.php';
// 創建一個Worker監聽10006端口,使用tcpsocket協議通訊
$tcp_worker = new Worker('tcp://0.0.0.0:10006');
// 啟動4個進程對外提供服務
$tcp_worker->count = 4;
$tcp_worker->onWorkerStart = function($tcp_worker)
{
//將db實例存儲在全局變量中(也可以存儲在某類的靜態成員中)
global $db;
$db = new WorkermanMySQLConnection('127.0.0.1', '3306', 'root', 'Qwer123456', 'yang');//127.0.0.1'
};
// 當收到客戶端發來的數據后將數據插入到數據庫表中
$tcp_worker->onMessage = function($connection, $data)
{
global $db;
$chars = preg_split('/[T]/',"$data");
if($chars[0]=="000001") //判斷幀頭幀尾
{
$HH='Receiving:';
$insert_id = $db->query("INSERT INTO `yyy` ( `name`,`temp`,`humidity`,`Voltage1`,`Voltage2`,`Voltage3`)
VALUES ( '凱里',$chars[1],$chars[2],$chars[3]*0.1,$chars[4]*0.1,$chars[5]*0.1)");
}
elseif($chars[0]=="000002") //判斷幀頭幀尾
{
$HH='Receiving:';
$insert_id = $db->query("INSERT INTO `yyy` ( `name`,`temp`,`humidity`,`Voltage1`,`Voltage2`,`Voltage3`)
VALUES ( '西江',$chars[1],$chars[2],$chars[3]*0.1,$chars[4]*0.1,$chars[5]*0.1)");
$connection->send($str);// 向客戶端發送$HH $data// 這部分運行在子進程
}
elseif($chars[0]=="000003") //判斷幀頭幀尾
{
$HH='Receiving:';
$insert_id = $db->query("INSERT INTO `yyy` ( `name`,`temp`,`humidity`,`Voltage1`,`Voltage2`,`Voltage3`)
VALUES ( '三棵樹',$chars[1],$chars[2],$chars[3]*0.1,$chars[4]*0.1,$chars[5]*0.1)");
$connection->send($str);// 向客戶端發送$HH $data// 這部分運行在子進程
}
};
// 運行worker
Worker::runAll();
微信作為當下最常用也是普及度最高的社交軟件之一,憑借高到達、高接收率、高精準度的特點備受廣大用戶的青睞[10]。作為狀態信息發送的載體,可隨時隨地查詢站點運行作態,采用微信來進行監控也是本次設計的特點之一。微信端后臺對數據庫的管理和查詢通過Python編程實現,微信監控程序主要使用Python語言開發,通過Pymysql庫,訪問搭建在阿里云上的Mysql數據庫,將查詢到的監控數據進行文本格式化后通過itchat開源庫提供的微信消息接口將監控信息發送給指定的微信群或微信好友,具體實現數據查詢和發送的代碼如下:
conn11 = pymysql.connect(host='39.98.236.17',
user='root',
password='Qwer123456',
database='yang',
charset='utf8')
# 得到一個可以執行SQL語句的光標對象
cursor11 = conn11.cursor()
# 寫sql語句
sql = "select * from yyy where name =' "+stn +"' order by time desc ;"
# 執行sql語句
ret = cursor11.execute(sql)
s = str(cursor11.fetchone()[1]) + :"溫度" +
str(cursor11.fetchone()[2]) + "濕度" +
str(cursor11.fetchone()[3]) + "蓄電池電壓" +
str(cursor11.fetchone()[4]) + "太陽能電壓" +
str(cursor11.fetchone()[5]) + "負載端電壓" +
str(cursor11.fetchone()[6]) + "時間"
# 發送采集數據到微信
itchat.send(s, toUserName=msg['FromUserName'])

表2 數據的存儲入庫Tab.2 data storage
自動站供電狀態在線監測系統采用微信消息推送和查詢的方式,具體查詢方法為在微信端輸入站點名稱+狀態,就能實時獲取自動站的供電狀態。例如輸入凱里,狀態即能查詢到當前自動站機箱內的溫度、濕度、蓄電池、太陽能板以及負載端的電壓信息,如圖2所示。當自動站蓄電池、負載端電壓低于設定的閾值時,微信會推送報警信息,如圖3所示。該項設計主要解決了自動站運行過程中對三路電壓的監控,包括蓄電池、太陽能板的充放電情況以及負載輸出端的電壓。

圖2 自動站狀態信息查詢Fig.2 automatic station status information query

圖3 自動站狀態信息報警Fig.3 automatic station status information alarm
本次設計具有以下優勢:一是解決了目前區域自動站供電系統無法實時查詢的問題,出現故障后第一時間發現是否因為供電不足引起;二是該系統自帶故障報警、無信號自動復位重啟功能,具有功耗低,性能穩定價格便宜等優勢;三是利用微信客戶端作為狀態信息查詢和報警的媒介,具有使用方便快捷的特點。
本次設計完成了對區域常規自動氣象站供電狀態以及機箱內部溫濕度的實時監控,同時客戶端開通了微信實時查詢和報警提醒的功能,方便維護人員實時了解監控站點的供電狀態,還可通過對歷史數據的查詢,了解當地日照情況及蓄電池充放電情況。當蓄電池的輸出高于或低于所設定的閾值時,微信客戶端會第一時間發出報警信號,讓氣象服務人員及時了解設備供電狀態。該項功能的實現有助于維護人員實時掌握各個站點的供電狀態,同時能夠對氣象數據的有效性和準確性進行判斷,特別是當發生重大降水天氣過程時,能夠有效避免因站點數據無效影響氣象防災減災的決策研判。