双点合成装置的制作方法

文档序号:7493576阅读:217来源:国知局
专利名称:双点合成装置的制作方法
技术领域
本发明涉及一种电力系统通讯的装置,特别是一种变电站通讯的远动装置。
背景技术
在变电站监控系统中,远动装置负责收集变电站内所有采集、测控单元的数据,并 上传到远方调度系统(包括省调、地调等),这些数据既包括普通的开入节点信号,也包括 拥有双位置的开关位置信号,准确反映这些信号的状态信息对于远动装置来说非常重要。 普通的开入节点只有两种状态“闭合”和“断开”,这种信号称作单点信号。而开关位置由 两个开入节点组成,一个是“合位”,一个是“跳位”,通过这两个单点信号的两两组合,全面 描述了开关的实际情况“闭合”、“断开”、“中间态”和“故障态”,这种信号则被称作双点信 号。在变电站监控系统中,采集、测控单元按照单点方式采集开关位置信号,而调度系统则 通过双点方式显示开关位置状态,信号转换由远动装置来实现。在开关快速变化时,如何正 确的将两个单点信号合成为一个双点信号,是远动装置实现的难点。变电站监控系统的典型结构如图1所示,远动装置合成开关位置需经过几个层 次,各个层次中可能出错的环节采集、测控单元将从变电站采集到的开关的“合位”和“跳 位”信号传送到远动装置(远动工作站),远动装置将这两个信号合成为一个开关位置信号 发送给远方的调度系统。远动装置的双点合成模块在合成开关位置时,直接从实时数据库 中获取“合位”和“跳位”的状态合成开关位置信息。当被采集的开关发生快速切换时,合成 结果完全受合成时刻的影响在开关还未完全到位时,双点合成模块只刷新了实时数据库 中“合位”或“跳位”其中一个节点的状态,此时实时数据库就会产生多余的“中间态”;而在 开关多次动作已经完成后,双点合成模块才实施合成,则会丢失中间明确状态(“闭合”或 “断开”)的变化过程。通过上述环节得知双点合成时刻实时数据库中的节点状态,不能动 态反映开关的变化过程,特别是当开关发生快速切换时,双点合成的节奏如果不能与开关 的实际动作保持一致,则合成结果就不能体现开关的真实变化过程。双点合成的节奏由远 方调度系统转发数据的节奏所决定,而开关的动作时间是完全随机的,两者不能做到节奏 的同步。因此,要实现开关快速变化过程中不丢失信号,在开关的任一节点发生变化时,均 需要详细记录下“合位”和“跳位”两个节点的状态。而为了避免双点合成产生多余的“中 间态”,需要对“中间态”进行防抖处理。如图2所示,现有技术的远动装置双点合成由实时数据处理模块、实时数据库和 双点合成模块连接构成。实时数据处理模块负责收集变电站监控系统内所有采集、测控单 元监测的开关的“合位”和“跳位”位置信号,并将其保存到实时数据库中,双点合成模块根 据远方调度系统的节奏,提取实时数据库中保存的合成时刻的“合位”和“跳位”信号,合成 开关的位置信号,发往远方调度系统。在双点合成时,可能会出现开关变化还未完全到位的 情况,也可能会出现开关已发生多次变位的情况,导致双点合成时产生多余的“中间态”,或 双点合成时丢失中间明确状态(“闭合”或“断开”)的变化过程。

