FA_g.c 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027
  1. #include "head.h"
  2. #ifdef __IEC61850_GOOSE_FUNC__
  3. #include "app_61850.h"
  4. #endif
  5. #include "goose.h"
  6. int g_bgseEnable;
  7. const struct gse_tbl g_goose_send_tbl[GOOSE_SEND_TBL_NUMBER]=
  8. {
  9. {"节点故障", "GSE_KO_FAULT"},
  10. {"故障隔离成功", "GSE_KO_GLOK"},
  11. {"开关拒跳", "GSE_KO_JT"},
  12. {"过流闭锁", "GSE_KO_GLBS"},
  13. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求通信异常,全系统均异常
  14. {"状态闭锁值", "GSE_KO_BS_STATUS"},
  15. {"状态复归值", "GSE_KO_BS_FG"},
  16. #endif
  17. };
  18. const struct gse_tbl g_goose_recv_tbl[GOOSE_RECV_TBL_NUMBER]=
  19. {
  20. {"M侧节点故障01", "GSE_KI_M01"},
  21. {"M侧节点故障02", "GSE_KI_M02"},
  22. {"M侧节点故障03", "GSE_KI_M03"},
  23. {"M侧节点故障04", "GSE_KI_M04"},
  24. {"M侧节点故障05", "GSE_KI_M05"},
  25. {"M侧节点故障06", "GSE_KI_M06"},
  26. {"M侧节点故障07", "GSE_KI_M07"},
  27. {"M侧节点故障08", "GSE_KI_M08"},
  28. {"N侧节点故障01", "GSE_KI_N01"},
  29. {"N侧节点故障02", "GSE_KI_N02"},
  30. {"N侧节点故障03", "GSE_KI_N03"},
  31. {"N侧节点故障04", "GSE_KI_N04"},
  32. {"M侧障隔离成功01", "GSE_KI_GLCG01"},
  33. {"M侧障隔离成功02", "GSE_KI_GLCG02"},
  34. {"M侧障隔离成功03", "GSE_KI_GLCG03"},
  35. {"M侧障隔离成功04", "GSE_KI_GLCG04"},
  36. {"M侧障隔离成功05", "GSE_KI_GLCG05"},
  37. {"M侧障隔离成功06", "GSE_KI_GLCG06"},
  38. {"M侧障隔离成功07", "GSE_KI_GLCG07"},
  39. {"M侧障隔离成功08", "GSE_KI_GLCG08"},
  40. {"N侧障隔离成功01", "GSE_KI_GLCG09"},
  41. {"N侧障隔离成功02", "GSE_KI_GLCG10"},
  42. {"N侧障隔离成功03", "GSE_KI_GLCG11"},
  43. {"N侧障隔离成功04", "GSE_KI_GLCG12"},
  44. {"M侧开关拒跳01", "GSE_KI_JT01"},
  45. {"M侧开关拒跳02", "GSE_KI_JT02"},
  46. {"M侧开关拒跳03", "GSE_KI_JT03"},
  47. {"M侧开关拒跳04", "GSE_KI_JT04"},
  48. {"M侧开关拒跳05", "GSE_KI_JT05"},
  49. {"馈线开关拒跳01", "GSE_KI_JT06"},
  50. {"馈线开关拒跳02", "GSE_KI_JT07"},
  51. {"馈线开关拒跳03", "GSE_KI_JT08"},
  52. {"N侧开关拒跳01", "GSE_KI_JT09"},
  53. {"N侧开关拒跳02", "GSE_KI_JT10"},
  54. {"N侧开关拒跳03", "GSE_KI_JT11"},
  55. {"馈线开关拒跳04", "GSE_KI_JT12"},
  56. {"馈线过流闭锁01", "GSE_KI_GLBS01"},
  57. {"馈线过流闭锁02", "GSE_KI_GLBS02"},
  58. {"馈线过流闭锁03", "GSE_KI_GLBS03"},
  59. {"馈线过流闭锁04", "GSE_KI_GLBS04"},
  60. {"馈线过流闭锁05", "GSE_KI_GLBS05"},
  61. {"馈线过流闭锁06", "GSE_KI_GLBS06"},
  62. {"馈线过流闭锁07", "GSE_KI_GLBS07"},
  63. {"馈线过流闭锁08", "GSE_KI_GLBS08"},
  64. {"馈线过流闭锁09", "GSE_KI_GLBS09"},
  65. {"馈线过流闭锁10", "GSE_KI_GLBS10"},
  66. {"馈线过流闭锁11", "GSE_KI_GLBS11"},
  67. {"馈线过流闭锁12", "GSE_KI_GLBS12"},
  68. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求通信异常,全系统均异常
  69. {"状态闭锁值01", "GSE_KI_BS_STATUS01"},
  70. {"状态闭锁值02", "GSE_KI_BS_STATUS02"},
  71. {"状态闭锁值03", "GSE_KI_BS_STATUS03"},
  72. {"状态闭锁值04", "GSE_KI_BS_STATUS04"},
  73. {"状态闭锁值05", "GSE_KI_BS_STATUS05"},
  74. {"状态闭锁值06", "GSE_KI_BS_STATUS06"},
  75. {"状态闭锁值07", "GSE_KI_BS_STATUS07"},
  76. {"状态闭锁值08", "GSE_KI_BS_STATUS08"},
  77. {"状态闭锁值09", "GSE_KI_BS_STATUS09"},
  78. {"状态闭锁值10", "GSE_KI_BS_STATUS10"},
  79. {"状态闭锁值11", "GSE_KI_BS_STATUS11"},
  80. {"状态闭锁值12", "GSE_KI_BS_STATUS12"},
  81. {"状态复归值01", "GSE_KI_FG_STATUS01"},
  82. {"状态复归值02", "GSE_KI_FG_STATUS02"},
  83. {"状态复归值03", "GSE_KI_FG_STATUS03"},
  84. {"状态复归值04", "GSE_KI_FG_STATUS04"},
  85. {"状态复归值05", "GSE_KI_FG_STATUS05"},
  86. {"状态复归值06", "GSE_KI_FG_STATUS06"},
  87. {"状态复归值07", "GSE_KI_FG_STATUS07"},
  88. {"状态复归值08", "GSE_KI_FG_STATUS08"},
  89. {"状态复归值09", "GSE_KI_FG_STATUS09"},
  90. {"状态复归值10", "GSE_KI_FG_STATUS10"},
  91. {"状态复归值11", "GSE_KI_FG_STATUS11"},
  92. {"状态复归值12", "GSE_KI_FG_STATUS12"},
  93. #endif
  94. };
  95. FA_GOOSE tFAg;
  96. bool bFAgInit=false;
  97. void fa_g_init(void)
  98. {
  99. int i;
  100. if(!bFAgInit) // 61850 初始化会调用 fa_g_extinit ,将初始化部分tFAg的变量,两处调用可能先后顺序不确定,保证只初始化一次
  101. {
  102. bFAgInit=true;
  103. memset(&tFAg,0,sizeof(tFAg));
  104. }
  105. for(i=0;i<GOOSE_RECV_TBL_NUMBER;i++)
  106. {
  107. tFAg.inval[i]=-1; // 默认为-1 ,有正确接收时置位
  108. }
  109. InitTR(&tFAg.tRstTime,pRunSet->dT_sendext*100, 0);
  110. InitTR(&tFAg.tGooseStillTime,T_20ms,T_20ms);
  111. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  112. InitTR(&tFAg.tErrfgtime,tRunPara.gse_T1,0);
  113. #endif
  114. fa_g_packet(true); //发送数据初始化
  115. }
  116. // buf 为32个遥信的起始位置
  117. void fa_g_unpack(void)
  118. {
  119. int i;
  120. bool bgzglok=0;
  121. int sw=0;
  122. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  123. TRELAY_T *pR=&g_tRelay[sw];
  124. if(BH_GOOSE_EN_YB(sw)) //智能FA 不投入时,不处理订阅信息
  125. {
  126. for(i=0;i<=GOOSE_RECV_LOGIC_NUM;i++)
  127. {
  128. int soeno=EV_GOOSE_BGN+i;
  129. if(tFAg.inval[i]>0)
  130. {
  131. if(soe_check(soeno)==false)
  132. {
  133. soe_record_ev(soeno, 1, 0,0,0 );
  134. ResetTR(&tFAg.tRstTime);
  135. }
  136. }
  137. else
  138. {
  139. if(soe_check(soeno)==true)
  140. {
  141. soe_record_ev(soeno, 0, 0,0,0 );
  142. }
  143. }
  144. }
  145. for(i=0;i<GOOSE_EQU_SIDE+GOOSE_EQU_SIDE_N;i++)
  146. {
  147. tFAg.ugside[i].bFlag.bgl=(tFAg.inval[GOOSE_RECV_TBL_M01+i]>0)?1:0;
  148. tFAg.ugside[i].bFlag.bgzglok=(tFAg.inval[GOOSE_RECV_TBL_GL01+i]>0)?1:0;
  149. tFAg.ugside[i].bFlag.bglbs=(tFAg.inval[GOOSE_RECV_TBL_GLBS01+i]>0)?1:0;
  150. bgzglok|=tFAg.ugside[i].bFlag.bgzglok;
  151. }
  152. for(i=0;i<GOOSE_EQU_MAX;i++)
  153. {
  154. tFAg.ugside[i].bFlag.btzsb=(tFAg.inval[GOOSE_RECV_TBL_JT01+i]>0)?1:0;
  155. }
  156. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求通信异常,全系统均异常
  157. {
  158. u32 st,fg;
  159. uint32_t flags;
  160. st=0;
  161. fg=0;
  162. for(i=0;i<GOOSE_EQU_MAX;i++)
  163. {
  164. st|=tFAg.inval[GOOSE_RECV_TBL_STATUS01+i];
  165. fg|=tFAg.inval[GOOSE_RECV_TBL_FG01+i];
  166. }
  167. rt_irq_save(flags);
  168. tFAg.commerrst|=(st&~(1<<tRunPara.gse_id));
  169. if(tFAg.commerrst)
  170. {
  171. tFAg.commerrfg|=(fg&~(1<<tRunPara.gse_id));
  172. }
  173. if((st&(1<<tRunPara.gse_id))&&tFAg.commerr==0) // 本机收到其他装置本机闭锁,但本机已恢复数据,重新发送复归值
  174. {
  175. tFAg.commerrfg|=(1<<tRunPara.gse_id);
  176. }
  177. for(i=0;i<GOOSE_EQU_MAX;i++)
  178. {
  179. if(tFAg.inval[GOOSE_RECV_TBL_STATUS01+i]) // 现阶段,本段代码起不了作用,原因是61850接收时,把本身保存的接收控制块的数据重新拷贝了过来,这儿清掉,重新接收后又被赋值
  180. {
  181. tFAg.inval[GOOSE_RECV_TBL_STATUS01+i]&=(~tFAg.commerrfg); // 清保存的本机闭锁值,防止通信异常,闭锁值无法更新
  182. }
  183. }
  184. tFAg.commerrst&=(~tFAg.commerrfg);
  185. rt_irq_restore(flags);
  186. }
  187. #endif
  188. if(bgzglok) //收到故障隔离成功信息,需转发
  189. {
  190. if(pR->tSWST.uSWST.bFlag.bTZWZ) //开关在跳位不转发
  191. {
  192. return;
  193. }
  194. if(pRunSet->tSwSet[sw].tGocSet.bsw_fz) //分支开关不转发
  195. {
  196. return;
  197. }
  198. if(g_tRelay[sw].tgoc.bTzout) // 本装置处于跳闸状态,不转发故障隔离信号
  199. {
  200. RunTR(&poc->tgzglokForbitTime, true, 1); //故障隔离发送闭锁
  201. return;
  202. }
  203. if(!poc->tgzglokForbitTime.boolTrip) //故障隔离发送未闭锁
  204. {
  205. RunTR(&poc->tgzglokextTime, true, 1);
  206. poc->psta.bFlag.bgzglok=poc->tgzglokextTime.boolTrip;
  207. RunTR(&poc->tgzglokForbitTime, poc->psta.bFlag.bgzglok, 1); //故障隔离发送闭锁
  208. }
  209. }
  210. if(soe_check(EV_GOOSE_DECODE)==true)
  211. {
  212. soe_record_ev(EV_GOOSE_DECODE,0, 0,0,0 );
  213. }
  214. }
  215. }
  216. void fa_g_decode(int commstate)
  217. {
  218. int sw=0;
  219. // TGOC_T *poc=&g_tRelay[ sw].tgoc;
  220. if((commstate==-1)&&BH_GOOSE_EN_YB(sw))
  221. {
  222. if(soe_check(EV_GOOSE_DECODE)==false)
  223. {
  224. soe_record_ev(EV_GOOSE_DECODE,1, 0,0,0 );
  225. }
  226. return;
  227. }
  228. #if 0
  229. if((commstate>0)&&BH_GOOSE_EN_YB(sw))
  230. {
  231. if(soe_check(EV_GOOSE_ERR)==false)
  232. {
  233. soe_record_ev(EV_GOOSE_ERR,1, 0,0,0 );
  234. poc->psta.bFlag.bcomerr=1;
  235. }
  236. if(soe_check(EV_SYS_GOOSE_ERR)==false) //置系统通信异常soe
  237. {
  238. soe_record_ev(EV_SYS_GOOSE_ERR, 1, 0,0,0 );
  239. tFAg.syscomerr=1; //goose系统通信异常
  240. }
  241. tFAg.commerr=1;
  242. }
  243. else
  244. {
  245. if(soe_check(EV_GOOSE_ERR)==true)
  246. {
  247. soe_record_ev(EV_GOOSE_ERR,0, 0,0,0 );
  248. }
  249. tFAg.commerr=0;
  250. }
  251. #endif
  252. }
  253. void fa_g_extinit(int num,int firstaddr) // app_goose.c中调用fa_g.c中的变量初始化
  254. {
  255. int i;
  256. if(num>=GOOSE_RECV_GOLBNUM)num=GOOSE_RECV_GOLBNUM;
  257. if(!bFAgInit)
  258. {
  259. bFAgInit=true;
  260. memset(&tFAg,0,sizeof(tFAg));
  261. }
  262. tFAg.recvgolbnum=num;
  263. for(i=0;i<num;i++)
  264. {
  265. tFAg.dTrecv[i]=dTCounter;
  266. }
  267. tFAg.bNside=false;
  268. if(num==1&&firstaddr>=GOOSE_RECV_TBL_N01)tFAg.bNside=true; // 若输入控制块只有一个,判断是M侧还是N侧
  269. }
  270. void fa_g_gocbrecvdT(int index) // app_goose.c中接收后调用,用于通信超时处理
  271. {
  272. if(index<GOOSE_RECV_GOLBNUM)
  273. {
  274. tFAg.dTrecv[index]=dTCounter;
  275. }
  276. }
  277. void fa_g_bs_fa(int sw)
  278. {
  279. TRELAY_T *pR=&g_tRelay[sw];
  280. TSETSW *pSet = &pRunSet->tSwSet[sw];
  281. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  282. if( pR->tSWST.uSWST.bFlag.bTZWZ&&(!pSet->tGocSet.bsw_ll&&!pSet->tGocSet.bsw_fz))
  283. {
  284. if(poc->bgooseGz)
  285. {
  286. if(soe_check(EV_GOOSE_GZBS_FA)==false) // goose故障闭锁
  287. {
  288. soe_record_ev(EV_GOOSE_GZBS_FA, 1, 0,0,0 );
  289. }
  290. }
  291. else
  292. {
  293. if(soe_check(EV_GOOSE_TZBS_FA)==false) // goose故障闭锁
  294. {
  295. soe_record_ev(EV_GOOSE_TZBS_FA, 1, 0,0,0 );
  296. }
  297. }
  298. poc->bgooseBsHz=true;
  299. }
  300. else
  301. {
  302. poc->bgooseGz=false;
  303. poc->bgooseBsHz=false;
  304. }
  305. }
  306. #ifdef GOOSE_NETTYPE_SET
  307. extern unsigned char fec_get_hsr_prp_flag(void);//返回订阅点组网类型
  308. #endif
  309. void fa_g_app_time(int sw) // 1s 执行一次函数
  310. {
  311. sw=0;
  312. #ifdef DFA_MESH_ERR_SOE // 单一网口网线掉了,需弹soe
  313. if( rt_get_net_linkstatus(0) && BH_GOOSE_EN_YB(sw)&&g_goose_net_type) //普通模式,不报单网卡掉线
  314. {
  315. if(soe_check(EV_NET1_DOWN)==false)
  316. {
  317. soe_record_ev(EV_NET1_DOWN,1, 0,0,0 );
  318. }
  319. }
  320. else
  321. {
  322. if(soe_check(EV_NET1_DOWN)==true)
  323. {
  324. soe_record_ev(EV_NET1_DOWN,0, 0,0,0 );
  325. }
  326. }
  327. if( rt_get_net_linkstatus(1) && BH_GOOSE_EN_YB(sw)&&g_goose_net_type)
  328. {
  329. if(soe_check(EV_NET2_DOWN)==false)
  330. {
  331. soe_record_ev(EV_NET2_DOWN,1, 0,0,0 );
  332. }
  333. }
  334. else
  335. {
  336. if(soe_check(EV_NET2_DOWN)==true)
  337. {
  338. soe_record_ev(EV_NET2_DOWN,0, 0,0,0 );
  339. }
  340. }
  341. #endif
  342. #ifdef GOOSE_NETTYPE_SET
  343. u8 temp;
  344. static u8 nettype;
  345. static u32 count;
  346. //unsigned char fec_get_hsr_prp_flag()
  347. //return 1--hsr;return 2--prp;return 3--hsr&prp
  348. if(BH_GOOSE_EN(sw)&&g_goose_net_type)//
  349. {
  350. //nettype
  351. temp=fec_get_hsr_prp_flag();
  352. if(temp)
  353. {
  354. nettype |= temp;
  355. }
  356. //10s判一次
  357. count++;
  358. if(count%10==0)
  359. {
  360. if(nettype)
  361. {
  362. if(nettype&g_goose_net_type)
  363. {
  364. if(soe_check(EV_GOOSE_NETTYPE_ERR)==true)
  365. {
  366. soe_record_ev(EV_GOOSE_NETTYPE_ERR,0, 0,0,0 );
  367. }
  368. }
  369. else
  370. {
  371. if(soe_check(EV_GOOSE_NETTYPE_ERR)==false)
  372. {
  373. soe_record_ev(EV_GOOSE_NETTYPE_ERR,1, 0,0,0 );
  374. }
  375. }
  376. }
  377. nettype=0;
  378. }
  379. }
  380. else
  381. {
  382. if(soe_check(EV_GOOSE_NETTYPE_ERR)==true)
  383. {
  384. soe_record_ev(EV_GOOSE_NETTYPE_ERR,0, 0,0,0 );
  385. }
  386. }
  387. #endif
  388. #ifdef GD_AREA_ZHONGSHAN_2020// 中山局
  389. {
  390. bool bCfgerr;
  391. bCfgerr=pRunSet->tSwSet[sw].tGocSet.bKg_mainloop // 主环开关
  392. &&(tFAg.recvgolbnum==0) //接收控制块未配置
  393. &&(gi_platelib_state ==IEC61850_LIB_INIT_SUCCESS); // 61850初始化完毕
  394. if(bCfgerr)
  395. {
  396. if(soe_check(EV_GOOSE_CONFIG_ERR)==false)
  397. {
  398. soe_record_ev(EV_GOOSE_CONFIG_ERR,1, 0,0,0 );
  399. }
  400. }
  401. else
  402. {
  403. if(soe_check(EV_GOOSE_CONFIG_ERR)==true)
  404. {
  405. soe_record_ev(EV_GOOSE_CONFIG_ERR,0, 0,0,0 );
  406. }
  407. }
  408. }
  409. #endif
  410. }
  411. void fa_g_commcheck(DWORD dStep) // 防止goose信息丢失,相关置位信息延时复归
  412. {
  413. int i;
  414. bool bret=false;
  415. bool boverdT=false;
  416. int sw=0;
  417. for(i=0;i<=GOOSE_RECV_LOGIC_NUM;i++)
  418. {
  419. bret|=(tFAg.inval[i]>0)?true:false;
  420. }
  421. RunTR(&tFAg.tRstTime, bret, dStep); // 信息延迟复归
  422. if(tFAg.tRstTime.boolTrip)
  423. {
  424. for(i=0;i<=GOOSE_RECV_LOGIC_NUM;i++)
  425. {
  426. if(tFAg.tRstTime.boolTrip&&(tFAg.inval[i]>0))tFAg.inval[i]=0;
  427. }
  428. ResetTR(&tFAg.tRstTime);
  429. fa_g_unpack();
  430. }
  431. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  432. if(tFAg.commerr)
  433. {
  434. tFAg.commerrst|=(1<<tRunPara.gse_id);
  435. tFAg.commerrfg&=~(1<<tRunPara.gse_id); // 本机通信异常,清除复归位
  436. }
  437. else
  438. {
  439. tFAg.commerrst&=~(1<<tRunPara.gse_id);
  440. }
  441. if(tFAg.commerrst>0) //
  442. {
  443. if(soe_check(EV_SYS_GOOSE_ERR)==false) //置系统通信异常soe
  444. {
  445. soe_record_ev(EV_SYS_GOOSE_ERR, 1, 0,0,0 );
  446. tFAg.syscomerr=1; //goose系统通信异常
  447. fa_g_bs_fa(sw);
  448. if(tFAg.commerr)
  449. {
  450. InitTR(&tFAg.tErrfgtime,tRunPara.gse_T1,0); // 若是本机通信异常,发送时间为T1
  451. }
  452. else
  453. {
  454. InitTR(&tFAg.tErrfgtime,tRunPara.gse_T2,0); // 若不是本机通信异常,发送时间为T2
  455. }
  456. }
  457. }
  458. else
  459. {
  460. if(soe_check(EV_SYS_GOOSE_ERR)==true) //置系统通信异常soe
  461. {
  462. soe_record_ev(EV_SYS_GOOSE_ERR, 0, 0,0,0 );
  463. tFAg.syscomerr=0; //goose系统通信异常
  464. }
  465. }
  466. RunTR(&tFAg.tErrfgtime, tFAg.commerrfg, dStep); // 分布式功能投入
  467. if(tFAg.tErrfgtime.boolTrip) //复归发送时间到,清复归标志:条件 无通信异常
  468. {
  469. tFAg.commerrfg&=tFAg.commerrst;
  470. ResetTR(&tFAg.tErrfgtime);
  471. }
  472. #endif
  473. for(i=0;i<tFAg.recvgolbnum;i++)
  474. {
  475. boverdT|=((dTCounter-tFAg.dTrecv[i])>T_1s*20)?true:false;
  476. if(!BH_GOOSE_EN_YB(sw))
  477. {
  478. tFAg.dTrecv[i]=dTCounter;
  479. }
  480. #ifdef DFA_MESH_ERR_SOE // 单一网口网线掉了,需弹soe
  481. {
  482. bool berr=((dTCounter-tFAg.dTrecv[i])>T_1s*20)?true:false;
  483. if(berr&&BH_GOOSE_EN_YB(sw))
  484. {
  485. if(((i==tFAg.recvgolbnum-1)&&(tFAg.recvgolbnum>1))||tFAg.bNside)
  486. {
  487. if(soe_check(EV_GOOSE_ERR_N)==false)
  488. {
  489. soe_record_ev(EV_GOOSE_ERR_N,1, 0,0,0 );
  490. }
  491. }
  492. else
  493. {
  494. if(soe_check(EV_GOOSE_ERR_M)==false)
  495. {
  496. soe_record_ev(EV_GOOSE_ERR_M,1, 0,0,0 );
  497. }
  498. }
  499. }
  500. else
  501. {
  502. if(((i==tFAg.recvgolbnum-1)&&(tFAg.recvgolbnum>1))||tFAg.bNside)
  503. {
  504. if(soe_check(EV_GOOSE_ERR_N)==true)
  505. {
  506. soe_record_ev(EV_GOOSE_ERR_N,0, 0,0,0 );
  507. }
  508. }
  509. else if(soe_check(EV_GOOSE_ERR_M)==true)
  510. {
  511. int j;
  512. bool berr1=false;
  513. for(j=0;j<tFAg.recvgolbnum-1;j++)
  514. {
  515. berr1|=((dTCounter-tFAg.dTrecv[j])>T_1s*20)?true:false;
  516. }
  517. if(berr1==false)
  518. {
  519. soe_record_ev(EV_GOOSE_ERR_M,0, 0,0,0 );
  520. }
  521. }
  522. }
  523. }
  524. #endif
  525. }
  526. if(boverdT&&BH_GOOSE_EN_YB(sw))
  527. {
  528. if(soe_check(EV_GOOSE_ERR)==false)
  529. {
  530. soe_record_ev(EV_GOOSE_ERR,1, 0,0,0 );
  531. }
  532. tFAg.commerr=1;
  533. }
  534. else
  535. {
  536. if(soe_check(EV_GOOSE_ERR)==true)
  537. {
  538. soe_record_ev(EV_GOOSE_ERR,0, 0,0,0 ); //本机通信恢复
  539. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  540. tFAg.commerrfg|=(1<<tRunPara.gse_id); // 本机通信恢复,置复归位
  541. #endif
  542. }
  543. tFAg.commerr=0;
  544. }
  545. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  546. //分布式FA由投入转为退出时,需处理闭锁FA 的相关信息,同通信异常类似
  547. RunTR(&tFAg.tGooseStillTime, BH_GOOSE_EN_YB(sw), dStep); // 分布式功能投入
  548. bret=tFAg.tGooseStillTime.boolTrip&&(!BH_GOOSE_EN_YB(sw)); // 分布式功能由投入转为退出
  549. if(bret)
  550. {
  551. fa_g_bs_fa(sw);
  552. ResetTR(&tFAg.tGooseStillTime);
  553. }
  554. #endif
  555. }
  556. void fa_g_packet(bool bfirst)
  557. {
  558. int sw=0;
  559. UGOOSE_STU *pug=&tFAg.ug;
  560. TRELAY_T *pR=&g_tRelay[sw];
  561. TGOC_T *poc=&pR->tgoc;
  562. bool bcommerrsend=false;
  563. pug->bFlag.bzx=poc->psta.bFlag.bZX; // 本线路正向故障
  564. pug->bFlag.bfx=poc->psta.bFlag.bFX; // 本线路反向故障
  565. pug->bFlag.blx=poc->psta.bFlag.bLX; //本线路无方向故障
  566. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 || defined GD_AREA_MAIN_2020
  567. pug->bFlag.bgl=poc->psta.bFlag.bWX||poc->psta2.bFlag.bWX; // 本线路跳闸失败
  568. #else
  569. pug->bFlag.bgl=poc->psta.bFlag.bWX; // 本线路跳闸失败
  570. #endif
  571. pug->bFlag.bgzglok=poc->psta.bFlag.bgzglok; // 本线路跳闸失败
  572. pug->bFlag.btzsb=poc->psta.bFlag.btzsb||(pR->uBHDZ.bFlag.bTZSB&&pRunSet->bTT_fhkg_pub); // 本线路跳闸失败
  573. pug->bFlag.bglbs=poc->psta.bFlag.bGLBS; //负荷开关
  574. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求通信异常,全系统均异常
  575. if(tFAg.commerrst!=tFAg.commerrstsave||tFAg.commerrfg!=tFAg.commerrfgsave)
  576. {
  577. bcommerrsend=true;
  578. tFAg.commerrstsave=tFAg.commerrst;
  579. tFAg.commerrfgsave=tFAg.commerrfg;
  580. }
  581. #endif
  582. g_bgseEnable=BH_GOOSE_EN_YB(sw)||pRunSet->bTT_fhkg_pub;
  583. if((pug->wfFlag!=tFAg.ug_save)||bfirst||bcommerrsend) //启动goose 发送
  584. {
  585. int *dat=tFAg.outval;
  586. tFAg.ug_save=pug->wfFlag;
  587. dat[GOOSE_SEND_TBL_GZ]=(pug->bFlag.bgl||pug->bFlag.blx||pug->bFlag.bTstgz);
  588. dat[GOOSE_SEND_TBL_GL]=(pug->bFlag.bgzglok||pug->bFlag.bTstglok);
  589. dat[GOOSE_SEND_TBL_JT]=(pug->bFlag.btzsb)||pug->bFlag.bTstjt; //开关拒跳:智能FA逻辑或负荷开关常规动作拒跳
  590. dat[GOOSE_SEND_TBL_GLBS]=pug->bFlag.bglbs||pug->bFlag.bTstglbs; //负荷开关
  591. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求通信异常,全系统均异常
  592. dat[GOOSE_SEND_TBL_STATUS]=tFAg.commerrstsave; // 通信状态
  593. dat[GOOSE_SEND_TBL_FG]=tFAg.commerrfgsave; //复归值
  594. #endif
  595. if(!bfirst)
  596. {
  597. tFAg.bSend=true;
  598. #ifdef __IEC61850_GOOSE_FUNC__
  599. goose_send_wakeup();
  600. #endif
  601. }
  602. }
  603. }
  604. // A相电流方向判断
  605. void GOc_dir_phA(int sw)
  606. {
  607. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  608. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  609. int indexI;
  610. bool bzx,bfx;
  611. u32 dIgl,dIgl_fh;
  612. dIgl=pSet->dIgl;
  613. dIgl_fh=pSet->dIgl_fh;
  614. indexI=UI_SW_INDEX(sw,SW_AC_IA);
  615. poc->psta.bFlag.bQDA = OverRelay(g_ui[indexI ].m2[0], dIgl, dIgl_fh, poc->psta.bFlag.bQDA); // A相过流启动
  616. bzx=CalDir_A(sw,poc->psta.bFlag.bQDA&&pSet->bTT_DIR,false);
  617. bfx=(!bzx)&&poc->psta.bFlag.bQDA&&pSet->bTT_DIR;
  618. poc->psta.bFlag.bZXA=poc->psta.bFlag.bQDA // A相电流启动
  619. &&bzx // 正方向
  620. &&pSet->bTT_DIR //功率方向投入
  621. &&(!tPT.uPT1DX.bFlag.bPTYC);
  622. poc->psta.bFlag.bFXA=poc->psta.bFlag.bQDA // A相电流启动
  623. &&(bfx) //反方向
  624. &&pSet->bTT_DIR //功率方向投入
  625. &&(!tPT.uPT1DX.bFlag.bPTYC);
  626. poc->psta.bFlag.bWXA=poc->psta.bFlag.bQDA // A相电流启动
  627. &&(!pSet->bTT_DIR||tPT.uPT1DX.bFlag.bPTYC); // 功率方向退出或功率方向投入,PT异常退方向)
  628. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  629. dIgl=pSet->dIgl2;
  630. dIgl_fh=pSet->dIgl2_fh;
  631. poc->psta2.bFlag.bQDA = OverRelay(g_ui[indexI ].m2[0], dIgl, dIgl_fh, poc->psta2.bFlag.bQDA); // A相过流启动
  632. bzx=CalDir_A(sw,poc->psta2.bFlag.bQDA&&pSet->bTT_DIR,false);
  633. bfx=(!bzx)&&poc->psta2.bFlag.bQDA&&pSet->bTT_DIR;
  634. poc->psta2.bFlag.bZXA=poc->psta2.bFlag.bQDA // A相电流启动
  635. &&bzx // 正方向
  636. &&pSet->bTT_DIR //功率方向投入
  637. &&(!tPT.uPT1DX.bFlag.bPTYC);
  638. poc->psta2.bFlag.bFXA=poc->psta2.bFlag.bQDA // A相电流启动
  639. &&(bfx) //反方向
  640. &&pSet->bTT_DIR //功率方向投入
  641. &&(!tPT.uPT1DX.bFlag.bPTYC);
  642. poc->psta2.bFlag.bWXA=poc->psta2.bFlag.bQDA // A相电流启动
  643. &&(!pSet->bTT_DIR||tPT.uPT1DX.bFlag.bPTYC); // 功率方向退出或功率方向投入,PT异常退方向)
  644. #endif
  645. }
  646. // B相电流方向判断
  647. void GOc_dir_phB(int sw)
  648. {
  649. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  650. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  651. int indexI;
  652. bool bzx,bfx;
  653. u32 dIgl,dIgl_fh;
  654. dIgl=pSet->dIgl;
  655. dIgl_fh=pSet->dIgl_fh;
  656. indexI=UI_SW_INDEX(sw,SW_AC_IB);
  657. poc->psta.bFlag.bQDB = OverRelay(g_ui[indexI ].m2[0], dIgl, dIgl_fh, poc->psta.bFlag.bQDB); // A相过流启动
  658. bzx=CalDir_B(sw,poc->psta.bFlag.bQDB&&pSet->bTT_DIR,false);
  659. bfx=(!bzx)&&poc->psta.bFlag.bQDB&&pSet->bTT_DIR;
  660. poc->psta.bFlag.bZXB=poc->psta.bFlag.bQDB // A相电流启动
  661. &&bzx // 正方向
  662. &&pSet->bTT_DIR //功率方向投入
  663. &&(!tPT.uPT1DX.bFlag.bPTYC); // 无TV异常
  664. poc->psta.bFlag.bFXB=poc->psta.bFlag.bQDB // A相电流启动
  665. &&(bfx) //反方向
  666. &&pSet->bTT_DIR //功率方向投入
  667. &&(!tPT.uPT1DX.bFlag.bPTYC); // 无TV异常
  668. poc->psta.bFlag.bWXB=poc->psta.bFlag.bQDB // A相电流启动
  669. &&(!pSet->bTT_DIR||tPT.uPT1DX.bFlag.bPTYC); // 功率方向退出或功率方向投入,PT异常退方向)
  670. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  671. dIgl=pSet->dIgl2;
  672. dIgl_fh=pSet->dIgl2_fh;
  673. poc->psta2.bFlag.bQDB = OverRelay(g_ui[indexI ].m2[0], dIgl, dIgl_fh, poc->psta2.bFlag.bQDB); // A相过流启动
  674. bzx=CalDir_B(sw,poc->psta2.bFlag.bQDB&&pSet->bTT_DIR,false);
  675. bfx=(!bzx)&&poc->psta2.bFlag.bQDB&&pSet->bTT_DIR;
  676. poc->psta2.bFlag.bZXB=poc->psta2.bFlag.bQDB // A相电流启动
  677. &&bzx // 正方向
  678. &&pSet->bTT_DIR //功率方向投入
  679. &&(!tPT.uPT1DX.bFlag.bPTYC); // 无TV异常
  680. poc->psta2.bFlag.bFXB=poc->psta2.bFlag.bQDB // A相电流启动
  681. &&(bfx) //反方向
  682. &&pSet->bTT_DIR //功率方向投入
  683. &&(!tPT.uPT1DX.bFlag.bPTYC); // 无TV异常
  684. poc->psta2.bFlag.bWXB=poc->psta2.bFlag.bQDB // A相电流启动
  685. &&(!pSet->bTT_DIR||tPT.uPT1DX.bFlag.bPTYC); // 功率方向退出或功率方向投入,PT异常退方向)
  686. #endif
  687. }
  688. // C相电流方向判断
  689. void GOc_dir_phC(int sw)
  690. {
  691. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  692. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  693. int indexI;
  694. bool bzx,bfx;
  695. u32 dIgl,dIgl_fh;
  696. dIgl=pSet->dIgl;
  697. dIgl_fh=pSet->dIgl_fh;
  698. indexI=UI_SW_INDEX(sw,SW_AC_IC);
  699. poc->psta.bFlag.bQDC = OverRelay(g_ui[indexI ].m2[0], dIgl, dIgl_fh, poc->psta.bFlag.bQDC); // A相过流启动
  700. bzx=CalDir_C(sw,poc->psta.bFlag.bQDC&&pSet->bTT_DIR,false);
  701. bfx=(!bzx)&&poc->psta.bFlag.bQDC&&pSet->bTT_DIR;
  702. poc->psta.bFlag.bZXC=poc->psta.bFlag.bQDC // A相电流启动
  703. &&bzx // 正方向
  704. &&pSet->bTT_DIR //功率方向投入
  705. &&(!tPT.uPT1DX.bFlag.bPTYC); // 无TV异常
  706. poc->psta.bFlag.bFXC=poc->psta.bFlag.bQDC // A相电流启动
  707. &&(bfx) //反方向
  708. &&pSet->bTT_DIR //功率方向投入
  709. &&(!tPT.uPT1DX.bFlag.bPTYC); // 无TV异常
  710. poc->psta.bFlag.bWXC=poc->psta.bFlag.bQDC // A相电流启动
  711. &&(!pSet->bTT_DIR||tPT.uPT1DX.bFlag.bPTYC); // 功率方向未投入,或PT异常
  712. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  713. dIgl=pSet->dIgl2;
  714. dIgl_fh=pSet->dIgl2_fh;
  715. poc->psta2.bFlag.bQDC = OverRelay(g_ui[indexI ].m2[0], dIgl, dIgl_fh, poc->psta2.bFlag.bQDC); // A相过流启动
  716. bzx=CalDir_C(sw,poc->psta2.bFlag.bQDC&&pSet->bTT_DIR,false);
  717. bfx=(!bzx)&&poc->psta2.bFlag.bQDC&&pSet->bTT_DIR;
  718. poc->psta2.bFlag.bZXC=poc->psta2.bFlag.bQDC // A相电流启动
  719. &&bzx // 正方向
  720. &&pSet->bTT_DIR //功率方向投入
  721. &&(!tPT.uPT1DX.bFlag.bPTYC); // 无TV异常
  722. poc->psta2.bFlag.bFXC=poc->psta2.bFlag.bQDC // A相电流启动
  723. &&(bfx) //反方向
  724. &&pSet->bTT_DIR //功率方向投入
  725. &&(!tPT.uPT1DX.bFlag.bPTYC); // 无TV异常
  726. poc->psta2.bFlag.bWXC=poc->psta2.bFlag.bQDC // A相电流启动
  727. &&(!pSet->bTT_DIR||tPT.uPT1DX.bFlag.bPTYC); // 功率方向未投入,或PT异常
  728. #endif
  729. }
  730. void GOc_lx_check(int sw)
  731. {
  732. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  733. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  734. int indexI;
  735. indexI=UI_SW_INDEX(sw,SW_AC_I0);
  736. poc->psta.bFlag.bQDLX = OverRelay(g_ui[indexI ].m2[0], pSet->dIlx, pSet->dIlx_fh, poc->psta.bFlag.bQDLX); //零序启动
  737. }
  738. bool GOC_bh_all(int sw)
  739. {
  740. int i;
  741. for(i=BH_GL1;i<=FA_LX2;i++)
  742. {
  743. if(g_tRelay[sw].tOC[i].sta.bFlag.bQD)return true;
  744. }
  745. return false;
  746. }
  747. void GOC_dir_check(int sw,u32 dStep)
  748. {
  749. bool bY1;
  750. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  751. GOc_dir_phA(sw);
  752. GOc_dir_phB(sw);
  753. GOc_dir_phC(sw);
  754. GOc_lx_check(sw);
  755. //正方向判断,保持2秒
  756. bY1=(poc->psta.bFlag.bZXA||poc->psta.bFlag.bZXB||poc->psta.bFlag.bZXC)&&(!poc->sta.bFlag.bXBbs)&&BH_GOOSE_EN_YB(sw);
  757. RunTR(&poc->tTZX_300ms, bY1, dStep);
  758. poc->psta.bFlag.bZX=poc->tTZX_300ms.boolTrip;
  759. //反方向判断,保持2秒
  760. bY1=(poc->psta.bFlag.bFXA||poc->psta.bFlag.bFXB||poc->psta.bFlag.bFXC)&&(!poc->sta.bFlag.bXBbs)&&BH_GOOSE_EN_YB(sw);
  761. RunTR(&poc->tTFX_300ms, bY1, dStep);
  762. poc->psta.bFlag.bFX=poc->tTFX_300ms.boolTrip;
  763. //无方向判断,保持2秒
  764. bY1=(poc->psta.bFlag.bWXA||poc->psta.bFlag.bWXB||poc->psta.bFlag.bWXC)&&(!poc->sta.bFlag.bXBbs)&&BH_GOOSE_EN_YB(sw);
  765. RunTR(&poc->tTWX_300ms, bY1, dStep);
  766. poc->psta.bFlag.bWX=poc->tTWX_300ms.boolTrip;
  767. //零序判断,保持2秒
  768. bY1=poc->psta.bFlag.bQDLX&&BH_GOOSE_EN_YB(sw);
  769. RunTR(&poc->tTLX_300ms, bY1, dStep);
  770. poc->psta.bFlag.bLX=poc->tTLX_300ms.boolTrip;
  771. //过流闭锁
  772. bY1=(GOC_bh_all(sw)&&pRunSet->bTT_fhkg_pub); //负荷开关
  773. RunTR(&poc->tTGLBS_300ms, bY1, dStep);
  774. poc->psta.bFlag.bGLBS=poc->tTGLBS_300ms.boolTrip;
  775. poc->psta.bFlag.bGZ=poc->psta.bFlag.bZX|poc->psta.bFlag.bFX|poc->psta.bFlag.bWX|poc->psta.bFlag.bLX; //线路有故障
  776. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  777. //正方向判断,保持2秒
  778. bY1=(poc->psta2.bFlag.bZXA||poc->psta2.bFlag.bZXB||poc->psta2.bFlag.bZXC)&&(!poc->sta.bFlag.bXBbs2)&&BH_GOOSE_EN_YB(sw);
  779. RunTR(&poc->tTZX2_300ms, bY1, dStep);
  780. poc->psta2.bFlag.bZX=poc->tTZX2_300ms.boolTrip;
  781. //反方向判断,保持2秒
  782. bY1=(poc->psta2.bFlag.bFXA||poc->psta2.bFlag.bFXB||poc->psta2.bFlag.bFXC)&&(!poc->sta.bFlag.bXBbs2)&&BH_GOOSE_EN_YB(sw);
  783. RunTR(&poc->tTFX2_300ms, bY1, dStep);
  784. poc->psta2.bFlag.bFX=poc->tTFX2_300ms.boolTrip;
  785. //无方向判断,保持2秒
  786. bY1=(poc->psta2.bFlag.bWXA||poc->psta2.bFlag.bWXB||poc->psta2.bFlag.bWXC)&&(!poc->sta.bFlag.bXBbs2)&&BH_GOOSE_EN_YB(sw);
  787. RunTR(&poc->tTWX2_300ms, bY1, dStep);
  788. poc->psta2.bFlag.bWX=poc->tTWX2_300ms.boolTrip;
  789. poc->psta2.bFlag.bGZ=poc->psta2.bFlag.bZX|poc->psta2.bFlag.bFX|poc->psta2.bFlag.bWX|poc->psta2.bFlag.bLX; //线路有故障
  790. poc->psta.bFlag.bGZ|=poc->psta2.bFlag.bGZ;
  791. #endif
  792. }
  793. bool fag_goosecheck_gzqc(int sw) //故障切除邻域故障信息判断
  794. {
  795. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  796. TSETSW *pSet = &pRunSet->tSwSet[sw];
  797. UGOOSE_STU *pg;
  798. int i;
  799. if(pSet->tGocSet.bTT_DIR&&(!tPT.uPT1DX.bFlag.bPTYC))// 带方向判断
  800. {
  801. if(poc->psta.bFlag.bZX) //本线路有正向故障,L邻域
  802. {
  803. bool bY1=false;
  804. for(i=GOOSE_EQU_SIDE;i<GOOSE_EQU_MAX;i++)
  805. {
  806. pg=&tFAg.ugside[i];
  807. bY1|=pg->bFlag.bfx; // L邻域 有反向故障
  808. }
  809. return (!bY1);
  810. }
  811. if(poc->psta.bFlag.bFX) //本线路有反向故障, B邻域 无正向向故障
  812. {
  813. bool bY1=false;
  814. for(i=0;i<GOOSE_EQU_SIDE;i++)
  815. {
  816. pg=&tFAg.ugside[i];
  817. bY1|=pg->bFlag.bzx; // B邻域 正向向故障
  818. }
  819. return (!bY1);
  820. }
  821. return false;
  822. }
  823. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 || defined GD_AREA_MAIN_2020
  824. if(poc->psta.bFlag.bWX||poc->psta2.bFlag.bWX||poc->psta.bFlag.bLX) //本线路有无方向故障 ,或零序故障
  825. #else
  826. if(poc->psta.bFlag.bWX||poc->psta.bFlag.bLX) //本线路有无方向故障 ,或零序故障
  827. #endif
  828. {
  829. bool bY1=false;
  830. bool bY2=false;
  831. bool ret=false;
  832. for(i=0;i<GOOSE_EQU_SIDE;i++)
  833. {
  834. pg=&tFAg.ugside[i];
  835. bY1|=(pg->bFlag.bgl|pg->bFlag.blx|pg->bFlag.bzx|pg->bFlag.bfx|pg->bFlag.bglbs|pg->bFlag.blxbs);
  836. }
  837. for(i=GOOSE_EQU_SIDE;i<GOOSE_EQU_MAX;i++)
  838. {
  839. pg=&tFAg.ugside[i];
  840. bY2|=(pg->bFlag.bgl|pg->bFlag.blx|pg->bFlag.bzx|pg->bFlag.bfx|pg->bFlag.bglbs|pg->bFlag.blxbs);
  841. }
  842. if(pRunSet->tSwSet[sw].tGocSet.bsw_fz) //末端开关
  843. {
  844. ret=(bY1||bY2) ; // 末端开关,邻域有故障
  845. }
  846. else if(pRunSet->tSwSet[sw].tGocSet.bsw_sd) //首端开关
  847. {
  848. ret=(!(bY1||bY2)); //任一侧有故障(首开关)
  849. }
  850. else
  851. {
  852. ret=(bY1^bY2); //非首末端,邻域有一侧无故障
  853. }
  854. return ret;
  855. }
  856. return false;
  857. }
  858. bool fag_goosecheck_gzgl(int sw) //故障隔离邻域故障信息判断
  859. {
  860. TSETSW *pSet = &pRunSet->tSwSet[sw];
  861. UGOOSE_STU *pg;
  862. int i;
  863. if(pSet->tGocSet.bTT_DIR&&(!tPT.uPT1DX.bFlag.bPTYC))
  864. {
  865. return false; //合环方式下,无故障隔离故障产生
  866. }
  867. else
  868. {
  869. bool bY1=false;
  870. int num=0;
  871. for(i=0;i<GOOSE_EQU_MAX;i++)
  872. {
  873. pg=&tFAg.ugside[i];
  874. bY1=(pg->bFlag.bgl|pg->bFlag.blx|pg->bFlag.bzx|pg->bFlag.bfx|pg->bFlag.bglbs|pg->bFlag.blxbs);
  875. if(bY1)
  876. {
  877. num++;
  878. }
  879. }
  880. return (num==1);
  881. }
  882. return false;
  883. }
  884. bool fag_goosecheck_ll(int sw) // 联络开关动作,邻域条件判断
  885. {
  886. int i;
  887. UGOOSE_STU *pg;
  888. bool bgzglok=false;
  889. TSETSW *pSet = &pRunSet->tSwSet[sw];
  890. if(pSet->tGocSet.bTT_DIR&&(!tPT.uPT1DX.bFlag.bPTYC))// 带方向判断,无故障隔离发送,条件自动满足
  891. {
  892. bgzglok=true;
  893. }
  894. else
  895. {
  896. for(i=0;i<GOOSE_EQU_MAX;i++)
  897. {
  898. pg=&tFAg.ugside[i];
  899. bgzglok|=pg->bFlag.bgzglok; //收到故障隔离成功信息
  900. }
  901. }
  902. return bgzglok;
  903. }
  904. void fag_get_side_dz(int sw) //获取相邻侧故障信息
  905. {
  906. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  907. UGOOSE_STU *pg;
  908. bool bdz=false;
  909. bool btzsb=false;
  910. int i;
  911. for(i=0;i<GOOSE_EQU_MAX;i++)
  912. {
  913. pg=&tFAg.ugside[i];
  914. bdz|=(pg->bFlag.bgl||pg->bFlag.blx||pg->bFlag.bzx||pg->bFlag.bfx|pg->bFlag.bglbs|pg->bFlag.blxbs);
  915. btzsb|=pg->bFlag.btzsb;
  916. }
  917. poc->b_side_gz=bdz;
  918. poc->b_side_tzsb=btzsb;
  919. }
  920. void fag_cd(int sw,DWORD dStep) //
  921. {
  922. TRELAY_T *pR=&g_tRelay[sw];
  923. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  924. TSETSW *pSet = &pRunSet->tSwSet[sw];
  925. FA_CD *pcd;
  926. bool bQD;
  927. bool bY1;
  928. fag_get_side_dz(sw); // 获取开关临域信息
  929. poc->psta.bFlag.bYY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_fa_YY,pSet->dU_fa_YY_fh, poc->psta.bFlag.bYY1); // 有压
  930. poc->psta.bFlag.bYY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_fa_YY,pSet->dU_fa_YY_fh, poc->psta.bFlag.bYY2);
  931. poc->psta.bFlag.bWY1 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_fa_WY,pSet->dU_fa_WY_fh, poc->psta.bFlag.bWY1); //无压
  932. poc->psta.bFlag.bWY2 = LowRelay(g_sw_pub.m2_max[3], pSet->dU_fa_WY,pSet->dU_fa_WY_fh, poc->psta.bFlag.bWY2);
  933. // 故障切除充电判断
  934. pcd=&pR->tgoc.tqccd;
  935. RunTR(&pcd->tWYTime, (poc->psta.bFlag.bWY1&&poc->psta.bFlag.bWY2), dStep); // 放电两侧无压60秒
  936. pcd->sta.bFlag.bFD=(!BH_GOOSE_EN(sw)) // 分布式退出
  937. || pR->tSWST.uSWST.bFlag.bTZWZ //开关跳位
  938. ||pcd->tWYTime.boolTrip; // 两侧无压超过60秒
  939. bQD=(BH_GOOSE_EN(sw))
  940. //&&!poc->b_side_gz //邻域无故障
  941. //&&!poc->psta.bFlag.bGZ //本开关无故障
  942. &&(poc->psta.bFlag.bYY1||poc->psta.bFlag.bYY2||(pRunSet->dT_cd==0)) //一侧有电压
  943. && pR->tSWST.uSWST.bFlag.bHZWZ
  944. &&!pcd->sta.bFlag.bFD;
  945. RunTR(&pcd->tCDTime, bQD, dStep);
  946. pcd->sta.bFlag.bCD=(pcd->tCDTime.boolTrip||pcd->sta.bFlag.bCD)&&(!pcd->sta.bFlag.bFD); //充电完成
  947. pR->run_stu.goose_qccd=pcd->sta.bFlag.bCD;
  948. // 隔离充电判断
  949. pcd=&pR->tgoc.tglcd;
  950. RunTR(&pcd->tWYTime, (poc->psta.bFlag.bWY1&&poc->psta.bFlag.bWY2), dStep); // 放电两侧无压60秒
  951. pcd->sta.bFlag.bFD=(!BH_GOOSE_EN(sw)) // 分布式退出
  952. || pR->tSWST.uSWST.bFlag.bTZWZ //开关跳位
  953. ||poc->psta.bFlag.bGZ //本开关有故障,故障隔离立即放电
  954. ||pcd->tWYTime.boolTrip; // 两侧无压超过60秒
  955. bQD=(BH_GOOSE_EN(sw))
  956. &&!poc->b_side_gz //邻域无故障
  957. &&!poc->psta.bFlag.bGZ //本开关无故障
  958. &&(poc->psta.bFlag.bYY1||poc->psta.bFlag.bYY2||(pRunSet->dT_cd==0)) //一侧有电压
  959. && pR->tSWST.uSWST.bFlag.bHZWZ
  960. &&!pcd->sta.bFlag.bFD;
  961. RunTR(&pcd->tCDTime, bQD, dStep);
  962. pcd->sta.bFlag.bCD=(pcd->tCDTime.boolTrip||pcd->sta.bFlag.bCD)&&(!pcd->sta.bFlag.bFD); //充电完成
  963. pR->run_stu.goose_glcd=pcd->sta.bFlag.bCD;
  964. //联络充电判断
  965. pcd=&pR->tgoc.tllcd;
  966. RunTR(&pcd->tWYTime, (poc->psta.bFlag.bWY1&&poc->psta.bFlag.bWY2), dStep); //无压判断
  967. pcd->sta.bFlag.bFD=(!BH_GOOSE_EN(sw)) // 分布式退出
  968. ||!pSet->tGocSet.bTT_ll //联络功能退出
  969. #if defined GD_AREA_ZHONGSHAN //中山要求联络开关固定
  970. ||!pSet->tGocSet.bsw_ll
  971. #endif
  972. ||pcd->tWYTime.boolTrip // 两侧无压超过15秒
  973. ||poc->b_side_gz //领域故障
  974. ||pR->tgoc.b_side_tzsb//领域拒动
  975. //||!g_run_stu.yf //KK把手非远方
  976. ||poc->sta.bFlag.bllhz; //本开关联络动作
  977. bQD=(BH_GOOSE_EN(sw)) //充电条件:保护投入
  978. &&(poc->psta.bFlag.bYY1&&poc->psta.bFlag.bYY2) //两侧有压
  979. && pR->tSWST.uSWST.bFlag.bTZWZ // 开关跳位
  980. &&!pcd->sta.bFlag.bFD; //无放电
  981. RunTR(&pcd->tCDTime, bQD, dStep);
  982. pcd->sta.bFlag.bCD=(pcd->tCDTime.boolTrip||pcd->sta.bFlag.bCD) //充电完成,并自保持
  983. &&(!pcd->sta.bFlag.bFD); //无放电标志
  984. pR->run_stu.goose_ll_cd=pcd->sta.bFlag.bCD; //充电标志
  985. //缓动型无压无流判断
  986. poc->bslowEn=(!pSet->tGocSet.bFA_slow)
  987. ||(pSet->tGocSet.bFA_slow //缓动型
  988. &&poc->psta.bFlag.bWY1 //无压
  989. &&poc->psta.bFlag.bWY2
  990. &&pR->tSWST.uSWST.bFlag.bSXWL); //无流
  991. bY1=soe_check(EV_GOOSE_GZBS_FA)||soe_check(EV_GOOSE_TZBS_FA);
  992. RunTR(&poc->tTHz1s,pR->tSWST.uSWST.bFlag.bHZWZ&&bY1, dStep); //合闸后1秒,清动作标志
  993. if(poc->tTHz1s.boolTrip&&BH_GOOSE_EN(sw))
  994. {
  995. pR->tgoc.bgooseGz=false;
  996. pR->tgoc.bgooseBsHz=false;
  997. if(soe_check(EV_GOOSE_GZBS_FA)==true) // goose故障闭锁
  998. {
  999. soe_record_ev(EV_GOOSE_GZBS_FA, 0, 0,0,0 );
  1000. }
  1001. if(soe_check(EV_GOOSE_TZBS_FA)==true) // goose故障闭锁
  1002. {
  1003. soe_record_ev(EV_GOOSE_TZBS_FA, 0, 0,0,0 );
  1004. }
  1005. }
  1006. }
  1007. void fag_oc_gl(int sw,u32 dStep)
  1008. {
  1009. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  1010. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1011. bool bgl,bGoose,bTz;
  1012. // 电流启动
  1013. bgl = OverRelay(g_sw[sw].m2_max, pSet->dIgl, pSet->dIgl_fh, poc->sta.bFlag.bglQD);
  1014. bGoose=(fag_goosecheck_gzqc(sw))||(tFAg.commerr>0); //goose判断满足要求,中山通信异常后,BH_GOOSE_EN 不满足要求,不会启动
  1015. poc->sta.bFlag.bglQD= (BH_GOOSE_EN(sw)
  1016. &&poc->tqccd.sta.bFlag.bCD //故障隔离充电完成
  1017. && (bgl)
  1018. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定
  1019. &&(!pSet->bsw_fz) // 中山局要求分支走常规保护逻辑
  1020. #endif
  1021. &&!poc->sta.bFlag.bXBbs); //谐波闭锁
  1022. if(poc->sta.bFlag.bglQD) //幅值启动
  1023. {
  1024. if(!poc->sta.bFlag.bglQDWave)
  1025. {
  1026. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  1027. poc->sta.bFlag.bglQDWave=true;
  1028. }
  1029. }
  1030. RunTR(&poc->tglQDTime, poc->sta.bFlag.bglQD, dStep);
  1031. RunTR(&poc->tglQD25ms, poc->sta.bFlag.bglQD, dStep);
  1032. // 如果速断时间到,启动时间未到,调用幅值启动加速模块
  1033. if(poc->sta.bFlag.bglQD&& poc->tglQDTime.boolTrip && !poc->tglQD25ms.boolTrip)
  1034. {
  1035. if(protect_amp_qd_js(sw))
  1036. {
  1037. // 预置25ms,让下个循环再出口
  1038. PreSetTime(&poc->tglQD25ms, T_25ms);
  1039. }
  1040. }
  1041. bTz = poc->tglQDTime.boolTrip&&bGoose // 电流启动
  1042. && poc->tglQD25ms.boolTrip; //启动后25ms
  1043. RunTR(&poc->tglslowTime,(bTz&&pSet->bFA_slow), dStep); // 缓动型,跳闸信息自动延长
  1044. poc->sta.bFlag.bglTz=(bTz&&(!pSet->bFA_slow))// 非缓动型,直接出口
  1045. ||(poc->bslowEn&&poc->tglslowTime.boolTrip);
  1046. if(poc->sta.bFlag.bglTz) //启动信息
  1047. {
  1048. int ui_begin;
  1049. DWORD Ia,Ib,Ic;
  1050. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1051. 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);
  1052. 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);
  1053. 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);
  1054. if(soe_check(EV_GOOSE_GL_TZ+sw*EV_SW_NUM)==false) //过流跳闸
  1055. {
  1056. soe_record_ev( EV_GOOSE_GL_TZ+sw*EV_SW_NUM,1, Ia,Ib,Ic );
  1057. poc->bglTzLed=true;
  1058. poc->sta.bFlag.bglTzH=true;
  1059. poc->bgooseGz=true;
  1060. }
  1061. if(soe_check(EV_GOOSE_QC_QD+sw*EV_SW_NUM)==false) // 故障隔离启动
  1062. {
  1063. soe_record_ev( EV_GOOSE_QC_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1064. }
  1065. }
  1066. else
  1067. {
  1068. if(soe_check(EV_GOOSE_GL_TZ+sw*EV_SW_NUM)==true) // 过流跳闸
  1069. {
  1070. soe_record_ev( EV_GOOSE_GL_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1071. }
  1072. }
  1073. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  1074. // 电流启动
  1075. bgl = OverRelay(g_sw[sw].m2_max, pSet->dIgl2, pSet->dIgl2_fh, poc->sta.bFlag.bgl2QD);
  1076. bGoose=(fag_goosecheck_gzqc(sw))||(tFAg.commerr>0); //goose判断满足要求,或通信异常
  1077. poc->sta.bFlag.bgl2QD= (BH_GOOSE_EN(sw)
  1078. &&poc->tqccd.sta.bFlag.bCD //故障隔离充电完成
  1079. && (bgl)
  1080. &&(!pSet->bsw_fz) // 中山局要求分支走常规保护逻辑
  1081. &&!poc->sta.bFlag.bXBbs2); //谐波闭锁
  1082. if(poc->sta.bFlag.bgl2QD) //幅值启动
  1083. {
  1084. if(!poc->sta.bFlag.bgl2QDWave)
  1085. {
  1086. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  1087. poc->sta.bFlag.bgl2QDWave=true;
  1088. }
  1089. }
  1090. RunTR(&poc->tgl2QDTime, poc->sta.bFlag.bgl2QD, dStep);
  1091. RunTR(&poc->tgl2QD25ms, poc->sta.bFlag.bgl2QD, dStep);
  1092. // 如果速断时间到,启动时间未到,调用幅值启动加速模块
  1093. if(poc->sta.bFlag.bgl2QD && poc->tgl2QDTime.boolTrip && !poc->tgl2QD25ms.boolTrip)
  1094. {
  1095. if(protect_amp_qd_js(sw))
  1096. {
  1097. // 预置25ms,让下个循环再出口
  1098. PreSetTime(&poc->tgl2QD25ms, T_25ms);
  1099. }
  1100. }
  1101. bTz = poc->tgl2QDTime.boolTrip&&bGoose // 电流启动
  1102. && poc->tgl2QD25ms.boolTrip; //启动后25ms
  1103. RunTR(&poc->tgl2slowTime,(bTz&&pSet->bFA_slow), dStep); // 缓动型,跳闸信息自动延长
  1104. poc->sta.bFlag.bgl2Tz=(bTz&&(!pSet->bFA_slow))// 非缓动型,直接出口
  1105. ||(poc->bslowEn&&poc->tgl2slowTime.boolTrip);
  1106. if(poc->sta.bFlag.bgl2Tz) //启动信息
  1107. {
  1108. int ui_begin;
  1109. DWORD Ia,Ib,Ic;
  1110. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1111. 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);
  1112. 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);
  1113. 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);
  1114. if(soe_check(EV_GOOSE_GL2_TZ+sw*EV_SW_NUM)==false) //过流跳闸
  1115. {
  1116. soe_record_ev( EV_GOOSE_GL2_TZ+sw*EV_SW_NUM,1, Ia,Ib,Ic );
  1117. poc->bglTzLed=true;
  1118. poc->sta.bFlag.bglTzH=true;
  1119. poc->bgooseGz=true;
  1120. }
  1121. if(soe_check(EV_GOOSE_QC_QD+sw*EV_SW_NUM)==false) // 故障隔离启动
  1122. {
  1123. soe_record_ev( EV_GOOSE_QC_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1124. }
  1125. }
  1126. else
  1127. {
  1128. if(soe_check(EV_GOOSE_GL2_TZ+sw*EV_SW_NUM)==true) // 过流跳闸
  1129. {
  1130. soe_record_ev( EV_GOOSE_GL2_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1131. }
  1132. }
  1133. #endif
  1134. }
  1135. void fag_oc_lx(int sw,u32 dStep)
  1136. {
  1137. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  1138. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1139. bool blx,bGoose,bTz;
  1140. // 电流启动
  1141. blx = OverRelay(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].m2[0], pSet->dIlx, pSet->dIlx_fh, poc->sta.bFlag.blxQD);
  1142. bGoose=(fag_goosecheck_gzqc(sw))||(tFAg.commerr>0); //goose判断满足要求,或通信异常
  1143. poc->sta.bFlag.blxQD = (BH_GOOSE_EN(sw)
  1144. &&poc->tqccd.sta.bFlag.bCD //故障隔离充电完成
  1145. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定
  1146. &&(!pSet->bsw_fz) // 中山局要求分支走常规保护逻辑
  1147. #endif
  1148. && (blx));
  1149. if(poc->sta.bFlag.blxQD) //幅值启动
  1150. {
  1151. if(!poc->sta.bFlag.blxQDWave)
  1152. {
  1153. rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD); //录波类型:跳闸类
  1154. poc->sta.bFlag.blxQDWave=true;
  1155. }
  1156. }
  1157. RunTR(&poc->tlxQDTime, poc->sta.bFlag.blxQD, dStep);
  1158. RunTR(&poc->tlxQD25ms, poc->sta.bFlag.blxQD, dStep);
  1159. // 如果速断时间到,启动时间未到,调用幅值启动加速模块
  1160. if(poc->sta.bFlag.blxQD && poc->tlxQDTime.boolTrip && !poc->tlxQD25ms.boolTrip)
  1161. {
  1162. if(protect_amp_lx_js(sw))
  1163. {
  1164. // 预置25ms,让下个循环再出口
  1165. PreSetTime(&poc->tlxQD25ms, T_25ms);
  1166. }
  1167. }
  1168. bTz = poc->tlxQDTime.boolTrip&&bGoose // 电流启动
  1169. && poc->tlxQD25ms.boolTrip; //启动后25ms
  1170. RunTR(&poc->tlxslowTime,(bTz&&pSet->bFA_slow), dStep); // 缓动型,跳闸信息自动延长
  1171. poc->sta.bFlag.blxTz=(bTz&&(!pSet->bFA_slow))// 非缓动型,直接出口
  1172. ||(poc->bslowEn&&poc->tlxslowTime.boolTrip);
  1173. if(poc->sta.bFlag.blxTz) //启动信息
  1174. {
  1175. int ui_begin;
  1176. DWORD I0;
  1177. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1178. 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);
  1179. if(soe_check(EV_GOOSE_LX_TZ+sw*EV_SW_NUM)==false) //零序跳闸
  1180. {
  1181. soe_record_ev( EV_GOOSE_LX_TZ+sw*EV_SW_NUM,1, I0,0,0 );
  1182. poc->blxTzLed=true;
  1183. poc->sta.bFlag.blxTzH=true;
  1184. poc->bgooseGz=true;
  1185. }
  1186. if(soe_check(EV_GOOSE_QC_QD+sw*EV_SW_NUM)==false) // 故障切除启动
  1187. {
  1188. soe_record_ev( EV_GOOSE_QC_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1189. }
  1190. }
  1191. else
  1192. {
  1193. if(soe_check(EV_GOOSE_LX_TZ+sw*EV_SW_NUM)==true) // 零序跳闸
  1194. {
  1195. soe_record_ev( EV_GOOSE_LX_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1196. }
  1197. }
  1198. }
  1199. // 缓动型故障扩展发送时间,需大于变电站出口时间,保证无压无流后,领域故障还存在
  1200. void fag_gzgl(int sw,DWORD dStep) // 故障隔离
  1201. {
  1202. TRELAY_T *pR=&g_tRelay[sw];
  1203. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1204. TGOC_T *poc=&pR->tgoc;
  1205. UGOOSE_STU *pg;
  1206. bool bY1,bY2,bGoose,bfztz;
  1207. int i;
  1208. bool bWY1, bWY2; // 无压判断
  1209. bWY1 = LowRelay(g_sw_pub.m2_max[2], pRunSet->tSwSet[sw].dU_fa_WY,pRunSet->tSwSet[sw].dU_fa_WY_fh, false); //无压
  1210. bWY2 = LowRelay(g_sw_pub.m2_max[3], pRunSet->tSwSet[sw].dU_fa_WY,pRunSet->tSwSet[sw].dU_fa_WY_fh, false);
  1211. bY1=false;
  1212. for(i=0;i<GOOSE_EQU_MAX;i++) //邻域有故障产生
  1213. {
  1214. pg=&tFAg.ugside[i];
  1215. bY1|=(pg->bFlag.bgl|pg->bFlag.blx|pg->bFlag.bzx|pg->bFlag.bfx|pg->bFlag.bglbs|pg->bFlag.blxbs);
  1216. }
  1217. bfztz=(!pSet->bsw_fz)||pSet->bTT_mxTfz; //非分支或分支线且母线故障跳分支未投入
  1218. bY2=(BH_GOOSE_EN(sw))
  1219. &&bfztz
  1220. &&bY1 // 邻域有故障产生
  1221. &&poc->bslowEn //缓动型,需无压无流,速动自动满足
  1222. && pR->tSWST.uSWST.bFlag.bHZWZ //在合闸位置
  1223. &&pR->tgoc.tglcd.sta.bFlag.bCD; //充电完成,无放电条件
  1224. RunTR(&poc->tgoose15ms_gzgl, bY2, dStep); // 电流启动 15ms后,goose 判断有效
  1225. bGoose=fag_goosecheck_gzgl(sw)
  1226. &&poc->tgoose15ms_gzgl.boolTrip
  1227. &&(tFAg.commerr==0); // 故障隔离,通信正常时处理,异常,靠失压跳闸
  1228. if(poc->tgoose15ms_gzgl.boolTrip&&!poc->sta.bFlag.bgzglQD) //goose 判断时间到,若条件不满足,放电,防止邻域开关故障撤销后,由于发送间隔问题,goose条件又满足导致误动
  1229. {
  1230. if(!bGoose) //外部条件不满足
  1231. {
  1232. pR->tgoc.tglcd.sta.bFlag.bCD=false;
  1233. ResetTR(&poc->tglcd.tCDTime);
  1234. }
  1235. }
  1236. #ifdef GD_AREA_ZHONGSHAN_2020 // 中山要求,动作后,通信异常不起作用,继续动作
  1237. poc->sta.bFlag.bgzglQD=((bGoose&&bY2)||poc->sta.bFlag.bgzglQD)&&bWY1&&bWY2; //故障隔离启动, 增加无压条件
  1238. #else
  1239. poc->sta.bFlag.bgzglQD=((bGoose&&bY2)||poc->sta.bFlag.bgzglQD)&&pR->tgoc.tglcd.sta.bFlag.bCD&&bWY1&&bWY2; //故障隔离启动, 增加无压条件
  1240. #endif
  1241. RunTR(&poc->tgzglTime,poc->sta.bFlag.bgzglQD, dStep); // 故障隔离时间到,出口
  1242. poc->sta.bFlag.bgzglTz=poc->tgzglTime.boolTrip; //故障隔离启动
  1243. if(poc->sta.bFlag.bgzglTz)
  1244. {
  1245. if(soe_check(EV_GOOSE_GL_QD+sw*EV_SW_NUM)==false) // 故障隔离启动
  1246. {
  1247. soe_record_ev( EV_GOOSE_GL_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1248. }
  1249. poc->bgzglTzLed=true;
  1250. poc->sta.bFlag.bgzglTzH=true;
  1251. poc->sta.bFlag.bgzglQD=false;
  1252. poc->bgooseGz=true;
  1253. }
  1254. }
  1255. void fag_lostvol_sd(int sw,DWORD dStep) // 首端开关失压跳闸
  1256. {
  1257. TRELAY_T *pR=&g_tRelay[sw];
  1258. TGOC_T*poc = &pR->tgoc;
  1259. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1260. bool bWY1, bWY2,bEnble;
  1261. /***********启动 **********************************/
  1262. bWY1 = LowRelay(g_sw_pub.m2_max[2], pRunSet->tSwSet[sw].dU_fa_WY,pRunSet->tSwSet[sw].dU_fa_WY_fh, poc->sta.bFlag.bsdQD); //无压
  1263. bWY2 = LowRelay(g_sw_pub.m2_max[3], pRunSet->tSwSet[sw].dU_fa_WY,pRunSet->tSwSet[sw].dU_fa_WY_fh, poc->sta.bFlag.bsdQD);
  1264. #ifdef GD_AREA_ZHONGSHAN_2020 // 中山要求,动作后,通信异常不起作用,继续动作
  1265. bEnble=(pSet->bTT_sdlost&&pSet->bsw_sd) ; //首端开关,失压投退投入,无通信异常
  1266. poc->sta.bFlag.bsdQD = bEnble
  1267. && (BH_GOOSE_EN_YB(sw))
  1268. &&(tFAg.bComErr==0||poc->sta.bFlag.bsdQD)
  1269. && pR->tgoc.psta.bFlag.bCYY // 曾有压
  1270. && pR->tSWST.uSWST.bFlag.bHZWZ //在合闸位置
  1271. && pR->tSWST.uSWST.bFlag.bSXWL //三相无流;
  1272. &&(poc->tqccd.sta.bFlag.bCD||poc->sta.bFlag.bsdQD)
  1273. && bWY1
  1274. && bWY2;
  1275. #else
  1276. bEnble=(pSet->bTT_sdlost&&pSet->bsw_sd&&(tFAg.commerr==0)) ; //首端开关,失压投退投入,无通信异常
  1277. poc->sta.bFlag.bsdQD = bEnble
  1278. && (BH_GOOSE_EN(sw))
  1279. && pR->tgoc.psta.bFlag.bCYY // 曾有压
  1280. && pR->tSWST.uSWST.bFlag.bHZWZ //在合闸位置
  1281. && pR->tSWST.uSWST.bFlag.bSXWL //三相无流;
  1282. &&poc->tqccd.sta.bFlag.bCD
  1283. && bWY1
  1284. && bWY2;
  1285. #endif
  1286. /***********失压分闸*********************************/
  1287. RunTR(&poc->tsdlostTime, poc->sta.bFlag.bsdQD, dStep);
  1288. poc->sta.bFlag.bsdTz = poc->tsdlostTime.boolTrip;
  1289. if(poc->sta.bFlag.bsdTz) //启动信息
  1290. {
  1291. if(soe_check(EV_GOOSE_SDLOST_TZ+sw*EV_SW_NUM)==false) // 故障隔离启动
  1292. {
  1293. soe_record_ev( EV_GOOSE_SDLOST_TZ+sw*EV_SW_NUM,1, 0,0,0 );
  1294. }
  1295. if(soe_check(EV_GOOSE_GL_QD+sw*EV_SW_NUM)==false) // 故障隔离启动
  1296. {
  1297. soe_record_ev( EV_GOOSE_GL_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1298. }
  1299. poc->bsdTzLed=true;
  1300. poc->sta.bFlag.bsdTzH=true;
  1301. pR->tgoc.psta.bFlag.bCYY =false;
  1302. poc->bgooseGz=true;
  1303. ResetTR(&pR->tgoc.tCYY3sdelayms);
  1304. }
  1305. else
  1306. {
  1307. if(soe_check(EV_GOOSE_SDLOST_TZ+sw*EV_SW_NUM)==true) // 故障隔离启动
  1308. {
  1309. soe_record_ev( EV_GOOSE_SDLOST_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1310. }
  1311. }
  1312. }
  1313. void fag_lostvol_commer(int sw,DWORD dStep) // 通信异常失压跳闸
  1314. {
  1315. TRELAY_T *pR=&g_tRelay[sw];
  1316. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1317. TGOC_T*poc = &pR->tgoc;
  1318. bool bWY1, bWY2,bEnble;
  1319. bool bfztz;
  1320. /***********启动 **********************************/
  1321. bWY1 = LowRelay(g_sw_pub.m2_max[2], pRunSet->tSwSet[sw].dU_fa_WY,pRunSet->tSwSet[sw].dU_fa_WY_fh, poc->sta.bFlag.berrQD); //无压
  1322. bWY2 = LowRelay(g_sw_pub.m2_max[3], pRunSet->tSwSet[sw].dU_fa_WY,pRunSet->tSwSet[sw].dU_fa_WY_fh, poc->sta.bFlag.berrQD);
  1323. bEnble=(tFAg.commerr>0) ; //通信异常,失压跳闸
  1324. bfztz=(!pSet->bsw_fz)||pSet->bTT_mxTfz; //非分支或分支线且母线故障跳分支未投入
  1325. poc->sta.bFlag.berrQD = bEnble
  1326. &&bfztz
  1327. && (BH_GOOSE_EN(sw))
  1328. && pR->tgoc.psta.bFlag.bCYY // 曾有压
  1329. && pR->tSWST.uSWST.bFlag.bHZWZ //在合闸位置
  1330. && pR->tSWST.uSWST.bFlag.bSXWL //三相无流;
  1331. && bWY1
  1332. && bWY2;
  1333. /***********失压分闸*********************************/
  1334. RunTR(&poc->terrlostTime, poc->sta.bFlag.berrQD, dStep);
  1335. poc->sta.bFlag.berrTz = poc->terrlostTime.boolTrip;
  1336. if(poc->sta.bFlag.berrTz) //启动信息
  1337. {
  1338. if(soe_check(EV_GOOSE_ERRLOST_TZ+sw*EV_SW_NUM)==false) //失压跳闸
  1339. {
  1340. soe_record_ev( EV_GOOSE_ERRLOST_TZ+sw*EV_SW_NUM,1, 0,0,0 );
  1341. }
  1342. if(soe_check(EV_GOOSE_GL_QD+sw*EV_SW_NUM)==false) // 故障隔离启动
  1343. {
  1344. soe_record_ev( EV_GOOSE_GL_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1345. }
  1346. poc->berrTzLed=true;
  1347. poc->sta.bFlag.berrTzH=true;
  1348. pR->tgoc.psta.bFlag.bCYY =false;
  1349. poc->bgooseGz=true;
  1350. ResetTR(&pR->tgoc.tCYY3sdelayms);
  1351. }
  1352. else
  1353. {
  1354. if(soe_check(EV_GOOSE_ERRLOST_TZ+sw*EV_SW_NUM)==true) //失压跳闸
  1355. {
  1356. soe_record_ev( EV_GOOSE_ERRLOST_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1357. }
  1358. }
  1359. }
  1360. void fag_exttz(int sw,DWORD dStep) // 下级开关跳闸失败,本级开关跳闸
  1361. {
  1362. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  1363. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1364. UGOOSE_STU *pg;
  1365. bool btzsb=false;
  1366. bool bfztz;
  1367. int i;
  1368. bool bgzgl;
  1369. for(i=0;i<GOOSE_EQU_MAX;i++)
  1370. {
  1371. pg=&tFAg.ugside[i];
  1372. btzsb|=(pg->bFlag.btzsb); // 相邻开关有跳闸失败
  1373. }
  1374. bgzgl=fag_goosecheck_gzgl(sw)&&(!pSet->bsw_sd)&&(!pSet->bsw_fz);
  1375. bfztz=(!pSet->bsw_fz)||pSet->bTT_mxTfz; //非分支或分支线且母线故障跳分支未投入
  1376. RunTR(&poc->textbsTime,btzsb&&bgzgl, dStep); // 缓动型,跳闸信息自动延长
  1377. poc->sta.bFlag.bextQD=btzsb //相邻线路有开关跳闸失败
  1378. &&!poc->textbsTime.boolTrip
  1379. &&(tFAg.commerr==0) //通信正常
  1380. &&bfztz
  1381. &&(BH_GOOSE_EN(sw))
  1382. &&g_tRelay[ sw].tSWST.uSWST.bFlag.bHZWZ
  1383. &&poc->bslowEn //缓动 无压无流 速动,自动满足
  1384. &&!poc->psta.bFlag.btzsb;
  1385. poc->sta.bFlag.bextTz=poc->sta.bFlag.bextQD;
  1386. if(poc->sta.bFlag.bextTz)
  1387. {
  1388. if(soe_check(EV_GOOSE_EXT_TZ+sw*EV_SW_NUM)==false) //保护总
  1389. {
  1390. soe_record_ev( EV_GOOSE_EXT_TZ+sw*EV_SW_NUM,1, 0,0,0 );
  1391. #ifdef GD_AREA_ZHONGSHAN_2020
  1392. g_tRelay[i].run_stu.fgbs=1;//该SOE返回太快,需直接赋值
  1393. #endif
  1394. }
  1395. poc->sta.bFlag.bextTzH=true;
  1396. poc->bgooseGz=true;
  1397. }
  1398. else
  1399. {
  1400. if(soe_check(EV_GOOSE_EXT_TZ+sw*EV_SW_NUM)==true) //保护总
  1401. {
  1402. soe_record_ev( EV_GOOSE_EXT_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1403. }
  1404. }
  1405. }
  1406. // 两侧有压,开关在分位,确认联络开关有效,
  1407. //单侧失压后,判合闸条件,条件满足,合联络开关,恢复供电,重新确认联络开关位置
  1408. void fag_ll(int sw,DWORD dStep) // 联络开关逻辑处理
  1409. {
  1410. TRELAY_T *pR=&g_tRelay[sw];
  1411. TSETSW *pSet = &pRunSet->tSwSet[sw];
  1412. TGOC_T*poc = &pR->tgoc;
  1413. bool bY1,bQD;
  1414. bool bWY1,bWY2;
  1415. bool bYY1,bYY2,bllYY;
  1416. bool bLstQD=false;
  1417. //有压检测
  1418. bWY1 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_fa_WY,pSet->dU_fa_WY_fh, poc->psta.bFlag.bllWY1); //无压
  1419. bWY2 = LowRelay(g_sw_pub.m2_max[3], pSet->dU_fa_WY,pSet->dU_fa_WY_fh, poc->psta.bFlag.bllWY2);
  1420. bYY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_fa_YY,pSet->dU_fa_YY_fh, poc->psta.bFlag.bYY1); // 有压
  1421. bYY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_fa_YY,pSet->dU_fa_YY_fh, poc->psta.bFlag.bYY2);
  1422. RunTR(&poc->tllWY1Time,bWY1, dStep);
  1423. RunTR(&poc->tllWY2Time,bWY2, dStep);
  1424. RunTR(&poc->tllYY1Time,bYY1, dStep);
  1425. RunTR(&poc->tllYY2Time,bYY2, dStep);
  1426. poc->psta.bFlag.bllWY1 = poc->tllWY1Time.boolTrip;
  1427. poc->psta.bFlag.bllWY2 = poc->tllWY2Time.boolTrip;
  1428. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定,并且单侧失压后报联络合闸失败
  1429. bLstQD =pSet->tGocSet.bTT_ll//联络开关投入
  1430. &&(BH_GOOSE_EN(sw)) //智能分布式已投入
  1431. #ifdef GD_AREA_ZHONGSHAN
  1432. &&pSet->tGocSet.bsw_ll
  1433. #endif
  1434. &&(poc->psta.bFlag.bllWY1^poc->psta.bFlag.bllWY2) //单侧失压
  1435. &&pR->tSWST.uSWST.bFlag.bTZWZ; // 开关跳位
  1436. #endif
  1437. bllYY=poc->tllYY1Time.boolTrip&&poc->tllYY2Time.boolTrip;
  1438. poc->sta.bFlag.bllWY_1=((bLstQD&&bllYY)||poc->sta.bFlag.bllWY_1)&&bLstQD;
  1439. RunTR(&poc->tllQdTime,poc->sta.bFlag.bllWY_1, dStep); // 双侧有压后,又单侧失压,超过联络合闸时间,报联络合闸不满足
  1440. bQD =pSet->tGocSet.bTT_ll//联络开关投入
  1441. #ifdef GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定
  1442. &&(poc->tllcd.sta.bFlag.bCD||poc->sta.bFlag.bllQD) //联络开关充电完成
  1443. //&&pSet->tGocSet.bsw_ll
  1444. &&(BH_GOOSE_EN_YB(sw)) //智能分布式已投入
  1445. &&(tFAg.bComErr==0||poc->sta.bFlag.bllQD) // 联络启动后,自保持,通信异常不退出动作逻辑
  1446. #else
  1447. &&poc->tllcd.sta.bFlag.bCD //联络开关充电完成
  1448. &&(BH_GOOSE_EN(sw)) //智能分布式已投入
  1449. #endif
  1450. &&(poc->psta.bFlag.bllWY1^poc->psta.bFlag.bllWY2) //单侧失压
  1451. &&pR->tSWST.uSWST.bFlag.bTZWZ; // 开关跳位
  1452. RunTR(&poc->tgoosedelayms_ll, bQD, dStep); // 联络失压后启动
  1453. bY1= bQD // 单侧失压,联络启动条件满足
  1454. &&(!poc->tgoosedelayms_ll.boolTrip) //在失压后300ms内
  1455. &&!poc->b_side_gz //领域无故障
  1456. &&fag_goosecheck_ll(sw) ; //收到故障隔离信号
  1457. poc->sta.bFlag.bllQD=(bY1||poc->sta.bFlag.bllQD)&&bQD && !poc->b_side_tzsb ; // 联络启动后,自保持
  1458. RunTR(&poc->tllhzTime,poc->sta.bFlag.bllQD, dStep); // Y确认时间后,失压可合闸
  1459. poc->sta.bFlag.bllhz=poc->tllhzTime.boolTrip;
  1460. if(poc->sta.bFlag.bllhz) //启动信息
  1461. {
  1462. if(soe_check(EV_GOOSE_HZ_QD+sw*EV_SW_NUM)==false) // 联络合闸启动
  1463. {
  1464. soe_record_ev( EV_GOOSE_HZ_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1465. }
  1466. sw_do(sw,SW_DO_HZ,SW_DO_TYPE_ON);
  1467. sw_do(sw,SW_DO_BHH,SW_DO_TYPE_ON);
  1468. poc->sta.bFlag.bllhzH=true;
  1469. ResetTR(&poc->tllQdTime);
  1470. poc->sta.bFlag.bllWY_1=false;
  1471. }
  1472. else
  1473. {
  1474. if(soe_check(EV_GOOSE_HZ_QD+sw*EV_SW_NUM)==true) // 联络合闸启动返回
  1475. {
  1476. soe_record_ev( EV_GOOSE_HZ_QD+sw*EV_SW_NUM,0, 0,0,0 );
  1477. }
  1478. }
  1479. if(poc->tllQdTime.boolTrip) //联络失压后合闸不满足
  1480. {
  1481. if(soe_check(EV_GOOSE_LL_UNOK+sw*EV_SW_NUM)==false) //
  1482. {
  1483. soe_record_ev( EV_GOOSE_LL_UNOK+sw*EV_SW_NUM,1, 0,0,0 );
  1484. }
  1485. ResetTR(&poc->tllQdTime);
  1486. ResetTR(&poc->tllcd.tCDTime);
  1487. poc->sta.bFlag.bllWY_1=false;
  1488. poc->tllcd.sta.bFlag.bCD=false;
  1489. }
  1490. if(poc->tllcd.sta.bFlag.bCD||pR->tSWST.uSWST.bFlag.bHZWZ)
  1491. {
  1492. if(soe_check(EV_GOOSE_LL_UNOK+sw*EV_SW_NUM)==true) //
  1493. {
  1494. soe_record_ev( EV_GOOSE_LL_UNOK+sw*EV_SW_NUM,0, 0,0,0 );
  1495. }
  1496. }
  1497. RunTR(&poc->tHzcheckTime, poc->sta.bFlag.bllhzH, dStep); //
  1498. if(poc->tHzcheckTime.boolTrip) //跳闸失败时间到,清标志,报soe
  1499. {
  1500. if(pR->tSWST.uSWST.bFlag.bTZWZ) //合闸闸失败
  1501. {
  1502. if(soe_check(EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM)==false) //
  1503. {
  1504. soe_record_ev( EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM,1, 0,0,0 ); // 联络合闸失败
  1505. }
  1506. }
  1507. else //跳闸成功
  1508. {
  1509. if(soe_check(EV_GOOSE_HZ_OK+sw*EV_SW_NUM)==false) //联络合闸成功
  1510. {
  1511. soe_record_ev( EV_GOOSE_HZ_OK+sw*EV_SW_NUM,1, 0,0,0 );
  1512. }
  1513. }
  1514. poc->sta.bFlag.bllhzH=false;
  1515. }
  1516. }
  1517. #ifdef GD_AREA_ZHONGSHAN_2020
  1518. void fag_oc_acc(int sw,u32 dStep) // 分布式合闸加速跳闸
  1519. {
  1520. bool bQDD;
  1521. bool bJS3,bJS4,bJS5;
  1522. bool bY1,bY2;
  1523. int ui_begin;
  1524. int oc;
  1525. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1526. for(oc=FAG_GL1;oc<FAG_BHNUMBER;oc++)
  1527. {
  1528. TOC_T *poc = &g_tRelay[sw].tgoc.tOc[oc];
  1529. OC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet.tOc[oc];
  1530. u16 soeno=EV_GOOSE_HZ_GL1+oc+sw*EV_SW_NUM;
  1531. bool bgloc=(oc==FAG_LX)?false:true;
  1532. bool bxbbs=false;
  1533. // 电流启动
  1534. if(bgloc)
  1535. {
  1536. bool bxb;
  1537. DWORD xbcoe; // 谐波系数
  1538. bxb=pRunSet->tSwSet[sw].bTT_goose_xbbs;
  1539. xbcoe=pRunSet->tSwSet[sw].d_goose_xbcoe;
  1540. poc->sta.bFlag.bIaQD = OverRelay(g_ui[ui_begin+SW_AC_IA].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIaQD);
  1541. poc->sta.bFlag.bIbQD = OverRelay(g_ui[ui_begin+SW_AC_IB].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIbQD);
  1542. poc->sta.bFlag.bIcQD = OverRelay(g_ui[ui_begin+SW_AC_IC].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIcQD);
  1543. poc->sta.bFlag.bIaxb =bxb&&XBCalc(sw,SW_AC_IA,xbcoe,poc->sta.bFlag.bIaQD);
  1544. poc->sta.bFlag.bIbxb=bxb&&XBCalc(sw,SW_AC_IB,xbcoe,poc->sta.bFlag.bIbQD);
  1545. poc->sta.bFlag.bIcxb=bxb&&XBCalc(sw,SW_AC_IC,xbcoe,poc->sta.bFlag.bIcQD);
  1546. bQDD=poc->sta.bFlag.bIaQD||poc->sta.bFlag.bIbQD||poc->sta.bFlag.bIcQD;
  1547. bxbbs=poc->sta.bFlag.bIaxb||poc->sta.bFlag.bIbxb||poc->sta.bFlag.bIcxb; //谐波闭锁
  1548. }
  1549. else //零序加速
  1550. {
  1551. // 零序电流过量继电器
  1552. bY1 = OverRelay(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
  1553. bY2=true;
  1554. bQDD=bY1&& ((bY2&&pRunSet->bTT_U0BS)||(!pRunSet->bTT_U0BS));
  1555. bxbbs=false;
  1556. }
  1557. // 检查合闸加速标
  1558. bJS3 = g_tRelay[sw].tSWST.uSWST.bFlag.bSHJS; // 手合加速标
  1559. poc->sta.bFlag.bQD = (BH_GOOSE_EN_YB(sw))
  1560. &&(!pRunSet->tSwSet[sw].tGocSet.bsw_fz)
  1561. && bQDD
  1562. && (!bxbbs);//谐波闭锁
  1563. // 加速标保持
  1564. bJS4 = bJS3 || poc->sta.bFlag.bJSBC;
  1565. // 后加速启动条件满足
  1566. bJS5 = poc->sta.bFlag.bQD&& bJS4;
  1567. // 合闸加速标保持
  1568. poc->sta.bFlag.bJSBC = bJS5 && bJS4;
  1569. if(bJS5) //幅值启动
  1570. {
  1571. if(!poc->sta.bFlag.bQDWave)
  1572. {
  1573. if(bgloc)
  1574. {
  1575. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  1576. }
  1577. else
  1578. {
  1579. rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD); //录波类型:跳闸类
  1580. }
  1581. poc->sta.bFlag.bQDWave=true;
  1582. }
  1583. }
  1584. else
  1585. {
  1586. poc->sta.bFlag.bQDWave=true;
  1587. }
  1588. RunTR(&poc->tQDTime, bJS5, dStep);
  1589. RunTR(&poc->tQD25ms, bJS5, dStep);
  1590. // 如果加速时间到,启动时间未到,调用幅值启动加速模块
  1591. if(poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip)
  1592. {
  1593. if(bgloc)
  1594. {
  1595. if(protect_amp_qd_js(sw))
  1596. {
  1597. // 预置25ms,让下个循环再出口
  1598. PreSetTime(&poc->tQD25ms, T_25ms);
  1599. }
  1600. }
  1601. else
  1602. {
  1603. if(protect_amp_lx_js(sw))
  1604. {
  1605. // 预置25ms,让下个循环再出口
  1606. PreSetTime(&poc->tQD25ms, T_25ms);
  1607. }
  1608. }
  1609. }
  1610. poc->sta.bFlag.bTz=poc->tQDTime.boolTrip && poc->tQD25ms.boolTrip;
  1611. // 出口记录及出口
  1612. if(poc->sta.bFlag.bTz)
  1613. {
  1614. if(bgloc)
  1615. {
  1616. int ui_begin;
  1617. DWORD Ia,Ib,Ic;
  1618. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1619. 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);
  1620. 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);
  1621. 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);
  1622. if(soe_check(soeno)==false) //过流跳闸
  1623. {
  1624. soe_record_ev( soeno,1, Ia,Ib,Ic );
  1625. poc->sta.bFlag.bDzLed = true;
  1626. g_tRelay[sw].tgoc.bgooseGz=true;
  1627. }
  1628. }
  1629. else // 零序加速
  1630. {
  1631. // 出口记录及出口
  1632. if(poc->sta.bFlag.bTz)
  1633. {
  1634. int ui_begin;
  1635. DWORD I0;
  1636. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1637. 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);
  1638. if(soe_check(soeno)==false) //零序跳闸
  1639. {
  1640. soe_record_ev( soeno,1, I0,0,0 );
  1641. poc->sta.bFlag.bDzLed = true;
  1642. g_tRelay[sw].tgoc.bgooseGz=true;
  1643. }
  1644. if(soe_check(soeno)==false) // 故障切除启动
  1645. {
  1646. soe_record_ev( soeno,1, 0,0,0 );
  1647. }
  1648. }
  1649. }
  1650. }
  1651. else
  1652. {
  1653. if(soe_check(soeno)==true) // 过流跳闸
  1654. {
  1655. soe_record_ev( soeno,0, 0,0,0 );
  1656. }
  1657. }
  1658. }
  1659. }
  1660. #endif
  1661. void fag_kc(int sw,DWORD dStep) //goose开出
  1662. {
  1663. TRELAY_T *pR=&g_tRelay[sw];
  1664. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  1665. bool bTz;
  1666. bool bCur;
  1667. bool bgzglok=false;
  1668. bool btzsb=false;
  1669. bTz=poc->sta.bFlag.bglTzH
  1670. ||poc->sta.bFlag.blxTzH
  1671. ||poc->sta.bFlag.bgzglTzH
  1672. ||poc->sta.bFlag.bsdTzH
  1673. ||poc->sta.bFlag.bextTzH
  1674. ||poc->sta.bFlag.berrTzH;
  1675. // 有跳闸信号时,可由大电流闭锁不动作,
  1676. // 无闭锁时,需保证一次动作信号仅一次出口
  1677. if(bTz&&!pR->bBSTZ&&!poc->bTzout)
  1678. {
  1679. sw_do(sw,SW_DO_HZ,SW_DO_TYPE_OFF);
  1680. sw_do(sw,SW_DO_BHH,SW_DO_TYPE_OFF);
  1681. sw_do(sw,SW_DO_BHDZ,SW_DO_TYPE_ON);
  1682. sw_do(sw,SW_DO_FZ,SW_DO_TYPE_ON);
  1683. sw_do(sw,SW_DO_BHT,SW_DO_TYPE_ON);
  1684. poc->bTzout=true;
  1685. }
  1686. // 跳闸失败检查: 跳闸后持续有流或合位
  1687. bCur = ((!pR->tSWST.uSWST.bFlag.bSXWL) || pR->tSWST.uSWST.bFlag.bHZWZ);
  1688. RunTR(&poc->tTzcheckTime, bTz, dStep); //
  1689. if(poc->tTzcheckTime.boolTrip) //跳闸失败时间到,清标志,报soe
  1690. {
  1691. if(bCur) //跳闸失败
  1692. {
  1693. bTz=poc->sta.bFlag.bglTzH
  1694. ||poc->sta.bFlag.blxTzH
  1695. ||poc->sta.bFlag.bgzglTzH
  1696. ||poc->sta.bFlag.bsdTzH
  1697. ||poc->sta.bFlag.berrTzH;
  1698. if(poc->sta.bFlag.bglTzH||poc->sta.bFlag.blxTzH||poc->psta.bFlag.bGZ) //故障切除
  1699. {
  1700. if(soe_check(EV_GOOSE_QC_FAIL+sw*EV_SW_NUM)==false)
  1701. {
  1702. soe_record_ev( EV_GOOSE_QC_FAIL+sw*EV_SW_NUM,1, 0,0,0 ); // 故障切除失败
  1703. }
  1704. }
  1705. else
  1706. {
  1707. if(soe_check(EV_GOOSE_GL_FAIL+sw*EV_SW_NUM)==false) //
  1708. {
  1709. soe_record_ev( EV_GOOSE_GL_FAIL+sw*EV_SW_NUM,1, 0,0,0 ); //故障隔离失败
  1710. }
  1711. }
  1712. if(bTz) btzsb=true; //开关失灵引起的跳闸失败,不再发送
  1713. }
  1714. else //跳闸成功
  1715. {
  1716. if(poc->sta.bFlag.bglTzH||poc->sta.bFlag.blxTzH||poc->psta.bFlag.bGZ)
  1717. {
  1718. if(soe_check(EV_GOOSE_QC_OK+sw*EV_SW_NUM)==false) // 故障切除
  1719. {
  1720. soe_record_ev( EV_GOOSE_QC_OK+sw*EV_SW_NUM,1, 0,0,0 );
  1721. }
  1722. }
  1723. else
  1724. {
  1725. if(soe_check(EV_GOOSE_GL_OK+sw*EV_SW_NUM)==false) // 故障隔离成功
  1726. {
  1727. soe_record_ev( EV_GOOSE_GL_OK+sw*EV_SW_NUM,1, 0,0,0 );
  1728. }
  1729. bgzglok=true&&(!pRunSet->tSwSet[sw].tGocSet.bsw_fz); //分支开关不发送故障隔离成功信号
  1730. }
  1731. }
  1732. poc->bTzout=false;
  1733. poc->sta.bFlag.bglTzH=false;
  1734. poc->sta.bFlag.blxTzH=false;
  1735. poc->sta.bFlag.bgzglTzH=false;
  1736. poc->sta.bFlag.bsdTzH=false;
  1737. poc->sta.bFlag.bextTzH=false;
  1738. poc->sta.bFlag.berrTzH=false;
  1739. ResetTR(&poc->tTzcheckTime);
  1740. }
  1741. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定
  1742. btzsb|=(pR->uBHDZ.bFlag.bTZSB&&pRunSet->tSwSet[sw].tGocSet.bsw_fz); //分支开关动作逻辑在常规保护中处理
  1743. #endif
  1744. RunTR(&poc->tgzglokextTime, bgzglok, dStep); //故障隔离成功发送
  1745. poc->psta.bFlag.bgzglok=poc->tgzglokextTime.boolTrip;
  1746. RunTR(&poc->ttzsbextTime, btzsb, dStep); //跳闸失败发送展宽时间
  1747. poc->psta.bFlag.btzsb=poc->ttzsbextTime.boolTrip;
  1748. RunTR(&poc->tgzglokForbitTime, poc->psta.bFlag.bgzglok, dStep); //故障隔离发送闭锁
  1749. }
  1750. void fag_bh(int sw,DWORD dStep)
  1751. {
  1752. tFAg.bComErr=(tFAg.commerr>0||tFAg.syscomerr>0)?true:false; // goose 通信异常 本机和系统通信异常
  1753. GOC_dir_check(sw,dStep);
  1754. fag_cd(sw,dStep); //
  1755. fag_gzgl(sw,dStep); //
  1756. fag_lostvol_sd(sw,dStep); //
  1757. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山地区,不需要通信失压分闸
  1758. #else
  1759. fag_lostvol_commer(sw,dStep); //
  1760. #endif
  1761. fag_exttz(sw,dStep); //
  1762. fag_ll(sw,dStep); //
  1763. fag_kc(sw,dStep); //
  1764. fa_g_commcheck(dStep); // goose信息延时复归
  1765. }
  1766. bool _XB2_Logic_Relay(int sw, DWORD I, DWORD Ixb2, DWORD XBcoe,DWORD Iset)
  1767. {
  1768. if(( I > Iset) && ( Ixb2 > pRunSet->dIWL_SQR[sw] )) // I 与 Ixb2 均应大于无流定值
  1769. {
  1770. if( Ixb2 > _MulFac_U(I, XBcoe ))
  1771. {
  1772. return(true);
  1773. }
  1774. else
  1775. {
  1776. return(false);
  1777. }
  1778. }
  1779. else
  1780. {
  1781. return(false);
  1782. }
  1783. return 0;
  1784. }
  1785. /******************************************************************************
  1786. 函数名称: XBCalc
  1787. 函数版本: 01.01
  1788. 创建作者: xxxxxx
  1789. 创建日期: 2014-12-16
  1790. 函数说明: 谐波计算
  1791. 参数说明:
  1792. 返回值: 无
  1793. 修改记录:
  1794. */
  1795. void XBCalc_goc(int sw)
  1796. {
  1797. bool bH1,bH2,bH3;
  1798. bool bxbbs=false;
  1799. bool bxbbs2=false;
  1800. if(!BH_GOOSE_EN(sw))return;
  1801. if(pRunSet->tSwSet[sw].bTT_goose_xbbs)
  1802. {
  1803. bH1 = _XB2_Logic_Relay(sw, g_ui[UI_SW_INDEX(sw,SW_AC_IA)].m2[0], g_ui[UI_SW_INDEX(sw,SW_AC_IA)].m2[1], pRunSet->tSwSet[sw].d_goose_xbcoe,pRunSet->tSwSet[sw].tGocSet.dIgl);//A相谐波闭锁
  1804. bH2 = _XB2_Logic_Relay(sw, g_ui[UI_SW_INDEX(sw,SW_AC_IB)].m2[0], g_ui[UI_SW_INDEX(sw,SW_AC_IB)].m2[1], pRunSet->tSwSet[sw].d_goose_xbcoe,pRunSet->tSwSet[sw].tGocSet.dIgl);//B相谐波闭锁
  1805. bH3 = _XB2_Logic_Relay(sw, g_ui[UI_SW_INDEX(sw,SW_AC_IC)].m2[0], g_ui[UI_SW_INDEX(sw,SW_AC_IC)].m2[1], pRunSet->tSwSet[sw].d_goose_xbcoe,pRunSet->tSwSet[sw].tGocSet.dIgl);//C相谐波闭锁
  1806. bxbbs=(bH1 || bH2 || bH3);
  1807. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  1808. bH1 = _XB2_Logic_Relay(sw, g_ui[UI_SW_INDEX(sw,SW_AC_IA)].m2[0], g_ui[UI_SW_INDEX(sw,SW_AC_IA)].m2[1], pRunSet->tSwSet[sw].d_goose_xbcoe,pRunSet->tSwSet[sw].tGocSet.dIgl2);//A相谐波闭锁
  1809. bH2 = _XB2_Logic_Relay(sw, g_ui[UI_SW_INDEX(sw,SW_AC_IB)].m2[0], g_ui[UI_SW_INDEX(sw,SW_AC_IB)].m2[1], pRunSet->tSwSet[sw].d_goose_xbcoe,pRunSet->tSwSet[sw].tGocSet.dIgl2);//B相谐波闭锁
  1810. bH3 = _XB2_Logic_Relay(sw, g_ui[UI_SW_INDEX(sw,SW_AC_IC)].m2[0], g_ui[UI_SW_INDEX(sw,SW_AC_IC)].m2[1], pRunSet->tSwSet[sw].d_goose_xbcoe,pRunSet->tSwSet[sw].tGocSet.dIgl2);//C相谐波闭锁
  1811. bxbbs2=(bH1 || bH2 || bH3);
  1812. #endif
  1813. }
  1814. g_tRelay[sw].tgoc.sta.bFlag.bXBbs =bxbbs;
  1815. g_tRelay[sw].tgoc.sta.bFlag.bXBbs2 =bxbbs2;
  1816. if(bxbbs||bxbbs2)
  1817. {
  1818. if(soe_check(EV_XBBS+sw*EV_SW_NUM)==false)
  1819. {
  1820. soe_record_ev(EV_XBBS+sw*EV_SW_NUM,1, 0,0,0 );
  1821. }
  1822. }
  1823. else
  1824. {
  1825. if(soe_check(EV_XBBS+sw*EV_SW_NUM)==true)
  1826. {
  1827. soe_record_ev( EV_XBBS+sw*EV_SW_NUM,0, 0,0,0 );
  1828. }
  1829. }
  1830. }
  1831. /***************************************endfile**********************************************************/