vol.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458
  1. /*******************************************************************************
  2. * 版权所有:
  3. * 文件版本: V1.00
  4. * 文件名称: vol.c
  5. * 生成日期: 2007年9月10日
  6. * 作 者:电力开发部部
  7. * 功 能: 电压逻辑处理
  8. * 修改日志:
  9. * 日志1:
  10. * 修改者:
  11. * 修改日期:2013.6.18
  12. * 修改内容:
  13. * 修改原因:
  14. ****************************************************************************/
  15. #include "head.h"
  16. /**********************************************************************
  17. 定义全局变量
  18. ***********************************************************************/
  19. #ifdef CUSTOMIZE_BZT //备自投
  20. TVOL_T g_tVolLost;
  21. #endif
  22. TVOL_T g_tVol[VOL_NUMBER];
  23. #define SOFE_AUTO_EN(sw) (BH_ALL_EN(sw)||FA_ALL_EN(sw))//安全自动化功能压板 保护和FA模式下都需要投入安自功能
  24. void vol_over(DWORD dStep,int vno,int index,int soeno)
  25. {
  26. bool bQDD=false;
  27. TVOL_T *pvol = &g_tVol[vno];
  28. VOL_SET *pSet = &pRunSet->tVolSet[vno];
  29. if((vno!=VOL_DDY_DC1)&&(vno!=VOL_DDY_DC2)&&(vno!=VOL_WY_POW1)&&(vno!=VOL_WY_POW2))
  30. {
  31. if(vno==VOL_YY_POW1)
  32. {
  33. bQDD = OverRelay(g_sw_pub.m2_max[2], pSet->dUVol,pSet->dUVol_fh,pvol->sta.bFlag.bQD);
  34. }
  35. else if(vno==VOL_YY_POW2)
  36. {
  37. bQDD = OverRelay(g_sw_pub.m2_max[3], pSet->dUVol,pSet->dUVol_fh,pvol->sta.bFlag.bQD);
  38. }
  39. else
  40. {
  41. bQDD = OverRelay(g_ui[index].m2[0], pSet->dUVol,pSet->dUVol_fh,pvol->sta.bFlag.bQD);
  42. }
  43. }
  44. pvol->sta.bFlag.bQD = (pSet->bTT && bQDD);
  45. /***********动作*********************************/
  46. RunTR(&pvol->tQDTime, pvol->sta.bFlag.bQD, dStep);
  47. pvol->sta.bFlag.bGj = pvol->tQDTime.boolTrip;
  48. /************事件记录及出口****************************/
  49. if(pvol->sta.bFlag.bGj)
  50. {
  51. if(soe_check(soeno)==false)
  52. {
  53. DWORD Uab;
  54. if (vno == VOL_YY_POW1)
  55. {
  56. Uab = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[2]), 256, g_ui[index].m2_factor_k);
  57. }
  58. else if (vno == VOL_YY_POW2)
  59. {
  60. Uab = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[3]), 256, g_ui[index].m2_factor_k);
  61. }
  62. else
  63. {
  64. Uab = _Mul_Div_U(sqrt_32fix(g_ui[index].m2[0]), 256, g_ui[index].m2_factor_k);
  65. }
  66. soe_record_ev(soeno,1, Uab,0,0);
  67. }
  68. }
  69. else
  70. {
  71. if(soe_check(soeno)==true)
  72. {
  73. soe_record_ev(soeno,0, 0,0,0 );
  74. }
  75. }
  76. }
  77. void vol_low(DWORD dStep,int vno,int index,int soeno)
  78. {
  79. bool bQDD_H,bQDD;
  80. TVOL_T *pvol = &g_tVol[vno];
  81. VOL_SET *pSet = &pRunSet->tVolSet[vno];
  82. static bool bCYY_bk[VOL_NUMBER]={false},bQD_bk[VOL_NUMBER]={false},bGj_bk[VOL_NUMBER]={false},bQDD_H_bk[VOL_NUMBER]={false};
  83. if((vno!=VOL_DDY_DC1)&&(vno!=VOL_DDY_DC2))
  84. {
  85. if (vno == VOL_WY_POW1)
  86. {
  87. bQDD_H = OverRelay(g_sw_pub.m2_max[2], pSet->dUVol, pSet->dUVol, false);
  88. }
  89. else if (vno == VOL_WY_POW2)
  90. {
  91. bQDD_H = OverRelay(g_sw_pub.m2_max[3], pSet->dUVol, pSet->dUVol, false);
  92. }
  93. else
  94. {
  95. bQDD_H = OverRelay(g_ui[index].m2[0], pSet->dUVol, pSet->dUVol, false);
  96. }
  97. }
  98. else if((vno==VOL_DDY_DC1)||(vno==VOL_DDY_DC2))
  99. {
  100. bQDD_H = OverRelay(_AbsL(g_sw_pub.ac_in[index]), pSet->dUVol,pSet->dUVol,false);
  101. }
  102. //有压充电
  103. RunTR(&pvol->tCYYTime, (bQDD_H|pvol->sta.bFlag.bCYY), dStep);
  104. pvol->sta.bFlag.bCYY = pvol->tCYYTime.boolTrip&&pSet->bTT;
  105. RunTR(&pvol->tWaveYYTime, bQDD_H, dStep);
  106. if(pvol->tWaveYYTime.boolTrip)
  107. {
  108. pvol->sta.bFlag.bQDWave=false;
  109. }
  110. if((vno!=VOL_DDY_DC1)&&(vno!=VOL_DDY_DC2))
  111. {
  112. if (vno == VOL_WY_POW1)
  113. {
  114. bQDD = LowRelay(g_sw_pub.m2_max[2], pSet->dUVol, pSet->dUVol_fh, pvol->sta.bFlag.bQD);
  115. }
  116. else if (vno == VOL_WY_POW2)
  117. {
  118. bQDD = LowRelay(g_sw_pub.m2_max[3], pSet->dUVol, pSet->dUVol_fh, pvol->sta.bFlag.bQD);
  119. }
  120. else
  121. {
  122. bQDD = LowRelay(g_ui[index].m2[0], pSet->dUVol, pSet->dUVol_fh, pvol->sta.bFlag.bQD);
  123. }
  124. }
  125. else if((vno==VOL_DDY_DC1)||(vno==VOL_DDY_DC2))
  126. {
  127. bQDD = LowRelay(_AbsL(g_sw_pub.ac_in[index]), pSet->dUVol,pSet->dUVol_fh,pvol->sta.bFlag.bQD);
  128. }
  129. pvol->sta.bFlag.bQD = (pSet->bTT&&bQDD&&pvol->sta.bFlag.bCYY);
  130. if(pvol->sta.bFlag.bQD)
  131. {
  132. if(!pvol->sta.bFlag.bQDWave)
  133. {
  134. int sw;
  135. if(vno==VOL_DDY_Uab1||vno==VOL_DDY_Ubc1||vno==VOL_DDY_Uca1)
  136. {
  137. bool bY1;
  138. bY1=g_tVol[VOL_DDY_Uab1].sta.bFlag.bQDWave||g_tVol[VOL_DDY_Ubc1].sta.bFlag.bQDWave||g_tVol[VOL_DDY_Uca1].sta.bFlag.bQDWave; // 判断是否启动过低电压
  139. for(sw=0;sw<g_sw_num;sw++)
  140. {
  141. if(!pRunSet->tSwSet[sw].bTT_Power_v2&&!bY1)
  142. {
  143. rcd_start(sw,RECORD_TYPE_XLSY, RECORD_LEN_TZQD); // 线路低电压,启动开关录波
  144. }
  145. }
  146. }
  147. if(vno==VOL_DDY_Uab2||vno==VOL_DDY_Ubc2||vno==VOL_DDY_Uca2)
  148. {
  149. bool bY1;
  150. bY1=g_tVol[VOL_DDY_Uab2].sta.bFlag.bQDWave||g_tVol[VOL_DDY_Ubc2].sta.bFlag.bQDWave||g_tVol[VOL_DDY_Uca2].sta.bFlag.bQDWave; // 判断是否启动过低电压
  151. for(sw=0;sw<g_sw_num;sw++)
  152. {
  153. if(pRunSet->tSwSet[sw].bTT_Power_v2&&!bY1)
  154. {
  155. rcd_start(sw,RECORD_TYPE_XLSY, RECORD_LEN_TZQD); // 线路低电压,启动开关录波
  156. }
  157. }
  158. }
  159. pvol->sta.bFlag.bQDWave=true;
  160. }
  161. }
  162. /***********动作*********************************/
  163. RunTR(&pvol->tQDTime, pvol->sta.bFlag.bQD, dStep);
  164. pvol->sta.bFlag.bGj = pvol->tQDTime.boolTrip;
  165. if(vno==VOL_DDY_DC1)
  166. {
  167. if((bCYY_bk[VOL_DDY_DC1]!=pvol->sta.bFlag.bCYY)
  168. ||(bQD_bk[VOL_DDY_DC1]!=pvol->sta.bFlag.bQD)
  169. ||(bGj_bk[VOL_DDY_DC1]!=pvol->sta.bFlag.bGj)
  170. ||(bQDD_H_bk[VOL_DDY_DC1]!=bQDD_H))
  171. {
  172. /*rt_printf("DC1:bQDD_H=%d,bCYY=%d,bQD=%d,bGj=%d,dUVol=%d,ac_in[%d]=%d\r\n",
  173. bQDD_H,
  174. pvol->sta.bFlag.bCYY,
  175. pvol->sta.bFlag.bQD,
  176. pvol->sta.bFlag.bGj,
  177. pSet->dUVol,
  178. index,
  179. g_sw_pub.ac_in[index]
  180. );*/
  181. bCYY_bk[VOL_DDY_DC1]=pvol->sta.bFlag.bCYY;
  182. bQD_bk[VOL_DDY_DC1]=pvol->sta.bFlag.bQD;
  183. bGj_bk[VOL_DDY_DC1]=pvol->sta.bFlag.bGj;
  184. bQDD_H_bk[VOL_DDY_DC1]=bQDD_H;
  185. }
  186. }
  187. if(vno==VOL_DDY_DC2)
  188. {
  189. if((bCYY_bk[VOL_DDY_DC2]!=pvol->sta.bFlag.bCYY)
  190. ||(bQD_bk[VOL_DDY_DC2]!=pvol->sta.bFlag.bQD)
  191. ||(bGj_bk[VOL_DDY_DC2]!=pvol->sta.bFlag.bGj)
  192. ||(bQDD_H_bk[VOL_DDY_DC2]!=bQDD_H))
  193. {
  194. /*rt_printf("DC2:bQDD_H=%d,bCYY=%d,bQD=%d,bGj=%d,dUVol=%d,ac_in[%d]=%d\r\n",
  195. bQDD_H,
  196. pvol->sta.bFlag.bCYY,
  197. pvol->sta.bFlag.bQD,
  198. pvol->sta.bFlag.bGj,
  199. pSet->dUVol,
  200. index,
  201. g_sw_pub.ac_in[index]);*/
  202. bCYY_bk[VOL_DDY_DC2]=pvol->sta.bFlag.bCYY;
  203. bQD_bk[VOL_DDY_DC2]=pvol->sta.bFlag.bQD;
  204. bGj_bk[VOL_DDY_DC2]=pvol->sta.bFlag.bGj;
  205. bQDD_H_bk[VOL_DDY_DC2]=bQDD_H;
  206. }
  207. }
  208. /************事件记录及出口****************************/
  209. if(pvol->sta.bFlag.bGj)
  210. {
  211. int sw;
  212. if(soe_check(soeno)==false)
  213. {
  214. DWORD Uab;
  215. if((vno!=VOL_DDY_DC1)&&(vno!=VOL_DDY_DC2))
  216. {
  217. if (vno == VOL_WY_POW1)
  218. {
  219. Uab = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[2]), 256, g_ui[index].m2_factor_k);
  220. }
  221. else if (vno == VOL_WY_POW2)
  222. {
  223. Uab = _Mul_Div_U(sqrt_32fix(g_sw_pub.m2_max[3]), 256, g_ui[index].m2_factor_k);
  224. }
  225. else
  226. {
  227. Uab = _Mul_Div_U(sqrt_32fix(g_ui[index].m2[0]), 256, g_ui[index].m2_factor_k);
  228. }
  229. }
  230. else if((vno==VOL_DDY_DC1)||(vno==VOL_DDY_DC2))
  231. {
  232. Uab = g_sw_pub.ac_in[index];
  233. }
  234. if(vno==VOL_DDY_Uab1||vno==VOL_DDY_Ubc1||vno==VOL_DDY_Uca1)
  235. {
  236. bool bY1;
  237. bY1=soe_check(EV_UAB1DDY)||soe_check(EV_UBC1DDY) ||soe_check(EV_UCA1DDY); // 判断是否启动过低电压
  238. for(sw=0;sw<g_sw_num;sw++)
  239. {
  240. if(!pRunSet->tSwSet[sw].bTT_Power_v2)
  241. {
  242. if(!bY1&&BH_WAVETIME_EN(pSet->dTVol))rcd_start(sw,RECORD_TYPE_XLSY, RECORD_LEN_TZQD); // 线路低电压,启动开关录波
  243. }
  244. }
  245. }
  246. if(vno==VOL_DDY_Uab2||vno==VOL_DDY_Ubc2||vno==VOL_DDY_Uca2)
  247. {
  248. bool bY1;
  249. bY1=soe_check(EV_UAB2DDY)||soe_check(EV_UBC2DDY) ||soe_check(EV_UCA2DDY); // 判断是否启动过低电压
  250. for(sw=0;sw<g_sw_num;sw++)
  251. {
  252. if(pRunSet->tSwSet[sw].bTT_Power_v2)
  253. {
  254. if(!bY1&&BH_WAVETIME_EN(pSet->dTVol))rcd_start(sw,RECORD_TYPE_XLSY, RECORD_LEN_TZQD); // 线路低电压,启动开关录波
  255. }
  256. }
  257. }
  258. soe_record_ev(soeno,1, Uab,0,0);
  259. }
  260. }
  261. else
  262. {
  263. if(soe_check(soeno)==true)
  264. {
  265. //if(pvol->sta.bFlag.bGj)
  266. {
  267. pvol->sta.bFlag.bCYY=false;
  268. }
  269. soe_record_ev(soeno,0, 0,0,0 );
  270. pvol->sta.bFlag.bQDWave=false;
  271. }
  272. }
  273. }
  274. void Pro_vol(DWORD dStep)
  275. {
  276. vol_over(dStep,VOL_GDY_Uab1, PUB_AC_UAB1, EV_UAB1GDY);
  277. vol_over(dStep,VOL_GDY_Ubc1, PUB_AC_UBC1, EV_UBC1GDY);
  278. vol_over(dStep,VOL_GDY_Uca1, PUB_AC_UCA1, EV_UCA1GDY);
  279. vol_over(dStep,VOL_GDY_Uab2, PUB_AC_UAB2, EV_UAB2GDY);
  280. vol_over(dStep,VOL_GDY_Ubc2, PUB_AC_UBC2, EV_UBC2GDY);
  281. vol_over(dStep,VOL_GDY_Uca2, PUB_AC_UCA2, EV_UCA2GDY);
  282. vol_over(dStep,VOL_YY_POW1, PUB_AC_US1, EV_POW1YY);
  283. vol_over(dStep,VOL_YY_POW2, PUB_AC_US2, EV_POW2YY);
  284. vol_low(dStep,VOL_DDY_Uab1, PUB_AC_UAB1, EV_UAB1DDY);
  285. vol_low(dStep,VOL_DDY_Ubc1, PUB_AC_UBC1, EV_UBC1DDY);
  286. vol_low(dStep,VOL_DDY_Uca1, PUB_AC_UCA1, EV_UCA1DDY);
  287. vol_low(dStep,VOL_DDY_Uab2, PUB_AC_UAB2, EV_UAB2DDY);
  288. vol_low(dStep,VOL_DDY_Ubc2, PUB_AC_UBC2, EV_UBC2DDY);
  289. vol_low(dStep,VOL_DDY_Uca2, PUB_AC_UCA2, EV_UCA2DDY);
  290. vol_low(dStep,VOL_WY_POW1, PUB_AC_US1, EV_POW1WY);
  291. vol_low(dStep,VOL_WY_POW2, PUB_AC_US2, EV_POW2WY);
  292. vol_low(dStep,VOL_DDY_DC1, PUB_AC_IN_UZ1, EV_DC1DDY);
  293. #ifndef DC_TEST_ONE
  294. vol_low(dStep,VOL_DDY_DC2, PUB_AC_IN_UZ2, EV_DC2DDY);
  295. #endif
  296. }
  297. /**************************************************************************
  298. 函数名称:Pro_TQHz
  299. 函数版本:1.00
  300. 作者: 电力产品开发部
  301. 创建日期:2012.3.16
  302. 函数功能说明:合环
  303. 输入参数:
  304. 其他输入:
  305. 输出参数:
  306. 返回值:
  307. ***************************************************************************/
  308. void Pro_TQHz(int sw,DWORD dStep)
  309. {
  310. bool bQD,bTQ=false;
  311. TRELAY_T *pR=&g_tRelay[sw];
  312. TTQHZ_T *pSW = &pR->tTQHz;
  313. TSETSW *pSet = &pRunSet->tSwSet[sw];
  314. static int printf_Pro_TQHz=1;
  315. if(pR->uRmtSW.bTQHz)
  316. {
  317. pR->uRmtSW.bTQHz = false;
  318. bTQ = true;
  319. }
  320. RunTR(&pSW->tTQQDTime, bTQ, dStep);
  321. if(pSW->tTQQDTime.boolTrip && pR->tSWST.uSWST.bFlag.bHZWZ)
  322. {
  323. ResetTR(&pSW->tTQQDTime);
  324. }
  325. // 合环合闸
  326. if(!TYTQ_ALL_EN(sw))
  327. {
  328. #if 1
  329. long deltaA;
  330. bool bMxYY,bMxWY,bUxYY,bUxWY,bDa,bDu,bDf;
  331. qs16 ang1=0,ang2=0;
  332. if(pRunSet->pt2vol==PUB_AC_UAB1)ang2=0;
  333. else if(pRunSet->pt2vol==PUB_AC_UBC1)ang2=-120*65536;
  334. else if(pRunSet->pt2vol==PUB_AC_UCA1)ang2=120*65536;
  335. else if(pRunSet->pt2vol==PUB_AC_UAB2)ang2=0;
  336. else if(pRunSet->pt2vol==PUB_AC_UBC2)ang2=-120*65536;
  337. else if(pRunSet->pt2vol==PUB_AC_UCA2)ang2=120*65536;
  338. //deltaA = _AbsL((g_ui[PUB_AC_UAB1].p -ang1)- (g_ui[pRunSet->pt2vol].p-ang2));
  339. //bdeltaA = LowRelay(da, pSet->dTQ_ANG, pSet->dTQ_ANG_fh, pSW->uTQHz.bFlag.bQD);
  340. //bDa = LowRelay(deltaA, pSet->dA_tq_delatA, pSet->dA_tq_delatA, false);
  341. bMxYY = OverRelay(g_sw_pub.m2_max[2], pSet->dU_chz_yy,pSet->dU_chz_yy,false);
  342. bMxWY = LowRelay(g_sw_pub.m2_max[2], pSet->dU_chz_wy,pSet->dU_chz_wy,false);
  343. bUxYY = OverRelay(g_ui[pRunSet->pt2vol].m2[0], pSet->dU_chz_yy,pSet->dU_chz_yy,false);
  344. bUxWY = LowRelay(g_ui[pRunSet->pt2vol].m2[0], pSet->dU_chz_wy,pSet->dU_chz_wy,false);
  345. // deltaA=CalcAngSub(g_ui[PUB_AC_UAB1].ri.r,g_ui[PUB_AC_UAB1].ri.i,g_ui[pRunSet->pt2vol].ri.r,g_ui[pRunSet->pt2vol].ri.i);
  346. deltaA = _AbsL((g_ui[PUB_AC_UAB1].p -ang1)- (g_ui[pRunSet->pt2vol].p-ang2));
  347. bDa=(((_AbsL(deltaA) < pSet->dA_tq_delatA)?true:false)||(pSet->dA_tq_delatA==0)); //角差满足要求,角差为零,不判角差
  348. bDu=((_AbsL(g_ui[PUB_AC_UAB1].fz -g_ui[pRunSet->pt2vol].fz)<pSet->dU_tq_deltaU)?true:false)||(pSet->dU_tq_deltaU==0); //压差满足要求
  349. bDf= ((_AbsL(g_sw_pub.ac_in[PUB_AC_IN_F1] - g_sw_pub.ac_in[PUB_AC_IN_F2])<pSet->dF_tq_deltaF)?true:false)||(pSet->dF_tq_deltaF==0);//频差
  350. #ifdef FUNC_PRINT_PT_ERR
  351. if(bTQ && (tPT.uPT1DX.bFlag.bPTYC || tPT.uPT2DX.bFlag.bPTYC))
  352. {
  353. rt_printf("有同期合闸需求但PT断线,不允许合闸!\r\n");
  354. }
  355. #endif
  356. bQD=(bDa&&bDu&&bDf&&bMxYY&&bUxYY&&(!tPT.uPT1DX.bFlag.bPTYC)&&(!tPT.uPT2DX.bFlag.bPTYC))
  357. #ifndef FUNC_TQ_YY
  358. ||(bMxWY&&(!tPT.uPT1DX.bFlag.bPTYC))
  359. ||(bUxWY&&(!tPT.uPT2DX.bFlag.bPTYC))
  360. #endif
  361. ; //压差,角差,频差满足要求,或有一侧无压
  362. pSW->uTQHz.bFlag.bQD = (FUN_ALL_EN(sw) &&
  363. (!TYTQ_ALL_EN(sw)) &&
  364. bQD &&
  365. pSW->tTQQDTime.boolTrip && !pR->tSWST.uSWST.bFlag.bHZWZ); // 有外部同期需求
  366. pSW->uTQHz.bFlag.bHz = pSW->uTQHz.bFlag.bQD;
  367. if(pSW->uTQHz.bFlag.bHz && printf_Pro_TQHz)
  368. {
  369. if(!FUN_ALL_EN(sw))
  370. rt_printf("保护硬件压板条件不满足\r\n");
  371. if(!bQD)
  372. {
  373. if(!bDa)
  374. rt_printf("角差不满足要求\r\n");
  375. else if(!bDu)
  376. rt_printf("压差不满足要求\r\n");
  377. else if(!bDf)
  378. rt_printf("频差 不满足要求\r\n");
  379. else
  380. rt_printf("PT异常! 不满足要求\r\n");
  381. }
  382. //rt_printf("QD=%d %d\r\n",FUN_ALL_EN(sw),pSW->tTQQDTime.boolTrip);
  383. //rt_printf("pt1=%d pt2=%d ang2=%d pt断线=%d:%d\r\n",g_ui[PUB_AC_UAB1].p/65536,g_ui[pRunSet->pt2vol].p/65536,ang2/65536,tPT.uPT1DX.bFlag.bPTYC,tPT.uPT2DX.bFlag.bPTYC);
  384. //rt_printf("pSetA=%d deltaA=%d bQD=%d bMxYY=%d bMxWY=%d bUxYY=%d bUxWY=%d \r\n",pSet->dA_tq_delatA/65536,_AbsL(deltaA)/65536,bQD,bMxYY,bMxWY,bUxYY,bUxWY);
  385. //rt_printf("角差=%d, 压差=%d bDf=%d pSW->uTQHz.bFlag.bQD=%d\r\n\r\n",bDa,bDu,bDf,pSW->uTQHz.bFlag.bQD);
  386. printf_Pro_TQHz=0;
  387. }
  388. if(!pSW->tTQQDTime.boolTrip)
  389. printf_Pro_TQHz=1;
  390. #endif
  391. if(pSW->uTQHz.bFlag.bHz)
  392. {
  393. if (!pSW->uTQHz.bFlag.bEvent)
  394. {
  395. if(!pR->uRmtSW.bHandHz)
  396. {
  397. pR->uRmtSW.bHandHz_fa = true;
  398. }
  399. sw_do(sw,SW_DO_YKH,SW_DO_TYPE_ON); //合环合闸开出遥控出口
  400. sw_do(sw,SW_DO_HZ,SW_DO_TYPE_ON); //合环合闸开出遥控出口
  401. soe_record_ev(EV_TQHZ+sw*EV_SW_NUM, 1, 0,0,0 );
  402. pSW->uTQHz.bFlag.bEvent = true;
  403. }
  404. }
  405. else
  406. {
  407. if (pSW->uTQHz.bFlag.bEvent)
  408. {
  409. soe_record_ev(EV_TQHZ+sw*EV_SW_NUM, 0, 0,0,0 );
  410. pSW->uTQHz.bFlag.bEvent = false;
  411. ResetTR(&pSW->tTQTime);
  412. }
  413. }
  414. }
  415. }
  416. //手动操作同期合闸检测
  417. void Pro_TQBS(int sw,DWORD dStep)
  418. {
  419. bool bQD,bTQ=false;
  420. TRELAY_T *pR=&g_tRelay[sw];
  421. //TTQHZ_T *pSW = &pR->tTQHz;
  422. TSETSW *pSet = &pRunSet->tSwSet[sw];
  423. // 合环合闸
  424. long deltaA;
  425. bool bMxYY,bMxWY,bUxYY,bUxWY,bDa,bDu,bDf;
  426. qs16 ang1=0,ang2=0;
  427. if(pRunSet->pt2vol==PUB_AC_UAB1)ang2=0;
  428. else if(pRunSet->pt2vol==PUB_AC_UBC1)ang2=-120*65536;
  429. else if(pRunSet->pt2vol==PUB_AC_UCA1)ang2=120*65536;
  430. else if(pRunSet->pt2vol==PUB_AC_UAB2)ang2=0;
  431. else if(pRunSet->pt2vol==PUB_AC_UBC2)ang2=-120*65536;
  432. else if(pRunSet->pt2vol==PUB_AC_UCA2)ang2=120*65536;
  433. bMxYY = OverRelay(g_sw_pub.m2_max[2], pSet->dU_chz_yy,pSet->dU_chz_yy,false);
  434. bMxWY = LowRelay(g_sw_pub.m2_max[2], pSet->dU_chz_wy,pSet->dU_chz_wy,false);
  435. bUxYY = OverRelay(g_ui[pRunSet->pt2vol].m2[0], pSet->dU_chz_yy,pSet->dU_chz_yy,false);
  436. bUxWY = LowRelay(g_ui[pRunSet->pt2vol].m2[0], pSet->dU_chz_wy,pSet->dU_chz_wy,false);
  437. deltaA = _AbsL((g_ui[PUB_AC_UAB1].p -ang1)- (g_ui[pRunSet->pt2vol].p-ang2));
  438. bDa=(((_AbsL(deltaA) < pSet->dA_tq_delatA)?true:false)||(pSet->dA_tq_delatA==0)); //角差满足要求,角差为零,不判角差
  439. bDu=((_AbsL(g_ui[PUB_AC_UAB1].fz -g_ui[pRunSet->pt2vol].fz)<pSet->dU_tq_deltaU)?true:false)||(pSet->dU_tq_deltaU==0); //压差满足要求
  440. bDf= ((_AbsL(g_sw_pub.ac_in[PUB_AC_IN_F1] - g_sw_pub.ac_in[PUB_AC_IN_F2])<pSet->dF_tq_deltaF)?true:false)||(pSet->dF_tq_deltaF==0);//频差
  441. bQD=((bDa&&bDu&&bDf&&bMxYY&&bUxYY&&(!tPT.uPT1DX.bFlag.bPTYC)&&(!tPT.uPT2DX.bFlag.bPTYC))
  442. ||(bMxWY&&(!tPT.uPT1DX.bFlag.bPTYC))
  443. ||(bUxWY&&(!tPT.uPT2DX.bFlag.bPTYC))); //压差,角差,频差满足要求,或有一侧无压
  444. bTQ = (!TYTQ_ALL_EN(sw)) && !bQD; // 合环合闸投入
  445. if(bTQ)
  446. sw_do(sw,SW_DO_TQBS,SW_DO_TYPE_ON);//不同期
  447. else
  448. sw_do(sw,SW_DO_TQBS,SW_DO_TYPE_OFF);//同期
  449. }
  450. enum
  451. {
  452. HC_UAB1=0,
  453. HC_UBC1,
  454. HC_UCA1,
  455. HC_UAB2,
  456. HC_UBC2,
  457. HC_UCA2,
  458. HC_FREQ,
  459. HC_VT,
  460. HC_FT,
  461. HC_NUMS,
  462. };
  463. DWORD dhcbsBuf[32][HC_NUMS]; // 滑差闭锁缓冲区,含频率和两组电压
  464. WORD whcCnt; //滑差缓冲区指针
  465. DWORD dTcounterrem;
  466. void hcbs_init(void)
  467. {
  468. int i;
  469. whcCnt=0; //滑差电压缓冲区指针
  470. for(i=0;i<32;i++)
  471. {
  472. int j;
  473. DWORD v=(DWORD)(100.0*pRunSet->dKU[PUB_AC_UAB1]/256);
  474. for(j=HC_UAB1;j<=HC_UCA2;j++)
  475. {
  476. dhcbsBuf[i][j]=v;
  477. }
  478. dhcbsBuf[i][HC_FREQ] =50<<16; //频率缓冲区: 频率,频率刷新时刻
  479. dhcbsBuf[i][HC_VT] =0;
  480. dhcbsBuf[i][HC_FT] =0;
  481. }
  482. }
  483. void hcbs_dataset(void)
  484. {
  485. whcCnt = ( whcCnt + 1 ) & 0x1f;
  486. dhcbsBuf[whcCnt][HC_UAB1] = g_ui[PUB_AC_UAB1].fz;
  487. dhcbsBuf[whcCnt][HC_UBC1] = g_ui[PUB_AC_UBC1].fz;
  488. dhcbsBuf[whcCnt][HC_UCA1] = g_ui[PUB_AC_UCA1].fz;
  489. dhcbsBuf[whcCnt][HC_UAB2] = g_ui[PUB_AC_UAB2].fz;
  490. dhcbsBuf[whcCnt][HC_UBC2] = g_ui[PUB_AC_UBC2].fz;
  491. dhcbsBuf[whcCnt][HC_UCA2] = g_ui[PUB_AC_UCA2].fz;
  492. dhcbsBuf[whcCnt][HC_FREQ] = freq_get(0)*65536;
  493. dhcbsBuf[whcCnt][HC_VT] =dTcounterrem;
  494. dhcbsBuf[whcCnt][HC_FT] =dTcounterrem;
  495. }
  496. bool hcbs_vol(int sw,int type) //电压滑差判断
  497. {
  498. long lTsubV;
  499. long lDeltaVol;
  500. TSETSW *pSet = &pRunSet->tSwSet[sw];
  501. lTsubV = dhcbsBuf[ whcCnt ][ HC_VT ] //获取当前时刻
  502. - dhcbsBuf[ ( whcCnt - 15 ) & 0x1f ][ HC_VT ]; //获取15次软件中断前采样时刻
  503. if(lTsubV <= 0 )
  504. {
  505. return( false );
  506. }
  507. lDeltaVol = dhcbsBuf[ ( whcCnt - 15 ) & 0x1f ][type] //获取当前采样
  508. - dhcbsBuf[ whcCnt ][type]; //获取15*5MS前电压
  509. if( lDeltaVol < 0 )
  510. {
  511. return false;
  512. }
  513. #if 0 //调试信息
  514. if(type==HC_UAB1)
  515. {
  516. float fku=pRunSet->dKU[PUB_AC_UAB1]/256.0;
  517. if(g_ui[PUB_AC_UAB1].fz<60*fku&&g_ui[PUB_AC_UAB1].fz>50*fku&&(lTsubV > 20) )
  518. {
  519. rt_printf("\r\n hc=%.2f %d %d %d %d \r\n",lDeltaVol*1600/lTsubV/fku,lDeltaVol,lTsubV,dhcbsBuf[ ( whcCnt - 15 ) & 0x1f ][type],dhcbsBuf[ whcCnt ][type]);
  520. g_print_101=0;
  521. }
  522. }
  523. #endif
  524. if( ((lDeltaVol * 1600) > ((long)pSet->dhcbs_u * lTsubV)) && (lTsubV > 20) )
  525. {
  526. return true;
  527. }
  528. return false;
  529. }
  530. bool hcbs_freq(int sw) //频率滑差判断
  531. {
  532. long lTsub;
  533. long lDeltaF;
  534. TSETSW *pSet = &pRunSet->tSwSet[sw];
  535. lTsub = dhcbsBuf[ ( whcCnt ) & 0x1f ][HC_FT] //获取当前频率采样时刻
  536. - dhcbsBuf[ ( whcCnt - 4 ) & 0x1f ][HC_FT]; //获取5周前频率采样时刻
  537. if( lTsub < 0 )
  538. {
  539. return( false );
  540. }
  541. lDeltaF = dhcbsBuf[ ( whcCnt - 4 ) & 0x1f ][HC_FREQ] //获取5周频率采样
  542. - dhcbsBuf[ whcCnt & 0x1f ][HC_FREQ]; //获取当前频率采样 ΔF = |f - fm|;
  543. if( lDeltaF < 0 )
  544. {
  545. return false;
  546. }
  547. //if( lDeltaF * 1600 > pRunSet->dDP_DELTAF * lTsub )
  548. if( lDeltaF * 400 > (( (long)(pSet->dhcbs_hz) * lTsub )/4 ))
  549. {
  550. return true ; //滑差闭锁确认
  551. }
  552. return false;
  553. }
  554. //获取电压通道信息
  555. static int get_vol_index(int ac_index)
  556. {
  557. if(PUB_AC_UAB1==ac_index || PUB_AC_UBC1==ac_index || PUB_AC_UCA1==ac_index)
  558. if(g_equ_config_ac[0].type-1 == PUB_AC_UAB2)
  559. return (PUB_AC_UAB2+(ac_index-PUB_AC_UAB1));
  560. if(PUB_AC_UA1==ac_index || PUB_AC_UB1==ac_index || PUB_AC_UC1==ac_index)
  561. if(g_equ_config_ac[0].type-1 == PUB_AC_UA2)
  562. return (PUB_AC_UA2+(ac_index-PUB_AC_UA1));
  563. return ac_index;
  564. }
  565. #define IS_VOL_CHANNEL_TYPE (g_equ_config_ac[0].type-1==PUB_AC_UAB2 || g_equ_config_ac[0].type-1==PUB_AC_UA2)
  566. void vol_DYJL(int sw,DWORD dStep) // 电压解列
  567. {
  568. bool bQDD1,bQDD2;
  569. TRELAY_T *pR=&g_tRelay[sw];
  570. TJL_T*pJL=&pR->tDYJL;
  571. TSWST *pSWST =&pR->tSWST;
  572. TSETSW *pSet = &pRunSet->tSwSet[sw];
  573. bool bhcbs;
  574. /***********启动 **********************************/
  575. if(IS_VOL_CHANNEL_TYPE)
  576. bQDD1 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_jl_ggdy,pSet->dU_jl_ggdy_fh,pJL->sta.bFlag.bQD_H);
  577. else
  578. bQDD1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_jl_ggdy,pSet->dU_jl_ggdy_fh,pJL->sta.bFlag.bQD_H);
  579. pJL->sta.bFlag.bQD_H = SOFE_AUTO_EN(sw)
  580. && pSet->bTT_jl_dy//投退字
  581. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  582. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  583. &&bQDD1;
  584. /***********过高压分闸*********************************/
  585. RunTR(&pJL->tHighTime, pJL->sta.bFlag.bQD_H, dStep);
  586. pJL->sta.bFlag.bTz_H = pJL->tHighTime.boolTrip;
  587. /************事件记录及出口****************************/
  588. if(pJL->sta.bFlag.bTz_H)
  589. {
  590. if(soe_check(EV_GGDY_TZ+sw*EV_SW_NUM)==false) //
  591. {
  592. DWORD Uab,Ubc,Uca;
  593. Uab = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UAB1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UAB1)]);
  594. Ubc = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UBC1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UBC1)]);
  595. Uca = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UCA1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UCA1)]);
  596. soe_record_ev( EV_GGDY_TZ+sw*EV_SW_NUM, 1, Uab,Ubc,Uca );
  597. pJL->bLed= true;
  598. }
  599. }
  600. else
  601. {
  602. if(soe_check(EV_GGDY_TZ+sw*EV_SW_NUM)==true) //
  603. {
  604. soe_record_ev( EV_GGDY_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  605. }
  606. }
  607. if(IS_VOL_CHANNEL_TYPE)
  608. bQDD2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_jl_gdy,pSet->dU_jl_gdy_fh,pJL->sta.bFlag.bQD_G);
  609. else
  610. bQDD2 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_jl_gdy,pSet->dU_jl_gdy_fh,pJL->sta.bFlag.bQD_G);
  611. pJL->sta.bFlag.bQD_G = SOFE_AUTO_EN(sw)
  612. && pSet->bTT_jl_dy//投退字
  613. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  614. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  615. &&(!bQDD1&&bQDD2);
  616. /***********过压分闸*********************************/
  617. RunTR(&pJL->tGdyTime, pJL->sta.bFlag.bQD_G, dStep);
  618. pJL->sta.bFlag.bTz_G = pJL->tGdyTime.boolTrip;
  619. /************事件记录及出口****************************/
  620. if(pJL->sta.bFlag.bTz_G)
  621. {
  622. if(soe_check(EV_GDY_TZ+sw*EV_SW_NUM)==false) //
  623. {
  624. DWORD Uab,Ubc,Uca;
  625. Uab = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UAB1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UAB1)]);
  626. Ubc = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UBC1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UBC1)]);
  627. Uca = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UCA1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UCA1)]);
  628. soe_record_ev( EV_GDY_TZ+sw*EV_SW_NUM, 1, Uab,Ubc,Uca );
  629. pJL->bLed= true;
  630. }
  631. }
  632. else
  633. {
  634. if(soe_check(EV_GDY_TZ+sw*EV_SW_NUM)==true) //
  635. {
  636. soe_record_ev( EV_GDY_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  637. }
  638. }
  639. if(IS_VOL_CHANNEL_TYPE)
  640. {
  641. bQDD1 = LowRelay(g_sw_pub.m2_max[3], pSet->dU_jl_gddy,pSet->dU_jl_gddy_fh,pJL->sta.bFlag.bQD_L);
  642. }
  643. else
  644. {
  645. bQDD1 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_jl_gddy,pSet->dU_jl_gddy_fh,pJL->sta.bFlag.bQD_L);
  646. }
  647. if(IS_VOL_CHANNEL_TYPE)
  648. {
  649. bhcbs=pSet ->bTT_hcbs_dy
  650. &&(hcbs_vol(sw,HC_UAB2)||hcbs_vol(sw,HC_UBC2)||hcbs_vol(sw,HC_UCA2));
  651. }
  652. else
  653. {
  654. bhcbs=pSet ->bTT_hcbs_dy
  655. &&(hcbs_vol(sw,HC_UAB1)||hcbs_vol(sw,HC_UBC1)||hcbs_vol(sw,HC_UCA1));
  656. }
  657. pJL->sta.bFlag.bQD_L = SOFE_AUTO_EN(sw)
  658. && pSet->bTT_jl_dy//投退字
  659. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  660. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  661. &&pR->tSWST.uSWST.bFlag.bCYY //曾有压
  662. &&(!tPT.uPT1DX.bFlag.bPTYC) //无 PT异常
  663. &&bQDD1;
  664. RunTR(&pJL->thcbs1_0ms_100ms, pJL->sta.bFlag.bQD_L, dStep);
  665. pJL->sta.bFlag.bhcbs1=(pJL->thcbs1_0ms_100ms.boolTrip&&pJL->sta.bFlag.bhcbs1)
  666. ||bhcbs;
  667. /***********过低压分闸*********************************/
  668. RunTR(&pJL->tLowTime, pJL->sta.bFlag.bQD_L&&(!pJL->sta.bFlag.bhcbs1), dStep);
  669. pJL->sta.bFlag.bTz_L = pJL->tLowTime.boolTrip;
  670. /************事件记录及出口****************************/
  671. if(pJL->sta.bFlag.bTz_L)
  672. {
  673. if(soe_check(EV_GDDY_TZ+sw*EV_SW_NUM)==false) //
  674. {
  675. DWORD Uab,Ubc,Uca;
  676. Uab = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UAB1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UAB1)]);
  677. Ubc = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UBC1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UBC1)]);
  678. Uca = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UCA1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UCA1)]);
  679. soe_record_ev( EV_GDDY_TZ+sw*EV_SW_NUM, 1, Uab,Ubc,Uca );
  680. pJL->bLed= true;
  681. pR->tSWST.uSWST.bFlag.bCYY=false;
  682. }
  683. }
  684. else
  685. {
  686. if(soe_check(EV_GDDY_TZ+sw*EV_SW_NUM)==true) //
  687. {
  688. soe_record_ev( EV_GDDY_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  689. }
  690. }
  691. if(IS_VOL_CHANNEL_TYPE)
  692. bQDD2 = LowRelay(g_sw_pub.m2_max[3], pSet->dU_jl_ddy,pSet->dU_jl_ddy_fh,pJL->sta.bFlag.bQD_D);
  693. else
  694. bQDD2 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_jl_ddy,pSet->dU_jl_ddy_fh,pJL->sta.bFlag.bQD_D);
  695. pJL->sta.bFlag.bQD_D = SOFE_AUTO_EN(sw)
  696. && pSet->bTT_jl_dy//投退字
  697. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  698. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  699. &&pR->tSWST.uSWST.bFlag.bCYY //曾有压
  700. &&(!tPT.uPT1DX.bFlag.bPTYC) //无 PT异常
  701. &&(!bQDD1&&bQDD2);
  702. RunTR(&pJL->thcbs2_0ms_100ms, pJL->sta.bFlag.bQD_D, dStep);
  703. pJL->sta.bFlag.bhcbs2=(pJL->thcbs2_0ms_100ms.boolTrip&&pJL->sta.bFlag.bhcbs2)
  704. ||bhcbs;
  705. /***********低压分闸*********************************/
  706. RunTR(&pJL->tDdyTime, pJL->sta.bFlag.bQD_D&&(!pJL->sta.bFlag.bhcbs2), dStep);
  707. pJL->sta.bFlag.bTz_D = pJL->tDdyTime.boolTrip;
  708. /************事件记录及出口****************************/
  709. if(pJL->sta.bFlag.bTz_D)
  710. {
  711. if(soe_check(EV_DDY_TZ+sw*EV_SW_NUM)==false) //
  712. {
  713. DWORD Uab,Ubc,Uca;
  714. Uab = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UAB1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UAB1)]);
  715. Ubc = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UBC1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UBC1)]);
  716. Uca = _Mul_Div_U(sqrt_32fix(g_ui[get_vol_index(PUB_AC_UCA1)].m2[0]), 256, pRunSet->dKU[get_vol_index(PUB_AC_UCA1)]);
  717. soe_record_ev( EV_DDY_TZ+sw*EV_SW_NUM, 1, Uab,Ubc,Uca );
  718. pJL->bLed= true;
  719. pR->tSWST.uSWST.bFlag.bCYY=false;
  720. }
  721. }
  722. else
  723. {
  724. if(soe_check(EV_DDY_TZ+sw*EV_SW_NUM)==true) //
  725. {
  726. soe_record_ev( EV_DDY_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  727. }
  728. }
  729. pJL->sta.bFlag.bTz =pJL->sta.bFlag.bTz_H||pJL->sta.bFlag.bTz_L||pJL->sta.bFlag.bTz_G||pJL->sta.bFlag.bTz_D;
  730. pJL->sta.bFlag.bQD=pJL->sta.bFlag.bQD_H||pJL->sta.bFlag.bQD_L||pJL->sta.bFlag.bQD_G||pJL->sta.bFlag.bQD_D;
  731. }
  732. void vol_PLJL(int sw,DWORD dStep) // 频率解列
  733. {
  734. bool bQDD1,bQDD2;
  735. TRELAY_T *pR=&g_tRelay[sw];
  736. TJL_T*pJL=&pR->tPLJL;
  737. TSWST *pSWST =&pR->tSWST;
  738. TSETSW *pSet = &pRunSet->tSwSet[sw];
  739. DWORD freq=freq_get(0)*65536;
  740. bool bhcbs;
  741. bhcbs=pSet ->bTT_hcbs_hz&&hcbs_freq(sw);
  742. /***********频率过低启动 **********************************/
  743. bQDD1 = LowRelay(freq, pSet->dU_jl_lowhz,pSet->dU_jl_lowhz_fh,pJL->sta.bFlag.bQD_L);
  744. pJL->sta.bFlag.bQD_L = SOFE_AUTO_EN(sw)
  745. && pSet->bTT_jl_hz//投退字
  746. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  747. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  748. &&(freq>44*65536) //频率大于44hz,不然认为无频率
  749. &&(bQDD1);
  750. RunTR(&pJL->thcbs1_0ms_100ms, pJL->sta.bFlag.bQD_L, dStep);
  751. pJL->sta.bFlag.bhcbs1=(pJL->thcbs1_0ms_100ms.boolTrip&&pJL->sta.bFlag.bhcbs1)
  752. ||bhcbs;
  753. /***********过低频解列*********************************/
  754. //RunTR(&pJL->tLowTime, pJL->sta.bFlag.bQD_L, dStep);
  755. RunTR2(&pJL->tLowTime, pJL->sta.bFlag.bQD_L&&(!pJL->sta.bFlag.bhcbs1), dStep);
  756. pJL->sta.bFlag.bTz_L = pJL->tLowTime.boolTrip;
  757. /************事件记录及出口****************************/
  758. if(pJL->sta.bFlag.bTz_L)
  759. {
  760. if(soe_check(EV_LOWPL_TZ+sw*EV_SW_NUM)==false) //
  761. {
  762. soe_record_ev( EV_LOWPL_TZ+sw*EV_SW_NUM, 1, freq,0,0 );
  763. pJL->bLed= true;
  764. }
  765. }
  766. else
  767. {
  768. if(soe_check(EV_LOWPL_TZ+sw*EV_SW_NUM)==true) //
  769. {
  770. soe_record_ev( EV_LOWPL_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  771. }
  772. }
  773. /***********低频解列*********************************/
  774. bQDD2 = LowRelay(freq, pSet->dU_jl_dhz,pSet->dU_jl_dhz_fh,pJL->sta.bFlag.bQD_D);
  775. pJL->sta.bFlag.bQD_D= SOFE_AUTO_EN(sw)
  776. && pSet->bTT_jl_hz//投退字
  777. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  778. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  779. &&(!bQDD1&&bQDD2);
  780. RunTR(&pJL->thcbs2_0ms_100ms, pJL->sta.bFlag.bQD_D, dStep);
  781. pJL->sta.bFlag.bhcbs2=(pJL->thcbs2_0ms_100ms.boolTrip&&pJL->sta.bFlag.bhcbs2)
  782. ||bhcbs;
  783. RunTR(&pJL->tDhzTime, pJL->sta.bFlag.bQD_D&&(!pJL->sta.bFlag.bhcbs2), dStep);
  784. pJL->sta.bFlag.bTz_D = pJL->tDhzTime.boolTrip;
  785. /************事件记录及出口****************************/
  786. if(pJL->sta.bFlag.bTz_D)
  787. {
  788. if(soe_check(EV_DPL_TZ+sw*EV_SW_NUM)==false) //
  789. {
  790. soe_record_ev( EV_DPL_TZ+sw*EV_SW_NUM, 1, freq,0,0 );
  791. pJL->bLed= true;
  792. }
  793. }
  794. else
  795. {
  796. if(soe_check(EV_DPL_TZ+sw*EV_SW_NUM)==true) //
  797. {
  798. soe_record_ev( EV_DPL_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  799. }
  800. }
  801. /***********高频解列*********************************/
  802. bQDD1 = OverRelay(freq, pSet->dU_jl_ghz,pSet->dU_jl_ghz_fh,pJL->sta.bFlag.bQD_H);
  803. pJL->sta.bFlag.bQD_H= SOFE_AUTO_EN(sw)
  804. && pSet->bTT_jl_hz//投退字
  805. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  806. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  807. &&bQDD1;
  808. RunTR(&pJL->tHighTime, pJL->sta.bFlag.bQD_H, dStep);
  809. pJL->sta.bFlag.bTz_H = pJL->tHighTime.boolTrip;
  810. /************事件记录及出口****************************/
  811. if(pJL->sta.bFlag.bTz_H)
  812. {
  813. if(soe_check(EV_GPL_TZ+sw*EV_SW_NUM)==false) //
  814. {
  815. soe_record_ev( EV_GPL_TZ+sw*EV_SW_NUM, 1, freq,0,0);
  816. pJL->bLed= true;
  817. }
  818. }
  819. else
  820. {
  821. if(soe_check(EV_GPL_TZ+sw*EV_SW_NUM)==true) //
  822. {
  823. soe_record_ev( EV_GPL_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  824. }
  825. }
  826. pJL->sta.bFlag.bTz=pJL->sta.bFlag.bTz_H||pJL->sta.bFlag.bTz_L||pJL->sta.bFlag.bTz_D;
  827. pJL->sta.bFlag.bQD=pJL->sta.bFlag.bQD_H||pJL->sta.bFlag.bQD_L||pJL->sta.bFlag.bQD_D;
  828. }
  829. TPTCHECK_T tPT;
  830. #define ANG_PHASEYC (15*65536)
  831. void PT_Check(DWORD dStep)
  832. {
  833. bool bsxyl=false;
  834. /***********PT 异常判断**********************************/
  835. {
  836. int sw;
  837. DWORD Umax,Umin;
  838. bool bCheck=false;
  839. bool bpt1check=false;
  840. bool bpt2check=false;
  841. for(sw=0;sw<SWITCH_NUM_MAX;sw++)
  842. {
  843. bool bptdx;
  844. bsxyl|=(g_sw[sw].m2_max>pRunSet->dIWL_SQR[sw]); //三相无流
  845. bptdx=((BH_ALL_EN(sw)&&pRunSet->tSwSet[sw].bTT_bh_ptdx)
  846. ||(FA_ALL_EN(sw)&&pRunSet->tSwSet[sw].bTT_fa_ptdx));
  847. bpt1check|=bptdx;
  848. bpt2check|=(bptdx&&(pRunSet->a_side_pt_type));// pt2 vv接线
  849. bpt1check&=pRunSet->tSwSet[sw].bTT_PT1_ll_check;
  850. bpt2check&=pRunSet->tSwSet[sw].bTT_PT2_ll_check;
  851. }
  852. /*********PT1断线判断***************************/
  853. //判断电压配置,只有在配置了Ua Ub Uc 或Uab Ubc Uca后,才进行断线检查
  854. bCheck=(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA1] != INDEX_INVALLID)
  855. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB1] != INDEX_INVALLID)
  856. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC1] != INDEX_INVALLID))||
  857. (((short)g_sw_pub.ac_cfg_index[PUB_AC_UAB1] != INDEX_INVALLID)
  858. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UBC1] != INDEX_INVALLID));
  859. Umax=g_sw_pub.m2_max[2];
  860. Umin=g_sw_pub.m2_min[2];
  861. #ifdef PRO_PT_LL_NC
  862. tPT.uPT1DX.bFlag.bQD=(((Umax<pRunSet->dVOL16V_SQR)&&((((FA_ALL_EN(0) && !g_tRelay[0].run_stu.fa_ls) || BH_ALL_EN(0)) && bsxyl )//三相断线:无压有流(非Fa联络)
  863. ||(FA_ALL_EN(0) && g_tRelay[0].run_stu.fa_ls))) //三相断线:三相断线(Fa联络)
  864. ||((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  865. ||((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  866. &&bCheck
  867. &&bpt1check;
  868. #else
  869. tPT.uPT1DX.bFlag.bQD=(((Umax<pRunSet->dVOL16V_SQR)&&(bsxyl)) //三相断线,无压有流
  870. ||((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  871. ||((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  872. &&bCheck
  873. &&bpt1check;
  874. #endif
  875. RunTR(&tPT.tTPT1DXTime, tPT.uPT1DX.bFlag.bQD, dStep);
  876. if(tPT.tTPT1DXTime.boolTrip)
  877. {
  878. if(!tPT.uPT1DX.bFlag.bEvent)
  879. {
  880. DWORD Uab,Ubc,Uca;
  881. Uab = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UAB1].m2[0]), 256, g_ui[PUB_AC_UAB1].m2_factor_k);
  882. Ubc = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UBC1].m2[0]), 256, g_ui[PUB_AC_UBC1].m2_factor_k);
  883. Uca = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UCA1].m2[0]), 256, g_ui[PUB_AC_UCA1 ].m2_factor_k);
  884. soe_record_ev(EV_PT1ERR,1, Uab,Ubc,Uca);
  885. tPT.uPT1DX.bFlag.bEvent=true;
  886. tPT.uPT1DX.bFlag.bPTYC=true;
  887. }
  888. }
  889. else
  890. {
  891. {
  892. if(tPT.uPT1DX.bFlag.bEvent)
  893. {
  894. soe_record_ev(EV_PT1ERR,0, 0,0,0 );
  895. tPT.uPT1DX.bFlag.bEvent=false;
  896. tPT.uPT1DX.bFlag.bPTYC=false;
  897. }
  898. }
  899. }
  900. //PT1相序检查
  901. {
  902. bool bok;
  903. u32 da,db,dc;
  904. if(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA1] != INDEX_INVALLID)
  905. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB1] != INDEX_INVALLID)
  906. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC1] != INDEX_INVALLID)) // 相电压接线
  907. {
  908. da = _AbsL(g_ui[PUB_AC_UA1].p - g_ui[PUB_AC_UB1].p-120*65536);
  909. db = _AbsL(g_ui[PUB_AC_UB1].p - g_ui[PUB_AC_UC1].p+240*65536);
  910. dc = _AbsL(g_ui[PUB_AC_UA1].p - g_ui[PUB_AC_UC1].p+120*65536);
  911. Umin=g_sw_pub.m2_min[0];
  912. }
  913. else //线电压接线
  914. {
  915. da = _AbsL(g_ui[PUB_AC_UAB1].p - g_ui[PUB_AC_UBC1].p-120*65536);
  916. db = _AbsL(g_ui[PUB_AC_UBC1].p - g_ui[PUB_AC_UCA1].p+240*65536);
  917. dc = _AbsL(g_ui[PUB_AC_UAB1].p - g_ui[PUB_AC_UCA1].p+120*65536);
  918. Umin=g_sw_pub.m2_min[2];
  919. }
  920. bok=pRunSet->bTT_CheckPhase
  921. &&(Umin>pRunSet->dVOL16V_SQR) //最小电压大于16V
  922. &&bCheck
  923. &&((da>ANG_PHASEYC)||(db>ANG_PHASEYC)||(dc>ANG_PHASEYC)); //三相电压角度差15度
  924. RunTR(&tPT.tTPT1XXYC, bok, dStep);
  925. if(tPT.tTPT1XXYC.boolTrip)
  926. {
  927. if(soe_check(EV_PT1XXYC)==false) //
  928. {
  929. soe_record_ev(EV_PT1XXYC, 1, 0,0,0 );
  930. }
  931. }
  932. else
  933. {
  934. if(soe_check(EV_PT1XXYC)==true) //
  935. {
  936. soe_record_ev(EV_PT1XXYC, 0, 0,0,0 );
  937. }
  938. }
  939. }
  940. /*********PT2断线判断***************************/
  941. Umax=g_sw_pub.m2_max[3];
  942. Umin=g_sw_pub.m2_min[3];
  943. //判断电压配置,只有在配置了Ua Ub Uc 或Uab Ubc Uca后,才进行断线检查
  944. bCheck=(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA2] != INDEX_INVALLID)
  945. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB2] != INDEX_INVALLID)
  946. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC2] != INDEX_INVALLID))
  947. #ifdef FUNC_PT_ERR_SINGLE
  948. ||(((short)g_sw_pub.ac_cfg_index[PUB_AC_UAB2] != INDEX_INVALLID)
  949. || ((short)g_sw_pub.ac_cfg_index[PUB_AC_UBC2] != INDEX_INVALLID)
  950. || ((short)g_sw_pub.ac_cfg_index[PUB_AC_UCA2] != INDEX_INVALLID))
  951. #else
  952. ||(((short)g_sw_pub.ac_cfg_index[PUB_AC_UAB2] != INDEX_INVALLID)
  953. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UBC2] != INDEX_INVALLID))
  954. #endif
  955. ;
  956. #ifdef PRO_PT_LL_NC
  957. tPT.uPT2DX.bFlag.bQD=(((Umax<pRunSet->dVOL16V_SQR)&&((((FA_ALL_EN(0) && !g_tRelay[0].run_stu.fa_ls) || BH_ALL_EN(0)) && bsxyl )//三相断线:无压有流(非Fa联络)
  958. ||(FA_ALL_EN(0) && g_tRelay[0].run_stu.fa_ls))) //三相断线:三相断线(Fa联络)
  959. ||((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  960. ||((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  961. &&bCheck
  962. &&bpt2check;
  963. #else
  964. tPT.uPT2DX.bFlag.bQD=(((Umax<pRunSet->dVOL16V_SQR)&&(bsxyl)) //三相断线,无压有流
  965. |((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  966. |((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  967. &&bCheck
  968. &&bpt2check;
  969. #endif
  970. RunTR(&tPT.tTPT2DXTime, tPT.uPT2DX.bFlag.bQD, dStep);
  971. if(tPT.tTPT2DXTime.boolTrip)
  972. {
  973. if(!tPT.uPT2DX.bFlag.bEvent)
  974. {
  975. DWORD Uab,Ubc,Uca;
  976. Uab = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UAB2].m2[0]), 256, g_ui[PUB_AC_UAB2].m2_factor_k);
  977. Ubc = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UBC2].m2[0]), 256, g_ui[PUB_AC_UBC2].m2_factor_k);
  978. Uca = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UCA2].m2[0]), 256, g_ui[PUB_AC_UCA2].m2_factor_k);
  979. soe_record_ev(EV_PT2ERR,1, Uab,Ubc,Uca );
  980. tPT.uPT2DX.bFlag.bEvent=true;
  981. tPT.uPT2DX.bFlag.bPTYC=true;
  982. }
  983. }
  984. else
  985. {
  986. {
  987. if(tPT.uPT2DX.bFlag.bEvent)
  988. {
  989. soe_record_ev(EV_PT2ERR,0, 0,0,0 );
  990. tPT.uPT2DX.bFlag.bEvent=false;
  991. tPT.uPT2DX.bFlag.bPTYC=false;
  992. }
  993. }
  994. }
  995. //PT2相序检查
  996. {
  997. bool bok;
  998. u32 da,db,dc;
  999. if(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA2] != INDEX_INVALLID)
  1000. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB2] != INDEX_INVALLID)
  1001. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC2] != INDEX_INVALLID)) // 相电压接线
  1002. {
  1003. da = _AbsL(g_ui[PUB_AC_UA2].p - g_ui[PUB_AC_UB2].p-120*65536);
  1004. db = _AbsL(g_ui[PUB_AC_UB2].p - g_ui[PUB_AC_UC2].p+240*65536);
  1005. dc = _AbsL(g_ui[PUB_AC_UA2].p - g_ui[PUB_AC_UC2].p+120*65536);
  1006. Umin=g_sw_pub.m2_min[1];
  1007. }
  1008. else //线电压接线
  1009. {
  1010. da = _AbsL(g_ui[PUB_AC_UAB2].p - g_ui[PUB_AC_UBC2].p-120*65536);
  1011. db = _AbsL(g_ui[PUB_AC_UBC2].p - g_ui[PUB_AC_UCA2].p+240*65536);
  1012. dc = _AbsL(g_ui[PUB_AC_UAB2].p - g_ui[PUB_AC_UCA2].p+120*65536);
  1013. Umin=g_sw_pub.m2_min[3];
  1014. }
  1015. bok=pRunSet->bTT_CheckPhase
  1016. &&(Umin>pRunSet->dVOL16V_SQR) //最小电压大于16V
  1017. &&bCheck
  1018. &&((da>ANG_PHASEYC)||(db>ANG_PHASEYC)||(dc>ANG_PHASEYC)); //三相电压角度差15度
  1019. RunTR(&tPT.tTPT2XXYC, bok, dStep);
  1020. if(tPT.tTPT2XXYC.boolTrip)
  1021. {
  1022. if(soe_check(EV_PT2XXYC)==false) //
  1023. {
  1024. soe_record_ev(EV_PT2XXYC, 1, 0,0,0 );
  1025. }
  1026. }
  1027. else
  1028. {
  1029. if(soe_check(EV_PT2XXYC)==true) //
  1030. {
  1031. soe_record_ev(EV_PT2XXYC, 0, 0,0,0 );
  1032. }
  1033. }
  1034. }
  1035. }
  1036. }
  1037. void FDL_Check(DWORD dStep)
  1038. {
  1039. int i;
  1040. struct equ_config_di *ecd;
  1041. int sw = 0;
  1042. for (i = 0; i < 6; i++) // 非电量跳闸
  1043. {
  1044. bool byx = false;
  1045. TFDL_T *pFDL = &g_tRelay[sw].tFdl[i];
  1046. if ((short)g_sw_pub.di_cfg_index[PUB_DI_FDL1 + i] != INDEX_INVALLID)
  1047. {
  1048. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_FDL1 + i]];
  1049. byx = dido_di_is_on(ecd->slot, ecd->index);
  1050. }
  1051. pFDL->sta.bFlag.bQD = byx && (pRunSet->bTT_FDLGj[i] || pRunSet->bTT_FDLTz[i]);
  1052. RunTR(&pFDL->tFdlTime, pFDL->sta.bFlag.bQD, dStep);
  1053. pFDL->sta.bFlag.bTz = pFDL->tFdlTime.boolTrip && pRunSet->bTT_FDLTz[i];
  1054. pFDL->sta.bFlag.bGj = pFDL->tFdlTime.boolTrip && pRunSet->bTT_FDLGj[i];
  1055. if (pFDL->sta.bFlag.bTz)
  1056. {
  1057. if (soe_check(EV_FDL1_TZ + i) == false)
  1058. {
  1059. soe_record_ev(EV_FDL1_TZ + i, 1, 0, 0, 0);
  1060. }
  1061. }
  1062. else
  1063. {
  1064. if (soe_check(EV_FDL1_TZ + i) == true)
  1065. {
  1066. soe_record_ev(EV_FDL1_TZ + i, 0, 0, 0, 0);
  1067. }
  1068. }
  1069. if (pFDL->sta.bFlag.bGj)
  1070. {
  1071. if (soe_check(EV_FDL1_GJ + i) == false)
  1072. {
  1073. soe_record_ev(EV_FDL1_GJ + i, 1, 0, 0, 0);
  1074. }
  1075. }
  1076. else
  1077. {
  1078. if (soe_check(EV_FDL1_GJ + i) == true)
  1079. {
  1080. soe_record_ev(EV_FDL1_GJ + i, 0, 0, 0, 0);
  1081. }
  1082. }
  1083. }
  1084. }
  1085. void Pro_3U0(int sw,DWORD dStep)
  1086. {
  1087. bool bQDD;
  1088. TRELAY_T *pR=&g_tRelay[sw];
  1089. TU0_T *pSW=&pR->tOVER_U0TZ;
  1090. TSWST *pSWST =&pR->tSWST;
  1091. TSETSW *pSet = &pRunSet->tSwSet[sw];
  1092. DWORD U01 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1093. DWORD U02 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U02].m2[0]), 256, g_ui[PUB_AC_U02].m2_factor_k);
  1094. /***********启动 **********************************/
  1095. bQDD = OverRelay(g_ui[PUB_AC_U01].m2[0] >g_ui[PUB_AC_U02].m2[0] ?g_ui[PUB_AC_U01].m2[0]:g_ui[PUB_AC_U02].m2[0],pSet->dBHOverU0,pSet->dBHOverU0_fh,pSW->uZOV.bFlag.bQD);
  1096. pSW->uZOV.bFlag.bQD = BH_ALL_EN(sw)
  1097. && (pSet->bTT_3U0Tz||pSet->bTT_3U0Gj)//投退字
  1098. //&& pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  1099. && bQDD
  1100. && (!tPT.uPT1DX.bFlag.bPTYC);
  1101. #ifdef EV_GL_STATR
  1102. lx_start_soe_set( pSW->uZOV.bFlag.bQD,sw,EV_U0_STATR);
  1103. #endif
  1104. /***********零序过压分闸*********************************/
  1105. RunTR(&pSW->tZOVTime, pSW->uZOV.bFlag.bQD, dStep);
  1106. pSW->uZOV.bFlag.bTz = pSW->tZOVTime.boolTrip && pSet->bTT_3U0Tz && pSWST->uSWST.bFlag.bHZWZ;
  1107. pSW->uZOV.bFlag.bGJ = pSW->tZOVTime.boolTrip&&pSet->bTT_3U0Gj;
  1108. /************事件记录及出口****************************/
  1109. if(pSW->uZOV.bFlag.bTz)
  1110. {
  1111. if(!pSW->uZOV.bFlag.bEvent)
  1112. {
  1113. soe_record_ev( EV_U0TZ+sw*EV_SW_NUM, 1, U01>U02?U01:U02,0,0 );
  1114. rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD);
  1115. pSW->uZOV.bFlag.bEvent = true;
  1116. pSW->bU0Led = true;
  1117. }
  1118. }
  1119. else
  1120. {
  1121. if(pSW->uZOV.bFlag.bEvent)
  1122. {
  1123. soe_record_ev(EV_U0TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  1124. pSW->uZOV.bFlag.bEvent = false;
  1125. pSW->uZOV.bFlag.bU0Ov = false;
  1126. }
  1127. }
  1128. /************告警记录****************************/
  1129. if(pSW->uZOV.bFlag.bGJ)
  1130. {
  1131. if(!pSW->uZOV.bFlag.bGJEvent)
  1132. {
  1133. soe_record_ev( EV_U0GJ+sw*EV_SW_NUM, 1, U01>U02?U01:U02,0,0 );
  1134. rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD);
  1135. pSW->uZOV.bFlag.bGJEvent = true;
  1136. if(pSW->bU0Led == false)
  1137. {
  1138. pSW->bU0GjLed = true;
  1139. }
  1140. }
  1141. }
  1142. else
  1143. {
  1144. if(pSW->uZOV.bFlag.bGJEvent)
  1145. {
  1146. soe_record_ev(EV_U0GJ+sw*EV_SW_NUM, 0, 0,0,0 );
  1147. pSW->uZOV.bFlag.bGJEvent = false;
  1148. pSW->uZOV.bFlag.bU0Ov = false;
  1149. }
  1150. }
  1151. }
  1152. #ifdef CUSTOMIZE_BZT //备自投
  1153. void vol_lost_tz(int sw, DWORD dStep) // 失压跳闸
  1154. {
  1155. bool bQDD1, bQDD2,pt1cyy,pt2cyy;
  1156. VOL_SET *pSet = &pRunSet->tVolLostSet;
  1157. TVOL_T *pvol = &g_tVolLost;
  1158. DWORD pt1_value,pt2_value;
  1159. TRELAY_T *pR = &g_tRelay[sw];
  1160. UBZT *uBZT = &pR->tBzt.uBZT;
  1161. pt1_value = g_sw_pub.m2_max[2];
  1162. pt2_value = g_sw_pub.m2_max[3];
  1163. pt1cyy = OverRelay(pt1_value, pSet->dUVol, pSet->dUVol,false);
  1164. pt2cyy = OverRelay(pt2_value, pSet->dUVol, pSet->dUVol,false);
  1165. //曾有压
  1166. RunTR(&pvol->tCYYTime, pt1cyy || pt2cyy, dStep);
  1167. pvol->sta.bFlag.bCYY = pvol->tCYYTime.boolTrip || pvol->sta.bFlag.bCYY;
  1168. /***********启动 **********************************/
  1169. bQDD1 = LowRelay(pt1_value, pSet->dUVol, pSet->dUVol_fh, pvol->sta.bFlag.bQD);
  1170. bQDD2 = LowRelay(pt2_value, pSet->dUVol, pSet->dUVol_fh, pvol->sta.bFlag.bQD);
  1171. pvol->sta.bFlag.bQD = bQDD1 && bQDD2 && pvol->sta.bFlag.bCYY && pSet->bTT && pR->tSWST.uSWST.bFlag.b1DLHW;
  1172. if(!pR->tSWST.uSWST.bFlag.b1DLHW)
  1173. pvol->sta.bFlag.bCYY = 0;
  1174. /***********失压分闸*********************************/
  1175. RunTR(&pvol->tQDTime, pvol->sta.bFlag.bQD, dStep);
  1176. pvol->sta.bFlag.bTz = pvol->tQDTime.boolTrip;
  1177. //pvol->sta.bFlag.bGJ = pvol->tQDTime.boolTrip;
  1178. /************事件记录及出口****************************/
  1179. if(pvol->sta.bFlag.bTz)
  1180. {
  1181. pvol->sta.bFlag.bCYY = false;
  1182. if(!pvol->sta.bFlag.bEvent)
  1183. {
  1184. DWORD Us1,Us2;
  1185. Us1 = _Mul_Div_U(sqrt_32fix(pt1_value), 256, pRunSet->dKU[PUB_AC_UAB1]);
  1186. Us2 = _Mul_Div_U(sqrt_32fix(pt2_value), 256, pRunSet->dKU[pRunSet->pt2vol]);
  1187. if(soe_check(EV_SYTZ)==false)
  1188. {
  1189. soe_record_ev(EV_SYTZ, 1, Us1,Us2,0 );
  1190. }
  1191. rcd_start(sw,RECORD_TYPE_XLSY, RECORD_LEN_TZQD); //录波类型:跳闸类
  1192. pvol->sta.bFlag.bEvent = true;
  1193. //pSW->uLostVot.bFlag.bTz=true; //执行跳闸标志
  1194. sw_do(sw,SW_DO_HZ,SW_DO_TYPE_OFF);
  1195. sw_do(sw,SW_DO_BHH,SW_DO_TYPE_OFF);
  1196. sw_do(sw,SW_DO_BHDZ,SW_DO_TYPE_ON);
  1197. sw_do(sw,SW_DO_FZ,SW_DO_TYPE_ON);
  1198. sw_do(sw,SW_DO_BHT,SW_DO_TYPE_ON);
  1199. if(uBZT->bBZT.bZF && pRunSet->tSwSet[sw].bBZT_TT)
  1200. {
  1201. if((g_sw[sw].do_cfg_index[SW_DO_JX1_SY] < g_equ_config->do_num) && (g_sw[sw].do_cfg_index[SW_DO_JX2_SY] == 0xffff))
  1202. {
  1203. sw_do(sw,SW_DO_DL1_FZ,SW_DO_TYPE_ON);
  1204. }
  1205. else if((g_sw[sw].do_cfg_index[SW_DO_JX2_SY] < g_equ_config->do_num) && (g_sw[sw].do_cfg_index[SW_DO_JX1_SY] == 0xffff))
  1206. {
  1207. sw_do(sw,SW_DO_DL2_FZ,SW_DO_TYPE_ON);
  1208. }
  1209. uBZT->bBZT.bSYFZ = 1;
  1210. }
  1211. }
  1212. }
  1213. else
  1214. {
  1215. if(pvol->sta.bFlag.bEvent)
  1216. {
  1217. soe_record_ev(EV_SYTZ, 0, 0,0,0 );
  1218. pvol->sta.bFlag.bEvent = false;
  1219. }
  1220. pvol->sta.bFlag.bTz=false;
  1221. }
  1222. }
  1223. #endif
  1224. #if (0)
  1225. /**************************************************************************
  1226. 函数名称:Pro_U0Tz
  1227. 函数版本:1.00
  1228. 作者: 赵海洋
  1229. 创建日期:2022.2.25
  1230. 函数功能说明:零压跳闸默认检测零压1
  1231. 输入参数:
  1232. 其他输入:
  1233. 输出参数:
  1234. 返回值:
  1235. ***************************************************************************/
  1236. void Pro_U0Tz(int sw,DWORD dStep)
  1237. {
  1238. bool bQDD;
  1239. TRELAY_T *pR=&g_tRelay[sw];
  1240. TVOL_T *pvol = &pR->tU0GZ;
  1241. VOL_SET *pSet = &pRunSet->tSwSet[sw].tU0Set;
  1242. bQDD = OverRelay(g_ui[PUB_AC_U01].m2[0], pSet->dUVol,pSet->dUVol_fh,pvol->sta.bFlag.bQD);
  1243. pvol->sta.bFlag.bQD = ((pSet->bTT || pSet->bTz)&& bQDD);
  1244. if(pvol->sta.bFlag.bQD)
  1245. {
  1246. if(!pvol->sta.bFlag.bQDWave)
  1247. {
  1248. rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD); //录波类型:跳闸类
  1249. pvol->sta.bFlag.bQDWave = true;
  1250. }
  1251. }
  1252. /***********动作*********************************/
  1253. RunTR(&pvol->tQDTime, pvol->sta.bFlag.bQD, dStep);
  1254. if (pSet->bTT)pvol->sta.bFlag.bGj = pvol->tQDTime.boolTrip;
  1255. if (pSet->bTz)pvol->sta.bFlag.bTz = pvol->tQDTime.boolTrip;
  1256. /************事件记录及出口****************************/
  1257. if(pvol->sta.bFlag.bGj)
  1258. {
  1259. if(soe_check(EV_LYGJ+sw*EV_SW_NUM)==false)
  1260. {
  1261. DWORD U0;
  1262. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1263. soe_record_ev(EV_LYGJ+sw*EV_SW_NUM,1, U0,0,0);
  1264. }
  1265. }
  1266. else
  1267. {
  1268. if(soe_check(EV_LYGJ+sw*EV_SW_NUM)==true)
  1269. {
  1270. pvol->sta.bFlag.bQDWave = false;
  1271. soe_record_ev(EV_LYGJ+sw*EV_SW_NUM,0, 0,0,0 );
  1272. }
  1273. }
  1274. if(pvol->sta.bFlag.bTz)
  1275. {
  1276. if(soe_check(EV_LYTZ+sw*EV_SW_NUM)==false)
  1277. {
  1278. DWORD U0;
  1279. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1280. soe_record_ev(EV_LYTZ+sw*EV_SW_NUM,1, U0,0,0);
  1281. }
  1282. }
  1283. else
  1284. {
  1285. if(soe_check(EV_LYTZ+sw*EV_SW_NUM)==true)
  1286. {
  1287. pvol->sta.bFlag.bQDWave = false;
  1288. soe_record_ev(EV_LYTZ+sw*EV_SW_NUM,0, 0,0,0 );
  1289. }
  1290. }
  1291. }
  1292. #endif
  1293. // = ========================= 本文件结束 =============================