| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352 |
- /******************************************************************************
- 版权所有:
- 文件名称: Oc.c
- 文件版本: 01.01
- 创建作者: xxxxxx
- 创建日期: 2012-03-28
- 功能说明: 过流保护
- 其它说明:
- 修改记录:
- */
- /*------------------------------- 头文件 --------------------------------------
- */
- #include "head.h"
- /*------------------------------- 宏定义 --------------------------------------
- */
- /*------------------------------ 类型结构 -------------------------------------
- */
- /*------------------------------ 全局变量 -------------------------------------
- */
- /*------------------------------ 函数声明 -------------------------------------
- */
- /*------------------------------ 外部函数 -------------------------------------
- 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
- */
- bool CalDir_A(int sw, bool bQD, bool bInv)
- {
- int indexU, indexI;
- bool bzx = false;
- indexU = PUB_AC_UBC1;
- indexI = UI_SW_INDEX(sw, SW_AC_IA);
- if (!tPT.uPT1DX.bFlag.bPTYC && (g_ui[indexU].m2[0] > pRunSet->dVOL10V_SQR) && bQD) // UBC > 10V
- {
- if (!bInv) // 电流反向
- {
- bzx = PowerDirectionalRelay(g_ui[indexU].ri.r, g_ui[indexU].ri.i, g_ui[indexU].m2[0], g_ui[indexI].ri.r, g_ui[indexI].ri.i, g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN0, COS0, SIN300, COS300); // 计算A相电流方向
- }
- else
- {
- bzx = PowerDirectionalRelay(g_ui[indexU].ri.r, g_ui[indexU].ri.i, g_ui[indexU].m2[0], g_ui[indexI].ri.r, g_ui[indexI].ri.i, g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN180, COS180, SIN120, COS120); // 计算A相电流方向
- }
- }
- return bzx;
- }
- bool CalDir_B(int sw, bool bQD, bool bInv)
- {
- int indexU, indexI;
- bool bzx = false;
- indexU = PUB_AC_UCA1;
- indexI = UI_SW_INDEX(sw, SW_AC_IB);
- if (!tPT.uPT1DX.bFlag.bPTYC && (g_ui[indexU].m2[0] > pRunSet->dVOL10V_SQR) && bQD) // UCA > 10V
- {
- if (!bInv)
- {
- bzx = PowerDirectionalRelay(g_ui[indexU].ri.r, g_ui[indexU].ri.i, g_ui[indexU].m2[0], g_ui[indexI].ri.r, g_ui[indexI].ri.i, g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN0, COS0, SIN300, COS300); // 计算B相电流方向
- }
- else
- {
- bzx = PowerDirectionalRelay(g_ui[indexU].ri.r, g_ui[indexU].ri.i, g_ui[indexU].m2[0], g_ui[indexI].ri.r, g_ui[indexI].ri.i, g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN180, COS180, SIN120, COS120); // 计算B相电流方向
- }
- }
- return bzx;
- }
- bool CalDir_C(int sw, bool bQD, bool bInv)
- {
- int indexU, indexI;
- bool bzx = false;
- indexU = PUB_AC_UAB1;
- indexI = UI_SW_INDEX(sw, SW_AC_IC);
- if (!tPT.uPT1DX.bFlag.bPTYC && (g_ui[indexU].m2[0] > pRunSet->dVOL10V_SQR) && bQD) // UAB > 10V
- {
- if (!bInv)
- {
- bzx = PowerDirectionalRelay(g_ui[indexU].ri.r, g_ui[indexU].ri.i, g_ui[indexU].m2[0], g_ui[indexI].ri.r, g_ui[indexI].ri.i, g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN0, COS0, SIN300, COS300); // 计算C相电流方向
- }
- else
- {
- bzx = PowerDirectionalRelay(g_ui[indexU].ri.r, g_ui[indexU].ri.i, g_ui[indexU].m2[0], g_ui[indexI].ri.r, g_ui[indexI].ri.i, g_ui[indexI].m2[0], pRunSet->dVOL10V_SQR, pRunSet->dIWL_SQR[sw], SIN180, COS180, SIN120, COS120); // 计算C相电流方向
- }
- }
- return bzx;
- }
- bool pro_check_bh_all(int sw)
- {
- if (soe_check(EV_GL1TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_GL2TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_GL3TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_LX1TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_LX2TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_LX3TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_GLJS + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_LXJS + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_FA_GL_TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_FA_LX_TZ + sw * EV_SW_NUM) == true)
- return true;
- #ifdef SOE_RECORD_DELAY
- if (g_soe_queue.fzsoe_wait_flag)
- return true;
- #endif
- return false;
- }
- bool pro_check_gl_all(int sw)
- {
- if (soe_check(EV_GL1TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_GL2TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_GL3TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_GL1GJ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_GL2GJ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_GL3GJ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_GLJS + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_FA_GL_TZ + sw * EV_SW_NUM) == true)
- return true;
- #ifdef SOE_RECORD_DELAY
- if (g_soe_queue.fzsoe_wait_flag)
- return true;
- #endif
- return false;
- }
- bool pro_check_lx_all(int sw)
- {
- if (soe_check(EV_LX1GJ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_LX2GJ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_LX3GJ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_LX1TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_LX2TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_LX3TZ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_LXJS + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_FA_LX_TZ + sw * EV_SW_NUM) == true)
- return true;
- #ifdef SOE_RECORD_DELAY
- if (g_soe_queue.fzsoe_wait_flag)
- return true;
- #endif
- #ifdef FUN_JDXX
- if (soe_check(EV_JDXX_GJ + sw * EV_SW_NUM) == true)
- return true;
- if (soe_check(EV_JDXX_TZ + sw * EV_SW_NUM) == true)
- return true;
- #endif
- return false;
- }
- bool pro_check_fault_all(int sw)
- {
- bool ret;
- ret = pro_check_gl_all(sw) || pro_check_lx_all(sw);
- return ret;
- }
- void pro_check_gl_abc(int sw, DWORD i_set, DWORD I1, DWORD I2, DWORD I3)
- {
- bool bIa, bIb, bIc;
- int ui_begin;
- TRELAY_T *pR = &g_tRelay[sw];
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- bIa = (g_ui[ui_begin + SW_AC_IA].m2[0] > i_set) ? true : false;
- bIb = (g_ui[ui_begin + SW_AC_IB].m2[0] > i_set) ? true : false;
- bIc = (g_ui[ui_begin + SW_AC_IC].m2[0] > i_set) ? true : false;
- if (bIa && bIb && bIc)
- {
- if (soe_check(EV_IABC_GL + sw * EV_SW_NUM) == false)
- {
- soe_record_ev(EV_IABC_GL + sw * EV_SW_NUM, 1, I1, I2, I3);
- pR->bYcRefresh.bAGl = true;
- pR->bYcRefresh.bBGl = true;
- pR->bYcRefresh.bCGl = true;
- }
- }
- else if (bIa && bIb)
- {
- if (soe_check(EV_IAB_GL + sw * EV_SW_NUM) == false)
- {
- soe_record_ev(EV_IAB_GL + sw * EV_SW_NUM, 1, I1, I2, 0);
- pR->bYcRefresh.bAGl = true;
- pR->bYcRefresh.bBGl = true;
- }
- }
- else if (bIa && bIc)
- {
- if (soe_check(EV_ICA_GL + sw * EV_SW_NUM) == false)
- {
- soe_record_ev(EV_ICA_GL + sw * EV_SW_NUM, 1, I1, I3, 0);
- pR->bYcRefresh.bAGl = true;
- pR->bYcRefresh.bCGl = true;
- }
- }
- else if (bIb && bIc)
- {
- if (soe_check(EV_IBC_GL + sw * EV_SW_NUM) == false)
- {
- soe_record_ev(EV_IBC_GL + sw * EV_SW_NUM, 1, I2, I3, 0);
- pR->bYcRefresh.bBGl = true;
- pR->bYcRefresh.bCGl = true;
- }
- }
- else if (bIa)
- {
- if (soe_check(EV_IA_GL + sw * EV_SW_NUM) == false)
- {
- soe_record_ev(EV_IA_GL + sw * EV_SW_NUM, 1, I1, 0, 0);
- pR->bYcRefresh.bAGl = true;
- }
- }
- else if (bIb)
- {
- if (soe_check(EV_IB_GL + sw * EV_SW_NUM) == false)
- {
- soe_record_ev(EV_IB_GL + sw * EV_SW_NUM, 1, I2, 0, 0);
- pR->bYcRefresh.bBGl = true;
- }
- }
- else if (bIc)
- {
- if (soe_check(EV_IC_GL + sw * EV_SW_NUM) == false)
- {
- soe_record_ev(EV_IC_GL + sw * EV_SW_NUM, 1, I3, 0, 0);
- pR->bYcRefresh.bCGl = true;
- }
- }
- }
- void pro_check_fd_gl_abc(int sw, DWORD i_set, DWORD I1, DWORD I2, DWORD I3, int soe_no)
- {
- bool bIa, bIb, bIc;
- int ui_begin;
- u32 code;
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- bIa = (g_ui[ui_begin + SW_AC_IA].m2[0] > i_set) ? true : false;
- bIb = (g_ui[ui_begin + SW_AC_IB].m2[0] > i_set) ? true : false;
- bIc = (g_ui[ui_begin + SW_AC_IC].m2[0] > i_set) ? true : false;
- // soe_no--;
- if ((soe_no == EV_GL1TZ) || (soe_no == EV_GL1GJ))
- code = EV_GL1_IA + sw * EV_SW_NUM;
- else if ((soe_no == EV_GL2TZ) || (soe_no == EV_GL2GJ))
- code = EV_GL2_IA + sw * EV_SW_NUM;
- else if ((soe_no == EV_GL3TZ) || (soe_no == EV_GL3GJ))
- code = EV_GL3_IA + sw * EV_SW_NUM;
- else
- return;
- if (bIa)
- {
- if (soe_check(code) == false)
- {
- soe_record_ev(code, 1, I1, 0, 0);
- }
- }
- if (bIb)
- {
- if (soe_check(code + 1) == false)
- {
- soe_record_ev(code + 1, 1, I2, 0, 0);
- }
- }
- if (bIc)
- {
- if (soe_check(code + 2) == false)
- {
- soe_record_ev(code + 2, 1, I3, 0, 0);
- }
- }
- }
- void pro_rst_fd_gl_event(int sw, int soe_no)
- {
- u32 code;
- if (soe_no == EV_GL1TZ)
- code = EV_GL1_IA;
- else if (soe_no == EV_GL2TZ)
- code = EV_GL2_IA;
- else if (soe_no == EV_GL3TZ)
- code = EV_GL3_IA;
- else
- return;
- if (soe_check(code + sw * EV_SW_NUM) == true)
- {
- soe_record_ev(code + sw * EV_SW_NUM, 0, 0, 0, 0);
- }
- if (soe_check(code + sw * EV_SW_NUM + 1) == true)
- {
- soe_record_ev(code + sw * EV_SW_NUM + 1, 0, 0, 0, 0);
- }
- if (soe_check(code + sw * EV_SW_NUM + 2) == true)
- {
- soe_record_ev(code + sw * EV_SW_NUM + 2, 0, 0, 0, 0);
- }
- }
- void pro_rst_event(int sw, int soe_no)
- {
- if (soe_check(soe_no + sw * EV_SW_NUM) == true)
- {
- soe_record_ev(soe_no + sw * EV_SW_NUM, 0, 0, 0, 0);
- }
- }
- void xb_bs_soe(int sw, u32 dStep)
- {
- int i;
- bool bxb_bs[BHOC_NUMBER] = {false}, xb_soe = false;
- for (i = BH_GL1; i < BHOC_NUMBER; i++)
- {
- TOC_T *poc = &g_tRelay[sw].tOC[i];
- if ((i == BH_GL1) || (i == BH_GL2) || (i == BH_GL3) || (i == BH_GLJS))
- bxb_bs[i] = poc->sta.bFlag.bXBbs;
- else
- bxb_bs[i] = false;
- RunTR(&poc->tXBTime, bxb_bs[i], dStep);
- RunTR(&poc->tXBQD25ms, bxb_bs[i], dStep);
- if ((poc->tXBTime.boolTrip) && (poc->tXBQD25ms.boolTrip))
- {
- xb_soe = true;
- break;
- }
- }
- if (xb_soe)
- {
- if (soe_check(EV_XBBS + sw * EV_SW_NUM) == false)
- {
- soe_record_ev(EV_XBBS + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- }
- else
- {
- if (soe_check(EV_XBBS + sw * EV_SW_NUM) == true)
- {
- soe_record_ev(EV_XBBS + sw * EV_SW_NUM, 0, 0, 0, 0);
- }
- }
- }
- void Pro_OC(int sw, u32 dStep, int oc, int soe_no)
- {
- bool bQDD, bTrip;
- TOC_T *poc = &g_tRelay[sw].tOC[oc];
- OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
- u16 soeno = soe_no + sw * EV_SW_NUM;
- bool bfxmz, bxbbs, bxb;
- int ui_begin;
- bool bIazx, bIbzx, bIczx;
- bool bdyenable = true; // 低电压闭锁
- bool bTz = false;
- // 电流启动
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- poc->sta.bFlag.bIaQD = OverRelay(g_ui[ui_begin + SW_AC_IA].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIaQD);
- poc->sta.bFlag.bIbQD = OverRelay(g_ui[ui_begin + SW_AC_IB].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIbQD);
- poc->sta.bFlag.bIcQD = OverRelay(g_ui[ui_begin + SW_AC_IC].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIcQD);
- bIazx = CalDir_A(sw, poc->sta.bFlag.bIaQD && pSet->bDir, pRunSet->tSwSet[sw].bTT_DIR_Inv); // 方向计算
- bIbzx = CalDir_B(sw, poc->sta.bFlag.bIbQD && pSet->bDir, pRunSet->tSwSet[sw].bTT_DIR_Inv);
- bIczx = CalDir_C(sw, poc->sta.bFlag.bIcQD && pSet->bDir, pRunSet->tSwSet[sw].bTT_DIR_Inv);
- bxb = pRunSet->tSwSet[sw].bTT_bh_xbbs;
- poc->sta.bFlag.bIaxb = bxb && XBCalc(sw, SW_AC_IA, pRunSet->tSwSet[sw].d_bh_xbcoe, poc->sta.bFlag.bIaQD);
- poc->sta.bFlag.bIbxb = bxb && XBCalc(sw, SW_AC_IB, pRunSet->tSwSet[sw].d_bh_xbcoe, poc->sta.bFlag.bIbQD);
- poc->sta.bFlag.bIcxb = bxb && XBCalc(sw, SW_AC_IC, pRunSet->tSwSet[sw].d_bh_xbcoe, poc->sta.bFlag.bIcQD);
- bfxmz = (tPT.uPT1DX.bFlag.bPTYC) // PT异常,自动满足方向
- || (!pSet->bDir) // 方向不投入
- || bIazx || bIbzx || bIczx;
- bQDD = poc->sta.bFlag.bIaQD || poc->sta.bFlag.bIbQD || poc->sta.bFlag.bIcQD;
- bxbbs = (poc->sta.bFlag.bIaxb || poc->sta.bFlag.bIbxb || poc->sta.bFlag.bIcxb); // 谐波闭锁
- #ifndef OCI_XB_0MS
- if (BH_ALL_EN(sw))
- {
- if ((oc == BH_GL1) || (oc == BH_GL2) || (oc == BH_GL3))
- {
- poc->sta.bFlag.bXBbs = (BH_ALL_EN(sw) && (pSet->bTz || pSet->bGj) && bQDD) && bxbbs;
- if (oc == BH_GL1)
- xb_bs_soe(g_protect.sw, dStep);
- }
- }
- #endif
- poc->sta.bFlag.bddyQD = LowRelay(g_sw_pub.m2_min[2], pRunSet->dU_DDYBS, pRunSet->dU_DDYBS, poc->sta.bFlag.bddyQD);
- bdyenable = (!pRunSet->bTT_DDYBS) // 低电压闭锁未投入,自动满足
- || (poc->sta.bFlag.bddyQD && !tPT.uPT1DX.bFlag.bPTYC) // 低电压满足,TV正常
- || (tPT.uPT1DX.bFlag.bPTYC); // PT异常,低电压自动满足
- poc->sta.bFlag.bQD = (BH_ALL_EN(sw) && (pSet->bTz || pSet->bGj) && bQDD && bdyenable && (!bxbbs) && bfxmz);
- if (poc->sta.bFlag.bQD) // 幅值启动
- {
- if (!poc->sta.bFlag.bQDWave)
- {
- rcd_start(sw, RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); // 录波类型:跳闸类
- poc->sta.bFlag.bQDWave = true;
- }
- }
- else
- {
- poc->sta.bFlag.bQDWave = false;
- }
- #ifdef EV_GL_STATR
- gl_start_soe_set(poc->sta.bFlag.bQD, sw, soe_no + 2); // 过流启动SOE
- #endif
- RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
- RunTR(&poc->tQD25ms, poc->sta.bFlag.bQD, dStep);
- // 如果速断时间到,启动时间未到,调用幅值启动加速模块
- if (poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip)
- {
- if (protect_amp_qd_js(sw))
- {
- // 预置25ms,让下个循环再出口
- PreSetTime(&poc->tQD25ms, T_25ms);
- #ifdef CPU_FUXI
- // FUXI平台等待下一个循环会导致偶尔动作时间超40ms,改为不等待,本循环处理完
- poc->tQD25ms.boolTrip = 1;
- #endif
- }
- }
- bTrip = poc->tQDTime.boolTrip && poc->tQD25ms.boolTrip;
- poc->sta.bFlag.bGj = bTrip && pSet->bGj; // 告警
- poc->sta.bFlag.bGjEvent = poc->sta.bFlag.bGj;
- // 过流三段闭锁重合闸
- poc->sta.bFlag.bBSCH = poc->sta.bFlag.bTz && !pRunSet->tSwSet[sw].dT_ch_gl_tt;
- if (bTrip) // 条件满足,置动作灯
- {
- poc->sta.bFlag.bTripBak = true;
- // poc->sta.bFlag.bDzLed = true;
- }
- poc->sta.bFlag.bTz = bTrip && pSet->bTz;
- #ifdef SOE_RECORD_DELAY
- bTz = poc->sta.bFlag.bTz && soe_check(EV_TZFAIL + sw * EV_SW_NUM) == false;
- #else
- bTz = poc->sta.bFlag.bTz;
- #endif
- #ifdef YX_RESET_TIME
- {
- bool bY1;
- // 故障遥信延时复归
- bY1 = (!poc->sta.bFlag.bGj) && poc->sta.bFlag.bGjEvent;
- RunTR(&poc->tGjEvRstTime, bY1, dStep);
- poc->sta.bFlag.bGjEvent = poc->sta.bFlag.bGj || (!poc->tGjEvRstTime.boolTrip && bY1);
- bY1 = (!poc->sta.bFlag.bTz) && poc->sta.bFlag.bTzEvent;
- RunTR(&poc->tTzEvRstTime, bY1, dStep);
- poc->sta.bFlag.bTzEvent = poc->sta.bFlag.bTz || (!poc->tTzEvRstTime.boolTrip && bY1);
- }
- bTz = poc->sta.bFlag.bTzEvent;
- #endif
- if (bTz)
- {
- gl_soe_set_clr(1, sw, soeno, pSet->dI, false);
- if (soe_check(EV_BH_FAULT + sw * EV_SW_NUM) == false) // 保护总
- {
- soe_record_ev(EV_BH_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- poc->sta.bFlag.bDzLed = true;
- }
- else
- {
- gl_soe_set_clr(0, sw, soeno, pSet->dI, false);
- if (pro_check_bh_all(sw) == false)
- {
- pro_rst_event(sw, EV_BH_FAULT); // 保护总
- }
- }
- // 告警记录及出口
- if (poc->sta.bFlag.bGjEvent)
- {
- gl_soe_set_clr(1, sw, soeno + 1, pSet->dI, BH_WAVETIME_EN(pSet->dT)); // 大于150毫秒,出口也启动录波
- if (poc->sta.bFlag.bDzLed == false)
- {
- poc->sta.bFlag.bGjLed = true;
- }
- }
- else
- {
- gl_soe_set_clr(0, sw, soeno + 1, pSet->dI, false);
- }
- }
- void Pro_LX(int sw, u32 dStep, int oc, int soe_no)
- {
- bool bQDD, bQDD1, bTrip;
- TOC_T *poc = &g_tRelay[sw].tOC[oc];
- OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
- u16 soeno = soe_no + sw * EV_SW_NUM;
- int ui_begin;
- bool bTz = false;
- TRELAY_T *pR = &g_tRelay[sw];
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- // 电流启动
- bQDD = OverRelay(g_ui[ui_begin + SW_AC_I0].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
- bQDD1 = OverRelay(g_ui[PUB_AC_U01].m2[0], pRunSet->dU_U0BS, pRunSet->dU_U0BS, false);
- poc->sta.bFlag.bQD = (BH_ALL_EN(sw)) && (pSet->bTz || pSet->bGj) && bQDD && ((bQDD1 && pRunSet->bTT_U0BS) || (!pRunSet->bTT_U0BS));
- if (poc->sta.bFlag.bQD) // 幅值启动
- {
- if (!poc->sta.bFlag.bQDWave)
- {
- rcd_start(sw, RECORD_TYPE_LXGL, RECORD_LEN_TZQD); // 录波类型:跳闸类
- poc->sta.bFlag.bQDWave = true;
- }
- }
- else
- {
- poc->sta.bFlag.bQDWave = false;
- }
- #ifdef EV_GL_STATR
- lx_start_soe_set(poc->sta.bFlag.bQD, sw, soe_no + 2); // 过流启动SOE
- #endif
- RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
- RunTR(&poc->tQD25ms, poc->sta.bFlag.bQD, dStep);
- // 如果时间到,启动时间未到,调用幅值启动加速模块
- if (poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip)
- {
- if (protect_amp_lx_js(sw))
- {
- // 预置25ms,让下个循环再出口
- PreSetTime(&poc->tQD25ms, T_25ms);
- #ifdef CPU_FUXI
- // FUXI平台等待下一个循环会导致偶尔动作时间超40ms,改为不等待,本循环处理完
- poc->tQD25ms.boolTrip = 1;
- #endif
- }
- }
- bTrip = poc->tQDTime.boolTrip && poc->tQD25ms.boolTrip;
- poc->sta.bFlag.bGj = bTrip && pSet->bGj; // 告警
- poc->sta.bFlag.bTz = bTrip && pSet->bTz; // 出口
- // 零序闭锁重合闸
- poc->sta.bFlag.bBSCH = poc->sta.bFlag.bTz && !pRunSet->tSwSet[sw].dT_ch_jd_tt;
- if (bTrip) // 条件满足,置动作灯
- {
- poc->sta.bFlag.bTripBak = true;
- // poc->sta.bFlag.bDzLed = true;
- }
- #ifdef SOE_RECORD_DELAY
- bTz = poc->sta.bFlag.bTz && soe_check(EV_TZFAIL + sw * EV_SW_NUM) == false;
- #else
- bTz = poc->sta.bFlag.bTz;
- #endif
- #ifdef YX_RESET_TIME
- {
- bool bY1;
- // 故障遥信延时复归
- bY1 = (!poc->sta.bFlag.bGj) && poc->sta.bFlag.bGjEvent;
- RunTR(&poc->tGjEvRstTime, bY1, dStep);
- poc->sta.bFlag.bGjEvent = poc->sta.bFlag.bGj || (!poc->tGjEvRstTime.boolTrip && bY1);
- bY1 = (!poc->sta.bFlag.bTz) && poc->sta.bFlag.bTzEvent;
- RunTR(&poc->tTzEvRstTime, bY1, dStep);
- poc->sta.bFlag.bTzEvent = poc->sta.bFlag.bTz || (!poc->tTzEvRstTime.boolTrip && bY1);
- }
- bTz = poc->sta.bFlag.bTzEvent;
- #endif
- if (bTz)
- {
- poc->sta.bFlag.bDzLed = true;
- if (soe_check(soeno) == false)
- {
- DWORD I0, U0;
- I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
- U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
- soe_record_ev(soeno, 1, I0, U0, 0);
- // rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD);
- }
- if (soe_check(EV_LX_FAULT + sw * EV_SW_NUM) == false) // 零序总
- {
- soe_record_ev(EV_LX_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- pR->bYcRefresh.bLx = true;
- }
- if (soe_check(EV_BH_FAULT + sw * EV_SW_NUM) == false) // 保护总
- {
- soe_record_ev(EV_BH_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- if (soe_check(EV_ALL_FAULT + sw * EV_SW_NUM) == false) // 保护总
- {
- soe_record_ev(EV_ALL_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- }
- else
- {
- if (soe_check(soeno) == true)
- {
- soe_record_ev(soeno, 0, 0, 0, 0);
- }
- if (pro_check_lx_all(sw) == false)
- {
- pro_rst_event(sw, EV_LX_FAULT); // 零序总
- }
- if (pro_check_bh_all(sw) == false)
- {
- pro_rst_event(sw, EV_BH_FAULT); // 保护总
- }
- if (pro_check_fault_all(sw) == false)
- {
- pro_rst_event(sw, EV_ALL_FAULT); // 事故总
- }
- }
- // 告警记录及出口
- if (poc->sta.bFlag.bGj)
- {
- if (poc->sta.bFlag.bDzLed == false)
- {
- poc->sta.bFlag.bGjLed = true;
- }
- if (soe_check(soeno + 1) == false)
- {
- DWORD I0, U0;
- I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
- U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
- soe_record_ev(soeno + 1, 1, I0, U0, 0);
- if (BH_WAVETIME_EN(pSet->dT))
- rcd_start(sw, RECORD_TYPE_LXGL, RECORD_LEN_TZQD);
- }
- if (soe_check(EV_LX_FAULT + sw * EV_SW_NUM) == false) // 零序总
- {
- soe_record_ev(EV_LX_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- pR->bYcRefresh.bLx = true;
- }
- if (soe_check(EV_ALL_FAULT + sw * EV_SW_NUM) == false) // 保护总
- {
- soe_record_ev(EV_ALL_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- }
- else
- {
- if (soe_check(soeno + 1) == true)
- {
- soe_record_ev(soeno + 1, 0, 0, 0, 0);
- }
- if (pro_check_lx_all(sw) == false)
- {
- pro_rst_event(sw, EV_LX_FAULT); // 零序总
- }
- if (pro_check_fault_all(sw) == false)
- {
- pro_rst_event(sw, EV_ALL_FAULT); // 事故总
- }
- }
- }
- /**************************************************************************
- 函数名称:Pro_Accheck
- 函数版本:1.00
- 作者: 保护产品部
- 创建日期:2007.10.15
- 函数功能说明:加速功能块
- 输入参数:
- 其他输入:
- 输出参数:
- 返回值:
- ***************************************************************************/
- void Pro_Accheck(int sw, u32 dStep, int oc, int soe_no)
- {
- bool bQDD, bTrip;
- bool bJS3, bJS4, bJS5;
- bool bY1, bY2;
- TOC_T *poc = &g_tRelay[sw].tOC[oc];
- OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
- u16 soeno = soe_no + sw * EV_SW_NUM;
- bool bxbbs, benable;
- int ui_begin;
- DWORD U0;
- TRELAY_T *pR = &g_tRelay[sw];
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
- if (oc == BH_GLJS || oc == BH_LXJS)
- {
- benable = BH_ALL_EN(sw);
- }
- else
- {
- benable = FA_ALL_EN(sw);
- }
- // 电流启动
- if (oc == BH_GLJS || oc == FA_GL)
- {
- bool bxb;
- DWORD xbcoe; // 谐波系数
- if (oc == BH_GLJS)
- {
- bxb = pRunSet->tSwSet[sw].bTT_bh_xbbs;
- xbcoe = pRunSet->tSwSet[sw].d_bh_xbcoe;
- }
- else
- {
- bxb = pRunSet->tSwSet[sw].bTT_fa_xbbs;
- xbcoe = pRunSet->tSwSet[sw].d_fa_xbcoe;
- }
- poc->sta.bFlag.bIaQD = OverRelay(g_ui[ui_begin + SW_AC_IA].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIaQD);
- poc->sta.bFlag.bIbQD = OverRelay(g_ui[ui_begin + SW_AC_IB].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIbQD);
- poc->sta.bFlag.bIcQD = OverRelay(g_ui[ui_begin + SW_AC_IC].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIcQD);
- poc->sta.bFlag.bIaxb = bxb && XBCalc(sw, SW_AC_IA, xbcoe, poc->sta.bFlag.bIaQD);
- poc->sta.bFlag.bIbxb = bxb && XBCalc(sw, SW_AC_IB, xbcoe, poc->sta.bFlag.bIbQD);
- poc->sta.bFlag.bIcxb = bxb && XBCalc(sw, SW_AC_IC, xbcoe, poc->sta.bFlag.bIcQD);
- bQDD = poc->sta.bFlag.bIaQD || poc->sta.bFlag.bIbQD || poc->sta.bFlag.bIcQD;
- bxbbs = poc->sta.bFlag.bIaxb || poc->sta.bFlag.bIbxb || poc->sta.bFlag.bIcxb; // 谐波闭锁
- if (BH_ALL_EN(sw))
- {
- if (oc == BH_GLJS)
- {
- poc->sta.bFlag.bXBbs = (BH_ALL_EN(sw) && (pSet->bTz || pSet->bGj) && bQDD) && bxbbs;
- // xb_bs_soe(g_protect.sw,dStep);
- }
- }
- }
- else // 零序加速或FA合后零序过流跳闸
- {
- // 零序电流过量继电器
- bY1 = OverRelay(g_ui[UI_SW_INDEX(sw, SW_AC_I0)].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
- // 零序电压过量继电器
- // bY2 = OverRelay(g_ui[PUB_AC_U01].m2[0], pRunSet->dU_U0BS, pRunSet->dU_U0BS, false);
- bY2 = true;
- bQDD = bY1 && ((bY2 && pRunSet->bTT_U0BS) || (!pRunSet->bTT_U0BS));
- bxbbs = false;
- }
- // 检查合闸加速标
- if (oc == BH_GLJS || oc == BH_LXJS)
- {
- bJS3 = g_tRelay[sw].tCHZ.sta.bFlag.bCHJS // 重合加速标
- || g_tRelay[sw].tSWST.uSWST.bFlag.bSHJS; // 手合加速标
- }
- else
- {
- bJS3 = g_tRelay[sw].tSWST.uSWST.bFlag.bSDJS // 上电加速
- //|| g_tRelay[sw].tSWST.uSWST.bFlag.bSHJS; // 手合加速标
- ;
- }
- poc->sta.bFlag.bQD = (benable && (pSet->bTz || pSet->bGj) && bQDD) && (!bxbbs); // 谐波闭锁
- // 加速标保持
- bJS4 = bJS3 || poc->sta.bFlag.bJSBC;
- // 后加速启动条件满足
- bJS5 = poc->sta.bFlag.bQD && bJS4;
- // 合闸加速标保持
- poc->sta.bFlag.bJSBC = bJS5 && bJS4;
- if (bJS5) // 幅值启动
- {
- if (!poc->sta.bFlag.bQDWave)
- {
- if (oc == BH_GLJS || oc == FA_GL)
- {
- rcd_start(sw, RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); // 录波类型:跳闸类
- }
- else
- {
- rcd_start(sw, RECORD_TYPE_LXGL, RECORD_LEN_TZQD); // 录波类型:跳闸类
- }
- poc->sta.bFlag.bQDWave = true;
- }
- }
- else
- {
- poc->sta.bFlag.bQDWave = false;
- }
- RunTR(&poc->tQDTime, bJS5, dStep);
- RunTR(&poc->tQD25ms, bJS5, dStep);
- // 如果加速时间到,启动时间未到,调用幅值启动加速模块
- if ((oc == BH_GLJS || oc == FA_GL || BH_LXJS) && (poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip))
- {
- if (oc == BH_GLJS || oc == FA_GL)
- {
- if (protect_amp_qd_js(sw))
- {
- // 预置25ms,让下个循环再出口
- PreSetTime(&poc->tQD25ms, T_25ms);
- }
- }
- else
- {
- if (protect_amp_lx_js(sw))
- {
- // 预置25ms,让下个循环再出口
- PreSetTime(&poc->tQD25ms, T_25ms);
- }
- }
- }
- bTrip = poc->tQDTime.boolTrip && poc->tQD25ms.boolTrip;
- poc->sta.bFlag.bTz = bTrip; //
- if (bTrip) // 条件满足,置动作灯
- {
- poc->sta.bFlag.bTripBak = true;
- // poc->sta.bFlag.bDzLed = true;
- }
- #ifdef YX_RESET_TIME
- // 故障遥信延时复归
- bY1 = (!poc->sta.bFlag.bTz) && poc->sta.bFlag.bTzEvent;
- RunTR(&poc->tTzEvRstTime, bY1, dStep);
- poc->sta.bFlag.bTzEvent = poc->sta.bFlag.bTz || (!poc->tTzEvRstTime.boolTrip && bY1);
- #endif
- // 出口记录及出口
- if (oc == BH_GLJS || oc == FA_GL)
- {
- #ifdef YX_RESET_TIME
- if (poc->sta.bFlag.bTzEvent)
- #else
- if (poc->sta.bFlag.bTz)
- #endif
- {
- poc->sta.bFlag.bDzLed = true;
- gl_soe_set_clr(1, sw, soeno, pSet->dI, BH_WAVETIME_EN(pSet->dT));
- if (soe_check(EV_BH_FAULT + sw * EV_SW_NUM) == false) // 保护总
- {
- soe_record_ev(EV_BH_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- if (oc == FA_GL)
- {
- if (soe_check(EV_HHGZ + sw * EV_SW_NUM) == false && pRunSet->tSwSet[sw].bTT_fa_gzbshz)
- {
- soe_record_ev(EV_HHGZ + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- }
- }
- else
- {
- gl_soe_set_clr(0, sw, soeno, pSet->dI, false);
- if (pro_check_bh_all(sw) == false)
- {
- pro_rst_event(sw, EV_BH_FAULT); // 保护总
- }
- }
- }
- else // 零序加速
- {
- // 出口记录及出口
- #ifdef YX_RESET_TIME
- if (poc->sta.bFlag.bTzEvent)
- #else
- if (poc->sta.bFlag.bTz)
- #endif
- {
- poc->sta.bFlag.bDzLed = true;
- if (soe_check(soeno) == false)
- {
- DWORD I0;
- I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
- // U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
- soe_record_ev(soeno, 1, I0, U0, 0);
- if (BH_WAVETIME_EN(pSet->dT))
- rcd_start(sw, RECORD_TYPE_LXGL, RECORD_LEN_TZQD);
- }
- if (soe_check(EV_LX_FAULT + sw * EV_SW_NUM) == false) // 零序总
- {
- soe_record_ev(EV_LX_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- pR->bYcRefresh.bLx = true;
- }
- if (soe_check(EV_BH_FAULT + sw * EV_SW_NUM) == false) // 保护总
- {
- soe_record_ev(EV_BH_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- if (soe_check(EV_ALL_FAULT + sw * EV_SW_NUM) == false) // 故障总
- {
- soe_record_ev(EV_ALL_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- if (oc == FA_LX)
- {
- if (soe_check(EV_HHGZ + sw * EV_SW_NUM) == false && pRunSet->tSwSet[sw].bTT_fa_gzbshz)
- {
- soe_record_ev(EV_HHGZ + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- }
- }
- else
- {
- if (soe_check(soeno) == true)
- {
- soe_record_ev(soeno, 0, 0, 0, 0);
- }
- if (pro_check_lx_all(sw) == false)
- {
- pro_rst_event(sw, EV_LX_FAULT); // 零序总
- }
- if (pro_check_bh_all(sw) == false)
- {
- pro_rst_event(sw, EV_BH_FAULT); // 保护总
- }
- if (pro_check_fault_all(sw) == false)
- {
- pro_rst_event(sw, EV_ALL_FAULT); // 故障总
- }
- }
- }
- }
- /******************************************************************************
- 函数名称: Pro_BSTZ
- 函数版本: 01.01
- 创建作者: xxxxxx
- 创建日期: 2015-10-23
- 函数说明: 大电流闭锁分闸,用于负荷开关,以免过切断容量跳闸
- 参数说明: 无
- 返回值: 成功返回0.
- 修改记录:
- */
- void Pro_BSTZ(int sw, u32 dStep, int oc, int soe_no)
- {
- bool bQDD, bTrip;
- TOC_T *poc = &g_tRelay[sw].tOC[oc];
- OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
- u16 soeno = soe_no + sw * EV_SW_NUM;
- // 电流启动
- bQDD = OverRelay(g_sw[sw].m2_max, pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
- poc->sta.bFlag.bQD = (BH_ALL_EN(sw) // 现有程序FA模式下已处理遮断,所以只需要BH模式投入此功能
- && (pSet->bTz || pSet->bGj) && bQDD);
- if (poc->sta.bFlag.bQD) // 幅值启动
- {
- #if 0
- if(!poc->sta.bFlag.bQDWave)
- {
- rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
- poc->sta.bFlag.bQDWave=true;
- }
- #endif
- }
- RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
- bTrip = poc->tQDTime.boolTrip;
- poc->sta.bFlag.bTz = bTrip && pSet->bTz;
- g_tRelay[sw].bBSTZ = bTrip && pSet->bTz;
- if (bTrip) // 条件满足,置动作灯
- {
- poc->sta.bFlag.bTripBak = true;
- poc->sta.bFlag.bDzLed = true;
- }
- if (!BH_ALL_EN(sw))
- {
- return;
- }
- // 出口记录及出口
- if (poc->sta.bFlag.bTz)
- {
- if (soe_check(soeno) == false)
- {
- int ui_begin;
- DWORD Ia, Ib, Ic;
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
- Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
- Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
- soe_record_ev(soeno, 1, Ia, Ib, Ic);
- // if(BH_WAVETIME_EN(pSet->dT))rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
- }
- }
- else
- {
- if (soe_check(soeno) == true)
- {
- soe_record_ev(soeno, 0, 0, 0, 0);
- }
- }
- }
- /***********************************
- 函数名称: Pro_over_limit_i
- 函数版本: 01.01
- 创建作者: xxxxxx
- 创建日期: 2015-10-23
- 函数说明: 电流越限
- 参数说明: 无
- 返回值: 成功返回0.
- 修改记录:
- */
- void Pro_over_i(int sw, u32 dStep, int oc, int soe_no)
- {
- bool bQDD, bTrip;
- int ui_begin;
- DWORD Ia, Ib, Ic;
- #ifdef YX_RESET_TIME
- bool by1;
- #endif
- TOC_T *poc = &g_tRelay[sw].tOC[oc];
- OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
- u16 soeno = soe_no + sw * EV_SW_NUM;
- // 电流启动
- bQDD = OverRelay(g_sw[sw].m2_max, pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
- poc->sta.bFlag.bQD = (pSet->bTz || pSet->bGj) && bQDD;
- RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
- bTrip = poc->tQDTime.boolTrip; // 告警
- poc->sta.bFlag.bGj = bTrip; // 告警
- #ifdef YX_RESET_TIME
- // 故障遥信延时复归
- by1 = (!poc->sta.bFlag.bGj) && poc->sta.bFlag.bGjEvent;
- RunTR(&poc->tGjEvRstTime, by1, dStep);
- poc->sta.bFlag.bGjEvent = poc->sta.bFlag.bGj || (!poc->tGjEvRstTime.boolTrip && by1);
- #endif
- // 告警记录及出口
- if (bTrip) // 条件满足,置动作灯
- {
- poc->sta.bFlag.bDzLed = true;
- }
- if (poc->sta.bFlag.bGj)
- {
- // gz_soe_set_clr(1,sw,soeno,pSet->dI);
- if (soe_check(soeno))
- return;
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
- Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
- Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
- soe_record_ev(soeno, 1, Ia, Ib, Ic);
- }
- else
- {
- // gz_soe_set_clr(0,sw,soeno,pSet->dI);
- if (!soe_check(soeno))
- return;
- soe_record_ev(soeno, 0, 0, 0, 0);
- }
- }
- void Pro_over_i0(int sw, u32 dStep, int oc, int soe_no)
- {
- bool bQDD, bTrip;
- #ifdef YX_RESET_TIME
- bool by1;
- #endif
- TOC_T *poc = &g_tRelay[sw].tOC[oc];
- OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
- u16 soeno = soe_no + sw * EV_SW_NUM;
- // 电流启动
- bQDD = OverRelay(g_ui[UI_SW_INDEX(sw, SW_AC_I0)].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
- poc->sta.bFlag.bQD = (pSet->bTz || pSet->bGj) && bQDD;
- RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
- bTrip = poc->tQDTime.boolTrip; // 告警
- poc->sta.bFlag.bGj = bTrip; // 告警
- #ifdef YX_RESET_TIME
- // 故障遥信延时复归
- by1 = (!poc->sta.bFlag.bGj) && poc->sta.bFlag.bGjEvent;
- RunTR(&poc->tGjEvRstTime, by1, dStep);
- poc->sta.bFlag.bGjEvent = poc->sta.bFlag.bGj || (!poc->tGjEvRstTime.boolTrip && by1);
- #endif
- if (bTrip) // 条件满足,置动作灯
- {
- poc->sta.bFlag.bDzLed = true;
- }
- if (poc->sta.bFlag.bGj)
- {
- if (soe_check(soeno) == false)
- {
- int ui_begin;
- DWORD I0;
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
- soe_record_ev(soeno, 1, I0, 0, 0);
- }
- }
- else
- {
- if (soe_check(soeno) == true)
- {
- soe_record_ev(soeno, 0, 0, 0, 0);
- }
- }
- }
- #ifdef EV_GL_STATR
- void gl_start_soe_set(u8 set_clr, int sw, u16 soe_no)
- {
- int ui_begin;
- DWORD Ia, Ib, Ic;
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
- Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
- Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- if (soe_check(soe_no) != set_clr)
- {
- soe_record_ev(soe_no, set_clr, Ia, Ib, Ic);
- }
- }
- void lx_start_soe_set(u8 set_clr, int sw, u16 soe_no)
- {
- int ui_begin;
- DWORD I0, U0;
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- I0 = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_I0].m2[0]), 256, g_ui[ui_begin + SW_AC_I0].m2_factor_k);
- U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
- if (soe_check(soe_no) != set_clr)
- {
- soe_record_ev(soe_no, set_clr, U0, I0, 0);
- }
- }
- #endif
- /******************************************************************************
- 函数名称: gl_soe_set_clr
- 函数版本: 01.01
- 创建作者: xxxxxx
- 创建日期: 2014-12-16
- 函数说明: 过流事件的建立和返回
- 参数说明: set_clr: 1 建立,0 返回
- soe_no: 事件组的起始序号
- i_set: 当前过流保护的定值
- 返回值: 无
- 修改记录:
- */
- int gl_soe_set_clr(u8 set_clr, int sw, u16 soe_no, u32 i_set, bool bfault)
- {
- int ui_begin;
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- switch (set_clr)
- {
- case 1:
- {
- DWORD Ia, Ib, Ic;
- Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
- Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
- Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
- if (soe_check(soe_no) == false)
- {
- soe_record_ev(soe_no, 1, Ia, Ib, Ic);
- if (bfault)
- rcd_start(sw, RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); // 录波类型:跳闸类
- }
- pro_check_gl_abc(sw, i_set, Ia, Ib, Ic); // 分相故障判断
- pro_check_fd_gl_abc(sw, i_set, Ia, Ib, Ic, soe_no); // 分段分相故障判断
- if (soe_check(EV_GL_FAULT + sw * EV_SW_NUM) == false) // 过流总
- {
- soe_record_ev(EV_GL_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- if (soe_check(EV_ALL_FAULT + sw * EV_SW_NUM) == false) // 保护总
- {
- soe_record_ev(EV_ALL_FAULT + sw * EV_SW_NUM, 1, 0, 0, 0);
- }
- }
- break;
- case 0:
- {
- if (soe_check(soe_no) == true)
- {
- soe_record_ev(soe_no, 0, 0, 0, 0);
- }
- if (pro_check_gl_all(sw) == false)
- {
- pro_rst_event(sw, EV_IABC_GL);
- pro_rst_event(sw, EV_IAB_GL);
- pro_rst_event(sw, EV_IBC_GL);
- pro_rst_event(sw, EV_ICA_GL);
- pro_rst_event(sw, EV_IA_GL);
- pro_rst_event(sw, EV_IB_GL);
- pro_rst_event(sw, EV_IC_GL);
- pro_rst_event(sw, EV_GL_FAULT); // 过流总
- pro_rst_fd_gl_event(sw, soe_no); // 分段分相故障返回
- }
- if (pro_check_fault_all(sw) == false)
- {
- pro_rst_event(sw, EV_ALL_FAULT); // 保护总
- }
- }
- break;
- }
- return 0;
- }
- /******************************************************************************
- 函数名称: gz_soe_set_clr
- 函数版本: 01.01
- 创建作者: xxxxxx
- 创建日期: 2014-12-16
- 函数说明: 过流事件的建立和返回
- 参数说明: set_clr: 1 建立,0 返回
- soe_no: 事件组的起始序号
- i_set: 当前过流保护的定值
- 返回值: 无
- 修改记录:
- */
- int gz_soe_set_clr(u8 set_clr, int sw, u16 soe_no, u32 i_set)
- {
- int ui_begin, i;
- DWORD Idz;
- ui_begin = UI_SW_INDEX_BEGIN(sw);
- switch (set_clr)
- {
- case 1:
- {
- if (soe_check(soe_no) == false)
- {
- DWORD Ia, Ib, Ic;
- Ia = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA].m2[0]), 256, g_ui[ui_begin + SW_AC_IA].m2_factor_k);
- Ib = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IB].m2[0]), 256, g_ui[ui_begin + SW_AC_IB].m2_factor_k);
- Ic = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IC].m2[0]), 256, g_ui[ui_begin + SW_AC_IC].m2_factor_k);
- soe_record_ev(soe_no, 1, Ia, Ib, Ic);
- }
- for (i = 0; i < 3; i++)
- {
- if (soe_check(soe_no + i + 1) == false)
- {
- if (g_ui[ui_begin + SW_AC_IA + i].m2[0] > i_set)
- {
- Idz = _Mul_Div_U(sqrt_32fix(g_ui[ui_begin + SW_AC_IA + i].m2[0]), 256, g_ui[ui_begin + SW_AC_IA + i].m2_factor_k);
- soe_record_ev(soe_no + i + 1, 1, Idz, 0, 0);
- }
- }
- }
- }
- break;
- case 0:
- {
- if (soe_check(soe_no) == true)
- {
- soe_record_ev(soe_no, 0, 0, 0, 0);
- }
- for (i = 0; i < 3; i++)
- {
- if (soe_check(soe_no + i + 1) == true)
- {
- soe_record_ev(soe_no + i + 1, 0, 0, 0, 0);
- }
- }
- }
- break;
- }
- return 0;
- }
- /**
- * @brief 计算二次谐波含量是否超过设定值
- * @param[in/out] {int} sw 开关号
- * @param[in/out] {int} index 电流索引
- * @param[in/out] {DWORD} xBcoe 谐波占比%
- * @param[in/out] {DWORD} bQD 使能计算
- * @return true 二次谐波含量超过设定值
- * @return false 二次谐波含量没有超过设定值
- * @retval none
- *
- * @warning none
- * @note none
- */
- bool XBCalc(int sw, int index, DWORD xBcoe, bool bQD)
- {
- if (bQD)
- {
- if (g_ui[UI_SW_INDEX(sw, index)].m2[1] > _MulFac_U(g_ui[UI_SW_INDEX(sw, index)].m2[0], xBcoe))
- {
- return (true);
- }
- }
- return (false);
- }
- /*------------------------------ 测试函数 -------------------------------------
- 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
- 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
- */
- /*------------------------------ 文件结束 -------------------------------------
- */
|