发明内容
本发明的目的是提供一种双点合成装置,要解决的技术问题是远动装置在将开关 的两个单点信号合成为一个双点信号时,既不丢失变化过程中开关的明确状态,也不多发 开关动作时瞬时的“中间态”。本发明采用以下技术方案一种双点合成装置,设有实时数据处理模块、实时数 据库和双点合成模块,实时数据处理模块用于检测开关节点的实时静态状态,与实时数据 库中的开关节点状态进行对比后更新实时数据库中的开关节点静态状态,实时数据库用于 存储开关节点静态状态,双点合成模块用于提取实时数据库中的开关节点静态状态,合成 开关的静态位置信号,所述实时数据处理模块与双点合成模块之间设置有变化事件处理模 块,变化事件处理模块中设置变化事件队列,用于将实时数据处理模块收到的开关节点变 化的动态过程,存储为变化事件记录;双点合成模块提取变化事件队列中的变化事件记录, 合成开关的动态位置信号。本发明的双点合成模块提取变化事件记录前,该记录标识为未处理标记;双点合 成模块提取变化事件记录后,该记录标识为已处理标记。本发明的变化事件记录记载的信息为当前变化节点的状态、实时数据库中开关另 一个未变化节点的状态和变化的时间。本发明的变化事件记录按照时间的先后顺序排列。本发明的双点合成模块搜索变化事件记录,提取最先发生的未处理记录,并从该 记录开始向后搜索。本发明的双点合成模块获取开关动作时,以第一个变化节点的变化事件记录作为 当前节点,合成双点信息。本发明当前节点的变化事件记录中存储了该节点的变化状态和另一节点的未变 化状态。本发明的双点合成模块搜索与当前节点相匹配的另一节点的信号变位记录,另一 节点还未发生变位,则延时等待5秒钟,延时等待5秒钟后,仍未搜索到与当前节点相匹配 的记录,根据第一条记录中存储的两个节点状态合成双点信息。本发明的双点合成模块搜索过程中,遇到当前节点再次发生变位时,或者另一节 点与当前节点发生相同的变化,则认为开关发生了下一次动作,这两条记录分属于两次不 同的动作,根据第一条记录中存储的两个节点状态合成开关位置,下一次动作的第二条记 录作为下一次合成的第一条记录。本发明的双点合成模块搜索过程中,搜索到节点与状态完全匹配的信号变位记录 时,将两条记录中变化节点的状态进行合并,根据第二条变位记录中的变化时间,标识开关 的动作时间。本发明与现有技术相比,实时数据处理模块检测信号的实时状态,与实时数据库 中的状态进行对比,如果信号发生变化,不仅更新实时数据库中的静态信号状态,而且将变 化的信号动态状态添加到变化事件处理模块中去,双点合成模块检索变化事件处理模块的 变化事件队列中是否存在新事件,没有新事件时从实时数据库中获取信号进行合成,有新 事件时则搜索开关动作的两个过程事件,提取过程中的变化动态信号进行合成,并从事件 队列中标记或删除已处理的事件,实现变化过程中双点信号不丢失、不多发。


