reclose.c 27 KB

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