具体实施方式
●系统具备的主要功能
系统的主要功能有以下几个方面:
1.应用于电网继电保护和故障信息处理领域中的分布式实时系统。
2.能够实现多副本实时数据库与正本之间的同步。
3.系统提供稳定的应用程序接口(API),方便进行新的上层应用进程的开发。
4.应用程序采用“即插即用”技术,即上层应用的开启不影响实时库的运行。
5.网络中任意节点故障不影响其它节点的实时库运行。
6.任意节点上的数据库更改行为将自动波及到整个工作域,域内各节点同步刷新。
7.可以实现“节点人工屏蔽”。经屏蔽设置后,该节点与网络其它节点的数据访问断开,直到解除屏蔽设置。
8.具有优先级策略的事件和报警功能。
9.在线数据维护功能。
10.全网对时功能。
11.数据服务器双机热备的冗余处理功能。
12.支持多种数据库访问接口(文件I/O,SQL,Web等)。
●实时数据库的节点分布
全分布式的保护信息处理系统实时数据库在网络上的节点分布如图1所示。
B01-主数据服务器节点。整个系统实时数据库最早建立在该节点,故将其称为正本。
B02-备数据服务器节点。该节点与B01形成互为热备用的数据服务器。
B03-通信管理机节点。该节点的功能是完成放置在电力调度通信中心的保护信息处理系统主站与放置在厂站端的子站之间的通信。
B04-工作站节点。该节点为操作员进行系统操作、维护的操作台。
B05-Web工作站节点。该节点为与系统相连的计算机提供Web信息发布。
●实时数据库的模块结构
图2所示为实时数据库的模块结构示意图。
B01-日志管理模块,完成对各种操作的记录。该模块通过B07事务处理与调度模块与其它模块进行信息交换。
B02-网络管理模块,完成对主站通信网络信息的管理。该模块通过B07事务处理与调度模块与其它模块进行信息交换。
B03-数据安全管理模块,完成各种操作的安全性认证管理。该模块通过B07事务处理与调度模块与其它模块进行信息交换。
B04-数据备份与故障恢复模块,完成系统正常情况下的数据备份和异常情况下的故障恢复。该模块通过B07事务处理与调度模块与其它模块进行信息交换。
B05-冗余处理,实现双机冗余功能。该模块通过B07事务处理与调度模块与其它模块进行信息交换。
B06-进程管理与调度模块,实现节点内需要的进程管理,并完成进程的调度。该模块通过B07事务处理与调度模块与其它模块进行信息交换。
B07-事务处理与调度模块。此模块为整个实时数据库的核心,其它所有功能处理模块都是通过此模块进行信息交换。
B08-数据处理单元,实现实时数据处理、过程数据处理、历史数据处理、统计计算等功能。实时数据处理直接通过B09实时数据访问接口完成实时数据维护和查询;过程数据处理、历史数据处理和统计计算可以直接通过B10历史数据访问接口访问B12磁盘文件和B13商业数据库,完成处理任务。而数据处理的任务则通过B07事务处理与调度模块从其它模块获得。
B09-实时数据访问接口模块,通过实现实时数据内存区域的管理和访问算法提供对实时数据的维护和查询。实时数据操作的信息来源既可以是B08的数据处理单元,也可以通过B07事务处理与调度模块来自于其它模块。该模块的数据存放区域是B11共享内存数据区和B12磁盘文件。
B10-历史数据访问接口模块。此模块为其它各功能模块访问B12磁盘文件和B13商业数据库提供操作接口。
B11-共享内存数据区。此数据区域根据实时数据库数据结构定义,存放实时数据。其它模块通过B09实时库访问接口提供的访问算法访问该区域。
B12-磁盘文件。实时数据的备份和特殊历史数据均存放于此区域。
B13-商业数据库。历史数据通过B10历史数据访问接口存入商业数据库,实时数据的各个断面也存入商业数据库。
●实时数据库的信息结构模型
实时数据的信息结构模型主要包括:站数据库、系统库和电力参数库。
(1)站数据库信息结构
内容 |
共享内存块 |
说明 |
站属性 |
ST_Head: |
对应结构Station_Head其中包括子站数siRealStNum等 |
站描述 |
StationDesc1ST Size1ST OffSet2ST Size2ST OffSet...... |
站数据库所属共享内存的分配情况:1~siRealStNum个子站,每个子站所占内存块的大小和起始偏移量 |
子站1 | 子站属性 | 1 ST tagSubStation |
存放子站的总体属性,如站名、IP地址、保护/录波器数目等;参见结构tagSubStation. |
| 子站描述 |
1ST 1 ProtDev OffSet1ST 2 ProtDev OffSet......1ST 1 Bay OffSet......1ST 1 Recorder OffSet...... | 子站数据库所属共享内存的分配情况每个保护、间隔和录波器的内存起始位置 |
子站1保护列表 |
1ST 1 ProtDev1ST 2 ProtDev...... |
子站内每个保护装置的属性值每个保护是一个结构tagProtDev |
子站1间隔1 | 1ST 1 BaytagBay |
间隔1的属性值参见结构tagBay |
1ST 1 Bay 1 Ana1ST 1 Bay 2 Ana.....1ST 1 Bay 1 Dig1ST 1 Bay 2 Dig.....1ST 1 Bay 1 Pulse1ST 1 Bay 2 Pulse..... |
间隔1的物理量,包括遥测:每个遥测是一个结构tagAnalog遥信:每个遥信是一个结构tagDigital遥脉:每个遥脉是一个结构tagPulse |
间隔2 |
1 ST 2 Bay |
类似间隔1,只是各物理量的多少不同 |
...... |
...... |
子站1录波器1 | 1ST 1 Recorder |
子站内录波器1的属性值参见结构tagRecorder |
1ST 1 Recorder 1 Ana1ST 1 Recorder 2 Ana.....1ST 1 Recorder 1 Dig1ST 1 Recorder 2 Dig..... |
子站内录波器1的物理量,包括录波器遥测:参见结构tagRecorderAna录波器遥信:参见结构tagRecorderDig |
子站1录波器2 | ..... |
类似录波器1只是物理量的多少不同 |
....... | |
子站2 | | |
类似子站2 |
.... | | |
子站N | | |
站数据库主要处理以下数据:站、间隔、保护、录波、间隔内遥测、间隔内遥信、间隔内遥脉、录波模拟通道、录波数字通道
(2)系统库信息结构
内容 |
内存块 |
说明 |
系统库描述 |
Sys_HeadSiRealUserNum...siRealSysDigNumUserSizeUserOff...SysDigSizeSysDigOff |
对应结构Sys_Head包括用户、节点、进程、通信口...等各项的数目、内存大小和偏移(针对系统库的偏移) |
用户数据块 |
User1User2... |
1~siRealUserNum个用户数据的列表;每个数据是一个结构tagUser; |
Protocol块 |
|
类似用户数据块各块内都是该类数据的列表,每个列表项是一个结构参见源程序 |
IONode块 |
|
NetNode块 |
|
Process块 |
|
计算公式块 |
|
系统Ana块 |
|
系统Dig块 |
|
系统Pulse块 |
|
系统Other块 |
|
系统库处理以下数据:用户、进程、规约、IO节点、网络节点、计算公式、系统遥测、系统遥信、系统遥脉
(3)电力参数库信息结构
内容 |
内存块 |
说明 |
电力参数库描述 |
Power_HeadSiRealLineNumUlLineSizeUlLineOff...SysDigSizeSysDigOff | 对应结构Power_Head包括线路数目、内存大小和偏移(针对电力参数库的偏移) |
线路参数块 |
Line_Recorder1Line_Recorder2... |
1~siRealLineNum个线路参数的列表每个列表项是一个结构tagLine_Recorder |
●实时数据库的应用管理进程
实时数据库的构造通过应用管理进程LocalManager实现,其它应用程序通过调用API函数实现对实时数据库的操作和访问。LocalManager完成两个主要任务:一个是利用信息模型建立实时数据库,另一个则是处理实时信息,如:保护动作信号、召唤定值、遥控操作等。
LocalManager的实时数据库启动过程如图3所示。图3中的各步骤功能解释如下:
S01-读取本节点配置信息。由于本方法所构造的实时数据库是分布在网络上的各个节点的,因此需要先读取本节点的配置信息。
S02-判断本节点是否是主服务器。S01中已经读取了本节点的配置信息,通过配置的节点类型来判断本节点是否是主服务器,如果是主服务器则进入S03设置主服务器标志,否则进入S04判断本节点是否是备服务器。
S03-设置主服务器标志。如果本节点是主服务器,则需要设置主服务器标志。
S04-判断本节点是否是备服务器。S02中判断结果如果不是主服务器则在此步骤中判断是否是备服务器。如果本节点是备服务器则进入S05设置备服务器标志,否则进入S06。
S05-设置备服务器标志。如果本节点是备服务器,则需要设置备服务器标志。
S06-判断数据库是否是从本地加载。根据S03、S04、S05得到的节点类型标志决定本节点是否是数据库的正本,即实时数据库是否从本地加载。如果需要从本地加载则进入S07设置本地版标志,否则进入S08设置网络版标志。
S07-设置本地版标志。如果实时数据库需要从本地加载,则设置本地版标志。
S08-设置网络版标志。如果实时数据库不需要从本地加载,而是从网络上获取,则设置网络版标志。
S09-判断是否是从商业数据库加载数据。实时数据的加载过程中,其数据来源无非就是在商业数据库或者磁盘文件中保留的数据断面。因此,本步骤判断是否是从商业数据库加载数据,如果是则进入S10设置读商业数据库标志,否则进入S11设置数据文件路径。
S10-设置读商业库标志。如果需要从商业数据库加载数据,则设置此标志。
S11-设置数据文件路径。如果不是从商业数据库加载数据,则根据S01中读取的配置信息设置数据文件的路径。
S12-判断是否需要进行网络端口初始化。如果配置网络端口,则需要进入S12网络端口的初始化,否则进入S16判断本节点是否主或备服务器。
S13-网络端口初始化。此步骤需要完成:
(4)建立TCP网络服务器端口。该端口负责本节点与网络其它节点的通信。
(5)当本节点是网络版时,建立TCP网络数据库同步端口。该端口通过与网络上其它服务器通信,完成本地数据库的初始化、数据刷新、同步。
(6)建立UDP数据处理线程组,完成非重要数据的传输。
S14-判断网络端口初始化是否成功。如果S13网络端口初始化过程成功则进入S16判断本节点是否是主或备服务器,否则进入S15失败返回。
S15-失败返回。如果实时数据库的启动过程失败,均进入本步骤。
S16-判断本节点是否是主/备服务器。如果本节点类型是服务器,则进入S17主/备服务器初始化;否则本节点应为工作站,进入S18工作站初始化。
S17-主/备服务器初始化。本步骤需要完成:
(1)如果原来在本节点上的实时数据库仍然加载在共享内存区中,则直接连接共享内存区。
(2)向网络上其它节点发出数据请求,如果在规定时段内没有接收到需要的数据,或者明确制定本节点为主服务器,则进行本地实时数据库的加载。
(3)如果在规定时段内接收到其它节点(应该是主服务器)发来的数据,则本节点为备服务器,并处理网络上接收到的数据,进行本地实时数据库的创建。
(4)在本节点完成实时数据库的加载后向网上发送“实时库启动成功”消息,并将本节点状态标志置为运行状态。
S18-工作站初始化。本步骤需要完成:
(1)如果原来在本节点上的实时数据库仍然加载在共享内存区中,则直接连接共享内存区。
(2)向网络上其它节点发出数据请求,如果在规定时段内没有接收到需要的数据,则实时数据库的加载过程失败。
(3)如果在规定时段内接收到其它节点(应该是主服务器)发来的数据,则处理网络上接收到的数据,进行本地实时数据库的创建。
(4)在本节点完成实时数据库的加载后向网上发送“实时库启动成功”消息,并将本节点状态标志置为运行状态。
S19-判断实时库加载过程是否成功。根据S17、S18两个步骤的返回结果判断实时数据库加载过程是否成功。如果成功则进入S20启动心跳,否则进入S15失败返回。
S20-启动心跳。此步骤的功能是在实时数据库加载成功后,建立一个类似于“心跳”的模块,表明本节点的运行状态是否正常。
S21-判断本节点是否是网络版。如果本节点是网络版,则需要在网络上通知其它节点,即进入S22;否则进入S23成功返回。
S22-向网络上发送“数据接收正常”消息。当本节点是网络版时,本节点在实时数据库加载过程中已经与其它节点进行同步,如果实时数据库加载成功,则在网络上通知其它节点。
S23-成功返回。本步骤表明本节点上的实时数据库的启动过程顺利完成。
●外围应用对实时数据库的连接
一般的外围应用程序需要连接本节点上的实时数据库,以便能够对实时数据库进行访问和操作。图4所示为一般的外围应用程序连接实时数据库的流程图。各步骤解释如下:
S01-获取内存数据库句柄。外围应用在连接数据库时,首先需要获取共享内存区中的实时数据库的句柄,然后进入S02判断获取的句柄是否有效。
S02-判断实时数据库句柄是否有效。如果句柄有效,则进入S03读取本节点配置信息;否则进入S13失败返回。
S03-读取本节点配置信息。此步骤的作用是为了能够使本应用能够判断实时数据库中是否包含了本节点的一些信息,然后进入S04。
S04-判断实时数据库中是否有本节点的信息。如果有则进入S05,否则进入S13失败返回。
S05-判断本应用是否是任务管理器模块。任务管理器模块是每个节点比不可少的一个功能模块,其它所有的功能模块都通过任务管理器进行调度。因此,该模块并不一定要求在数据库中配置,而是作为默认的功能模块存在。如果本应用是任务管理器,则直接进入S07,否则进入S06。
S06-判断实时数据库中是否有本应用的信息。如果在实时数据库中配置本应用,则可以进入S07,否则进入S13失败返回。
S07-创建客户端口。当一个应用启动后,必须先建立一个能够连接实时数据库的客户端口才能去连接实时数据库开放的服务端口,进入S08。
S08-连接服务端口。通过实时数据库提供的API函数去连接实时数据库的服务端口,以便访问实时数据库,然后进入S09判断连接实时数据库是否成功。
S09-判断连接实时数据库是否成功。根据S08连接服务端口的返回结果判断实时数据库是否连接成功。如果成功,则进入S10;否则进入S13失败返回。
S10-设置进程状态为“运行”,并向网络上发送“进程启动成功消息”。输入条件为S09。当本应用连接实时数据库成功后,表明本应用具备了访问和操作实时数据库的能力,将进程的状态标志设置为“运行”状态,并向网络上发送“进程启动成功消息”通知其它节点,然后进入S11。
S11-启动心跳。此步骤的功能是在外围应用连接实时数据库成功后,建立一个类似于“心跳”的机制,表明本应用的运行状态是否正常。
S12-成功返回。本步骤表明本应用连接实时数据库的过程顺利完成。
S13-失败返回。本步骤表明本应用连接实时数据库失败。
●实时数据库的应用接口函数
实时数据库为外围的应用提供了简单明确的应用程序接口(API)函数库并存放于RtdbProt.dll中,其它应用程序可以通过调用该文件中的各个API函数实现对实时数据库的访问和操作。这些API包括:
■Short RtGetStationEleIDByKey(byte bDataType,short siStKey,short siKey,short siParam)由站数据库的元素KEY值获取元素ID
■short RtGetStationEleIDByName(byte bDataType,char*pName,short siParam1,short siParam2)由站数据库的元素名称获取元素ID
■short RtGetStationEleIDByGateName(bytebDataType,char*pName,short siParam1,shortsiParam2)由站数据库的控点名称获取测点元素的ID
■short RtGetStationEleIDByIOAddrName(bytebDataType,char*pName,short siParam1,shortsiParam2)由站数据库的IO地址名称获取测点元素的ID
■short RtGetSysEleIDByKey(byte bDataType,shortsiStKey,short siKey)由系统库的元素KEY值获取元素的ID
■short RtGetSysEleIDByName(byte bDataType,shortsiStID,char*pName)由系统库的元素名称获取元素的ID
■short RtGetPowerEleIDByKey(byte bDataType,shortsiKey)由电力参数库的元素KEY值获取元素ID
■short RtGetPowerEleIDByName(byte bDataType,char*pName)由电力参数库的元素名称获取电力元素ID
■short RtGetStationNum(void)获取实时库中站的个数
■short RtGetStationEleNum(short siStID,bytebDataType,short siParam)获取指定站内指定元素的个数
■BOOL RtGetStationByID(short siStID,tagSubStation*pOutData)通过站ID获取指定站信息
■BOOL RtGetStationEleByID(short siStID,bytebDataType,short siEleID,Char*pOutData,shortsiParam)获取站内指定元素信息
■BOOL RtSetStationEleAttr(byte bDataType,shortsiEleID,short siAttr,char*plnData,short siParam1,short siParam2)修改站数据库属性
■ ......
本系统可应用于电网继电保护及故障信息处理系统的主站、分站和子站。通过全分布式的实时数据库构造方法,可以灵活地实现系统模块的功能裁剪,并可以做到主站、分站和子站软件的统一。