scada历史数据查找(跨平台SCADA的历史数据收集与存储设计)
scada历史数据查找(跨平台SCADA的历史数据收集与存储设计)2 历史数据收集设计本设计采用的数据库是SQLite数据库。SQLite是微型关系型嵌入式数据库,可独立运行且无需安装和配置,运行速度块,内存占用小,API易用性强,支持大部分SQL-92标准,支持事物的ACID特性(持久性、隔离性、一致性和原子性),并且使用一个数据库文件来存储整个数据库,同一个数据库文件可以在不同应用平台上使用,代码完全开源[6]。本文研究着重点在于如何将大量的实时数据有效地存入本地SQLite数据库中,采用关键帧和变更集的两种方式进行数据收集,在数据的质量和存量方面找到平衡点,优化现有的历史数据收集存储方式。在Qt开发平台上编写程序,并且在Windows和Linux操作系统平台上进行实际验证。1 总体设计设计整体分为历史数据收集设计和历史数据存储设计。历史数据收集主要负责从国产可编程逻辑控制器(Programmable Logic Controller,PLC)中采集
随着现代化工业的不断发展,生产企业的规模越来越大,对生产过程中的安全性和稳定性要求越来越高。因此,需要对整个生产过程进行监控。将分散使用的仪器、仪表、控制器等集中起来管理,于是就产生了数据采集与监视控制系统,又称工业组态软件(Supervisory Control And Data Acquisition,SCADA)。跨平台SCADA的着重点在于系统在不同的操作系统平台之间进行移植,都能够稳定正常地运行。
组态软件是用于数据采集与过程控制的专用软件[1],是位于自动控制系统监控层一级的软件平台和开发环境中,一般由数据采集与控制信息发送、记录与趋势显示、报警记录及事件处理、报表生成和打印等部分组成。其中,历史数据的和是工业组态软件不可或缺的一部分,用于记录SCADA系统中各个控制器数据及状态值 为控制系统的故障诊断与数据分析等提供数据依据。它主要服务于设备性能的维护、故障原因的诊断以及工艺流程的改进。
理论上,历史数据是系统定时从实时数据库中采样,保存到历史数据库中的数据,用户需要时可随时从历史数据库中访问历史数据[2]。历史数据存储具有历史数据量庞大、历史数据存储的格式相对简单固定以及数据保存的时间间隔相差很大等特点[3-4]。
目前,组态软件实时数据库系统的一些主流产品一般都提供历史数据收集和存储功能,能够较长时间地保存、备份现场生产运行的过程数据。但是由于工业生产现场的采集点多、采集种类多样以及采集时间周期较短,因而要保存的历史数据量非常大。就客观而言,如果将这些数据直接存储,不仅会占用大量的系统存储空间,而且会降低数据库中数据的实时性,使数据的传输、查询变得困难。因此需要改良目前历史数据的收集和存储方式,不仅可以节省磁盘开销,同时也保证对历史数据访问的快捷性[5]。
本文研究着重点在于如何将大量的实时数据有效地存入本地SQLite数据库中,采用关键帧和变更集的两种方式进行数据收集,在数据的质量和存量方面找到平衡点,优化现有的历史数据收集存储方式。在Qt开发平台上编写程序,并且在Windows和Linux操作系统平台上进行实际验证。
1 总体设计
设计整体分为历史数据收集设计和历史数据存储设计。历史数据收集主要负责从国产可编程逻辑控制器(Programmable Logic Controller,PLC)中采集到数据并存入内存块中。历史数据存储主要负责将内存块中的数据经过一定处理加工后存入本地SQLite数据库中,以便日后查询所需。总体设计框图如图1所示。
本设计采用的数据库是SQLite数据库。SQLite是微型关系型嵌入式数据库,可独立运行且无需安装和配置,运行速度块,内存占用小,API易用性强,支持大部分SQL-92标准,支持事物的ACID特性(持久性、隔离性、一致性和原子性),并且使用一个数据库文件来存储整个数据库,同一个数据库文件可以在不同应用平台上使用,代码完全开源[6]。
2 历史数据收集设计
历史数据收集部分是上位机监控软件(SCADA)所具有功能的一部分,是位于上位机软件与国产PLC接口部分的上行方向,实现对PLC原始数据的获取、协议解析,然后将数据存入内存块中。其中,采用的数据收集方法是对死区限值压缩算法的优化,衍生出关键帧和变更集两种数据记录方式。
2.1 系统设计
历史数据收集子系统与PLC设备的数据通信方式采用有线方式,使用100 Mb/s(含)以上的以太网通过国产控制器实现对现场测控设备实时运行信息的采集,将实时协议数据解析后存储在内存块中,再提交给上位机数据处理子系统处理。
历史数据收集子系统作为上位机监控软件的内部数据源提供者,要求常年不间断运行,实时获取PLC设备运行数据,所以必须具有高度的可靠性、稳定性和扩展性,同时依据工业生产状况,也要具有强大的数据采集能力,其大致流程如图2所示。
功能说明如下:
(1)数据采集:通常采集工业生产运行设备的模拟量输入、数字量输入、脉冲量;如有需要也可以采集模拟量输出值和数字量输出值。且同时支持多个控制器、大数据量的采集。采集的数据仅仅是数值,没有状态和时间戳。采用定时机制采集数据,最小请求周期可设置为100 ms(或其整数倍)~1 s(由控制器传输量的多少决定)。
(2)协议解析:采用库方式支持各种通信协议的解析,例如自有协议、Modbus协议、OPC协议等[7],每种协议或者规约采用独立的库,实现设计要求中的扩展性需求。
(3)变更数据转发:解析后的采集数据临时被放置于数据缓冲区,一旦数据缓冲区中的数据发生了变化,即达到存储数组的最大下标值,则将变更的数据集提交给数据存储子系统,由数据存储子系统进一步对数据进行加工处理,加入状态和时间戳[8]等操作。
(4)诊断统计:诊断功能是指周期性检测控制器的主从状态(PLC有主从冗余模式:存在两个CPU模块,主CPU运行时,副CPU进行备份),采集数据和下发指令仅面向主控制器。另外诊断功能还负责与任务管理进程通信,告知其当前进程的运行状态;监察对应的通信接口工作状态,在发生故障时发出报警。统计功能指通信过程的调试记录、通信速率、传输字节数等附加功能。
2.2 数据记录
2.2.1 收集算法
收集子系统采用的算法原型是死区限值压缩算法,在其基础上进行优化设计。
死区限值压缩算法的原理是通过判断当前值偏离最后一个记录的范围是否大于死区限值,来决定是否记录此数据。如果大于死区限值,则记录该数据并以此数据为新的起点进行死区限制压缩[9]。算法图如图3所示。
设算法的门限值是T,起点A的值为V,那么点A的死区范围为区间(V-T,V T)。点A之后的点值只要没有超出死区范围就直接放弃,直到F超出死区范围,成为新的起点[10]。
死区限值压缩算法虽然能够得到不错的压缩率,但是属于有损压缩,在工业生产中,如果长期缺少某一点的数据信息是不合适的,不利于后期分析问题。所以为了确保稳定记录工业设备运行时的数据,在数据收集算法设计上,对死区限值压缩算法进行优化,在保持原有算法思想不变的基础上,增加获取关键帧的数据收集方式,定时收集全部采集点的数据信息,形成关键帧和变更集两种数据收集方式。
2.2.2 收集方式
在数据收集子系统中,为了保证数据的准确性,同时确保收集的数据量也不至于过大,系统采用两种数据收集方式:关键帧和变更集。两种方式在系统运行时,同时进行操作,互不干扰。
(1)关键帧:操作员可以设定一定时间间隔(一般是15 min),系统会每隔该时间值对所有要求收集的点信息全部记录一遍。
(2)变更集:系统内会自动识别每一时刻采集点信息的数据值是否存在变化(系统设计时,将数据变化的阈值默认设计为0)。数据如果存在变化,系统会将该点信息记录在内存缓冲区中;反之,系统将不会收集该点此时间点的信息数据值,即系统只会收集此时间点变化的采集点信息数据值。
关键帧的优势在于保证采集点信息的完整性,不会存在长时间缺失某一点信息的情况。同时,变更集的优势在于优化存储采集点信息的数据量。两种方式共同作用,优势互补,提高历史数据收集效率,将收集的数据量控制在合适的范围内。
在Qt开发平台上,采用设计原理,编写程序将两种方式结合在一起,具体流程图如图4所示。
3 历史数据存储设计
历史数据存储子系统负责对数据收集子系统收集的数据进行实时的处理和存储,目的是将数据收集子系统的“生数据”加工成“熟数据”,即转化为满足上位机系统真正需要的数据结构,并且将数据存储到历史库中,便于以后查询。
3.1 工作方式
当接收到数据收集子系统的转发模块发送来的消息通知后,系统会对数据进行处理和存储操作,大致流程如图5所示。
关键模块说明:
(1)时间戳处理:在校时子系统保证下,为待处理的数据批量打上时标,标明该批数据采集的时刻,为后来操作提供帮助。
(2)模拟量处理:具备工程量程转换、线性/非线性变换、零漂修正算法、数值死区处理等功能,每个功能可以采用模块化设计。
(3)数字量处理:具备取反功能。
(4)报警处理:检查收集的数据是否存在异常,如有异常即报警提示工作人员。
3.2 关键环节
历史数据存储系统的关键环节分为实时数据存储至内存缓冲区中和数据从内存缓冲区中转存至本地SQLite数据库两部分。
(1)第一部分
当收集子系统运行并有数据到来时,数据存储子系统会自动识别并在本地磁盘固定位置新建数据库文件。数据库文件是以此刻设备时间值为起始,以数据库文件记录结束时间值为终止的方式进行命名。在存储系统运行时,一般是以10 min的时间跨度来新建一个数据库文件。如果数据记录时间跨度不等于10 min,系统会以当时结束时间值来替换新建该数据库文件时的结束时间值。文件命名形式例如RECORD_20180130014305_20180130014510。数据库文件新建完成后,并不会立刻写入数据,而是等到有内存切换的情况,才进行写入操作。
同时,系统开辟两个内存缓冲区memA和memB,用于临时存储从收集子系统到来的数据。为了使该子系统存储和转存能够不停地进行,故生成两块内存区域:当memA存满时,系统就会自动切换到memB继续进行存储,而memA就会进行数据转存至本地数据文件的过程。对于单个点信息数据,系统采用结构体数组的形式进行存储,数组的下标是根据当前时间值经过一定数学变化来确定的,部分代码如下所示:
pst=(tsmp/(m_isMsec ?1 :1000) )/m_secCount ;
index=(tsmp/(m_isMsec?1:1000) ) %m_secCount ;
该结构体数组就是位于当前内存块的空间中,系统会设定数组的大小,当数组下标值达到设定值后,系统就会发送信号,触发响应函数,自动切换到另一块内存缓冲区中。
(2)第二部分
当存在一块内存空间存满后,系统会自动切换内存块,并利用Qt的信号和槽机制对存满的内存块进行转存至数据库操作 对另一个内存块会继续进行数据收集操作。实现的部分代码如下所示:
if(mem== memA)
{
mem= memB;
}
else
cleanCache(mem);
m_pst.position = 0;
m_pst.index = 0;
对于当前进行数据转存至数据库操作的内存块,因为其中存在模拟量和数字量数据,所以系统会进行转存哈希表、区分数据和存入数据库等处理,最后形成完整的数据文件,存在本地磁盘中。
数据库中存在两种数据文件表:模拟量和数字量,对两种数据分别进行存储,利于后期对数据库查询操作。
4 结束语
本文主要介绍关于历史数据收集和存储设计的思想、关键方法以及实现。编写的数据收集和存储系统在基于Windows和Linux操作平台的实际运行中对国产PLC的数据采集和存储操作都能正常稳定进行,性能指标都达到设计要求。
参考文献
[1] 嵇月强.工业历史数据库的研究[D].杭州:浙江大学,2007.
[2] 徐国风.实时数据库关键技术研究[D].西安:西安建筑科技大学,2006.
[3] 江勇,王文海,张龙旗.组态软件中历史数据存储与查询的一种新方法[J].江南大学学报(自然科学版),2005,4(6):579-583.
[4] 张云.组态软件中的历史数据处理过程[J].福建电脑,2010(9):81-82.
[5] 任宝强.监控组态软件实时数据库系统的设计与实现[D].保定:华北电力大学,2009.
[6] 张欣.嵌入式数据库在嵌入式设备中的研究和应用[D].成都:电子科技大学,2012.
[7] 陈骞,剑强,汪镭,等.关于OPC UA的历史数据获取[J].微型电脑应用,2010,26(2):35-37.
[8] 王凌峰,吴海鑫,陈彦彪,等.工控组态软件中数据处理的设计和实现[J].微计算机信息,2000,16(2):33-35.
[9] 陈骞.基于工业实时数据的压缩算法研究[J].科协论坛,2009(9):106-108.
[10] 金陈武.基于WoT的传感器数据管理技术[D].北京:北京邮电大学,2014.
作者信息:
钟洋洋,王毅璇,王 皓,傅一帆
(华北计算机系统工程研究所,北京100083)