vol.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455
  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. soe_record_ev(EV_TQHZ+sw*EV_SW_NUM, 1, 0,0,0 );
  401. pSW->uTQHz.bFlag.bEvent = true;
  402. }
  403. }
  404. else
  405. {
  406. if (pSW->uTQHz.bFlag.bEvent)
  407. {
  408. soe_record_ev(EV_TQHZ+sw*EV_SW_NUM, 0, 0,0,0 );
  409. pSW->uTQHz.bFlag.bEvent = false;
  410. ResetTR(&pSW->tTQTime);
  411. }
  412. }
  413. }
  414. }
  415. //手动操作同期合闸检测
  416. void Pro_TQBS(int sw,DWORD dStep)
  417. {
  418. bool bQD,bTQ=false;
  419. TRELAY_T *pR=&g_tRelay[sw];
  420. //TTQHZ_T *pSW = &pR->tTQHz;
  421. TSETSW *pSet = &pRunSet->tSwSet[sw];
  422. // 合环合闸
  423. long deltaA;
  424. bool bMxYY,bMxWY,bUxYY,bUxWY,bDa,bDu,bDf;
  425. qs16 ang1=0,ang2=0;
  426. if(pRunSet->pt2vol==PUB_AC_UAB1)ang2=0;
  427. else if(pRunSet->pt2vol==PUB_AC_UBC1)ang2=-120*65536;
  428. else if(pRunSet->pt2vol==PUB_AC_UCA1)ang2=120*65536;
  429. else if(pRunSet->pt2vol==PUB_AC_UAB2)ang2=0;
  430. else if(pRunSet->pt2vol==PUB_AC_UBC2)ang2=-120*65536;
  431. else if(pRunSet->pt2vol==PUB_AC_UCA2)ang2=120*65536;
  432. bMxYY = OverRelay(g_sw_pub.m2_max[2], pSet->dU_chz_yy,pSet->dU_chz_yy,false);
  433. bMxWY = LowRelay(g_sw_pub.m2_max[2], pSet->dU_chz_wy,pSet->dU_chz_wy,false);
  434. bUxYY = OverRelay(g_ui[pRunSet->pt2vol].m2[0], pSet->dU_chz_yy,pSet->dU_chz_yy,false);
  435. bUxWY = LowRelay(g_ui[pRunSet->pt2vol].m2[0], pSet->dU_chz_wy,pSet->dU_chz_wy,false);
  436. deltaA = _AbsL((g_ui[PUB_AC_UAB1].p -ang1)- (g_ui[pRunSet->pt2vol].p-ang2));
  437. bDa=(((_AbsL(deltaA) < pSet->dA_tq_delatA)?true:false)||(pSet->dA_tq_delatA==0)); //角差满足要求,角差为零,不判角差
  438. bDu=((_AbsL(g_ui[PUB_AC_UAB1].fz -g_ui[pRunSet->pt2vol].fz)<pSet->dU_tq_deltaU)?true:false)||(pSet->dU_tq_deltaU==0); //压差满足要求
  439. 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);//频差
  440. bQD=((bDa&&bDu&&bDf&&bMxYY&&bUxYY&&(!tPT.uPT1DX.bFlag.bPTYC)&&(!tPT.uPT2DX.bFlag.bPTYC))
  441. ||(bMxWY&&(!tPT.uPT1DX.bFlag.bPTYC))
  442. ||(bUxWY&&(!tPT.uPT2DX.bFlag.bPTYC))); //压差,角差,频差满足要求,或有一侧无压
  443. bTQ = (!TYTQ_ALL_EN(sw)) && !bQD; // 合环合闸投入
  444. if(bTQ)
  445. sw_do(sw,SW_DO_TQBS,SW_DO_TYPE_ON);//不同期
  446. else
  447. sw_do(sw,SW_DO_TQBS,SW_DO_TYPE_OFF);//同期
  448. }
  449. enum
  450. {
  451. HC_UAB1=0,
  452. HC_UBC1,
  453. HC_UCA1,
  454. HC_UAB2,
  455. HC_UBC2,
  456. HC_UCA2,
  457. HC_FREQ,
  458. HC_VT,
  459. HC_FT,
  460. HC_NUMS,
  461. };
  462. DWORD dhcbsBuf[32][HC_NUMS]; // 滑差闭锁缓冲区,含频率和两组电压
  463. WORD whcCnt; //滑差缓冲区指针
  464. DWORD dTcounterrem;
  465. void hcbs_init(void)
  466. {
  467. int i;
  468. whcCnt=0; //滑差电压缓冲区指针
  469. for(i=0;i<32;i++)
  470. {
  471. int j;
  472. DWORD v=(DWORD)(100.0*pRunSet->dKU[PUB_AC_UAB1]/256);
  473. for(j=HC_UAB1;j<=HC_UCA2;j++)
  474. {
  475. dhcbsBuf[i][j]=v;
  476. }
  477. dhcbsBuf[i][HC_FREQ] =50<<16; //频率缓冲区: 频率,频率刷新时刻
  478. dhcbsBuf[i][HC_VT] =0;
  479. dhcbsBuf[i][HC_FT] =0;
  480. }
  481. }
  482. void hcbs_dataset(void)
  483. {
  484. whcCnt = ( whcCnt + 1 ) & 0x1f;
  485. dhcbsBuf[whcCnt][HC_UAB1] = g_ui[PUB_AC_UAB1].fz;
  486. dhcbsBuf[whcCnt][HC_UBC1] = g_ui[PUB_AC_UBC1].fz;
  487. dhcbsBuf[whcCnt][HC_UCA1] = g_ui[PUB_AC_UCA1].fz;
  488. dhcbsBuf[whcCnt][HC_UAB2] = g_ui[PUB_AC_UAB2].fz;
  489. dhcbsBuf[whcCnt][HC_UBC2] = g_ui[PUB_AC_UBC2].fz;
  490. dhcbsBuf[whcCnt][HC_UCA2] = g_ui[PUB_AC_UCA2].fz;
  491. dhcbsBuf[whcCnt][HC_FREQ] = freq_get(0)*65536;
  492. dhcbsBuf[whcCnt][HC_VT] =dTcounterrem;
  493. dhcbsBuf[whcCnt][HC_FT] =dTcounterrem;
  494. }
  495. bool hcbs_vol(int sw,int type) //电压滑差判断
  496. {
  497. long lTsubV;
  498. long lDeltaVol;
  499. TSETSW *pSet = &pRunSet->tSwSet[sw];
  500. lTsubV = dhcbsBuf[ whcCnt ][ HC_VT ] //获取当前时刻
  501. - dhcbsBuf[ ( whcCnt - 15 ) & 0x1f ][ HC_VT ]; //获取15次软件中断前采样时刻
  502. if(lTsubV <= 0 )
  503. {
  504. return( false );
  505. }
  506. lDeltaVol = dhcbsBuf[ ( whcCnt - 15 ) & 0x1f ][type] //获取当前采样
  507. - dhcbsBuf[ whcCnt ][type]; //获取15*5MS前电压
  508. if( lDeltaVol < 0 )
  509. {
  510. return false;
  511. }
  512. #if 0 //调试信息
  513. if(type==HC_UAB1)
  514. {
  515. float fku=pRunSet->dKU[PUB_AC_UAB1]/256.0;
  516. if(g_ui[PUB_AC_UAB1].fz<60*fku&&g_ui[PUB_AC_UAB1].fz>50*fku&&(lTsubV > 20) )
  517. {
  518. 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]);
  519. g_print_101=0;
  520. }
  521. }
  522. #endif
  523. if( ((lDeltaVol * 1600) > ((long)pSet->dhcbs_u * lTsubV)) && (lTsubV > 20) )
  524. {
  525. return true;
  526. }
  527. return false;
  528. }
  529. bool hcbs_freq(int sw) //频率滑差判断
  530. {
  531. long lTsub;
  532. long lDeltaF;
  533. TSETSW *pSet = &pRunSet->tSwSet[sw];
  534. lTsub = dhcbsBuf[ ( whcCnt ) & 0x1f ][HC_FT] //获取当前频率采样时刻
  535. - dhcbsBuf[ ( whcCnt - 4 ) & 0x1f ][HC_FT]; //获取5周前频率采样时刻
  536. if( lTsub < 0 )
  537. {
  538. return( false );
  539. }
  540. lDeltaF = dhcbsBuf[ ( whcCnt - 4 ) & 0x1f ][HC_FREQ] //获取5周频率采样
  541. - dhcbsBuf[ whcCnt & 0x1f ][HC_FREQ]; //获取当前频率采样 ΔF = |f - fm|;
  542. if( lDeltaF < 0 )
  543. {
  544. return false;
  545. }
  546. //if( lDeltaF * 1600 > pRunSet->dDP_DELTAF * lTsub )
  547. if( lDeltaF * 400 > (( (long)(pSet->dhcbs_hz) * lTsub )/4 ))
  548. {
  549. return true ; //滑差闭锁确认
  550. }
  551. return false;
  552. }
  553. //获取电压通道信息
  554. static int get_vol_index(int ac_index)
  555. {
  556. if(PUB_AC_UAB1==ac_index || PUB_AC_UBC1==ac_index || PUB_AC_UCA1==ac_index)
  557. if(g_equ_config_ac[0].type-1 == PUB_AC_UAB2)
  558. return (PUB_AC_UAB2+(ac_index-PUB_AC_UAB1));
  559. if(PUB_AC_UA1==ac_index || PUB_AC_UB1==ac_index || PUB_AC_UC1==ac_index)
  560. if(g_equ_config_ac[0].type-1 == PUB_AC_UA2)
  561. return (PUB_AC_UA2+(ac_index-PUB_AC_UA1));
  562. return ac_index;
  563. }
  564. #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)
  565. void vol_DYJL(int sw,DWORD dStep) // 电压解列
  566. {
  567. bool bQDD1,bQDD2;
  568. TRELAY_T *pR=&g_tRelay[sw];
  569. TJL_T*pJL=&pR->tDYJL;
  570. TSWST *pSWST =&pR->tSWST;
  571. TSETSW *pSet = &pRunSet->tSwSet[sw];
  572. bool bhcbs;
  573. /***********启动 **********************************/
  574. if(IS_VOL_CHANNEL_TYPE)
  575. bQDD1 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_jl_ggdy,pSet->dU_jl_ggdy_fh,pJL->sta.bFlag.bQD_H);
  576. else
  577. bQDD1 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_jl_ggdy,pSet->dU_jl_ggdy_fh,pJL->sta.bFlag.bQD_H);
  578. pJL->sta.bFlag.bQD_H = SOFE_AUTO_EN(sw)
  579. && pSet->bTT_jl_dy//投退字
  580. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  581. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  582. &&bQDD1;
  583. /***********过高压分闸*********************************/
  584. RunTR(&pJL->tHighTime, pJL->sta.bFlag.bQD_H, dStep);
  585. pJL->sta.bFlag.bTz_H = pJL->tHighTime.boolTrip;
  586. /************事件记录及出口****************************/
  587. if(pJL->sta.bFlag.bTz_H)
  588. {
  589. if(soe_check(EV_GGDY_TZ+sw*EV_SW_NUM)==false) //
  590. {
  591. DWORD Uab,Ubc,Uca;
  592. 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)]);
  593. 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)]);
  594. 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)]);
  595. soe_record_ev( EV_GGDY_TZ+sw*EV_SW_NUM, 1, Uab,Ubc,Uca );
  596. pJL->bLed= true;
  597. }
  598. }
  599. else
  600. {
  601. if(soe_check(EV_GGDY_TZ+sw*EV_SW_NUM)==true) //
  602. {
  603. soe_record_ev( EV_GGDY_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  604. }
  605. }
  606. if(IS_VOL_CHANNEL_TYPE)
  607. bQDD2 = OverRelay(g_sw_pub.m2_max[3], pSet->dU_jl_gdy,pSet->dU_jl_gdy_fh,pJL->sta.bFlag.bQD_G);
  608. else
  609. bQDD2 = OverRelay(g_sw_pub.m2_max[2], pSet->dU_jl_gdy,pSet->dU_jl_gdy_fh,pJL->sta.bFlag.bQD_G);
  610. pJL->sta.bFlag.bQD_G = SOFE_AUTO_EN(sw)
  611. && pSet->bTT_jl_dy//投退字
  612. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  613. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  614. &&(!bQDD1&&bQDD2);
  615. /***********过压分闸*********************************/
  616. RunTR(&pJL->tGdyTime, pJL->sta.bFlag.bQD_G, dStep);
  617. pJL->sta.bFlag.bTz_G = pJL->tGdyTime.boolTrip;
  618. /************事件记录及出口****************************/
  619. if(pJL->sta.bFlag.bTz_G)
  620. {
  621. if(soe_check(EV_GDY_TZ+sw*EV_SW_NUM)==false) //
  622. {
  623. DWORD Uab,Ubc,Uca;
  624. 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)]);
  625. 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)]);
  626. 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)]);
  627. soe_record_ev( EV_GDY_TZ+sw*EV_SW_NUM, 1, Uab,Ubc,Uca );
  628. pJL->bLed= true;
  629. }
  630. }
  631. else
  632. {
  633. if(soe_check(EV_GDY_TZ+sw*EV_SW_NUM)==true) //
  634. {
  635. soe_record_ev( EV_GDY_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  636. }
  637. }
  638. if(IS_VOL_CHANNEL_TYPE)
  639. {
  640. bQDD1 = LowRelay(g_sw_pub.m2_max[3], pSet->dU_jl_gddy,pSet->dU_jl_gddy_fh,pJL->sta.bFlag.bQD_L);
  641. }
  642. else
  643. {
  644. bQDD1 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_jl_gddy,pSet->dU_jl_gddy_fh,pJL->sta.bFlag.bQD_L);
  645. }
  646. if(IS_VOL_CHANNEL_TYPE)
  647. {
  648. bhcbs=pSet ->bTT_hcbs_dy
  649. &&(hcbs_vol(sw,HC_UAB2)||hcbs_vol(sw,HC_UBC2)||hcbs_vol(sw,HC_UCA2));
  650. }
  651. else
  652. {
  653. bhcbs=pSet ->bTT_hcbs_dy
  654. &&(hcbs_vol(sw,HC_UAB1)||hcbs_vol(sw,HC_UBC1)||hcbs_vol(sw,HC_UCA1));
  655. }
  656. pJL->sta.bFlag.bQD_L = SOFE_AUTO_EN(sw)
  657. && pSet->bTT_jl_dy//投退字
  658. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  659. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  660. &&pR->tSWST.uSWST.bFlag.bCYY //曾有压
  661. &&(!tPT.uPT1DX.bFlag.bPTYC) //无 PT异常
  662. &&bQDD1;
  663. RunTR(&pJL->thcbs1_0ms_100ms, pJL->sta.bFlag.bQD_L, dStep);
  664. pJL->sta.bFlag.bhcbs1=(pJL->thcbs1_0ms_100ms.boolTrip&&pJL->sta.bFlag.bhcbs1)
  665. ||bhcbs;
  666. /***********过低压分闸*********************************/
  667. RunTR(&pJL->tLowTime, pJL->sta.bFlag.bQD_L&&(!pJL->sta.bFlag.bhcbs1), dStep);
  668. pJL->sta.bFlag.bTz_L = pJL->tLowTime.boolTrip;
  669. /************事件记录及出口****************************/
  670. if(pJL->sta.bFlag.bTz_L)
  671. {
  672. if(soe_check(EV_GDDY_TZ+sw*EV_SW_NUM)==false) //
  673. {
  674. DWORD Uab,Ubc,Uca;
  675. 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)]);
  676. 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)]);
  677. 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)]);
  678. soe_record_ev( EV_GDDY_TZ+sw*EV_SW_NUM, 1, Uab,Ubc,Uca );
  679. pJL->bLed= true;
  680. pR->tSWST.uSWST.bFlag.bCYY=false;
  681. }
  682. }
  683. else
  684. {
  685. if(soe_check(EV_GDDY_TZ+sw*EV_SW_NUM)==true) //
  686. {
  687. soe_record_ev( EV_GDDY_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  688. }
  689. }
  690. if(IS_VOL_CHANNEL_TYPE)
  691. bQDD2 = LowRelay(g_sw_pub.m2_max[3], pSet->dU_jl_ddy,pSet->dU_jl_ddy_fh,pJL->sta.bFlag.bQD_D);
  692. else
  693. bQDD2 = LowRelay(g_sw_pub.m2_max[2], pSet->dU_jl_ddy,pSet->dU_jl_ddy_fh,pJL->sta.bFlag.bQD_D);
  694. pJL->sta.bFlag.bQD_D = SOFE_AUTO_EN(sw)
  695. && pSet->bTT_jl_dy//投退字
  696. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  697. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  698. &&pR->tSWST.uSWST.bFlag.bCYY //曾有压
  699. &&(!tPT.uPT1DX.bFlag.bPTYC) //无 PT异常
  700. &&(!bQDD1&&bQDD2);
  701. RunTR(&pJL->thcbs2_0ms_100ms, pJL->sta.bFlag.bQD_D, dStep);
  702. pJL->sta.bFlag.bhcbs2=(pJL->thcbs2_0ms_100ms.boolTrip&&pJL->sta.bFlag.bhcbs2)
  703. ||bhcbs;
  704. /***********低压分闸*********************************/
  705. RunTR(&pJL->tDdyTime, pJL->sta.bFlag.bQD_D&&(!pJL->sta.bFlag.bhcbs2), dStep);
  706. pJL->sta.bFlag.bTz_D = pJL->tDdyTime.boolTrip;
  707. /************事件记录及出口****************************/
  708. if(pJL->sta.bFlag.bTz_D)
  709. {
  710. if(soe_check(EV_DDY_TZ+sw*EV_SW_NUM)==false) //
  711. {
  712. DWORD Uab,Ubc,Uca;
  713. 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)]);
  714. 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)]);
  715. 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)]);
  716. soe_record_ev( EV_DDY_TZ+sw*EV_SW_NUM, 1, Uab,Ubc,Uca );
  717. pJL->bLed= true;
  718. pR->tSWST.uSWST.bFlag.bCYY=false;
  719. }
  720. }
  721. else
  722. {
  723. if(soe_check(EV_DDY_TZ+sw*EV_SW_NUM)==true) //
  724. {
  725. soe_record_ev( EV_DDY_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  726. }
  727. }
  728. pJL->sta.bFlag.bTz =pJL->sta.bFlag.bTz_H||pJL->sta.bFlag.bTz_L||pJL->sta.bFlag.bTz_G||pJL->sta.bFlag.bTz_D;
  729. pJL->sta.bFlag.bQD=pJL->sta.bFlag.bQD_H||pJL->sta.bFlag.bQD_L||pJL->sta.bFlag.bQD_G||pJL->sta.bFlag.bQD_D;
  730. }
  731. void vol_PLJL(int sw,DWORD dStep) // 频率解列
  732. {
  733. bool bQDD1,bQDD2;
  734. TRELAY_T *pR=&g_tRelay[sw];
  735. TJL_T*pJL=&pR->tPLJL;
  736. TSWST *pSWST =&pR->tSWST;
  737. TSETSW *pSet = &pRunSet->tSwSet[sw];
  738. DWORD freq=freq_get(0)*65536;
  739. bool bhcbs;
  740. bhcbs=pSet ->bTT_hcbs_hz&&hcbs_freq(sw);
  741. /***********频率过低启动 **********************************/
  742. bQDD1 = LowRelay(freq, pSet->dU_jl_lowhz,pSet->dU_jl_lowhz_fh,pJL->sta.bFlag.bQD_L);
  743. pJL->sta.bFlag.bQD_L = SOFE_AUTO_EN(sw)
  744. && pSet->bTT_jl_hz//投退字
  745. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  746. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  747. &&(freq>44*65536) //频率大于44hz,不然认为无频率
  748. &&(bQDD1);
  749. RunTR(&pJL->thcbs1_0ms_100ms, pJL->sta.bFlag.bQD_L, dStep);
  750. pJL->sta.bFlag.bhcbs1=(pJL->thcbs1_0ms_100ms.boolTrip&&pJL->sta.bFlag.bhcbs1)
  751. ||bhcbs;
  752. /***********过低频解列*********************************/
  753. //RunTR(&pJL->tLowTime, pJL->sta.bFlag.bQD_L, dStep);
  754. RunTR2(&pJL->tLowTime, pJL->sta.bFlag.bQD_L&&(!pJL->sta.bFlag.bhcbs1), dStep);
  755. pJL->sta.bFlag.bTz_L = pJL->tLowTime.boolTrip;
  756. /************事件记录及出口****************************/
  757. if(pJL->sta.bFlag.bTz_L)
  758. {
  759. if(soe_check(EV_LOWPL_TZ+sw*EV_SW_NUM)==false) //
  760. {
  761. soe_record_ev( EV_LOWPL_TZ+sw*EV_SW_NUM, 1, freq,0,0 );
  762. pJL->bLed= true;
  763. }
  764. }
  765. else
  766. {
  767. if(soe_check(EV_LOWPL_TZ+sw*EV_SW_NUM)==true) //
  768. {
  769. soe_record_ev( EV_LOWPL_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  770. }
  771. }
  772. /***********低频解列*********************************/
  773. bQDD2 = LowRelay(freq, pSet->dU_jl_dhz,pSet->dU_jl_dhz_fh,pJL->sta.bFlag.bQD_D);
  774. pJL->sta.bFlag.bQD_D= SOFE_AUTO_EN(sw)
  775. && pSet->bTT_jl_hz//投退字
  776. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  777. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  778. &&(!bQDD1&&bQDD2);
  779. RunTR(&pJL->thcbs2_0ms_100ms, pJL->sta.bFlag.bQD_D, dStep);
  780. pJL->sta.bFlag.bhcbs2=(pJL->thcbs2_0ms_100ms.boolTrip&&pJL->sta.bFlag.bhcbs2)
  781. ||bhcbs;
  782. RunTR(&pJL->tDhzTime, pJL->sta.bFlag.bQD_D&&(!pJL->sta.bFlag.bhcbs2), dStep);
  783. pJL->sta.bFlag.bTz_D = pJL->tDhzTime.boolTrip;
  784. /************事件记录及出口****************************/
  785. if(pJL->sta.bFlag.bTz_D)
  786. {
  787. if(soe_check(EV_DPL_TZ+sw*EV_SW_NUM)==false) //
  788. {
  789. soe_record_ev( EV_DPL_TZ+sw*EV_SW_NUM, 1, freq,0,0 );
  790. pJL->bLed= true;
  791. }
  792. }
  793. else
  794. {
  795. if(soe_check(EV_DPL_TZ+sw*EV_SW_NUM)==true) //
  796. {
  797. soe_record_ev( EV_DPL_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  798. }
  799. }
  800. /***********高频解列*********************************/
  801. bQDD1 = OverRelay(freq, pSet->dU_jl_ghz,pSet->dU_jl_ghz_fh,pJL->sta.bFlag.bQD_H);
  802. pJL->sta.bFlag.bQD_H= SOFE_AUTO_EN(sw)
  803. && pSet->bTT_jl_hz//投退字
  804. && pRunSet->tSwSet[sw].btt_gnyb_zdjl
  805. &&pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  806. &&bQDD1;
  807. RunTR(&pJL->tHighTime, pJL->sta.bFlag.bQD_H, dStep);
  808. pJL->sta.bFlag.bTz_H = pJL->tHighTime.boolTrip;
  809. /************事件记录及出口****************************/
  810. if(pJL->sta.bFlag.bTz_H)
  811. {
  812. if(soe_check(EV_GPL_TZ+sw*EV_SW_NUM)==false) //
  813. {
  814. soe_record_ev( EV_GPL_TZ+sw*EV_SW_NUM, 1, freq,0,0);
  815. pJL->bLed= true;
  816. }
  817. }
  818. else
  819. {
  820. if(soe_check(EV_GPL_TZ+sw*EV_SW_NUM)==true) //
  821. {
  822. soe_record_ev( EV_GPL_TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  823. }
  824. }
  825. pJL->sta.bFlag.bTz=pJL->sta.bFlag.bTz_H||pJL->sta.bFlag.bTz_L||pJL->sta.bFlag.bTz_D;
  826. pJL->sta.bFlag.bQD=pJL->sta.bFlag.bQD_H||pJL->sta.bFlag.bQD_L||pJL->sta.bFlag.bQD_D;
  827. }
  828. TPTCHECK_T tPT;
  829. #define ANG_PHASEYC (15*65536)
  830. void PT_Check(DWORD dStep)
  831. {
  832. bool bsxyl=false;
  833. /***********PT 异常判断**********************************/
  834. {
  835. int sw;
  836. DWORD Umax,Umin;
  837. bool bCheck=false;
  838. bool bpt1check=false;
  839. bool bpt2check=false;
  840. for(sw=0;sw<SWITCH_NUM_MAX;sw++)
  841. {
  842. bool bptdx;
  843. bsxyl|=(g_sw[sw].m2_max>pRunSet->dIWL_SQR[sw]); //三相无流
  844. bptdx=((BH_ALL_EN(sw)&&pRunSet->tSwSet[sw].bTT_bh_ptdx)
  845. ||(FA_ALL_EN(sw)&&pRunSet->tSwSet[sw].bTT_fa_ptdx));
  846. bpt1check|=bptdx;
  847. bpt2check|=(bptdx&&(pRunSet->a_side_pt_type));// pt2 vv接线
  848. bpt1check&=pRunSet->tSwSet[sw].bTT_PT1_ll_check;
  849. bpt2check&=pRunSet->tSwSet[sw].bTT_PT2_ll_check;
  850. }
  851. /*********PT1断线判断***************************/
  852. //判断电压配置,只有在配置了Ua Ub Uc 或Uab Ubc Uca后,才进行断线检查
  853. bCheck=(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA1] != INDEX_INVALLID)
  854. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB1] != INDEX_INVALLID)
  855. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC1] != INDEX_INVALLID))||
  856. (((short)g_sw_pub.ac_cfg_index[PUB_AC_UAB1] != INDEX_INVALLID)
  857. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UBC1] != INDEX_INVALLID));
  858. Umax=g_sw_pub.m2_max[2];
  859. Umin=g_sw_pub.m2_min[2];
  860. #ifdef PRO_PT_LL_NC
  861. 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联络)
  862. ||(FA_ALL_EN(0) && g_tRelay[0].run_stu.fa_ls))) //三相断线:三相断线(Fa联络)
  863. ||((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  864. ||((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  865. &&bCheck
  866. &&bpt1check;
  867. #else
  868. tPT.uPT1DX.bFlag.bQD=(((Umax<pRunSet->dVOL16V_SQR)&&(bsxyl)) //三相断线,无压有流
  869. ||((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  870. ||((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  871. &&bCheck
  872. &&bpt1check;
  873. #endif
  874. RunTR(&tPT.tTPT1DXTime, tPT.uPT1DX.bFlag.bQD, dStep);
  875. if(tPT.tTPT1DXTime.boolTrip)
  876. {
  877. if(!tPT.uPT1DX.bFlag.bEvent)
  878. {
  879. DWORD Uab,Ubc,Uca;
  880. Uab = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UAB1].m2[0]), 256, g_ui[PUB_AC_UAB1].m2_factor_k);
  881. Ubc = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UBC1].m2[0]), 256, g_ui[PUB_AC_UBC1].m2_factor_k);
  882. Uca = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UCA1].m2[0]), 256, g_ui[PUB_AC_UCA1 ].m2_factor_k);
  883. soe_record_ev(EV_PT1ERR,1, Uab,Ubc,Uca);
  884. tPT.uPT1DX.bFlag.bEvent=true;
  885. tPT.uPT1DX.bFlag.bPTYC=true;
  886. }
  887. }
  888. else
  889. {
  890. {
  891. if(tPT.uPT1DX.bFlag.bEvent)
  892. {
  893. soe_record_ev(EV_PT1ERR,0, 0,0,0 );
  894. tPT.uPT1DX.bFlag.bEvent=false;
  895. tPT.uPT1DX.bFlag.bPTYC=false;
  896. }
  897. }
  898. }
  899. //PT1相序检查
  900. {
  901. bool bok;
  902. u32 da,db,dc;
  903. if(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA1] != INDEX_INVALLID)
  904. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB1] != INDEX_INVALLID)
  905. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC1] != INDEX_INVALLID)) // 相电压接线
  906. {
  907. da = _AbsL(g_ui[PUB_AC_UA1].p - g_ui[PUB_AC_UB1].p-120*65536);
  908. db = _AbsL(g_ui[PUB_AC_UB1].p - g_ui[PUB_AC_UC1].p+240*65536);
  909. dc = _AbsL(g_ui[PUB_AC_UA1].p - g_ui[PUB_AC_UC1].p+120*65536);
  910. Umin=g_sw_pub.m2_min[0];
  911. }
  912. else //线电压接线
  913. {
  914. da = _AbsL(g_ui[PUB_AC_UAB1].p - g_ui[PUB_AC_UBC1].p-120*65536);
  915. db = _AbsL(g_ui[PUB_AC_UBC1].p - g_ui[PUB_AC_UCA1].p+240*65536);
  916. dc = _AbsL(g_ui[PUB_AC_UAB1].p - g_ui[PUB_AC_UCA1].p+120*65536);
  917. Umin=g_sw_pub.m2_min[2];
  918. }
  919. bok=pRunSet->bTT_CheckPhase
  920. &&(Umin>pRunSet->dVOL16V_SQR) //最小电压大于16V
  921. &&bCheck
  922. &&((da>ANG_PHASEYC)||(db>ANG_PHASEYC)||(dc>ANG_PHASEYC)); //三相电压角度差15度
  923. RunTR(&tPT.tTPT1XXYC, bok, dStep);
  924. if(tPT.tTPT1XXYC.boolTrip)
  925. {
  926. if(soe_check(EV_PT1XXYC)==false) //
  927. {
  928. soe_record_ev(EV_PT1XXYC, 1, 0,0,0 );
  929. }
  930. }
  931. else
  932. {
  933. if(soe_check(EV_PT1XXYC)==true) //
  934. {
  935. soe_record_ev(EV_PT1XXYC, 0, 0,0,0 );
  936. }
  937. }
  938. }
  939. /*********PT2断线判断***************************/
  940. Umax=g_sw_pub.m2_max[3];
  941. Umin=g_sw_pub.m2_min[3];
  942. //判断电压配置,只有在配置了Ua Ub Uc 或Uab Ubc Uca后,才进行断线检查
  943. bCheck=(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA2] != INDEX_INVALLID)
  944. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB2] != INDEX_INVALLID)
  945. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC2] != INDEX_INVALLID))
  946. #ifdef FUNC_PT_ERR_SINGLE
  947. ||(((short)g_sw_pub.ac_cfg_index[PUB_AC_UAB2] != INDEX_INVALLID)
  948. || ((short)g_sw_pub.ac_cfg_index[PUB_AC_UBC2] != INDEX_INVALLID)
  949. || ((short)g_sw_pub.ac_cfg_index[PUB_AC_UCA2] != INDEX_INVALLID))
  950. #else
  951. ||(((short)g_sw_pub.ac_cfg_index[PUB_AC_UAB2] != INDEX_INVALLID)
  952. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UBC2] != INDEX_INVALLID))
  953. #endif
  954. ;
  955. #ifdef PRO_PT_LL_NC
  956. 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联络)
  957. ||(FA_ALL_EN(0) && g_tRelay[0].run_stu.fa_ls))) //三相断线:三相断线(Fa联络)
  958. ||((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  959. ||((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  960. &&bCheck
  961. &&bpt2check;
  962. #else
  963. tPT.uPT2DX.bFlag.bQD=(((Umax<pRunSet->dVOL16V_SQR)&&(bsxyl)) //三相断线,无压有流
  964. |((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  965. |((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  966. &&bCheck
  967. &&bpt2check;
  968. #endif
  969. RunTR(&tPT.tTPT2DXTime, tPT.uPT2DX.bFlag.bQD, dStep);
  970. if(tPT.tTPT2DXTime.boolTrip)
  971. {
  972. if(!tPT.uPT2DX.bFlag.bEvent)
  973. {
  974. DWORD Uab,Ubc,Uca;
  975. Uab = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UAB2].m2[0]), 256, g_ui[PUB_AC_UAB2].m2_factor_k);
  976. Ubc = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UBC2].m2[0]), 256, g_ui[PUB_AC_UBC2].m2_factor_k);
  977. Uca = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UCA2].m2[0]), 256, g_ui[PUB_AC_UCA2].m2_factor_k);
  978. soe_record_ev(EV_PT2ERR,1, Uab,Ubc,Uca );
  979. tPT.uPT2DX.bFlag.bEvent=true;
  980. tPT.uPT2DX.bFlag.bPTYC=true;
  981. }
  982. }
  983. else
  984. {
  985. {
  986. if(tPT.uPT2DX.bFlag.bEvent)
  987. {
  988. soe_record_ev(EV_PT2ERR,0, 0,0,0 );
  989. tPT.uPT2DX.bFlag.bEvent=false;
  990. tPT.uPT2DX.bFlag.bPTYC=false;
  991. }
  992. }
  993. }
  994. //PT2相序检查
  995. {
  996. bool bok;
  997. u32 da,db,dc;
  998. if(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA2] != INDEX_INVALLID)
  999. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB2] != INDEX_INVALLID)
  1000. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC2] != INDEX_INVALLID)) // 相电压接线
  1001. {
  1002. da = _AbsL(g_ui[PUB_AC_UA2].p - g_ui[PUB_AC_UB2].p-120*65536);
  1003. db = _AbsL(g_ui[PUB_AC_UB2].p - g_ui[PUB_AC_UC2].p+240*65536);
  1004. dc = _AbsL(g_ui[PUB_AC_UA2].p - g_ui[PUB_AC_UC2].p+120*65536);
  1005. Umin=g_sw_pub.m2_min[1];
  1006. }
  1007. else //线电压接线
  1008. {
  1009. da = _AbsL(g_ui[PUB_AC_UAB2].p - g_ui[PUB_AC_UBC2].p-120*65536);
  1010. db = _AbsL(g_ui[PUB_AC_UBC2].p - g_ui[PUB_AC_UCA2].p+240*65536);
  1011. dc = _AbsL(g_ui[PUB_AC_UAB2].p - g_ui[PUB_AC_UCA2].p+120*65536);
  1012. Umin=g_sw_pub.m2_min[3];
  1013. }
  1014. bok=pRunSet->bTT_CheckPhase
  1015. &&(Umin>pRunSet->dVOL16V_SQR) //最小电压大于16V
  1016. &&bCheck
  1017. &&((da>ANG_PHASEYC)||(db>ANG_PHASEYC)||(dc>ANG_PHASEYC)); //三相电压角度差15度
  1018. RunTR(&tPT.tTPT2XXYC, bok, dStep);
  1019. if(tPT.tTPT2XXYC.boolTrip)
  1020. {
  1021. if(soe_check(EV_PT2XXYC)==false) //
  1022. {
  1023. soe_record_ev(EV_PT2XXYC, 1, 0,0,0 );
  1024. }
  1025. }
  1026. else
  1027. {
  1028. if(soe_check(EV_PT2XXYC)==true) //
  1029. {
  1030. soe_record_ev(EV_PT2XXYC, 0, 0,0,0 );
  1031. }
  1032. }
  1033. }
  1034. }
  1035. }
  1036. void FDL_Check(DWORD dStep)
  1037. {
  1038. int i;
  1039. struct equ_config_di *ecd;
  1040. int sw = 0;
  1041. for (i = 0; i < 6; i++) // 非电量跳闸
  1042. {
  1043. bool byx = false;
  1044. TFDL_T *pFDL = &g_tRelay[sw].tFdl[i];
  1045. if ((short)g_sw_pub.di_cfg_index[PUB_DI_FDL1 + i] != INDEX_INVALLID)
  1046. {
  1047. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_FDL1 + i]];
  1048. byx = dido_di_is_on(ecd->slot, ecd->index);
  1049. }
  1050. pFDL->sta.bFlag.bQD = byx && (pRunSet->bTT_FDLGj[i] || pRunSet->bTT_FDLTz[i]);
  1051. RunTR(&pFDL->tFdlTime, pFDL->sta.bFlag.bQD, dStep);
  1052. pFDL->sta.bFlag.bTz = pFDL->tFdlTime.boolTrip && pRunSet->bTT_FDLTz[i];
  1053. pFDL->sta.bFlag.bGj = pFDL->tFdlTime.boolTrip && pRunSet->bTT_FDLGj[i];
  1054. if (pFDL->sta.bFlag.bTz)
  1055. {
  1056. if (soe_check(EV_FDL1_TZ + i) == false)
  1057. {
  1058. soe_record_ev(EV_FDL1_TZ + i, 1, 0, 0, 0);
  1059. }
  1060. }
  1061. else
  1062. {
  1063. if (soe_check(EV_FDL1_TZ + i) == true)
  1064. {
  1065. soe_record_ev(EV_FDL1_TZ + i, 0, 0, 0, 0);
  1066. }
  1067. }
  1068. if (pFDL->sta.bFlag.bGj)
  1069. {
  1070. if (soe_check(EV_FDL1_GJ + i) == false)
  1071. {
  1072. soe_record_ev(EV_FDL1_GJ + i, 1, 0, 0, 0);
  1073. }
  1074. }
  1075. else
  1076. {
  1077. if (soe_check(EV_FDL1_GJ + i) == true)
  1078. {
  1079. soe_record_ev(EV_FDL1_GJ + i, 0, 0, 0, 0);
  1080. }
  1081. }
  1082. }
  1083. }
  1084. void Pro_3U0(int sw,DWORD dStep)
  1085. {
  1086. bool bQDD;
  1087. TRELAY_T *pR=&g_tRelay[sw];
  1088. TU0_T *pSW=&pR->tOVER_U0TZ;
  1089. TSWST *pSWST =&pR->tSWST;
  1090. TSETSW *pSet = &pRunSet->tSwSet[sw];
  1091. DWORD U01 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1092. DWORD U02 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U02].m2[0]), 256, g_ui[PUB_AC_U02].m2_factor_k);
  1093. /***********启动 **********************************/
  1094. 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);
  1095. pSW->uZOV.bFlag.bQD = BH_ALL_EN(sw)
  1096. && (pSet->bTT_3U0Tz||pSet->bTT_3U0Gj)//投退字
  1097. //&& pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  1098. && bQDD
  1099. && (!tPT.uPT1DX.bFlag.bPTYC);
  1100. #ifdef EV_GL_STATR
  1101. lx_start_soe_set( pSW->uZOV.bFlag.bQD,sw,EV_U0_STATR);
  1102. #endif
  1103. /***********零序过压分闸*********************************/
  1104. RunTR(&pSW->tZOVTime, pSW->uZOV.bFlag.bQD, dStep);
  1105. pSW->uZOV.bFlag.bTz = pSW->tZOVTime.boolTrip && pSet->bTT_3U0Tz && pSWST->uSWST.bFlag.bHZWZ;
  1106. pSW->uZOV.bFlag.bGJ = pSW->tZOVTime.boolTrip&&pSet->bTT_3U0Gj;
  1107. /************事件记录及出口****************************/
  1108. if(pSW->uZOV.bFlag.bTz)
  1109. {
  1110. if(!pSW->uZOV.bFlag.bEvent)
  1111. {
  1112. soe_record_ev( EV_U0TZ+sw*EV_SW_NUM, 1, U01>U02?U01:U02,0,0 );
  1113. rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD);
  1114. pSW->uZOV.bFlag.bEvent = true;
  1115. pSW->bU0Led = true;
  1116. }
  1117. }
  1118. else
  1119. {
  1120. if(pSW->uZOV.bFlag.bEvent)
  1121. {
  1122. soe_record_ev(EV_U0TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  1123. pSW->uZOV.bFlag.bEvent = false;
  1124. pSW->uZOV.bFlag.bU0Ov = false;
  1125. }
  1126. }
  1127. /************告警记录****************************/
  1128. if(pSW->uZOV.bFlag.bGJ)
  1129. {
  1130. if(!pSW->uZOV.bFlag.bGJEvent)
  1131. {
  1132. soe_record_ev( EV_U0GJ+sw*EV_SW_NUM, 1, U01>U02?U01:U02,0,0 );
  1133. rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD);
  1134. pSW->uZOV.bFlag.bGJEvent = true;
  1135. if(pSW->bU0Led == false)
  1136. {
  1137. pSW->bU0GjLed = true;
  1138. }
  1139. }
  1140. }
  1141. else
  1142. {
  1143. if(pSW->uZOV.bFlag.bGJEvent)
  1144. {
  1145. soe_record_ev(EV_U0GJ+sw*EV_SW_NUM, 0, 0,0,0 );
  1146. pSW->uZOV.bFlag.bGJEvent = false;
  1147. pSW->uZOV.bFlag.bU0Ov = false;
  1148. }
  1149. }
  1150. }
  1151. #ifdef CUSTOMIZE_BZT //备自投
  1152. void vol_lost_tz(int sw, DWORD dStep) // 失压跳闸
  1153. {
  1154. bool bQDD1, bQDD2,pt1cyy,pt2cyy;
  1155. VOL_SET *pSet = &pRunSet->tVolLostSet;
  1156. TVOL_T *pvol = &g_tVolLost;
  1157. DWORD pt1_value,pt2_value;
  1158. TRELAY_T *pR = &g_tRelay[sw];
  1159. UBZT *uBZT = &pR->tBzt.uBZT;
  1160. pt1_value = g_sw_pub.m2_max[2];
  1161. pt2_value = g_sw_pub.m2_max[3];
  1162. pt1cyy = OverRelay(pt1_value, pSet->dUVol, pSet->dUVol,false);
  1163. pt2cyy = OverRelay(pt2_value, pSet->dUVol, pSet->dUVol,false);
  1164. //曾有压
  1165. RunTR(&pvol->tCYYTime, pt1cyy || pt2cyy, dStep);
  1166. pvol->sta.bFlag.bCYY = pvol->tCYYTime.boolTrip || pvol->sta.bFlag.bCYY;
  1167. /***********启动 **********************************/
  1168. bQDD1 = LowRelay(pt1_value, pSet->dUVol, pSet->dUVol_fh, pvol->sta.bFlag.bQD);
  1169. bQDD2 = LowRelay(pt2_value, pSet->dUVol, pSet->dUVol_fh, pvol->sta.bFlag.bQD);
  1170. pvol->sta.bFlag.bQD = bQDD1 && bQDD2 && pvol->sta.bFlag.bCYY && pSet->bTT && pR->tSWST.uSWST.bFlag.b1DLHW;
  1171. if(!pR->tSWST.uSWST.bFlag.b1DLHW)
  1172. pvol->sta.bFlag.bCYY = 0;
  1173. /***********失压分闸*********************************/
  1174. RunTR(&pvol->tQDTime, pvol->sta.bFlag.bQD, dStep);
  1175. pvol->sta.bFlag.bTz = pvol->tQDTime.boolTrip;
  1176. //pvol->sta.bFlag.bGJ = pvol->tQDTime.boolTrip;
  1177. /************事件记录及出口****************************/
  1178. if(pvol->sta.bFlag.bTz)
  1179. {
  1180. pvol->sta.bFlag.bCYY = false;
  1181. if(!pvol->sta.bFlag.bEvent)
  1182. {
  1183. DWORD Us1,Us2;
  1184. Us1 = _Mul_Div_U(sqrt_32fix(pt1_value), 256, pRunSet->dKU[PUB_AC_UAB1]);
  1185. Us2 = _Mul_Div_U(sqrt_32fix(pt2_value), 256, pRunSet->dKU[pRunSet->pt2vol]);
  1186. if(soe_check(EV_SYTZ)==false)
  1187. {
  1188. soe_record_ev(EV_SYTZ, 1, Us1,Us2,0 );
  1189. }
  1190. rcd_start(sw,RECORD_TYPE_XLSY, RECORD_LEN_TZQD); //录波类型:跳闸类
  1191. pvol->sta.bFlag.bEvent = true;
  1192. //pSW->uLostVot.bFlag.bTz=true; //执行跳闸标志
  1193. sw_do(sw,SW_DO_BHH,SW_DO_TYPE_OFF);
  1194. sw_do(sw,SW_DO_BHDZ,SW_DO_TYPE_ON);
  1195. sw_do(sw,SW_DO_BHT,SW_DO_TYPE_ON);
  1196. if(uBZT->bBZT.bZF && pRunSet->tSwSet[sw].bBZT_TT)
  1197. {
  1198. 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))
  1199. {
  1200. sw_do(sw,SW_DO_DL1_FZ,SW_DO_TYPE_ON);
  1201. }
  1202. 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))
  1203. {
  1204. sw_do(sw,SW_DO_DL2_FZ,SW_DO_TYPE_ON);
  1205. }
  1206. uBZT->bBZT.bSYFZ = 1;
  1207. }
  1208. }
  1209. }
  1210. else
  1211. {
  1212. if(pvol->sta.bFlag.bEvent)
  1213. {
  1214. soe_record_ev(EV_SYTZ, 0, 0,0,0 );
  1215. pvol->sta.bFlag.bEvent = false;
  1216. }
  1217. pvol->sta.bFlag.bTz=false;
  1218. }
  1219. }
  1220. #endif
  1221. #if (0)
  1222. /**************************************************************************
  1223. 函数名称:Pro_U0Tz
  1224. 函数版本:1.00
  1225. 作者: 赵海洋
  1226. 创建日期:2022.2.25
  1227. 函数功能说明:零压跳闸默认检测零压1
  1228. 输入参数:
  1229. 其他输入:
  1230. 输出参数:
  1231. 返回值:
  1232. ***************************************************************************/
  1233. void Pro_U0Tz(int sw,DWORD dStep)
  1234. {
  1235. bool bQDD;
  1236. TRELAY_T *pR=&g_tRelay[sw];
  1237. TVOL_T *pvol = &pR->tU0GZ;
  1238. VOL_SET *pSet = &pRunSet->tSwSet[sw].tU0Set;
  1239. bQDD = OverRelay(g_ui[PUB_AC_U01].m2[0], pSet->dUVol,pSet->dUVol_fh,pvol->sta.bFlag.bQD);
  1240. pvol->sta.bFlag.bQD = ((pSet->bTT || pSet->bTz)&& bQDD);
  1241. if(pvol->sta.bFlag.bQD)
  1242. {
  1243. if(!pvol->sta.bFlag.bQDWave)
  1244. {
  1245. rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD); //录波类型:跳闸类
  1246. pvol->sta.bFlag.bQDWave = true;
  1247. }
  1248. }
  1249. /***********动作*********************************/
  1250. RunTR(&pvol->tQDTime, pvol->sta.bFlag.bQD, dStep);
  1251. if (pSet->bTT)pvol->sta.bFlag.bGj = pvol->tQDTime.boolTrip;
  1252. if (pSet->bTz)pvol->sta.bFlag.bTz = pvol->tQDTime.boolTrip;
  1253. /************事件记录及出口****************************/
  1254. if(pvol->sta.bFlag.bGj)
  1255. {
  1256. if(soe_check(EV_LYGJ+sw*EV_SW_NUM)==false)
  1257. {
  1258. DWORD U0;
  1259. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1260. soe_record_ev(EV_LYGJ+sw*EV_SW_NUM,1, U0,0,0);
  1261. }
  1262. }
  1263. else
  1264. {
  1265. if(soe_check(EV_LYGJ+sw*EV_SW_NUM)==true)
  1266. {
  1267. pvol->sta.bFlag.bQDWave = false;
  1268. soe_record_ev(EV_LYGJ+sw*EV_SW_NUM,0, 0,0,0 );
  1269. }
  1270. }
  1271. if(pvol->sta.bFlag.bTz)
  1272. {
  1273. if(soe_check(EV_LYTZ+sw*EV_SW_NUM)==false)
  1274. {
  1275. DWORD U0;
  1276. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1277. soe_record_ev(EV_LYTZ+sw*EV_SW_NUM,1, U0,0,0);
  1278. }
  1279. }
  1280. else
  1281. {
  1282. if(soe_check(EV_LYTZ+sw*EV_SW_NUM)==true)
  1283. {
  1284. pvol->sta.bFlag.bQDWave = false;
  1285. soe_record_ev(EV_LYTZ+sw*EV_SW_NUM,0, 0,0,0 );
  1286. }
  1287. }
  1288. }
  1289. #endif
  1290. // = ========================= 本文件结束 =============================