run_status.c 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: run_status.c
  4. 文件版本: 01.01
  5. 创建作者: xxxxxx
  6. 创建日期: 2013-05-20
  7. 功能说明: 内部运行状态处理
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. /*------------------------------- 宏定义 --------------------------------------
  15. */
  16. enum
  17. {
  18. DIS_HEX, // 16进制
  19. DIS_DEC, // 10进制
  20. DIS_BIN, // 2进制
  21. DIS_NUM
  22. };
  23. #define INSTU_FILE_VERSION 0X01010101 //内部状态文件版本
  24. enum
  25. {
  26. RMTSTU_NULL, // 遥控器空闲态
  27. RMTSTU_ULOCK, // 遥控器解锁态
  28. RMTSTU_FZ, // 遥控器分闸态
  29. RMTSTU_HZ, // 遥控器合闸态
  30. RMTSTU_NUM,
  31. };
  32. /*------------------------------ 类型结构 -------------------------------------
  33. */
  34. /*------------------------------ 全局变量 -------------------------------------
  35. */
  36. u8 g_di_index[EQU_SLOT_NUM_MAX][16]; // 开入的应用功能与硬件对应关系
  37. //struct di_stu g_di_stu; // 开入的实时状态
  38. struct run_stu g_run_stu; // 内部运行状态
  39. struct rmt_oprate g_rmt_op; // 遥控器
  40. TIMERELAY g_tJLSDTime; // 交流失电定时器
  41. // 内部状态描述
  42. struct instu g_instu_desc[] =
  43. {
  44. {DIS_HEX, "重合充电", &g_run_stu.cd},
  45. {DIS_DEC, "交流失电", &g_run_stu.dcjlsd},
  46. {DIS_DEC, "交流失电带延时", &g_run_stu.dcjlsd_t},
  47. };
  48. const int INSTU_NUM = sizeof( g_instu_desc ) / sizeof(g_instu_desc[0]);
  49. /*------------------------------ 函数声明 -------------------------------------
  50. */
  51. int _rmt_key_app(u32 dStep);
  52. int _rst_key_app(void);
  53. int _create_instu_file(void);
  54. /*------------------------------ 外部函数 -------------------------------------
  55. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  56. */
  57. /******************************************************************************
  58. 函数名称: run_status_init
  59. 函数版本: 01.01
  60. 创建作者: xxxxxx
  61. 创建日期: 2015-10-23
  62. 函数说明: 内部运行状态初始化。
  63. 参数说明: 无
  64. 返回值: 成功返回0.
  65. 修改记录:
  66. */
  67. int run_status_init(void)
  68. {
  69. int slot, i,sw;
  70. u16 no=0;
  71. for (slot=0; slot<EQU_SLOT_NUM_MAX; slot++)
  72. {
  73. memset(&g_di_index[slot], INDEX_INVALLID, 16);
  74. }
  75. memset(&g_run_stu,0,sizeof(g_run_stu));
  76. // 检查装置配置
  77. if(equ_config_null())
  78. {
  79. return -1;
  80. }
  81. run_status_check(0);
  82. for (i=0; i<PUB_DI_NUM; i++)
  83. {
  84. no = g_sw_pub.di_cfg_index[i];
  85. if ((short)no != INDEX_INVALLID)
  86. {
  87. g_di_index[g_equ_config_di[no].slot][g_equ_config_di[no].index] = i;
  88. }
  89. }
  90. for (sw=0; sw<g_sw_num; sw++)
  91. {
  92. for (i=0; i<SW_DI_NUM; i++)
  93. {
  94. no = g_sw[sw].di_cfg_index[i];
  95. if ((short)no != INDEX_INVALLID)
  96. {
  97. g_di_index[g_equ_config_di[no].slot][g_equ_config_di[no].index] = i+PUB_DI_NUM+SW_DI_NUM*sw;
  98. }
  99. }
  100. }
  101. // 远方无配置,置无效
  102. if (((short)g_sw_pub.di_cfg_index[PUB_DI_YF] == INDEX_INVALLID)
  103. && ((short)g_sw_pub.di_cfg_index[PUB_DI_JD] == INDEX_INVALLID))
  104. {
  105. g_run_stu.yf = 0;
  106. }
  107. // 就地无配置,置无效
  108. if ((short)g_sw_pub.di_cfg_index[PUB_DI_YF] == INDEX_INVALLID)
  109. {
  110. g_run_stu.jd = 0;
  111. }
  112. // 复归无配置,置分
  113. if ((short)g_sw_pub.di_cfg_index[PUB_DI_RST] == INDEX_INVALLID)
  114. {
  115. g_run_stu.fg = 0;
  116. }
  117. // 电池交流失电无配置,置分
  118. if ((short)g_sw_pub.di_cfg_index[PUB_DI_DCJLSD] == INDEX_INVALLID)
  119. {
  120. g_run_stu.dcjlsd = 0;
  121. }
  122. // 电源故障无配置,置分
  123. if ((short)g_sw_pub.di_cfg_index[PUB_DI_DCDYGZ] == INDEX_INVALLID)
  124. {
  125. g_run_stu.dcdygz = 0;
  126. }
  127. // 电池欠压无配置,置分
  128. if ((short)g_sw_pub.di_cfg_index[PUB_DI_DCQY] == INDEX_INVALLID)
  129. {
  130. g_run_stu.dcqy = 0;
  131. }
  132. // 电池活化无配置,置分
  133. if ((short)g_sw_pub.di_cfg_index[PUB_DI_DCHHZT] == INDEX_INVALLID)
  134. {
  135. g_run_stu.dchh = 0;
  136. }
  137. if ((short)g_sw_pub.di_cfg_index[PUB_DI_JS] == INDEX_INVALLID)
  138. {
  139. g_run_stu.js = 0;
  140. }
  141. if ((short)g_sw_pub.di_cfg_index[PUB_DI_BHALL] == INDEX_INVALLID)
  142. {
  143. g_run_stu.bhall = 1;
  144. }
  145. if ((short)g_sw_pub.di_cfg_index[PUB_DI_JX] == INDEX_INVALLID)
  146. {
  147. g_run_stu.bjx = 0;
  148. }
  149. // 复归+解锁
  150. if ((short)g_sw_pub.di_cfg_index[PUB_DI_RST_JS] == INDEX_INVALLID)
  151. {
  152. g_run_stu.fg_js = 0;
  153. }
  154. #ifdef YX_DI_ERROR
  155. if ((short)g_sw_pub.di_cfg_index[PUB_DI_ERROR] == INDEX_INVALLID)
  156. {
  157. g_run_stu.yxEnable = 1;
  158. }
  159. #endif
  160. g_run_stu.kz_out_tt = 1;
  161. #ifdef KZ_OUT_TT
  162. if ((short)g_sw_pub.di_cfg_index[PUB_KZ_OUT_TT] == INDEX_INVALLID)
  163. {
  164. g_run_stu.kz_out_tt = 1;
  165. }
  166. #endif
  167. g_run_stu.mb_yuk = 0;
  168. g_run_stu.mb_fz = 0;
  169. g_run_stu.mb_hz = 0;
  170. for (sw=0; sw<g_sw_num; sw++)
  171. {
  172. RUN_STU_SW *prun=&g_tRelay[sw].run_stu;
  173. #ifdef GD_AREA_ZHONGSHAN_FTU
  174. prun->bs_bhz=false;
  175. #endif
  176. // 合位无配置,置无效
  177. if ((short)g_sw[sw].di_cfg_index[SW_DI_KRHW] == INDEX_INVALLID)
  178. {
  179. prun->hw = 0;
  180. }
  181. // 分位无配置,置无效
  182. if ((short)g_sw[sw].di_cfg_index[SW_DI_KRTW] == INDEX_INVALLID)
  183. {
  184. prun->tw = 0;
  185. }
  186. #ifndef GW_AREA_MAIN_2021
  187. // 合闸位置无配置,置无效
  188. if ((short)g_sw[sw].di_cfg_index[SW_DI_HZWZ] == INDEX_INVALLID)
  189. {
  190. prun->hzw = 0;
  191. }
  192. // 跳闸位置无配置,置无效
  193. if ((short)g_sw[sw].di_cfg_index[SW_DI_TZWZ] == INDEX_INVALLID)
  194. {
  195. prun->tzw = 0;
  196. }
  197. #endif
  198. #ifdef SWITCH_GLJD_LED
  199. // 隔离刀闸无配置,置无效
  200. if ((short)g_sw[sw].di_cfg_index[SW_DI_GLDZ1] == INDEX_INVALLID)
  201. {
  202. prun->gldz = 0;
  203. }
  204. // 接地刀闸无配置,置无效
  205. if ((short)g_sw[sw].di_cfg_index[SW_DI_JDDZ] == INDEX_INVALLID)
  206. {
  207. prun->jddz = 0;
  208. }
  209. #endif
  210. // 未储能无配置,置合
  211. if ((short)g_sw[sw].di_cfg_index[SW_DI_CN] == INDEX_INVALLID)
  212. {
  213. prun->wcn = 1;
  214. }
  215. //气压低为配置,置分
  216. if ((short)g_sw[sw].di_cfg_index[SW_DI_QYD] == INDEX_INVALLID)
  217. {
  218. prun->qyd = 0;
  219. }
  220. // 控制回路断线开入
  221. if ((short)g_sw[sw].di_cfg_index[SW_DI_KZDX] == INDEX_INVALLID)
  222. {
  223. prun->kzdx= 0;
  224. }
  225. // PT1瞬压无配置,置无效
  226. if ((short)g_sw[sw].di_cfg_index[SW_DI_PT1SY] == INDEX_INVALLID)
  227. {
  228. prun->pt1uf = 0;
  229. }
  230. // PT2瞬压无配置,置无效
  231. if ((short)g_sw[sw].di_cfg_index[SW_DI_PT2SY] == INDEX_INVALLID)
  232. {
  233. prun->pt2uf = 0;
  234. }
  235. if ((short)g_sw[sw].di_cfg_index[SW_DI_SH] == INDEX_INVALLID)
  236. {
  237. prun->sw_sh = 0;
  238. }
  239. if ((short)g_sw[sw].di_cfg_index[SW_DI_SF] == INDEX_INVALLID)
  240. {
  241. prun->sw_sf = 0;
  242. }
  243. #ifndef GW_AREA_MAIN_2021
  244. if ((short)g_sw[sw].di_cfg_index[SW_DI_BHZTT] == INDEX_INVALLID)
  245. {
  246. prun->bhztt = 1;
  247. }
  248. // 保护投退无配置,置合
  249. if ((short)g_sw[sw].di_cfg_index[SW_DI_BHTT] == INDEX_INVALLID)
  250. {
  251. prun->bhtt = prun->bhztt;
  252. }
  253. #else
  254. // 保护投退无配置,置合
  255. if ((short)g_sw[sw].di_cfg_index[SW_DI_BHTT] == INDEX_INVALLID)
  256. {
  257. prun->bhtt = 1;
  258. }
  259. // 重合闸无配置,置合
  260. if ((short)g_sw[sw].di_cfg_index[SW_DI_CHZ] == INDEX_INVALLID)
  261. {
  262. prun->chz = 1;
  263. }
  264. #endif
  265. #ifdef JZS_FUNCTION
  266. if ((short)g_sw[sw].di_cfg_index[SW_DI_JZS_TT] == INDEX_INVALLID)
  267. {
  268. prun->jzs_tt = 1;
  269. }
  270. #endif
  271. // FA投退无配置,置合
  272. if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_TT] == INDEX_INVALLID)
  273. {
  274. prun->fatt = prun->bhztt;
  275. }
  276. #ifndef GW_AREA_MAIN_2021
  277. // 就地FA闭锁压板
  278. if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_BS_TT] == INDEX_INVALLID)
  279. {
  280. //g_sw[sw].di_cfg_index[SW_DI_FA_BS_TT] = 0;//0为允许就地FA功能,
  281. }
  282. // 智能FA投退无配置,置合
  283. if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_GOOSE] == INDEX_INVALLID)
  284. {
  285. #ifdef TY_BH_FA
  286. prun->fa_g_tt = 1;
  287. #else
  288. prun->fa_g_tt = prun->bhztt;
  289. #endif
  290. }
  291. #endif
  292. // 重合闸无配置,置合
  293. if ((short)g_sw[sw].di_cfg_index[SW_DI_CHZ] == INDEX_INVALLID)
  294. {
  295. prun->chzyb = 1;
  296. }
  297. #ifndef GW_AREA_MAIN_2021
  298. // 频率解列压板无配置,置合
  299. if ((short)g_sw[sw].di_cfg_index[SW_DI_FREQ_VOL] == INDEX_INVALLID)
  300. {
  301. prun->freq_vol = 1;
  302. }
  303. // 安全自动控制压板无配置,置合
  304. if ((short)g_sw[sw].di_cfg_index[SW_DI_SAFE_AUTO] == INDEX_INVALLID)
  305. {
  306. prun->safe_auto = 1;
  307. }
  308. #endif
  309. prun->fa_start_hz = 1;
  310. //#ifdef GD_AREA_ZHUHAI_V2
  311. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_JIEYANG || defined GD_AREA_LIAONING_2021
  312. if ((short)g_sw[sw].di_cfg_index[SW_DI_B_SW] == INDEX_INVALLID)
  313. {
  314. prun->fa_start_hz = 1;
  315. }
  316. #endif
  317. if ((short)g_sw[sw].di_cfg_index[SW_DI_KGYF] == INDEX_INVALLID)
  318. {
  319. prun->kgyf = 0;
  320. }
  321. // 联络分段配置
  322. #ifndef GW_AREA_MAIN_2021
  323. if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_LS] == INDEX_INVALLID)
  324. {
  325. #ifndef GW_AREA_MAIN_2021
  326. prun->fa_ls = pRunSet->tSwSet[sw].bTT_fa_LL;
  327. #endif
  328. }
  329. if ((short)g_sw[sw].di_cfg_index[SW_DI_BSCH] == INDEX_INVALLID)
  330. {
  331. prun->bsch = 0;
  332. }
  333. if ((short)g_sw[sw].di_cfg_index[SW_DI_TQ] == INDEX_INVALLID)
  334. {
  335. prun->bTQ = 1;
  336. }
  337. #endif
  338. prun->tytq = 0;
  339. #ifdef TYTQ_DI_YB
  340. if ((short)g_sw[sw].di_cfg_index[SW_DI_TYTQ] == INDEX_INVALLID)
  341. {
  342. prun->tytq = 0;
  343. }
  344. #endif
  345. //闭锁联络
  346. prun->bsfal = 0;
  347. #ifdef BS_FAL_DI_YB
  348. if ((short)g_sw[sw].di_cfg_index[SW_DI_BS_FAL] == INDEX_INVALLID)
  349. {
  350. prun->bsfal = 0;
  351. }
  352. #endif
  353. }
  354. _create_instu_file();
  355. //init valid yb
  356. run_status_check(0);
  357. return 0;
  358. }
  359. /******************************************************************************
  360. 函数名称: run_status_exit
  361. 函数版本: 01.01
  362. 创建作者: xxxxxx
  363. 创建日期: 2015-10-23
  364. 函数说明: 内部运行状态退出。
  365. 参数说明: 无
  366. 返回值: 成功返回0.
  367. 修改记录:
  368. */
  369. int run_status_exit(void)
  370. {
  371. return 0;
  372. }
  373. /******************************************************************************
  374. 函数名称: rmt_key_init
  375. 函数版本: 01.01
  376. 创建作者: xxxxxx
  377. 创建日期: 2015-05-13
  378. 函数说明: 遥控器按键初始化
  379. 参数说明: 无
  380. 返回值: 成功返回0.
  381. 修改记录:
  382. */
  383. int rmt_key_init(void)
  384. {
  385. memset(&g_rmt_op, 0, sizeof(g_rmt_op));
  386. return 0;
  387. }
  388. // 动作总的状态
  389. int run_status_dz_all(void)
  390. {
  391. int i;
  392. int ret=0;
  393. for(i=0; i<g_sw_num; i++)
  394. {
  395. RUN_STU_SW *prun=&g_tRelay[i].run_stu;
  396. if(prun->dz)
  397. {
  398. return prun->dz;
  399. }
  400. }
  401. return ret;
  402. }
  403. /******************************************************************************
  404. 函数名称: run_status_check
  405. 函数版本: 01.01
  406. 创建作者: xxxxxx
  407. 创建日期: 2015-10-23
  408. 函数说明: 内部运行状态识别
  409. 参数说明: 无
  410. 返回值: 成功返回0.
  411. 修改记录:
  412. */
  413. int run_status_check(u32 dStep)
  414. {
  415. bool bTHWCNState; // 弹簧未储能告警
  416. bool bTWYL; // 跳位有流
  417. int sw;
  418. bool bY,bY1;
  419. #ifdef FUNC_LARGECURRENT_BS_CHZ
  420. bool bIBSCHZ;
  421. #endif
  422. u8 sw_sh[SWITCH_NUM_MAX],sw_sf[SWITCH_NUM_MAX];
  423. u8 stu_yf,stu_jd;
  424. struct equ_config_di *ecd;
  425. #ifdef YX_DI_ERROR
  426. if ((short)g_sw_pub.di_cfg_index[PUB_DI_ERROR] != INDEX_INVALLID)
  427. {
  428. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_ERROR]];
  429. g_run_stu.yxEnable= dido_di_is_on(ecd->slot,ecd->index);
  430. }
  431. if(g_run_stu.yxEnable ==0)
  432. return 0;
  433. #endif
  434. stu_yf = 0;
  435. if ((short)g_sw_pub.di_cfg_index[PUB_DI_YF] != INDEX_INVALLID)
  436. {
  437. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_YF]];
  438. stu_yf = dido_di_is_on(ecd->slot,ecd->index);
  439. }
  440. stu_jd = 0;
  441. if ((short)g_sw_pub.di_cfg_index[PUB_DI_JD] != INDEX_INVALLID)
  442. {
  443. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_JD]];
  444. stu_jd = dido_di_is_on(ecd->slot,ecd->index);
  445. g_run_stu.jd = dido_di_is_on(ecd->slot,ecd->index);
  446. }
  447. if (((short)g_sw_pub.di_cfg_index[PUB_DI_YF] != INDEX_INVALLID)
  448. && ((short)g_sw_pub.di_cfg_index[PUB_DI_JD] != INDEX_INVALLID))
  449. {
  450. g_run_stu.yf = stu_yf;
  451. g_run_stu.jd = stu_jd;
  452. }
  453. else if (((short)g_sw_pub.di_cfg_index[PUB_DI_YF] != INDEX_INVALLID)
  454. && ((short)g_sw_pub.di_cfg_index[PUB_DI_JD] == INDEX_INVALLID))
  455. {
  456. g_run_stu.yf = stu_yf;
  457. g_run_stu.jd = !g_run_stu.yf;
  458. }
  459. else if (((short)g_sw_pub.di_cfg_index[PUB_DI_YF] == INDEX_INVALLID)
  460. && ((short)g_sw_pub.di_cfg_index[PUB_DI_JD] != INDEX_INVALLID))
  461. {
  462. g_run_stu.yf = (!stu_jd);
  463. g_run_stu.jd = !g_run_stu.yf;
  464. }
  465. else
  466. {
  467. g_run_stu.yf = 0;
  468. }
  469. if ((short)g_sw_pub.di_cfg_index[PUB_DI_RST] != INDEX_INVALLID)
  470. {
  471. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_RST]];
  472. g_run_stu.fg = dido_di_is_on(ecd->slot,ecd->index);
  473. }
  474. if ((short)g_sw_pub.di_cfg_index[PUB_DI_DCJLSD] != INDEX_INVALLID)
  475. {
  476. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_DCJLSD]];
  477. g_run_stu.dcjlsd = dido_di_is_on(ecd->slot,ecd->index);
  478. if(g_run_stu.dcjlsd)
  479. {
  480. if(log_flag.mdygd)
  481. {
  482. load_hs_log_rcd(TYPE_MAIN_POW,true,NULL,"Main power disconnect",0);
  483. log_flag.mdygd = false;
  484. }
  485. if(!log_flag.sdygd)
  486. {
  487. load_hs_log_rcd(TYPE_STANDBY_POW,true,NULL,"Standby power supply",1);
  488. log_flag.sdygd = true;
  489. }
  490. }
  491. else
  492. {
  493. if(!log_flag.mdygd)
  494. {
  495. load_hs_log_rcd(TYPE_MAIN_POW,true,NULL,"Main power supply",1);
  496. log_flag.mdygd = true;
  497. }
  498. if(log_flag.sdygd)
  499. {
  500. load_hs_log_rcd(TYPE_STANDBY_POW,true,NULL,"Standby power disconnect",0);
  501. log_flag.sdygd = false;
  502. }
  503. }
  504. }
  505. if ((short)g_sw_pub.di_cfg_index[PUB_DI_DCDYGZ] != INDEX_INVALLID)
  506. {
  507. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_DCDYGZ]];
  508. g_run_stu.dcdygz = dido_di_is_on(ecd->slot,ecd->index);
  509. }
  510. if ((short)g_sw_pub.di_cfg_index[PUB_DI_DCQY] != INDEX_INVALLID)
  511. {
  512. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_DCQY]];
  513. g_run_stu.dcqy = dido_di_is_on(ecd->slot,ecd->index);
  514. }
  515. if ((short)g_sw_pub.di_cfg_index[PUB_DI_DCHHZT] != INDEX_INVALLID)
  516. {
  517. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_DCHHZT]];
  518. g_run_stu.dchh = dido_di_is_on(ecd->slot,ecd->index);
  519. }
  520. if ((short)g_sw_pub.di_cfg_index[PUB_DI_JS] != INDEX_INVALLID)
  521. {
  522. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_JS]];
  523. g_run_stu.js = dido_di_is_on(ecd->slot,ecd->index);
  524. }
  525. if ((short)g_sw_pub.di_cfg_index[PUB_DI_BHALL] != INDEX_INVALLID)
  526. {
  527. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_BHALL]];
  528. g_run_stu.bhall= dido_di_is_on(ecd->slot,ecd->index);
  529. }
  530. if ((short)g_sw_pub.di_cfg_index[PUB_DI_JX] != INDEX_INVALLID)
  531. {
  532. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_JX]];
  533. g_run_stu.bjx= dido_di_is_on(ecd->slot,ecd->index);
  534. }
  535. if ((short)g_sw_pub.di_cfg_index[PUB_DI_REBOOT] != INDEX_INVALLID)
  536. {
  537. u8 reboot;
  538. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_REBOOT]];
  539. reboot= dido_di_is_on(ecd->slot,ecd->index);
  540. if(reboot)
  541. {
  542. rt_printf("装置复位\r\n");
  543. watchdog_reset_cpu(2); //装置复位
  544. }
  545. }
  546. #ifdef KZ_OUT_TT
  547. if ((short)g_sw_pub.di_cfg_index[PUB_KZ_OUT_TT] != INDEX_INVALLID)
  548. {
  549. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_KZ_OUT_TT]];
  550. g_run_stu.kz_out_tt = dido_di_is_on(ecd->slot,ecd->index);
  551. }
  552. #endif
  553. if ((short)g_sw_pub.di_cfg_index[PUB_DI_RST_JS] != INDEX_INVALLID)
  554. {
  555. ecd = &g_equ_config_di[g_sw_pub.di_cfg_index[PUB_DI_RST_JS]];
  556. g_run_stu.fg_js = dido_di_is_on(ecd->slot,ecd->index);
  557. if(g_run_stu.fg_js)
  558. {
  559. g_run_stu.fg=1;
  560. g_run_stu.js=1;
  561. }
  562. else
  563. {
  564. g_run_stu.fg=0;
  565. g_run_stu.js=0;
  566. }
  567. }
  568. _rst_key_app();
  569. _rmt_key_app(dStep);
  570. g_run_stu.rmt_A = (g_rmt_op.key == (1<<RMT_A));
  571. g_run_stu.rmt_B = (g_rmt_op.key == (1<<RMT_B));
  572. g_run_stu.rmt_C = (g_rmt_op.key == (1<<RMT_C));
  573. g_run_stu.rmt_D = (g_rmt_op.key == (1<<RMT_D));
  574. g_run_stu.phayy = OverRelay(g_ui[PUB_AC_UA1].fz, pRunSet->dUPowerFz, pRunSet->dUPowerFz_fh, g_run_stu.phayy);
  575. g_run_stu.phbyy = OverRelay(g_ui[PUB_AC_UB1].fz, pRunSet->dUPowerFz, pRunSet->dUPowerFz_fh, g_run_stu.phbyy);
  576. g_run_stu.phcyy = OverRelay(g_ui[PUB_AC_UC1].fz, pRunSet->dUPowerFz, pRunSet->dUPowerFz_fh, g_run_stu.phcyy);
  577. for(sw=0;sw<g_sw_num;sw++)
  578. {
  579. TRELAY_T *pR=&g_tRelay[sw];
  580. RUN_STU_SW *prun=&pR->run_stu;
  581. TSWST *pSW =&pR->tSWST;
  582. TLOSTVOT_T *pSWLV = &g_tRelay[sw].tLostVot;
  583. TSWST *pSWST =&g_tRelay[sw].tSWST;
  584. bool pt1cyy,pt2cyy;
  585. static bool bhtt,fatt,fa_g_tt,fa_ls;
  586. if ((short)g_sw[sw].di_cfg_index[SW_DI_KRHW] != INDEX_INVALLID)
  587. {
  588. //g_run_stu.hw[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_KRHW))?1:0;
  589. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_KRHW]];
  590. prun->hw = dido_di_is_on(ecd->slot,ecd->index);
  591. }
  592. if ((short)g_sw[sw].di_cfg_index[SW_DI_KRTW] != INDEX_INVALLID)
  593. {
  594. //g_run_stu.tw[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_KRTW))?1:0;
  595. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_KRTW]];
  596. prun->tw = dido_di_is_on(ecd->slot,ecd->index);
  597. }
  598. #ifndef GW_AREA_MAIN_2021
  599. if ((short)g_sw[sw].di_cfg_index[SW_DI_HZWZ] != INDEX_INVALLID)
  600. {
  601. //g_run_stu.hw[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_KRHW))?1:0;
  602. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_HZWZ]];
  603. prun->hzw = dido_di_is_on(ecd->slot,ecd->index);
  604. }
  605. if ((short)g_sw[sw].di_cfg_index[SW_DI_TZWZ] != INDEX_INVALLID)
  606. {
  607. //g_run_stu.tw[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_KRTW))?1:0;
  608. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_TZWZ]];
  609. prun->tzw = dido_di_is_on(ecd->slot,ecd->index);
  610. }
  611. #endif
  612. #ifdef SWITCH_GLJD_LED
  613. if ((short)g_sw[sw].di_cfg_index[SW_DI_GLDZ1] != INDEX_INVALLID)
  614. {
  615. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_GLDZ1]];
  616. prun->gldz = dido_di_is_on(ecd->slot,ecd->index);
  617. }
  618. if ((short)g_sw[sw].di_cfg_index[SW_DI_JDDZ] != INDEX_INVALLID)
  619. {
  620. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_JDDZ]];
  621. prun->jddz = dido_di_is_on(ecd->slot,ecd->index);
  622. }
  623. #endif
  624. if ((short)g_sw[sw].di_cfg_index[SW_DI_CN] != INDEX_INVALLID)
  625. {
  626. //g_run_stu.wcn[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_CN))?1:0;
  627. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_CN]];
  628. prun->wcn = dido_di_is_on(ecd->slot,ecd->index);
  629. }
  630. #ifdef DISP_DOUBLE_CN
  631. if ((short)g_sw[sw].di_cfg_index[SW_DI_YCN] != INDEX_INVALLID&&(short)g_sw[sw].di_cfg_index[SW_DI_CN] == INDEX_INVALLID)//2020-10-8 只配置了已储能遥信
  632. {
  633. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_YCN]];
  634. prun->wcn = !dido_di_is_on(ecd->slot,ecd->index);//已储能取反
  635. }
  636. #endif
  637. if ((short)g_sw[sw].di_cfg_index[SW_DI_QYD] != INDEX_INVALLID)
  638. {
  639. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_QYD]];
  640. prun->qyd= dido_di_is_on(ecd->slot,ecd->index);
  641. }
  642. if ((short)g_sw[sw].di_cfg_index[SW_DI_KZDX] != INDEX_INVALLID)
  643. {
  644. //g_run_stu.wcn[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_CN))?1:0;
  645. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_KZDX]];
  646. prun->kzdx= dido_di_is_on(ecd->slot,ecd->index);
  647. }
  648. if ((short)g_sw[sw].di_cfg_index[SW_DI_PT1SY] != INDEX_INVALLID)
  649. {
  650. //g_run_stu.pt1uf[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_PT1SY))?1:0;
  651. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_PT1SY]];
  652. prun->pt1uf = dido_di_is_on(ecd->slot,ecd->index);
  653. }
  654. if ((short)g_sw[sw].di_cfg_index[SW_DI_PT2SY] != INDEX_INVALLID)
  655. {
  656. //g_run_stu.pt2uf[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_PT2SY))?1:0;
  657. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_PT2SY]];
  658. prun->pt2uf = dido_di_is_on(ecd->slot,ecd->index);
  659. }
  660. sw_sh[sw] = 0;
  661. if ((short)g_sw[sw].di_cfg_index[SW_DI_SH] != INDEX_INVALLID)
  662. {
  663. //sw_sh[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_SH))?1:0;
  664. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_SH]];
  665. sw_sh[sw] = dido_di_is_on(ecd->slot,ecd->index);
  666. }
  667. sw_sf[sw] = 0;
  668. if ((short)g_sw[sw].di_cfg_index[SW_DI_SF] != INDEX_INVALLID)
  669. {
  670. // sw_sf[sw] = (g_di_stu.sw_di[sw] & (1<<SW_DI_SF))?1:0;
  671. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_SF]];
  672. sw_sf[sw] = dido_di_is_on(ecd->slot,ecd->index);
  673. }
  674. if (((short)g_sw[sw].di_cfg_index[SW_DI_KRHW] != INDEX_INVALLID)
  675. && ((short)g_sw[sw].di_cfg_index[SW_DI_KRTW] != INDEX_INVALLID))
  676. {
  677. prun->sw = (prun->hw<<1) | prun->tw;
  678. }
  679. else if (((short)g_sw[sw].di_cfg_index[SW_DI_KRHW] != INDEX_INVALLID)
  680. && ((short)g_sw[sw].di_cfg_index[SW_DI_KRTW] == INDEX_INVALLID))
  681. {
  682. if (prun->hw) prun->sw = 2;
  683. if (!prun->hw) prun->sw = 1;
  684. prun->tw = !prun->hw;
  685. }
  686. else if (((short)g_sw[sw].di_cfg_index[SW_DI_KRHW] == INDEX_INVALLID)
  687. && ((short)g_sw[sw].di_cfg_index[SW_DI_KRTW] != INDEX_INVALLID))
  688. {
  689. if (prun->tw) prun->sw = 1;
  690. if (!prun->tw) prun->sw = 2;
  691. prun->hw = !prun->tw;
  692. }
  693. else
  694. {
  695. prun->sw = 0;
  696. }
  697. #ifndef GW_AREA_MAIN_2021
  698. if ((short)g_sw[sw].di_cfg_index[SW_DI_BHZTT] != INDEX_INVALLID)
  699. {
  700. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_BHZTT]];
  701. prun->bhztt = dido_di_is_on(ecd->slot,ecd->index);
  702. //#ifdef GD_AREA_ECZD_2020//2020指导意见使用停用FA及保护
  703. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  704. prun->bhztt= !prun->bhztt;
  705. #endif
  706. }
  707. #endif
  708. if ((short)g_sw[sw].di_cfg_index[SW_DI_BHTT] != INDEX_INVALLID)
  709. {
  710. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_BHTT]];
  711. #ifndef GW_AREA_MAIN_2021
  712. prun->bhtt = dido_di_is_on(ecd->slot,ecd->index)&&prun->bhztt;
  713. #else
  714. prun->bhtt = dido_di_is_on(ecd->slot,ecd->index);
  715. #endif
  716. prun->bh_yx = dido_di_is_on(ecd->slot,ecd->index);
  717. }
  718. if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_TT] != INDEX_INVALLID )
  719. {
  720. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_FA_TT]];
  721. prun->fatt = dido_di_is_on(ecd->slot,ecd->index)&&prun->bhztt;
  722. prun->fa_yx = dido_di_is_on(ecd->slot,ecd->index);
  723. }
  724. #ifdef GW_AREA_MAIN_2021
  725. if ((short)g_sw[sw].di_cfg_index[SW_DI_CHZ] != INDEX_INVALLID)
  726. {
  727. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_CHZ]];
  728. prun->chz = dido_di_is_on(ecd->slot,ecd->index);
  729. }
  730. #endif
  731. #ifndef GW_AREA_MAIN_2021
  732. if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_BS_TT] != INDEX_INVALLID )
  733. {
  734. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_FA_BS_TT]];
  735. if(dido_di_is_on(ecd->slot,ecd->index) == 1)//闭锁FA压板 广东电网提出预留此功能
  736. prun->fatt=0;//闭锁FA信号产生,强制退出就地FA功能
  737. }
  738. if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_GOOSE] != INDEX_INVALLID)
  739. {
  740. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_FA_GOOSE]];
  741. #ifdef TY_BH_FA
  742. prun->fa_g_tt = dido_di_is_on(ecd->slot,ecd->index);
  743. #else
  744. prun->fa_g_tt = dido_di_is_on(ecd->slot,ecd->index)&&prun->bhztt;
  745. #endif
  746. prun->fa_g_yx = dido_di_is_on(ecd->slot,ecd->index);
  747. }
  748. #endif
  749. if ((short)g_sw[sw].di_cfg_index[SW_DI_CHZ] != INDEX_INVALLID)
  750. {
  751. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_CHZ]];
  752. prun->chzyb = (dido_di_is_on(ecd->slot,ecd->index));
  753. }
  754. #ifndef GW_AREA_MAIN_2021
  755. if ((short)g_sw[sw].di_cfg_index[SW_DI_FREQ_VOL] != INDEX_INVALLID)
  756. {
  757. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_FREQ_VOL]];
  758. prun->freq_vol = dido_di_is_on(ecd->slot,ecd->index);
  759. //#ifdef GD_AREA_ECZD_2020//2020指导意见使用停用解列压板
  760. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  761. prun->freq_vol = !prun->freq_vol;
  762. #endif
  763. }
  764. #endif
  765. #ifndef GW_AREA_MAIN_2021
  766. if ((short)g_sw[sw].di_cfg_index[SW_DI_SAFE_AUTO] != INDEX_INVALLID)
  767. {
  768. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_SAFE_AUTO]];
  769. prun->safe_auto = dido_di_is_on(ecd->slot,ecd->index);
  770. }
  771. #endif
  772. #ifdef JZS_FUNCTION
  773. if ((short)g_sw[sw].di_cfg_index[SW_DI_JZS_TT] != INDEX_INVALLID)
  774. {
  775. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_JZS_TT]];
  776. prun->jzs_tt = dido_di_is_on(ecd->slot,ecd->index);
  777. //if(prun->jzs_tt)//集中式投入,强制进入保护模式
  778. // prun->bhtt=1;
  779. }
  780. #endif
  781. //#ifdef GD_AREA_ZHUHAI_V2
  782. #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_JIEYANG || defined GD_AREA_LIAONING_2021
  783. if ((short)g_sw[sw].di_cfg_index[SW_DI_B_SW] != INDEX_INVALLID)
  784. {
  785. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_B_SW]];
  786. prun->fa_start_hz = dido_di_is_on(ecd->slot,ecd->index);
  787. }
  788. #endif
  789. if ((short)g_sw[sw].di_cfg_index[SW_DI_KGYF] != INDEX_INVALLID)
  790. {
  791. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_KGYF]];
  792. prun->kgyf= dido_di_is_on(ecd->slot,ecd->index);
  793. }
  794. #ifndef GW_AREA_MAIN_2021
  795. if ((short)g_sw[sw].di_cfg_index[SW_DI_FA_LS] != INDEX_INVALLID)
  796. {
  797. int dat;
  798. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_FA_LS]];
  799. dat= dido_di_is_on(ecd->slot,ecd->index);
  800. prun->fa_ls =dat;
  801. }
  802. else
  803. {
  804. #ifndef GW_AREA_MAIN_2021
  805. prun->fa_ls = pRunSet->tSwSet[sw].bTT_fa_LL;
  806. #endif
  807. }
  808. if ((short)g_sw[sw].di_cfg_index[SW_DI_BSCH] != INDEX_INVALLID)
  809. {
  810. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_BSCH]];
  811. prun->bsch = dido_di_is_on(ecd->slot,ecd->index);
  812. }
  813. if ((short)g_sw[sw].di_cfg_index[SW_DI_TQ] != INDEX_INVALLID)
  814. {
  815. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_TQ]];
  816. prun->bTQ = dido_di_is_on(ecd->slot,ecd->index);
  817. //#ifdef GD_AREA_ECZD_2020//2020指导意见使用停用同期压板
  818. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  819. prun->bTQ = !prun->bTQ;
  820. #endif
  821. }
  822. #endif
  823. #ifdef TYTQ_DI_YB
  824. if ((short)g_sw[sw].di_cfg_index[SW_DI_TYTQ] != INDEX_INVALLID)
  825. {
  826. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_TYTQ]];
  827. prun->tytq = dido_di_is_on(ecd->slot,ecd->index);
  828. }
  829. #endif
  830. #ifdef BS_FAL_DI_YB
  831. if ((short)g_sw[sw].di_cfg_index[SW_DI_BS_FAL] != INDEX_INVALLID)
  832. {
  833. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_BS_FAL]];
  834. prun->bsfal = dido_di_is_on(ecd->slot,ecd->index);
  835. }
  836. #endif
  837. //相间且零序小于有流值,才认为线路无流
  838. pSW->uSWST.bFlag.bSXWL = LowRelay(g_sw[sw].m2_max,pRunSet->dIWL_SQR[sw],pRunSet->dIWL_SQR[sw],false) && LowRelay(g_ui[UI_SW_INDEX_BEGIN(sw)+SW_AC_I0].m2[0],pRunSet->dIWL_SQR[sw],pRunSet->dIWL_SQR[sw],false);
  839. // 外部开入合位,跳位判断
  840. pSW->uSWST.bFlag.bDIHW = (prun->sw==2 )?true:false;
  841. pSW->uSWST.bFlag.bDITW = (prun->sw==1 )?true:false;
  842. // 三相跳位,合闸位置
  843. pSW->uSWST.bFlag.bTZWZ = pSW->uSWST.bFlag.bDITW && pSW->uSWST.bFlag.bSXWL;
  844. pSW->uSWST.bFlag.bHZWZ = pSW->uSWST.bFlag.bDIHW || (!pSW->uSWST.bFlag.bSXWL);
  845. // 手合加速判断
  846. RunTR(&pSW->tTRunST_20s1s,pSW->uSWST.bFlag.bTZWZ,dStep);
  847. pSW->uSWST.bFlag.bSHJS = pSW->tTRunST_20s1s.boolTrip
  848. && (!pSW->uSWST.bFlag.bTZWZ);
  849. if((bhtt!=prun->bhtt)
  850. ||(fatt!=prun->fatt)
  851. ||(fa_g_tt!=prun->fa_g_tt)
  852. ||(fa_ls!=prun->fa_ls))
  853. {
  854. bhtt=prun->bhtt;
  855. fatt=prun->fatt;
  856. fa_g_tt=prun->fa_g_tt;
  857. fa_ls=prun->fa_ls;
  858. }
  859. // 曾有压判断,用于失压分闸
  860. #ifndef GW_AREA_MAIN_2021
  861. pt1cyy = OverRelay(g_sw_pub.m2_max[2], pRunSet->tSwSet[sw].dU_fa_YY,pRunSet->tSwSet[sw].dU_fa_YY_fh, prun->pt1yy);
  862. //pt2cyy = OverRelay(g_sw_pub.m2_max[3], pRunSet->tSwSet[sw].dU_fa_YY, pRunSet->tSwSet[sw].dU_fa_YY_fh, prun->pt2yy);
  863. pt2cyy = OverRelay(g_sw_pub.m2_max[3], pRunSet->tSwSet[sw].dU_fa_YY2, pRunSet->tSwSet[sw].dU_fa_YY2_fh, prun->pt2yy);
  864. #endif
  865. prun->pt1yy = pt1cyy;
  866. prun->pt2yy = pt2cyy;
  867. if(g_equ_config_ac[0].type-1==PUB_AC_UAB2 || g_equ_config_ac[0].type-1==PUB_AC_UA2)
  868. RunTR(&pSWLV->tCYY25ms0ms, pt2cyy||pSWST->uSWST.bFlag.bCYY, dStep);
  869. else
  870. RunTR(&pSWLV->tCYY25ms0ms, pt1cyy||pSWST->uSWST.bFlag.bCYY, dStep);
  871. pSWST->uSWST.bFlag.bCYY = pSWLV->tCYY25ms0ms.boolTrip&&pSW->uSWST.bFlag.bHZWZ;
  872. RunTR(&pR->tgoc.tCYY3sdelayms, pt1cyy||pt2cyy, dStep);
  873. pR->tgoc.psta.bFlag.bCYY =pR->tgoc.tCYY3sdelayms.boolTrip;
  874. // 弹簧未储能告警处理
  875. bTHWCNState = (pR->run_stu.wcn && pRunSet->tSwSet[sw].bTT_WCN);
  876. RunTR(&pSW->tTWCNGJ1s, bTHWCNState, dStep);
  877. pSW->uSWST.bFlag.bWCN = pSW->tTWCNGJ1s.boolTrip;
  878. // 控制回路告警处理
  879. #if 0
  880. bY = ((prun->tzw==0&&prun->hzw==0)||(prun->tzw==1&&prun->hzw==1))
  881. && ((short)g_sw[sw].di_cfg_index[SW_DI_HZWZ] != INDEX_INVALLID)
  882. && ((short)g_sw[sw].di_cfg_index[SW_DI_TZWZ] != INDEX_INVALLID)
  883. && pRunSet->tSwSet[sw].bTT_KZHL;
  884. bY1=pR->run_stu.kzdx&& pRunSet->tSwSet[sw].bTT_KZHL;
  885. #else//控制回路断线 1、控制回路断线遥信输入 2、HQ&TQ错误态&未知态 3、开关位置错误态&未知态
  886. #if 0 //控回断线 逻辑定值处理 EWen
  887. if( ((short)g_sw[sw].di_cfg_index[SW_DI_HZWZ] != INDEX_INVALLID)&& ((short)g_sw[sw].di_cfg_index[SW_DI_TZWZ] != INDEX_INVALLID))//配置了HQ&TQ
  888. bY = (((prun->tzw==0&&prun->hzw==0)||(prun->tzw==1&&prun->hzw==1))&& pRunSet->tSwSet[sw].bTT_KZHL); //HQ&TQ错误
  889. else if( ((short)g_sw[sw].di_cfg_index[SW_DI_KRHW] != INDEX_INVALLID)&& ((short)g_sw[sw].di_cfg_index[SW_DI_KRTW] != INDEX_INVALLID))//必须配置开关双位置状态
  890. bY = (((prun->tw==0&&prun->hw==0)||(prun->tw==1&&prun->hw==1))&& pRunSet->tSwSet[sw].bTT_KZHL); //开关位置错误
  891. else
  892. bY = false;
  893. bY1=pR->run_stu.kzdx && pRunSet->tSwSet[sw].bTT_KZHL;
  894. #endif
  895. #endif
  896. RunTR(&pSW->tTKZHLGJ1s, (bY||bY1), dStep);
  897. pSW->uSWST.bFlag.bKZHL = pSW->tTKZHLGJ1s.boolTrip;
  898. // 跳位有流告警处理
  899. bTWYL = (pSW->uSWST.bFlag.bDITW && (!pSW->uSWST.bFlag.bSXWL));
  900. RunTR(&pSW->tTTWYL_10S1S, bTWYL, dStep);
  901. pSW->uSWST.bFlag.bTWYL = pSW->tTTWYL_10S1S.boolTrip;
  902. // 每3秒才可进行一次手合动作,且仅能保持10ms
  903. RunTR(&pSW->tSHz3s10ms, (!sw_sh[sw]), dStep);
  904. pR->run_stu.sw_sh = (pSW->tSHz3s10ms.boolTrip && sw_sh[sw]&& g_run_stu.jd );
  905. // 每3秒才可进行一次手分动作
  906. RunTR(&pSW->tSTz3s10ms, (!sw_sf[sw]), dStep);
  907. pR->run_stu.sw_sf = (pSW->tSTz3s10ms.boolTrip && sw_sf[sw] && g_run_stu.jd );
  908. #ifdef GD_AREA_ZHONGSHAN_FTU //中山FTU要求手柄手分的时候退出自动化功能,亮闭锁灯
  909. RunTR(&pSW->tSf3s, (sw_sf[sw]), dStep);
  910. if(pSW->tSf3s.boolTrip&& g_run_stu.jd)
  911. {
  912. if(soe_check(EV_BS_HA+sw*EV_SW_NUM)==false) // 手动分闸,闭锁合闸
  913. {
  914. soe_record_ev(EV_BS_HA+sw*EV_SW_NUM, 1, 0,0,0 );
  915. //fa_s_set_savestatus(sw);
  916. }
  917. prun->bs_bhz = true;
  918. }
  919. else
  920. {
  921. prun->bs_bhz = false;
  922. }
  923. #endif
  924. //CT相序检查
  925. {
  926. bool bok,bCheck;
  927. u32 da,db,dc;
  928. u16 soeno=EV_CTXXYC+sw*EV_SW_NUM;
  929. bCheck=((g_ui[UI_SW_INDEX(sw,SW_AC_IA)].chn_index != INDEX_INVALLID)
  930. &&(g_ui[UI_SW_INDEX(sw,SW_AC_IB)].chn_index != INDEX_INVALLID)
  931. &&(g_ui[UI_SW_INDEX(sw,SW_AC_IC)].chn_index != INDEX_INVALLID));
  932. da = _AbsL(g_ui[UI_SW_INDEX(sw,SW_AC_IA)].p - g_ui[UI_SW_INDEX(sw,SW_AC_IB)].p-120*65536);
  933. db = _AbsL(g_ui[UI_SW_INDEX(sw,SW_AC_IB)].p - g_ui[UI_SW_INDEX(sw,SW_AC_IC)].p+240*65536);
  934. dc = _AbsL(g_ui[UI_SW_INDEX(sw,SW_AC_IA)].p - g_ui[UI_SW_INDEX(sw,SW_AC_IC)].p+120*65536);
  935. bok=pRunSet->bTT_CheckPhase
  936. &&(g_sw[sw].m2_min>pRunSet->dIWL_SQR[sw]) //大于无流定值
  937. &&bCheck
  938. &&((da>15*65536)||(db>15*65536)||(dc>15*65536)); //三相电压角度差30度
  939. RunTR(&pSW->tCTXXYC, bok, dStep);
  940. if(pSW->tCTXXYC.boolTrip)
  941. {
  942. if(soe_check(soeno)==false) //
  943. {
  944. soe_record_ev(soeno, 1, 0,0,0 );
  945. }
  946. }
  947. else
  948. {
  949. if(soe_check(soeno)==true) //
  950. {
  951. soe_record_ev(soeno, 0, 0,0,0 );
  952. }
  953. }
  954. }
  955. // CT 异常判断
  956. #ifndef GW_AREA_MAIN_2021
  957. {
  958. bool bok,bCheck;
  959. u16 soeno=EV_CTYC+sw*EV_SW_NUM;
  960. bCheck=((g_ui[UI_SW_INDEX(sw,SW_AC_IA)].chn_index != INDEX_INVALLID)
  961. &&(g_ui[UI_SW_INDEX(sw,SW_AC_IC)].chn_index != INDEX_INVALLID));
  962. bok=pRunSet->bTT_CTYC
  963. &&(g_sw[sw].m2_min<pRunSet->dIWL_SQR[sw]) //最小值小于无流定值
  964. &&(g_sw[sw].m2_max>pRunSet->dIWL_SQR[sw])// 最大值大于无流定值
  965. &&bCheck;
  966. RunTR(&pSW->tCTYC, bok, dStep);
  967. if(pSW->tCTYC.boolTrip)
  968. {
  969. if(soe_check(soeno)==false) //
  970. {
  971. soe_record_ev(soeno, 1, 0,0,0 );
  972. }
  973. }
  974. else
  975. {
  976. if(soe_check(soeno)==true) //
  977. {
  978. soe_record_ev(soeno, 0, 0,0,0 );
  979. }
  980. }
  981. }
  982. #endif
  983. #ifndef BAT_STATE_LED
  984. { //电池电压低判断:两路直流,任一路大于直流整定值的一半,小于整定值,3秒后报异常,若定值为0 ,退出判断
  985. bool bCheck;
  986. #ifdef DC_TEST_ONE
  987. bCheck=((g_sw_pub.ac_in[PUB_AC_IN_UZ1]>(pRunSet->dwZL/2))&&(g_sw_pub.ac_in[PUB_AC_IN_UZ1]<pRunSet->dwZL)
  988. &&(pRunSet->dwZL>0);
  989. #else
  990. bCheck=(((g_sw_pub.ac_in[PUB_AC_IN_UZ1]>(pRunSet->dwZL/2))&&(g_sw_pub.ac_in[PUB_AC_IN_UZ1]<pRunSet->dwZL))
  991. ||((g_sw_pub.ac_in[PUB_AC_IN_UZ2]>(pRunSet->dwZL/2))&&(g_sw_pub.ac_in[PUB_AC_IN_UZ2]<pRunSet->dwZL)))
  992. &&(pRunSet->dwZL>0);
  993. #endif
  994. RunTR(&pSW->tBatChk, bCheck, dStep);
  995. if(pSW->tBatChk.boolTrip)
  996. {
  997. if(soe_check(EV_BATERR)==false) //
  998. {
  999. soe_record_ev(EV_BATERR, 1, 0,0,0 );
  1000. }
  1001. }
  1002. else
  1003. {
  1004. if(soe_check(EV_BATERR)==true) //
  1005. {
  1006. soe_record_ev(EV_BATERR, 0, 0,0,0 );
  1007. }
  1008. }
  1009. }
  1010. #else
  1011. { //电池电压低判断:两路直流,任一路大于直流整定值的一半,小于整定值0.8倍,3秒后报异常,若定值为0 ,退出判断
  1012. bool bCheck,bCheck2,bLowDC;
  1013. #ifdef DC_TEST_ONE
  1014. bCheck=((g_sw_pub.ac_in[PUB_AC_IN_UZ1]>(pRunSet->dwZL/2))&&(g_sw_pub.ac_in[PUB_AC_IN_UZ1]<pRunSet->dwZL*0.8))
  1015. &&(pRunSet->dwZL>0);
  1016. bCheck2=(g_sw_pub.ac_in[PUB_AC_IN_UZ1]>(pRunSet->dwZL+pRunSet->dwZL*0.2))
  1017. &&pRunSet->dwZL>0; //任一直流电压大于1.2倍->过压
  1018. #else
  1019. bCheck=((((DWORD)g_sw_pub.ac_in[PUB_AC_IN_UZ1]>(pRunSet->dwZL/2))&&((DWORD)g_sw_pub.ac_in[PUB_AC_IN_UZ1]<pRunSet->dwZL*0.8))
  1020. ||(((DWORD)g_sw_pub.ac_in[PUB_AC_IN_UZ2]>(pRunSet->dwZL/2))&&((DWORD)g_sw_pub.ac_in[PUB_AC_IN_UZ2]<pRunSet->dwZL*0.8)))
  1021. &&(pRunSet->dwZL>0);
  1022. bCheck2=(((DWORD)g_sw_pub.ac_in[PUB_AC_IN_UZ1]>(pRunSet->dwZL+pRunSet->dwZL*0.2))
  1023. ||((DWORD)g_sw_pub.ac_in[PUB_AC_IN_UZ2]>(pRunSet->dwZL+pRunSet->dwZL*0.2)))
  1024. &&pRunSet->dwZL>0; //任一直流电压大于1.2倍->过压
  1025. #endif
  1026. RunTR(&pSW->tBatChk, bCheck, dStep);
  1027. RunTR(&pSW->tBatOver, bCheck2, dStep);
  1028. if ((short)g_sw_pub.di_cfg_index[PUB_DI_DCQY] == INDEX_INVALLID)
  1029. {
  1030. bLowDC = pSW->tBatChk.boolTrip;
  1031. }
  1032. else
  1033. {
  1034. bLowDC = g_run_stu.dcqy;
  1035. }
  1036. if(pSW->tBatOver.boolTrip)//电池过压
  1037. {
  1038. if(soe_check(EV_BAT_OVER)==false)
  1039. {
  1040. soe_record_ev(EV_BAT_OVER, 1, 0,0,0 );
  1041. }
  1042. }
  1043. else if(soe_check(EV_BAT_OVER)==true) //
  1044. {
  1045. soe_record_ev(EV_BAT_OVER, 0, 0,0,0 );
  1046. }
  1047. if(bLowDC)
  1048. {
  1049. if(soe_check(EV_BATERR)==false) //
  1050. {
  1051. soe_record_ev(EV_BATERR, 1, 0,0,0 );
  1052. }
  1053. }
  1054. else if(soe_check(EV_BATERR)==true) //
  1055. {
  1056. soe_record_ev(EV_BATERR, 0, 0,0,0 );
  1057. }
  1058. }
  1059. #endif
  1060. #ifdef CUSTOMIZE_BZT //备自投
  1061. //备自投#1线路开关位置
  1062. if ((short)g_sw[sw].di_cfg_index[SW_DI_DL1_HW] != INDEX_INVALLID)
  1063. {
  1064. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_DL1_HW]];
  1065. pSW->uSWST.bFlag.b1DLHW = dido_di_is_on(ecd->slot,ecd->index);
  1066. }
  1067. else
  1068. {
  1069. pSW->uSWST.bFlag.b1DLHW = prun->hw; //合位、进线1合位共用
  1070. }
  1071. if((short)g_sw[sw].di_cfg_index[SW_DI_DL1_TW] != INDEX_INVALLID)
  1072. {
  1073. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_DL1_TW]];
  1074. pSW->uSWST.bFlag.b1DLHW = !dido_di_is_on(ecd->slot,ecd->index);
  1075. }
  1076. else
  1077. {
  1078. pSW->uSWST.bFlag.b1DLHW = !prun->tw;
  1079. }
  1080. //备自投#2线路开关位置
  1081. if ((short)g_sw[sw].di_cfg_index[SW_DI_DL2_HW] != INDEX_INVALLID)
  1082. {
  1083. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_DL2_HW]];
  1084. pSW->uSWST.bFlag.b2DLHW = dido_di_is_on(ecd->slot,ecd->index);
  1085. }
  1086. if ((short)g_sw[sw].di_cfg_index[SW_DI_DL2_TW] != INDEX_INVALLID)
  1087. {
  1088. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_DL2_TW]];
  1089. pSW->uSWST.bFlag.b2DLHW = !dido_di_is_on(ecd->slot,ecd->index);
  1090. }
  1091. //备自投#3线路开关位置
  1092. if ((short)g_sw[sw].di_cfg_index[SW_DI_DL3_HW] != INDEX_INVALLID)
  1093. {
  1094. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_DL3_HW]];
  1095. pSW->uSWST.bFlag.b3DLHW = dido_di_is_on(ecd->slot,ecd->index);
  1096. }
  1097. if ((short)g_sw[sw].di_cfg_index[SW_DI_DL3_TW] != INDEX_INVALLID)
  1098. {
  1099. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_DL3_TW]];
  1100. pSW->uSWST.bFlag.b3DLHW = !dido_di_is_on(ecd->slot,ecd->index);
  1101. }
  1102. //备自投闭锁位置
  1103. if ((short)g_sw[sw].di_cfg_index[SW_DI_BSBZT] != INDEX_INVALLID)
  1104. {
  1105. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_BSBZT]];
  1106. pSW->uSWST.bFlag.bBZTBS = dido_di_is_on(ecd->slot,ecd->index);
  1107. }
  1108. if ((short)g_sw[sw].di_cfg_index[SW_DI_BSBZT] != INDEX_INVALLID)
  1109. {
  1110. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_BSBZT]];
  1111. pSW->uSWST.bFlag.bBZTBS = dido_di_is_on(ecd->slot,ecd->index);
  1112. }
  1113. if ((short)g_sw[sw].di_cfg_index[SW_DI_BZT_SY] != INDEX_INVALLID)
  1114. {
  1115. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_BZT_SY]];
  1116. pSW->uSWST.bFlag.bBZTSY = dido_di_is_on(ecd->slot,ecd->index) || pSW->uSWST.bFlag.bBZTSY;
  1117. }
  1118. if(pRunSet->tSwSet[sw].bZF)
  1119. {
  1120. 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))
  1121. {
  1122. pSW->uSWST.bFlag.b1DLHW = prun->hw; //使用分合位
  1123. if ((short)g_sw[sw].di_cfg_index[SW_DI_DL2_HW] != INDEX_INVALLID)
  1124. {
  1125. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_DL2_HW]];
  1126. pSW->uSWST.bFlag.b2DLHW = dido_di_is_on(ecd->slot,ecd->index);
  1127. }
  1128. }
  1129. 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))
  1130. {
  1131. if ((short)g_sw[sw].di_cfg_index[SW_DI_DL1_HW] != INDEX_INVALLID)
  1132. {
  1133. ecd = &g_equ_config_di[g_sw[sw].di_cfg_index[SW_DI_DL1_HW]];
  1134. pSW->uSWST.bFlag.b1DLHW = dido_di_is_on(ecd->slot,ecd->index);
  1135. }
  1136. pSW->uSWST.bFlag.b2DLHW = prun->hw; //使用分合位
  1137. }
  1138. }
  1139. #endif
  1140. #ifdef FUNC_LARGECURRENT_BS_CHZ
  1141. //大电流闭锁重合
  1142. {
  1143. //大电流闭锁重合
  1144. bIBSCHZ = OverRelay(g_sw[sw].m2_max, pRunSet->tSwSet[sw].dIBSCHZ, pRunSet->tSwSet[sw].dIBSCHZ, false);
  1145. RunTR(&pSW->tIBSCHZ, bIBSCHZ && pRunSet->tSwSet[sw].bTT_IBSCHZ, dStep);
  1146. pSW->uSWST.bFlag.bIBSCHZ = pSW->tIBSCHZ.boolTrip;
  1147. }
  1148. #endif
  1149. }
  1150. #ifdef YK_ZZDY_KC
  1151. sw_do_pub(PUB_YK_ZZDY_KC,SW_DO_TYPE_ON);
  1152. #endif
  1153. #ifdef IEC_NOLINK_NO_CALLYX
  1154. g_link_comm.link_err = getIecLink101Status();
  1155. RunTR(&g_link_comm.tLinkBreak,g_link_comm.link_err,dStep);
  1156. g_link_comm.link_flag = g_link_comm.tLinkBreak.boolTrip||(!g_link_comm.link_err);
  1157. #endif
  1158. return 0;
  1159. }
  1160. /******************************************************************************
  1161. 函数名称: app_action_result
  1162. 函数版本: 01.01
  1163. 创建作者: xxxxxx
  1164. 创建日期: 2015-10-23
  1165. 函数说明: 应用逻辑运行结果
  1166. 参数说明: 无
  1167. 返回值: 成功返回0.
  1168. 修改记录:
  1169. */
  1170. // 动作灯: 线路故障指示灯为红色,故障状态时闪烁,闭锁合闸时常亮,非故障和非闭锁状态下熄灭
  1171. // LOCK灯,为FA功能使用,过流闭锁不点亮,为自动处理的状态灯,不建议复归时处理
  1172. int app_action_result(void)
  1173. {
  1174. int sw,i;
  1175. u8 exerr, gl, jd,gj, chzdz, bs, gz,bvol,sy,gy,fdl;
  1176. for (sw=0; sw<g_sw_num; sw++)
  1177. {
  1178. TRELAY_T *pR=&g_tRelay[sw];
  1179. RUN_STU_SW *prun=&pR->run_stu;
  1180. // 每个开关都需要重新初始化变量
  1181. exerr=0;
  1182. gl=0;
  1183. jd=0;
  1184. chzdz=0;
  1185. bs=0;
  1186. gz=0;
  1187. sy=0;
  1188. gy=0;
  1189. fdl=0;
  1190. gj = 0;
  1191. // 外部异常
  1192. if (pR->tSWST.uSWST.bFlag.bWCN)
  1193. {
  1194. exerr = 1;
  1195. }
  1196. #ifdef GW_AREA_MAIN_2021
  1197. // 保护过流
  1198. if (pR->tOC[OC_GL1].sta.bFlag.bDzLed
  1199. || pR->tOC[OC_GL2].sta.bFlag.bDzLed
  1200. || pR->tOC[OC_GL3].sta.bFlag.bDzLed
  1201. || pR->tOC[OC_DL].sta.bFlag.bDzLed
  1202. || pR->tOC[OC_GLJS].sta.bFlag.bDzLed
  1203. || pR->tOC[OC_GLBS].sta.bFlag.bDzLed) // 过流闭锁,点过流灯
  1204. {
  1205. gl = 1;
  1206. //TODO 状态记录 EWen
  1207. // g_file_led_write[sw].led_gl = gl; // 记录过流LED状态 1
  1208. // g_file_led_sign = 1; // 故障LED状态置位
  1209. }
  1210. // 保护过流跳闸失败
  1211. if (pR->tOC[OC_GL1].sta.bFlag.bTzsbLed
  1212. || pR->tOC[OC_GL2].sta.bFlag.bTzsbLed
  1213. || pR->tOC[OC_GL3].sta.bFlag.bTzsbLed
  1214. || pR->tOC[OC_DL].sta.bFlag.bTzsbLed
  1215. || pR->tOC[OC_GLJS].sta.bFlag.bTzsbLed)
  1216. {
  1217. gl = 2;
  1218. //TODO 状态记录 EWen
  1219. // g_file_led_write[sw].led_gl = gl; // 记录过流LED状态 2
  1220. // g_file_led_sign = 1; // 故障LED状态置位
  1221. }
  1222. // 保护接地
  1223. if (pR->tOC[OC_LX1].sta.bFlag.bDzLed
  1224. || pR->tOC[OC_LX2].sta.bFlag.bDzLed
  1225. || pR->tOC[OC_LX3].sta.bFlag.bDzLed
  1226. || pR->tOC[OC_LL].sta.bFlag.bDzLed
  1227. || pR->tOC[OC_LXJS].sta.bFlag.bDzLed
  1228. || pR->tOC[OC_LYJS].sta.bFlag.bDzLed
  1229. || xdl_is_dz(sw) // 增加小电流接地
  1230. || pR->tXXTZ.bU0Led //零序选线跳闸
  1231. || pR->tU0TZ.bU0Led)
  1232. {
  1233. jd = 1;
  1234. //TODO 状态记录 EWen
  1235. // g_file_led_write[sw].led_jd = jd; // 记录接地LED状态 1
  1236. // g_file_led_sign = 1; // 故障LED状态置位
  1237. }
  1238. //失压跳闸
  1239. if (pR->tLostVot.bLostVotLed)
  1240. {
  1241. sy = 1;
  1242. }
  1243. // 保护零序过流跳闸失败
  1244. if (pR->tOC[OC_LX1].sta.bFlag.bTzsbLed
  1245. || pR->tOC[OC_LX2].sta.bFlag.bTzsbLed
  1246. || pR->tOC[OC_LX3].sta.bFlag.bTzsbLed
  1247. || pR->tOC[OC_LL].sta.bFlag.bTzsbLed
  1248. || pR->tOC[OC_LXJS].sta.bFlag.bTzsbLed
  1249. || pR->tOC[OC_LYJS].sta.bFlag.bTzsbLed)
  1250. {
  1251. jd = 2;
  1252. //TODO 状态记录 EWen
  1253. // g_file_led_write[sw].led_jd = jd; // 记录接地LED状态 2
  1254. // g_file_led_sign = 1; // 故障LED状态置位
  1255. }
  1256. // 重合闸动作
  1257. if (pR->tCHZ.sta.bFlag.bCHZLed)
  1258. {
  1259. chzdz = 1;
  1260. }
  1261. // 闭锁
  1262. if ( pR->tSDHZ.bL_BSLed
  1263. || pR->tSDHZ.bS_BSLed)
  1264. {
  1265. bs = 1;
  1266. }
  1267. //电流越限
  1268. if (pR->tOC[OC_OVLOAD].sta.bFlag.bDzLed
  1269. || pR->tOC[OC_DLGZ].sta.bFlag.bDzLed
  1270. || pR->tOC[OC_DLYX].sta.bFlag.bDzLed)
  1271. {
  1272. gz = 1; // 过载不点动作灯
  1273. }
  1274. prun->exerr = exerr;
  1275. prun->gl = gl;
  1276. prun->jd = jd;
  1277. prun->chzdz = chzdz;
  1278. prun->bs = bs;
  1279. if (gl || jd || chzdz ||sy) // 故障状态,动作灯常亮 (过流、接地、重合闸、过载,失压)
  1280. {
  1281. prun->dz = 1;
  1282. }
  1283. else if ( bs) // X Y闭锁,动作灯闪烁
  1284. {
  1285. prun->dz = 2; // 闪烁
  1286. }
  1287. bvol=false;
  1288. for(i=0;i<=VOL_DDY_Uca2;i++)
  1289. {
  1290. bvol|=g_tVol[i].sta.bFlag.bGj;
  1291. }
  1292. //g_run_stu.pubdz = bvol; // 电压越限不点动作灯,
  1293. }
  1294. #else
  1295. prun->gj_led =0;
  1296. //告警的时候不亮动作灯
  1297. if(pR->tOC[BH_GL1].sta.bFlag.bGjLed
  1298. || pR->tOC[BH_GL2].sta.bFlag.bGjLed
  1299. || pR->tOC[BH_GL3].sta.bFlag.bGjLed
  1300. || pR->tOC[BH_LX1].sta.bFlag.bGjLed
  1301. || pR->tOC[BH_LX2].sta.bFlag.bGjLed
  1302. #ifdef DISP_SET_LX3
  1303. || pR->tOC[BH_LX3].sta.bFlag.bGjLed
  1304. #endif
  1305. || pR->tOC[FA_GL2].sta.bFlag.bGjLed
  1306. #ifdef SET_GL_GJ2
  1307. || pR->tOC[FA_GL2_II].sta.bFlag.bGjLed
  1308. #endif
  1309. || pR->tOC[FA_LX2].sta.bFlag.bGjLed
  1310. || pR->tOVER_U0TZ.bU0GjLed
  1311. || pR->tU0TZ.bU0GjLed)
  1312. {
  1313. if(pR->tOC[BH_GL1].sta.bFlag.bGjLed
  1314. || pR->tOC[BH_GL2].sta.bFlag.bGjLed
  1315. || pR->tOC[BH_GL3].sta.bFlag.bGjLed
  1316. || pR->tOC[FA_GL2].sta.bFlag.bGjLed
  1317. #ifdef SET_GL_GJ2
  1318. || pR->tOC[FA_GL2_II].sta.bFlag.bGjLed
  1319. #endif
  1320. //|| pR->tOC[FA_GL].sta.bFlag.bGjLed)
  1321. )
  1322. {
  1323. gl = 1;
  1324. }
  1325. #if 0
  1326. else
  1327. #else
  1328. if(pR->tOC[BH_LX1].sta.bFlag.bGjLed
  1329. || pR->tOC[BH_LX2].sta.bFlag.bGjLed
  1330. #ifdef DISP_SET_LX3
  1331. || pR->tOC[BH_LX3].sta.bFlag.bGjLed
  1332. #endif
  1333. || pR->tOC[FA_LX2].sta.bFlag.bGjLed
  1334. || pR->tOVER_U0TZ.bU0GjLed
  1335. || pR->tU0TZ.bU0GjLed)
  1336. #endif
  1337. {
  1338. jd = 1;
  1339. }
  1340. gj = 1;
  1341. prun->gj_led =1;
  1342. prun->dz=RY_DZ_BHGJ;
  1343. }
  1344. // 保护过流
  1345. if (pR->tOC[BH_GL1].sta.bFlag.bDzLed
  1346. || pR->tOC[BH_GL2].sta.bFlag.bDzLed
  1347. || pR->tOC[BH_GL3].sta.bFlag.bDzLed
  1348. || pR->tOC[BH_GLJS].sta.bFlag.bDzLed
  1349. || pR->tOC[FA_GL].sta.bFlag.bDzLed
  1350. || pR->tOC[FA_GL_II].sta.bFlag.bDzLed
  1351. //|| pR->tOC[FA_GL2].sta.bFlag.bGj
  1352. || pR->tgoc.bglTzLed // 智能FA过流
  1353. #ifdef GD_AREA_ZHONGSHAN_2020
  1354. ||pR->tgoc.tOc[FAG_GL1].sta.bFlag.bDzLed
  1355. ||pR->tgoc.tOc[FAG_GL2].sta.bFlag.bDzLed
  1356. #endif
  1357. || pR->uGLFSX.bFlag.bDzLed
  1358. || pR->tOC[FA_DLBS].sta.bFlag.bDzLed) // 过流闭锁,点过流灯
  1359. {
  1360. gl = 1;
  1361. gj = 1;
  1362. prun->dz=RY_DZ_BHT;
  1363. prun->gj_led = 1;
  1364. }
  1365. // 保护接地
  1366. if (pR->tOC[BH_LX1].sta.bFlag.bDzLed
  1367. || pR->tOC[BH_LX2].sta.bFlag.bDzLed
  1368. #ifdef DISP_SET_LX3
  1369. || pR->tOC[BH_LX3].sta.bFlag.bDzLed
  1370. #endif
  1371. || pR->tOC[BH_LXJS].sta.bFlag.bDzLed
  1372. || pR->tOC[FA_LX].sta.bFlag.bDzLed
  1373. //|| pR->tOC[FA_LX2].sta.bFlag.bGj
  1374. #ifdef XDL_ZT
  1375. || xdl_is_dz(sw) // 增加小电流接地
  1376. #endif
  1377. #ifdef FUN_JDXX
  1378. || pR->tJD.sta.bFlag.bTZLed
  1379. || pR->tJD.sta.bFlag.bGJLed
  1380. #endif
  1381. #ifdef GD_AREA_ZHONGSHAN_2020
  1382. ||pR->tgoc.tOc[FAG_LX].sta.bFlag.bDzLed
  1383. #endif
  1384. || pR->tgoc.blxTzLed // 智能FA过流
  1385. || pR->tXXTZ.bU0Led //零序选线跳闸
  1386. || pR->tU0TZ.bU0Led
  1387. || pR->tOVER_U0TZ.bU0Led)
  1388. {
  1389. jd = 1;
  1390. gj = 1;
  1391. prun->dz=RY_DZ_BHT;
  1392. prun->gj_led = 1;
  1393. }
  1394. #ifndef GW_AREA_MAIN_2021
  1395. for(i=0;i<8;i++)
  1396. {
  1397. fdl|=pR->tFdl[i].sta.bFlag.bTz;
  1398. }
  1399. #endif
  1400. //失压跳闸+智能分布式越级跳,首端失压跳,故障隔离跳,通信异常跳,都亮动作灯
  1401. if (pR->tLostVot.bLostVotLed
  1402. || pR->tgoc.bextTzLed
  1403. || pR->tgoc.bsdTzLed
  1404. || pR->tgoc.bgzglTzLed
  1405. || pR->tgoc.berrTzLed )// goose
  1406. {
  1407. prun->dz=RY_DZ_BHT;
  1408. }
  1409. //过压压跳闸
  1410. if (pR->tDYJL.bLed||pR->tPLJL.bLed)
  1411. {
  1412. gy = 1;
  1413. }
  1414. // 重合闸动作
  1415. if (pR->tCHZ.sta.bFlag.bCHZLed)
  1416. {
  1417. chzdz = 1;
  1418. }
  1419. #ifdef GD_AREA_ZHUHAI_V2//珠海要求合闸需亮动作灯
  1420. //合闸动作
  1421. if(pR->uBHDZ.bFlag.bBHH)//合闸动作展宽200ms
  1422. {
  1423. //prun->dz=RY_DZ_BHGJ;//珠海要求重合闸动作后,过流或接地灯一直亮。灯人工干预或定时复归才灭
  1424. prun->dz=RY_DZ_HZ;
  1425. }
  1426. //rt_printf("run_dz = %d, b_BHH = %d\r\n",prun->dz,pR->uBHDZ.bFlag.bBHH);
  1427. #endif
  1428. // 闭锁
  1429. if ( pR->tSDHZ.bL_BSLed
  1430. || pR->tSDHZ.bS_BSLed)
  1431. {
  1432. bs = 1;
  1433. }
  1434. //重合闸充电标志
  1435. prun->chzcd=pR->tCHZ.sta.bFlag.bCDWC;
  1436. if(g_tRelay[sw].tCHZ.wAR_ActTimes>=pRunSet->tSwSet[sw].d_chz_times)
  1437. {
  1438. prun->chzcd=0; //最后一次重合后灭灯,复归后点亮
  1439. }
  1440. prun->exerr = exerr;
  1441. prun->gl = gl;
  1442. prun->jd = jd||pR->tOC[FA_LX2].sta.bFlag.bGj||pR->tU0TZ.bU0GjLed || pR->tU0TZ.bU0Led;
  1443. prun->chzdz = chzdz;
  1444. prun->bs = bs;
  1445. prun->gy=gy;
  1446. /*if(gj)//只告警的时候不亮动作灯
  1447. {
  1448. prun->dz = RY_DZ_NULL;
  1449. prun->gj_led =1;
  1450. }
  1451. else if (gl || jd || chzdz ||sy||gy||fdl) // 故障状态,动作灯闪烁 (过流、接地、重合闸、过载,失压)
  1452. {
  1453. prun->dz = RY_DZ_BHT;
  1454. prun->gj_led =1;
  1455. }
  1456. else */
  1457. if ( bs && pR->tSDHZ.bS_BSLed) // X Y闭锁,动作灯常亮
  1458. {
  1459. prun->dz = RY_DZ_XYBS; // 常亮
  1460. }
  1461. if(prun->dz==RY_DZ_XYBS)
  1462. {
  1463. if(!bs) //闭锁灯自动复归
  1464. {
  1465. prun->dz=RY_DZ_NULL;
  1466. }
  1467. }
  1468. bvol=false;
  1469. for(i=0;i<=VOL_DDY_Uca2;i++)
  1470. {
  1471. bvol|=g_tVol[i].sta.bFlag.bGj;
  1472. }
  1473. }
  1474. // 动作总
  1475. g_run_stu.pubdz= run_status_dz_all();
  1476. #endif
  1477. return 0;
  1478. }
  1479. // u32 rmtpair_dely[2][2]={{0, 0},{0, 0}}; // 用于遥控器配对延时返回
  1480. /*------------------------------ 内部函数 -------------------------------------
  1481. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  1482. */
  1483. /******************************************************************************
  1484. 函数名称: rmt_key_app
  1485. 函数版本: 01.01
  1486. 创建作者: xxxxxx
  1487. 创建日期: 2015-05-13
  1488. 函数说明: 遥控器按键应用逻辑
  1489. 参数说明: 无
  1490. 返回值: 成功返回0.
  1491. 修改记录:
  1492. */
  1493. int _rmt_key_app(u32 dStep)
  1494. {
  1495. u8 key;
  1496. if (rmtpair_dely[0][0] || rmtpair_dely[1][0])
  1497. {
  1498. return -1;
  1499. }
  1500. for (key=0; key<RMT_KEY_NUM; key++)
  1501. {
  1502. switch(g_rmt_op.step[key])
  1503. {
  1504. case 0:
  1505. // 按键0状态
  1506. g_rmt_op.step[key] = (g_rmt_op.key == (1<<key)) ? 1 : 0;
  1507. break;
  1508. case 1:
  1509. // 按键1->0状态
  1510. g_rmt_op.step[key] = (g_rmt_op.key == (1<<key)) ? 1 : 2;
  1511. break;
  1512. case 2:
  1513. // 按键1->0状态
  1514. g_rmt_op.key_en[key] = 1;
  1515. g_rmt_op.step[key] = 0;
  1516. break;
  1517. }
  1518. }
  1519. switch(g_rmt_op.stu)
  1520. {
  1521. case RMTSTU_NULL:
  1522. // 在空闲态,有解锁按键时,进入解锁状态
  1523. if (g_rmt_op.key_en[RMT_KEY_ULK])
  1524. {
  1525. g_rmt_op.stu = RMTSTU_ULOCK;
  1526. g_rmt_op.key_en[RMT_KEY_ULK] = 0;
  1527. ResetTR(&g_rmt_op.tTULK3STime);
  1528. }
  1529. g_rmt_op.key_en[RMT_KEY_FZ] = 0;
  1530. g_rmt_op.key_en[RMT_KEY_HZ] = 0;
  1531. break;
  1532. case RMTSTU_ULOCK:
  1533. // 在解锁态,打开3秒计时,3秒内有分闸或合闸按键,进入分闸或合闸处理,否则返回空闲态
  1534. RunTR(&g_rmt_op.tTULK3STime, 1, dStep);
  1535. if (g_rmt_op.tTULK3STime.boolTrip)
  1536. {
  1537. g_rmt_op.stu = RMTSTU_NULL;
  1538. }
  1539. else
  1540. {
  1541. if (g_rmt_op.key_en[RMT_KEY_FZ])
  1542. {
  1543. g_rmt_op.stu = RMTSTU_FZ;
  1544. g_rmt_op.key_en[RMT_KEY_FZ] = 0;
  1545. ResetTR(&g_rmt_op.tTULK3STime);
  1546. }
  1547. else if (g_rmt_op.key_en[RMT_KEY_HZ])
  1548. {
  1549. g_rmt_op.stu = RMTSTU_HZ;
  1550. g_rmt_op.key_en[RMT_KEY_HZ] = 0;
  1551. ResetTR(&g_rmt_op.tTULK3STime);
  1552. }
  1553. }
  1554. break;
  1555. case RMTSTU_FZ:
  1556. // 发出分闸指令,返回空闲态
  1557. g_rmt_op.cmd = CMD_FZ;
  1558. g_rmt_op.stu = RMTSTU_NULL;
  1559. break;
  1560. case RMTSTU_HZ:
  1561. // 发出合闸指令,返回空闲态
  1562. g_rmt_op.cmd = CMD_HZ;
  1563. g_rmt_op.stu = RMTSTU_NULL;
  1564. break;
  1565. }
  1566. // 有复归按键,发出复归指令
  1567. if (g_rmt_op.key_en[RMT_KEY_FG])
  1568. {
  1569. g_rmt_op.cmd = CMD_FG;
  1570. g_rmt_op.key_en[RMT_KEY_FG] = 0;
  1571. }
  1572. return 0;
  1573. }
  1574. /******************************************************************************
  1575. 函数名称: _rst_key_app
  1576. 函数版本: 01.01
  1577. 创建作者: xxxxxx
  1578. 创建日期: 2015-05-13
  1579. 函数说明: 复归按键
  1580. 参数说明: 无
  1581. 返回值: 成功返回0.
  1582. 修改记录:
  1583. */
  1584. int _rst_key_app(void)
  1585. {
  1586. static u8 fg_flag=0;
  1587. if(g_run_stu.fg)
  1588. {
  1589. if (!fg_flag)
  1590. {
  1591. ResetHzLed(0);
  1592. SignalReset(0,true);
  1593. fg_flag = 1;
  1594. }
  1595. }
  1596. else
  1597. {
  1598. fg_flag = 0;
  1599. }
  1600. return 0;
  1601. }
  1602. /******************************************************************************
  1603. 函数名称: _create_instu_file
  1604. 函数版本: 01.01
  1605. 创建作者: xxxxxx
  1606. 创建日期: 2015-04-16
  1607. 函数说明: 创建内部状态描述文件
  1608. 参数说明: 无
  1609. 返回值: 成功返回0.
  1610. 修改记录:
  1611. */
  1612. int _create_instu_file(void)
  1613. {
  1614. unsigned int i,file_length;
  1615. u16 crc16;
  1616. char *p;
  1617. loff_t pos;
  1618. struct file * pfile;
  1619. struct instu_file_head_data fh;
  1620. struct instu_desc desc;
  1621. // 写文件头
  1622. // 配置文件头
  1623. memset(&fh,0,sizeof(fh));
  1624. fh.cfh.signature = SIG_INSTU_FILE;
  1625. fh.cfh.version = INSTU_FILE_VERSION;
  1626. //装置类型
  1627. // 公共类三遥资源
  1628. fh.instu_addr = FILE_ADDR_ALGIN(sizeof(fh));
  1629. fh.instu_num = INSTU_NUM;
  1630. // 得到文件长度
  1631. file_length = FILE_ADDR_ALGIN(fh.instu_addr + fh.instu_num * sizeof(struct instu_desc));
  1632. // 分配并初始化空间
  1633. p = rt_malloc(file_length + 2); //加crc长度
  1634. if(!p)
  1635. {
  1636. return -1;
  1637. }
  1638. memset(p,0,file_length);
  1639. // 写入文件头
  1640. memcpy(p,(char *)&fh,sizeof(fh));
  1641. // 写内部状态描述
  1642. for(i=0; i<fh.instu_num; i++)
  1643. {
  1644. memset(&desc,0,sizeof(desc));
  1645. if (i < INSTU_NUM)
  1646. {
  1647. desc.type = g_instu_desc[i].type;
  1648. strncpy(desc.name,g_instu_desc[i].name,20);
  1649. desc.name[20-1] = 0;
  1650. }
  1651. memcpy(p + fh.instu_addr + i*sizeof(desc), (char *)&desc, sizeof(desc));
  1652. }
  1653. // 创建描述文件
  1654. pfile = rt_file_open("/tmp/instu.bin",O_CREAT|O_RDWR|O_TRUNC,0);
  1655. if(IS_ERR(pfile))
  1656. {
  1657. rt_free(p);
  1658. return -1;
  1659. }
  1660. // 计算CRC
  1661. crc16 = CrcStr(p,file_length);
  1662. memcpy(p+file_length,&crc16,2);
  1663. pos = 0;
  1664. rt_file_write(pfile,p,file_length + 2,&pos);
  1665. rt_file_close(pfile,0);
  1666. rt_free(p);
  1667. return 0;
  1668. }
  1669. /*------------------------------ 测试函数 -------------------------------------
  1670. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  1671. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  1672. */
  1673. int runstu_printf(void)
  1674. {
  1675. rt_printf("内部状态信息:\r\n");
  1676. rt_printf("yf=%d\r\n",g_run_stu.yf);
  1677. return 0;
  1678. }
  1679. //========================== 本文件结束 =============================