简介:
电力是国民经济和社会发展的重要基础产业。随着电力需求的日益增长,电力调度和电网安全的重要性更加凸显。在电力调度系统的运行中,电网经常需要启停和维护设备、电网的运行方式变化也很频繁。因此,越来越多的客户开始研究和采用IBM
的业务规则管理平台WebSphere ILOG JRules对电网进行风险和稳定预警分析,以解决安全分析和预警规则数量众多、改动频繁的问题,实现对电网的智能化安全分析和监控。本文将通过电力调度运行安全分析系统应用的一个虚拟的业务需求来介绍如何使用WebSphere
ILOG JRules平台进行开发。
引言
建立电网运行安全分析系统的目的在于对电网运行的各种指标(频率、电压、潮流、稳定、……)等进行监控和分析,以便向调度员及时显示电网运行的状态、提示异常情况,并提供智能化的辅助处理决策等
。以上提到的这些实质上就是一系列复杂的监控和分析的业务规则。而电网网络结构和运行方式的不断变化,需要考虑的设备和因素不断增加,也导致了这些规则需要不断细化、更新和增加。传统的调度运行系统无法提供实时和智能化的支持,使得调度员和计划人员的压力越来越大。因此,我们基于
IBM WebSphere ILOG JRules 业务规则管理平台构建了电网稳定安全分析系统,很好地解决了以上问题,真正实现了对电网状态的智能监控、分析和告警,实现了系统的高效管理,降低了调度人员的工作压力。
基于 ILOG JRules 的电网运行安全分析系统,主要是根据电网年度运行方式的常态稳定限额规定和检修方式的临时稳定限额规定,对一次设备和二次设备的状态进行实时监控和预警分析,并自动提取预案进行解决问题的决策辅助支持;同时,针对当前电网运行方式和未来调度生产计划,辅助调度员及时发现和控制风险,并提供相关风险类型的识别、预控措施和事故预案分析,以保障电网调度运行的安全。
IBM WebSphere ILOG JRules 业务规则管理平台简介
IBM WebSphere ILOG JRules 是目前业界领先的业务规则管理平台。与传统的由
IT 人员用硬代码来维护规则的做法不同,ILOG JRules 让业务用户能够在不依赖或者有限依赖于 IT
人员的情况下,快速创建、修改、测试和部署业务规则,以满足经常变化的业务需求。ILOG JRules 提供了一整套的工具,帮助开发人员和业务人员进行规则的全生命周期管理。
图 1. 业务规则应用开发架构
下面简要介绍下 ILOG JRules 中的各个工具。
Rule Studio:基于 Eclipse 的开发环境,是一个针对开发人员、业务分析人员和架构设计师的业务规则应用程序开发工具。
Rule Team Server:一个主要针对策略管理人员的、基于 Web
环境的业务规则管理工具。
Rule Execution Server:一个嵌入 JRules 规则引擎的受控业务规则执行平台,通常运行在
J2EE 服务器中。
Decision Validation Services:针对业务用户和开发人员等的测试和仿真工具,用于创建测试方案,验证规则的正确性;或者通过历史数据等模拟业务场景,以分析规则对实际业务变化带来的影响。
Rule Solutions for Office:业务用户可以在 Microsoft
Office 中,以 Word 或 Excel 格式来维护规则,并同 Rule Team Server
进行同步。
电力调度运行安全分析系统
典型的电力调度运行安全分析系统主要包括电能平衡安全分析、电网稳定安全分析、电网运行风险分析、电网模型管理、运行安全监管等业务模块。ILOG
JRules 规则引擎主要用在电网稳定安全分析和电网运行风险分析两个模块中。
在电网稳定安全分析模块中,用户利用 ILOG JRules 建立电网稳定限额规则库。规则引擎根据常态稳定限额规定和临时稳定限额规定,结合
EMS 等系统传入电网运行实时数据信息和电力系统计算分析服务,对电网稳定状况进行实时评估和预警分析。
在电网安全风险分析模块中,用户利用 ILOG JRules 建立电网风险评估规则库。规则引擎针对当前电网运行方式和未来调度生产计划,实时分析和评估电网中可能存在的风险点,并提供相关预控措施和事故预案分析,辅助调度员及时发现并控制风险,以保障电网调度运行的安全。
图 2. 电力调度运行安全分析系统架构图
在本文中,我们把需求简化为电网安全风险分析模块中最常见的两条规则:识别并提示电网中存在的跳闸和停役风险。
执行对象模型(XOM, eXecution Object Model)开发
实际电力调度过程中,涉及到的业务对象非常多和复杂,比如线路、厂站、机组、母线、变压器、断面等。每个对象下面都有众多的属性。
本文中我们简化业务对象为:
线路 (AClink):电流值 I (i_value)、开关 (brk)。
开关 (Break):遥信值前 (value_forward)、遥信值后
(value_backward)。
执行对象模型(XOM)是规则赖以运行的模型。XOM 可以采用 Java
类或者 XML Schema 来进行构建。本文中我们采用 Java 类的方式。
首先我们启动 ILOG JRules Rule Studio 工具,创建一个
Java 项目,命名为 epc-xom。在项目工程建立一个名字为 epc 的包,然后在下面创建 AClink
和 Break 两个类:
清单 1. AClink.java
package epc;
import java.util.ArrayList;
import java.util.List;
public class AClink {
private String aclink_name;//线路名称
private double i_value;//电流值I
private List brk = new ArrayList();//开关
public void setAclink_name(String aclink_name) {
this.aclink_name = aclink_name;
}
public void add_brk(Break brk) {
this.brk.add(brk);
}
public String getAclink_name() {
return aclink_name;
}
public double getI_value() {
return i_value;
}
public Break[] getBrk() {
return (Break[]) brk.toArray(new Break[brk.size()]);
}
}
|
清单 2. Break.java
package epc;
public class Break {
private double value_forward;//遥信值前
private double value_backward;//遥信值后
public void setValue_forward(double value_forward) {
this.value_forward = value_forward;
}
public void setValue_backward(double value_backward) {
this.value_backward = value_backward;
}
public double getValue_forward() {
return value_forward;
}
public double getValue_backward() {
return value_backward;
}
}
|
接下来我们创建 Request 和 Response 两个类,作为输入和输出参数。输入对象为
AClink 线路的 List,输出也是一个 List,里面存放所有的告警信息。
清单 3. Request.java
package epc;
import java.util.ArrayList;
import java.util.List;
public class Request {
private List aclns= new ArrayList();
public AClink[] getAclns() {
return (AClink[]) aclns.toArray(new AClink[aclns.size()]);
}
public void addAcln(AClink acln){
this.aclns.add(acln);
}
}
|
清单 4. Response.java
package epc;
import java.util.ArrayList;
import java.util.List;
public class Response {
private List resultWarnings = new ArrayList();
public void addWarning(String warn) {
resultWarnings.add(warn);
}
public String toString() {
String str = "";
for (int i = 0; i < resultWarnings.size(); i++) {
str += resultWarnings.get(i).toString() + "\n";
}
return str;
}
}
|
业务对象模型(BOM, Business Object Model)开发
业务对象模型(BOM)是一个类似于 Java 对象模型的对象模型,包含的元素映射至
XOM 中的各个元素。每个 BOM 元素都必须有一个相应的 XOM 元素,以便在运行时执行规则。通过在
BOM 中建立自然语言的词汇表,后续我们可以进行友好的业务规则编辑。
接下来我们在 Rule Studio 新建一个规则项目,起名为 epc-rules,并且在规则项目
XOM 设置中,引用 epc-xom 工程,如下图所示。
图 3. 规则项目 XOM 设置
通过引用 epc-xom 工程,我们可以建立 BOM 到 XOM 的自动映射:
在规则浏览器中,打开我们刚刚创建的 epc-rule 项目,并在菜单中选择“文件
- 新建 -BOM 条目”。
在弹出窗口中选择“从 XOM 创建 BOM 条目”,点击“下一步”。
点击“浏览 XOM”,选择 epc-xom,然后单击“确定”。
在“选择类”下 , 选择 epc 包下所有的类,点击“下一步”。
图 4. BOM 条目设置
在 BOM 语言描述页面,选择“所有方法”勾选框以便为所有的方法都生成默认语言描述,然后点击完成。
在“规则浏览器”视图中,展开“bom- 模型 -epc-AClink”,双击以打开
BOM 编辑器。
在编辑器的“类语言描述”中,可以看到当前系统根据类名,自动生成了默认的术语“AClink”。为了在书写规则的时候可以使用更友好的中文描述,我们点击“编辑”将其修改为“线路”。
图 5. 类语言描述
在编辑器的“成员”中,可以看到我们在 XOM 中创建的各个属性和方法。选择“aclink_name”,点击“编辑”按钮以对其进行编辑。
图 6. BOM 条目设置
在“成员语言描述”中,可以看到系统自动生成的语言描述,如下图所示。为了使用更友好的语言描述来书写规则,点击“编辑”,将默认的术语“aclink
name”修改为“名称”,点击“确定”。因为我们在编写规则的时候,不会对 aclink_name 进行
set 方法的操作,因此可以点击操作短语最右侧的删除图标,去掉 set 方法的语言描述。最终结果如下图所示。
图 7. 成员语言描述
重复以上步骤,为所有类的所有方法进行语言描述的修改。最终修改后,我们在“词汇表视图”中可以看到所有修改后的语言描述。接下来我们就可以利用创建好的语言描述来进行规则的编写了。
图 8. 词汇表
定义输入输出参数
规则项目的参数定义了规则项目同外部应用程序之间的接口,可以使用参数来操纵传递至规则引擎的对象。我们在在规则项目图的设计部分,单击“定义参数”。本例子中,我们定义了
request 作为输入参数,response 作为输入和输出参数。request 参数里面包含了一组线路信息的列表,以及线路的各个开关的信息。response
参数中报告规则判断出的告警信息。
图 9. 参数定义
业务规则的开发
在 epc-rules 规则项目中,我们选择“文件 - 新建 - 业务规则”,名称为“跳闸风险提示”,
这时将打开 Intellirule 编辑器。
在编辑器中打一个空格,并在弹出的内容助理框中选择“预定义”。
图 10. Intellirule 规则编辑器
选择了“预定义”之后,系统会弹出新的内容助理框,选择“指定 < 变量
>”。
继续构建规则,直到完成以下内容。
图 11. 跳闸风险规则
到目前为止,我们完成了第一条规则。规则包含三个部分:
“预定义”部分的作用是定义变量,从而更方便地书写规则。在这个规则中,我们定义了“线路”和“开关”两个变量。
“如果”部分定义了规则的条件。
“那么”部分定义了在满足规则条件的情况下要执行的操作。
根据这条规则的定义,如果输入参数中,某个线路的开关的遥信值前是 0,并且遥信值后是
2,那么就会向输出参数中增加一条危险点提示记录。
同理我们可以构建其他的规则,例如根据开关的遥信值信息,确定线路是否存在检修、停役等风险;根据线路的电流值
I,确定线路是否存在越限风险等。
图 12. 停役风险规则
业务规则的调试
规则书写完成之后,我们可以进行规则的测试。规则测试有多种方式,例如利用
Decision Validation Services 来进行测试。这里我们用利用 ilrmain 函数,用代码构建测试数据来进行测试。
选择“文件 - 新建 - 函数”,名称为“ilrmain”, 这时将打开编辑器。在编辑器中添加一个参数,名称为“arg”,类型为“java.lang.Object”。
图 13. ilrmain 函数参数设置
点击上图右下角的“文本”标签,切换到函数体的编辑页面,在“代码”中输入如下代码:
清单 5. ilrmain 函数代码示例
request=new Request();
response=new Response();
AClink acln1=new AClink();
acln1.aclink_name="线路1";
Break brk1=new Break();
brk1.value_forward=0;
brk1.value_backward=2;
acln1.add_brk(brk1);
AClink acln2=new AClink();
acln2.aclink_name="线路2";
Break brk2=new Break();
brk2.value_forward=0;
brk2.value_backward=3;
acln2.add_brk(brk2);
request.addAcln(acln1);
request.addAcln(acln2);
updateContext();
execute();
|
这里的测试数据中,我们模拟了两个线路,其中线路 1 的开关的遥信值前是
0 且遥信值后是 2。根据我们之前编写的规则,线路 1 应该存在跳闸的风险。接下来我们来检验一下是不是这样。
在菜单中选择“运行 - 运行配置”,双击左侧列表中的“规则项目”,新建一个规则项目的运行配置,在项目中选择“epc-rules”项目,并选中“使用
ilrmain 功能启动项目”:
图 14. 规则项目运行配置
在“(x)= 参数 & 自变量”中,选择“清除所有值”:
图 15. (x)= 参数 & 自变量
点击“运行”,执行该运行配置。
在控制台中,我们可以看到输出的信息:
图 16. 控制台输出信息
可以看到如同我们预料的那样,线路 1 存在的风险点被规则检测出来;而线路
2 不满足规则的条件,因此没有触发报警信息输出。
发布规则到 Rule Team Server(RTS)
在前面的步骤中,我们都是在 Rule Studio 环境中进行开发。然而
Rule Studio 对于业务人员来说并不是一个友好的操作环境。因此 ILOG JRules 提供了
Rule Team Server 这样一个基于 Web 的、面向业务人员的友好的环境,允许多位业务用户同时进行规则的查看、创建、修改、测试和部署等操作。Rule
Team Server 既可以同 Rule Studio 之间进行规则项目的同步,也可以和前面提到的 Rule
Solutions for Office 进行同步。
在“规则浏览器”的 epc-rules 项目上,单击右键,选择“Rule
Team Server- 连接”。
在弹出窗口中输入用户名“rtsAdmin”,密码“rtsAdmin”,URL
“http://localhost:8080/teamserver”,数据源留空,点击“连接”按钮。
点击“完成”按钮,打开同步视图查看同步是否成功。
在浏览器中打开“http://localhost:8080/teamserver”,输入用户名“rtsAdmin”,密码“rtsAdmin”,登入
RTS。
在 RTS 中可以看到该规则项目,并可以进行规则的维护、测试、部署等操作。
发布规则到 Rule Execution Server(RES)
Rule Execution Server 是用于业务规则的受管理、受监视的执行环境,我们可以通过
Rule Studio 或者 Rule Team Server,把规则部署到 RES 规则执行服务器上。
在 Rule Studio 中,打开“新建 RuleApp 项目”向导,点击“下一步”。
输入项目名称 epc-ruleApp,点击“下一步”。
点击“添加规则项目”中,添加前面创建的 epc-rules 项目,点击“完成”。
在 epc-ruleApp 项目上,单击右键,选择“RuleApp- 部署”按钮。
点击“下一步”,输入 URL“http://localhost:8080/res”,用户名“resAdmin”,密码“resAdmin”,点击“完成”。
控制台显示部署成功信息。
在浏览器中登录“http://localhost:8080/res”,可以看到部署上去的规则应用和规则集。
集成到应用
Rule Execution Server 与应用的集成有多种方式,包括
J2SE、J2EE 或者 Web Service 。本文中我们利用 ILOG 自带的向导,实现一个 J2SE
集成方式的客户端。
在 Rule Studio ,打开“新建一个 RuleAPP 的客户机项目”向导,选择“简单的旧
Java 对象”,点击“下一步”。
图 17. 新建 RuleApp 客户机项目向导
输入项目名称 epc-ruleClient,点击“下一步”。
选择 epc-ruleApp 项目,点击“下一步”,直到显示“POJO
属性”页面。
点击“浏览”按钮,用默认选项创建一个新的 RES 配置,然后点击“完成”。
在生成的 epc-ruleClient 项目中,打开 Main.java,修改代码:
清单 6. Main.java
package epcruleApp;
import epc.*;
public class Main {
public static void main(String[] args) throws Exception {
EpcruleClientRunner bean = new EpcruleClientRunnerImpl();
Request requestepcrules = new Request();
Response responseepcrules = new Response();
AClink acln1=new AClink();
acln1.setAclink_name("线路1");
Break brk1=new Break();
brk1.setValue_forward(0);
brk1.setValue_backward(2);
acln1.add_brk(brk1);
AClink acln2=new AClink();
acln2.setAclink_name("线路2");
Break brk2=new Break();
brk2.setValue_forward(0);
brk2.setValue_backward(3);
acln2.add_brk(brk2);
requestepcrules.addAcln(acln1);
requestepcrules.addAcln(acln2);
EpcrulesResult epcrulesResult =
bean.executeepcrules(requestepcrules, responseepcrules);
}
}
|
运行 Main.java,在控制台可以看到输出信息:
图 18. 控制台输出信息
总结
作为业界领先的业务规则管理系统,ILOG JRules 可以用于对整个企业的业务规则进行管理,包括规则建模、规则编写、规则测试、规则部署、规则维护等。通过利用
ILOG JRules,可以帮助我们快速实现灵活的、可扩展的电力调度运行安全分析系统,很好地解决了系统规则数量多、经常变动的问题。
|