oc.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: Oc.c
  4. 文件版本: 01.01
  5. 创建作者: xxxxxx
  6. 创建日期: 2012-03-28
  7. 功能说明: 过流保护
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. /*------------------------------- 宏定义 --------------------------------------
  15. */
  16. /*------------------------------ 类型结构 -------------------------------------
  17. */
  18. /*------------------------------ 全局变量 -------------------------------------
  19. */
  20. /*------------------------------ 函数声明 -------------------------------------
  21. */
  22. /*------------------------------ 外部函数 -------------------------------------
  23. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  24. */
  25. bool CalDir_A(int sw,bool bQD,bool bInv)
  26. {
  27. int indexU,indexI;
  28. bool bzx=false;
  29. indexU=PUB_AC_UBC1;
  30. indexI=UI_SW_INDEX(sw,SW_AC_IA);
  31. if(!tPT.uPT1DX.bFlag.bPTYC&&(g_ui[indexU].m2[0]>pRunSet->dVOL10V_SQR)&&bQD) // UBC > 10V
  32. {
  33. if(!bInv) //电流反向
  34. {
  35. 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相电流方向
  36. }
  37. else
  38. {
  39. 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相电流方向
  40. }
  41. }
  42. return bzx;
  43. }
  44. bool CalDir_B(int sw,bool bQD,bool bInv)
  45. {
  46. int indexU,indexI;
  47. bool bzx=false;
  48. indexU=PUB_AC_UCA1;
  49. indexI=UI_SW_INDEX(sw,SW_AC_IB);
  50. if(!tPT.uPT1DX.bFlag.bPTYC&&(g_ui[indexU].m2[0]>pRunSet->dVOL10V_SQR)&&bQD) // UCA > 10V
  51. {
  52. if(!bInv)
  53. {
  54. 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相电流方向
  55. }
  56. else
  57. {
  58. 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相电流方向
  59. }
  60. }
  61. return bzx;
  62. }
  63. bool CalDir_C(int sw,bool bQD,bool bInv)
  64. {
  65. int indexU,indexI;
  66. bool bzx=false;
  67. indexU=PUB_AC_UAB1;
  68. indexI=UI_SW_INDEX(sw,SW_AC_IC);
  69. if(!tPT.uPT1DX.bFlag.bPTYC&&(g_ui[indexU].m2[0]>pRunSet->dVOL10V_SQR)&&bQD) // UAB > 10V
  70. {
  71. if(!bInv)
  72. {
  73. 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相电流方向
  74. }
  75. else
  76. {
  77. 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相电流方向
  78. }
  79. }
  80. return bzx;
  81. }
  82. bool pro_check_bh_all(int sw)
  83. {
  84. if(soe_check(EV_GL1TZ+sw*EV_SW_NUM)==true)return true;
  85. if(soe_check(EV_GL2TZ+sw*EV_SW_NUM)==true)return true;
  86. if(soe_check(EV_GL3TZ+sw*EV_SW_NUM)==true)return true;
  87. if(soe_check(EV_LX1TZ+sw*EV_SW_NUM)==true)return true;
  88. if(soe_check(EV_LX2TZ+sw*EV_SW_NUM)==true)return true;
  89. #ifdef DISP_SET_LX3
  90. if(soe_check(EV_LX3TZ+sw*EV_SW_NUM)==true)return true;
  91. #endif
  92. if(soe_check(EV_GLJS+sw*EV_SW_NUM)==true)return true;
  93. if(soe_check(EV_LXJS+sw*EV_SW_NUM)==true)return true;
  94. if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)==true)return true;
  95. if(soe_check(EV_FA_LX_TZ+sw*EV_SW_NUM)==true)return true;
  96. #ifdef SOE_RECORD_DELAY
  97. if(g_soe_queue.fzsoe_wait_flag )return true;
  98. #endif
  99. return false;
  100. }
  101. bool pro_check_gl_all(int sw)
  102. {
  103. if(soe_check(EV_GL1TZ+sw*EV_SW_NUM)==true)return true;
  104. if(soe_check(EV_GL2TZ+sw*EV_SW_NUM)==true)return true;
  105. if(soe_check(EV_GL3TZ+sw*EV_SW_NUM)==true)return true;
  106. if(soe_check(EV_GL1GJ+sw*EV_SW_NUM)==true)return true;
  107. if(soe_check(EV_GL2GJ+sw*EV_SW_NUM)==true)return true;
  108. if(soe_check(EV_GL3GJ+sw*EV_SW_NUM)==true)return true;
  109. if(soe_check(EV_GLJS+sw*EV_SW_NUM)==true)return true;
  110. if(soe_check(EV_FA_GL_TZ+sw*EV_SW_NUM)==true)return true;
  111. #ifdef SOE_RECORD_DELAY
  112. if(g_soe_queue.fzsoe_wait_flag )return true;
  113. #endif
  114. return false;
  115. }
  116. bool pro_check_lx_all(int sw)
  117. {
  118. if(soe_check(EV_LX1GJ+sw*EV_SW_NUM)==true)return true;
  119. if(soe_check(EV_LX2GJ+sw*EV_SW_NUM)==true)return true;
  120. #ifdef DISP_SET_LX3
  121. if(soe_check(EV_LX3GJ+sw*EV_SW_NUM)==true)return true;
  122. #endif
  123. if(soe_check(EV_LX1TZ+sw*EV_SW_NUM)==true)return true;
  124. if(soe_check(EV_LX2TZ+sw*EV_SW_NUM)==true)return true;
  125. #ifdef DISP_SET_LX3
  126. if(soe_check(EV_LX3TZ+sw*EV_SW_NUM)==true)return true;
  127. #endif
  128. if(soe_check(EV_LXJS+sw*EV_SW_NUM)==true)return true;
  129. if(soe_check(EV_FA_LX_TZ+sw*EV_SW_NUM)==true)return true;
  130. #ifdef SOE_RECORD_DELAY
  131. if(g_soe_queue.fzsoe_wait_flag )return true;
  132. #endif
  133. #ifdef FUN_JDXX
  134. if(soe_check(EV_JDXX_GJ+sw*EV_SW_NUM)==true)return true;
  135. if(soe_check(EV_JDXX_TZ+sw*EV_SW_NUM)==true)return true;
  136. #endif
  137. return false;
  138. }
  139. bool pro_check_fault_all(int sw)
  140. {
  141. bool ret;
  142. ret=pro_check_gl_all(sw)||pro_check_lx_all(sw);
  143. return ret;
  144. }
  145. void pro_check_gl_abc(int sw,DWORD i_set,DWORD I1,DWORD I2,DWORD I3)
  146. {
  147. bool bIa,bIb,bIc;
  148. int ui_begin;
  149. TRELAY_T *pR=&g_tRelay[sw];
  150. ui_begin = UI_SW_INDEX_BEGIN(sw);
  151. bIa=(g_ui[ui_begin + SW_AC_IA ].m2[0] > i_set)?true:false;
  152. bIb=(g_ui[ui_begin + SW_AC_IB ].m2[0] > i_set)?true:false;
  153. bIc=(g_ui[ui_begin + SW_AC_IC ].m2[0] > i_set)?true:false;
  154. if(bIa&&bIb&&bIc)
  155. {
  156. if(soe_check(EV_IABC_GL+sw*EV_SW_NUM)==false)
  157. {
  158. soe_record_ev( EV_IABC_GL+sw*EV_SW_NUM,1, I1,I2,I3 );
  159. pR->bYcRefresh.bAGl = true;
  160. pR->bYcRefresh.bBGl = true;
  161. pR->bYcRefresh.bCGl = true;
  162. }
  163. }
  164. else if(bIa&&bIb)
  165. {
  166. if(soe_check(EV_IAB_GL+sw*EV_SW_NUM)==false)
  167. {
  168. soe_record_ev( EV_IAB_GL+sw*EV_SW_NUM,1, I1,I2,0 );
  169. pR->bYcRefresh.bAGl = true;
  170. pR->bYcRefresh.bBGl = true;
  171. }
  172. }
  173. else if(bIa&&bIc)
  174. {
  175. if(soe_check(EV_ICA_GL+sw*EV_SW_NUM)==false)
  176. {
  177. soe_record_ev( EV_ICA_GL+sw*EV_SW_NUM,1, I1,I3,0 );
  178. pR->bYcRefresh.bAGl = true;
  179. pR->bYcRefresh.bCGl = true;
  180. }
  181. }
  182. else if(bIb&&bIc)
  183. {
  184. if(soe_check(EV_IBC_GL+sw*EV_SW_NUM)==false)
  185. {
  186. soe_record_ev( EV_IBC_GL+sw*EV_SW_NUM,1, I2,I3,0 );
  187. pR->bYcRefresh.bBGl = true;
  188. pR->bYcRefresh.bCGl = true;
  189. }
  190. }
  191. else if(bIa)
  192. {
  193. if(soe_check(EV_IA_GL+sw*EV_SW_NUM)==false)
  194. {
  195. soe_record_ev( EV_IA_GL+sw*EV_SW_NUM,1, I1,0,0 );
  196. pR->bYcRefresh.bAGl = true;
  197. }
  198. }
  199. else if(bIb)
  200. {
  201. if(soe_check(EV_IB_GL+sw*EV_SW_NUM)==false)
  202. {
  203. soe_record_ev( EV_IB_GL+sw*EV_SW_NUM,1, I2,0,0 );
  204. pR->bYcRefresh.bBGl = true;
  205. }
  206. }
  207. else if(bIc)
  208. {
  209. if(soe_check(EV_IC_GL+sw*EV_SW_NUM)==false)
  210. {
  211. soe_record_ev( EV_IC_GL+sw*EV_SW_NUM,1, I3,0,0 );
  212. pR->bYcRefresh.bCGl = true;
  213. }
  214. }
  215. }
  216. void pro_check_fd_gl_abc(int sw,DWORD i_set,DWORD I1,DWORD I2,DWORD I3,int soe_no)
  217. {
  218. bool bIa,bIb,bIc;
  219. int ui_begin;
  220. u32 code;
  221. ui_begin = UI_SW_INDEX_BEGIN(sw);
  222. bIa=(g_ui[ui_begin + SW_AC_IA ].m2[0] > i_set)?true:false;
  223. bIb=(g_ui[ui_begin + SW_AC_IB ].m2[0] > i_set)?true:false;
  224. bIc=(g_ui[ui_begin + SW_AC_IC ].m2[0] > i_set)?true:false;
  225. //soe_no--;
  226. if((soe_no==EV_GL1TZ)||(soe_no==EV_GL1GJ))
  227. code=EV_GL1_IA+sw*EV_SW_NUM;
  228. else if((soe_no==EV_GL2TZ)||(soe_no==EV_GL2GJ))
  229. code=EV_GL2_IA+sw*EV_SW_NUM;
  230. else if((soe_no==EV_GL3TZ)||(soe_no==EV_GL3GJ))
  231. code=EV_GL3_IA+sw*EV_SW_NUM;
  232. else
  233. return;
  234. if(bIa)
  235. {
  236. if(soe_check(code)==false)
  237. {
  238. soe_record_ev(code,1, I1,0,0 );
  239. }
  240. }
  241. if(bIb)
  242. {
  243. if(soe_check(code+1)==false)
  244. {
  245. soe_record_ev(code+1,1, I2,0,0 );
  246. }
  247. }
  248. if(bIc)
  249. {
  250. if(soe_check(code+2)==false)
  251. {
  252. soe_record_ev(code+2,1, I3,0,0 );
  253. }
  254. }
  255. }
  256. void pro_rst_fd_gl_event(int sw,int soe_no)
  257. {
  258. u32 code;
  259. if(soe_no==EV_GL1TZ)
  260. code=EV_GL1_IA;
  261. else if(soe_no==EV_GL2TZ)
  262. code=EV_GL2_IA;
  263. else if(soe_no==EV_GL3TZ)
  264. code=EV_GL3_IA;
  265. else
  266. return;
  267. if(soe_check(code+sw*EV_SW_NUM)==true)
  268. {
  269. soe_record_ev( code+sw*EV_SW_NUM,0, 0,0,0 );
  270. }
  271. if(soe_check(code+sw*EV_SW_NUM+1)==true)
  272. {
  273. soe_record_ev( code+sw*EV_SW_NUM+1,0, 0,0,0 );
  274. }
  275. if(soe_check(code+sw*EV_SW_NUM+2)==true)
  276. {
  277. soe_record_ev( code+sw*EV_SW_NUM+2,0, 0,0,0 );
  278. }
  279. }
  280. void pro_rst_event(int sw,int soe_no)
  281. {
  282. if(soe_check(soe_no+sw*EV_SW_NUM)==true)
  283. {
  284. soe_record_ev( soe_no+sw*EV_SW_NUM,0, 0,0,0 );
  285. }
  286. }
  287. void xb_bs_soe(int sw,u32 dStep)
  288. {
  289. int i;
  290. bool bxb_bs[BHOC_NUMBER]={false},xb_soe=false;
  291. for(i = BH_GL1;i<BHOC_NUMBER;i++)
  292. {
  293. TOC_T *poc = &g_tRelay[sw].tOC[i];
  294. if((i== BH_GL1)|| (i == BH_GL2) || (i == BH_GL3) || (i== BH_GLJS))
  295. bxb_bs[i]= poc->sta.bFlag.bXBbs;
  296. else
  297. bxb_bs[i]=false;
  298. RunTR(&poc->tXBTime, bxb_bs[i], dStep);
  299. RunTR(&poc->tXBQD25ms, bxb_bs[i], dStep);
  300. if((poc->tXBTime.boolTrip)&&(poc->tXBQD25ms.boolTrip))
  301. {
  302. xb_soe =true;
  303. break;
  304. }
  305. }
  306. if(xb_soe)
  307. {
  308. if(soe_check(EV_XBBS+sw*EV_SW_NUM)==false)
  309. {
  310. soe_record_ev(EV_XBBS+sw*EV_SW_NUM,1, 0,0,0 );
  311. }
  312. }
  313. else
  314. {
  315. if(soe_check(EV_XBBS+sw*EV_SW_NUM)==true)
  316. {
  317. soe_record_ev( EV_XBBS+sw*EV_SW_NUM,0, 0,0,0 );
  318. }
  319. }
  320. }
  321. void Pro_OC(int sw,u32 dStep,int oc,int soe_no)
  322. {
  323. bool bQDD,bTrip;
  324. TOC_T *poc = &g_tRelay[sw].tOC[oc];
  325. OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
  326. u16 soeno=soe_no+sw*EV_SW_NUM;
  327. bool bfxmz,bxbbs,bxb;
  328. int ui_begin;
  329. bool bIazx,bIbzx,bIczx;
  330. bool bdyenable=true; //低电压闭锁
  331. bool bTz=false;
  332. // 电流启动
  333. ui_begin = UI_SW_INDEX_BEGIN(sw);
  334. poc->sta.bFlag.bIaQD = OverRelay(g_ui[ui_begin+SW_AC_IA].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIaQD);
  335. poc->sta.bFlag.bIbQD = OverRelay(g_ui[ui_begin+SW_AC_IB].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIbQD);
  336. poc->sta.bFlag.bIcQD = OverRelay(g_ui[ui_begin+SW_AC_IC].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIcQD);
  337. bIazx=CalDir_A(sw,poc->sta.bFlag.bIaQD&&pSet->bDir,pRunSet->tSwSet[sw].bTT_DIR_Inv); //方向计算
  338. bIbzx=CalDir_B(sw,poc->sta.bFlag.bIbQD&&pSet->bDir,pRunSet->tSwSet[sw].bTT_DIR_Inv);
  339. bIczx=CalDir_C(sw,poc->sta.bFlag.bIcQD&&pSet->bDir,pRunSet->tSwSet[sw].bTT_DIR_Inv);
  340. bxb=pRunSet->tSwSet[sw].bTT_bh_xbbs;
  341. poc->sta.bFlag.bIaxb =bxb&&XBCalc(sw,SW_AC_IA,pRunSet->tSwSet[sw].d_bh_xbcoe,poc->sta.bFlag.bIaQD);
  342. poc->sta.bFlag.bIbxb=bxb&&XBCalc(sw,SW_AC_IB,pRunSet->tSwSet[sw].d_bh_xbcoe,poc->sta.bFlag.bIbQD);
  343. poc->sta.bFlag.bIcxb=bxb&&XBCalc(sw,SW_AC_IC,pRunSet->tSwSet[sw].d_bh_xbcoe,poc->sta.bFlag.bIcQD);
  344. bfxmz=(tPT.uPT1DX.bFlag.bPTYC) //PT异常,自动满足方向
  345. ||(!pSet->bDir) //方向不投入
  346. ||bIazx
  347. ||bIbzx
  348. ||bIczx;
  349. bQDD=poc->sta.bFlag.bIaQD||poc->sta.bFlag.bIbQD||poc->sta.bFlag.bIcQD;
  350. bxbbs=(poc->sta.bFlag.bIaxb||poc->sta.bFlag.bIbxb||poc->sta.bFlag.bIcxb); //谐波闭锁
  351. #ifndef OCI_XB_0MS
  352. if(BH_ALL_EN(sw))
  353. {
  354. if((oc== BH_GL1)|| (oc == BH_GL2) || (oc == BH_GL3) )
  355. {
  356. poc->sta.bFlag.bXBbs = (BH_ALL_EN(sw)
  357. && (pSet->bTz||pSet->bGj)
  358. && bQDD)
  359. && bxbbs;
  360. if( oc== BH_GL1)
  361. xb_bs_soe(g_protect.sw,dStep);
  362. }
  363. }
  364. #endif
  365. poc->sta.bFlag.bddyQD = LowRelay(g_sw_pub.m2_min[2], pRunSet->dU_DDYBS, pRunSet->dU_DDYBS, poc->sta.bFlag.bddyQD);
  366. bdyenable=(!pRunSet->bTT_DDYBS) //低电压闭锁未投入,自动满足
  367. ||(poc->sta.bFlag.bddyQD&&!tPT.uPT1DX.bFlag.bPTYC) //低电压满足,TV正常
  368. ||(tPT.uPT1DX.bFlag.bPTYC); //PT异常,低电压自动满足
  369. poc->sta.bFlag.bQD = (BH_ALL_EN(sw)
  370. && (pSet->bTz || pSet->bGj)
  371. && bQDD
  372. &&bdyenable
  373. &&(!bxbbs)
  374. && bfxmz);
  375. if(poc->sta.bFlag.bQD) //幅值启动
  376. {
  377. if(!poc->sta.bFlag.bQDWave)
  378. {
  379. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  380. poc->sta.bFlag.bQDWave=true;
  381. }
  382. }
  383. else
  384. {
  385. poc->sta.bFlag.bQDWave=false;
  386. }
  387. #ifdef EV_GL_STATR
  388. gl_start_soe_set(poc->sta.bFlag.bQD,sw,soe_no+2);//过流启动SOE
  389. #endif
  390. RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
  391. RunTR(&poc->tQD25ms, poc->sta.bFlag.bQD, dStep);
  392. // 如果速断时间到,启动时间未到,调用幅值启动加速模块
  393. if(poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip)
  394. {
  395. if(protect_amp_qd_js(sw))
  396. {
  397. // 预置25ms,让下个循环再出口
  398. PreSetTime(&poc->tQD25ms, T_25ms);
  399. #ifdef CPU_FUXI
  400. //FUXI平台等待下一个循环会导致偶尔动作时间超40ms,改为不等待,本循环处理完
  401. poc->tQD25ms.boolTrip = 1;
  402. #endif
  403. }
  404. }
  405. bTrip = poc->tQDTime.boolTrip&& poc->tQD25ms.boolTrip;
  406. poc->sta.bFlag.bGj=bTrip && pSet->bGj; // 告警
  407. poc->sta.bFlag.bGjEvent=poc->sta.bFlag.bGj;
  408. // 过流三段闭锁重合闸
  409. poc->sta.bFlag.bBSCH = poc->sta.bFlag.bTz && !pRunSet->tSwSet[sw].dT_ch_gl_tt;
  410. if(bTrip) // 条件满足,置动作灯
  411. {
  412. poc->sta.bFlag.bTripBak = true;
  413. //poc->sta.bFlag.bDzLed = true;
  414. }
  415. poc->sta.bFlag.bTz=bTrip&&pSet->bTz;
  416. #ifdef SOE_RECORD_DELAY
  417. bTz = poc->sta.bFlag.bTz && soe_check(EV_TZFAIL+sw*EV_SW_NUM)==false;
  418. #else
  419. bTz =poc->sta.bFlag.bTz;
  420. #endif
  421. #ifdef YX_RESET_TIME
  422. {
  423. bool bY1;
  424. //故障遥信延时复归
  425. bY1=(!poc->sta.bFlag.bGj)&&poc->sta.bFlag.bGjEvent;
  426. RunTR(&poc->tGjEvRstTime, bY1, dStep);
  427. poc->sta.bFlag.bGjEvent=poc->sta.bFlag.bGj||(!poc->tGjEvRstTime.boolTrip&&bY1);
  428. bY1=(!poc->sta.bFlag.bTz)&&poc->sta.bFlag.bTzEvent;
  429. RunTR(&poc->tTzEvRstTime, bY1, dStep);
  430. poc->sta.bFlag.bTzEvent=poc->sta.bFlag.bTz||(!poc->tTzEvRstTime.boolTrip&&bY1);
  431. }
  432. bTz = poc->sta.bFlag.bTzEvent;
  433. #endif
  434. if(bTz)
  435. {
  436. gl_soe_set_clr(1,sw,soeno,pSet->dI,false);
  437. if(soe_check(EV_BH_FAULT+sw*EV_SW_NUM)==false) //保护总
  438. {
  439. soe_record_ev( EV_BH_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  440. }
  441. poc->sta.bFlag.bDzLed = true;
  442. }
  443. else
  444. {
  445. gl_soe_set_clr(0,sw,soeno,pSet->dI,false);
  446. if(pro_check_bh_all(sw)==false)
  447. {
  448. pro_rst_event(sw,EV_BH_FAULT); //保护总
  449. }
  450. }
  451. //告警记录及出口
  452. if(poc->sta.bFlag.bGjEvent)
  453. {
  454. gl_soe_set_clr(1,sw,soeno+1,pSet->dI,BH_WAVETIME_EN(pSet->dT)); // 大于150毫秒,出口也启动录波
  455. if(poc->sta.bFlag.bDzLed==false)
  456. {
  457. poc->sta.bFlag.bGjLed = true;
  458. }
  459. }
  460. else
  461. {
  462. gl_soe_set_clr(0,sw,soeno+1,pSet->dI,false);
  463. }
  464. }
  465. void Pro_LX(int sw,u32 dStep,int oc,int soe_no)
  466. {
  467. bool bQDD,bQDD1,bTrip;
  468. TOC_T *poc = &g_tRelay[sw].tOC[oc];
  469. OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
  470. u16 soeno=soe_no+sw*EV_SW_NUM;
  471. int ui_begin;
  472. bool bTz=false;
  473. TRELAY_T *pR=&g_tRelay[sw];
  474. ui_begin = UI_SW_INDEX_BEGIN(sw);
  475. // 电流启动
  476. bQDD = OverRelay(g_ui[ui_begin+SW_AC_I0].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
  477. bQDD1 = OverRelay(g_ui[PUB_AC_U01].m2[0], pRunSet->dU_U0BS, pRunSet->dU_U0BS, false);
  478. poc->sta.bFlag.bQD = (BH_ALL_EN(sw))
  479. && (pSet->bTz || pSet->bGj)
  480. && bQDD
  481. && ((bQDD1&&pRunSet->bTT_U0BS)||(!pRunSet->bTT_U0BS));
  482. if(poc->sta.bFlag.bQD) //幅值启动
  483. {
  484. if(!poc->sta.bFlag.bQDWave)
  485. {
  486. rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD); //录波类型:跳闸类
  487. poc->sta.bFlag.bQDWave=true;
  488. }
  489. }
  490. else
  491. {
  492. poc->sta.bFlag.bQDWave=false;
  493. }
  494. #ifdef EV_GL_STATR
  495. lx_start_soe_set( poc->sta.bFlag.bQD,sw,soe_no+2);//过流启动SOE
  496. #endif
  497. RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
  498. RunTR(&poc->tQD25ms, poc->sta.bFlag.bQD, dStep);
  499. // 如果时间到,启动时间未到,调用幅值启动加速模块
  500. if(poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip)
  501. {
  502. if(protect_amp_lx_js(sw))
  503. {
  504. // 预置25ms,让下个循环再出口
  505. PreSetTime(&poc->tQD25ms, T_25ms);
  506. #ifdef CPU_FUXI
  507. //FUXI平台等待下一个循环会导致偶尔动作时间超40ms,改为不等待,本循环处理完
  508. poc->tQD25ms.boolTrip = 1;
  509. #endif
  510. }
  511. }
  512. bTrip = poc->tQDTime.boolTrip&&poc->tQD25ms.boolTrip;
  513. poc->sta.bFlag.bGj=bTrip&&pSet->bGj; // 告警
  514. poc->sta.bFlag.bTz= bTrip&&pSet->bTz; // 出口
  515. // 零序闭锁重合闸
  516. poc->sta.bFlag.bBSCH = poc->sta.bFlag.bTz && !pRunSet->tSwSet[sw].dT_ch_jd_tt;
  517. if(bTrip) // 条件满足,置动作灯
  518. {
  519. poc->sta.bFlag.bTripBak = true;
  520. //poc->sta.bFlag.bDzLed = true;
  521. }
  522. #ifdef SOE_RECORD_DELAY
  523. bTz = poc->sta.bFlag.bTz && soe_check(EV_TZFAIL+sw*EV_SW_NUM)==false;
  524. #else
  525. bTz =poc->sta.bFlag.bTz;
  526. #endif
  527. #ifdef YX_RESET_TIME
  528. {
  529. bool bY1;
  530. //故障遥信延时复归
  531. bY1=(!poc->sta.bFlag.bGj)&&poc->sta.bFlag.bGjEvent;
  532. RunTR(&poc->tGjEvRstTime, bY1, dStep);
  533. poc->sta.bFlag.bGjEvent=poc->sta.bFlag.bGj||(!poc->tGjEvRstTime.boolTrip&&bY1);
  534. bY1=(!poc->sta.bFlag.bTz)&&poc->sta.bFlag.bTzEvent;
  535. RunTR(&poc->tTzEvRstTime, bY1, dStep);
  536. poc->sta.bFlag.bTzEvent=poc->sta.bFlag.bTz||(!poc->tTzEvRstTime.boolTrip&&bY1);
  537. }
  538. bTz = poc->sta.bFlag.bTzEvent;
  539. #endif
  540. if(bTz)
  541. {
  542. poc->sta.bFlag.bDzLed = true;
  543. if(soe_check(soeno)==false)
  544. {
  545. DWORD I0,U0;
  546. 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);
  547. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  548. soe_record_ev( soeno, 1, I0,U0,0 );
  549. // rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD);
  550. }
  551. if(soe_check(EV_LX_FAULT+sw*EV_SW_NUM)==false) // 零序总
  552. {
  553. soe_record_ev( EV_LX_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  554. pR->bYcRefresh.bLx = true;
  555. }
  556. if(soe_check(EV_BH_FAULT+sw*EV_SW_NUM)==false) //保护总
  557. {
  558. soe_record_ev( EV_BH_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  559. }
  560. if(soe_check(EV_ALL_FAULT+sw*EV_SW_NUM)==false) //保护总
  561. {
  562. soe_record_ev( EV_ALL_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  563. }
  564. }
  565. else
  566. {
  567. if(soe_check(soeno)==true)
  568. {
  569. soe_record_ev( soeno, 0, 0,0,0 );
  570. }
  571. if(pro_check_lx_all(sw)==false)
  572. {
  573. pro_rst_event(sw,EV_LX_FAULT); //零序总
  574. }
  575. if(pro_check_bh_all(sw)==false)
  576. {
  577. pro_rst_event(sw,EV_BH_FAULT); //保护总
  578. }
  579. if(pro_check_fault_all(sw)==false)
  580. {
  581. pro_rst_event(sw,EV_ALL_FAULT); //事故总
  582. }
  583. }
  584. // 告警记录及出口
  585. if(poc->sta.bFlag.bGj)
  586. {
  587. if(poc->sta.bFlag.bDzLed==false)
  588. {
  589. poc->sta.bFlag.bGjLed = true;
  590. }
  591. if(soe_check(soeno+1)==false)
  592. {
  593. DWORD I0,U0;
  594. 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);
  595. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  596. soe_record_ev( soeno+1, 1, I0,U0,0 );
  597. if(BH_WAVETIME_EN(pSet->dT)) rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD);
  598. }
  599. if(soe_check(EV_LX_FAULT+sw*EV_SW_NUM)==false) // 零序总
  600. {
  601. soe_record_ev( EV_LX_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  602. pR->bYcRefresh.bLx = true;
  603. }
  604. if(soe_check(EV_ALL_FAULT+sw*EV_SW_NUM)==false) //保护总
  605. {
  606. soe_record_ev( EV_ALL_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  607. }
  608. }
  609. else
  610. {
  611. if(soe_check(soeno+1)==true)
  612. {
  613. soe_record_ev( soeno+1, 0, 0,0,0 );
  614. }
  615. if(pro_check_lx_all(sw)==false)
  616. {
  617. pro_rst_event(sw,EV_LX_FAULT); //零序总
  618. }
  619. if(pro_check_fault_all(sw)==false)
  620. {
  621. pro_rst_event(sw,EV_ALL_FAULT); //事故总
  622. }
  623. }
  624. }
  625. /**************************************************************************
  626. 函数名称:Pro_Accheck
  627. 函数版本:1.00
  628. 作者: 保护产品部
  629. 创建日期:2007.10.15
  630. 函数功能说明:加速功能块
  631. 输入参数:
  632. 其他输入:
  633. 输出参数:
  634. 返回值:
  635. ***************************************************************************/
  636. void Pro_Accheck(int sw,u32 dStep,int oc,int soe_no)
  637. {
  638. bool bQDD,bTrip;
  639. bool bJS3,bJS4,bJS5;
  640. bool bY1,bY2;
  641. TOC_T *poc = &g_tRelay[sw].tOC[oc];
  642. OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
  643. u16 soeno=soe_no+sw*EV_SW_NUM;
  644. bool bxbbs,benable;
  645. int ui_begin;
  646. DWORD U0;
  647. TRELAY_T *pR=&g_tRelay[sw];
  648. ui_begin = UI_SW_INDEX_BEGIN(sw);
  649. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  650. if(oc==BH_GLJS||oc==BH_LXJS)
  651. {
  652. benable=BH_ALL_EN(sw);
  653. }
  654. else
  655. {
  656. benable=FA_ALL_EN(sw);
  657. }
  658. // 电流启动
  659. if(oc==BH_GLJS||oc==FA_GL)
  660. {
  661. bool bxb;
  662. DWORD xbcoe; // 谐波系数
  663. if(oc==BH_GLJS)
  664. {
  665. bxb=pRunSet->tSwSet[sw].bTT_bh_xbbs;
  666. xbcoe=pRunSet->tSwSet[sw].d_bh_xbcoe;
  667. }
  668. else
  669. {
  670. bxb=pRunSet->tSwSet[sw].bTT_fa_xbbs;
  671. xbcoe=pRunSet->tSwSet[sw].d_fa_xbcoe;
  672. }
  673. poc->sta.bFlag.bIaQD = OverRelay(g_ui[ui_begin+SW_AC_IA].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIaQD);
  674. poc->sta.bFlag.bIbQD = OverRelay(g_ui[ui_begin+SW_AC_IB].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIbQD);
  675. poc->sta.bFlag.bIcQD = OverRelay(g_ui[ui_begin+SW_AC_IC].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIcQD);
  676. poc->sta.bFlag.bIaxb =bxb&&XBCalc(sw,SW_AC_IA,xbcoe,poc->sta.bFlag.bIaQD);
  677. poc->sta.bFlag.bIbxb=bxb&&XBCalc(sw,SW_AC_IB,xbcoe,poc->sta.bFlag.bIbQD);
  678. poc->sta.bFlag.bIcxb=bxb&&XBCalc(sw,SW_AC_IC,xbcoe,poc->sta.bFlag.bIcQD);
  679. bQDD=poc->sta.bFlag.bIaQD||poc->sta.bFlag.bIbQD||poc->sta.bFlag.bIcQD;
  680. bxbbs=poc->sta.bFlag.bIaxb||poc->sta.bFlag.bIbxb||poc->sta.bFlag.bIcxb; //谐波闭锁
  681. if(BH_ALL_EN(sw))
  682. {
  683. if(oc == BH_GLJS)
  684. {
  685. poc->sta.bFlag.bXBbs = (BH_ALL_EN(sw)
  686. && (pSet->bTz||pSet->bGj)
  687. && bQDD)
  688. && bxbbs;
  689. //xb_bs_soe(g_protect.sw,dStep);
  690. }
  691. }
  692. }
  693. else //零序加速或FA合后零序过流跳闸
  694. {
  695. // 零序电流过量继电器
  696. bY1 = OverRelay(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
  697. // 零序电压过量继电器
  698. //bY2 = OverRelay(g_ui[PUB_AC_U01].m2[0], pRunSet->dU_U0BS, pRunSet->dU_U0BS, false);
  699. bY2=true;
  700. bQDD=bY1&& ((bY2&&pRunSet->bTT_U0BS)||(!pRunSet->bTT_U0BS));
  701. bxbbs=false;
  702. }
  703. // 检查合闸加速标
  704. if(oc==BH_GLJS||oc==BH_LXJS)
  705. {
  706. bJS3 = g_tRelay[sw].tCHZ.sta.bFlag.bCHJS // 重合加速标
  707. || g_tRelay[sw].tSWST.uSWST.bFlag.bSHJS; // 手合加速标
  708. }
  709. else
  710. {
  711. bJS3 =g_tRelay[sw].tSWST.uSWST.bFlag.bSDJS //上电加速
  712. //|| g_tRelay[sw].tSWST.uSWST.bFlag.bSHJS; // 手合加速标
  713. ;
  714. }
  715. poc->sta.bFlag.bQD = (benable
  716. && (pSet->bTz||pSet->bGj)
  717. && bQDD)
  718. && (!bxbbs);//谐波闭锁
  719. // 加速标保持
  720. bJS4 = bJS3 || poc->sta.bFlag.bJSBC;
  721. // 后加速启动条件满足
  722. bJS5 = poc->sta.bFlag.bQD&& bJS4;
  723. // 合闸加速标保持
  724. poc->sta.bFlag.bJSBC = bJS5 && bJS4;
  725. if(bJS5) //幅值启动
  726. {
  727. if(!poc->sta.bFlag.bQDWave)
  728. {
  729. if(oc==BH_GLJS||oc==FA_GL)
  730. {
  731. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  732. }
  733. else
  734. {
  735. rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD); //录波类型:跳闸类
  736. }
  737. poc->sta.bFlag.bQDWave=true;
  738. }
  739. }
  740. else
  741. {
  742. poc->sta.bFlag.bQDWave=false;
  743. }
  744. RunTR(&poc->tQDTime, bJS5, dStep);
  745. RunTR(&poc->tQD25ms, bJS5, dStep);
  746. // 如果加速时间到,启动时间未到,调用幅值启动加速模块
  747. if((oc==BH_GLJS|| oc==FA_GL || BH_LXJS)&&(poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip))
  748. {
  749. if(oc==BH_GLJS|| oc==FA_GL)
  750. {
  751. if(protect_amp_qd_js(sw))
  752. {
  753. // 预置25ms,让下个循环再出口
  754. PreSetTime(&poc->tQD25ms, T_25ms);
  755. }
  756. }
  757. else
  758. {
  759. if(protect_amp_lx_js(sw))
  760. {
  761. // 预置25ms,让下个循环再出口
  762. PreSetTime(&poc->tQD25ms, T_25ms);
  763. }
  764. }
  765. }
  766. bTrip = poc->tQDTime.boolTrip && poc->tQD25ms.boolTrip;
  767. poc->sta.bFlag.bTz=bTrip; //
  768. if(bTrip) // 条件满足,置动作灯
  769. {
  770. poc->sta.bFlag.bTripBak = true;
  771. //poc->sta.bFlag.bDzLed = true;
  772. }
  773. #ifdef GD_TEST_2021
  774. // 故障遥信延时复归
  775. bY1=(!poc->sta.bFlag.bTz)&&poc->sta.bFlag.bTzEvent;
  776. RunTR(&poc->tTzEvRstTime, bY1, dStep);
  777. poc->sta.bFlag.bTzEvent=poc->sta.bFlag.bTz||(!poc->tTzEvRstTime.boolTrip&&bY1);
  778. #endif
  779. // 出口记录及出口
  780. if(oc==BH_GLJS||oc==FA_GL)
  781. {
  782. #ifdef GD_TEST_2021
  783. if(poc->sta.bFlag.bTzEvent)
  784. #else
  785. if(poc->sta.bFlag.bTz)
  786. #endif
  787. {
  788. poc->sta.bFlag.bDzLed = true;
  789. gl_soe_set_clr(1,sw,soeno,pSet->dI,BH_WAVETIME_EN(pSet->dT));
  790. if(soe_check(EV_BH_FAULT+sw*EV_SW_NUM)==false) //保护总
  791. {
  792. soe_record_ev( EV_BH_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  793. }
  794. if(oc==FA_GL)
  795. {
  796. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==false&&pRunSet->tSwSet[sw].bTT_fa_gzbshz)
  797. {
  798. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );
  799. }
  800. }
  801. }
  802. else
  803. {
  804. gl_soe_set_clr(0,sw,soeno,pSet->dI,false);
  805. if(pro_check_bh_all(sw)==false)
  806. {
  807. pro_rst_event(sw,EV_BH_FAULT); //保护总
  808. }
  809. }
  810. }
  811. else // 零序加速
  812. {
  813. // 出口记录及出口
  814. #ifdef GD_TEST_2021
  815. if(poc->sta.bFlag.bTzEvent)
  816. #else
  817. if(poc->sta.bFlag.bTz)
  818. #endif
  819. {
  820. poc->sta.bFlag.bDzLed = true;
  821. if(soe_check(soeno)==false)
  822. {
  823. DWORD I0;
  824. 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);
  825. //U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  826. soe_record_ev( soeno, 1, I0,U0,0 );
  827. if(BH_WAVETIME_EN(pSet->dT))rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD);
  828. }
  829. if(soe_check(EV_LX_FAULT+sw*EV_SW_NUM)==false) // 零序总
  830. {
  831. soe_record_ev( EV_LX_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  832. pR->bYcRefresh.bLx = true;
  833. }
  834. if(soe_check(EV_BH_FAULT+sw*EV_SW_NUM)==false) //保护总
  835. {
  836. soe_record_ev( EV_BH_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  837. }
  838. if(soe_check(EV_ALL_FAULT+sw*EV_SW_NUM)==false) //故障总
  839. {
  840. soe_record_ev( EV_ALL_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  841. }
  842. if(oc==FA_LX)
  843. {
  844. if(soe_check(EV_HHGZ+sw*EV_SW_NUM)==false&&pRunSet->tSwSet[sw].bTT_fa_gzbshz)
  845. {
  846. soe_record_ev(EV_HHGZ+sw*EV_SW_NUM, 1, 0,0,0 );
  847. }
  848. }
  849. }
  850. else
  851. {
  852. if(soe_check(soeno)==true)
  853. {
  854. soe_record_ev( soeno, 0, 0,0,0 );
  855. }
  856. if(pro_check_lx_all(sw)==false)
  857. {
  858. pro_rst_event(sw,EV_LX_FAULT); //零序总
  859. }
  860. if(pro_check_bh_all(sw)==false)
  861. {
  862. pro_rst_event(sw,EV_BH_FAULT); //保护总
  863. }
  864. if(pro_check_fault_all(sw)==false)
  865. {
  866. pro_rst_event(sw,EV_ALL_FAULT); //故障总
  867. }
  868. }
  869. }
  870. }
  871. /******************************************************************************
  872. 函数名称: Pro_BSTZ
  873. 函数版本: 01.01
  874. 创建作者: xxxxxx
  875. 创建日期: 2015-10-23
  876. 函数说明: 大电流闭锁分闸,用于负荷开关,以免过切断容量跳闸
  877. 参数说明: 无
  878. 返回值: 成功返回0.
  879. 修改记录:
  880. */
  881. void Pro_BSTZ(int sw,u32 dStep,int oc,int soe_no)
  882. {
  883. bool bQDD,bTrip;
  884. TOC_T *poc = &g_tRelay[sw].tOC[oc];
  885. OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
  886. u16 soeno=soe_no+sw*EV_SW_NUM;
  887. // 电流启动
  888. bQDD = OverRelay(g_sw[sw].m2_max, pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
  889. poc->sta.bFlag.bQD = (BH_ALL_EN(sw)//现有程序FA模式下已处理遮断,所以只需要BH模式投入此功能
  890. && (pSet->bTz||pSet->bGj)
  891. && bQDD);
  892. if(poc->sta.bFlag.bQD) //幅值启动
  893. {
  894. #if 0
  895. if(!poc->sta.bFlag.bQDWave)
  896. {
  897. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  898. poc->sta.bFlag.bQDWave=true;
  899. }
  900. #endif
  901. }
  902. RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
  903. bTrip = poc->tQDTime.boolTrip;
  904. poc->sta.bFlag.bTz = bTrip&&pSet->bTz;
  905. g_tRelay[sw].bBSTZ = bTrip&&pSet->bTz;
  906. if(bTrip) // 条件满足,置动作灯
  907. {
  908. poc->sta.bFlag.bTripBak = true;
  909. poc->sta.bFlag.bDzLed = true;
  910. }
  911. if(!BH_ALL_EN(sw))
  912. {
  913. return;
  914. }
  915. // 出口记录及出口
  916. if(poc->sta.bFlag.bTz)
  917. {
  918. if(soe_check(soeno)==false)
  919. {
  920. int ui_begin;
  921. DWORD Ia,Ib,Ic;
  922. ui_begin = UI_SW_INDEX_BEGIN(sw);
  923. 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);
  924. 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);
  925. 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);
  926. soe_record_ev(soeno, 1, Ia,Ib,Ic );
  927. //if(BH_WAVETIME_EN(pSet->dT))rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  928. }
  929. }
  930. else
  931. {
  932. if(soe_check(soeno)==true)
  933. {
  934. soe_record_ev(soeno, 0, 0,0,0);
  935. }
  936. }
  937. }
  938. /***********************************
  939. 函数名称: Pro_over_limit_i
  940. 函数版本: 01.01
  941. 创建作者: xxxxxx
  942. 创建日期: 2015-10-23
  943. 函数说明: 电流越限
  944. 参数说明: 无
  945. 返回值: 成功返回0.
  946. 修改记录:
  947. */
  948. void Pro_over_i(int sw,u32 dStep,int oc,int soe_no)
  949. {
  950. bool bQDD,bTrip;
  951. int ui_begin;
  952. DWORD Ia,Ib,Ic;
  953. #ifdef GD_TEST_2021
  954. bool by1;
  955. #endif
  956. TOC_T *poc = &g_tRelay[sw].tOC[oc];
  957. OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
  958. u16 soeno=soe_no+sw*EV_SW_NUM;
  959. // 电流启动
  960. bQDD = OverRelay(g_sw[sw].m2_max, pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
  961. poc->sta.bFlag.bQD = (pSet->bTz || pSet->bGj) && bQDD;
  962. RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
  963. bTrip=poc->tQDTime.boolTrip; // 告警
  964. poc->sta.bFlag.bGj = bTrip; // 告警
  965. #ifdef GD_TEST_2021
  966. // 故障遥信延时复归
  967. by1 = (!poc->sta.bFlag.bGj) && poc->sta.bFlag.bGjEvent;
  968. RunTR(&poc->tGjEvRstTime, by1, dStep);
  969. poc->sta.bFlag.bGjEvent = poc->sta.bFlag.bGj || (!poc->tGjEvRstTime.boolTrip && by1);
  970. #endif
  971. //告警记录及出口
  972. if(bTrip) // 条件满足,置动作灯
  973. {
  974. poc->sta.bFlag.bDzLed = true;
  975. }
  976. if(poc->sta.bFlag.bGj)
  977. {
  978. // gz_soe_set_clr(1,sw,soeno,pSet->dI);
  979. if(soe_check(soeno))
  980. return;
  981. ui_begin = UI_SW_INDEX_BEGIN(sw);
  982. 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);
  983. 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);
  984. 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);
  985. soe_record_ev(soeno, 1, Ia,Ib,Ic );
  986. }
  987. else
  988. {
  989. // gz_soe_set_clr(0,sw,soeno,pSet->dI);
  990. if(!soe_check(soeno))
  991. return;
  992. soe_record_ev(soeno, 0, 0,0,0 );
  993. }
  994. }
  995. void Pro_over_i0(int sw,u32 dStep,int oc,int soe_no)
  996. {
  997. bool bQDD,bTrip;
  998. #ifdef GD_TEST_2021
  999. bool by1;
  1000. #endif
  1001. TOC_T *poc = &g_tRelay[sw].tOC[oc];
  1002. OC_SET *pSet = &pRunSet->tSwSet[sw].toc[oc];
  1003. u16 soeno=soe_no+sw*EV_SW_NUM;
  1004. // 电流启动
  1005. bQDD = OverRelay(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
  1006. poc->sta.bFlag.bQD = (pSet->bTz || pSet->bGj) && bQDD;
  1007. RunTR(&poc->tQDTime, poc->sta.bFlag.bQD, dStep);
  1008. bTrip=poc->tQDTime.boolTrip; // 告警
  1009. poc->sta.bFlag.bGj=bTrip; // 告警
  1010. #ifdef GD_TEST_2021
  1011. // 故障遥信延时复归
  1012. by1 = (!poc->sta.bFlag.bGj) && poc->sta.bFlag.bGjEvent;
  1013. RunTR(&poc->tGjEvRstTime, by1, dStep);
  1014. poc->sta.bFlag.bGjEvent = poc->sta.bFlag.bGj || (!poc->tGjEvRstTime.boolTrip && by1);
  1015. #endif
  1016. if(bTrip) // 条件满足,置动作灯
  1017. {
  1018. poc->sta.bFlag.bDzLed = true;
  1019. }
  1020. if(poc->sta.bFlag.bGj)
  1021. {
  1022. if(soe_check(soeno)==false)
  1023. {
  1024. int ui_begin;
  1025. DWORD I0;
  1026. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1027. 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);
  1028. soe_record_ev( soeno, 1, I0,0,0 );
  1029. }
  1030. }
  1031. else
  1032. {
  1033. if(soe_check(soeno)==true)
  1034. {
  1035. soe_record_ev( soeno, 0, 0,0,0 );
  1036. }
  1037. }
  1038. }
  1039. #ifdef EV_GL_STATR
  1040. void gl_start_soe_set(u8 set_clr, int sw,u16 soe_no)
  1041. {
  1042. int ui_begin;
  1043. DWORD Ia,Ib,Ic;
  1044. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1045. 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);
  1046. 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);
  1047. 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);
  1048. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1049. if(soe_check(soe_no)!=set_clr)
  1050. {
  1051. soe_record_ev(soe_no, set_clr, Ia,Ib,Ic );
  1052. }
  1053. }
  1054. void lx_start_soe_set(u8 set_clr, int sw,u16 soe_no)
  1055. {
  1056. int ui_begin;
  1057. DWORD I0,U0;
  1058. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1059. 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);
  1060. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1061. if(soe_check(soe_no)!=set_clr)
  1062. {
  1063. soe_record_ev(soe_no, set_clr, U0,I0,0 );
  1064. }
  1065. }
  1066. #endif
  1067. /******************************************************************************
  1068. 函数名称: gl_soe_set_clr
  1069. 函数版本: 01.01
  1070. 创建作者: xxxxxx
  1071. 创建日期: 2014-12-16
  1072. 函数说明: 过流事件的建立和返回
  1073. 参数说明: set_clr: 1 建立,0 返回
  1074. soe_no: 事件组的起始序号
  1075. i_set: 当前过流保护的定值
  1076. 返回值: 无
  1077. 修改记录:
  1078. */
  1079. int gl_soe_set_clr(u8 set_clr, int sw, u16 soe_no, u32 i_set,bool bfault)
  1080. {
  1081. int ui_begin;
  1082. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1083. switch(set_clr)
  1084. {
  1085. case 1:
  1086. {
  1087. DWORD Ia,Ib,Ic;
  1088. 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);
  1089. 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);
  1090. 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);
  1091. if(soe_check(soe_no)==false)
  1092. {
  1093. soe_record_ev(soe_no, 1, Ia,Ib,Ic );
  1094. if(bfault)rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  1095. }
  1096. pro_check_gl_abc(sw,i_set,Ia,Ib,Ic); // 分相故障判断
  1097. pro_check_fd_gl_abc(sw,i_set,Ia,Ib,Ic,soe_no); // 分段分相故障判断
  1098. if(soe_check(EV_GL_FAULT+sw*EV_SW_NUM)==false) // 过流总
  1099. {
  1100. soe_record_ev( EV_GL_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  1101. }
  1102. if(soe_check(EV_ALL_FAULT+sw*EV_SW_NUM)==false) //保护总
  1103. {
  1104. soe_record_ev( EV_ALL_FAULT+sw*EV_SW_NUM,1, 0,0,0 );
  1105. }
  1106. }
  1107. break;
  1108. case 0:
  1109. {
  1110. if(soe_check(soe_no)==true)
  1111. {
  1112. soe_record_ev( soe_no, 0, 0,0,0 );
  1113. }
  1114. if(pro_check_gl_all(sw)==false)
  1115. {
  1116. pro_rst_event(sw,EV_IABC_GL);
  1117. pro_rst_event(sw,EV_IAB_GL);
  1118. pro_rst_event(sw,EV_IBC_GL);
  1119. pro_rst_event(sw,EV_ICA_GL);
  1120. pro_rst_event(sw,EV_IA_GL);
  1121. pro_rst_event(sw,EV_IB_GL);
  1122. pro_rst_event(sw,EV_IC_GL);
  1123. pro_rst_event(sw,EV_GL_FAULT); //过流总
  1124. pro_rst_fd_gl_event(sw,soe_no); //分段分相故障返回
  1125. }
  1126. if(pro_check_fault_all(sw)==false)
  1127. {
  1128. pro_rst_event(sw,EV_ALL_FAULT); //保护总
  1129. }
  1130. }
  1131. break;
  1132. }
  1133. return 0;
  1134. }
  1135. /******************************************************************************
  1136. 函数名称: gz_soe_set_clr
  1137. 函数版本: 01.01
  1138. 创建作者: xxxxxx
  1139. 创建日期: 2014-12-16
  1140. 函数说明: 过流事件的建立和返回
  1141. 参数说明: set_clr: 1 建立,0 返回
  1142. soe_no: 事件组的起始序号
  1143. i_set: 当前过流保护的定值
  1144. 返回值: 无
  1145. 修改记录:
  1146. */
  1147. int gz_soe_set_clr(u8 set_clr, int sw, u16 soe_no, u32 i_set)
  1148. {
  1149. int ui_begin, i;
  1150. DWORD Idz;
  1151. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1152. switch(set_clr)
  1153. {
  1154. case 1:
  1155. {
  1156. if(soe_check(soe_no)==false)
  1157. {
  1158. DWORD Ia,Ib,Ic;
  1159. 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);
  1160. 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);
  1161. 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);
  1162. soe_record_ev(soe_no, 1, Ia,Ib,Ic );
  1163. }
  1164. for(i=0; i<3; i++)
  1165. {
  1166. if(soe_check(soe_no+i+1)==false)
  1167. {
  1168. if (g_ui[ui_begin + SW_AC_IA + i].m2[0] > i_set)
  1169. {
  1170. 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);
  1171. soe_record_ev( soe_no+i+1, 1, Idz, 0, 0);
  1172. }
  1173. }
  1174. }
  1175. }
  1176. break;
  1177. case 0:
  1178. {
  1179. if(soe_check(soe_no)==true)
  1180. {
  1181. soe_record_ev( soe_no, 0, 0,0,0 );
  1182. }
  1183. for (i=0; i<3; i++)
  1184. {
  1185. if(soe_check(soe_no+i+1)==true)
  1186. {
  1187. soe_record_ev( soe_no+i+1, 0, 0,0,0 );
  1188. }
  1189. }
  1190. }
  1191. break;
  1192. }
  1193. return 0;
  1194. }
  1195. bool XBCalc(int sw,int index,DWORD xBcoe,bool bQD)
  1196. {
  1197. if(bQD)
  1198. {
  1199. if( g_ui[UI_SW_INDEX(sw,index)].m2[1] > _MulFac_U(g_ui[UI_SW_INDEX(sw,index)].m2[0], xBcoe ))
  1200. {
  1201. return(true);
  1202. }
  1203. }
  1204. return(false);
  1205. }
  1206. /*------------------------------ 测试函数 -------------------------------------
  1207. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  1208. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  1209. */
  1210. /*------------------------------ 文件结束 -------------------------------------
  1211. */