可实现双向计量的智能电表的总电量累加方法
技术领域:
本发明涉及一种累加方法,具体涉及可实现双向计量的智能电表的总电量累加方法。
背景技术:
专用电能计量芯片通常能够实时判断潮流方向,其对应寄存器中计量值的符号也随之发生变化。具体地说,如果指定有功功率的参考方向为电网流向用户,则当有功功率的方向与参考方向相反时为负功率,表示用户向电网回送电能,对应寄存器中的计量值为负数;当有功功率的方向与参考方向一致时为正功率,表示用户从电网汲取电能,对应寄存器中的计量值为正数。
电量在专用电能计量芯片中的计量过程分成两个阶段。第一阶段由集成在芯片中的DSP完成,它对功率做有符号的积分运算并将结果暂存在一个内部寄存器中。当积分结果达到用户设定的阈值时,DSP在输出一个脉冲的同时,用内部寄存器中存储的积分结果减去阈值;第二阶段计数DSP输出的脉冲个数,并将计数值暂存在累加寄存器中。当MCU读取计数值时,该计数值将从累加寄存器转存到能量寄存器中,能量寄存器或者清零,或者保留原计数值。DSP输出的脉冲分频后得到电表的能量脉冲,分频倍数取决于电表常数。
目前使用的电子式电能表几乎都采用计数能量脉冲,通过指示灯显示的脉冲个数来计算用户的用电量。例如,某电子式电能表的常数是4000imp/kW·h,当脉冲个数累加(通常通过MCU中的定时器实现)到400个时,用户就消耗了0.1kW·h的电量。这种简单的电量累加方法存在下述诸多缺点:
(1)电磁干扰可能导致脉冲个数的增加或减少,从而造成计量误差;
(2)设计者通常指定一个计数阈值,譬如上文的400。当计数器计到这个数值时,才会将计数值清零并将该部分电量累加到总电量中;若要随机读取当前的计数值,则可能会产生±1个脉冲的计数误差。如果当前的计数值不是400,则会带来较大的计算误差。
譬如,若当前的计数值为13,则13/4000=0.00325kW·h,软件很可能将小数点后的325截掉,因此丢掉了这部分电量。
(3)若专用电能计量芯片的计量原理是对功率,而不是功率的绝对值积分,大的阈值(在电能计量芯片的相关寄存器中设置,当积分值达到此阈值时,电能计量芯片中的DSP输出一个脉冲)会带来大的双向计量误差。
目前,大多数的MCU芯片只支持整数运算,如果要在这些MCU上进行小数运算,定点小数运算应该是最佳选择。虽然用浮点MCU来做应该容易的多,但低成本也是非常重要的,定点机器比相应的浮点机器要便宜,而且速度更快。
发明内容:
针对现有技术存在的不足,本发明的目的在于提供一种能完成双向总电量累加的算法。
本发明提供的可实现双向计量的智能电表的总电量累加方法,其改进之处在于:所述方法包括累加正反向总电量和累加各费率的正反向总电量;
使用“读复位”模式的能量寄存器。
本发明提供的第一优选方案的累加方法,其改进之处在于:所述累加正反向总电量包括下述步骤:
a)软件判断MCU从能量寄存器中读取的计数值Reader的符号;
b)将a)的计数值除以C,整数商存放在Int中,余数存放在Dec中;
c)将b)中的整数和余数分别与存储器中的原有数据做正反向总电量的累加。
本发明提供的第二优选方案的累加方法,其改进之处在于:所述累加各费率正反向总电量的步骤为:
1)软件判断Reader的符号和某费率的总电量TAEnergy的符号;
2)根据Reader和TAEnergy的符号,确定情况类型,将Reader累加到相应费率的总电量上。
本发明提供的第三优选方案的累加方法,其改进之处在于:所述寄存器中的数据为二进制补码形式,负数则需要将其变换成原码形式,并屏蔽符号位。
本发明提供的第四优选方案的累加方法,其改进之处在于:由电能计量芯片中阈值寄存器中数据确定所述C值。
本发明提供的第五优选方案的累加方法,其改进之处在于:所述Reader为正数,将其累加到正向总电量上;整数商和正向总电量的整数部分PEInt相加;余数和正向总电量的小数部分PEDec相加;PEDec≥C,向整数进位,并将PEDec-C所得数据作为下一次累加的小数部分。
本发明提供的第六优选方案的累加方法,其改进之处在于:所述情况类型包括:
所述Reader为负数,所述TAEnergy为负数;
所述Reader为正数,所述TAEnergy为正数;
所述Reader为正数,所述TAEnergy为负数;
所述Reader为负数,所述TAEnergy为正数。
本发明提供的第七优选方案的累加方法,其改进之处在于:
①所述Reader为负数,所述TAEnergy为负数,将Reader取反码并加+1,屏蔽TAEInt与Int的符号位,将TAEInt和Int相加后存入TAEInt,同时符号位置1;余数TAEDec和Dec相加后存入TAEDec;存入新数据的TAEDec≥C,向整数部分进位,并将TAEDec-C存入TAEDec,作为下一次累加的小数部分;
②所述Reader为正数,所述TAEnergy为正数,将TAEInt与Int直接相加后存入TAEInt,TAEDec与Dec直接相加后存入TAEDec;存入新数据的TAEDec≥C,向整数部分进位,并将TAEDec-C存入TAEDec作为下一次累加的小数部分;
③所述Reader为正数,所述TAEnergy为负数,屏蔽TAEnergy的整数部分TAEInt的符号位,将TAEInt减去Int的值存入TAEInt,TAEInt≥Int,给新存入的TAEInt加上负号;将TAEDec减去Dec的值存入TAEDec,TAEDec<Dec,TAEDec向整数部分借位,并将TAEDe+C减去Dec的值存入TAEDec中;整数部分为零,用Dec减去TAEDec后存入TAEDec,并将TAEInt的符号位清零,表示总电量为正数;TAEDec≥Dec时,将TAEDec减去Dec后存入TAEDec;
④所述Reader为负数,所述TAEnergy为正数,将Reader取反码后加1,同时屏蔽其符号位;TAEInt≥Int,将TAEInt减去Int的值存入TAEInt,表示总电量是正数;将TAEDec减去Dec,TAEDec<Dec时,TAEDec向整数借位,用TAEDec+C减去Dec后存入TAEDec;整数部分为零,用Dec减去TAEDec后存入TAEDec,并将TAEInt的符号位置1,表示总电量是负数;TAEDec≥Dec时,将TAEDec减去Dec的结果存入TAEDec。
与现有技术相比,本发明的有益效果为:
上述两种算法只用到整数运算,却可以保证数字的准确和电量的精确累加,大部分的数据处理只用加法或减法就能完成。将它们应用在定点MCU中,不仅可降低计量装置的成本,而且运算速度更快;
与采用计数能量脉冲个数计算用电量的方法不同,它们不会因算法的随机执行而带来任何的读数和计算误差;
校表更加快速和精确。测试人员随时可以读取电能表计量的总电量并与标准电量比较,计算出计量误差;
依据电力公司的要求,即可以分别累加正向和反向总电量,也可计算出组合总电量。
附图说明
图1本发明提供的流程图
图2本发明提供的正反向总电量累加的流程图
图3本发明提供的各费率正反向总电量累加的第③种情况的流程图
具体实施方式
本方法要求能量寄存器必须配置成“读复位”模式,即MCU读取计数值后能量寄存器清零。这种模式使电量计数值从MCU读取的时刻起,再次从零开始计数,确保了正确的双向计量值。
(1)正反向总电量的累加
如附图2,首先判断MCU从能量寄存器中读取的计数值Reader的符号。寄存器中的数据通常都是二进制补码形式,负数则需要将其变换成原码形式,并屏蔽符号位。
其次,将计数值除以C,整数商存放在Int中,余数存放在Dec中。
若Reader为正数,则将其累加到正向总电量上。累加时,整数商和正向总电量的整数部分PEInt相加后再存入PEInt,余数和正向总电量的小数部分PEDec相加后再存入PEDec(PEInt表示正向总电量的整数部分,PEDec表示正向总电量的小数部分)。当存储后的PEDec≥C时,则需要进位。例如,当C=106时,PEDec是以106为进制向正向总电量的整数部分进位的。
若Reader为负数,反向总电量的累加方法与正向相同,只是在显示时需要加负号(NEInt表示反向总电量的整数部分,NEDec表示反向总电量的小数部分)。
值得一提的是,总电量的整数部分可以直接显示,因为其单位就是kW·h。总电量的小数部分在显示时要除以C,再取要求的位数。如上面提到的C=106,若总电量的小数部分是251044,在要求2位小数时的显示结果为.25kW·h。
(2)各费率正反向总电量的累加
各费率正反向总电量的累加比(1)要略微复杂些,总电量的累加被分成了四种情况:①Reader为负数,某费率的总电量TAEnergy为负数,其中TAEInt的符号表示已有某费率总电量的整数部分,TAEDec表示已有某费率总电量的余数部分;②Reader为负数,TAEnergy为正数;③Reader为正数,TAEnergy为负数;④Reader为正数,TAEnergy为正数。
对Reader的处理与(1)相同,得到Reader的整数和小数部分。通过判断Reader和TAEnergy的符号,确定当前的累加操作属于上述四种情况中的哪一种。
需要说明的是,在执行这个累加算法前,需要判断当前时段采用的是哪种费率,然后才能将Reader累加到相应费率的总电量上。在显示时的处理也与(1)相同。
①Reader为负数,某费率总电量TAEnergy为负数,将Reader取反码并加+1,屏蔽TAEInt与Int的符号位,将TAEInt和Int相加后存入TAEInt,同时符号位置1;余数TAEDec和Dec相加后存入TAEDec;若TAEDec≥C,则向整数部分进位,并将TAEDec-C存入TAEDec,即作为下一次累加的小数部分;
②Reader为正数,TAEnergy为正数,将TAEInt与Int直接相加后存入TAEInt,TAEDee与Dec直接相加后存入TAEDec,若TAEDec≥C,则向整数部分进位,并将TAEDec-C存入TAEDec作为下一次累加的小数部分;
③Reader为正数,TAEnergy为负数,屏蔽TAEnergy的整数部分TAEInt的符号位。比较Int和TAEInt的大小,TAEInt≥Int时,将TAEInt减去Int的值存入TAEInt,给新存入的TAEInt加上负号;比较TAEDec与Dec的大小,TAEDec<Dec时,TAEDec需要向整数部分借位,并将TAEDe+C减去Dec的值存入TAEDec中;若整数部分为零不能借位时,则用Dec减去TAEDec后存入TAEDec,并将TAEInt的符号位清零,表示总电量为正数。TAEDec≥Dec时,将TAEDec减去Dec后存入TAEDec。
TAEInt<Int时,将Int减去TAEInt的结果存入TAEInt;比较TAEDec与Dec的大小,TAEDec<Dec时,将Dec减去TAEDec后存入TAEDec。TAEDec≥Dec时,则需要向整数部分借位,将C-TAEDec+Dec的计算结果存入TAEDec。
④Reader为负数,TAEnergy为正数,将Reader取反码后加1,同时屏蔽其符号位;
比较Int和TAEInt的大小,TAEInt≥Int时,将TAEInt减去Int的结果存入TAEInt,表示总电量是正数;比较TAEDec与Dec的大小,TAEDec<Dec时,TAEDec需要向整数借位,用TAEDec+C减去Dec后存入TAEDec。若整数部分为零不能借位时,则用Dec减去TAEDec后存入TAEDec,并将TAEInt的符号位置1,表示总电量是负数;TAEDec≥Dec时,将TAEDec减去Dec的结果存入TAEDec。
TAEInt<Int时,将Int减去TAEInt的结果存入TAEInt,将新存入的TAEInt的符号位置1,表示总电量是负数;比较TAEDec与Dec的大小,TAEDec<Dec时,用Dec减去TAEDec后将结果存入TAEDec。TAEDec≥Dec时,则需向整数部分借位,将C-TAEDec+Dec的计算结果存入TAEDec。