世纪星的数据存储策略
2010-11-08
作者:徐向农
随着组态软件在各行业的应用越来越广泛,了解和使用组态软件的人越来越多,同时对组态软件各方面的功能要求也越来越高。
一般,组态软件在实际应用中都会用到几个基本功能,比如数据采集、实时数据展示、报警、报表等,而历史数据存储更是必不可少。通过自动记录下系统运行时的数据变化,可以对以后的事故分析,趋势统计提供必要的数据来源,大大提高系统运行的稳定性,减少出现生产事故的机会。
目前市面上组态软件种类繁多,采用的存储策略不尽相同,有采用外部数据库作为历史库,这种方式具有功能强大、运行稳定的优点,但缺点也非常很明显,运行速度慢、占用空间大、软件集成性不好等。因此很多公司都自己开发历史数据存储功能,开发的历史库不仅具有速度快、占用空间小的优点,而且保密性较好,不像通用数据库可以随便打开。
世纪星组态软件也是使用独立开发的历史库。为保证历史数据存储速度快、占用空间小,世纪星组态软件主要采用以下三种方案。
第一种是尽量减少数据存储量,从根本上降低对历史数据库的要求。
组态软件记录的数据都是现场采集上来的各种参量,比如温度、压力等,需要保存的信息包括变量标识、值和精确到毫秒的时间。为达到减小存储量的目的,世纪星采用两个方法:
一是以存储变量ID代替存储变量名,这是显而易见的道理,变量ID以4个字节表示,而变量名通常都会超过4个字节。在尽量减小存储空间的前提下,当然要选择以变量ID代替变量名进行保存。
二就是记录时间的方法,每一个变量都需要记录一个精确到毫秒的时间。时间的存储也可以有多种方式,以字符串方式保存、以一个长整数来保存等等。有些人可能不清楚如何以一个长整数来保存时间,只需要一个特定的换算方法换算一下即可。当然,以长整数来保存时间会减小存储量,这里还有一个问题,一个长整数是无法保存包括年、月、日、小时、分钟、秒、毫秒所有这些值,在世纪星中采用的办法是以日期作为历史数据文件的名称,这样在文件中的时间只要表示小时、分钟、秒、毫秒就没问题了。
第二种就是建立索引。这个方法在通用数据库中也被广泛的使用,但由于工控行业有其自己的特殊性,比如数据都是定时存储,数据在文件中的位置顺序有规律,因此这种建立索引的方法更能发挥巨大的作用。
世纪星组态软件的工程中保存两种类型的历史文件,一种以IDX结尾的索引文件,一种以LGH结尾的数据文件。在IDX文件中以分钟为最小单元,记录历史数据在LGH文件中的确定位置。查询数据时,根据使用者提供的查询时间,能够很快的在IDX文件中确定数据的确切位置,无视LGH数据文件的大小,达到快速查询的目的。
下图是数据查询时的示意图:
最后一个策略就是数据压缩。工控行业有时候需要保存的数据量很大,有时变化速率在100毫秒以内,而且需要保存的时间很长,为保存这些数据,同时确保占用空间小,就必须采用数据压缩。世纪星采用zlib库提供的压缩算法,zlib是一种可以免费使用的压缩库,压缩效果好,解压速度快。是目前比较成熟的数据压缩方法。
采用这三种方法之后,效果显而易见。经过测试,包含1w个变量的工程,其中4k个变量每200毫秒记录一次,在查询10分钟的数据时所用时间不超过200毫秒;查询4个小时的数据,查询时间不超过2秒。
在实际应用中也会发现一些不足,比如工程中变量很多,要求存储的数据量很大,这时历史文件会很大,即使有索引文件,在查询时的速度也会降低。改进的方法是可以把一个文件分成多个,比如变量ID小于5000的数据保存成一个文件,变量ID在5000到10000之间的保存成一个文件,以此类推,这样就可以减小文件的规模,从而提高查询速度。