劉曉輝1,李鵬1,胡光娜2
?。?.河南許繼儀表有限公司,河南 許昌461000; 2.國(guó)網(wǎng)吉林省電力有限公司延邊供電公司,吉林 延吉 133000)
摘要:為了解決電能表系統(tǒng)數(shù)據(jù)現(xiàn)場(chǎng)升級(jí)程序容易出現(xiàn)數(shù)據(jù)混亂的問題,分析了目前電能表系統(tǒng)數(shù)據(jù)存儲(chǔ)的方式,針對(duì)目前電能表系統(tǒng)數(shù)據(jù)存儲(chǔ)的問題提出了改善方案。通過數(shù)據(jù)鏈表創(chuàng)造出一個(gè)可以自由伸縮的數(shù)據(jù)存儲(chǔ)系統(tǒng),形成了以數(shù)據(jù)塊為存儲(chǔ)單元的存儲(chǔ)模式,解決了電能表系統(tǒng)中新增加數(shù)據(jù)會(huì)導(dǎo)致現(xiàn)有數(shù)據(jù)地址改變的問題。文章先從目前電能表系統(tǒng)數(shù)據(jù)存儲(chǔ)的問題說起,隨后提出了新的數(shù)據(jù)存儲(chǔ)模型,并一一介紹了新數(shù)據(jù)存儲(chǔ)模型的創(chuàng)建、讀取、寫入及刪除等操作,并在電能表上成功實(shí)現(xiàn)了新數(shù)據(jù)存儲(chǔ)模型。
關(guān)鍵詞:數(shù)據(jù)存儲(chǔ);數(shù)據(jù)索引;鏈表;數(shù)據(jù)結(jié)構(gòu)
0引言
在目前很多電能表系統(tǒng)中,數(shù)據(jù)存儲(chǔ)都是順序存儲(chǔ)模式,導(dǎo)致現(xiàn)場(chǎng)升級(jí)完程序后時(shí)常會(huì)有數(shù)據(jù)混亂問題出現(xiàn),究其原因是因?yàn)殚_發(fā)人員新增加數(shù)據(jù),但沒有按順序添加到數(shù)據(jù)列的最后面而導(dǎo)致。現(xiàn)在很多的電能表系統(tǒng)都是以EEPROM作為擴(kuò)展的外部數(shù)據(jù)存儲(chǔ)器,單相電能表一般采用32 KB的EEPROM存儲(chǔ)器來進(jìn)行數(shù)據(jù)存儲(chǔ),國(guó)網(wǎng)智能電表系統(tǒng)中的數(shù)據(jù)都是以數(shù)據(jù)標(biāo)識(shí)符的形式定義,在EEPROM中存儲(chǔ)時(shí)通常都以順序方式進(jìn)行數(shù)據(jù)排列。這種存儲(chǔ)方法形式比較單一,數(shù)據(jù)必須按照固定的格式進(jìn)行順序排序,一旦有新的數(shù)據(jù)添加,這個(gè)新數(shù)據(jù)必須排在數(shù)據(jù)列的最后面,否則就會(huì)影響其他數(shù)據(jù)在EEPROM中的地址,導(dǎo)致電能表升級(jí)程序后數(shù)據(jù)出現(xiàn)異常。本文提出一種新的數(shù)據(jù)存儲(chǔ)方法,解決了新增數(shù)據(jù)必須在數(shù)據(jù)列的最后面添加的弊端,各個(gè)業(yè)務(wù)模塊都可以在數(shù)據(jù)列任意位置添加新數(shù)據(jù)而不用擔(dān)心電能表升級(jí)程序后數(shù)據(jù)異常的問題。
1數(shù)據(jù)存儲(chǔ)的原理
本文提出的這種數(shù)據(jù)存儲(chǔ)的原理基于鏈表[1]的數(shù)據(jù)處理方法,電能表內(nèi)的數(shù)據(jù)采用雙向鏈表的形式進(jìn)行組合,業(yè)務(wù)模塊需要添加新數(shù)據(jù)時(shí),只需要將新數(shù)據(jù)頭指針指向前一個(gè)數(shù)據(jù),尾指針指向后一項(xiàng)數(shù)據(jù),整個(gè)數(shù)據(jù)鏈不會(huì)受到破壞[2]。數(shù)據(jù)存儲(chǔ)原理如圖1。
2數(shù)據(jù)的創(chuàng)建和刪除
根據(jù)上述原理,需要對(duì)EEPROM存儲(chǔ)器進(jìn)行整體格式化,即對(duì)存儲(chǔ)空間進(jìn)行分塊并標(biāo)記,如圖2所示。分塊就是將32 KB的存儲(chǔ)空間以16 B為1塊劃分,那么就可以分成2 048個(gè)塊,用前面16個(gè)塊(2 048 bit位)來標(biāo)記每一塊的使用情況,每一個(gè)bit位值為1代表所指向的塊處于使用狀態(tài),bit位值為0代表所指向的塊處于空閑狀態(tài)[3]。
2.1數(shù)據(jù)的創(chuàng)建
創(chuàng)建一個(gè)數(shù)據(jù)就必須有一個(gè)總的數(shù)據(jù)索引FileIndex結(jié)構(gòu)對(duì)象,這個(gè)數(shù)據(jù)索引要實(shí)現(xiàn)的功能就是能通過它找到EEPROM中存放的每一個(gè)數(shù)據(jù),那么這個(gè)FileIndex結(jié)構(gòu)定義就需要有每個(gè)數(shù)據(jù)的地址映射。由數(shù)據(jù)索引[46]開圖2存儲(chǔ)空間分塊及標(biāo)記示意圖始,數(shù)據(jù)索引中包含第一個(gè)數(shù)據(jù)的起始地址,由此地址可以訪問到第一個(gè)數(shù)據(jù)。然后由數(shù)據(jù)結(jié)構(gòu)struct FILE中的數(shù)據(jù)指針pFileNext指向下一個(gè)數(shù)據(jù)的地址,數(shù)據(jù)結(jié)構(gòu)FILE中的數(shù)據(jù)指針pData則指向本數(shù)據(jù)區(qū)域(數(shù)據(jù)區(qū)域就是用來真正存放數(shù)據(jù)的EEPROM地址),依次遞推,查找每一個(gè)數(shù)據(jù),比較數(shù)據(jù)與要?jiǎng)?chuàng)建的新數(shù)據(jù)是否不同(通常采用數(shù)據(jù)標(biāo)識(shí)符區(qū)分),不同則從存儲(chǔ)空間中查找空閑塊分配給該新數(shù)據(jù)使用,相同則不處理。創(chuàng)建數(shù)據(jù)的時(shí)序圖如圖3。
2.2數(shù)據(jù)的刪除
數(shù)據(jù)的刪除與數(shù)據(jù)的創(chuàng)建過程很相似。首先讀出EEPROM中存放的FileIndex結(jié)構(gòu)對(duì)象,由其中的數(shù)據(jù)指針找到第一個(gè)數(shù)據(jù),判斷數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)名與要?jiǎng)h除的數(shù)據(jù)名是否一致,一致則刪除數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)塊指針并釋放存儲(chǔ)空間;否則由數(shù)據(jù)結(jié)構(gòu)中的下一個(gè)數(shù)據(jù)指針讀出下一個(gè)數(shù)據(jù)進(jìn)行數(shù)據(jù)名比較,依次遞推,直到找到要?jiǎng)h除的數(shù)據(jù)為止。釋放存儲(chǔ)空間需要將釋放的數(shù)據(jù)塊標(biāo)記置為空閑狀態(tài),以便創(chuàng)建新數(shù)據(jù)時(shí)使用。數(shù)據(jù)刪除時(shí)序圖如圖4。
3數(shù)據(jù)的讀寫操作
在完成數(shù)據(jù)的創(chuàng)建工作之后,就可以通過數(shù)據(jù)名對(duì)數(shù)據(jù)進(jìn)行讀寫操作。
3.1數(shù)據(jù)的讀取
數(shù)據(jù)的讀取是通過讀取EEPROM中的FileIndex結(jié)構(gòu)對(duì)象,由讀出的FileIndex對(duì)象里的數(shù)據(jù)指針找到第1個(gè)數(shù)據(jù)的。比較數(shù)據(jù)的數(shù)據(jù)名與要讀取的數(shù)據(jù)名是否相同,如果相同則通過指向數(shù)據(jù)域的指針pData把要訪問的EEPROM中數(shù)據(jù)讀出來;不同則通過數(shù)據(jù)結(jié)構(gòu)中的下一個(gè)數(shù)據(jù)指針pFileNext讀出第2個(gè)數(shù)據(jù),然后繼續(xù)比較數(shù)據(jù)名是否一樣。以此遞推,直到找到與要讀取的數(shù)據(jù)名一致的數(shù)據(jù)為止,圖5為讀數(shù)據(jù)的實(shí)現(xiàn)過程。
3.2數(shù)據(jù)的寫入
寫數(shù)據(jù)的操作過程與讀數(shù)據(jù)的過程非常相似,也是通過讀數(shù)據(jù)索引FileIndex找到第一個(gè)數(shù)據(jù),然后比較數(shù)據(jù)名是否一致,直到找到數(shù)據(jù)名匹配的數(shù)據(jù)為止,根據(jù)數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)域指針pData把數(shù)據(jù)存儲(chǔ)到EEPROM中對(duì)應(yīng)地址中去,實(shí)現(xiàn)了按數(shù)據(jù)名寫數(shù)據(jù)的操作,如圖6所示?! ?/p>
4結(jié)束語
本文介紹的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)的創(chuàng)建和刪除不會(huì)影響其他數(shù)據(jù)項(xiàng),各個(gè)業(yè)務(wù)模塊在處理新數(shù)據(jù)時(shí)只需將新數(shù)據(jù)添加到業(yè)務(wù)模塊處理的數(shù)據(jù)塊中,不會(huì)影響其他業(yè)務(wù)模塊的數(shù)據(jù)。該數(shù)據(jù)存儲(chǔ)系統(tǒng)已經(jīng)在單相智能表中實(shí)現(xiàn)及應(yīng)用,解決了因新增數(shù)據(jù)而導(dǎo)致其他數(shù)據(jù)地址發(fā)生變化的問題,從而避免了因現(xiàn)場(chǎng)升級(jí)程序而電能表數(shù)據(jù)混亂的發(fā)生。
參考文獻(xiàn)
[1] 李無言.一步步寫嵌入式操作系統(tǒng):ARM編程的方法與實(shí)踐[M].北京:電子工業(yè)出版社,2011.
?。?] BIC L F, SHAW A C.操作系統(tǒng)原理[M].梁洪亮,譯.北京:清華大學(xué)出版社,2005.
?。?] 馬志剛,劉文怡,凌偉,等.基于PCI和LVDS的高速數(shù)據(jù)存儲(chǔ)系統(tǒng)的設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2014,40(4):8083.
?。?] 張良,曹社香.面向卷級(jí)存儲(chǔ)系統(tǒng)即時(shí)恢復(fù)的高效索引方法[J].電子技術(shù)應(yīng)用,2014,40(7):116118.
[5] 龔雪容,劉根賢,生擁宏,等.基于Flash的關(guān)鍵變量容錯(cuò)存儲(chǔ)技術(shù)研究[J].電子技術(shù)應(yīng)用,2014,40(11):911,15.
[6] 徐涴砯,陳光,高孟茹,等.GPS船舶試航數(shù)據(jù)提取與存儲(chǔ)系統(tǒng)的開發(fā)[J].微型機(jī)與應(yīng)用,2013,32(23):8689.