vol.c 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505
  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->bTT_JL_YB
  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->bTT_JL_YB
  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->bTT_JL_YB
  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->bTT_JL_YB
  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->bTT_JL_YB
  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->bTT_JL_YB
  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->bTT_JL_YB
  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. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  835. DWORD Umin_tmp=0;
  836. DWORD U_WY=0;
  837. #endif
  838. /***********PT 异常判断**********************************/
  839. {
  840. int sw;
  841. DWORD Umax,Umin;
  842. bool bCheck=false;
  843. bool bpt1check=false;
  844. bool bpt2check=false;
  845. for(sw=0;sw<SWITCH_NUM_MAX;sw++)
  846. {
  847. bool bptdx;
  848. bsxyl|=(g_sw[sw].m2_max>pRunSet->dIWL_SQR[sw]); //三相无流
  849. bptdx=((BH_ALL_EN(sw)&&pRunSet->tSwSet[sw].bTT_bh_ptdx)
  850. ||(FA_ALL_EN(sw)&&pRunSet->tSwSet[sw].bTT_fa_ptdx));
  851. bpt1check|=bptdx;
  852. bpt2check|=(bptdx&&(pRunSet->a_side_pt_type));// pt2 vv接线
  853. #ifdef GD_AREA_MAIN_2020
  854. bpt1check&=pRunSet->tSwSet[sw].bTT_PT1_ll_check;
  855. bpt2check&=pRunSet->tSwSet[sw].bTT_PT2_ll_check;
  856. #endif
  857. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  858. if(Umin_tmp < pRunSet->tSwSet[sw].dU_fa_YY)
  859. {
  860. Umin_tmp = pRunSet->tSwSet[sw].dU_fa_YY;
  861. }
  862. if(U_WY < pRunSet->tSwSet[sw].dU_fa_WY)
  863. {
  864. U_WY = pRunSet->tSwSet[sw].dU_fa_WY;
  865. }
  866. #endif
  867. }
  868. /*********PT1断线判断***************************/
  869. //判断电压配置,只有在配置了Ua Ub Uc 或Uab Ubc Uca后,才进行断线检查
  870. bCheck=(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA1] != INDEX_INVALLID)
  871. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB1] != INDEX_INVALLID)
  872. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC1] != INDEX_INVALLID))||
  873. (((short)g_sw_pub.ac_cfg_index[PUB_AC_UAB1] != INDEX_INVALLID)
  874. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UBC1] != INDEX_INVALLID));
  875. Umax=g_sw_pub.m2_max[2];
  876. Umin=g_sw_pub.m2_min[2];
  877. #ifdef PRO_PT_LL_NC
  878. 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联络)
  879. ||(FA_ALL_EN(0) && g_tRelay[0].run_stu.fa_ls))) //三相断线:三相断线(Fa联络)
  880. ||((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  881. ||((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  882. &&bCheck
  883. &&bpt1check;
  884. #else
  885. tPT.uPT1DX.bFlag.bQD=(((Umax<pRunSet->dVOL16V_SQR)&&(bsxyl)) //三相断线,无压有流
  886. ||((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  887. ||((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  888. &&bCheck
  889. &&bpt1check;
  890. #endif
  891. RunTR(&tPT.tTPT1DXTime, tPT.uPT1DX.bFlag.bQD, dStep);
  892. if(tPT.tTPT1DXTime.boolTrip)
  893. {
  894. if(!tPT.uPT1DX.bFlag.bEvent)
  895. {
  896. DWORD Uab,Ubc,Uca;
  897. Uab = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UAB1].m2[0]), 256, g_ui[PUB_AC_UAB1].m2_factor_k);
  898. Ubc = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UBC1].m2[0]), 256, g_ui[PUB_AC_UBC1].m2_factor_k);
  899. Uca = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UCA1].m2[0]), 256, g_ui[PUB_AC_UCA1 ].m2_factor_k);
  900. soe_record_ev(EV_PT1ERR,1, Uab,Ubc,Uca);
  901. tPT.uPT1DX.bFlag.bEvent=true;
  902. tPT.uPT1DX.bFlag.bPTYC=true;
  903. }
  904. }
  905. else
  906. {
  907. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  908. if(Umin >= Umin_tmp)
  909. #endif
  910. {
  911. if(tPT.uPT1DX.bFlag.bEvent)
  912. {
  913. soe_record_ev(EV_PT1ERR,0, 0,0,0 );
  914. tPT.uPT1DX.bFlag.bEvent=false;
  915. tPT.uPT1DX.bFlag.bPTYC=false;
  916. }
  917. }
  918. }
  919. //PT1相序检查
  920. {
  921. bool bok;
  922. u32 da,db,dc;
  923. if(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA1] != INDEX_INVALLID)
  924. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB1] != INDEX_INVALLID)
  925. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC1] != INDEX_INVALLID)) // 相电压接线
  926. {
  927. da = _AbsL(g_ui[PUB_AC_UA1].p - g_ui[PUB_AC_UB1].p-120*65536);
  928. db = _AbsL(g_ui[PUB_AC_UB1].p - g_ui[PUB_AC_UC1].p+240*65536);
  929. dc = _AbsL(g_ui[PUB_AC_UA1].p - g_ui[PUB_AC_UC1].p+120*65536);
  930. Umin=g_sw_pub.m2_min[0];
  931. }
  932. else //线电压接线
  933. {
  934. da = _AbsL(g_ui[PUB_AC_UAB1].p - g_ui[PUB_AC_UBC1].p-120*65536);
  935. db = _AbsL(g_ui[PUB_AC_UBC1].p - g_ui[PUB_AC_UCA1].p+240*65536);
  936. dc = _AbsL(g_ui[PUB_AC_UAB1].p - g_ui[PUB_AC_UCA1].p+120*65536);
  937. Umin=g_sw_pub.m2_min[2];
  938. }
  939. bok=pRunSet->bTT_CheckPhase
  940. &&(Umin>pRunSet->dVOL16V_SQR) //最小电压大于16V
  941. &&bCheck
  942. &&((da>ANG_PHASEYC)||(db>ANG_PHASEYC)||(dc>ANG_PHASEYC)); //三相电压角度差15度
  943. RunTR(&tPT.tTPT1XXYC, bok, dStep);
  944. if(tPT.tTPT1XXYC.boolTrip)
  945. {
  946. if(soe_check(EV_PT1XXYC)==false) //
  947. {
  948. soe_record_ev(EV_PT1XXYC, 1, 0,0,0 );
  949. }
  950. }
  951. else
  952. {
  953. if(soe_check(EV_PT1XXYC)==true) //
  954. {
  955. soe_record_ev(EV_PT1XXYC, 0, 0,0,0 );
  956. }
  957. }
  958. }
  959. /*********PT2断线判断***************************/
  960. Umax=g_sw_pub.m2_max[3];
  961. Umin=g_sw_pub.m2_min[3];
  962. //判断电压配置,只有在配置了Ua Ub Uc 或Uab Ubc Uca后,才进行断线检查
  963. bCheck=(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA2] != INDEX_INVALLID)
  964. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB2] != INDEX_INVALLID)
  965. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC2] != INDEX_INVALLID))
  966. #ifdef FUNC_PT_ERR_SINGLE
  967. ||(((short)g_sw_pub.ac_cfg_index[PUB_AC_UAB2] != INDEX_INVALLID)
  968. || ((short)g_sw_pub.ac_cfg_index[PUB_AC_UBC2] != INDEX_INVALLID)
  969. || ((short)g_sw_pub.ac_cfg_index[PUB_AC_UCA2] != INDEX_INVALLID))
  970. #else
  971. ||(((short)g_sw_pub.ac_cfg_index[PUB_AC_UAB2] != INDEX_INVALLID)
  972. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UBC2] != INDEX_INVALLID))
  973. #endif
  974. ;
  975. #ifdef PRO_PT_LL_NC
  976. 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联络)
  977. ||(FA_ALL_EN(0) && g_tRelay[0].run_stu.fa_ls))) //三相断线:三相断线(Fa联络)
  978. ||((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  979. ||((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  980. &&bCheck
  981. &&bpt2check;
  982. #else
  983. tPT.uPT2DX.bFlag.bQD=(((Umax<pRunSet->dVOL16V_SQR)&&(bsxyl)) //三相断线,无压有流
  984. |((Umax>pRunSet->dVOL50V_SQR)&&(Umin<pRunSet->dVOL16V_SQR))// 两相断线最小值小于16V,最大值大于50V
  985. |((Umax>pRunSet->dVOL90V_SQR)&&(Umin<pRunSet->dVOL70V_SQR)))// 最小值小于71V,最大值大于90V
  986. &&bCheck
  987. &&bpt2check;
  988. #endif
  989. RunTR(&tPT.tTPT2DXTime, tPT.uPT2DX.bFlag.bQD, dStep);
  990. if(tPT.tTPT2DXTime.boolTrip)
  991. {
  992. if(!tPT.uPT2DX.bFlag.bEvent)
  993. {
  994. DWORD Uab,Ubc,Uca;
  995. Uab = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UAB2].m2[0]), 256, g_ui[PUB_AC_UAB2].m2_factor_k);
  996. Ubc = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UBC2].m2[0]), 256, g_ui[PUB_AC_UBC2].m2_factor_k);
  997. Uca = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_UCA2].m2[0]), 256, g_ui[PUB_AC_UCA2].m2_factor_k);
  998. soe_record_ev(EV_PT2ERR,1, Uab,Ubc,Uca );
  999. tPT.uPT2DX.bFlag.bEvent=true;
  1000. tPT.uPT2DX.bFlag.bPTYC=true;
  1001. }
  1002. }
  1003. else
  1004. {
  1005. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  1006. if(Umin >= Umin_tmp)
  1007. #endif
  1008. {
  1009. if(tPT.uPT2DX.bFlag.bEvent)
  1010. {
  1011. soe_record_ev(EV_PT2ERR,0, 0,0,0 );
  1012. tPT.uPT2DX.bFlag.bEvent=false;
  1013. tPT.uPT2DX.bFlag.bPTYC=false;
  1014. }
  1015. }
  1016. }
  1017. //PT2相序检查
  1018. {
  1019. bool bok;
  1020. u32 da,db,dc;
  1021. if(((short)g_sw_pub.ac_cfg_index[PUB_AC_UA2] != INDEX_INVALLID)
  1022. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UB2] != INDEX_INVALLID)
  1023. &&((short)g_sw_pub.ac_cfg_index[PUB_AC_UC2] != INDEX_INVALLID)) // 相电压接线
  1024. {
  1025. da = _AbsL(g_ui[PUB_AC_UA2].p - g_ui[PUB_AC_UB2].p-120*65536);
  1026. db = _AbsL(g_ui[PUB_AC_UB2].p - g_ui[PUB_AC_UC2].p+240*65536);
  1027. dc = _AbsL(g_ui[PUB_AC_UA2].p - g_ui[PUB_AC_UC2].p+120*65536);
  1028. Umin=g_sw_pub.m2_min[1];
  1029. }
  1030. else //线电压接线
  1031. {
  1032. da = _AbsL(g_ui[PUB_AC_UAB2].p - g_ui[PUB_AC_UBC2].p-120*65536);
  1033. db = _AbsL(g_ui[PUB_AC_UBC2].p - g_ui[PUB_AC_UCA2].p+240*65536);
  1034. dc = _AbsL(g_ui[PUB_AC_UAB2].p - g_ui[PUB_AC_UCA2].p+120*65536);
  1035. Umin=g_sw_pub.m2_min[3];
  1036. }
  1037. bok=pRunSet->bTT_CheckPhase
  1038. &&(Umin>pRunSet->dVOL16V_SQR) //最小电压大于16V
  1039. &&bCheck
  1040. &&((da>ANG_PHASEYC)||(db>ANG_PHASEYC)||(dc>ANG_PHASEYC)); //三相电压角度差15度
  1041. RunTR(&tPT.tTPT2XXYC, bok, dStep);
  1042. if(tPT.tTPT2XXYC.boolTrip)
  1043. {
  1044. if(soe_check(EV_PT2XXYC)==false) //
  1045. {
  1046. soe_record_ev(EV_PT2XXYC, 1, 0,0,0 );
  1047. }
  1048. }
  1049. else
  1050. {
  1051. if(soe_check(EV_PT2XXYC)==true) //
  1052. {
  1053. soe_record_ev(EV_PT2XXYC, 0, 0,0,0 );
  1054. }
  1055. }
  1056. }
  1057. }
  1058. #ifdef GD_AREA_ECZD_CHAOZHOU_2022
  1059. if((g_sw_pub.m2_min[2]<U_WY) && !bsxyl && tPT.uPT1DX.bFlag.bEvent)
  1060. {
  1061. ResetTR(&tPT.tTPT1DXTime); //清PT断线计时器避免返回时间内一直刷屏PT断线SOE
  1062. if(soe_check(EV_PT1ERR))
  1063. {
  1064. soe_record_ev(EV_PT1ERR,0, 0,0,0 );
  1065. }
  1066. tPT.uPT1DX.bFlag.bEvent=false;
  1067. tPT.uPT1DX.bFlag.bPTYC=false;
  1068. }
  1069. if((g_sw_pub.m2_min[3]<U_WY) && !bsxyl && tPT.uPT2DX.bFlag.bEvent)
  1070. {
  1071. ResetTR(&tPT.tTPT2DXTime); //清PT断线计时器避免返回时间内一直刷屏PT断线SOE
  1072. if(soe_check(EV_PT2ERR))
  1073. {
  1074. soe_record_ev(EV_PT2ERR,0, 0,0,0 );
  1075. }
  1076. tPT.uPT2DX.bFlag.bEvent=false;
  1077. tPT.uPT2DX.bFlag.bPTYC=false;
  1078. }
  1079. #endif
  1080. }
  1081. void FDL_Check(DWORD dStep)
  1082. {
  1083. int i;
  1084. struct equ_config_di *ecd;
  1085. int sw=0;
  1086. for(i=0;i<8;i++) //非电量跳闸
  1087. {
  1088. bool byx=false;
  1089. TFDL_T*pFDL=&g_tRelay[sw].tFdl[i];
  1090. if ((short)g_sw_pub.di_cfg_index[PUB_DI_FDL1+i] != INDEX_INVALLID)
  1091. {
  1092. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_FDL1+i]];
  1093. byx = dido_di_is_on(ecd->slot,ecd->index);
  1094. }
  1095. pFDL->sta.bFlag.bQD=byx&&(pRunSet->bTT_FDLGj[i]||pRunSet->bTT_FDLTz[i]);
  1096. RunTR(&pFDL->tFdlTime, pFDL->sta.bFlag.bQD, dStep);
  1097. pFDL->sta.bFlag.bTz=pFDL->tFdlTime.boolTrip&&pRunSet->bTT_FDLTz[i];
  1098. pFDL->sta.bFlag.bGj=pFDL->tFdlTime.boolTrip&&pRunSet->bTT_FDLGj[i];
  1099. if(pFDL->sta.bFlag.bTz)
  1100. {
  1101. if(soe_check(EV_FDL1_TZ+i)==false)
  1102. {
  1103. soe_record_ev( EV_FDL1_TZ+i, 1, 0,0,0 );
  1104. }
  1105. }
  1106. else
  1107. {
  1108. if(soe_check(EV_FDL1_TZ+i)==true)
  1109. {
  1110. soe_record_ev( EV_FDL1_TZ+i, 0, 0,0,0 );
  1111. }
  1112. }
  1113. if(pFDL->sta.bFlag.bGj)
  1114. {
  1115. if(soe_check(EV_FDL1_GJ+i)==false)
  1116. {
  1117. soe_record_ev( EV_FDL1_GJ+i, 1, 0,0,0 );
  1118. }
  1119. }
  1120. else
  1121. {
  1122. if(soe_check(EV_FDL1_GJ+i)==true)
  1123. {
  1124. soe_record_ev( EV_FDL1_GJ+i, 0, 0,0,0 );
  1125. }
  1126. }
  1127. }
  1128. }
  1129. void Pro_3U0(int sw,DWORD dStep)
  1130. {
  1131. bool bQDD;
  1132. TRELAY_T *pR=&g_tRelay[sw];
  1133. TU0_T *pSW=&pR->tOVER_U0TZ;
  1134. TSWST *pSWST =&pR->tSWST;
  1135. TSETSW *pSet = &pRunSet->tSwSet[sw];
  1136. DWORD U01 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1137. DWORD U02 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U02].m2[0]), 256, g_ui[PUB_AC_U02].m2_factor_k);
  1138. /***********启动 **********************************/
  1139. 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);
  1140. pSW->uZOV.bFlag.bQD = BH_ALL_EN(sw)
  1141. && (pSet->bTT_3U0Tz||pSet->bTT_3U0Gj)//投退字
  1142. //&& pSWST->uSWST.bFlag.bHZWZ //在合闸位置
  1143. && bQDD
  1144. && (!tPT.uPT1DX.bFlag.bPTYC);
  1145. #ifdef EV_GL_STATR
  1146. lx_start_soe_set( pSW->uZOV.bFlag.bQD,sw,EV_U0_STATR);
  1147. #endif
  1148. /***********零序过压分闸*********************************/
  1149. RunTR(&pSW->tZOVTime, pSW->uZOV.bFlag.bQD, dStep);
  1150. pSW->uZOV.bFlag.bTz = pSW->tZOVTime.boolTrip && pSet->bTT_3U0Tz && pSWST->uSWST.bFlag.bHZWZ;
  1151. pSW->uZOV.bFlag.bGJ = pSW->tZOVTime.boolTrip&&pSet->bTT_3U0Gj;
  1152. /************事件记录及出口****************************/
  1153. if(pSW->uZOV.bFlag.bTz)
  1154. {
  1155. if(!pSW->uZOV.bFlag.bEvent)
  1156. {
  1157. soe_record_ev( EV_U0TZ+sw*EV_SW_NUM, 1, U01>U02?U01:U02,0,0 );
  1158. rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD);
  1159. pSW->uZOV.bFlag.bEvent = true;
  1160. pSW->bU0Led = true;
  1161. }
  1162. }
  1163. else
  1164. {
  1165. if(pSW->uZOV.bFlag.bEvent)
  1166. {
  1167. soe_record_ev(EV_U0TZ+sw*EV_SW_NUM, 0, 0,0,0 );
  1168. pSW->uZOV.bFlag.bEvent = false;
  1169. pSW->uZOV.bFlag.bU0Ov = false;
  1170. }
  1171. }
  1172. /************告警记录****************************/
  1173. if(pSW->uZOV.bFlag.bGJ)
  1174. {
  1175. if(!pSW->uZOV.bFlag.bGJEvent)
  1176. {
  1177. soe_record_ev( EV_U0GJ+sw*EV_SW_NUM, 1, U01>U02?U01:U02,0,0 );
  1178. rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD);
  1179. pSW->uZOV.bFlag.bGJEvent = true;
  1180. if(pSW->bU0Led == false)
  1181. {
  1182. pSW->bU0GjLed = true;
  1183. }
  1184. }
  1185. }
  1186. else
  1187. {
  1188. if(pSW->uZOV.bFlag.bGJEvent)
  1189. {
  1190. soe_record_ev(EV_U0GJ+sw*EV_SW_NUM, 0, 0,0,0 );
  1191. pSW->uZOV.bFlag.bGJEvent = false;
  1192. pSW->uZOV.bFlag.bU0Ov = false;
  1193. }
  1194. }
  1195. }
  1196. #ifdef CUSTOMIZE_BZT //备自投
  1197. void vol_lost_tz(int sw, DWORD dStep) // 失压跳闸
  1198. {
  1199. bool bQDD1, bQDD2,pt1cyy,pt2cyy;
  1200. VOL_SET *pSet = &pRunSet->tVolLostSet;
  1201. TVOL_T *pvol = &g_tVolLost;
  1202. DWORD pt1_value,pt2_value;
  1203. TRELAY_T *pR = &g_tRelay[sw];
  1204. UBZT *uBZT = &pR->tBzt.uBZT;
  1205. pt1_value = g_sw_pub.m2_max[2];
  1206. pt2_value = g_sw_pub.m2_max[3];
  1207. pt1cyy = OverRelay(pt1_value, pSet->dUVol, pSet->dUVol,false);
  1208. pt2cyy = OverRelay(pt2_value, pSet->dUVol, pSet->dUVol,false);
  1209. //曾有压
  1210. RunTR(&pvol->tCYYTime, pt1cyy || pt2cyy, dStep);
  1211. pvol->sta.bFlag.bCYY = pvol->tCYYTime.boolTrip || pvol->sta.bFlag.bCYY;
  1212. /***********启动 **********************************/
  1213. bQDD1 = LowRelay(pt1_value, pSet->dUVol, pSet->dUVol_fh, pvol->sta.bFlag.bQD);
  1214. bQDD2 = LowRelay(pt2_value, pSet->dUVol, pSet->dUVol_fh, pvol->sta.bFlag.bQD);
  1215. pvol->sta.bFlag.bQD = bQDD1 && bQDD2 && pvol->sta.bFlag.bCYY && pSet->bTT && pR->tSWST.uSWST.bFlag.b1DLHW;
  1216. if(!pR->tSWST.uSWST.bFlag.b1DLHW)
  1217. pvol->sta.bFlag.bCYY = 0;
  1218. /***********失压分闸*********************************/
  1219. RunTR(&pvol->tQDTime, pvol->sta.bFlag.bQD, dStep);
  1220. pvol->sta.bFlag.bTz = pvol->tQDTime.boolTrip;
  1221. //pvol->sta.bFlag.bGJ = pvol->tQDTime.boolTrip;
  1222. /************事件记录及出口****************************/
  1223. if(pvol->sta.bFlag.bTz)
  1224. {
  1225. pvol->sta.bFlag.bCYY = false;
  1226. if(!pvol->sta.bFlag.bEvent)
  1227. {
  1228. DWORD Us1,Us2;
  1229. Us1 = _Mul_Div_U(sqrt_32fix(pt1_value), 256, pRunSet->dKU[PUB_AC_UAB1]);
  1230. Us2 = _Mul_Div_U(sqrt_32fix(pt2_value), 256, pRunSet->dKU[pRunSet->pt2vol]);
  1231. if(soe_check(EV_SYTZ)==false)
  1232. {
  1233. soe_record_ev(EV_SYTZ, 1, Us1,Us2,0 );
  1234. }
  1235. rcd_start(sw,RECORD_TYPE_XLSY, RECORD_LEN_TZQD); //录波类型:跳闸类
  1236. pvol->sta.bFlag.bEvent = true;
  1237. //pSW->uLostVot.bFlag.bTz=true; //执行跳闸标志
  1238. sw_do(sw,SW_DO_HZ,SW_DO_TYPE_OFF);
  1239. sw_do(sw,SW_DO_BHH,SW_DO_TYPE_OFF);
  1240. sw_do(sw,SW_DO_BHDZ,SW_DO_TYPE_ON);
  1241. sw_do(sw,SW_DO_FZ,SW_DO_TYPE_ON);
  1242. sw_do(sw,SW_DO_BHT,SW_DO_TYPE_ON);
  1243. if(uBZT->bBZT.bZF && pRunSet->tSwSet[sw].bBZT_TT)
  1244. {
  1245. 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))
  1246. {
  1247. sw_do(sw,SW_DO_DL1_FZ,SW_DO_TYPE_ON);
  1248. }
  1249. 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))
  1250. {
  1251. sw_do(sw,SW_DO_DL2_FZ,SW_DO_TYPE_ON);
  1252. }
  1253. uBZT->bBZT.bSYFZ = 1;
  1254. }
  1255. }
  1256. }
  1257. else
  1258. {
  1259. if(pvol->sta.bFlag.bEvent)
  1260. {
  1261. soe_record_ev(EV_SYTZ, 0, 0,0,0 );
  1262. pvol->sta.bFlag.bEvent = false;
  1263. }
  1264. pvol->sta.bFlag.bTz=false;
  1265. }
  1266. }
  1267. #endif
  1268. #if (0)
  1269. /**************************************************************************
  1270. 函数名称:Pro_U0Tz
  1271. 函数版本:1.00
  1272. 作者: 赵海洋
  1273. 创建日期:2022.2.25
  1274. 函数功能说明:零压跳闸默认检测零压1
  1275. 输入参数:
  1276. 其他输入:
  1277. 输出参数:
  1278. 返回值:
  1279. ***************************************************************************/
  1280. void Pro_U0Tz(int sw,DWORD dStep)
  1281. {
  1282. bool bQDD;
  1283. TRELAY_T *pR=&g_tRelay[sw];
  1284. TVOL_T *pvol = &pR->tU0GZ;
  1285. VOL_SET *pSet = &pRunSet->tSwSet[sw].tU0Set;
  1286. bQDD = OverRelay(g_ui[PUB_AC_U01].m2[0], pSet->dUVol,pSet->dUVol_fh,pvol->sta.bFlag.bQD);
  1287. pvol->sta.bFlag.bQD = ((pSet->bTT || pSet->bTz)&& bQDD);
  1288. if(pvol->sta.bFlag.bQD)
  1289. {
  1290. if(!pvol->sta.bFlag.bQDWave)
  1291. {
  1292. rcd_start(sw,RECORD_TYPE_LXDY, RECORD_LEN_TZQD); //录波类型:跳闸类
  1293. pvol->sta.bFlag.bQDWave = true;
  1294. }
  1295. }
  1296. /***********动作*********************************/
  1297. RunTR(&pvol->tQDTime, pvol->sta.bFlag.bQD, dStep);
  1298. if (pSet->bTT)pvol->sta.bFlag.bGj = pvol->tQDTime.boolTrip;
  1299. if (pSet->bTz)pvol->sta.bFlag.bTz = pvol->tQDTime.boolTrip;
  1300. /************事件记录及出口****************************/
  1301. if(pvol->sta.bFlag.bGj)
  1302. {
  1303. if(soe_check(EV_LYGJ+sw*EV_SW_NUM)==false)
  1304. {
  1305. DWORD U0;
  1306. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1307. soe_record_ev(EV_LYGJ+sw*EV_SW_NUM,1, U0,0,0);
  1308. }
  1309. }
  1310. else
  1311. {
  1312. if(soe_check(EV_LYGJ+sw*EV_SW_NUM)==true)
  1313. {
  1314. pvol->sta.bFlag.bQDWave = false;
  1315. soe_record_ev(EV_LYGJ+sw*EV_SW_NUM,0, 0,0,0 );
  1316. }
  1317. }
  1318. if(pvol->sta.bFlag.bTz)
  1319. {
  1320. if(soe_check(EV_LYTZ+sw*EV_SW_NUM)==false)
  1321. {
  1322. DWORD U0;
  1323. U0 = _Mul_Div_U(sqrt_32fix(g_ui[PUB_AC_U01].m2[0]), 256, g_ui[PUB_AC_U01].m2_factor_k);
  1324. soe_record_ev(EV_LYTZ+sw*EV_SW_NUM,1, U0,0,0);
  1325. }
  1326. }
  1327. else
  1328. {
  1329. if(soe_check(EV_LYTZ+sw*EV_SW_NUM)==true)
  1330. {
  1331. pvol->sta.bFlag.bQDWave = false;
  1332. soe_record_ev(EV_LYTZ+sw*EV_SW_NUM,0, 0,0,0 );
  1333. }
  1334. }
  1335. }
  1336. #endif
  1337. // = ========================= 本文件结束 =============================