图1是变电站监控系统的结构图。图2是现有技术的双点合成装置的结构图。图3是本发明实施例的双点合成装置的结构图。图4是开关从“断开”到“闭合”的示意图。图5是开关从“闭合”到“断开”的示意图。
具体实施例方式下面结合附图和实施例对本发明作进一步详细说明。如图3所示,本发明的双点 合成装置,在实时数据处理模块与双点合成模块之间并联设置实时数据库和变化事件处理 模块。远动装置的实时数据库保存节点变化后的最新静态状态,变化事件处理模块设有变 化事件队列,变化事件队列保存节点的变化动态状态过程,变化事件队列按照时间的先后 顺序记录变化过程的数据,与变化过程完全保持一致。如图4所示,开关合闸时,在t0时刻“跳位”节点从“闭合”状态变化为“断开”状 态,在tl时刻“合位”节点从“断开”状态切换到“闭合”状态。从to时刻到tl时刻,开关 处于“合位”和“跳位”均为“断开”状态的中间过程。这个中间过程持续的时间不会太长, 一般均在5秒以内。同时,开关在动作的过程中,“合位”和“跳位”节点总是伴随着发生相 反的动作变化,一个节点“闭合”,另一个节点就必然“断开”,这样的两个变化为相匹配的变 化。开关动作时,中间过程中产生的“合位”和“跳位”均为“断开”的状态称为“中间 态”,该状态为瞬时的状态,不具有监视的意义,因此,远动装置需要将这种瞬时的中间态进 行防抖处理当远动装置监视到开关的某一节点变化后,需要等待一段时间,当另一个相匹 配节点变化发生后,开关的动作才完全到位,此时双点合成模块才能双点合成。如图5所 示,开关的“合位” “断开”后,与其相匹配的变化是“跳位”的“闭合”,而“跳位”的“闭合” 并不是即刻产生的,它是在tl-tO的一段时间后才被远动装置所监视到。因此,远动装置需 要通过一个大于tl-tO的时间片进行过滤,才能避免发送瞬时的“中间态”。实时数据处理模块负责收集变电站监控系统内所有采集、测控单元监测的开关的 单点信号,并检测出信号是否发生变化。实时数据处理模块通过通讯网络采集、测控单元获 取开关的节点状态,与实时数据库中原有的开关节点状态进行比较,如果两者的状态不一 致则意味着开关的节点状态发生了变化。首先,实时数据处理模块将新的开关节点静态状 态写入实时数据库,更新实时数据库中开关节点的静态状态数据。然后,实时数据处理模块 生成一条变化事件记录,记录的信息包括当前变化节点的状态、实时数据库中开关另一个 未变化节点的状态、变化的时间。变化事件记录以时间的先后顺序保存于变化事件处理模 块的变化事件队列中。双点合成模块未搜索提取前的变化事件记录标记为未处理,搜索提 取后的变化事件记录标记为已处理。双点合成模块合成开关的位置信号时,首先检查变化事件处理模块的变化事件队 列中是否产生了新的变化事件记录。若没有新的事件记录则意味着开关没有发生过变化, 双点合成模块直接提取实时数据库中的节点静态状态进行双点合成。若有新的事件记录则提取该记录,并从该记录开始向后搜索。当未搜索到同一开关相匹配的记录时,延时5秒 钟,以避免产生瞬时的“中间态”。当搜索到的记录与开关变化规则相匹配时,将该两条记录 合并处理为一次动作变化。双点合成模块将“跳位”的“断开”与“合位”的“闭合”,合并为 开关的“闭合”,将“合位”的“断开”与“跳位”的“闭合”,合并为开关的“断开”,然后从变化 事件队列中将这两条记录标记为已处理。在等待的5秒钟后未搜索到相匹配的第二条记录 时,则使用第一条记录中保存的开关两个节点的状态参数合成双点信号。本发明的双点合成装置的工作过程一、检测开关的信号变化实时数据处理模块通过物理介质以太网、串口或现场总 线与变电站内的采集、测控单元建立通讯联系,收集开关的“合位”和“跳位”节点信号。在 实时数据处理模块更新实时数据库中的信号之前,实时数据处理模块首先检查获取的节点 信号与实时数据库中存储的节点信号是否一致。如果当前实时数据处理模块信号与实时数 据库中的信号一致,则不作任何处理。如果当前实时数据处理模块信号与实时数据库中的 信号不一致,则产生一条信号变化事件记录,记录存储在变化事件处理模块的变化事件队 列中。变化事件记录的队列采用双重标识来区分是否已提取处理,双重标识为未处理或已 处理的记录。通过双重标识,可以让双点合成模块快速搜索和定位变化事件记录。实时数据处理模块在存储变化事件记录时,不仅将变化节点的当前状态,例如“合 位”,保存在变化事件记录中,还保存开关另一节点的状态,例如“跳位”,以备在开关发生故 障仅有一个节点动作时,也能够提供正确的动作记录。二、开关信号的双点合成远动装置在向远方调度系统转发开关的双点信号时调 用双点合成模块实时合成,双点合成模块通过两种途径合成开关位置信号,一个是静态的 位置信号,另一个则是动态的变化信号。双点合成模块首先检测是否有动态的变化信号,判 断的依据是变化事件队列中是否有新纪录,即标识为未处理的记录。若没有动态的变化信 号,双点合成模块直接合成静态的双点信号。合成静态的双点信号时,从实时数据库中提取 “合位”和“跳位”信号合成开关的最终状态,合成的结果是完全确定的。合成动态的双点信号时,要借助变化事件队列的帮助,根据开关变化的实际规则, 将“合位”和“跳位”相匹配,即发生相反变化(一个“闭合”,另一个“断开”)的两条变化事 件记录合并为一条开关动作记录,其中还需要考虑到开关发生故障的异常情况,具体分别 为1、双点合成模块搜索变化事件队列的双重标识,获取开关动作时,以第一个变化 节点(如图4中t0时刻的“跳位”)的变化事件记录合成双点信息,该记录中存储了该节点 的变化状态和另一节点(如图4中t0时刻的“合位”)的未变化状态,变化的该节点即为当 前节点;2、双点合成模块搜索与当前节点(前述第一个变化节点)相匹配的另一节点的变 化事件记录,搜索过程中,如果另一节点还未发生变位,则延时等待5秒钟,延时等待5秒钟 后,仍未搜索到与当前节点相匹配的记录,则根据第一条记录中存储的两个节点状态合成 双点信息;搜索过程中,遇到当前节点再次发生变位时,或者另一节点与当前节点发生相同 的变化,如闭合”或“断开”,则认为开关发生了下一次动作,这两条记录分属于两次不同的 动作,因此直接根据第一条记录中存储的两个节点状态合成开关位置,下一次动作的第二
6条记录作为下一次合成的第一条记录,供继续搜索匹配;搜索过程中,搜索到节点与状态完全匹配的信号变位记录时,将两条记录中变化 节点的状态进行合并,并根据第二条变位记录中的变化时间标识开关的动作时间。实施例1 本发明的双点合成装置,远动装置硬件采用深圳南瑞科技有限公司 ISA-301C型远动工作站,主控软件系统采用VxWorks,采用C程序语言Tornado 2. 2实现。实时数据处理模块更新实时数据库,并检查信号是否发生变化的命令BOOLEAN Data_SaveValueYX(tagPUnitVal ptUnitVal, WORD wUnitID,WORD wChannel, BYTE byStatusYX, BYTE byAttr){tagTimeBCDtTimeSOE ;tagPTypeSet ptTypeSet ;tagPRtdbPosi ptRtdbPosi ;WORDwIndexYX_All, wOffsetCH, wPosiYX ;if (0 == ptUnitVal) return FALSE ;/*Validaty Checking*/ptTypeSet = ptUnitVal->ptTypeSet ;ptRtdbPosi = &ptUnitVal->tRtdbPosi ;wOffsetCH = wChannel-ptTypeSet->wBaseCH_YX ;H遥信通道号偏移wIndexYX_All = ptRtdbPosi->wBaseDB_YX+wOffsetCH ;//在全遥信库中的位置if(C0NST_NUM_YX< = ptRtdbPosi_>wBaseDB_YX)return FALSE ;H信号在数据库中偏移错误if(wChannel<ptTypeSet->wBaseCH_YX)return FALSE ;//通道号无效过小if(wOffsetCH) = ptTypeSet->wNumYX)return FALSE ;//通道号无效过大/氺Update the digital database here*/wPosiYX = ptRtdbPosi->wBaseDB_YX+wOffsetCH ;if (wPosiYX) = C0NST_NUM_YX)return FALSE ;H信号在数据库中偏移错误g_wFlagYX[wPosiYX] = C0NST_QDS_NEff ;Il更新标志if (g_byDataYX[wPosiYX] == byStatusYX) return TRUE ;//状态无变化g_byDataYX[wPosiYX] = byStatusYX ;if (g_tSysVal. blnitNow) return TRUE;//系统初始化时不产生COS和SOEi f(byAttr&C0NST_FLAG_DATA_F0RM_C0S)
7
{/氺form COS here*/Event_FormRecordCOS (wUnitID, wChannel, wIndexYX_All,byStatusYX);}i f(byAttr&C0NST_FLAG_DATA_F0RM_S0E){/*form SOE here*/Time一GetSystemTimeBCD(&tTimeS0E);Event_FormRecordSOE(wUnitID, wChannel, wIndexYX_All,byStatusYX,&tTimeS0E);}return TRUE ;}实时数据处理模块形成变化事件队列,保存开关位置两个节点的当前状态的变化事件记录的命令11 ===============================//形成SOE事件记录//VlndexYX_All超出允许范围,则认为是普通遥信,重新计算出全遥信库位置BOOLEAN Event_FormRecordSOE(WORD wUnitID, WORD wChannel,WORD wIndexYX_All, BYTE byStatus, tagPTimeBCD ptTimeAct){tagPTypeSetptTypeSet ;tagPUnitValptUnitVal ;tagPRtdbPosi ptRtdbPosi ;tagPQueueCtrl ptQueueCtrl ;tagPRecordSOE ptRecordSOE ;tagPTimeBCDptTimeSoe ;WORDwOffsetCH, wSave, wCmp, wLoop ;if(FALSE = = Fun_GetUnitVariabIeByID(wUnitID, &ptUnitVal)) returnFALSE ;if (wIndexYX_All> = C0NST_NUM_YX){//VlndexYX_All超出允许范围,则认为是普通遥信,重新计算出全遥信库位置ptTypeSet = ptUnitVal->ptTypeSet ;ptRtdbPosi = &ptUnitVal->tRtdbPosi ;if(PtRtdbPosi->wBaseDB_YX> = C0NST_NUM_YX)returnFALSE ; //信号在数据库中偏移错误
wOffsetCH = wChannel-ptTypeSet_>wBaseCH_YX ;//遥信通道号偏移if(wOffsetCH) = ptTypeSet->wNumYX)return FALSE ;//通道号无效过大if(wChannel<ptTypeSet->wBaseCH_YX)return FALSE ;//通道号无效过小wIndexYX_All = ptRtdbPosi->wBaseDB_YX+wOffsetCH ;//在全遥信库中的位置if (wIndexYX_All> = C0NST_NUM_YX)return FALSE ;H信号在数据库中位置错误}//过滤重复的记录ptQueueCtrl = &g_tQueueS0E. tQueueCtrl ;if (ptUnitVal->ptUnitSet->bySlotNo = = g_tSysVal. bySlotNo){//本板的记录需要过滤,通过FIFO传的记录可以不过滤ptTimeAct->byDate = 0 -J/清除星期,防止比较时出错wCmp = ptQueueCtrl->wSave ;for (wLoop = 0 ;wLoop<64 ;wLoop++){wCmp—;PtRecordSOE =&g_tQueueS0E. tRecordSOE [wCmp% C0NST_NUM_REC_S0E];if(ptRecordS0E->wUnitID ! = wUnitID)continue ;if(ptRecordS0E->wChannel ! = wChannel)continue ;if(ptRecordS0E->byStatus ! = byStatus)continue ;if (memcmp ((void*)ptTimeAct, (void*) (&ptRecordS0E->tTimeBcdS0E), sizeof (tagTimeBCD)) ! = 0) continue ;return FALSE ;// 重复的记录}}semTake(ptQueueCtrl->ptSemID, WAIT_F0REVER) ;// 获取写权限wSave = ptQueueCtrl->wSave ;ptRecordSOE =&g_tQueueS0E. tRecordSOE [wSave % C0NST_NUM_REC_S0E];Time_GetSystemTimeTAG(&ptRecordSOE->tTimeTagRecv) ;//接收时间ptTimeSoe = &ptRecordS0E->tTimeBcdS0E ;// 发
9
生时间memcpy ((void*)ptTimeSoe, (void*)ptTimeAct, sizeof (tagTimeBCD));ptRecordSOE->wIndex = wIndexYX_All ;// 在全遥信库中的位置ptRecordSOE->wUnitID = wUnitID ;ptRecordSOE->wChannel = wChannel ;ptRecordSOE->byStatus = byStatus ;if(g_tPosiYX[wIndexYX_All]. wRES<CONST_NUM_YX)//双点遥信中另一态遥信的当前状态{ptRecordSOE->byRES =g_byDataYX[g_tPosiYX[wIndexYX_Al1]. wRES];}for (wLoop = 0 ;wLoop<C0NST_NUM_H0ST ;wLoop++) //置记录有效标志{ptRecordS0E->bVal id [wLoop] =TRUE;}wSave = wSave+1 ;ptQueueCtrl->wSave = wSave ;if(wSave> = C0NST_NUM_REC_S0E)ptQueueCtrl->bFul1 = TRUE ;semGive (ptQueueCtrl->ptSemID) ;//释放写权限if((TRUE = = g_tSysSet. bHaveBAK)&&(ENUM_R0LE_SLAVER= = g_tSysVal. wMachineRole)){//不用发送,置读写指针一致for(wLoop = 0 ;wLoop<(C0NST_NUM_H0ST+2) ;wLoop++){ptQueueCtrl->wRead[wLoop] = ptQueueCtrl->wSave ;}}return TRUE ;}远动装置采用IEClOl协议向远方调度系统转发开关的双点信号的命令11 ===============================//发送 SOE//返回值TRUE 有数据发送,FALSE 没有新数据//===============================
10SendS0E(BYTE byHostNo)
0185]{
0186]tagPHostMapptHostMap ;
0187]tagPQueueCtrl ptQueueCtrl ;
0188]taglOIFrame t10IFrame ;
0189]tagPRecordSOE ptRecordSOE ;
0190]tagPTimeBCDptTimeBcdSOE ;
0191]WORD
0192]wReadCtrl, wlndexMap, wMaxIndexDP, wLoop, wRtdbPosO, wRtdbPosl, ^pwMapYX ;
0193]BYTE
0194]^pbyObjBuff, byLenTime, bySendYX, byLen, byPos, byStatus2 ;
0195]if (FALSE
0196]== Event_GetHostFirstYXRcd(byHostNo, &wReadCtrl, EMUN_ARRAY_S0E))
0197]return FALSE ;//没有属于本调度的SOE记录
0198]ptHostMap = g_tHostVal[byHostNo]. ptHostMap ;
0199]wMaxIndexDP = ptHostMap->wNumYX_DP l ;// 一个 DP
0200]占用两个遥信库位置
0201]ptQueueCtrl = &(g_tQueueS0E· tQueueCtrl);
0202]ptRecordSOE =
0203]& (g_tQueueS0E· tRecordS0E[wReadCtrl% C0NST_NUM_REC_S0E]);
0204]wlndexMap = Fun_GetHostIndexYX(byHostNo, ptRecordS0E->wIndex);
0205]H获取调度遥信转发表序号
0206]byLenTime = Rtu_IEC101_GetLenTime(byHostNo);
0207]if (byLenTime ==2)
0208]{
0209]if (wIndexMap<wMaxIndexDP)tl01Frame. byASDUType = 31 ;
0210]//双点遥信
0211]elsetlOlFrame. byASDUType = 30 ;
0212]//单点遥信
0213]}else
0214]{
0215]if (wIndexMap<wMaxIndexDP)tlOlFrame. byASDUType = 4 ;
0216]//双点遥信
0217]elsetlOlFrame. byASDUType = 2 ;
0218]//单点遥信
0219]}
0220]byPos = 0 ;
0221]bySendYX = 0 ;
11
pwMapYX—ptHostMap一>wMapYX
for(wLoop一0;wLoop<CONS/一NUM—REC—SOE;wLoop++)
{
i f(FALSE
一一Event—GetHostFirstYXRcd(byHostNo,&wReadCtrl,EMUN_ARRAY—SOE))
break;//无新的SOE
ptRecordSOE二
&(g_tQueueSOE.tRecordSOE[wReadCtrl%CONST—NUM REC—SOE]);
//保存当前SOE记录指针
wIndexMap—Fun—GetHostIndexYX(byHostNo,
ptRecordSOE一>wIndex);//获取调度遥信转发表序号
pbyObjguff一&t 10 1Frame.byObjBuff[byPos];
if(wIndexMap>一wMaxIndexDP)
{//单点遥信
if((t101Frame.byASDUType!一
2)&&(t 10 1Frame.byASDUType!一30))break;
byLen—Rtu—IECl0I_SendSPSOE(byHostNo,ptRecordSOE,
pbyObjguff);
}
else
{//双点遥信
if((t101Frame.byASDUType!一
4)&&(t 10 1Frame.byASDUType!一3 1))break;
DtTimeBCdS。E一0
if(W工ndeXMap&oX01)//奇数(IN变化)
{
wRtdbPos0一pwMapYX[wIndexMap—1];
wRtdbPos l—pwMapYX[wIndexMap];
if(wRtdbPos0一一g_tPosiYX[wRtdbPosl].wRES)byStatus2
一Event—GetHostAnotherSOE(byHostNo,&ptTimeBCdS。E);
else
byStatus2一g_byDataYX[wRtdbPos0];
if(ptTimeBCdS。E一一0)ptTimeBCdS。E一
&DtReC。rdS。E一>tTimeBCdS。E
byLen—Rtu—IECl0 1一SondDPSOE(byHostNo,wIndexMap,
byStatus2,ptRecordSOE一>byStatus,pbyObjguff,ptTimeBCdS。E);
}
else //偶数(Tw变化)
{
wRtdbPosO = pwMapYX[wlndexMap];wRtdbPosl = pwMapYX[wlndexMap+l];if (wRtdbPosl == g_tPosiYX [wRtdbPosO]. wRES) byStatus2= Event_GetHostAnotherSOE(byHostNo, &ptTimeBcdS0E);elsebyStatus2 = g_byDataYX[wRtdbPosl];if (ptTimeBcdSOE = = 0)ptTimeBcdSOE =&ptRecordS0E->tTimeBcdS0E ;byLen = Rtu_IEC101_SendDPS0E(byHostNo, wlndexMap,ptRecordS0E->byStatus, byStatus2, pbyObjBuff,ptTimeBcdSOE);}}H更新指针ptQueueCtrl->wRead[byHostNo] = (++wReadCtrl);if (byLen){byPos+ = byLen ;bySendYX++ ;}if (byPos>220) break ;//ASDU 最长长度为 249 = 11+238if (bySendYX〉= 127) break ;//每次最多送127个SP信号量}if (bySendYX){tlOlFrame. byFrameType = IEC_LFR_START_C0DE ;// 长祯起始符110IFrame. byControl = 0x08 ;// 控制域110 IFrame. byVSQ = bySendYX ;// 可变结构限定词110 IFrame. wCOT = 0x03 ;// 传送原因突发110IFrame. byLenObj = byPos ;// 信息体集长度Rtu_IEC101_Send_Link_Frame(byHostNo,&t10IFrame);return TRUE ;}
13
else return FALSE ;}双点合成模块提取第一个未处理的变位事件记录的命令//===============================Il返回第一个C0S/S0E记录信息的读指针//=================BOOLEAN Event_GetHostFirstYXRcd(BYTE byHostNo, WORD^pwRead,BYTE byFlag){tagPQueueCtrlptQueueCtrl ;WORDwReadCtrl, wSaveCtrl, wMaxNum ;if(byHostNo) = C0NST_NUM_H0ST+2)return FALSE ;switch (byFlag){case EMUN_ARRAY_C0S ptQueueCtrl = &g_tQueueC0S. tQueueCtrl ;wMaxNum = C0NST_NUM_REC_C0S ;break ;case EMUN_ARRAY_S0E ptQueueCtrl = &g_tQueueS0E. tQueueCtrl ;wMaxNum = C0NST_NUM_REC_S0E ;break ;default return FALSE ;}wSaveCtrl = ptQueueCtrl->wSave ;wReadCtrl = ptQueueCtrl->wRead[byHostNo];if((WORD)(wSaveCtrl-wReadCtrl)> = wMaxNum){/氺The Queue have been FULL since last reading氺/wReadCtrl = wSaveCtrl-wMaxNum+1 ;ptQueueCtrl->wRead[byHostNo] = wReadCtrl ;}//CPU板上搜索COS和SOE时需根据转发表判断if(byHostNo<C0NST_NUM_H0ST){tagPHostMap ptHostMap ;WORDwLoopl, wYXIndex, wlndexMap ;
BOOLEANbValid ;for (wLoopl = 0 ;wLoopKwMaxNum ;wLoopl++){if (wReadCtrl == wSaveCtrl)return FALSE ;if (byFlag = = EMUN_ARRAY_C0S){wYXIndex =g_tQueueC0S. tRecordCOS [wReadCtrl % wMaxNum]. wlndex ;bValid =g_tQueueC0S. tRecordCOS [wReadCtrl % wMaxNum]. bValid [byHostNo];}else{wYXIndex =g_tQueueS0E. tRecordSOE [wReadCtrl % wMaxNum]. wlndex ;bValid =g_tQueueS0E. tRecordSOE [wReadCtrl % wMaxNum]. bValid [byHostNo];}wlndexMap = Fun_GetHostIndexYX(byHostNo, wYXIndex);if (wlndexMap ! = OxFFFFMbValid == TRUE){if (byFlag = = EMUN_ARRAY_S0E) // 目前只处理 SOE{ptHostMap = g_tHostVal[byHostNo]. ptHostMap ;if(wIndexMap<(p tHo s tMap->wNumYX_DP 1)){//需要延时判断双点SOE匹配情况tagPRecordSOEptRecordSOEl,ptRecordS0E2 ;tagTimeTAG tTimeTAG ;WORDwLoop2, wSrchlndex, wReadTemp, ^pwMapYX ;BOOLEANbFound ;shortshRange ;pwMapYX = ptHostMap->wMapYX ;wSrchlndex = (wlndexMap&l) ?pwMapYX[wlndexMap-l] pwMapYX[wlndexMap+l];if (wSrchlndex ==g_tPosiYX[wYXIndex]. wRES){//转发表中匹配的双点与系统中匹配的双点
15
一致ptRecordSOEl =&g_tQueueS0E. tRecordSOE [wReadCtrl % C0NST_NUM_REC_S0E];wReadTemp = wReadCtrl ;bFound = FALSE ;for (wLoop2 = O ;wLoop2<C0NST_NUM_REC_S0E ;wLoop2++){//搜寻与之匹配的双点SOEwReadTemp++ ;if (wReadTemp = = wSaveCtrl) break ;ptRecordS0E2 =&g_tQueueS0E. tRecordSOE [wReadTemp % C0NST_NUM_REC_S0E];if (wYXIndex ==ptRecordS0E2->wIndex)break ;if (wSrchlndex ==ptRecordS0E2->wIndex){if (ptRecordS0E2->byStatus ==ptRecordS0El->byStatus)break ;bFound = TRUE ;break ;}}if (bFound = = FALSE){//未找到匹配的SOE则需判断接收时间是否超过延时Time一GetSystemTimeTAG(&tTimeTAG);shRange = tTimeTAG. Second-ptRecordSOEl->tTimeTagRecv. Second ;if(shRange<-2)shRange = shRange+60 ;if(shRange<5)return FALSE;}}}}^pwRead = wReadCtrl ;return TRUE ;}
wReadCtrl++ ;ptQueueCtrl->wRead[byHostNo] = wReadCtrl ;}}^pwRead = wReadCtrl ;if (wReadCtrl == wSaveCtrl) return FALSE ;elsereturn TRUE ;}双点合成模块搜索与第一条记录相匹配的下一条变化事件记录的命令11 ===============================//返回调度双点遥信中另一个遥信的状态11 ===============================BYTE Event_GetHostAnotherSOE(BYTE byHostNo, tagPTimeBCD^pptTimeBcdSOE){tagPQueueCtrl ptQueueCtrl ;tagPRecordSOE ptRecordSOE ;WORDwReadCtrl, wLoop, wlndex, wSrchlndex;BYTEbyStatusl, byStatus2 ;ptQueueCtrl = &g_tQueueS0E. tQueueCtrl ;wReadCtrl = ptQueueCtrl->wRead[byHostNo];ptRecordSOE =&g_tQueueS0E. tRecordSOE [wReadCtrl % C0NST_NUM_REC_S0E];byStatusl = ptRecordS0E->byStatus ;byStatus2 = ptRecordS0E->byRES ;wlndex = ptRecordS0E->wIndex ;wSrchlndex = g_tPosiYX[wlndex]. wRES ;for (wLoop = 0 ;wLoop<C0NST_NUM_REC_S0E ;wLoop++){wReadCtrl++ ;if(wReadCtrl = = ptQueueCtrl->wSave)break ;ptRecordSOE =&g_tQueueS0E. tRecordSOE [wReadCtrl % C0NST_NUM_REC_S0E];if(wlndex = = ptRecordS0E->wIndex)break ;if(wSrchlndex = = ptRecordS0E->wIndex){if (byStatusl = = ptRecordS0E->byStatus)break ;
ptRecordSOE->bValid[byHostNo] =FALSE;^pptTimeBcdSOE = &ptRecordS0E->tTimeBcdS0E ;return ptRecordSOE->byStatus ;}}^pptTimeBcdSOE = 0 ;return byStatus2 ; }
权利要求
一种双点合成装置,设有实时数据处理模块、实时数据库和双点合成模块,实时数据处理模块用于检测开关节点的实时静态状态,与实时数据库中的开关节点状态进行对比后更新实时数据库中的开关节点静态状态,实时数据库用于存储开关节点静态状态,双点合成模块用于提取实时数据库中的开关节点静态状态,合成开关的静态位置信号,其特征在于所述实时数据处理模块与双点合成模块之间设置有变化事件处理模块,变化事件处理模块中设置变化事件队列,用于将实时数据处理模块收到的开关节点变化的动态过程,存储为变化事件记录;双点合成模块提取变化事件队列中的变化事件记录,合成开关的动态位置信号。
2.根据权利要求1所述的双点合成装置,其特征在于所述双点合成模块提取变化事 件记录前,该记录标识为未处理标记;双点合成模块提取变化事件记录后,该记录标识为已 处理标记。
3.根据权利要求2所述的双点合成装置,其特征在于所述变化事件记录记载的信息 为当前变化节点的状态、实时数据库中开关另一个未变化节点的状态和变化的时间。
4.根据权利要求3所述的双点合成装置,其特征在于所述变化事件记录按照时间的 先后顺序排列。
5.根据权利要求4所述的双点合成装置,其特征在于所述双点合成模块搜索变化事 件记录,提取最先发生的未处理记录,并从该记录开始向后搜索。
6.根据权利要求5所述的双点合成装置,其特征在于所述双点合成模块获取开关动 作时,以第一个变化节点的变化事件记录作为当前节点,合成双点信息。
7.根据权利要求6所述的双点合成装置,其特征在于所述当前节点的变化事件记录 中存储了该节点的变化状态和另一节点的未变化状态。
8.根据权利要求6所述的双点合成装置,其特征在于所述双点合成模块搜索与当前 节点相匹配的另一节点的信号变位记录,另一节点还未发生变位,则延时等待5秒钟,延时 等待5秒钟后,仍未搜索到与当前节点相匹配的记录,根据第一条记录中存储的两个节点 状态合成双点信息。
9.根据权利要求6所述的双点合成装置,其特征在于所述双点合成模块搜索过程中, 遇到当前节点再次发生变位时,或者另一节点与当前节点发生相同的变化,则认为开关发 生了下一次动作,这两条记录分属于两次不同的动作,根据第一条记录中存储的两个节点 状态合成开关位置,下一次动作的第二条记录作为下一次合成的第一条记录。
10.根据权利要求6所述的双点合成装置,其特征在于所述双点合成模块搜索过程 中,搜索到节点与状态完全匹配的信号变位记录时,将两条记录中变化节点的状态进行合 并,根据第二条变位记录中的变化时间,标识开关的动作时间。
全文摘要
本发明公开了一种双点合成装置,要解决的技术问题是远动装置在合成双点信号时,不丢开关的明确状态,不多发瞬时的“中间态”。本发明的装置,设有实时数据处理模块、实时数据库和双点合成模块,实时数据处理模块与双点合成模块之间设置有变化事件处理模块,其中设置变化事件队列,将开关节点变化的动态过程,存储为变化事件记录;双点合成模块提取变化事件队列中的变化事件记录,合成开关的动态位置信号。本发明与现有技术相比,实时数据处理模块检测信号的实时状态,信号发生变化,更新实时数据库中的静态信号状态,将变化的信号动态状态添加到变化事件处理模块中去,双点合成模块提取过程中的变化动态信号进行合成,不丢失、不多发。
文档编号H02J13/00GK101931269SQ200910110449
公开日2010年12月29日 申请日期2009年11月2日 优先权日2009年11月2日
发明者周作超, 廖辉 申请人:深圳南瑞科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1