技术领域
[0001] 本发明属于数据处理技术领域,具体是一种实时数据库实时方程式的解析系统及方法。
相关背景技术
[0002] Rython(睿腾)实时数据库是一种操纵和管理实时/历史数据的平台软件,用于建立、使用和维护实时/历史数据,对海量实时/历史数据的高效管理;因为随着科技的进步,实时数据和历史数据越来越多,数据的管理越来越困难,目前尚没有有效提高Rython实时数据库用于数据解析管理的方法系统,造成Rython实时数据库管理存在诸多问题。
具体实施方式
[0022] 为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
[0023] 如图1‑4所示,一种实时数据库实时方程式的解析系统,属于客户端/服务器模型,客户端与服务器之间采用TCP/IP协议通信;客户端应用程序通过SDK发起事务调用;具体包括:
测点信息服务模块:
负责存储和管理测点,并提供与测点有关的服务, 为实时方程式服务模块提供元数据管理;
支持组合条件查询,通过采用通配符,通过测点标签、工程单位、描述、数据源、设备标签的组合条件过滤查询结果,同时实现对查询结果的分页;
实时数据服务模块:
负责更新并存储测点的实时值、实时值的质量和实时值的时间戳,对实时值数据进行例外过滤和压缩过滤,同时提供对实时数据访问的服务;
提供数据定时存盘备份的自动功能,本申请定时默认最小为1分钟,可配置,做持久化存储备份,启动时自动读入上次存档,以提供掉电恢复等灾难恢复能力。
[0024] 历史数据服务模块:负责更新和存储测点的历史值、历史值的质量和历史值的时间戳,提供高效可靠的历史数据访问和存储服务;历史数据服务模块具体采用双向循环链表维护历史数据存档文件之间的时序关系;每个历史存档文件的大小、命名规则和最大可占用空间均由系统管理员通过系统参数预先配置,预先配置完成后入库。而所有入库数据,从进入历史数据服务模块开始,到真实存入磁盘做永固化存储,不超过规定时限。
[0025] 实时方程式服务模块:用户能够采用实时方程式服务模块对单个测点进行方程式编辑,该服务会依据方程式进行计算,并将结果存入该测点,存入该测点后生成计算的标签,从而完成实时方程的解析。
[0026] 本申请系统中采用的方程式最大容量为2035字节;测点类别包括基本测点、采集测点和计算测点,任何一个测点都具有基本测点具有的属性集;设置测点表,测点表中的每一行记录都是一个测点,而记录的测点被Rython实时数据库系统统一管理,并维护其实时数据、历史数据的更新和查询,所有测点表加载在内存中。
[0027] 根据上述的一种实时数据库实时方程式的解析系统,进行实时数据库实时方程式的解析方法,包括以下步骤:步骤1:根据存储和管理测点,实时更新并存储测点的实时值、实时值的质量和实时值的时间戳,对实时值数据进行例外过滤和压缩过滤;同时更新和存储测点的历史值、历史值的质量和历史值的时间戳;
步骤2:对单个测点进行方程式编辑,对实时数据和历史数据依据方程式进行计算,并将结果存入对应的测点,并生成计算标签,完成实时方程式的解析。
[0028] 根据参与计算的测点质量优先级,给出计算结果的质量可信度;利用快照数据服务的事件触发机制,完成事件触发即时计算;
同时支持定时触发机制,以事件触发作为定时触发先决判断条件,如果事件触发不满足,则不进行定时触发;如果表达式中有历史数据函数,则只定时触发;
在实时方程式的解析过程中,即实时方程式服务模块具备方程式自检功能,避免长度超长或格式非法的方程式进入计算环节,同时避免计算输出被作为输入重新参与计算;实时方程式服务模块能够实现计算需要的输入参数被修改(比如所需测点被删除)能够提示;
以触发时间(即计算开始时间)为计算结果的时间戳,允许用户使用输入参数的最早时间戳或最晚时间戳为计算结果的时间戳。
[0029] 系统具体支持以下如表1所示的14个操作符:表1
系统支持Π(圆周率)和e(自然常数)数字常数;支持二进制、十六进制表示。
[0030] 如果一个方程式创建时合法且有效,但在被创建后的关联测点被删除或修改,则该方程式无效;实时方程式服务模块作出调整,不再计算该方程式,并通过日志提示用户,标志该方程式对应计算点的品质为“无效”;用户通过Rython企业管理器新建或修改计算点的所有属性,包括测点的基本属性,公式字符串,触发方式和时间戳参考属性。
[0031] 计算点提交到RtdbEquation(Rython实时数据库计算点)时预校验公式合法性(表达式书写是否满足设定规则,参与计算测点是否存在,公式拆解是否出现计算死循环(即赋值表达式左边及右边有相同的变量)),校验合法方可进入计算调度,同时可以由RtdbEquation解析调度。
[0032] 运行过程中对公式中引用项的事件设有触发校验机制,输出错误质量值及错误日志;计算输出测点反送入RtdbSnapshot(Rython实时数据库快照);如图2所示:
实时方程式服务模块中的实时方程式(equation)用于自动计算标签,如有发电机组A、B、C的功率标签PA、PB、PC,建一个名为PAVG的计算标签来统计三台机组的平均功率。
[0033] 它的方程式可表示如下:PAVG=(PA+PB+PC)/3
如果PA、PB、PC没有变化,PAVG也不需要更新;当其中任何一个发生了变化,PAVG则进行计算,并写一条计算结果的记录。
[0034] 由一个计算标签引用于若干个采集标签:进一步分析需求,发电机组A的功率PA常常不是一个采集标签,即是通过其它一些采集量计算得到的,如机组A的输出电压UA、输出电流IA,因此实际上它是一个计算标签,方程式可表示如下:PA=UA*IA
这样一来,PA既是计算输出(由UA、IA计算得),也是计算输入(用来计算PAVG),则一个计算标签可以引用另一个计算标签,从而形成任意复杂的层次结构,采用表格形式对测点进行分组,一个实时数据库可以有很多表,表中包含不同种类的测点,数据库管理的所有标签点统称测点,包括采集点,计算点及其他种类的点。例如表2中的标签:
表2
标签名 标签类别 方程式
tage1 采集标签
tage2 采集标签
tage3 采集标签
tage4 采集标签
catg1 计算标签 tage1+tage2
catg2 计算标签 tage3+tage4
catg3 计算标签 catg1+catg2
catg4 计算标签 tage4+catg2
catg5 计算标签 catg3+1
catg6 计算标签 catg5+tage1
catg7 计算标签 catg5+catg2
catg8 计算标签 catg3+catg4
其中tageXXX表示采集标签,catgeXXX表示计算标签,它们形成的依赖关系如图3所示:
可以看到这种层次结构并不是树,树只有一个根,而上图中有多个“根”:catg6、catg7、catg8。
[0035] 在目前的equation实现中,如果计算标签引用了另一个计算标签,则它在解析时会进行方程式展开,将计算标签变量代换为它自己的方程式,这个过程递归进行,最终全部引用采集标签;如,上面的方程式进行这样的变换后就变成表3所示:
表3
标签名 标签类别 方程式
tage1 采集标签
tage2 采集标签
tage3 采集标签
tage4 采集标签
catg1 计算标签 tage1+tage2
catg2 计算标签 tage3+tage4
catg3 计算标签 tage1+tage2+ tage3+tage4
catg4 计算标签 tage4+ tage3+tage4
catg5 计算标签 tage1+tage2+ tage3+tage4+1
catg6 计算标签 tage1+tage2+ tage3+tage4+1+tage1
catg7 计算标签 tage1+tage2+ tage3+tage4+1+ tage3+tage4
catg8 计算标签 tage1+tage2+ tage3+tage4+tage4+tage3+tage4
这样做的好处之一就是简化了依赖关系,计算标签在计算时不用考虑先后次序,但会带来性能上的问题,如下面的例子:
expr标签是一个公共子表达式,它本身由众多采集标签计算得到,而又被众多计算标签引用,如果对每个计算标签进行展开代换,那么expr的计算结果将会被无效率的计算多次,影响计算的性能;
考虑到这一点,须处理计算标签的计算顺序问题,如在图3中,当标签tage1发生变化时,首先应计算catg1,并缓存计算结果,再依次计算catg3、catg5、catg6、catg7,如果先计算catg7,则它引用的catg6还没有进行计算,缓存中没有值或是上一次的计算结果,就会导致catg7计算时使用了无效的数据,计算结果自然就是不正确的;
为了反映计算标签的计算层次,通过标识各个计算标签的优先级(precedence),它可以描述如下:
采集标签的优先级定为1;
计算标签的优先级定为它直接引用的所有标签的优先级之和再加1;
以图3为例,加入优先级后如4所示,图4中标签右下角所示的是标签优先级的计算过程及结果,之后按优先级从小到大排序得到如表4所示的计算顺序:
表4
标签 catg1 Catg2 Catg4 Catg3 Catg5 Catg6 Catg7 Catg8
优先级 3 3 5 7 8 10 12 13
可以看到,按这样的顺序进行计算是不会有问题的,上述算法保证了在一棵计算树内(如以catg6为根形成的计算树catg1、catg2、catg3、catg5、catg6),节点按其深度排序,保证由叶节点向根节点进行计算;而在不同的计算树之间,非交叉部分是互不影响的,例如catg8与catg6谁先谁后都可以,这里由于catg8具有更大的优先级,故位于catg6之后。
有了计算顺序,标签就可以按从下向上的顺序,依次进行计算,将结果写入记录并缓存,并向下一级计算标签提供输入(由缓存)。此时expr只被计算一次,catgXXX的计算每次从expr中直接取得中间结果,不必再对expr的方程式求解一遍。
[0036] SDK:(Software Development Kit)是一组编程工具;包括例程代码、支持文件和工具,支持标准API和COM组件。
[0037] REM:(Rython Enterprise Management Tools)企业管理器,是Rython实时数据库的客户端管理工具。
[0038] Rython实时数据库:是一种操纵和管理实时/历史数据的平台软件,用于建立、使用和维护实时/历史数据,对海量实时/历史数据的高效管理。
[0039] 测点:Rython实时数据库中最小的存储对象。
[0040] 镜像:是一种Rython实时数据库复制机制,自动同步系统中镜像或冗余数据库的数据。
[0041] 时间戳:测点值时间属性。
[0042] 快照值:测点的最新值。
[0043] 上述公式均是去除量纲取其数值计算。
[0044] 在本发明所提供的实施例中,应该理解到,所揭露的设备,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式;所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方法的目的。
[0045] 另对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。
[0046] 因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附关联图标记视为限制所涉及的权利要求。
[0047] 最后应说明的是,以上实施例仅用以说明本发明的技术方法而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方法进行修改或等同替换,而不脱离本发明技术方法的精神和范围。