平時研究二進制漏洞和內(nèi)核遇到的問題都在看雪得到了答案,也很感謝這些前輩將自己解決問題的思路共享出來,讓后人少踩坑。
設備信息和結(jié)構(gòu)組成
參數(shù)信息:
功能配置:
組成結(jié)構(gòu):
實物圖:
通訊方式
從電表的詳細參數(shù)可以得知主要支持的通訊方式為脈沖通訊和載波通訊,該款電表支持使用載波RS485協(xié)議建立通訊連接,RS485是串口的一種,常見的還有RS232,RS422都屬于串口,485是半雙工通訊,傳輸速率在10Mbps左右,發(fā)送數(shù)據(jù)的時候,控制CTRL為高電平,數(shù)據(jù)通過TXD發(fā)送出去(這個在電表圖中右下角的位置),要接收數(shù)據(jù)的時候,控制CTRL為低電平,數(shù)據(jù)通過RXD(這個在電表圖中右下角第二的位置)接收回來實現(xiàn)收發(fā),簡單說就是把TTL的“0-3.3V/5V之間擺動”的信號,轉(zhuǎn)換為“5V壓差顛倒反轉(zhuǎn)的AB線信號”。
最左側(cè)的編號從5開始到12分別代表了對外的接口,每個接口都各自對應在PCB上。
我使用了RS485用子線接A/B后進行異步串行通信,如下圖所示。 正對正負對負(data+ data-)。
如果出現(xiàn)部分通信不正常,可以確定問題是否出現(xiàn)在轉(zhuǎn)接器中(我在實際實驗過程中就出現(xiàn)了轉(zhuǎn)接器故障最后通過短接測試才發(fā)現(xiàn)問題出在哪,最后買了一個新的轉(zhuǎn)接器)轉(zhuǎn)換器子線正接正、負接負進行短接測試。
通過系統(tǒng)設備管理器查看是否有COM口已經(jīng)接入,如果有就可以串口通信了,一般波特率可以設置在2400或者9600其中一個,校驗位改成“偶校驗”。
波特率的字節(jié)格式每字節(jié)含8位二進制碼,傳輸時加上一個起始位(0)、一個偶校驗位和一個停止位(1)共11位。如下圖,D0是字節(jié)的最低有效位,D7是字節(jié)的最高有效位。先傳低位,后傳高位。
嘗試發(fā)送數(shù)據(jù)看看是否能夠正常接收到數(shù)據(jù),因為是短接測試所以發(fā)送什么數(shù)據(jù)就會收到什么數(shù)據(jù)。
如果收不到數(shù)據(jù)可能你的轉(zhuǎn)換接口或者子線接入是有問題的。以上測試完成后就可以給電表上電了,先將轉(zhuǎn)接器一頭接入電腦USB,然后將子線接入電表RS485 A/B口,記住:正對正負對負。
我這款就是單相電能表,單相電表從左到右有四個接線端依次為1、2、3、4,通過單相電表的剖析圖可以得知分火、零兩線(1、3為進,2、4為出,1火3零)。
這里我自己制作了簡單的一條電線,我使用了1和4口構(gòu)成電回路(1接3和4都行,別接2火線接火線會跳閘。)
插入插座上電后就可以通過USB打開串口和電表通訊了。
電表有專用的電力通訊標準,也是國家的一個標準統(tǒng)稱叫645《DL/T 645》最早在1997年發(fā)布一個《DL/T 645-1997》的通訊標準,而后在2007發(fā)布《DL/T 645-2007》,現(xiàn)在2007已經(jīng)替代了1997的標準了,從信息頭可以看到。
電力協(xié)議是一個相對比較復雜的協(xié)議,光看完標準得半個月-1個月。
電表數(shù)據(jù)讀取
目前新表主流還是07版的,下面就解析這兩種表通信協(xié)議:
標準中提到協(xié)議為主/從結(jié)構(gòu)的半雙工通信方式。每幀由前導符、幀長度、特征域、地址域、控制域、數(shù)據(jù)域、校驗域、結(jié)束符等8個域組成。
那么依據(jù)此標準的格式域就可以對電表數(shù)據(jù)進行讀取,在實際應用場景從主節(jié)點到基表 MCU 之間的下行和上行數(shù)據(jù)傳輸格式如下:
還會遇到中繼路由的情況,可能還存在其他場景也挺復雜的,通過串口方式實現(xiàn)一個數(shù)據(jù)讀寫的代碼來實現(xiàn)數(shù)據(jù)讀取,這里我使用C/C++來完成了。
先嘗試讀取電表的地址,通過標準可以發(fā)現(xiàn)在不知道電表地址的情況下可以使用AAH去替代地址
發(fā)送數(shù)據(jù):68H AAH AAH AAH AAH AAH AAH 68H 13H 00H DFH 16H
因為寫代碼花的時間比較少,這里沒有把串口同步的代碼寫上不過沒有關系,根據(jù)標準的要求提到16H為結(jié)束符。(代碼寫的丑就不貼了)
整理后的數(shù)據(jù)為:68 89 41 53 20 51 17 68 93 06 BC 74 86 53 84 4A E5 16
至此成功獲取了電表的返回數(shù)據(jù),通過標準解析:
894153205117(地址域)
93(控制碼)
06(數(shù)據(jù)域長度)
BC 74 86 53(數(shù)據(jù)域寄存器地址)
84 4A(數(shù)據(jù)項)
E5 16(校驗碼\結(jié)束符)
根據(jù)傳輸次序-低在前,高在后得到175120534189 為電表的地址,后來我發(fā)現(xiàn)該地址其實就是外殼貼條上的那一串No.號。
電表數(shù)的計算公式:數(shù)據(jù)項-33H=電表數(shù)
84H-33H=51H
4AH-33H=17H
電表數(shù)為:1751
也可獲取如電量數(shù)據(jù)、電表時間、峰平谷值、用電總量、金額等。
*本文由看雪論壇 blck四 原創(chuàng),轉(zhuǎn)載請注明來自看雪社區(qū)
來源:看雪學苑