发明内容
发明目的:本发明的第一目的为提供一种扩展性好、交互效率高、安全的基于消息机制的调度历史数据共享系统,本发明的第二目的为提供利用该调度历史数据共享系统的基于消息机制的调度历史数据共享方法。
技术方案:本发明的基于消息机制的调度历史数据共享系统,包括调度自动化系统、消息队列集群和电网综合监测运维系统;调度自动化系统向消息队列集群发送特定类型的历史数据或量测模型数据;电网综合监测运维系统从消息队列集群订阅所需的历史数据或量测模型数据。
进一步地,调度自动化系统包括非存量历史数据服务、存量历史数据服务、量测模型数据服务、时序数据库和关系数据库;电网综合监测运维系统包括设备在线监测系统、电量电能管理系统、运维自动化系统和电网仿真培训系统,非存量历史数据服务监测到量测实时值发生变化时,获取当前系统时间并存储到时序数据库,同时发送变化的量测实时值到消息队列集群;存量历史数据服务在从消息队列集群收到电网综合监测运维系统的数据请求时,根据请求数据类型和时段,在时序数据库中查到结果后,发送查询结果到消息队列集群;量测模型数据服务从关系数据库中查询量测模型数据后,发送查询结果到消息队列集群。
优选的,非存量历史数据服务包括模拟量历史数据服务单元、状态量历史数据服务单元和累计量历史数据服务单元;存量历史数据服务提供模拟量、状态量、累计量在时序数据库中已经采集存储的历史数据的查询;量测模型数据服务提供模拟量、状态量、累计量在关系数据库中已存在全部记录的信息查询,采用定期或触发方式发送。
进一步地,模拟量历史数据服务单元负责发送模拟量变化数据到消息队列集群;状态量历史数据服务单元负责发送状态量变化数据到消息队列集群;累计量历史数据服务单元负责发送累计量变化数据到消息队列集群。
优选的,模拟量、状态量、累计量的原始值分别来自于Scada应用Scadamdl库Analog、Status和Accumulator;存量数据来自于时序数据库中已存在的AnalogTsdb、StatusTsdb和AccumulatorTsdb;量测模型数据来自于关系数据库中的HISMODEL_DICTIONARY、HISMODEL_OBJECT_IDKEY;模拟量、状态量、累计量、存量及量测模型数据作为5种不同类别特征的消息,对应5个Topic,分别为AnalogMes、StatusMes、AccumulatorMes、StockMes和MeasModelMes。
本发明的基于消息机制的调度历史数据共享方法,利用基于消息机制的调度历史数据共享系统,包括以下步骤:
(1)监测实时数据的变化或者接受存量数据的请求消息;
(2)监测到实时变化数据后存储到时序数据库,并且进行消息组装后发送到消息队列集群;
(3)接受到存量数据请求消息后查询时序数据库,并且进行消息组装后发送到消息队列集群;
(4)定期扫描关系数据库中量测模型数据对象表,当到达设定周期或者检测到模型发生变化时组装查询结果后发送到消息队列集群。
进一步地,时序数据库为PCS-9000时间序列数据库管理系统;消息队列集群为Kafka集群,由Kafka实例组成。
有益效果:与现有技术相比,本发明具有如下显著优点:对调度自动化系统中的各类历史数据,提供了基于标准消息订阅的实时发布服务;相对于传统的历史数据共享方式,本发明基于异步通信实现服务双方解耦,保证了高扩展性和灵活性,提供数据冗余的同时大幅提升峰值处理能力。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。
如图1所示,本发明提供了一种基于消息机制的调度历史数据共享系统,包括调度自动化系统、消息队列集群、电网综合监测运维系统;调度自动化系统作为消息生产者,负责向消息队列集群发送特定类型的历史数据或量测模型数据;电网综合监测运维系统作为消息消费者,负责从消息队列集群订阅所需的历史数据或量测模型数据。
调度自动化系统包括非存量历史数据服务、存量历史数据服务、量测模型数据服务、时序数据库、关系数据库;电网综合监测运维系统包括设备在线监测系统、电量电能管理系统、运维自动化系统、电网仿真培训系统。
非存量历史数据服务监测到量测实时值发生变化,获取系统当前时间,存储到时序数据库,同时发送变化的数据到消息队列集群;实时值发生变化的标准对于不同的量测数据类型是不同的,如果是浮点数,当值变化超过设定的阈值认为发生变化,如果是整型,当本次值与上次值不一样认为发生变化,如果是BitContainer类型,当BitContainer中任意一位状态发生变化认为BitContainer的值发生变化。
存量历史数据服务在从消息队列集群收到电网综合监测运维系统的数据请求时,根据请求数据类型和时段,在时序数据库中查到结果后,发送查询结果到消息队列集群;数据请求的内容包括数据类型值组合,为模拟量、状态量、累计量或者任意组合,值的个数范围为1~3,不同类型值之间用符号&连接;每种数据类型对应有数据类型值、开始时间、结束时间、量测列表四个信息,其中量测列表为空则表示获取所有量测的数据;查询结果的内容组织成消息分为消息头、消息体,其中消息头包括消息总长度、记录总数目、发送时标、发送节点字节序,消息体有1~3个消息体子头和消息体子内容的集合。消息体子头包括子数据类型、子记录总长度、子记录总数目,消息体子内容为对应数据类型查询记录结果的集合,包括编码、时间、值的循环组合,格式为编码1,时间1,值1到编码t,时间t,值t;量测模型数据服务从关系数据库中查询量测模型数据后,发送查询结果到消息队列集群,查询结果的消息体内容为量测编码、量测类型、量测名称、量测路径、量测所属大类、量测是否有效等内容的集合。
非存量历史数据服务包括模拟量历史数据服务单元、状态量历史数据服务单元、累计量历史数据服务单元;存量历史数据服务提供模拟量、状态量、累计量在时序数据库中已经采集存储的历史数据的查询;量测模型数据服务提供模拟量、状态量、累计量在关系数据库中已存在全部记录的信息查询,采用定期或触发方式发送,定时发送时间设置为每日零点,触发方式为收到实时库的装库通知消息或者主动扫描到与上次内存中缓存的量测记录发生增、删、改的情况后进行主动发送,两种方式发送的都是量测模型的完整数据。
模拟量历史数据服务单元负责发送模拟量变化数据到消息队列集群,假定模拟量实时表有k个量测发生实时值变化,模拟量对应的消息体内容为:编码1~k,时间1~k,值1~k;状态量历史数据服务单元负责发送状态量变化数据到消息队列集群,假定状态量实时表有m个量测发生实时状态变化,状态量对应的消息体内容为:编码1~m,时间1~m,值1~m;累计量历史数据服务单元负责发送累计量变化数据到消息队列集群,假定累计量实时表有n个量测发生实时值变化,累计量对应的消息体内容为:编码1~n,时间1~n,值1~n。
模拟量、状态量、累计量的原始值分别来自于Scada应用Scadamdl库Analog表、Status表、Accumulator表,单应用单库单表情况下其可容纳极限标准点数分别为200000、120000、16000,不同地区层次的调度项目,涉及到网调、省调、地调、县调等,如果无法满足现场运营需求,未投运现场扩充单表容量,已投运现场扩充Scada应用个数以支持处理更多接入子站,处理更大规模的数据量;模拟量包括电压、电流、有功、无功、档位、档位、频率、绕温、油温、负荷有功总加、负荷无功总加、发电有功总加、发电无功总加、其他;状态量包括开关刀闸位置、远方就地信号、保护动作、全厂事故总、电压等级事故总、间隔事故总、全厂偷跳、电压等级偷跳、间隔偷跳、其他状态量;量测模型数据来自于关系数据库中的HISMODEL_DICTIONARY、HISMODEL_OBJECT_IDKEY等对象表,其中HISMODEL_DICTIONARY包括记录编码(ATTR_OID)、名称(NAME)、实时库应用名(APP_NAME)、实时库名(SDB_NAME)、实时表名(CLASS_NAME)、数据分类(DATA_TYPE)、是否有效(IS_VALID)等属性,HISMODEL_OBJECT_IDKEY包括记录编码(ATTR_OID),量测对象编码(ATTR_OID)、类型(MEAS_DESC)、名称(NAME)、路径(PATH)、所属大类(DICTIONARY_ATTR_OID)、是否有效(IS_VALID)等属性,其中DICTIONARY_ATTR_OID为HISMODEL_DICTIONARY的ATTR_OID列的外键,用来获取量测所属的数据分类;模拟量、状态量、累计量、存量等历史数据及量测模型数据等作为5种不同类别特征的消息,对应5个Topic,分别为AnalogMes、StatusMes、AccumulatorMes、StockMes,MeasModelMes;Topic的具体格式为事件分配号_系统编号_应用_子应用_事件类型_副本因子_分区数,5种消息格式分别为:
EVENTKAFKA_EMS_HIS_HANA_ANALOGMES_2_8,
EVENTKAFKA_EMS_HIS_HSTA_STATUSMES_2_6,
EVENTKAFKA_EMS_HIS_HACC_ACCUMULATORMES_2_4,
EVENTKAFKA_EMS_HIS_HSTO_STOCKMES_2_6,
存量数据来自于时序数据库中已经存在的AnalogTsdb、StatusTsdb、AccumulatorTsdb等数据表;数据表的记录包括时间戳Time、数据Field、标签Tags组成,其中Time是每个数据记录时间,是主索引。Field记录了各域,标记了实时的表的值,AnalogTsdb采用实时库Analog表的Value域,类型为Float;StatusTsdb采用实时库Status表的Value域,类型为BitContainer,包含了分Open、合Close、无效Invalid、不更新OldData、人工置数SetData等属性;AccumulatorTsdb采用实时库Accumulator表的Value域,类型为ULongLong。Tags设置为存储量测的编码,对应了实时库表的Attr_oid域,类型为OID,由三部分组成:
I_seg_sub,类型为ULong,表示在对应类索引段中的下标;
Db_class_id,类型为UShort,表示本索引对象,向的数据对象的类标识;
I_seg_no,类型为UShort,表示到目前为止本索引对象位置被使用过多少次。
第二方面,本发明提供了一种基于消息机制的调度历史数据共享方法,包括以下步骤:
(1)非存量历史数据服务监测实时数据的变化或者存量历史数据服务接受存量数据的请求消息;
(2)非存量历史数据服务监测到负责的相关量测数据发送实时变化时,按照数据表的记录格式存储到时序数据库,并且按照约定规范的消息格式组装后发送到消息队列集群;
(3)存量历史数据服务接受到存量数据的请求消息后查询时序数据库的相关表,并且按照约定规范的消息格式组装后发送到消息队列集群。
(4)量测模型数据服务循环扫描关系数据库中量测模型数据对象表,当到达设定周期或者检测到模型发生变化时按照约定规范的消息格式组装查询结果后发送到消息队列集群。
时序数据库为PCS-9000时间序列数据库管理系统,关系数据库为南瑞继保安全数据库管理系统;消息队列集群为Kafka集群,由Kafka实例组成,使用Kafka自带的Zookeeper管理集群;ZooKeeper用于协调服务器或集群拓扑,将拓扑更改发送给Kafka,当集群中的某台服务器宕机或某个Topic被添加、删除时,集群中的每个节点都可以知道新服务器何时加入,ZooKeeper提供Kafka Cluster配置的同步视图。