1.本发明涉及数字
数据处理技术,具体涉及
电能表中的数据存储,特别是电能表的数据组织及存储功能的验证。
背景技术:
2.随着我国电力计量技术的不断发展,电能表的集成度和智能化程度逐渐提高。作为用户侧的计量器具,电能表可实时采集电网用户侧的各类数据,为上层应用提供所需要的数据。为了提供更为详细的电力分析数据及电能表运行状态记录,电能表存储数据越来越庞大,软、硬件设计也越来越复杂,影响电能表数据的因素也相对增多,存储数据的正误直接影响电力分析及电能表运行状态监测的结果,有些数据涉及法律相关问题,例如窃电,这就要求电能表存储数据要有高可靠性。
3.数据存储的高可靠性取决于存储器件的可靠性和电能表的数据组织及写入功能的完善。
4.电能表存储数据种类很多,由于各种存储器件(eeprom、flash、ram、fram,但不仅限于这几种)的特性,不同数据划分了不同存储
区域,同一存储区域内不仅限于一种数据项目(有的存储区域内只存储有功电量,有的存储区域内存储有功电能、时间、电压等数据的集合),存储器件可以满足电能表的存储要求。
5.电能表的数据组织及写入功能需要
测试来验证。
6.各类数据是否存储在设定的存储区域内,数据是否正确,测试需要覆盖全部设定区域,测试方法是否可靠、完善,直接影响测试结果。
7.目前电能表存储数据测试是人工完成,由测试人员按照自己的想法,修改电能表某些参数以及外部电力环境,使电能表处于预想的测试状态下,电能表产生测试人员想要测试的数据,然后使用抄读软件抄读电能表中的存储数据,由测试人员逐一检查存储数据的正误。
8.现有测试方法中,对测试人员的依赖程度高,测试人员需要了解电能表的每一个功能模块;产生测试数据的速度慢,影响测试进度;需要搭建电能表正常运行的复杂测试环境;测试人员产生的测试数据,有可能存在一定的重复性,影响测试结果;由于是人工方式,还会出现漏测的问题,不能保证全面的功能验证。
技术实现要素:
9.针对上述问题,本发明提出了一种自动、全面检测电能表数据存储功能的方法。
10.本发明采用的技术方案为:一种检测电能表数据存储功能的方法,其特征在于包括以下步骤:a、电能表中设置存储地址和功能模块的对应关系,b、获取电能表的数据存储配置表,c、根据数据存储配置表,确定当前测试存储区域的起始地址address及存储长度
len,d、读取电能表当前测试区域中的数据,e、根据存储长度len,生成与步骤d中读取的数据有差异的测试数据data_change,f、生成检测包发送给电能表,检测包中包括当前测试存储区域的起始地址address、测试数据data_change,g、电能表根据起始地址address,执行相应的功能模块,将测试数据写入对应存储区域;h、读取电能表当前测试区域中的数据,i、判断读取的数据与data_change,若存在不一致,则系统报错,结束;否则,执行步骤j,j、根据数据存储配置表判断是否测试完所有存储区域,若测试完毕,结束,否则,执行步骤c。
11.进一步地:步骤d包括:d1、读取当前测试区域中的数据,d2、读取与当前测试区域的相邻地址中的数据;步骤e包括:e1、根据存储长度len,生成与步骤d1中读取的数据有差异的测试数据data_change,e2、测试数据data_change增加一个字节,增加的字节与步骤d2中读取的数据有差异;步骤h包括:h1、读取当前测试区域中的数据,h2、读取与当前测试区域相邻地址中的数据;步骤i包括:i1、判断读取的当前测试区域中的数据与data_change,若存在不一致,则检测报错,结束;否则,执行步骤i2,i2、判断步骤d2和步骤h2读取的数据,若存在不一致,则检测报错,结束;否则,执行步骤j。
12.根据需求,设计人员为电能表需要存储的数据分配了指定的存储区域,且只能存储在指定的区域内,若存储到了其他区域,就会导致数据错误。
13.本发明的设计思想是根据电能表设计的存储区域,使用电能表本身的存储功能模块,按照配置表分次将测试数据写入全部存储空间,随即读出并进行比对。
14.采用本发明提出的技术方案,不用建立全真的测试环境,自动完成电能表数据存储功能的测试,对测试人员要求低,杜绝了人工测试的弊端;测试过程覆盖整个存储区域,不会遗漏;采用与原始存储数据相异的测试数据,保证了测试结果的可靠性,不会由于数据相同导致误判。
附图说明
15.图1为本发明的处理流程图。
具体实施方式
16.电能表存储数据种类很多,根据使用的存储器件的特性,设计人员在电能表中为不同数据划分了不同存储区域,一般来说,所有存储器件的空间使用连续地址,从0开始递增至最大设计容量。数据占用整字节,不会出现一个字节中前面几个bits属于一个存储区域,后面几个bits属于另外一个存储区域的情况。
17.以下实施例只是为了更好地理解本发明,并不对本发明构成限制。
18.实施例中,生成的检测包包括以下内容:id_1+len_1+data_change_1+ id_2+len_2+data_change_2+
…
+id_n+len_n+ data_change_n。
19.其中,id_x表示数据项目,每个数据项目都有一个唯一的数据id,len_x表示该数据项目测试数据的长度,data_change_x表示生成的测试数据。
20.以下实施例参考图1。
21.实施例1。
22.同一存储区域内可以只存储一种类型的数据,如有功电量,也可以存储不同的数据,如有的存储区域内存储有功电能、时间、电压等数据的集合。每一个存储区域由电能表的一个功能模块完成数据的写入。为了验证电能表的数据存储的正确性,在测试过程中,数据写入需要调用电能表内相应的功能模块。为此,本发明步骤a,在电能表中设置存储地址和功能模块的对应关系。
23.检测需要上位机配合。上位机软件集成电能表dlt-645/698抄表规约,通过485通讯、红外通讯等方式与电能表通讯,生成并下发测试数据,抄读存储器中的内容,自动完成测试过程。
24.电能表的数据存储配置表包括存储区域的首地址、尾地址、数据项目等,下表给出了数据存储配置表的示例内容。
25.表1:数据存储配置表本发明的步骤b、获取电能表的数据存储配置表,为测试做准备。
26.数据存储配置表,确定当前测试存储区域起始地址address及存储长度len,分析包含的各类存储数据(例如,当前测试存储区域包含电压、电流、时间、电量等,每类数据都有一个唯一的数据id)。
27.在设计存储区域时,有可能出现以下错误:两个相邻的存储区域发生重叠。如某一存储区域的地址为0x30-0x33,另一个存储区域的地址为0x32-0x37,两个存储空间存在2个字节的地址交叉,这在应用中会产生错误。为此,本发明中,系统根据配置模拟存储结构,检查存储结构是否存在错误,即步骤b2、根据数据存储配置表中各存储区域的首尾地址,判断是否有重叠,若有重叠,则检测报错。
28.还有一种情况,是某段地址没有出现在数据存储配置表中,即存储器中某些位置在当前的设计中没有使用。这种情况可以通过将所有存储区域的首尾地址排序,判断是否覆盖连续的区域以获得空闲区域。存储器出现空闲区域并不影响电能表的使用,这种情况可以不进行判断。
29.根据电能表的数据存储配置表,逐个区域进行检测。
30.c、根据数据存储配置表,确定当前测试存储区域的起始地址address及存储长度len。
31.本实施例中,当前测试区域为上表的存储区域序号1,起始地址address为首地址0x00,存储长度为首尾地址之间的差值,当前测试区域的存储长度len=4。
32.d、读取电能表当前测试区域中的数据。
33.读取当前数据,是为生成测试数据做准备。
34.e、根据存储长度len,生成与步骤d中读取的数据有差异的测试数据data_change。
35.如果电能表内当前测试区域内的数据与测试数据相同,完成写入、读出后,对比数据无差异,但这并不能保证电能表是否将测试数据写入了当前测试区域。因此,本发明中,生成的测试数据要异于当前测试区域的原有数据,以保证测试的可靠性。
36.如生成的测试数据为0x10 0x11 0x12 0x13。
37.f、生成检测包发送给电能表,检测包中包括当前测试存储区域的起始地址address、测试数据data_change,即address + id+4 + 0x10 0x11 0x12 0x13, id表示数据项目,本实施例中,此id表示整个测试区域作为一个整体,不区分数据项目。
38.g、电能表根据起始地址address,执行相应的功能模块,将接收的数据写入对应存储区域。
39.完成该步骤的基础是在电能表中设置了存储地址和功能模块的对应关系。存储地址为起始地址address所对应的功能模块完成当前测试区域的数据写入。
40.h、读取电能表当前测试区域中的数据。
41.上位机软件集成电能表dlt-645/698抄表规约,通过485通讯、红外通讯等方式与电能表通讯,读取特定数据。
42.i、判断读取的数据与data_change,若存在不一致,则系统报错,结束;否则,执行步骤j。
43.假设电能表内当前测试区域内的数据为0x00 0x01 0x02 0x03,测试数据与电能表内当前测试区域内的数据相同,也是0x00 0x01 0x02 0x03。如果电能表的写入模块不能将数据写入正确的地址,但读出的数据与测试数据是一致的,这样就会产生误判。
44.因此在步骤e中,如生成的测试数据为0x10 0x11 0x12 0x13,完成写入、读出后,如果读出的数据为0x00 0x01 0x02 0x03,则说明电能表没有在指定的地址写入指定的数据;如果读出的数据为0x10 0x11 0x12 0x13,则可以验证电能表在此区域的写入功能。
45.j、根据数据存储配置表判断是否测试完所有存储区域,若测试完毕,结束,否则,执行步骤c。
46.以上过程检测了电能表内所有存储区域。
47.上述过程中,如果数据存储配置表与电能表的功能模块两者协调一致,可以验证功能模块的写入功能。
48.实施例2。
49.考虑以下情况:如果数据存储配置表与电能表中的功能模块不一致,数据存储配置表中,某个存储区域的长度是a,对应的电能表功能模块实际写入的数据长度是b,会出现以下两种情况:1、a》b,如a=4,b=2。读取该存储区域的信息,假设如下:表2:存储区域的信息生成的测试数据为:0x11 0x12 0x13 0x14。
50.由于对应的电能表功能模块实际写入的数据长度是2,执行写入后该存储区域的信息为:表3:写入后的信息1由于读出的后面两个字节与测试数据不相同,这种错误采用前面的方法可以检测出来。
51.2、a《b,如a=2,b=4。
52.读取该存储区域的信息,假设如下:表4:存储区域的信息生成的测试数据为:0x11 0x12。
53.由于对应的电能表功能模块实际写入的数据长度是4,执行写入后该存储区域的信息为:表5:写入后的信息2由于写入了4个字节,且前两个字节是生成的测试数据,后面两个字节写入的内容不可知,且由于数据存储配置表中,该存储区域的长度是2,因此只读取和对比2个字节的内容,比对结果正确,这种错误采用前面的方法不能检测出来。
54.针对上述情况,本实施例采用以下方法:步骤d包括:d1、读取当前测试区域中的数据,本实施例中,读出的数据为0x01 0x02。
55.d2、读取与当前测试区域的相邻地址中的数据;本实施例中,相邻地址指当前测试区域后面一个字节的地址,读出的数据为0x03。
56.步骤e包括:e1、根据存储长度len,生成与步骤d1中读取的数据有差异的测试数据data_change,本实施例中,生成的测试数据为0x11 0x12。
57.e2、测试数据data_change增加一个字节,增加的字节与步骤d2中读取的数据有差异;本实施例中,增加的测试数据为0x13。
58.上述步骤中,生成的测试数据data_change为0x11 0x12 0x13。
59.f、生成检测包发送给电能表,检测包中包括当前测试存储区域的起始地址address、测试数据data_change,即address +id+ 3 + 0x11 0x12 0x13,id表示数据项目,本实施例中,此id表示整个测试区域作为一个整体,不区分数据项目。
60.对应的电能表功能模块实际写入的数据长度是4,执行写入后该存储区域的信息为:表6:写入后的信息3步骤h包括:h1、读取当前测试区域中的数据,本实施例中,读出的数据为0x11 0x12。
61.h2、读取与当前测试区域相邻地址中的数据;本实施例中,由于电能表中的功能模块写入了4个数据,读出的数据为0x13。
62.步骤i包括:i1、判断读取的当前测试区域中的数据与data_change,若存在不一致,则检测报错,结束;否则,执行步骤i2,i2、判断步骤d2和步骤h2读取的数据,若存在不一致,则检测报错,结束;否则,执行步骤j。
63.步骤i1中,两者一致;步骤i2中,两个数据不一致,检测报错。
64.在生成测试数据时,要保证测试数据data_change与步骤d1和d2读取的数据每个字节都不相同,即对应位置上的数据都有差异。该条件可以检测出以下错误,如:读出的数据:0x01 0x02 0x03 0x04与测试数据: 0x11 0x02 0x13 0x14虽然有差异,但第二个位置都是0x02,这样有可能造成极端情况下,错误检测不出来:其它三个位置的写入都没有问题,只在第二个位置出现问题。这种错误有可能发生:电能表和eeprom存储器件之间是由iic通讯协议进行数据传输,传输过程中有可能存在eeprom接收到的数据与电能表发出的数据不一致,导致存储数据错误。
65.上述方法中,步骤d2和h2只读了当前测试区域后面一个字节的内容,为了检测更
0x44 0x45 +id2+5+0x46 0x47 0x48 0x49 0x4a。
75.电能表根据address执行相应的模块程序组织数据,本实施例中,按照顺序正向有功电能4字节+反向有功电能4字节,共8字节数据进行存储。
76.读取当前存储区域的数据以及前、后相邻存储区域一个字节的数据,判断当前测试存储区域与写入数据是否一致,若不一致,系统报错,判断前、后相邻存储区域数据是否改变,若改变,系统报错。
77.存在以下几种情况:1.存储数据向前覆盖当前存储区域的存储起始地址错误,本实施例中的测试区域起始地址为0x20,若设计人员在设计程序时将存储起始地址计算错误,起始地址使用了0x1f,这样在判断前面相邻的存储区域时,检测到了数据变化,报错。
78.2.存储数据向后覆盖例如:反向有功电能4字节在实际组织数据时取了5字节数据,导致向后覆盖1字节,判断后面相邻的存储区域时,检测到了数据变化,报错。
79.3.当前测试存储区域数据错误本例子下发的表1中测试数据1,执行写入、读出后的数据应为0x41 0x42 0x43 0x44 0x46 0x47 0x48 0x49,若不是,检测报错。
80.若读出数据为0x46 0x47 0x48 0x49 0x41 0x42 0x43 0x44,即各数据项目的数据写入正确,但位置错误,说明电能表组织数据出错。
81.实施例4。
82.如果一个测试区域中有多个数据项目,针对每个数据项目单独检测,每次针对一个数据项目生成测试数据。
83.测试区域中,有以下数据项目:表8:数据项目表2根据数据存储配置表,确定当前测试存储区域的起始地址address及存储长度len,分析包含的各类存储数据,本实施例中包含的数据项目为参数1(2字节)、参数2(3字节)、参数3(4字节)。
84.读取电能表当前测试区域当前数据以及前、后相邻区域一个字节的数据。
85.根据存储长度,生成与读取的数据有差异的测试数据data_change本实施例中当前测试区域有3个数据,先测试第一个,数据参数1(2字节),为了能够检测到数据之间有无交叉覆盖,生成的测试数据需要3字节,测试数据见上表。
86.将当前测试区域地址address、生成的测试数据发送给电能表,发送数据格式为address +id5+3+0x56 0x57 0x58。
87.电能表根据address执行相应的模块程序,本实施例是修改参数1。
88.读取当前存储区域以及前、后相邻存储区域,判断当前测试存储区域与写入数据是否一致,若不一致,系统报错,判断前、后相邻存储区域数据是否改变,若改变,系统报错。
89.存在以下几种错误情况:1.参数1数据向前覆盖。
90.执行写入测试数据后,检测到当前测试存储区域前面相邻的区域的数据变化了,实际不应变化,2.参数1覆盖参数2。
91.3.当前测试存储区域数据错误。
92.测试完当前数据项目后,改变数据源,重新对存储区域执行从读取开始的检测过程,进行检测,方法相同,即根据下一个数据项目生成测试数据,执行上述步骤。需要注意的是,同一存储区域中,针对不同的数据项目,测试区域的起始地址是一致的,电能表根据数据项目的类型id,自行确定该数据项目在存储区域中的起始地址。
93.测试数据的生成方法。
94.为了避免潜在的检测风险,如测试数据为0x11 0x12 0x11 0x13,如果第一个位置和第三个位置写入顺序颠倒,由于上述两个位置的数据相同,该错误不能被检测出来。
95.本发明生成的测试数据data_change中,与读取的数据每个字节都不相同,并且本身没有重复的字节。
96.生成测试数据data_change的方法为:读出的数据为data_get,长度为l。data_get为当前测试区域中的数据或当前测试区域中的数据+相邻区域的1个字节数据。l为存储长度len或存储长度len+1。
97.k1、使用伪随机函数产生一个字节,如果该字节与data_get中第一个字节不同,置i=1,i为已生成字节的数量,执行k2,否则,重新执行k1;k2、使用伪随机函数产生一个字节,如果该字节与data_get中第i个字节不同并且该字节与data_change中已生成的所有字节都不同,置i=i+1,执行k2至生成所有测试数据,长度为l;否则,执行k2。
98.在步骤k1中,为了验证电能表的写入功能是否覆盖当前测试区域前面的地址空间,可以先读出当前测试区域之前的一个字节df;使用伪随机函数产生一个字节,该字节要求与data_get中第一个字节以及df都不同。
99.使用以上方法生成的数据,在本发明中称为具有唯一性的数据。
100.本发明还提供了另外一种生成测试数据的方法。
101.假设读出的数据为data_get,是测试区域内的数据,长度为l,fd为当前测试区域前面相邻一个字节的数据,bd为当前测试区域后面相邻一个字节的数据。
102.data_change[j]= ((fd《《4|(fd&0xf0)》》4)^ data_get[j])+(bd^(bd》》 (j%8)))
其中,j表示数据位置,1《=j《=l;^为异或,&为按位与,+为加法,》》为数据右移,《《为数据左移,j%8代表j除以8的余数;data_change[l+1]= ((fd《《4|(fd&0xf0)》》4)^ bd)。
[0103]
如下表所示:表9:存储信息l=3,bd=0x23,fd=0x30,data_get[1]=0x72,data_get[2]=0x73,data_get[3]=0x74。
[0104]
data_change[1]= ((0x23《《4|(0x23&0xf0)》》4)^ 0x72)+(0x30^(0x30》》 1))=((0x30|0x02)^0x72)+(0x30^0x18)=(0x32^0x72)+0x28=0x40+0x28=0x68,data_change[2]= ((0x23《《4|(0x23&0xf0)》》4)^ 0x73)+(0x30^(0x30》》2))=0x7b,data_change[3]= ((0x23《《4|(0x23&0xf0)》》4)^ 0x74)+(0x30^(0x30》》3))=0x8c,data_change[4]= ((0x23《《4|(0x23&0xf0)》》4)^ 0x30)=0x70。
[0105]
生成的data_change=0x68 0x7b 0x8c 0x70。
[0106]
公式中,以当前测试区域中原始数据作为数据基准,以前面相邻数据作为分散因子,经过算法分散,使生成数据与原始数据、前面相邻数据不等,使用后面相邻数据作为分散后生成数据的增量,进一步使生成数据与后面相邻数据不等。
[0107]
由于测试数据比原始数据多出一个字节,这里测试数据的最后一个字节以当前存储区域后面一个字节的数据为基础。
[0108]
当测试起始的存储区域时,当前测试区域没有前面相邻的字节,fd取值0x00。
[0109]
以上公式不用伪随机函数,以原始数据为基础,产生数据的速度更快,随机性更强。
[0110]
需要注意的是,当fd=0x00,bd=0x00,data_get[j]=0x00时,计算出data_change[j]=0。为了避免这种情况的发生,当出现上述情况时,取bd为任一不为0的数值进行计算。
技术特征:
1.一种检测电能表数据存储功能的方法,其特征在于包括以下步骤:a、电能表中设置存储地址和功能模块的对应关系,b、获取电能表的数据存储配置表,c、根据数据存储配置表,确定当前测试存储区域的起始地址address及存储长度len,d、读取电能表当前测试区域中的数据,e、根据存储长度len,生成与步骤d中读取的数据有差异的测试数据data_change,f、生成检测包发送给电能表,检测包中包括当前测试存储区域的起始地址address、测试数据data_change,g、电能表根据起始地址address,执行相应的功能模块,将测试数据写入对应存储区域;h、读取电能表当前测试区域中的数据,i、判断读取的数据与data_change,若存在不一致,则系统报错,结束;否则,执行步骤j,j、根据数据存储配置表判断是否测试完所有存储区域,若测试完毕,结束,否则,执行步骤c。2.根据权利要求1所述的检测电能表数据存储功能的方法,其特征在于,步骤d包括:d1、读取当前测试区域中的数据,d2、读取与当前测试区域的相邻地址中的数据;步骤e包括:e1、根据存储长度len,生成与步骤d1中读取的数据有差异的测试数据data_change,e2、测试数据data_change增加一个字节,增加的字节与步骤d2中读取的数据有差异;步骤h包括:h1、读取当前测试区域中的数据,h2、读取与当前测试区域相邻地址中的数据;步骤i包括:i1、判断读取的当前测试区域中的数据与data_change,若存在不一致,则检测报错,结束;否则,执行步骤i2,i2、判断步骤d2和步骤h2读取的数据,若存在不一致,则检测报错,结束;否则,执行步骤j。3.根据权利要求2所述的检测电能表数据存储功能的方法,其特征在于,步骤e中生成的测试数据data_change与步骤d1和d2读取的数据每个字节都不相同。4.根据权利要求1所述的检测电能表数据存储功能的方法,其特征在于,如果一个测试区域中有多个数据项目,针对每个数据项目单独检测。5.根据权利要求1所述的检测电能表数据存储功能的方法,其特征在于,步骤b包括:b1、获取电能表的数据存储配置表,b2、根据数据存储配置表中各存储区域的首尾地址,判断是否有重叠,若有重叠,则检测报错,结束,否则,继续检测过程。6.根据权利要求1或3所述的检测电能表数据存储功能的方法,其特征在于,所述测试
数据data_change中,没有重复的字节。7.根据权利要求6所述的检测电能表数据存储功能的方法,其特征在于,生成所述测试数据data_change的方法为:读出的数据为data_get,长度为l,k1、使用伪随机函数产生一个字节,如果该字节与data_get中第一个字节不同,置i=1,i为已生成字节的数量,执行k2,否则,重新执行k1;k2、使用伪随机函数产生一个字节,如果该字节与data_get中第i个字节不同并且该字节与data_change中已生成的所有字节都不同,置i=i+1,执行k2至生成所有测试数据;否则,执行k2。8.根据权利要求3所述的检测电能表数据存储功能的方法,其特征在于,生成所述测试数据data_change的方法为:读出的数据为data_get,长度为l,fd为当前测试区域前面相邻一个字节的数据,bd为当前测试区域后面相邻一个字节的数据,data_change[j]= ((fd<<4|(fd&0xf0)>>4)^ data_get[j])+(bd^(bd>> (j%8)))其中,j表示数据位置,1<=j<=l;data_change[l+1]= ((fd<<4|(fd&0xf0)>>4)^ bd)。
技术总结
一种检测电能表数据存储功能的方法,涉及数字数据处理技术,具体涉及电能表中的数据存储,特别是电能表的数据组织及存储功能的验证,包括以下步骤:获取电能表的数据存储配置表,根据存储分配表逐一读取存储区域中的数据,生成与读取的数据有差异的测试数据,将测试数据用电能表的功能模块写入相应地址,再次读取存储区域中的数据并进行比对,从而验证电能表的写入功能。采用本发明,不用建立全真的测试环境,自动完成电能表数据存储功能的测试,对测试人员要求低,杜绝了人工测试的弊端;测试过程覆盖整个存储区域,不会遗漏;采用与原始存储数据相异的测试数据,保证了测试结果的可靠性,不会由于数据相同导致误判。不会由于数据相同导致误判。不会由于数据相同导致误判。
技术研发人员:
李席 李峥 王强 张权 王世勇 张磊 刘国军 张祖 李义真 张光亮
受保护的技术使用者:
石家庄科林电气股份有限公司
技术研发日:
2022.02.23
技术公布日:
2022/3/25