楊昌洪,楊勝忠,黃大衛(wèi)
(貴州省黔東南苗族侗族自治州氣象局,貴州 凱里 556000)
近年來,貴州省野外無人值守的地面氣象觀測(cè)站(自動(dòng)氣象站、土壤站、交通氣象站等)因供電系統(tǒng)故障造成的數(shù)據(jù)缺測(cè)占據(jù)了近一半的故障,土壤站更是達(dá)到了60%以上。目前貴州省自動(dòng)站主要使用的是36AH的鉛酸蓄電池,該電池的使用壽命一般是5~6 a,但是在實(shí)際的使用過程中,蓄電池的使用壽命還是會(huì)以不正常的曲線下滑,虧電的現(xiàn)象時(shí)有發(fā)生。目前對(duì)于自動(dòng)站的運(yùn)行情況,維護(hù)人員只能通過報(bào)文是否缺測(cè)來判斷,對(duì)于故障原因,只能趕赴現(xiàn)場(chǎng)排查,尚未實(shí)現(xiàn)對(duì)臺(tái)站供電狀態(tài)的監(jiān)控[1]。因此,開展自動(dòng)站供電狀態(tài)系統(tǒng)的研究顯得尤為必要,在提高維護(hù)效率和加強(qiáng)監(jiān)控力度上起著重要的意義。同時(shí)對(duì)供電系統(tǒng)的實(shí)時(shí)監(jiān)控可以有效分析全省各個(gè)考核站點(diǎn)的供電情況和趨勢(shì),了解太陽能板、蓄電池的充放電情況,實(shí)現(xiàn)對(duì)站點(diǎn)的供電狀況以及故障原因進(jìn)行提前的研判。微信作為當(dāng)下最常用的社交軟件,將承擔(dān)站點(diǎn)報(bào)警信息推送功能。通過研制自動(dòng)站供電狀態(tài)實(shí)時(shí)監(jiān)控系統(tǒng),加入到現(xiàn)有觀測(cè)設(shè)備中,對(duì)區(qū)域自動(dòng)站太陽能板、蓄電池、負(fù)載端電壓進(jìn)行三路采集,并集成溫濕度傳感器監(jiān)控機(jī)箱內(nèi)部環(huán)境數(shù)據(jù),利用后臺(tái)編程設(shè)定報(bào)警閾值,通過微信將站點(diǎn)運(yùn)行狀態(tài)和故障信息通知相關(guān)保障人員。
本次設(shè)計(jì)的自動(dòng)氣象站供電狀態(tài)監(jiān)控系統(tǒng)主要由溫濕度傳感器、AD轉(zhuǎn)換系統(tǒng)、數(shù)據(jù)采集器、GPRS通信模塊以及微信報(bào)警系統(tǒng)組成 。在系統(tǒng)的設(shè)計(jì)上,主要分為3個(gè)階段來完成,分別是硬件模塊的設(shè)計(jì)與搭建、服務(wù)器物聯(lián)網(wǎng)運(yùn)行環(huán)境的搭建以及微信客戶端報(bào)警信息推送功能的設(shè)計(jì)與實(shí)現(xiàn),主要涉及到電子通信技術(shù)、計(jì)算機(jī)軟件相關(guān)技術(shù)[1]。在數(shù)據(jù)的采集和處理上采用型號(hào)為AT89C52的8位單片機(jī),溫濕度的采集用的是型號(hào)為DHT11的數(shù)字溫濕度傳感器,是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器。三路電壓的采集上利用電阻分壓原理,通過PCF8591進(jìn)行模擬量到數(shù)字量的轉(zhuǎn)換,數(shù)據(jù)傳輸通過GPRS無線傳輸方式[2],系統(tǒng)總體的結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)構(gòu)成圖Fig.1 system composition
系統(tǒng)采集的數(shù)據(jù)有機(jī)箱內(nèi)部的溫濕度,蓄電池、太陽能板及負(fù)載輸出端的電壓。首先在溫濕度的采集上,選用了DHT11數(shù)字式溫濕度傳感器,工作電壓3.3~5V,濕度測(cè)量范圍20%~95%,溫度測(cè)量范圍0~50 ℃,該傳感器具有體積小、穩(wěn)定性高、功耗低的特點(diǎn)。DHT11數(shù)字式溫濕度傳感器在與微控制器連接時(shí)只需要一個(gè)數(shù)據(jù)線就可以實(shí)現(xiàn)與單片機(jī)的通信,通過單總線協(xié)議完成,將傳感器輸出的數(shù)字信號(hào)直接送入I/O口;三路電壓的采集采用電阻分壓原理,匹配的是13 K和91 K的電阻進(jìn)行分壓,電壓測(cè)量設(shè)計(jì)的范圍是0~40 V,需要將被測(cè)量電壓通過分壓原理轉(zhuǎn)換成0~5 V的模擬量,再通過PCF8591 AD 轉(zhuǎn)換模塊將0~5 V的電壓模擬量轉(zhuǎn)換成0~255的數(shù)字量,利用相應(yīng)的公式計(jì)算出實(shí)際電壓,從而將電壓信號(hào)轉(zhuǎn)換成數(shù)字量[1]。
單片機(jī)采集到相應(yīng)的數(shù)據(jù)后,通過串口通信送到GPRS通訊模塊。數(shù)據(jù)發(fā)送的方式采用的是字符形式發(fā)送。數(shù)據(jù)是以二進(jìn)制的形式存儲(chǔ),在用串口發(fā)送數(shù)據(jù)的時(shí)候首先將數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼,然后再將這些ASCII碼按照二進(jìn)制的方式一位一位地發(fā)送出去,字符串的打包格式如下表1所示。
表1 數(shù)據(jù)打包格式Tab.1 data packaging format
如上表所示,溫度、濕度占2字節(jié),三路電壓各4個(gè)字節(jié),當(dāng)GPRS模塊打包發(fā)送的數(shù)據(jù)與后臺(tái)幀頭接收設(shè)置幀頭相同時(shí),將此幀數(shù)據(jù)接收并存入數(shù)據(jù)庫,并準(zhǔn)備下一幀數(shù)據(jù)的接收。
Workerman是一款高性能的PHP socket服務(wù)器框架,Workerman基于PHP多進(jìn)程以及l(fā)ibevent事件輪詢庫,PHP開發(fā)者只要實(shí)現(xiàn)一兩個(gè)接口,便可以開發(fā)出自己的網(wǎng)絡(luò)應(yīng)用,實(shí)現(xiàn)采集端與服務(wù)器終端的數(shù)據(jù)傳輸。Workerman支持TCP和UDP兩種傳輸層協(xié)議,只需要更改配置的一個(gè)字段,便可以更換傳輸層協(xié)議。本次設(shè)計(jì)基于Workerman開發(fā),搭建了終端設(shè)備到服務(wù)器端的數(shù)據(jù)傳輸平臺(tái),從而實(shí)現(xiàn)了站點(diǎn)運(yùn)行狀態(tài)數(shù)據(jù)的采集傳輸,運(yùn)行示例如下:
use WorkermanWorker;
require_once __DIR__ . '/Autoloader.php';
require_once __DIR__ . '/vendor/autoload.php';
// 創(chuàng)建一個(gè)Worker監(jiān)聽10006端口,使用tcpsocket協(xié)議通訊
$tcp_worker = new Worker('tcp://0.0.0.0:10006');
// 啟動(dòng)4個(gè)進(jìn)程對(duì)外提供服務(wù)
$tcp_worker->count = 4;
$tcp_worker->onWorkerStart = function($tcp_worker)
{
//將db實(shí)例存儲(chǔ)在全局變量中(也可以存儲(chǔ)在某類的靜態(tài)成員中)
global $db;
$db = new WorkermanMySQLConnection('127.0.0.1', '3306', 'root', 'Qwer123456', 'yang');//127.0.0.1'
};
// 當(dāng)收到客戶端發(fā)來的數(shù)據(jù)后將數(shù)據(jù)插入到數(shù)據(jù)庫表中
$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);// 向客戶端發(fā)送$HH $data// 這部分運(yùn)行在子進(jìn)程
}
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);// 向客戶端發(fā)送$HH $data// 這部分運(yùn)行在子進(jìn)程
}
};
// 運(yùn)行worker
Worker::runAll();
微信作為當(dāng)下最常用也是普及度最高的社交軟件之一,憑借高到達(dá)、高接收率、高精準(zhǔn)度的特點(diǎn)備受廣大用戶的青睞[10]。作為狀態(tài)信息發(fā)送的載體,可隨時(shí)隨地查詢站點(diǎn)運(yùn)行作態(tài),采用微信來進(jìn)行監(jiān)控也是本次設(shè)計(jì)的特點(diǎn)之一。微信端后臺(tái)對(duì)數(shù)據(jù)庫的管理和查詢通過Python編程實(shí)現(xiàn),微信監(jiān)控程序主要使用Python語言開發(fā),通過Pymysql庫,訪問搭建在阿里云上的Mysql數(shù)據(jù)庫,將查詢到的監(jiān)控?cái)?shù)據(jù)進(jìn)行文本格式化后通過itchat開源庫提供的微信消息接口將監(jiān)控信息發(fā)送給指定的微信群或微信好友,具體實(shí)現(xiàn)數(shù)據(jù)查詢和發(fā)送的代碼如下:
conn11 = pymysql.connect(host='39.98.236.17',
user='root',
password='Qwer123456',
database='yang',
charset='utf8')
# 得到一個(gè)可以執(zhí)行SQL語句的光標(biāo)對(duì)象
cursor11 = conn11.cursor()
# 寫sql語句
sql = "select * from yyy where name =' "+stn +"' order by time desc ;"
# 執(zhí)行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]) + "負(fù)載端電壓" +
str(cursor11.fetchone()[6]) + "時(shí)間"
# 發(fā)送采集數(shù)據(jù)到微信
itchat.send(s, toUserName=msg['FromUserName'])
表2 數(shù)據(jù)的存儲(chǔ)入庫Tab.2 data storage
自動(dòng)站供電狀態(tài)在線監(jiān)測(cè)系統(tǒng)采用微信消息推送和查詢的方式,具體查詢方法為在微信端輸入站點(diǎn)名稱+狀態(tài),就能實(shí)時(shí)獲取自動(dòng)站的供電狀態(tài)。例如輸入凱里,狀態(tài)即能查詢到當(dāng)前自動(dòng)站機(jī)箱內(nèi)的溫度、濕度、蓄電池、太陽能板以及負(fù)載端的電壓信息,如圖2所示。當(dāng)自動(dòng)站蓄電池、負(fù)載端電壓低于設(shè)定的閾值時(shí),微信會(huì)推送報(bào)警信息,如圖3所示。該項(xiàng)設(shè)計(jì)主要解決了自動(dòng)站運(yùn)行過程中對(duì)三路電壓的監(jiān)控,包括蓄電池、太陽能板的充放電情況以及負(fù)載輸出端的電壓。
圖2 自動(dòng)站狀態(tài)信息查詢Fig.2 automatic station status information query
圖3 自動(dòng)站狀態(tài)信息報(bào)警Fig.3 automatic station status information alarm
本次設(shè)計(jì)具有以下優(yōu)勢(shì):一是解決了目前區(qū)域自動(dòng)站供電系統(tǒng)無法實(shí)時(shí)查詢的問題,出現(xiàn)故障后第一時(shí)間發(fā)現(xiàn)是否因?yàn)楣╇姴蛔阋?;二是該系統(tǒng)自帶故障報(bào)警、無信號(hào)自動(dòng)復(fù)位重啟功能,具有功耗低,性能穩(wěn)定價(jià)格便宜等優(yōu)勢(shì);三是利用微信客戶端作為狀態(tài)信息查詢和報(bào)警的媒介,具有使用方便快捷的特點(diǎn)。
本次設(shè)計(jì)完成了對(duì)區(qū)域常規(guī)自動(dòng)氣象站供電狀態(tài)以及機(jī)箱內(nèi)部溫濕度的實(shí)時(shí)監(jiān)控,同時(shí)客戶端開通了微信實(shí)時(shí)查詢和報(bào)警提醒的功能,方便維護(hù)人員實(shí)時(shí)了解監(jiān)控站點(diǎn)的供電狀態(tài),還可通過對(duì)歷史數(shù)據(jù)的查詢,了解當(dāng)?shù)厝照涨闆r及蓄電池充放電情況。當(dāng)蓄電池的輸出高于或低于所設(shè)定的閾值時(shí),微信客戶端會(huì)第一時(shí)間發(fā)出報(bào)警信號(hào),讓氣象服務(wù)人員及時(shí)了解設(shè)備供電狀態(tài)。該項(xiàng)功能的實(shí)現(xiàn)有助于維護(hù)人員實(shí)時(shí)掌握各個(gè)站點(diǎn)的供電狀態(tài),同時(shí)能夠?qū)庀髷?shù)據(jù)的有效性和準(zhǔn)確性進(jìn)行判斷,特別是當(dāng)發(fā)生重大降水天氣過程時(shí),能夠有效避免因站點(diǎn)數(shù)據(jù)無效影響氣象防災(zāi)減災(zāi)的決策研判。