reclose.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. /*************************************************************************
  2. * 版权所有:
  3. * 文件版本: V1.00
  4. * 文件名称: reclose.c
  5. * 生成日期: 2007年10月15日
  6. * 作 者: 保护部 MWD
  7. * 功 能: 重合闸模块
  8. 包含: 重合闸数据准备、
  9. 检同期数据准备、
  10. 抽取电压数据判别、
  11. 闭锁重合闸判别、
  12. 充电、
  13. 重合闸启动、
  14. 重合闸检定、
  15. 重合逻辑
  16. **************************************************************************/
  17. #define __RECLOSE_C
  18. #include "head.h"
  19. /**********************************************************************
  20. 定义全局变量
  21. ***********************************************************************/
  22. /*------------------------------ 函数声明 -------------------------------------
  23. */
  24. static void AR_DataSet(int sw);
  25. static void AR_Recharge(int sw,DWORD dStep);
  26. static void AR_Disable(int sw);
  27. static void AR_Start(int sw,DWORD dStep);
  28. static void AR_Logic(int sw,DWORD dStep);
  29. static void AR_Reset(int sw,DWORD dStep);
  30. static void ARTQ_DataSet(int sw);
  31. /**************************************************************************
  32. 函数名称: AutoReclose
  33. 函数版本:1.00
  34. 作者: 硬件部
  35. 创建日期:2010.4.28
  36. 函数功能说明:重合闸功能块
  37. 输入参数:
  38. 输出参数:
  39. 返回值:
  40. ***************************************************************************/
  41. void AutoReclose(int sw,DWORD dStep)
  42. {
  43. AR_DataSet(sw); // 重合闸数据准备
  44. ARTQ_DataSet(sw);
  45. AR_Recharge(sw,dStep); // 重合闸充电
  46. AR_Disable(sw); // 重合闸闭锁
  47. AR_Start(sw,dStep); // 重合闸启动
  48. AR_Logic(sw,dStep); // 重合闸逻辑
  49. AR_Reset(sw,dStep); // 重合闸复归
  50. return;
  51. }
  52. void ARTQ_DataSet(int sw)
  53. {
  54. TCH_T *pSW=&g_tRelay[sw].tCHZ;
  55. TSETSW *pSet = &pRunSet->tSwSet[sw];
  56. bool bDa=false;
  57. bool bDu=false;
  58. long deltaA;
  59. qs16 ang2=0;
  60. TRELAY_T *pR=&g_tRelay[sw];
  61. static int print_flag=0;
  62. if(pRunSet->pt2vol==PUB_AC_UAB1)ang2=0;
  63. else if(pRunSet->pt2vol==PUB_AC_UBC1)ang2=-120*65536;
  64. else if(pRunSet->pt2vol==PUB_AC_UCA1)ang2=120*65536;
  65. else if(pRunSet->pt2vol==PUB_AC_UAB2)ang2=0;
  66. else if(pRunSet->pt2vol==PUB_AC_UBC2)ang2=-120*65536;
  67. else if(pRunSet->pt2vol==PUB_AC_UCA2)ang2=120*65536;
  68. pSW->sta.bFlag.bMxYY = OverRelay(g_ui[PUB_AC_UAB1].m2[0], pSet->dU_chz_yy,pSet->dU_chz_yy,false);
  69. pSW->sta.bFlag.bMxWY = LowRelay(g_ui[PUB_AC_UAB1].m2[0], pSet->dU_chz_wy,pSet->dU_chz_wy,false);
  70. pSW->sta.bFlag.bUxYY = OverRelay(g_ui[pRunSet->pt2vol].m2[0], pSet->dU_chz_yy,pSet->dU_chz_yy,false);
  71. pSW->sta.bFlag.bUxWY = LowRelay(g_ui[pRunSet->pt2vol].m2[0], pSet->dU_chz_wy,pSet->dU_chz_wy,false);
  72. 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);
  73. //deltaA = _AbsL(deltaA+ang2);//
  74. //deltaA = _AbsL((g_ui[PUB_AC_UAB1].p -ang1)- (g_ui[pRunSet->pt2vol].p-ang2));
  75. //bDa=((_AbsL(deltaA) < pSet->dA_chz_deltaAng)?true:false)&&pSW->sta.bFlag.bMxYY&&pSW->sta.bFlag.bUxYY; //角差满足要求
  76. bDa=((_AbsL(deltaA+ang2) < pSet->dA_chz_deltaAng)?true:false)&&pSW->sta.bFlag.bMxYY&&pSW->sta.bFlag.bUxYY; //角差满足要求
  77. bDu=(_AbsL(g_ui[PUB_AC_UAB1].fz -g_ui[pRunSet->pt2vol].fz)<pSet->dU_chz_deltaU)?true:false; //压差满足要求
  78. pSW->sta.bFlag.bTQMZ=
  79. #ifdef CHZ_JWY_LM
  80. (pSet->bTT_chz_tq || pSet->bTT_chz_mwy || pSet->bTT_chz_lwy) //同期合闸
  81. #else
  82. (pSet->bTT_chz_tq||pSet->bTT_chz_wy) //同期合闸
  83. #endif
  84. &&pSW->sta.bFlag.bMxYY //母线有压
  85. &&pSW->sta.bFlag.bUxYY //线路有压
  86. &&bDu //压差满足
  87. &&bDa //角差满足
  88. &&!tPT.uPT1DX.bFlag.bPTYC //无PT 异常
  89. &&!tPT.uPT2DX.bFlag.bPTYC; //无PT 异常
  90. pSW->sta.bFlag.bMWYMZ=
  91. #ifdef CHZ_JWY_LM
  92. (pSet->bTT_chz_mwy&&pSW->sta.bFlag.bMxWY&&pSW->sta.bFlag.bUxYY) //母线无压&&线路有压
  93. #else
  94. (pSet->bTT_chz_wy) //无压合闸
  95. #endif
  96. &&pSW->sta.bFlag.bMxWY //母线有压
  97. &&!tPT.uPT1DX.bFlag.bPTYC; //无PT 异常
  98. pSW->sta.bFlag.bUWYMZ=
  99. #ifdef CHZ_JWY_LM
  100. (pSet->bTT_chz_lwy&&pSW->sta.bFlag.bUxWY&&pSW->sta.bFlag.bMxYY) //线路无压&&母线有压
  101. #else
  102. (pSet->bTT_chz_wy) //无压合闸
  103. #endif
  104. &&pSW->sta.bFlag.bUxWY //线路无压
  105. &&!tPT.uPT2DX.bFlag.bPTYC; //无PT 异常
  106. #ifdef GD_AREA_CHAOZHOU_CHAOAN_FUYANG //2012-12-30 投入“重合闸检无压”压板后必须要无压
  107. if(pSet->bTT_chz_wy)
  108. {
  109. pSW->sta.bFlag.bCHMZ=pSW->sta.bFlag.bTQMZ //同期满足
  110. ||pSW->sta.bFlag.bMWYMZ //母线无压满足
  111. ||pSW->sta.bFlag.bUWYMZ //线路无压满足
  112. ||((!pSet->bTT_chz_tq)&&(!pSet->bTT_chz_wy));
  113. }
  114. else
  115. {
  116. pSW->sta.bFlag.bCHMZ=pSW->sta.bFlag.bTQMZ //同期满足
  117. //||pSW->sta.bFlag.bMWYMZ //母线无压满足
  118. //||pSW->sta.bFlag.bUWYMZ //线路无压满足
  119. ||((!pSet->bTT_chz_tq)&&(!pSet->bTT_chz_wy));
  120. }
  121. #else
  122. pSW->sta.bFlag.bCHMZ=pSW->sta.bFlag.bTQMZ //同期满足
  123. ||pSW->sta.bFlag.bMWYMZ //母线无压满足
  124. ||pSW->sta.bFlag.bUWYMZ //线路无压满足
  125. #ifdef CHZ_JWY_LM
  126. ||((!pSet->bTT_chz_tq)&&(!pSet->bTT_chz_mwy)&&(!pSet->bTT_chz_lwy))
  127. #else
  128. ||((!pSet->bTT_chz_tq)&&(!pSet->bTT_chz_wy))
  129. #endif
  130. ;
  131. #endif
  132. if(pR->tCHZ.sta.bFlag.bCHQD)
  133. {
  134. if(!pSW->sta.bFlag.bTQMZ&&(print_flag++%(1*200))==0)//1S
  135. {
  136. if((!bDa)&&(pSet->bTT_chz_tq))
  137. rt_printf("角差不满足 pt1=%d pt2=%d ang2=%d 角差=%d 相位补偿后角差=%d dz=%d pt2vol=%d\r\n",(g_ui[PUB_AC_UAB1].p)/65536,(g_ui[pRunSet->pt2vol].p)/65536,ang2/65536,deltaA/65536,_AbsL(deltaA+ang2)/65536,pSet->dA_chz_deltaAng/65536,pRunSet->pt2vol);
  138. #ifndef CHZ_JWY_LM
  139. if((!bDu)&&(pSet->bTT_chz_wy))
  140. rt_printf("压差不满足\r\n");
  141. #endif
  142. }
  143. }
  144. }
  145. /**************************************************************************
  146. 函数名称:AR_DataSet
  147. 函数版本:1.00
  148. 函数版本:1.00
  149. 作者: 硬件部
  150. 创建日期:2010.4.28
  151. 函数功能说明:重合闸数据准备
  152. 输入参数:无
  153. 输出参数:
  154. 返回值: 无
  155. ***************************************************************************/
  156. static void AR_DataSet(int sw)
  157. {
  158. u16 wNo;
  159. TRELAY_T *pR=&g_tRelay[sw];
  160. TCH_T *pSW =&pR->tCHZ;
  161. TSETSW *pSet = &pRunSet->tSwSet[sw];
  162. wNo=0;
  163. if(pSW->wAR_ActTimes < MAX_AR_TIMES) // 根据重合次数,设置时间继电器
  164. {
  165. wNo = pSW->wAR_ActTimes;
  166. }
  167. InitTR_Time(&pSW->tTCHJD_ARDelay, pSet->dT_chz[wNo], 0 ); //重合闸延时
  168. InitTR_Time(&pSW->tTCHFAIL_TW, pSet->dT_chz[wNo]+T_1s, 0 ); //重合闸延时
  169. }
  170. /**************************************************************************
  171. 函数名称: AR_Disable
  172. 函数版本:1.00
  173. 作者: 保护产品部
  174. 创建日期:2007.10.11
  175. 函数功能说明:重合闸闭锁判别,刷新"闭锁重合闸"标
  176. 输入参数:
  177. 输出参数:
  178. 返回值:
  179. ***************************************************************************/
  180. static void AR_Disable(int sw)
  181. {
  182. TRELAY_T *pR=&g_tRelay[sw];
  183. TCH_T *pSW =& pR->tCHZ;
  184. pSW->sta.bFlag.bBSCH = pR->tOC[BH_GL1].sta.bFlag.bBSCH // 过流闭锁重合闸
  185. || pR->tOC[BH_GL2].sta.bFlag.bBSCH //
  186. || pR->tOC[BH_GL3].sta.bFlag.bBSCH //
  187. || pR->tOC[BH_LX1].sta.bFlag.bBSCH //
  188. || pR->tOC[BH_LX2].sta.bFlag.bBSCH //
  189. #ifdef DISP_SET_LX3
  190. || pR->tOC[BH_LX3].sta.bFlag.bBSCH //
  191. #endif
  192. ||pR->tLostVot.uLostVot.bFlag.bTz // 失压跳闸闭锁重合
  193. ||pR->tXXTZ.uZOV.bFlag.bTz
  194. #ifdef GD_AREA_ECZD_MEIZHOU_2021
  195. ||(pR->tDYJL.sta.bFlag.bTz && pRunSet->bTT_JLlockCHZ)
  196. ||(pR->tPLJL.sta.bFlag.bTz && pRunSet->bTT_JLlockCHZ)
  197. #else
  198. ||pR->tDYJL.sta.bFlag.bTz
  199. ||pR->tPLJL.sta.bFlag.bTz
  200. #endif
  201. ||pR->run_stu.bsch
  202. #ifndef PRO_UZ_START_REC//云浮要求零序电压能启动重合闸
  203. ||pR->tOVER_U0TZ.uZOV.bFlag.bTz
  204. #endif
  205. ||pR->tU0TZ.uZOV.bFlag.bTz //; // 零压分闸闭锁重合
  206. ||pR->run_stu.chzbs; //二次闭锁202004
  207. }
  208. /**************************************************************************
  209. 函数名称: AR_Recharge
  210. 函数版本:1.00
  211. 函数版本:1.00
  212. 作者: 硬件部
  213. 创建日期:2010.4.28
  214. 函数功能说明:重合闸充电,刷新"重合闸充电完成"标
  215. 输入参数:
  216. 输出参数:
  217. 返回值:
  218. ***************************************************************************/
  219. static void AR_Recharge(int sw,DWORD dStep)
  220. {
  221. TRELAY_T *pR=&g_tRelay[sw];
  222. TCH_T *pSW =&pR->tCHZ;
  223. TSETSW *pSet = &pRunSet->tSwSet[sw];
  224. bool bHCD1,bHCD2,bHCD3,bHCD4;
  225. #ifdef PRO_UZ_START_REC//云浮要求零序电压能启动重合闸
  226. bool bHCD5=false;
  227. RunTR(&pSW->tTCH_UO_BS, pR->tOVER_U0TZ.uZOV.bFlag.bQD && pSet->bTT_3U0Tz && pR->tSWST.uSWST.bFlag.bTZWZ, dStep);//有零序电压且跳位
  228. bHCD5 = pSW->tTCH_UO_BS.boolTrip;
  229. #endif
  230. // 放电条件
  231. RunTR(&pSW->tTCHFAIL_TW, pR->tSWST.uSWST.bFlag.bTZWZ, dStep); // 三相跳位延时
  232. bHCD1 = pSW->tTCHFAIL_TW.boolTrip; // 放电标志1:三相跳位时间到
  233. bHCD2 = (pR->tSWST.uSWST.bFlag.bTZWZ || pR->uBHDZ.bFlag.bBHT) //此处保护跳标志,是有100ms保持的信号
  234. && (!pSW->sta.bFlag.bCDWC); // 放电标志2:充电未完成,跳位或保护动作
  235. bHCD3 = pR->uRmtSW.bHandTz // 手动跳闸
  236. #ifdef SELF_OPEN_RELEASE
  237. || pR->uRmtSW.bSwTz // 开关拉杆跳闸
  238. #endif
  239. || pR->uRmtSW.bYTExecute // 遥控跳闸
  240. || pR->uBHDZ.bFlag.bTZSB // 跳闸失败
  241. || pR->tSWST.uSWST.bFlag.bTWYL // 跳位有流
  242. || (pR->tSWST.uSWST.bFlag.bWCN &&(!pSW->sta.bFlag.bCHQD)) // 弹簧未储能告警 正超广州样机重合闸启动后,收到弹簧未储能信号,重合闸不放电
  243. || pSW->sta.bFlag.bBSCH // 重合闸闭锁条件
  244. #ifdef GD_AREA_ECZD_2020
  245. ||(pSet->bTT_chz_wy && (tPT.uPT1DX.bFlag.bPTYC || tPT.uPT2DX.bFlag.bPTYC)) //无PT 异常; //检无压投入时,PT断线重合闸放电
  246. #endif
  247. || pR->tSWST.uSWST.bFlag.bIBSCHZ //大电流重合闸闭锁
  248. ||pR->tSWST.uSWST.bFlag.bKZHL; //控制回路断线检查
  249. //|| pSW->sta.bFlag.bCHFD; // 重合闸动作放电202004
  250. pSW->sta.bFlag.bFDBZ = (!BH_ALL_EN(sw)) // 总保护未投入
  251. || (!KZ_OUT_ALL_EN(sw)) // 控制出口未投入
  252. || (!pSet->bTT_CHZ) // 软压板: 重合闸未投入
  253. || (!pRunSet->bTT_CHZ_YB) // 重合闸软压板未投入
  254. || (!pR->run_stu.chzyb) // 重合闸硬压板未投入
  255. || bHCD1
  256. || bHCD2
  257. || bHCD3
  258. #ifdef PRO_UZ_START_REC
  259. || bHCD5
  260. #endif
  261. #ifdef FUNC_DRIVE_JY
  262. || gb_drive.b_bh_reclose
  263. #endif
  264. ;
  265. //放电清开放时间
  266. #ifdef FUN_CHZ_TOPEN
  267. if(pSW->sta.bFlag.bFDBZ)
  268. {
  269. pSW->sta.bFlag.bCHZOP=false;
  270. ResetTR(&pSW->tTCHOPENTime);
  271. }
  272. #endif
  273. if(pR->tSWST.uSWST.bFlag.bIBSCHZ&&pSW->sta.bFlag.bCDWC)
  274. {
  275. if(soe_check(EV_HI_CHZ_LOCK+sw*EV_SW_NUM)==false)
  276. {
  277. soe_record_ev( EV_HI_CHZ_LOCK+sw*EV_SW_NUM, 1, 0,0,0); // 重合闸闭锁
  278. }
  279. }
  280. else
  281. {
  282. if(!pR->tSWST.uSWST.bFlag.bIBSCHZ)
  283. {
  284. if(soe_check(EV_HI_CHZ_LOCK+sw*EV_SW_NUM)==true)
  285. {
  286. soe_record_ev( EV_HI_CHZ_LOCK+sw*EV_SW_NUM, 0, 0,0,0); // 重合闸闭锁
  287. }
  288. }
  289. }
  290. // 充电条件
  291. bHCD4 = !pSW->sta.bFlag.bFDBZ // 重合放电标
  292. && (((!pR->uBHQD.bFlag.bZQD) && pR->tSWST.uSWST.bFlag.bHZWZ ) // 非保护启动 && 合闸位置
  293. || pSW->sta.bFlag.bCDWC); // 充电完成自保持
  294. RunTR(&pSW->tTCHCD15s0s, bHCD4, dStep); // 充电15秒
  295. pSW->sta.bFlag.bCDWC = pSW->tTCHCD15s0s.boolTrip;
  296. if(pSW->sta.bFlag.bCDWC)
  297. {
  298. g_run_stu.cd|=(1<<sw);
  299. if(pSW->wAR_ActTimes>=pSet->d_chz_times)
  300. {
  301. g_run_stu.cd&=~(1<<sw);
  302. }
  303. if(soe_check(EV_ARCD+sw*EV_SW_NUM)==false) // 充电标志
  304. {
  305. soe_record_ev( EV_ARCD+sw*EV_SW_NUM,1, 0,0,0 );
  306. }
  307. #ifdef FUN_CHZ_TOPEN
  308. //终止重合返回
  309. if(soe_check(EV_CHZ_TOPEN+sw*EV_SW_NUM)==true)
  310. {
  311. soe_record_ev(EV_CHZ_TOPEN+sw*EV_SW_NUM, 0, 0,0,0); // 终止重合闸过程
  312. }
  313. #endif
  314. }
  315. else
  316. {
  317. #ifdef FUNC_DRIVE_JY
  318. if(BH_ALL_EN(sw))
  319. {
  320. gb_drive.b_drive_success = false; //充电未完成时,传动分后手合不允许报传动成功
  321. }
  322. #endif
  323. g_run_stu.cd&=~(1<<sw);
  324. if(soe_check(EV_ARCD+sw*EV_SW_NUM)==true) // // 充电标志
  325. {
  326. soe_record_ev( EV_ARCD+sw*EV_SW_NUM,0, 0,0,0 );
  327. }
  328. }
  329. }
  330. /**************************************************************************
  331. 函数名称: AR_Start
  332. 函数版本:1.00
  333. 函数版本:1.00
  334. 作者: 硬件部
  335. 创建日期:2010.4.28
  336. 函数功能说明:重合闸启动,刷新"三相偷跳启动重合闸"和"三跳启动重合闸"标
  337. 输入参数:
  338. 输出参数:
  339. 返回值:
  340. ***************************************************************************/
  341. static void AR_Start(int sw,DWORD dStep)
  342. {
  343. bool bCHQD_CHQD; // 三相启动重合闸
  344. TRELAY_T *pR=&g_tRelay[sw];
  345. TCH_T *pSW =&pR->tCHZ;
  346. TSETSW *pSet = &pRunSet->tSwSet[sw];
  347. bool bCQD1,bCQD2,bCQD3,bCQD4,bCQD5,bCQD6;
  348. // 不对应启动
  349. // 开关位置从合闸位置切换至分闸位置完成后,保留50ms展宽
  350. RunTR(&pSW->tTCHQDHW0ms50ms, pR->tSWST.uSWST.bFlag.bHZWZ, dStep);
  351. bCQD1 = pSW->tTCHQDHW0ms50ms.boolTrip;
  352. // 偷跳条件准备
  353. #ifdef GD_TEST_2021
  354. bCQD2 = pSet->bTT_TTCH_TT && bCQD1 && (!pR->tSWST.uSWST.bFlag.bHZWZ);
  355. #else
  356. bCQD2 = false;
  357. #endif
  358. // 保护启动
  359. // 保护动作后至保护动作返回,保留50ms展宽
  360. RunTR(&pSW->tTCHQD0ms50ms, pR->uBHDZ.bFlag.bBHTrip, dStep);
  361. bCQD3 = pSW->tTCHQD0ms50ms.boolTrip;
  362. // 重合已启动或保护启动,用于闭锁不对应启动
  363. bCQD4 = pSW->sta.bFlag.bCHQD || bCQD3;
  364. // 此处保护跳信号,是实时信号,即保护已返回
  365. bCQD5 = bCQD3 && (!pR->uBHDZ.bFlag.bBHTrip);
  366. // 重合启动自保持
  367. // 重合闸出口条件,用于防止重合闸合闸过程中,TWJ没有返回时,再次误发启动重合闸报文。
  368. bCQD6 = pSW->sta.bFlag.bCDWC // 重合充电完成
  369. && pSW->sta.bFlag.bCHQD // 三相启动重合闸
  370. && (!pSW->sta.bFlag.bCHCK); // 重合闸出口,取反
  371. // 偷跳启动重合闸
  372. pSW->sta.bFlag.bTTQD = pSW->sta.bFlag.bCDWC // 重合闸充电完成
  373. && bCQD2 // 偷跳判断完成
  374. && (!bCQD4); // 重合未启动,无保护跳过程
  375. // 三跳启动重合闸
  376. pSW->sta.bFlag.bTLQD = pSW->sta.bFlag.bCDWC // 重合闸充电完成
  377. &&bCQD5 // 有保护跳过程,而且保护已经返回,即故障已经解除
  378. && (!pSW->sta.bFlag.bCHQD); // 三相启动重合闸未启动
  379. // 三相启动重合闸
  380. bCHQD_CHQD = (((pSW->wAR_ActTimes<pSet->d_chz_times)&& // 重合次数未满 202004
  381. (pSW->sta.bFlag.bTTQD // 偷跳启动重合闸
  382. || pSW->sta.bFlag.bTLQD // 三跳启动重合闸
  383. || bCQD6)) // 三相启动重合闸
  384. #ifdef FUNC_DRIVE_JY
  385. || gb_drive.b_bh_reclose
  386. #endif
  387. );
  388. if( bCHQD_CHQD )
  389. {
  390. if( !pSW->sta.bFlag.bCHQD ) //重合开出标尚未置位
  391. {
  392. pSW->sta.bFlag.bCHQD = true; //此标志会一直维持到重合闸出口或充电标志放电
  393. pSW->sta.bFlag.bQDFG=true; //整组复归时有效202004
  394. soe_record_ev(EV_AR_START+sw*EV_SW_NUM, 1, 0,0,0);//重合启动SOE
  395. //rcd_start(sw,RECORD_TYPE_CHZ, RECORD_LEN_TZQD); //录波类型:跳闸类
  396. #ifdef EV_CHZ_FG
  397. if(soe_check(EV_ARFG+sw*EV_SW_NUM)==true) //202004
  398. {
  399. soe_record_ev(EV_ARFG+sw*EV_SW_NUM, 0, 0,0,0); // 重合闸复归
  400. }
  401. #endif
  402. }
  403. }
  404. else
  405. {
  406. if( pSW->sta.bFlag.bCHQD )
  407. {
  408. pSW->sta.bFlag.bCHQD = false;
  409. soe_record_ev(EV_AR_START+sw*EV_SW_NUM,0 ,0,0,0);
  410. }
  411. }
  412. #ifdef FUN_CHZ_TOPEN
  413. //重合开放计时
  414. pSW->sta.bFlag.bCHZOP = bCHQD_CHQD||pSW->sta.bFlag.bCHZOP;
  415. RunTR(&pSW->tTCHOPENTime, pSW->sta.bFlag.bCHZOP, dStep); //重合开放延时
  416. if(pSW->tTCHOPENTime.boolTrip)//重合闸开放时间到复归
  417. {
  418. pSW->sta.wfFlag=0;
  419. pR->tCHZ.wAR_ActTimes=0;
  420. rt_printf("重合闸开放时间到:整组复归!\r\n");
  421. ResetTR(&pR->tCHZ.tTCHJD_ARDelay);//延时
  422. ResetTR(&pR->tCHZ.tTCHJD_HJS);//后加速延时
  423. ResetTR(&pSW->tTCHFAIL_TW);//重合失败
  424. ResetTR(&pSW->tTCHOKTime);//重合成功
  425. ResetTR(&pSW->tTCHBSDelay);//重合闭锁延时
  426. ResetTR(&pSW->tTCHJBSTime); //重合闭锁时间
  427. ResetTR(&pSW->tTCHCD15s0s); //重合充电时间
  428. #ifdef PRO_UZ_START_REC
  429. ResetTR(&pSW->tTCH_UO_BS); //U0闭锁确认
  430. #endif
  431. //soe
  432. if(soe_check(EV_CHZ_TOPEN+sw*EV_SW_NUM)==false)
  433. {
  434. soe_record_ev(EV_CHZ_TOPEN+sw*EV_SW_NUM, 1, 0,0,0); // 终止重合闸过程
  435. }
  436. }
  437. #endif
  438. }
  439. /**************************************************************************
  440. 函数名称: AR_Logic
  441. 函数版本:1.00
  442. 函数版本:1.00
  443. 作者: 硬件部
  444. 创建日期:2010.4.28
  445. 函数功能说明:重合闸逻辑判断
  446. 输入参数:
  447. 输出参数:
  448. 返回值:
  449. ***************************************************************************/
  450. static void AR_Logic(int sw,DWORD dStep)
  451. {
  452. bool bWCN;
  453. TRELAY_T *pR=&g_tRelay[sw];
  454. TCH_T *pSW =&pR->tCHZ;
  455. TSETSW *pSet = &pRunSet->tSwSet[sw];
  456. bool bHZL1,bHZL2,bHZL3,bHZL4,bHZL5,bHZL6,bHZL8;
  457. #ifdef GD_AREA_ECZD_MEIZHOU_2021
  458. bool bYYOK,bFreqOK;
  459. DWORD freq0,freq1;
  460. bool bVABL_OK,bVABH_OK,bVBCL_OK,bVBCH_OK;
  461. #endif
  462. // 重合闸条件准备
  463. bHZL1 = (BH_ALL_EN(sw) // 总投退
  464. && pSet->bTT_CHZ // 软压板: 重合闸投
  465. && pRunSet->bTT_CHZ_YB // 软压板: 重合闸投
  466. && pR->run_stu.chzyb // 重合闸硬压板投入
  467. && ((pSW->sta.bFlag.bCHQD // 三相启动重合闸
  468. && pSW->sta.bFlag.bCDWC) // 重合闸充电完成
  469. #ifdef FUNC_DRIVE_JY
  470. || gb_drive.b_bh_reclose
  471. #endif
  472. ));
  473. #ifdef GD_AREA_ECZD_MEIZHOU_2021
  474. if(pRunSet->bTT_StartCHZ_judgeVolt)
  475. {
  476. bVABL_OK = OverRelay(g_sw_pub.m2_max[2], pSet->dU_jl_ddy, pSet->dU_reclose_ddy_fh, pSW->CHZ_Judge_V_F.bVABLOK) ;
  477. bVABH_OK = LowRelay(g_sw_pub.m2_max[2], pSet->dU_jl_gdy, pSet->dU_reclose_gdy_fh, pSW->CHZ_Judge_V_F.bVABHOK) ;
  478. pSW->CHZ_Judge_V_F.bVABLOK = bVABL_OK;
  479. pSW->CHZ_Judge_V_F.bVABHOK = bVABH_OK;
  480. bVBCL_OK = OverRelay(g_sw_pub.m2_max[3], pSet->dU_jl_ddy, pSet->dU_reclose_ddy_fh, pSW->CHZ_Judge_V_F.bVBCLOK) ;
  481. bVBCH_OK = LowRelay(g_sw_pub.m2_max[3], pSet->dU_jl_gdy, pSet->dU_reclose_gdy_fh, pSW->CHZ_Judge_V_F.bVBCHOK) ;
  482. pSW->CHZ_Judge_V_F.bVBCLOK = bVBCL_OK;
  483. pSW->CHZ_Judge_V_F.bVBCHOK = bVBCH_OK;
  484. if((bVABL_OK && bVABH_OK) && (bVBCL_OK && bVBCH_OK)) //需双侧电压均满足条件才允许重合闸
  485. {
  486. bYYOK = true;
  487. }
  488. else
  489. {
  490. bYYOK = false;
  491. }
  492. }
  493. else
  494. {
  495. bYYOK = true;
  496. }
  497. if(pRunSet->bTT_StartCHZ_judgeFreq)
  498. {
  499. freq0 = freq_get(0)*65536;
  500. freq1 = freq_get(1)*65536;
  501. if(((freq0 >= pRunSet->tSwSet[sw].dU_jl_dhz) && (freq0 <= pRunSet->tSwSet[sw].dU_jl_ghz))
  502. && ((freq1 >= pRunSet->tSwSet[sw].dU_jl_dhz) && (freq1 <= pRunSet->tSwSet[sw].dU_jl_ghz))) //需双侧频率均满足条件才允许重合闸
  503. {
  504. bFreqOK = true;
  505. }
  506. else
  507. {
  508. bFreqOK = false;
  509. }
  510. }
  511. else
  512. {
  513. bFreqOK = true;
  514. }
  515. RunTR(&pSW->tTCHJD_ARDelay, bHZL1 && bYYOK && bFreqOK, dStep); //重合延时
  516. #else
  517. RunTR(&pSW->tTCHJD_ARDelay, bHZL1, dStep); //重合延时
  518. #endif
  519. bHZL2 = pSW->tTCHJD_ARDelay.boolTrip&& pSW->sta.bFlag.bCHMZ;
  520. // 弹簧未储能下降沿展宽30ms
  521. bWCN = pR->run_stu.wcn && pSet->bTT_WCN;
  522. RunTR(&pSW->tTCHJD_0ms30ms, bWCN, dStep);
  523. bHZL3 = pSW->tTCHJD_0ms30ms.boolTrip;
  524. // 重合闸条件准备好,弹簧储能OK,重合闸出口
  525. pSW->sta.bFlag.bCHCK = (!bHZL3) && bHZL2;
  526. // 重合闸开出自保持
  527. bHZL4 = pSW->sta.bFlag.bHz || pSW->sta.bFlag.bCHCK;
  528. // 重合开出持续200ms
  529. RunTR(&pSW->tTCHJD_200ms0ms, bHZL4, dStep);
  530. bHZL5 = pSW->tTCHJD_200ms0ms.boolTrip;
  531. // 重合闸开出,经过200ms后开出解除
  532. pSW->sta.bFlag.bHz =bHZL4 && (!bHZL5);
  533. // 重合闸指令发出后,且开关已经跳闸完成
  534. bHZL6 = pSW->sta.bFlag.bHz || pSW->sta.bFlag.bHZL7;
  535. pSW->sta.bFlag.bHZL7 = pR->tSWST.uSWST.bFlag.bTZWZ && bHZL6;
  536. // 开放后加速允许有效延时200ms展宽
  537. RunTR(&pSW->tTCHJD_HJS, pSW->sta.bFlag.bHZL7, dStep);
  538. bHZL8 = pSW->tTCHJD_HJS.boolTrip;
  539. pSW->sta.bFlag.bCHJS = pSW->tTCHJD_HJS.boolTrip
  540. && (!pR->tSWST.uSWST.bFlag.bTZWZ);
  541. //出口及发信
  542. if(pSW->sta.bFlag.bHz)
  543. {
  544. if(!pSW->sta.bFlag.bEvent) //重合开出标尚未置位
  545. {
  546. //亮重合动作灯
  547. pSW->sta.bFlag.bCHZLed = true;
  548. pSW->wAR_ActTimes++; //重合动作次数
  549. pSW->sta.bFlag.bEvent = true;
  550. //pSW->uCHFG.wfFlag=0; //每次重合出口后,清重合复归标志 修改时注意,此处需对标志字特殊处理
  551. pSW->sta.bFlag.bCHDZ=false; //重合闸动作
  552. pSW->sta.bFlag.bBYSD=false; //重合闸闭锁时间到
  553. pSW->sta.bFlag.bCHFD=false; //重合闸动作放电
  554. pSW->sta.bFlag.bCHBS=false; //重合闸闭锁
  555. pSW->sta.bFlag.bCK=false; //放电条件1
  556. if(pSW->wAR_ActTimes==1)
  557. {
  558. soe_record_ev(EV_AR1+sw*EV_SW_NUM, 1, 0,0,0); //重合动作SOE
  559. }
  560. else if(pSW->wAR_ActTimes==2)
  561. {
  562. soe_record_ev(EV_AR2+sw*EV_SW_NUM, 1, 0,0,0); //重合动作SOE
  563. }
  564. else if(pSW->wAR_ActTimes==3)
  565. {
  566. soe_record_ev(EV_AR3+sw*EV_SW_NUM, 1, 0,0,0); //重合动作SOE
  567. }
  568. rcd_start(sw,RECORD_TYPE_CHZ,RECORD_LEN_TZQD);
  569. ResetTR(&pSW->tTCHFAIL_TW); // 重合出口后,重新复归时间继电器
  570. ResetTR(&pSW->tTCHOKTime); //重合成功时间继电器,在重合出口后重新计数
  571. ResetTR(&pSW->tTCHBSDelay); //闭锁重合延时继电器重新计数
  572. ResetTR(&pSW->tTCHJBSTime); //闭锁重合延时继电器重新计数
  573. //RunTR(&pSW->tTCHJBSTime, 1, 1); //重合闸动作后,该计时器计时,在确认时间内有保护动作,置重合闸闭锁标志
  574. #ifdef FUNC_DRIVE_JY
  575. gb_drive.b_bh_reclose = false;
  576. #endif
  577. }
  578. }
  579. else
  580. {
  581. if( pSW->sta.bFlag.bEvent ) //重合开出标尚未置位
  582. {
  583. pSW->sta.bFlag.bEvent = false;
  584. if(soe_check(EV_AR1+sw*EV_SW_NUM))
  585. {
  586. soe_record_ev(EV_AR1+sw*EV_SW_NUM, 0, 0,0,0 ); //重合1动作SOE返回
  587. }
  588. if(soe_check(EV_AR2+sw*EV_SW_NUM))
  589. {
  590. soe_record_ev(EV_AR2+sw*EV_SW_NUM, 0, 0,0,0 ); //重合2动作SOE返回
  591. }
  592. if(soe_check(EV_AR3+sw*EV_SW_NUM))
  593. {
  594. soe_record_ev(EV_AR3+sw*EV_SW_NUM, 0, 0,0,0 ); //重合2动作SOE返回
  595. }
  596. }
  597. }
  598. }
  599. /**************************************************************************
  600. 函数名称: AR_Reset
  601. 函数版本:1.00
  602. 函数版本:1.00
  603. 作者: 硬件部
  604. 创建日期:2010.4.28
  605. 函数功能说明:重合闸复归逻辑
  606. 输入参数:
  607. 输出参数:
  608. 返回值:
  609. ***************************************************************************/
  610. static void AR_Reset(int sw,DWORD dStep)
  611. {
  612. TRELAY_T *pR=&g_tRelay[sw];
  613. TCH_T *pSW =&pR->tCHZ;
  614. TSETSW *pSet = &pRunSet->tSwSet[sw];
  615. bool bFD1,bCHBS1,bCHBS2;
  616. // 重合闸出口自锁202004
  617. pSW->sta.bFlag.bCHDZ = (pSW->sta.bFlag.bCHCK || pSW->sta.bFlag.bCHDZ);
  618. // 二次重合闭锁(未到最后一次重合) 202004
  619. RunTR(&pSW->tTCHBSDelay, (pSW->sta.bFlag.bCHDZ && pSW->wAR_ActTimes<pSet->d_chz_times), dStep);
  620. pSW->sta.bFlag.bBYSD = pSW->tTCHBSDelay.boolTrip;
  621. bCHBS1= (pSW->sta.bFlag.bCHDZ && pSW->wAR_ActTimes<pSet->d_chz_times)
  622. &&(!pSW->sta.bFlag.bBYSD); // 重合闸闭锁时间未到
  623. //重合闭锁(最后一次)
  624. //重合闸动作后,该计时器计时,在确认时间内有保护动作,置重合闸闭锁标志
  625. RunTR(&pSW->tTCHJBSTime, (pSW->sta.bFlag.bCHDZ && pSW->wAR_ActTimes>=pSet->d_chz_times), dStep);
  626. bCHBS2= pSW->tTCHJBSTime.boolTrip;
  627. //重合闸闭锁
  628. pSW->sta.bFlag.bCHBS = pR->uBHDZ.bFlag.bBHT
  629. &&(bCHBS1||bCHBS2);
  630. if(pSW->sta.bFlag.bCHBS )
  631. {
  632. if(soe_check(EV_ARBS+sw*EV_SW_NUM)==false)
  633. {
  634. led_set_sw(sw,SW_LED_CHZBS, LED_ON);//重合闸闭锁灯与充电灯功能相反
  635. soe_record_ev( EV_ARBS+sw*EV_SW_NUM, 1, 0,0,0); // 重合闸闭锁
  636. g_tRelay[sw].run_stu.chzbs=true;
  637. }
  638. ResetTR(&pSW->tTCHJBSHw);
  639. ResetTR(&pSW->tTCHJBSTime);
  640. ResetTR(&pSW->tTCHOKTime);
  641. ResetTR(&pSW->tTCHBSDelay);
  642. pSW->sta.bFlag.bCHDZ=false;
  643. }
  644. //复归
  645. // 重合出口后,经过重合闸确认时间,无保护动作,即复归,完成该次重合过程202004
  646. // 如果在确认时间内,重合闭锁时间外,有保护动作,即进入下一计数重合
  647. pSW->sta.bFlag.bCK = ((!pR->uBHDZ.bFlag.bBHT)
  648. && (pSW->sta.bFlag.bCHCK || pSW->sta.bFlag.bCK)); //重合出口及自保持
  649. RunTR(&pSW->tTCHOKTime, pSW->sta.bFlag.bCK, dStep);
  650. bFD1 = pSW->tTCHOKTime.boolTrip;
  651. if(bFD1)
  652. {
  653. #ifdef EV_CHZ_FG
  654. if(soe_check(EV_ARFG+sw*EV_SW_NUM)==false)
  655. {
  656. soe_record_ev(EV_ARFG+sw*EV_SW_NUM, 1, 0,0,0); // 重合闸复归
  657. }
  658. #endif
  659. if(pR->tCHZ.wAR_ActTimes)
  660. rt_printf_time("重合闸复归\r\n");
  661. pSW->sta.bFlag.bCHDZ=false;
  662. pR->tCHZ.wAR_ActTimes=0;
  663. ResetTR(&pR->tCHZ.tTCHJD_HJS);
  664. ResetTR(&pSW->tTCHOKTime);
  665. ResetTR(&pSW->tTCHBSDelay);
  666. ResetTR(&pSW->tTCHJBSTime); //重合成功时间继电器,在重合出口后重新计数
  667. #ifdef FUN_CHZ_TOPEN
  668. pSW->sta.bFlag.bCHZOP=false;
  669. ResetTR(&pSW->tTCHOPENTime);
  670. #endif
  671. }
  672. // 手动/自动复归条件:(1)重合闸闭锁(2)重合已启动,但充电标志已清零
  673. if(g_tRelay[sw].run_stu.chzbs //闭锁
  674. || (!pSW->sta.bFlag.bCDWC && pSW->sta.bFlag.bQDFG))//已启动重合计时,又被放电
  675. {
  676. pSW->sta.bFlag.bQDFG = false;
  677. }
  678. }
  679. /***************************************endfile**********************************************************/