一种历史数据存储及索引方法
技术领域
本发明涉及数据存储技术领域,尤其涉及一种历史数据存储及索引方法。
背景技术
对于很多数据采集设备都需要具有历史数据的存储及索引查找功能,用于历史数据的恢复,方便使用者查询之前设备的数据采集信息,在某些情况下服务器数据丢失后可通过历史数据的恢复调用完成数据分析。现有历史数据存储及索引方法较复杂,占用MCU的RAM空间和ROM空间较大,对MCU的要求比较高,且存储时间和索引时间较长。
发明内容
本发明的目的是克服现有历史数据存储及索引方法对MCU的RAM和ROM要求高,提高了MCU成本的技术问题,提供了一种简单的历史数据存储及索引方法,其占用MCU的RAM和ROM很小,适用于RAM和ROM较小的MCU,降低了MCU成本,缩短了编程人员的项目开发时间。
本发明的一种历史数据存储方法,包括以下步骤:
S1:获取当前存储数据的时刻为A年B月C日D时;
S2:将A数值代入公式:E=A-4×N,N=0,1,2,3,4……,2000≤E≤2003,计算得到E,计算出2000年1月1日0时到E年B月C日D时之间的小时数b,从而得到存储小时变量b;
S3:计算出该时刻数据存储的物理地址的首地址= a+ b×c,a为存储芯片的存储基地址,b为存储小时变量,c为预设的每小时存储数据量的上限值;
S4:将该时刻需要存储的数据依次存储在存储芯片物理地址(a+ b×c)至【a+b×c+(c-1)】内。
在本技术方案中,该方法支持连续4年的历史小时数据存储和索引,每四年进行一次循环存储。以2000年、2001年、2002年、2003年作为一个循环,2004年、2005年、2006年、2007年作为下一个循环,以此类推。2000≤E≤2003,其中,2000年为闰年,2001年、2002年和2003年都为平年,2000年2月的天数为29,2001年2月、2002年2月和2003年2月的天数为28,2000年的全年小时数为8784,2001年、2002年和2003年的全年小时数都为8760。该方法按照时间确定存储地址,每四年进行一次循环存储,简单高效,缩短了历史数据的存储时间和索引时间,对应的程序小,使用的变量少,占用MCU的RAM和ROM很小,适用于RAM和ROM较小的MCU,降低了MCU成本。
作为优选,所述步骤S2中计算2000年1月1日0时到E年B月C日D时之间的小时数b的方法包括以下步骤:将2000年至E-1年中每年的小时数相加得到b1,将E年1月至E年B-1月中每月的小时数相加得到b2,将E年B月1日至E年B月C-1日中每日的小时数相加得到b3,计算出存储小时变量b= b1+ b2+ b3+D。
作为优选,所述存储芯片为外部FLASH芯片或SD卡。
作为优选,所述存储基地址为存储芯片的首地址或预设的存储芯片物理地址。
本发明的一种历史数据索引方法,包括以下步骤:
N1:获取一个索引请求,其包含索引的历史数据的存储时间为A年B月C日D时;
N2:将A数值代入公式:E=A-4×N,N=0,1,2,3,4……,2000≤E≤2003,计算得到E,计算出2000年1月1日0时到E年B月C日D时之间的小时数b,从而得到存储小时变量b;
N3:计算出该数据存储的物理地址的首地址= a+b×c,a为存储芯片的存储基地址,b为存储小时变量,c为预设的每小时存储数据量的上限值;
N4:确定索引的历史数据依次存储在存储芯片物理地址(a+ b×c)至【a+b×c+(c-1)】内,并将这些物理地址内存储的数据提取出来。
本发明的实质性效果是:按照时间确定存储地址,每四年进行一次循环存储,简单高效,缩短了历史数据的存储时间和索引时间,对应的程序小,使用的变量少,占用MCU的RAM和ROM很小,适用于RAM和ROM较小的MCU,降低了MCU成本(大RAM、ROM的MCU成本较高),减小了存储模块的开发难度。
附图说明
图1是本发明的历史数据存储方法的流程图;
图2是本发明的历史数据索引方法的流程图。
具体实施方式
下面通过实施例,并结合附图,对本发明的技术方案作进一步具体的说明。
实施例:本实施例的一种历史数据存储方法,如图1所示,包括以下步骤:
S1:获取当前存储数据的时刻为A年B月C日D时;
S2:将A数值代入公式:E=A-4×N,N=0,1,2,3,4……,2000≤E≤2003,计算得到E,计算出2000年1月1日0时到E年B月C日D时之间的小时数b,从而得到存储小时变量b;
S3:计算出该时刻数据存储的物理地址的首地址= a+ b×c,a为存储芯片的存储基地址,b为存储小时变量,c为预设的每小时存储数据量的上限值;
S4:将该时刻需要存储的数据依次存储在存储芯片物理地址(a+ b×c)至【a+b×c+(c-1)】内。
步骤S2中计算2000年1月1日0时到E年B月C日D时之间的小时数b的方法包括以下步骤:将2000年至E-1年中每年的小时数相加得到b1,将E年1月至E年B-1月中每月的小时数相加得到b2,将E年B月1日至E年B月C-1日中每日的小时数相加得到b3,计算出存储小时变量b= b1+ b2+ b3+D。
该方法支持连续4年的历史小时数据存储和索引,每四年进行一次循环存储。先将A数值循环减4,直到得到的数值大于等于2000小于等于2003,该得到的数值为E。以2000年、2001年、2002年、2003年作为一个循环,2004年、2005年、2006年、2007年作为下一个循环,以此类推。2000≤E≤2003,其中,2000年为闰年,2001年、2002年和2003年都为平年,2000年2月的天数为29,2001年2月、2002年2月和2003年2月的天数为28,2000年的全年小时数为8784,2001年、2002年和2003年的全年小时数都为8760。该方法按照时间确定存储地址,每四年进行一次循环存储,简单高效,缩短了历史数据的存储时间和索引时间,对应的程序小,使用的变量少,占用MCU的RAM和ROM很小,适用于RAM和ROM较小的MCU,降低了MCU成本。
以16Mbit的外部FLASH芯片为存储芯片,该存储芯片的存储基地址为0x030000,设定每小时存储数据量的上限值为30字节,对2014年8月8日8点的历史数据进行存储。
将A=2014代入公式:E=A-4×N,N=0,1,2,3,4……,2000≤E≤2003,计算得到E=2002。计算出2000年1月1日0时到2002年1月1日0时之间的小时数b1=8784+8760,2002年1月1日0时到2002年8月1日0时的小时数b2=(31+28+31+30+31+30+31)*24=5088,2002年8月1日0时到2002年8月8日0时的小时数b3=7*24=168,从而得到存储小时变量b=8784+8760+5088+168+8=22808,计算出该时刻数据存储的物理地址的首地址= 0x030000+22808*30=0xD70D0。将该时刻需要存储的数据依次存储在存储芯片物理地址0xD70D0至0xD70ED内。
本实施例的一种基于上述历史数据存储方法的历史数据索引方法,包括以下步骤:
N1:获取一个索引请求,其包含索引的历史数据的存储时间为A年B月C日D时;
N2:将A数值代入公式:E=A-4×N,N=0,1,2,3,4……,2000≤E≤2003,计算得到E,计算出2000年1月1日0时到E年B月C日D时之间的小时数b,从而得到存储小时变量b;
N3:计算出该数据存储的物理地址的首地址= a+b×c,a为存储芯片的存储基地址,b为存储小时变量,c为预设的每小时存储数据量的上限值;
N4:确定索引的历史数据依次存储在存储芯片物理地址(a+ b×c)至【a+b×c+(c-1)】内,并将这些物理地址内存储的数据提取出来。
索引2014年8月8日8点存储的历史数据。将A=2014代入公式:E=A-4×N,N=0,1,2,3,4……,2000≤E≤2003,计算得到E=2002。计算出2000年1月1日0时2002年8月8日0时的小时数b=8784+8760+5088+168+8=22808,计算出该时刻数据存储的物理地址的首地址=0x030000+22808*30=0xD70D0。将存储芯片物理地址0xD70D0至0xD70ED内的数据提取出来。