本發明涉及一種電能表掉電保護數據存貯方法。
背景技術:
在電能表的數據存貯中,關鍵數據掉電保存與上電恢復是產品可靠性的非常關鍵的一個指標,在現場運行過程中出現的非器件故障導致的數據錯誤,絕大部分與掉電數據保存與上電恢復有關。產生的原因包括很多方面,主要包括掉電檢測與響應不及時、掉電/上電過程太頻繁導致工作電源不穩、電池鈍化、整流電解電容的儲能性能下降等。
為了解決掉電/上電時的存貯問題,大多數電能表軟件都會采用多備份的方式來提高可靠性,一般的做法是選擇奇數個數據存貯區,掉電時將數據依次寫入每個存貯區,上電時再讀出進行比較,按少數服從多數的原則選取存貯區。但是,這種方式本身存在問題,就是掉電時存貯次數太多,本來掉電時就是靠整流電解電容的剩余電荷為寫入存貯器的主要電源,之后由電池供電完成停電待機工作,而當要寫入的存貯區數據太多時,電解電容的剩余電荷無法完成工作,需要電池來接續完成,而電能表使用的電池是鋰電池,長時間不用會產生鈍化,無法在短時間提供滿足寫入存貯器的工作電流,導致寫入不正確,從而無法保證寫入的可靠性。
技術實現要素:
為了克服現有電能表掉電存貯的可靠性不足的缺陷,本發明提供一種寫入可靠性高的電能表掉電保護數據存貯方法。
本發明解決其技術問題的技術方案是:一種電能表掉電保護數據存貯方法,在電能表的MCU的RAM中設置掉電保護數據塊、指針PA、指針PB,將需要掉電保護的數據集中在一起并加上CRC校驗,存入掉電保護數據塊中;
在電能表的非易失性存貯器中設置循環備份存貯區A和循環備份存貯區B,在循環備份存貯區A和循環備份存貯區B中均設置若干個用于存貯掉電保護數據塊中數據的備份數據區塊;
在電能表的MCU中設置定時器,當定時時間到,且在這個定時間隔中有電量數據變化,就啟動一次數據備份的寫操作,寫操作的過程如下:
先將要保存的掉電保護數據塊中的數據寫入循環備份存貯區A 中指針PA所指向的備份數據區塊,然后讀出進行比對,若寫入不正確,再重復寫入,若寫入成功,則指針PA 指向后續一塊備份數據區塊;若重復三次都寫入不成功,則放棄本次對循環備份存貯區A的寫入;
按上述方法將要保存的掉電保護數據塊中的數據寫入循環備份存貯區B中;
當電能表MCU檢測到掉電時,若在上次定時寫入后有電量數據變化,也啟動一次上述的數據備份的寫操作,寫完后,進入休眠模式;
當重新上電后,電能表MCU從休眠模式喚醒,先從非易失性存貯器中恢復數據到掉電保護數據塊,恢復過程如下:
(1).讀出循環備份存貯區A的各備份數據區塊,若不存在CRC校驗錯的備份數據區塊,則將總電量值最小的那個備份數據區塊的位置作為下一次數據存貯指針PA;
若存在CRC校驗錯的備份數據區塊,則舍棄CRC校驗錯的備份數據區塊,并將該備份數據區塊的位置作為下一次數據存貯指針PA;
在CRC校驗正確的備份數據區塊中找到總電量值最大的備份數據區塊,作為循環備份存貯區A的當前塊;
(2).用上述同樣的方法再找到循環備份存貯區B的當前塊和指針PB;
(3).將找到的循環備份存貯區A的當前塊、循環備份存貯區B的當前塊進行比較,總電量值大的當前塊中的數據恢復至RAM中的掉電保護數據塊內。
本發明的有益效果在于:1.在掉電時只寫入了2個數據塊,對整流電解電容的儲能要求較低,容易滿足要求;2.循環備份區的數據除了一個是在掉電時寫入的外,其它區域是在正常工作時寫入的,數據的可靠性有保證,因此,在極限情況下,即使掉電時寫入的數據全部錯誤,也能用最近一次定時存貯的數據來恢復,電量偏差小于一個定時存貯間隔的用戶用電量;3.當有CRC校驗錯的備份數據塊時,使用該塊作為下一次寫入位置,因此,不論發生什么狀況,每個循環備份區只會有一個寫入不正確的備份數據塊。
附圖說明
圖1是本發明的原理圖。
具體實施方式
下面結合附圖和具體實施方式對本發明作進一步詳細說明。
參照圖1,一種電能表掉電保護數據存貯方法,在電能表MCU的RAM中設置掉電保護數據塊101、指針PA 104、指針PB 105,將需要掉電保護的數據集中在一起并加上CRC校驗,存入掉電保護數據塊101中。
在電能表的非易失性存貯器中設置循環備份存貯區A 102和循環備份存貯區B 103,在循環備份存貯區A 102和循環備份存貯區B 103中分別有n和m個用于存貯掉電保護數據塊101中數據的備份數據區塊,n和m可以相同也可以不同。
電能表在生產或計量檢定期間進行初始化或電量總清時,掉電保護數據塊101、循環備份存貯區A 102、循環備份存貯區B 103的數據全部清零,指針PA 104和指針PB 105 也賦予初始值,指向兩個循環備份存貯區的首部。
在電能表的MCU中設置定時器,當定時時間到,且在這個定時間隔中有電量數據變化,就啟動一次數據備份的寫操作,寫操作的過程如下:
先將要保存的掉電保護數據塊101中的數據寫入循環備份存貯區A 102 中指針PA 104所指向的備份數據區塊,然后讀出進行比對,若寫入不正確,再重復寫入,若寫入成功,則指針PA 104指向后續一塊備份數據區塊,若原PA 104指向循環備份存貯區A 102的尾部的備份An塊,則指向首部的備份A1塊;若3次寫入不成功,放棄本次對循環備份存貯區A 102的寫入操作;
按上述方法將要保存的掉電保護數據塊101中的數據寫入循環備份存貯區B 103中;
當電能表MCU檢測到掉電時,若在上次定時寫入后有電量數據變化,也啟動一次上述的數據備份的寫操作,寫完后,進入休眠模式。
當重新上電后,電能表MCU從休眠模式喚醒,先從非易失性存貯器中恢復數據到掉電保護數據塊101,恢復過程如下:
(1).讀出循環備份存貯區A 102的各備份數據區塊,若不存在CRC校驗錯的備份數據區塊,則將總電量值最小的那個備份數據區塊的位置作為下一次數據存貯指針PA;
若存在CRC校驗錯的備份數據區塊,則舍棄CRC校驗錯的備份數據區塊,并將該備份數據區塊的位置作為下一次數據存貯指針PA;
在CRC校驗正確的備份數據區塊中找到總電量值最大的備份數據區塊,作為循環備份存貯區A102的當前塊;
(2).用上述同樣的方法再找到循環備份存貯區B 103的當前塊和指針PB 105;
(3).將找到的循環備份存貯區A 102的當前塊、循環備份存貯區B 103的當前塊進行比較,總電量值大的當前塊中的數據恢復至RAM中的掉電保護數據塊101內。
掉電保護數據恢復到RAM后,MCU就能進入正常的工作狀態了。
在掉電保護數據恢復中,利用了總電量值作為判別依據,因為總電量總是不斷遞增的,因此,總電量最小的是最早保存的備份數據,總電量最大的就是最新的備份數據,因此,將指針指向總電量最小的數據塊,就能做到先進先出,而用總電量最大值的數據塊,就能確認用的是最后一次保存的有效值。