FA_g.c 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028
  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 || defined GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定
  970. #if defined GD_AREA_ZHONGSHAN //中山要求联络开关固定
  971. ||!pSet->tGocSet.bsw_ll
  972. #endif
  973. ||pcd->tWYTime.boolTrip // 两侧无压超过15秒
  974. ||poc->b_side_gz //领域故障
  975. ||pR->tgoc.b_side_tzsb//领域拒动
  976. //||!g_run_stu.yf //KK把手非远方
  977. ||poc->sta.bFlag.bllhz; //本开关联络动作
  978. bQD=(BH_GOOSE_EN(sw)) //充电条件:保护投入
  979. &&(poc->psta.bFlag.bYY1&&poc->psta.bFlag.bYY2) //两侧有压
  980. && pR->tSWST.uSWST.bFlag.bTZWZ // 开关跳位
  981. &&!pcd->sta.bFlag.bFD; //无放电
  982. RunTR(&pcd->tCDTime, bQD, dStep);
  983. pcd->sta.bFlag.bCD=(pcd->tCDTime.boolTrip||pcd->sta.bFlag.bCD) //充电完成,并自保持
  984. &&(!pcd->sta.bFlag.bFD); //无放电标志
  985. pR->run_stu.goose_ll_cd=pcd->sta.bFlag.bCD; //充电标志
  986. //缓动型无压无流判断
  987. poc->bslowEn=(!pSet->tGocSet.bFA_slow)
  988. ||(pSet->tGocSet.bFA_slow //缓动型
  989. &&poc->psta.bFlag.bWY1 //无压
  990. &&poc->psta.bFlag.bWY2
  991. &&pR->tSWST.uSWST.bFlag.bSXWL); //无流
  992. bY1=soe_check(EV_GOOSE_GZBS_FA)||soe_check(EV_GOOSE_TZBS_FA);
  993. RunTR(&poc->tTHz1s,pR->tSWST.uSWST.bFlag.bHZWZ&&bY1, dStep); //合闸后1秒,清动作标志
  994. if(poc->tTHz1s.boolTrip&&BH_GOOSE_EN(sw))
  995. {
  996. pR->tgoc.bgooseGz=false;
  997. pR->tgoc.bgooseBsHz=false;
  998. if(soe_check(EV_GOOSE_GZBS_FA)==true) // goose故障闭锁
  999. {
  1000. soe_record_ev(EV_GOOSE_GZBS_FA, 0, 0,0,0 );
  1001. }
  1002. if(soe_check(EV_GOOSE_TZBS_FA)==true) // goose故障闭锁
  1003. {
  1004. soe_record_ev(EV_GOOSE_TZBS_FA, 0, 0,0,0 );
  1005. }
  1006. }
  1007. }
  1008. void fag_oc_gl(int sw,u32 dStep)
  1009. {
  1010. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  1011. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1012. bool bgl,bGoose,bTz;
  1013. // 电流启动
  1014. bgl = OverRelay(g_sw[sw].m2_max, pSet->dIgl, pSet->dIgl_fh, poc->sta.bFlag.bglQD);
  1015. bGoose=(fag_goosecheck_gzqc(sw))||(tFAg.commerr>0); //goose判断满足要求,中山通信异常后,BH_GOOSE_EN 不满足要求,不会启动
  1016. poc->sta.bFlag.bglQD= (BH_GOOSE_EN(sw)
  1017. &&poc->tqccd.sta.bFlag.bCD //故障隔离充电完成
  1018. && (bgl)
  1019. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定
  1020. &&(!pSet->bsw_fz) // 中山局要求分支走常规保护逻辑
  1021. #endif
  1022. &&!poc->sta.bFlag.bXBbs); //谐波闭锁
  1023. if(poc->sta.bFlag.bglQD) //幅值启动
  1024. {
  1025. if(!poc->sta.bFlag.bglQDWave)
  1026. {
  1027. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  1028. poc->sta.bFlag.bglQDWave=true;
  1029. }
  1030. }
  1031. RunTR(&poc->tglQDTime, poc->sta.bFlag.bglQD, dStep);
  1032. RunTR(&poc->tglQD25ms, poc->sta.bFlag.bglQD, dStep);
  1033. // 如果速断时间到,启动时间未到,调用幅值启动加速模块
  1034. if(poc->sta.bFlag.bglQD&& poc->tglQDTime.boolTrip && !poc->tglQD25ms.boolTrip)
  1035. {
  1036. if(protect_amp_qd_js(sw))
  1037. {
  1038. // 预置25ms,让下个循环再出口
  1039. PreSetTime(&poc->tglQD25ms, T_25ms);
  1040. }
  1041. }
  1042. bTz = poc->tglQDTime.boolTrip&&bGoose // 电流启动
  1043. && poc->tglQD25ms.boolTrip; //启动后25ms
  1044. RunTR(&poc->tglslowTime,(bTz&&pSet->bFA_slow), dStep); // 缓动型,跳闸信息自动延长
  1045. poc->sta.bFlag.bglTz=(bTz&&(!pSet->bFA_slow))// 非缓动型,直接出口
  1046. ||(poc->bslowEn&&poc->tglslowTime.boolTrip);
  1047. if(poc->sta.bFlag.bglTz) //启动信息
  1048. {
  1049. int ui_begin;
  1050. DWORD Ia,Ib,Ic;
  1051. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1052. 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);
  1053. 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);
  1054. 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);
  1055. if(soe_check(EV_GOOSE_GL_TZ+sw*EV_SW_NUM)==false) //过流跳闸
  1056. {
  1057. soe_record_ev( EV_GOOSE_GL_TZ+sw*EV_SW_NUM,1, Ia,Ib,Ic );
  1058. poc->bglTzLed=true;
  1059. poc->sta.bFlag.bglTzH=true;
  1060. poc->bgooseGz=true;
  1061. }
  1062. if(soe_check(EV_GOOSE_QC_QD+sw*EV_SW_NUM)==false) // 故障隔离启动
  1063. {
  1064. soe_record_ev( EV_GOOSE_QC_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1065. }
  1066. }
  1067. else
  1068. {
  1069. if(soe_check(EV_GOOSE_GL_TZ+sw*EV_SW_NUM)==true) // 过流跳闸
  1070. {
  1071. soe_record_ev( EV_GOOSE_GL_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1072. }
  1073. }
  1074. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  1075. // 电流启动
  1076. bgl = OverRelay(g_sw[sw].m2_max, pSet->dIgl2, pSet->dIgl2_fh, poc->sta.bFlag.bgl2QD);
  1077. bGoose=(fag_goosecheck_gzqc(sw))||(tFAg.commerr>0); //goose判断满足要求,或通信异常
  1078. poc->sta.bFlag.bgl2QD= (BH_GOOSE_EN(sw)
  1079. &&poc->tqccd.sta.bFlag.bCD //故障隔离充电完成
  1080. && (bgl)
  1081. &&(!pSet->bsw_fz) // 中山局要求分支走常规保护逻辑
  1082. &&!poc->sta.bFlag.bXBbs2); //谐波闭锁
  1083. if(poc->sta.bFlag.bgl2QD) //幅值启动
  1084. {
  1085. if(!poc->sta.bFlag.bgl2QDWave)
  1086. {
  1087. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  1088. poc->sta.bFlag.bgl2QDWave=true;
  1089. }
  1090. }
  1091. RunTR(&poc->tgl2QDTime, poc->sta.bFlag.bgl2QD, dStep);
  1092. RunTR(&poc->tgl2QD25ms, poc->sta.bFlag.bgl2QD, dStep);
  1093. // 如果速断时间到,启动时间未到,调用幅值启动加速模块
  1094. if(poc->sta.bFlag.bgl2QD && poc->tgl2QDTime.boolTrip && !poc->tgl2QD25ms.boolTrip)
  1095. {
  1096. if(protect_amp_qd_js(sw))
  1097. {
  1098. // 预置25ms,让下个循环再出口
  1099. PreSetTime(&poc->tgl2QD25ms, T_25ms);
  1100. }
  1101. }
  1102. bTz = poc->tgl2QDTime.boolTrip&&bGoose // 电流启动
  1103. && poc->tgl2QD25ms.boolTrip; //启动后25ms
  1104. RunTR(&poc->tgl2slowTime,(bTz&&pSet->bFA_slow), dStep); // 缓动型,跳闸信息自动延长
  1105. poc->sta.bFlag.bgl2Tz=(bTz&&(!pSet->bFA_slow))// 非缓动型,直接出口
  1106. ||(poc->bslowEn&&poc->tgl2slowTime.boolTrip);
  1107. if(poc->sta.bFlag.bgl2Tz) //启动信息
  1108. {
  1109. int ui_begin;
  1110. DWORD Ia,Ib,Ic;
  1111. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1112. 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);
  1113. 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);
  1114. 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);
  1115. if(soe_check(EV_GOOSE_GL2_TZ+sw*EV_SW_NUM)==false) //过流跳闸
  1116. {
  1117. soe_record_ev( EV_GOOSE_GL2_TZ+sw*EV_SW_NUM,1, Ia,Ib,Ic );
  1118. poc->bglTzLed=true;
  1119. poc->sta.bFlag.bglTzH=true;
  1120. poc->bgooseGz=true;
  1121. }
  1122. if(soe_check(EV_GOOSE_QC_QD+sw*EV_SW_NUM)==false) // 故障隔离启动
  1123. {
  1124. soe_record_ev( EV_GOOSE_QC_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1125. }
  1126. }
  1127. else
  1128. {
  1129. if(soe_check(EV_GOOSE_GL2_TZ+sw*EV_SW_NUM)==true) // 过流跳闸
  1130. {
  1131. soe_record_ev( EV_GOOSE_GL2_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1132. }
  1133. }
  1134. #endif
  1135. }
  1136. void fag_oc_lx(int sw,u32 dStep)
  1137. {
  1138. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  1139. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1140. bool blx,bGoose,bTz;
  1141. // 电流启动
  1142. blx = OverRelay(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].m2[0], pSet->dIlx, pSet->dIlx_fh, poc->sta.bFlag.blxQD);
  1143. bGoose=(fag_goosecheck_gzqc(sw))||(tFAg.commerr>0); //goose判断满足要求,或通信异常
  1144. poc->sta.bFlag.blxQD = (BH_GOOSE_EN(sw)
  1145. &&poc->tqccd.sta.bFlag.bCD //故障隔离充电完成
  1146. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定
  1147. &&(!pSet->bsw_fz) // 中山局要求分支走常规保护逻辑
  1148. #endif
  1149. && (blx));
  1150. if(poc->sta.bFlag.blxQD) //幅值启动
  1151. {
  1152. if(!poc->sta.bFlag.blxQDWave)
  1153. {
  1154. rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD); //录波类型:跳闸类
  1155. poc->sta.bFlag.blxQDWave=true;
  1156. }
  1157. }
  1158. RunTR(&poc->tlxQDTime, poc->sta.bFlag.blxQD, dStep);
  1159. RunTR(&poc->tlxQD25ms, poc->sta.bFlag.blxQD, dStep);
  1160. // 如果速断时间到,启动时间未到,调用幅值启动加速模块
  1161. if(poc->sta.bFlag.blxQD && poc->tlxQDTime.boolTrip && !poc->tlxQD25ms.boolTrip)
  1162. {
  1163. if(protect_amp_lx_js(sw))
  1164. {
  1165. // 预置25ms,让下个循环再出口
  1166. PreSetTime(&poc->tlxQD25ms, T_25ms);
  1167. }
  1168. }
  1169. bTz = poc->tlxQDTime.boolTrip&&bGoose // 电流启动
  1170. && poc->tlxQD25ms.boolTrip; //启动后25ms
  1171. RunTR(&poc->tlxslowTime,(bTz&&pSet->bFA_slow), dStep); // 缓动型,跳闸信息自动延长
  1172. poc->sta.bFlag.blxTz=(bTz&&(!pSet->bFA_slow))// 非缓动型,直接出口
  1173. ||(poc->bslowEn&&poc->tlxslowTime.boolTrip);
  1174. if(poc->sta.bFlag.blxTz) //启动信息
  1175. {
  1176. int ui_begin;
  1177. DWORD I0;
  1178. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1179. 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);
  1180. if(soe_check(EV_GOOSE_LX_TZ+sw*EV_SW_NUM)==false) //零序跳闸
  1181. {
  1182. soe_record_ev( EV_GOOSE_LX_TZ+sw*EV_SW_NUM,1, I0,0,0 );
  1183. poc->blxTzLed=true;
  1184. poc->sta.bFlag.blxTzH=true;
  1185. poc->bgooseGz=true;
  1186. }
  1187. if(soe_check(EV_GOOSE_QC_QD+sw*EV_SW_NUM)==false) // 故障切除启动
  1188. {
  1189. soe_record_ev( EV_GOOSE_QC_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1190. }
  1191. }
  1192. else
  1193. {
  1194. if(soe_check(EV_GOOSE_LX_TZ+sw*EV_SW_NUM)==true) // 零序跳闸
  1195. {
  1196. soe_record_ev( EV_GOOSE_LX_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1197. }
  1198. }
  1199. }
  1200. // 缓动型故障扩展发送时间,需大于变电站出口时间,保证无压无流后,领域故障还存在
  1201. void fag_gzgl(int sw,DWORD dStep) // 故障隔离
  1202. {
  1203. TRELAY_T *pR=&g_tRelay[sw];
  1204. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1205. TGOC_T *poc=&pR->tgoc;
  1206. UGOOSE_STU *pg;
  1207. bool bY1,bY2,bGoose,bfztz;
  1208. int i;
  1209. bool bWY1, bWY2; // 无压判断
  1210. bWY1 = LowRelay(g_sw_pub.m2_max[2], pRunSet->tSwSet[sw].dU_fa_WY,pRunSet->tSwSet[sw].dU_fa_WY_fh, false); //无压
  1211. bWY2 = LowRelay(g_sw_pub.m2_max[3], pRunSet->tSwSet[sw].dU_fa_WY,pRunSet->tSwSet[sw].dU_fa_WY_fh, false);
  1212. bY1=false;
  1213. for(i=0;i<GOOSE_EQU_MAX;i++) //邻域有故障产生
  1214. {
  1215. pg=&tFAg.ugside[i];
  1216. bY1|=(pg->bFlag.bgl|pg->bFlag.blx|pg->bFlag.bzx|pg->bFlag.bfx|pg->bFlag.bglbs|pg->bFlag.blxbs);
  1217. }
  1218. bfztz=(!pSet->bsw_fz)||pSet->bTT_mxTfz; //非分支或分支线且母线故障跳分支未投入
  1219. bY2=(BH_GOOSE_EN(sw))
  1220. &&bfztz
  1221. &&bY1 // 邻域有故障产生
  1222. &&poc->bslowEn //缓动型,需无压无流,速动自动满足
  1223. && pR->tSWST.uSWST.bFlag.bHZWZ //在合闸位置
  1224. &&pR->tgoc.tglcd.sta.bFlag.bCD; //充电完成,无放电条件
  1225. RunTR(&poc->tgoose15ms_gzgl, bY2, dStep); // 电流启动 15ms后,goose 判断有效
  1226. bGoose=fag_goosecheck_gzgl(sw)
  1227. &&poc->tgoose15ms_gzgl.boolTrip
  1228. &&(tFAg.commerr==0); // 故障隔离,通信正常时处理,异常,靠失压跳闸
  1229. if(poc->tgoose15ms_gzgl.boolTrip&&!poc->sta.bFlag.bgzglQD) //goose 判断时间到,若条件不满足,放电,防止邻域开关故障撤销后,由于发送间隔问题,goose条件又满足导致误动
  1230. {
  1231. if(!bGoose) //外部条件不满足
  1232. {
  1233. pR->tgoc.tglcd.sta.bFlag.bCD=false;
  1234. ResetTR(&poc->tglcd.tCDTime);
  1235. }
  1236. }
  1237. #ifdef GD_AREA_ZHONGSHAN_2020 // 中山要求,动作后,通信异常不起作用,继续动作
  1238. poc->sta.bFlag.bgzglQD=((bGoose&&bY2)||poc->sta.bFlag.bgzglQD)&&bWY1&&bWY2; //故障隔离启动, 增加无压条件
  1239. #else
  1240. poc->sta.bFlag.bgzglQD=((bGoose&&bY2)||poc->sta.bFlag.bgzglQD)&&pR->tgoc.tglcd.sta.bFlag.bCD&&bWY1&&bWY2; //故障隔离启动, 增加无压条件
  1241. #endif
  1242. RunTR(&poc->tgzglTime,poc->sta.bFlag.bgzglQD, dStep); // 故障隔离时间到,出口
  1243. poc->sta.bFlag.bgzglTz=poc->tgzglTime.boolTrip; //故障隔离启动
  1244. if(poc->sta.bFlag.bgzglTz)
  1245. {
  1246. if(soe_check(EV_GOOSE_GL_QD+sw*EV_SW_NUM)==false) // 故障隔离启动
  1247. {
  1248. soe_record_ev( EV_GOOSE_GL_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1249. }
  1250. poc->bgzglTzLed=true;
  1251. poc->sta.bFlag.bgzglTzH=true;
  1252. poc->sta.bFlag.bgzglQD=false;
  1253. poc->bgooseGz=true;
  1254. }
  1255. }
  1256. void fag_lostvol_sd(int sw,DWORD dStep) // 首端开关失压跳闸
  1257. {
  1258. TRELAY_T *pR=&g_tRelay[sw];
  1259. TGOC_T*poc = &pR->tgoc;
  1260. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1261. bool bWY1, bWY2,bEnble;
  1262. /***********启动 **********************************/
  1263. 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); //无压
  1264. 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);
  1265. #ifdef GD_AREA_ZHONGSHAN_2020 // 中山要求,动作后,通信异常不起作用,继续动作
  1266. bEnble=(pSet->bTT_sdlost&&pSet->bsw_sd) ; //首端开关,失压投退投入,无通信异常
  1267. poc->sta.bFlag.bsdQD = bEnble
  1268. && (BH_GOOSE_EN_YB(sw))
  1269. &&(tFAg.bComErr==0||poc->sta.bFlag.bsdQD)
  1270. && pR->tgoc.psta.bFlag.bCYY // 曾有压
  1271. && pR->tSWST.uSWST.bFlag.bHZWZ //在合闸位置
  1272. && pR->tSWST.uSWST.bFlag.bSXWL //三相无流;
  1273. &&(poc->tqccd.sta.bFlag.bCD||poc->sta.bFlag.bsdQD)
  1274. && bWY1
  1275. && bWY2;
  1276. #else
  1277. bEnble=(pSet->bTT_sdlost&&pSet->bsw_sd&&(tFAg.commerr==0)) ; //首端开关,失压投退投入,无通信异常
  1278. poc->sta.bFlag.bsdQD = bEnble
  1279. && (BH_GOOSE_EN(sw))
  1280. && pR->tgoc.psta.bFlag.bCYY // 曾有压
  1281. && pR->tSWST.uSWST.bFlag.bHZWZ //在合闸位置
  1282. && pR->tSWST.uSWST.bFlag.bSXWL //三相无流;
  1283. &&poc->tqccd.sta.bFlag.bCD
  1284. && bWY1
  1285. && bWY2;
  1286. #endif
  1287. /***********失压分闸*********************************/
  1288. RunTR(&poc->tsdlostTime, poc->sta.bFlag.bsdQD, dStep);
  1289. poc->sta.bFlag.bsdTz = poc->tsdlostTime.boolTrip;
  1290. if(poc->sta.bFlag.bsdTz) //启动信息
  1291. {
  1292. if(soe_check(EV_GOOSE_SDLOST_TZ+sw*EV_SW_NUM)==false) // 故障隔离启动
  1293. {
  1294. soe_record_ev( EV_GOOSE_SDLOST_TZ+sw*EV_SW_NUM,1, 0,0,0 );
  1295. }
  1296. if(soe_check(EV_GOOSE_GL_QD+sw*EV_SW_NUM)==false) // 故障隔离启动
  1297. {
  1298. soe_record_ev( EV_GOOSE_GL_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1299. }
  1300. poc->bsdTzLed=true;
  1301. poc->sta.bFlag.bsdTzH=true;
  1302. pR->tgoc.psta.bFlag.bCYY =false;
  1303. poc->bgooseGz=true;
  1304. ResetTR(&pR->tgoc.tCYY3sdelayms);
  1305. }
  1306. else
  1307. {
  1308. if(soe_check(EV_GOOSE_SDLOST_TZ+sw*EV_SW_NUM)==true) // 故障隔离启动
  1309. {
  1310. soe_record_ev( EV_GOOSE_SDLOST_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1311. }
  1312. }
  1313. }
  1314. void fag_lostvol_commer(int sw,DWORD dStep) // 通信异常失压跳闸
  1315. {
  1316. TRELAY_T *pR=&g_tRelay[sw];
  1317. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1318. TGOC_T*poc = &pR->tgoc;
  1319. bool bWY1, bWY2,bEnble;
  1320. bool bfztz;
  1321. /***********启动 **********************************/
  1322. 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); //无压
  1323. 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);
  1324. bEnble=(tFAg.commerr>0) ; //通信异常,失压跳闸
  1325. bfztz=(!pSet->bsw_fz)||pSet->bTT_mxTfz; //非分支或分支线且母线故障跳分支未投入
  1326. poc->sta.bFlag.berrQD = bEnble
  1327. &&bfztz
  1328. && (BH_GOOSE_EN(sw))
  1329. && pR->tgoc.psta.bFlag.bCYY // 曾有压
  1330. && pR->tSWST.uSWST.bFlag.bHZWZ //在合闸位置
  1331. && pR->tSWST.uSWST.bFlag.bSXWL //三相无流;
  1332. && bWY1
  1333. && bWY2;
  1334. /***********失压分闸*********************************/
  1335. RunTR(&poc->terrlostTime, poc->sta.bFlag.berrQD, dStep);
  1336. poc->sta.bFlag.berrTz = poc->terrlostTime.boolTrip;
  1337. if(poc->sta.bFlag.berrTz) //启动信息
  1338. {
  1339. if(soe_check(EV_GOOSE_ERRLOST_TZ+sw*EV_SW_NUM)==false) //失压跳闸
  1340. {
  1341. soe_record_ev( EV_GOOSE_ERRLOST_TZ+sw*EV_SW_NUM,1, 0,0,0 );
  1342. }
  1343. if(soe_check(EV_GOOSE_GL_QD+sw*EV_SW_NUM)==false) // 故障隔离启动
  1344. {
  1345. soe_record_ev( EV_GOOSE_GL_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1346. }
  1347. poc->berrTzLed=true;
  1348. poc->sta.bFlag.berrTzH=true;
  1349. pR->tgoc.psta.bFlag.bCYY =false;
  1350. poc->bgooseGz=true;
  1351. ResetTR(&pR->tgoc.tCYY3sdelayms);
  1352. }
  1353. else
  1354. {
  1355. if(soe_check(EV_GOOSE_ERRLOST_TZ+sw*EV_SW_NUM)==true) //失压跳闸
  1356. {
  1357. soe_record_ev( EV_GOOSE_ERRLOST_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1358. }
  1359. }
  1360. }
  1361. void fag_exttz(int sw,DWORD dStep) // 下级开关跳闸失败,本级开关跳闸
  1362. {
  1363. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  1364. GOC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet;
  1365. UGOOSE_STU *pg;
  1366. bool btzsb=false;
  1367. bool bfztz;
  1368. int i;
  1369. bool bgzgl;
  1370. for(i=0;i<GOOSE_EQU_MAX;i++)
  1371. {
  1372. pg=&tFAg.ugside[i];
  1373. btzsb|=(pg->bFlag.btzsb); // 相邻开关有跳闸失败
  1374. }
  1375. bgzgl=fag_goosecheck_gzgl(sw)&&(!pSet->bsw_sd)&&(!pSet->bsw_fz);
  1376. bfztz=(!pSet->bsw_fz)||pSet->bTT_mxTfz; //非分支或分支线且母线故障跳分支未投入
  1377. RunTR(&poc->textbsTime,btzsb&&bgzgl, dStep); // 缓动型,跳闸信息自动延长
  1378. poc->sta.bFlag.bextQD=btzsb //相邻线路有开关跳闸失败
  1379. &&!poc->textbsTime.boolTrip
  1380. &&(tFAg.commerr==0) //通信正常
  1381. &&bfztz
  1382. &&(BH_GOOSE_EN(sw))
  1383. &&g_tRelay[ sw].tSWST.uSWST.bFlag.bHZWZ
  1384. &&poc->bslowEn //缓动 无压无流 速动,自动满足
  1385. &&!poc->psta.bFlag.btzsb;
  1386. poc->sta.bFlag.bextTz=poc->sta.bFlag.bextQD;
  1387. if(poc->sta.bFlag.bextTz)
  1388. {
  1389. if(soe_check(EV_GOOSE_EXT_TZ+sw*EV_SW_NUM)==false) //保护总
  1390. {
  1391. soe_record_ev( EV_GOOSE_EXT_TZ+sw*EV_SW_NUM,1, 0,0,0 );
  1392. #ifdef GD_AREA_ZHONGSHAN_2020
  1393. g_tRelay[i].run_stu.fgbs=1;//该SOE返回太快,需直接赋值
  1394. #endif
  1395. }
  1396. poc->sta.bFlag.bextTzH=true;
  1397. poc->bgooseGz=true;
  1398. }
  1399. else
  1400. {
  1401. if(soe_check(EV_GOOSE_EXT_TZ+sw*EV_SW_NUM)==true) //保护总
  1402. {
  1403. soe_record_ev( EV_GOOSE_EXT_TZ+sw*EV_SW_NUM,0, 0,0,0 );
  1404. }
  1405. }
  1406. }
  1407. // 两侧有压,开关在分位,确认联络开关有效,
  1408. //单侧失压后,判合闸条件,条件满足,合联络开关,恢复供电,重新确认联络开关位置
  1409. void fag_ll(int sw,DWORD dStep) // 联络开关逻辑处理
  1410. {
  1411. TRELAY_T *pR=&g_tRelay[sw];
  1412. TSETSW *pSet = &pRunSet->tSwSet[sw];
  1413. TGOC_T*poc = &pR->tgoc;
  1414. bool bY1,bQD;
  1415. bool bWY1,bWY2;
  1416. bool bYY1,bYY2,bllYY;
  1417. bool bLstQD=false;
  1418. //有压检测
  1419. bWY1 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_fa_WY,pSet->dU_fa_WY_fh, poc->psta.bFlag.bllWY1); //无压
  1420. bWY2 = LowRelay(g_sw_pub.m2_max[3], pSet->dU_fa_WY,pSet->dU_fa_WY_fh, poc->psta.bFlag.bllWY2);
  1421. bYY1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_fa_YY,pSet->dU_fa_YY_fh, poc->psta.bFlag.bYY1); // 有压
  1422. bYY2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_fa_YY,pSet->dU_fa_YY_fh, poc->psta.bFlag.bYY2);
  1423. RunTR(&poc->tllWY1Time,bWY1, dStep);
  1424. RunTR(&poc->tllWY2Time,bWY2, dStep);
  1425. RunTR(&poc->tllYY1Time,bYY1, dStep);
  1426. RunTR(&poc->tllYY2Time,bYY2, dStep);
  1427. poc->psta.bFlag.bllWY1 = poc->tllWY1Time.boolTrip;
  1428. poc->psta.bFlag.bllWY2 = poc->tllWY2Time.boolTrip;
  1429. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定,并且单侧失压后报联络合闸失败
  1430. bLstQD =pSet->tGocSet.bTT_ll//联络开关投入
  1431. &&(BH_GOOSE_EN(sw)) //智能分布式已投入
  1432. #ifdef GD_AREA_ZHONGSHAN
  1433. &&pSet->tGocSet.bsw_ll
  1434. #endif
  1435. &&(poc->psta.bFlag.bllWY1^poc->psta.bFlag.bllWY2) //单侧失压
  1436. &&pR->tSWST.uSWST.bFlag.bTZWZ; // 开关跳位
  1437. #endif
  1438. bllYY=poc->tllYY1Time.boolTrip&&poc->tllYY2Time.boolTrip;
  1439. poc->sta.bFlag.bllWY_1=((bLstQD&&bllYY)||poc->sta.bFlag.bllWY_1)&&bLstQD;
  1440. RunTR(&poc->tllQdTime,poc->sta.bFlag.bllWY_1, dStep); // 双侧有压后,又单侧失压,超过联络合闸时间,报联络合闸不满足
  1441. bQD =pSet->tGocSet.bTT_ll//联络开关投入
  1442. #ifdef GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定
  1443. &&(poc->tllcd.sta.bFlag.bCD||poc->sta.bFlag.bllQD) //联络开关充电完成
  1444. //&&pSet->tGocSet.bsw_ll
  1445. &&(BH_GOOSE_EN_YB(sw)) //智能分布式已投入
  1446. &&(tFAg.bComErr==0||poc->sta.bFlag.bllQD) // 联络启动后,自保持,通信异常不退出动作逻辑
  1447. #else
  1448. &&poc->tllcd.sta.bFlag.bCD //联络开关充电完成
  1449. &&(BH_GOOSE_EN(sw)) //智能分布式已投入
  1450. #endif
  1451. &&(poc->psta.bFlag.bllWY1^poc->psta.bFlag.bllWY2) //单侧失压
  1452. &&pR->tSWST.uSWST.bFlag.bTZWZ; // 开关跳位
  1453. RunTR(&poc->tgoosedelayms_ll, bQD, dStep); // 联络失压后启动
  1454. bY1= bQD // 单侧失压,联络启动条件满足
  1455. &&(!poc->tgoosedelayms_ll.boolTrip) //在失压后300ms内
  1456. &&!poc->b_side_gz //领域无故障
  1457. &&fag_goosecheck_ll(sw) ; //收到故障隔离信号
  1458. poc->sta.bFlag.bllQD=(bY1||poc->sta.bFlag.bllQD)&&bQD && !poc->b_side_tzsb ; // 联络启动后,自保持
  1459. RunTR(&poc->tllhzTime,poc->sta.bFlag.bllQD, dStep); // Y确认时间后,失压可合闸
  1460. poc->sta.bFlag.bllhz=poc->tllhzTime.boolTrip;
  1461. if(poc->sta.bFlag.bllhz) //启动信息
  1462. {
  1463. if(soe_check(EV_GOOSE_HZ_QD+sw*EV_SW_NUM)==false) // 联络合闸启动
  1464. {
  1465. soe_record_ev( EV_GOOSE_HZ_QD+sw*EV_SW_NUM,1, 0,0,0 );
  1466. }
  1467. sw_do(sw,SW_DO_HZ,SW_DO_TYPE_ON);
  1468. sw_do(sw,SW_DO_BHH,SW_DO_TYPE_ON);
  1469. poc->sta.bFlag.bllhzH=true;
  1470. ResetTR(&poc->tllQdTime);
  1471. poc->sta.bFlag.bllWY_1=false;
  1472. }
  1473. else
  1474. {
  1475. if(soe_check(EV_GOOSE_HZ_QD+sw*EV_SW_NUM)==true) // 联络合闸启动返回
  1476. {
  1477. soe_record_ev( EV_GOOSE_HZ_QD+sw*EV_SW_NUM,0, 0,0,0 );
  1478. }
  1479. }
  1480. if(poc->tllQdTime.boolTrip) //联络失压后合闸不满足
  1481. {
  1482. if(soe_check(EV_GOOSE_LL_UNOK+sw*EV_SW_NUM)==false) //
  1483. {
  1484. soe_record_ev( EV_GOOSE_LL_UNOK+sw*EV_SW_NUM,1, 0,0,0 );
  1485. }
  1486. ResetTR(&poc->tllQdTime);
  1487. ResetTR(&poc->tllcd.tCDTime);
  1488. poc->sta.bFlag.bllWY_1=false;
  1489. poc->tllcd.sta.bFlag.bCD=false;
  1490. }
  1491. if(poc->tllcd.sta.bFlag.bCD||pR->tSWST.uSWST.bFlag.bHZWZ)
  1492. {
  1493. if(soe_check(EV_GOOSE_LL_UNOK+sw*EV_SW_NUM)==true) //
  1494. {
  1495. soe_record_ev( EV_GOOSE_LL_UNOK+sw*EV_SW_NUM,0, 0,0,0 );
  1496. }
  1497. }
  1498. RunTR(&poc->tHzcheckTime, poc->sta.bFlag.bllhzH, dStep); //
  1499. if(poc->tHzcheckTime.boolTrip) //跳闸失败时间到,清标志,报soe
  1500. {
  1501. if(pR->tSWST.uSWST.bFlag.bTZWZ) //合闸闸失败
  1502. {
  1503. if(soe_check(EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM)==false) //
  1504. {
  1505. soe_record_ev( EV_GOOSE_HZ_FAIL+sw*EV_SW_NUM,1, 0,0,0 ); // 联络合闸失败
  1506. }
  1507. }
  1508. else //跳闸成功
  1509. {
  1510. if(soe_check(EV_GOOSE_HZ_OK+sw*EV_SW_NUM)==false) //联络合闸成功
  1511. {
  1512. soe_record_ev( EV_GOOSE_HZ_OK+sw*EV_SW_NUM,1, 0,0,0 );
  1513. }
  1514. }
  1515. poc->sta.bFlag.bllhzH=false;
  1516. }
  1517. }
  1518. #ifdef GD_AREA_ZHONGSHAN_2020
  1519. void fag_oc_acc(int sw,u32 dStep) // 分布式合闸加速跳闸
  1520. {
  1521. bool bQDD;
  1522. bool bJS3,bJS4,bJS5;
  1523. bool bY1,bY2;
  1524. int ui_begin;
  1525. int oc;
  1526. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1527. for(oc=FAG_GL1;oc<FAG_BHNUMBER;oc++)
  1528. {
  1529. TOC_T *poc = &g_tRelay[sw].tgoc.tOc[oc];
  1530. OC_SET *pSet = &pRunSet->tSwSet[sw].tGocSet.tOc[oc];
  1531. u16 soeno=EV_GOOSE_HZ_GL1+oc+sw*EV_SW_NUM;
  1532. bool bgloc=(oc==FAG_LX)?false:true;
  1533. bool bxbbs=false;
  1534. // 电流启动
  1535. if(bgloc)
  1536. {
  1537. bool bxb;
  1538. DWORD xbcoe; // 谐波系数
  1539. bxb=pRunSet->tSwSet[sw].bTT_goose_xbbs;
  1540. xbcoe=pRunSet->tSwSet[sw].d_goose_xbcoe;
  1541. poc->sta.bFlag.bIaQD = OverRelay(g_ui[ui_begin+SW_AC_IA].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIaQD);
  1542. poc->sta.bFlag.bIbQD = OverRelay(g_ui[ui_begin+SW_AC_IB].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIbQD);
  1543. poc->sta.bFlag.bIcQD = OverRelay(g_ui[ui_begin+SW_AC_IC].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bIcQD);
  1544. poc->sta.bFlag.bIaxb =bxb&&XBCalc(sw,SW_AC_IA,xbcoe,poc->sta.bFlag.bIaQD);
  1545. poc->sta.bFlag.bIbxb=bxb&&XBCalc(sw,SW_AC_IB,xbcoe,poc->sta.bFlag.bIbQD);
  1546. poc->sta.bFlag.bIcxb=bxb&&XBCalc(sw,SW_AC_IC,xbcoe,poc->sta.bFlag.bIcQD);
  1547. bQDD=poc->sta.bFlag.bIaQD||poc->sta.bFlag.bIbQD||poc->sta.bFlag.bIcQD;
  1548. bxbbs=poc->sta.bFlag.bIaxb||poc->sta.bFlag.bIbxb||poc->sta.bFlag.bIcxb; //谐波闭锁
  1549. }
  1550. else //零序加速
  1551. {
  1552. // 零序电流过量继电器
  1553. bY1 = OverRelay(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].m2[0], pSet->dI, pSet->dI_fh, poc->sta.bFlag.bQD);
  1554. bY2=true;
  1555. bQDD=bY1&& ((bY2&&pRunSet->bTT_U0BS)||(!pRunSet->bTT_U0BS));
  1556. bxbbs=false;
  1557. }
  1558. // 检查合闸加速标
  1559. bJS3 = g_tRelay[sw].tSWST.uSWST.bFlag.bSHJS; // 手合加速标
  1560. poc->sta.bFlag.bQD = (BH_GOOSE_EN_YB(sw))
  1561. &&(!pRunSet->tSwSet[sw].tGocSet.bsw_fz)
  1562. && bQDD
  1563. && (!bxbbs);//谐波闭锁
  1564. // 加速标保持
  1565. bJS4 = bJS3 || poc->sta.bFlag.bJSBC;
  1566. // 后加速启动条件满足
  1567. bJS5 = poc->sta.bFlag.bQD&& bJS4;
  1568. // 合闸加速标保持
  1569. poc->sta.bFlag.bJSBC = bJS5 && bJS4;
  1570. if(bJS5) //幅值启动
  1571. {
  1572. if(!poc->sta.bFlag.bQDWave)
  1573. {
  1574. if(bgloc)
  1575. {
  1576. rcd_start(sw,RECORD_TYPE_GLGZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  1577. }
  1578. else
  1579. {
  1580. rcd_start(sw,RECORD_TYPE_LXGL, RECORD_LEN_TZQD); //录波类型:跳闸类
  1581. }
  1582. poc->sta.bFlag.bQDWave=true;
  1583. }
  1584. }
  1585. else
  1586. {
  1587. poc->sta.bFlag.bQDWave=true;
  1588. }
  1589. RunTR(&poc->tQDTime, bJS5, dStep);
  1590. RunTR(&poc->tQD25ms, bJS5, dStep);
  1591. // 如果加速时间到,启动时间未到,调用幅值启动加速模块
  1592. if(poc->sta.bFlag.bQD && poc->tQDTime.boolTrip && !poc->tQD25ms.boolTrip)
  1593. {
  1594. if(bgloc)
  1595. {
  1596. if(protect_amp_qd_js(sw))
  1597. {
  1598. // 预置25ms,让下个循环再出口
  1599. PreSetTime(&poc->tQD25ms, T_25ms);
  1600. }
  1601. }
  1602. else
  1603. {
  1604. if(protect_amp_lx_js(sw))
  1605. {
  1606. // 预置25ms,让下个循环再出口
  1607. PreSetTime(&poc->tQD25ms, T_25ms);
  1608. }
  1609. }
  1610. }
  1611. poc->sta.bFlag.bTz=poc->tQDTime.boolTrip && poc->tQD25ms.boolTrip;
  1612. // 出口记录及出口
  1613. if(poc->sta.bFlag.bTz)
  1614. {
  1615. if(bgloc)
  1616. {
  1617. int ui_begin;
  1618. DWORD Ia,Ib,Ic;
  1619. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1620. 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);
  1621. 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);
  1622. 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);
  1623. if(soe_check(soeno)==false) //过流跳闸
  1624. {
  1625. soe_record_ev( soeno,1, Ia,Ib,Ic );
  1626. poc->sta.bFlag.bDzLed = true;
  1627. g_tRelay[sw].tgoc.bgooseGz=true;
  1628. }
  1629. }
  1630. else // 零序加速
  1631. {
  1632. // 出口记录及出口
  1633. if(poc->sta.bFlag.bTz)
  1634. {
  1635. int ui_begin;
  1636. DWORD I0;
  1637. ui_begin = UI_SW_INDEX_BEGIN(sw);
  1638. 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);
  1639. if(soe_check(soeno)==false) //零序跳闸
  1640. {
  1641. soe_record_ev( soeno,1, I0,0,0 );
  1642. poc->sta.bFlag.bDzLed = true;
  1643. g_tRelay[sw].tgoc.bgooseGz=true;
  1644. }
  1645. if(soe_check(soeno)==false) // 故障切除启动
  1646. {
  1647. soe_record_ev( soeno,1, 0,0,0 );
  1648. }
  1649. }
  1650. }
  1651. }
  1652. else
  1653. {
  1654. if(soe_check(soeno)==true) // 过流跳闸
  1655. {
  1656. soe_record_ev( soeno,0, 0,0,0 );
  1657. }
  1658. }
  1659. }
  1660. }
  1661. #endif
  1662. void fag_kc(int sw,DWORD dStep) //goose开出
  1663. {
  1664. TRELAY_T *pR=&g_tRelay[sw];
  1665. TGOC_T *poc=&g_tRelay[ sw].tgoc;
  1666. bool bTz;
  1667. bool bCur;
  1668. bool bgzglok=false;
  1669. bool btzsb=false;
  1670. bTz=poc->sta.bFlag.bglTzH
  1671. ||poc->sta.bFlag.blxTzH
  1672. ||poc->sta.bFlag.bgzglTzH
  1673. ||poc->sta.bFlag.bsdTzH
  1674. ||poc->sta.bFlag.bextTzH
  1675. ||poc->sta.bFlag.berrTzH;
  1676. // 有跳闸信号时,可由大电流闭锁不动作,
  1677. // 无闭锁时,需保证一次动作信号仅一次出口
  1678. if(bTz&&!pR->bBSTZ&&!poc->bTzout)
  1679. {
  1680. sw_do(sw,SW_DO_HZ,SW_DO_TYPE_OFF);
  1681. sw_do(sw,SW_DO_BHH,SW_DO_TYPE_OFF);
  1682. sw_do(sw,SW_DO_BHDZ,SW_DO_TYPE_ON);
  1683. sw_do(sw,SW_DO_FZ,SW_DO_TYPE_ON);
  1684. sw_do(sw,SW_DO_BHT,SW_DO_TYPE_ON);
  1685. poc->bTzout=true;
  1686. }
  1687. // 跳闸失败检查: 跳闸后持续有流或合位
  1688. bCur = ((!pR->tSWST.uSWST.bFlag.bSXWL) || pR->tSWST.uSWST.bFlag.bHZWZ);
  1689. RunTR(&poc->tTzcheckTime, bTz, dStep); //
  1690. if(poc->tTzcheckTime.boolTrip) //跳闸失败时间到,清标志,报soe
  1691. {
  1692. if(bCur) //跳闸失败
  1693. {
  1694. bTz=poc->sta.bFlag.bglTzH
  1695. ||poc->sta.bFlag.blxTzH
  1696. ||poc->sta.bFlag.bgzglTzH
  1697. ||poc->sta.bFlag.bsdTzH
  1698. ||poc->sta.bFlag.berrTzH;
  1699. if(poc->sta.bFlag.bglTzH||poc->sta.bFlag.blxTzH||poc->psta.bFlag.bGZ) //故障切除
  1700. {
  1701. if(soe_check(EV_GOOSE_QC_FAIL+sw*EV_SW_NUM)==false)
  1702. {
  1703. soe_record_ev( EV_GOOSE_QC_FAIL+sw*EV_SW_NUM,1, 0,0,0 ); // 故障切除失败
  1704. }
  1705. }
  1706. else
  1707. {
  1708. if(soe_check(EV_GOOSE_GL_FAIL+sw*EV_SW_NUM)==false) //
  1709. {
  1710. soe_record_ev( EV_GOOSE_GL_FAIL+sw*EV_SW_NUM,1, 0,0,0 ); //故障隔离失败
  1711. }
  1712. }
  1713. if(bTz) btzsb=true; //开关失灵引起的跳闸失败,不再发送
  1714. }
  1715. else //跳闸成功
  1716. {
  1717. if(poc->sta.bFlag.bglTzH||poc->sta.bFlag.blxTzH||poc->psta.bFlag.bGZ)
  1718. {
  1719. if(soe_check(EV_GOOSE_QC_OK+sw*EV_SW_NUM)==false) // 故障切除
  1720. {
  1721. soe_record_ev( EV_GOOSE_QC_OK+sw*EV_SW_NUM,1, 0,0,0 );
  1722. }
  1723. }
  1724. else
  1725. {
  1726. if(soe_check(EV_GOOSE_GL_OK+sw*EV_SW_NUM)==false) // 故障隔离成功
  1727. {
  1728. soe_record_ev( EV_GOOSE_GL_OK+sw*EV_SW_NUM,1, 0,0,0 );
  1729. }
  1730. bgzglok=true&&(!pRunSet->tSwSet[sw].tGocSet.bsw_fz); //分支开关不发送故障隔离成功信号
  1731. }
  1732. }
  1733. poc->bTzout=false;
  1734. poc->sta.bFlag.bglTzH=false;
  1735. poc->sta.bFlag.blxTzH=false;
  1736. poc->sta.bFlag.bgzglTzH=false;
  1737. poc->sta.bFlag.bsdTzH=false;
  1738. poc->sta.bFlag.bextTzH=false;
  1739. poc->sta.bFlag.berrTzH=false;
  1740. ResetTR(&poc->tTzcheckTime);
  1741. }
  1742. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山要求联络开关固定
  1743. btzsb|=(pR->uBHDZ.bFlag.bTZSB&&pRunSet->tSwSet[sw].tGocSet.bsw_fz); //分支开关动作逻辑在常规保护中处理
  1744. #endif
  1745. RunTR(&poc->tgzglokextTime, bgzglok, dStep); //故障隔离成功发送
  1746. poc->psta.bFlag.bgzglok=poc->tgzglokextTime.boolTrip;
  1747. RunTR(&poc->ttzsbextTime, btzsb, dStep); //跳闸失败发送展宽时间
  1748. poc->psta.bFlag.btzsb=poc->ttzsbextTime.boolTrip;
  1749. RunTR(&poc->tgzglokForbitTime, poc->psta.bFlag.bgzglok, dStep); //故障隔离发送闭锁
  1750. }
  1751. void fag_bh(int sw,DWORD dStep)
  1752. {
  1753. tFAg.bComErr=(tFAg.commerr>0||tFAg.syscomerr>0)?true:false; // goose 通信异常 本机和系统通信异常
  1754. GOC_dir_check(sw,dStep);
  1755. fag_cd(sw,dStep); //
  1756. fag_gzgl(sw,dStep); //
  1757. fag_lostvol_sd(sw,dStep); //
  1758. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020 //中山地区,不需要通信失压分闸
  1759. #else
  1760. fag_lostvol_commer(sw,dStep); //
  1761. #endif
  1762. fag_exttz(sw,dStep); //
  1763. fag_ll(sw,dStep); //
  1764. fag_kc(sw,dStep); //
  1765. fa_g_commcheck(dStep); // goose信息延时复归
  1766. }
  1767. bool _XB2_Logic_Relay(int sw, DWORD I, DWORD Ixb2, DWORD XBcoe,DWORD Iset)
  1768. {
  1769. if(( I > Iset) && ( Ixb2 > pRunSet->dIWL_SQR[sw] )) // I 与 Ixb2 均应大于无流定值
  1770. {
  1771. if( Ixb2 > _MulFac_U(I, XBcoe ))
  1772. {
  1773. return(true);
  1774. }
  1775. else
  1776. {
  1777. return(false);
  1778. }
  1779. }
  1780. else
  1781. {
  1782. return(false);
  1783. }
  1784. return 0;
  1785. }
  1786. /******************************************************************************
  1787. 函数名称: XBCalc
  1788. 函数版本: 01.01
  1789. 创建作者: xxxxxx
  1790. 创建日期: 2014-12-16
  1791. 函数说明: 谐波计算
  1792. 参数说明:
  1793. 返回值: 无
  1794. 修改记录:
  1795. */
  1796. void XBCalc_goc(int sw)
  1797. {
  1798. bool bH1,bH2,bH3;
  1799. bool bxbbs=false;
  1800. bool bxbbs2=false;
  1801. if(!BH_GOOSE_EN(sw))return;
  1802. if(pRunSet->tSwSet[sw].bTT_goose_xbbs)
  1803. {
  1804. 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相谐波闭锁
  1805. 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相谐波闭锁
  1806. 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相谐波闭锁
  1807. bxbbs=(bH1 || bH2 || bH3);
  1808. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  1809. 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相谐波闭锁
  1810. 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相谐波闭锁
  1811. 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相谐波闭锁
  1812. bxbbs2=(bH1 || bH2 || bH3);
  1813. #endif
  1814. }
  1815. g_tRelay[sw].tgoc.sta.bFlag.bXBbs =bxbbs;
  1816. g_tRelay[sw].tgoc.sta.bFlag.bXBbs2 =bxbbs2;
  1817. if(bxbbs||bxbbs2)
  1818. {
  1819. if(soe_check(EV_XBBS+sw*EV_SW_NUM)==false)
  1820. {
  1821. soe_record_ev(EV_XBBS+sw*EV_SW_NUM,1, 0,0,0 );
  1822. }
  1823. }
  1824. else
  1825. {
  1826. if(soe_check(EV_XBBS+sw*EV_SW_NUM)==true)
  1827. {
  1828. soe_record_ev( EV_XBBS+sw*EV_SW_NUM,0, 0,0,0 );
  1829. }
  1830. }
  1831. }
  1832. /***************************************endfile**********************************************************/