法律状态公告日
法律状态信息
法律状态
2019-05-21
未缴年费专利权终止 IPC(主分类):G06Q50/06 授权公告日:20160615 终止日期:20180531 申请日:20130531
专利权的终止
2016-06-15
授权
授权
2013-10-30
实质审查的生效 IPC(主分类):G06Q50/06 申请日:20130531
实质审查的生效
2013-09-25
公开
公开
技术领域
本发明属于电力系统中电网网络的损耗分析与节能减排技术领域,特别涉及在线理论 网损计算中不同时间周期的网损电量的计算方法。
背景技术
电能是由一次能源转换而得到的二次能源,可以转化为机械能、热能、磁能等。随着 社会的发展,电能己经成为国民民经济发展的命脉,其应用己深入到生产、生活的各个领 域。随着电网输送电量的迅猛增长,电网有功损耗(以下简称网损)也随之大幅度增长。 以2007年为例,中国全年发电量约3.3万亿千瓦时,输配电网的网损率平均约7%,仅网 损一项,中国每年损失电量达2300亿千瓦时,相当于多消耗标准煤0.9亿吨,多排放CO2约2亿吨。如何通过以最小的电能损耗获取最大的经济效益,实现电网的网损降低和节能 减排,意义十分重大。
电力网在输送和分配电能的过程中,由于输电设备存在着电阻,在电流流过时,就会 产生一定数量的有功功率损耗,在给定的时段(日、月、季、年)内,各电网设备中所消耗 的全部有功电量称为网损电量,一般包括线路设备所消耗的有功电量(简称线损)和变压 器设备所消耗的有功电量(简称变损)。对于管理电能输送的电网企业,例如各个省、市 级电网公司,虽然电网在物理上整体连接在一起,但是各电网公司所管辖的电网只是整个 电网的一部分,或者按照地域进行划分,或者按照电压等级进行划分,各个电网公司所管 辖的电网设备范围之间均规定了明确的边界位置。同样,电网企业和发电企业所管理的电 网设备范围也有明确的边界。各电网公司在计量计算电网的有功网损电量时,只计量计算 本公司管辖范围内的设备在传输电能时引起网损。
电网网损的种类从计算方式上划分,可以分为计量网损、理论网损二类。计量网损是 根据电能表指示数计算出来的,是参与网损计量计算的电网范围在给定的时段内全部流入 电量(即上网电量)与流出电量(即下网电量)的差值。理论网损是根据掌握的电网结构 参数和运行参数,运用电工原理和电学中的理论,将管辖范围中所包含各输电设备的电压、 电流以及对应的网损电量计算出来,这样计算得到的网损称之为理论网损,电网的理论网 损即为管辖范围内包含的全部电气设备的理论网损之和。
计量网损基于电量数据采集系统,一般情况下出于节约成本的考虑,电网公司仅在所 管辖电网范围的边界设备处安装电能表计,因此计量网损只能给出总的网损数值,无法对 电网内各元件的网损进行分别的计算和分析。理论网损计算分析可以给出管辖电网范围内 精确各元件网损和网损分布情况,如果结合电网实时的运行方式,实现在线理论网损分析 计算,则可以很好地弥补计量网损的缺陷。
在电网理论网损在线实时计算方面,李碧君在文献《实时计算输变电系统的理论线损》 (华中电力,1993年,第6卷第2期,67-69页)中进行了研究,提出了一种基于电网监 控系统进行实时理论网损计算的方法,该文中提出的理论网损计算式为:
其中:
ΔA:管辖电网的全部网损电量,单位:千瓦时
m:管辖电网中包含的消耗有功电量的总设备个数,包括线路和变压器
n:计算的总时段个数
ΔPij:第i个设备在第j个时段内平均消耗的有功潮流,单位:千瓦
第j个计算时段的时长,也是在线理论网损计算的时间周期,单位:小时
在该文中,式(1)中的ΔPij采用电网监控系统系统提供的输电设备实时有功潮流量测 值进行计算,既包括线路设备也包括变压器设备,从而实现了电网在线理论网损计算。许 汉平、侯进峰等在《基于状态估计数据的电网线损理论计算方法》(电网技术,2003年, 第27卷第3期,59-62页)中,进一步发展了电网在线理论线损计算的方法,提出采用电 网实时状态估计计算得到的设备有功潮流值计算ΔPij,由于状态估计计算结果可以排除量 测数据中的坏数据,因此可以得到更准确的理论网损计算结果;李旭阳、邢波在《实时理 论线损计算分析系统的实现》(电力信息化,2007年,第5卷第10期,63-65页)中提出 根据电网实时潮流计算得到的设备有功潮流值计算ΔPij的方法,也是对电网在线理论网损 计算方法的进一步完善。
上述文献中涉及到电网实时状态估计计算,于尔铿在著作《电力系统状态估计》(北 京:水利电力出版社,1985年)中进行了论述,电网实时状态估计是基于电网状态监控系 统采集到的具有冗余度的设备量测值,自动排除错误的量测值并计算电网实时运行状态的 在线计算程序。涉及到实时潮流计算,何仰赞、温增银等在《电力系统分析(第三版)》(湖 北:华中科技大学出版社,2002年)中进行了论述,是根据发电和负荷计算电网各元件的 有功、无功潮流的在线计算程序。
采用上述在线理论网损计算,一方面可以实时计算得到电网公司所关注的管辖范围内 的总的理论网损,另一方面可以得到完整的网损分布,即总网损产生的原因和组成。这对 电网公司制定降低网损的调度决策非常有意义,可以将设备按照网损大小进行排序,通过 调整电网运行方式,减少高网损设备上输送的电网有功潮流,从而有效降低电网网损。
采用上述方法,可以得到任意给定n个时段的理论网损电量计算结果。在实际的应用 中,电网运行管理人员往往更关心各种特定时间周期的网损电量计量结果,主要包括每日、 每月、每年的总网损电量计量值。目前的在线理论网损分析软件中,对各种周期的网损电 量计量多采用离线计算的方法,其方法是:在线计算程序将每个计算时段Δtj的电网理论 网损ΔAj存入历史数据库中,需要计量时,人工输入日、月、年的起始和终止时间,软件 进行计算并给出结果。采用这种方法,计算时间长,并且无法实时在线看到当前日、当月、 当年的网损电量的实时变化情况,无法为降低网损提供详细、丰富的基础数据,极大程度 上影响了节能减排效果。从已公开的文献来看,还没有更好的方法能够解决该问题。
本申请的内容涉及到关系数据库的表、字段(列)、记录(行)、SQL指令以及触发器 技术。触发器是关系数据库软件为应用程序开发人员及数据库分析人员提供的保证数据完 整性的一种重要的方法。触发器是存储过程的特殊类型,它在对表进行插入、修改或删除 操作时执行,触发器是后过滤器,它在数据修改通过所有规则、缺省值之后才执行。如果 触发器请求失败,将拒绝修改信息,并返回错误信息。关系数据库的表、字段、记录、SQL 指令以及触发器的详细介绍参见Steven Feuerstein等在著作《Oracle PL/SQL程序设计(第 5版)》(北京:人民邮电出版社,2011年)。
发明内容
本发明的目的是为克服已有技术的不足之处,提供一种基于数据库嵌套触发器的理论 网损电量自动计量的方法,该方法能够根据理论网损电量计算方法在每个计算时段给出的 网损电量,实时自动计量小时、日、月、年等各种时段的计量电量,用户不需要进行任何 人工操作,就可以得到各种时段的网损电量计量结果,从而协助电网公司及时发现高网损 的线路、变压器等,制定科学的降低网损的方法。
本发明提出基于数据库嵌套触发器的理论网损电量自动计量方法,该方法包括:事先 确定理论网损计算的周期Δt,(一般该计算周期为1分钟到5分钟不等),具体包括以下步 骤:
1)建立存储每个单位时段Δt的电网理论网损电量计算值的历史数据表Hseg,该表中 的字段包括每个单位时段Δt的起始时刻值tj,以及该单位时段的网损电量计算值ΔAsge.j, 该表中的记录以(tj,ΔAseg.j)表示,且tj+1=tj+Δt;
2)建立分别存储日、月、年计量网损电量计量值的历史数据表,分别为:Hday、Hmon、 Hyear,表中的字段包括每个计量时段的起始时刻值td、tm、ty,以及该时段的网损电量 计量值ΔAday.d、ΔAmon.m、ΔAyear.y,表中的记录分别以(td,ΔAday.d)、(tm,ΔAmon.m)、 (ty,ΔAyear.y)表示;
3)在历史数据表Hseg上定义第一触发器,用于在表Hseg中有新的记录插入或记录更 新时被触发,其具体实现如下:
3.1)当表Hseg中有新数据(tj,ΔAseg.j)插入时,第一触发器根据tj值确定其所属的日 期的起始时刻td,从表Hday中读出td对应的ΔAday.d,计算新的网损电量 ΔA′day.d=Aday.d+ΔAseg.j,将Hday表中td对应的值更新为ΔA′day.d;如果Hday表中td时刻的 记录不存在,则令ΔA′day.d=ΔAseg.j后向Hday表中插入新记录(td,ΔA′day.d);
3.2)当表Hseg中tj对应的数据ΔAseg.j更新为ΔAs′eg.j时第一触发器根据tj值确定其所 属的日期的起始时刻td,从表Hday中读出td对应的ΔAday.d,计算 ΔA′day.d=ΔAday.d-ΔAseg.j+ΔAs′eg.j,将Hday表中td对应的值更新为ΔA′day.d,如果Hday表中td时刻的记录不存在,则令ΔA′day.d=ΔAs′eg.j后向Hday表中插入新记录(td,ΔA′day.d);
4)在表Hday上定义第二触发器,用于在表Hday中有新的记录插入或记录更新时被触 发,其具体实现为:
4.1)当表Hday中有新数据(td,ΔAday.d)插入时,第二触发器根据td值确定其所属的月 份的起始时刻tm,从表Hmon中读出tm对应的ΔAmon.m,计算ΔA′mon.m=Amon.m+ΔAday.d,将Hmon表中tm对应的值更新为ΔA′mon.m;如果Hmon表中tm时刻的记录不存在,则令ΔA′mon.m=ΔAday.y后向Hmon表中插入新记录(tm,ΔA′mon.m);
4.2)当表Hday中td对应的数据ΔAday.d更新为ΔA′day.d时第二触发器根据td值确定其所属 的月份的起始时刻tm,从表Hmon中读出tm对应的ΔAmon.m,计算 ΔA′mon.m=Amon.m-ΔAday.d+ΔA′day.d,将表Hmon中tm对应的值更新为ΔA′mon.m,如果Hmon表中tm时刻的记录不存在,则令ΔA′mon.m=ΔA′day.y后向Hmon表中插入新记录(tm,ΔA′mon.m);
5)在表Hmon上定义第三触发器,用于在表Hmon中有新的记录插入或记录更新时被触 发,其具体实现为:
5.1)当表Hmon中有新数据(tm,ΔAmon.m)插入时,第三触发器根据tm值确定其所属的年 份的起始时刻ty,从表Hyear中读出ty对应的ΔAyear.y,计算ΔA′year.y=Ayear.y+ΔAmon.m,将Hyear表中ty对应的值更新为ΔA′year.y;如果Hyear表中ty时刻的记录不存在,则令ΔA′year.y=ΔAmon.m后向Hyear表中插入新记录(ty,ΔA′year.y);
5.2)当表Hmon中tm对应的数据ΔAmon.m更新为ΔA′mon.m时第三触发器根据tm值确定其所 属的年份的起始时刻ty,从表Hyear中读出ty对应的ΔAyear.y,计算 ΔA′year.y=Ayear.y-ΔAmon.n+ΔA′mon.m,将表Hyear中ty对应的值更新为ΔA′year.y,如果Hyear表中ty时刻的记录不存在,则令ΔA′year.y=ΔA′mon.m后向Hyear表中插入新记录(ty,ΔA′year.y);
6)当在线理论网损计算周期到来时,计算得到当前第j个单位时段的理论网损值 ΔAsge.j,触发第一触发器,将记录(tj,ΔAsge.j)写入表Hseg,其中tj为当前单位时段的 起始时刻;
7)第一触发器将更新tj对应的日期td的网损电量日计量值,将更新后的日计量值 ΔA′day.d插入或更新到表Hday中并触发第二触发器;
8)第二触发器将更新td对应的月份tm的网损电量月计量值,并将更新后的月计量值 ΔA′mon.m插入或更新到表Hmon中;
9)对表Hmon写入或更新触发第三触发器,该第三触发器将更新tm对应的年份ty的网 损电量年计量值,并将更新后的年计量值ΔA′year.y插入或更新到表Hyear中;
步骤6)-9)的执行,嵌套触发了第一、二、三触发器,当步骤9)执行完成后,这 些触发器也依次执行完成,表Hday、Hmon、Hyear中已经保存了最新的日、月、年的网损电 量计量值ΔA′day.d、ΔA′mon.m、ΔA′year.y,完成了对这些计量值的自动在线计算。
10)当下一个在线理论网损计算周期到来时,返回步骤6),开始下一轮计算。
本发明的技术特点及效果:
本发明区别于以往方法的显著特征是提出了在电网在线理论网损计算中,当计算得到 单位时段的网损电量后,能够在线自动计算日、月、年等多时段网损电量计量值的方法。 该方法利用了关系数据库提供的触发器功能,利用触发器的自动嵌套调用,在保存单位时 段网损电量的同时,即可自动更新其对应的日、月、年的网损电量的计量值。
通过此方法,一方面该过程完全自动执行,不需要任何人工干预和操作,提高了在线 网损分析的自动化程度;另一方面,该方法实现了对各种计量电量的在线计算,每个单位 时段的网损电量计算结果进行存储时,其对应的各个时段的计量值也实时更新,运行人员 可以实时了解当前日、月、年网损电量计量值的变化情况;从而协助电网公司及时发现高 网损的线路、变压器等,制定科学的降低网损的方法,提高能源利用率,实现重要的经济、 社会、环境效益。
附图说明
图1为采用本发明方法的嵌套触发器自动计量日月年计量电量示意图。
具体实施方式
本发明提出的基于数据库嵌套触发器的理论网损电量自动计量方法结合附图及实施 例详细说明如下:
本方法中事先确定计算周期Δt,一般在线电网理论网损计算的计算周期为1分钟到5 分钟不等,此周期可根据实际情况和需求人工设定;
本方法包括以下步骤:
1)建立存储每个单位时段Δt的电网理论网损电量计算值的历史数据表Hseg,该表中 的字段包括每个单位时段Δt的起始时刻值tj,以及该单位时段的网损电量计算值ΔAseg.j, 该表中的记录以(tj,ΔAseg.j)表示,tj+1=tj+Δt。
本方法采用常用的关系数据库系统,在本方法中,建立数据表的SQL命令为create table,建立历史数据表Hseg的典型脚本为:
create table H_SEG(ID INTEGER,T_J DATE,A_J FLOAT)
该脚本在关系数据库中建立了一个关系表,其包括3个字段(列),分别是:
ID:存储对象的标识编号,在具体实施时,在H_SEG表中存储多个物理对象的网损电 量,例如多个计量区域,或者多个电气设备,以ID作为唯一标识,其数据类型为整数 (INTEGER)。
T_J:存储单位时段Δt的起始时刻值tj,常用的关系数据库系统均提供了专门的时间 戳数据类型,用于存储时刻,可以精确到秒。
A_J:存储单位时段的网损电量计算值ΔAsge.j。
该表建立完成后,表中的每条记录(行)即存储了某个对象(如电气设备)在T_J时 刻开始的单位时段中,其理论网损电量值A_J。
2)建立分别存储日、月、年计量网损电量计量值的历史数据表Hday、Hmon、Hyear, 表中的字段包括每个计量时段的起始时刻值td、tm、ty,以及该时段的网损电量计量值 ΔAday.d、ΔAmon.m、ΔAyear.y,表中的记录分别以(td,ΔAday.d)、(tm,ΔAmon.m)、(ty,ΔAyear.y) 表示。
类似于上述步骤1)的说明,建立历史数据表Hday的脚本为
create table H_DAY(ID INTEGER,T_D DATE,A_D FLOAT)
类似于上述步骤1)的说明,建立历史数据表Hmon的脚本为
create table H_MON(ID INTEGER,T_M DATE,A_M FLOAT)
类似于上述步骤1)的说明,建立历史数据表Hday的脚本为
create table H_YEAR(ID INTEGER,T_Y DATE,A_Y FLOAT)
同一个物理对象(例如电气设备),在不同表中对应的ID相同,各表分别保存该对象 不同的时间段的网损电量计量值,表中字段意义与步骤1)说明类似。
3)在表Hseg上定义第一触发器,用于在表Hseg中有新的记录插入或记录更新时被触 发,其具体实现如下:
本发明采用常用的关系数据库,其中,对数据表的触发器定义,可以指定其在有新记 录插入时触发,或者在原有某记录被更新后触发,其实现的方式有所不同,例如在Oracle 数据库中,可以对插入或更新数据定义不同的触发器,定义插入数据的触发器的脚本为:
CREATE OR REPLACE TRIGGER day_auto_insert
AFTER INSERT ON H_SEG
REFERENCING NEW AS newval
for each ROW
(…)
其中,“day_auto_insert”为触发器名字,“H_SEG”为表的名字,即表示该触发器定 义在表Hseg上,“AFTER INSERT”表示该触发器在插入新数据后被触发,“newval”为触发 器函数体中引用新插入数据的变量指针,“for each ROW”表示定义的是一个行级触发器, 在插入一行数据后立即被触发。
定义该数据更新的触发器脚本为:
CREATE OR REPLACE TRIGGER day_auto_update
AFTER UPDATE ON H_SEG
REFERENCING NEW AS newval OLD AS oldval
for each ROW
其中,“day_auto_update”为触发器名字,“H_SEG”为表的名字,即表示该触发器定 义在表Hseg上,“AFTER UPDATE”表示该触发器在已有数据更新后被触发,“newval”为触 发器函数体中引用更新后数据的变量指针,“oldval”为引用更新前数据的变量指针,“for each ROW”表示定义的是一个行级触发器,在更新一行数据后被触发。
3.1)当表Hseg中有新数据(tj,ΔAseg.j)插入时,第一触发器根据tj值确定其所属的日 期的起始时刻td,从表Hday中读出td对应的ΔAday.d,计算ΔA′day.d=Aday.d+ΔAseg.j,将Hday表中td对应的值更新为ΔA′day.d;如果Hday表中td时刻的记录不存在,则令ΔA′day.d=ΔAseg.j后向Hday表中插入新记录(td,ΔA′day.d)。
上述操作在表H_SEG的触发器day_auto_insert中定义,其主要指令为(以Oracle 数据库的PL/SQL指令为例,其他数据库系统指令类似):
v_dt= TO_DATE(TO_CHAR(newval.T_J, 'YYYYMMDD'), 'YYYYMMDD');
SELECT A_D INTO v_fAd FROM H_DAY WHERE T_D=v_dt AND ID=newval.ID;
IF (v_fAd IS NOT NULL) THEN
v_fAd1= v_fAd + newval.A_J;
UPDATE H_DAY SET A_D = v_fAd1 WHERE T_D=v_dt AND ID=newval.ID;
ELSE
v_fAd1= newval.A_J;
INSERT INTO H_DAY(ID,T_D,A_D) VALUES(newval.ID, v_dt, v_fAd1);
END IF;
说明如下:
触发器函数中,newval.T_J对应tj,为插入新记录中tj的值;newval.A_J对应ΔAseg.j, 为插入新记录中ΔAseg.j的值。变量v_dt 对应td,为tj对应的日期的起始时刻,v_fAd对 应ΔAday.d,v_fAd1对应ΔA′day.d,。其中 IF (v_fAd IS NOT NULL)表示在表Hday中已经有td时刻的记录,这时通过执行Update指令更新原来的值,否则通过执行Insert指令插入新 的值。在语句中,对ID的匹配表示找到同一个物理对象(如电气设备)。
3.2)当表Hseg中tj对应的数据ΔAseg.j更新为ΔAs′eg.j时触发器根据tj值确定其所属的 日期的起始时刻td,从表Hday中读出td对应的ΔAday.d,计算 ΔA′day.d=ΔAday.d-ΔAseg.j+ΔAs′eg.j,将Hday表中td对应的值更新为ΔA′day.d,如果Hday表中td时刻的记录不存在,则令ΔA′day.d=ΔAs′eg.j后向Hday表中插入新记录(td,ΔA′day.d)。
上述操作在表H_SEG的触发器day_auto_update中定义,其主要指令为(以Oracle 数据库的PL/SQL指令为例,其他数据库指令类似):
v_dt=TO_DATE(TO_CHAR(newval.T_J,'YYYYMMDD'),'YYYYMMDD');
SELECT A_D INTO v_fAd FROM H_DAY WHERE T_D=v_dt AND ID=newval.ID;
IF(v_fAd IS NOT NULL)THEN
v_fAd1=v_fAd–oldval.A_J+newval.A_J;
UPDATE H_DAY SET A_D=v_fAd1WHERE T_D=v_dt AND ID=newval.ID;
ELSE
v_fAd1=newval.A_J;
INSERT INTO H_DAY(ID,T_D,A_D)VALUES(newval.ID,v_dt,v_fAd1);
END IF;
说明如下:
触发器函数中,newval.T_J对应tj,为更新记录中tj的值,oldval.A_J对应ΔAseg.j, 为更新前记录中的网损电量值,newval.A_J对应ΔAs′eg.j,为更新后记录中的网损电量值; 变量v_dt对应td,为tj对应的日期的起始时刻,v_fAd对应ΔAday.d,v_fAd1对应ΔA′day.d。 其中IF(v_fAd IS NOT NULL)表示在表Hday中已经有td时刻的记录,这时通过执行Update 指令更新原来的值,否则通过执行Insert指令插入新的值。在语句中,对ID的匹配表示 找到同一个物理对象(如电气设备)。
4)在表Hday上定义第二触发器,该触发器在表Hday中有新的记录插入或记录更新时 被触发,其具体实现如下:
4.1)当表Hday中有新数据(td,ΔAday.d)插入时,第二触发器根据td值确定其所属的月 份的起始时刻tm,从表Hmon中读出tm对应的ΔAmon.m,计算ΔA′mon.m=Amon.m+ΔAday.d,将Hmon表中tm对应的值更新为ΔA′mon.m;如果Hmon表中tm时刻的记录不存在,则令ΔA′mon.m=ΔAday.y后向Hmon表中插入新记录(tm,ΔA′mon.m)。
类似于对步骤3.1)的说明,上述功能在表H_DAY的触发器mon_auto_insert中定义, 其主要指令为(以Oracle数据库的PL/SQL指令为例,其他数据库指令类似):
v_dt=TO_DATE(TO_CHAR(newval.T_D,'YYYYMM'),'YYYYMM');
SELECT A_M INTO v_fAm FROM H_MON WHERE T_M=v_dt AND ID=newval.ID;
IF(v_fAm IS NOT NULL)THEN
v_fAm1=v_fAm+newval.A_D;
UPDATE H_MON SET A_M=v_fAm1WHERE T_M=v_dt AND ID=newval.ID;
ELSE
v_fAm1=newval.A_M;
INSERT INTO H_MON(ID,T_M,A_M)VALUES(newval.ID,v_dt,v_fAm1);
END IF;
其中:newval.T_D对应td;newval.A_D对应ΔAday.d;变量v_dt对应tm;变量v_fAm 对应ΔAmon.m,v_fAm1对应ΔA′mon.m。其中IF(v_fAm IS NOT NULL)表示在表Hmon中已经有 tm时刻的记录,这时通过执行Update指令更新原来的值,否则通过执行Insert指令插入 新的值。在语句中,对ID的匹配表示找到同一个物理对象(如电气设备)。
4.2)当表Hday中td对应的数据ΔAday.d更新为ΔA′day.d时第二触发器根据td值确定其所属 的月份的起始时刻tm,从表Hmon中读出tm对应的ΔAmon.m,计算 ΔA′mon.m=Amon.m-ΔAday.d+ΔA′day.d,将表Hmon中tm对应的值更新为ΔA′mon.m,如果Hmon表中tm时刻的记录不存在,则令ΔA′mon.m=ΔA′day.y后向Hmon表中插入新记录(tm,ΔA′mon.m)。
类似于对步骤3.2)的说明,上述功能在表H_DAY的触发器mon_auto_update中定义, 其主要指令为
(v_dt=TO_DATE(TO_CHAR(newval.T_D,'YYYYMM'),'YYYYMM');
SELECT A_M INTO v_fAm FROM H_MON WHERE T_M=v_dt AND ID=newval.ID;
IF(v_fAm IS NOT NULL)THEN
v_fAm1=v_fAm–oldval.A_D+newval.A_D;
UPDATE H_MON SET A_M=v_fAm1WHERE T_M=v_dt AND ID=newval.ID;
ELSE
v_fAm1=newval.A_D;
INSERT INTO H_MON(ID,T_M,A_M)VALUES(newval.ID,v_dt,v_fAm1);
END IF;
以Oracle数据库的PL/SQL指令为例,其他数据库指令类似):
其中:oldval.A_D对应ΔAday.d;newval.A_D对应ΔA′day.d,其他与上述对4.1)的说明 相同。
5)在表Hmon上定义第三触发器,该触发器在表Hmon中有新的记录插入或记录更新时 被触发,其具体实现如下:
5.1)当表Hmon中有新数据(tm,ΔAmon.m)插入时,第三触发器根据tm值确定其所属的年 份的起始时刻ty,从表Hyear中读出ty对应的ΔAyear.y,计算ΔA′year.y=Ayear.y+ΔAmon.m,将Hyear表中ty对应的值更新为ΔA′year.y;如果Hyear表中ty时刻的记录不存在,则令ΔA′year.y=ΔAmon.m后向Hyear表中插入新记录(ty,ΔA′year.y)。
类似于对步骤4.1)的说明,上述功能在表H_MON的触发器year_auto_insert中定义, 其主要指令为(以Oracle数据库的PL/SQL指令为例,其他数据库指令类似):
v_dt=TO_DATE(TO_CHAR(:newval.T_M,'YYYY')||'0101','YYYYMMDD');;
SELECT A_Y INTO v_fAy FROM H_YEAR WHERE T_Y=v_dt AND ID=newval.ID;
IF(v_fAy IS NOT NULL)THEN
v_fAy1=v_fAy+newval.A_M;
UPDATE H_YEAR SET A_Y=v_fAy1WHERE T_Y=v_dt AND ID=newval.ID;
ELSE
v_fAy1=newval.A_M;
INSERT INTO H_YEAR(ID,T_Y,A_Y)VALUES(newval.ID,v_dt,v_fAy1);
END IF;
其中:newval.T_M对应tm;newval.A_M对应ΔAmon.m;变量v_dt对应ty;变量v_fAy 对应ΔAyear.y,v_fAy1对应ΔA′year.y。其中IF(v_fAy IS NOT NULL)表示在表Hyear中已经 有ty时刻的记录,这时通过执行Update指令更新原来的值,否则通过执行Insert指令插 入新的值。在语句中,对ID的匹配表示找到同一个物理对象(如电气设备)。
5.2)当表Hmon中tm对应的数据ΔAmon.m更新为ΔA′mon.m时,触发器根据tm值确定其所属 的年份的起始时刻ty,从表Hyear中读出ty对应的ΔAyear.y,计算 ΔA′year.y=Ayear.y-ΔAmon.n+ΔA′mon.m,将表Hyear中ty对应的值更新为ΔA′year.y,如果Hyear表中ty时刻的记录不存在,则令ΔA′year.y=ΔA′mon.m后向Hyear表中插入新记录(ty,ΔA′year.y)。
类似于对步骤4.2)的说明,上述功能在表H_MON的触发器year_auto_update中定义, 其主要指令为(以Oracle数据库的PL/SQL指令为例,其他数据库指令类似):
v_dt=TO_DATE(TO_CHAR(:newval.T_M,'YYYY')||'0101','YYYYMMDD');
SELECT A_Y INTO v_fAy FROM H_YEAR WHERE T_Y=v_dt AND ID=newval.ID;
IF(v_fAy IS NOT NULL)THEN
v_fAy1=v_fAy–oldval.A_M+newval.A_M;
UPDATE H_YEAR SET A_Y=v_fAy1WHERE T_Y=v_dt AND ID=newval.ID;
ELSE
v_fAy1=newval.A_M;
INSERT INTO H_YEAR(ID,T_Y,A_Y)VALUES(newval.ID,v_dt,v_fAy1);
END IF;
其中:oldval.A_M对应ΔAmon.m;newval.A_M对应ΔA′mon.m,其他与上述对5.1)的说明 相同。
6)上述数据表和触发器在理论网损计算程序运行前进行定义。当在线理论网损计算 周期到来时,程序计算得到当前第j个单位时段的理论网损值ΔAsge.j,将记录(tj,ΔAsge.j) 写入表Hseg,其中tj为当前单位时段的起始时刻。
对于本方法在线实时计算得到当前第j个单位时段的理论网损值ΔAsge.j,形成记录 (ID,tj,ΔAsge.j)并写入到表H_SEG中。由于计算是在线实时进行的,tj为当前时段的 起始时刻,因此正常情况下在写入前表H_SEG是没有T_S=tj的记录的,因此采用insert 指令进行写入。在离线人工操作情况下,可能对表H_SEG中已有的tj时刻的记录数据进行 修正,这时采用update指令进行修改。对表Hseg的写入将触发第一触发器;
7)第一触发器将更新tj对应的日期td的网损电量日计量值,并将更新后的日计量值 ΔA′day.d插入或更新到表Hday中,并触发第二触发器;如果调用了insert指令,则会触发 表H_SEG定义的第一触发器中day_auto_insert触发器,如果调用了update指令,则会 触发表H_SEG定义的第一触发器中day_auto_update触发器,这2个触发器会将由ID标 识的当前物理对象的网损电量日计量值进行更新,并调用insert或update指令,插入或 更新表H_DAY,这将触发第二触发器;
8)该触发器将更新td对应的月份tm的网损电量月计量值,并将更新后的月计量值 ΔA′mon.m插入或更新到表Hmon中。
如果调用了insert指令,则会触发表H_DAY定义的第二触发器中mon_auto_insert 触发器,如果调用了update指令,则会触发表H_DAY定义的第二触发器中mon_auto_update 触发器,这2个触发器会将由ID标识的当前物理对象的网损电量月计量值进行更新,并 调用insert或update指令,插入或更新表H_MON。对表Hmon的写入或更新将触发第三触 发器;
9)该触发器将更新tm对应的年份ty的网损电量年计量值,并将更新后的年计量值 ΔA′year.y插入或更新到表Hyear中。
如果调用了insert指令,则会触发表H_MON定义的第三触发器中year_auto_insert 触发器;如果调用了update指令,则会触发H_MON定义的第三触发器year_auto_update 触发器,这2个触发器会将由ID标识的当前物理对象的网损电量年计量值进行更新,并 调用insert或update指令,插入或更新表H_YEAR。
可以看到,从步骤6)开始的执行,嵌套触发了第一、二、三触发器,当步骤6)-9) 执行完成后,这些触发器也依次执行完成,表Hday、Hmon、Hyear中已经保存了最新的日、 月、年的网损电量计量值ΔA′day.d、ΔA′mon.m、ΔA′year.y,完成了对这些计量值的自动在线计算。
10)当下一个在线理论网损计算周期到来时,返回步骤6),开始下一轮计算。
在实际运行中,第一触发器即表H_SEG的触发器day_auto_insert,是由在线理论网 损计算程序执行的insert指令触发的,而触发器day_auto_insert中的insert(或update) 指令会自动触发表H_DAY的触发器mon_auto_insert(或者mon_auto_update),而触发器 mon_auto_insert(或者mon_auto_update)中的insert(或update)指令会自动触发H_MON 的的触发器year_auto_insert(或者year_auto_update),从而完成对该物理对象日、月、 年网损电量的自动计量计算和更新,可见这是一个3层嵌套的触发器,其嵌套调用如图1 所示。
本发明方法的一个实施例说明如下:
本发明实施例是对电网总理论网损以及某线路A的理论网损进行实时在线计量,总网 损对象的ID=1,线路对象的ID=2。
本发明实施例中,确定计算周期Δt=5分钟,即1/12小时。
按照上述方法步骤1)~步骤5)建立表H_SEG、H_DAY、H_MON、H_YEAR,以及表上的 第一、二、三触发器,表建立完成后,表中均没有记录。
当第一轮在线理论网损计算周期到来时,设当前时间为2013年1月1日0时5分, 进入数据存储和自动计量过程如下:
步骤6):计算给出总理论网损为100,线路理论网损为10,执行insert指令,向H_SEG 表中插入数据为(1,’2013-01-0100:00:00’,100)和(2,’2013-01-0100:00:00’,10)
步骤7):上步中执行的insert语句触发表H_SEG定义的第一触发器day_auto_insert, 由于表H_DAY为空,该触发器最后调用insert语句,向表H_DAY中插入数据为 (1,’2013-01-01’,100)和(2,’2013-01-01’,10)。
步骤8):上步中执行的insert语句触发表H_DAY表中定义的第二触发器 mon_auto_insert,由于表H_MON为空,该触发器最后调用insert语句,向表H_MON中插 入数据为(1,’2013-01’,100)和(2,’2013-01’,10)。
步骤9):上步中执行的insert语句触发表H_MON表中定义的第三触发器 year_auto_insert,由于表H_YEAR为空,该触发器最后调用insert语句,向表H_YEAR 中插入数据为(1,’2013’,100)和(2,’2013’,10)。
在本轮数据写入H_SEG完成后,H_DAY、H_MON、H_YEAR表中已经分别自动产生2条记 录,分别存储电网总网损电量和线路A网损电量在2013年1月1日的日计量值、在2013 年1月的月计量值,以及在2013年的年计量值,计量值均为100(总网损)和10(线路A 网损)。
当第二轮在线理论网损计算周期到来时,设当前时间为2013年1月1日0时10分, 进入数据存储和自动计量过程如下:
步骤6):计算给出总理论网损为200,线路理论网损为20,执行insert指令,向H_SEG 表中插入数据为(1,’2013-01-0100:05:00’,200)和(2,’2013-01-0100:05:00’,20)
步骤7):在上步中执行的insert语句触发表H_SEG定义的第一触发器 day_auto_insert,由于表H_DAY中已有日期为‘2013-01-01’的记录,该触发器最后调 用update语句,向表H_DAY中更新数据为(1,’2013-01-01’,300)和(2,’2013-01-01’,30)。
步骤8):上步中执行的update语句触发表H_DAY表中定义的第二触发器 mon_auto_update,由于表H_MON中已有月份为‘2013-01’的记录,该触发器最后调用insert 语句,向表H_MON中更新数据为(1,’2013-01’,300)和(2,’2013-01-01’,30)。
步骤9):在上步中执行的update语句触发表H_MON表中定义的第三触发器year_auto_ update,由于表H_YEAR中已有年份为‘2013’的记录,该触发器最后调用update语句, 向表H_YEAR中更新数据为(1,’2013’,300)和(2,’2013’,30)。
在本轮数据写入H_SEG完成后,H_SEG中有4条记录,如下:
表H_DAY中有2条记录,如下:
表H_MON中有2条记录,如下:
表H_YEAR中有2条记录,如下:
机译: 基于关系数据库在XML数据库中支持XQUERY触发器的方法和系统
机译: 基于关系数据库在XML数据库中支持XQUERY触发器的方法和系统
机译: 用于基于推断事件的概率派生具有动作触发器的基于层次事件的数据库的系统和方法