ReadEeprom.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. /*********************************************************************************************************
  2. * 模块名称:ReadEeprom.c
  3. * 摘 要:ReadEeprom模块,进行独立按键初始化,以及按键扫描函数实现
  4. * 当前版本:1.0.0
  5. * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
  6. * 完成日期:2021年07月01日
  7. * 内 容:
  8. * 注 意:
  9. **********************************************************************************************************
  10. * 取代版本:
  11. * 作 者:
  12. * 完成日期:
  13. * 修改内容:
  14. * 修改文件:
  15. *********************************************************************************************************/
  16. /*********************************************************************************************************
  17. * 包含头文件
  18. *********************************************************************************************************/
  19. #include "ReadEeprom.h"
  20. #include "Main.h"
  21. #include "gd32e230x_conf.h"
  22. #include "At24cxx.h"
  23. #include "string.h"
  24. #include "Relay.h"
  25. #include "Sn74lvc573.h"
  26. /*********************************************************************************************************
  27. * 宏定义
  28. *********************************************************************************************************/
  29. /*********************************************************************************************************
  30. * 枚举结构体
  31. *********************************************************************************************************/
  32. /*********************************************************************************************************
  33. * 内部变量定义
  34. *********************************************************************************************************/
  35. unsigned char Eeprom_Rbuf[200]={0};
  36. unsigned char Chal_Num;
  37. extern EE_ACDC_Total_Consumption EE_ACDC_Total_Consum_Read_Reg[RelaySlaveChaNum];
  38. extern uint32_t read_Total_Consumer[RelaySlaveChaNum];
  39. extern uint8_t over_Func_flag[RelaySlaveChaNum];
  40. /*********************************************************************************************************
  41. * 内部函数声明
  42. *********************************************************************************************************/
  43. /*********************************************************************************************************
  44. * 内部函数实现
  45. *********************************************************************************************************/
  46. /*********************************************************************************************************
  47. * 函数名称:ReadEeprom
  48. * 函数功能:读出Eeprom的数据
  49. * 输入参数:void
  50. * 输出参数:void
  51. * 返 回 值:void
  52. * 创建日期:2021年07月01日
  53. * 注 意:
  54. *********************************************************************************************************/
  55. void ReadEeprom(void)
  56. {
  57. AT24CxxRead(Eepr_AC_Sing_Dela_OnSmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Dela_OnSmaQua); //从eeprom中读出通道开启延时数据
  58. memcpy(&EE_ACDC_Delay_ReadReg_On,&Eeprom_Rbuf,Eepr_AC_Sing_Dela_OnSmaQua); //将数据拷贝到指定的结构体,可能需要注意大小端问题
  59. memcpy(&Sort_Onbuf,&EE_ACDC_Delay_ReadReg_On,Eepr_AC_Sing_Dela_OnSmaQua); //将数据进行排序,然后存入数组中
  60. Bubble_Sort(Sort_Onbuf,RelaySlaveChaNum);
  61. AT24CxxRead(Eepr_AC_Sing_Dela_OffSmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Dela_OffSmaQua); //从eeprom中读出通道关闭延时数据
  62. memcpy(&EE_ACDC_Delay_ReadReg_Off,&Eeprom_Rbuf,Eepr_AC_Sing_Dela_OffSmaQua); //将数据拷贝到指定的结构体,可能需要注意大小端问题
  63. memcpy(&Sort_Offbuf,&EE_ACDC_Delay_ReadReg_Off,Eepr_AC_Sing_Dela_OffSmaQua); //将数据进行排序,然后存入数组中
  64. Bubble_Sort(Sort_Offbuf,RelaySlaveChaNum);
  65. AT24CxxRead(Eepr_AC_Sing_State_SmaWAddr, Eeprom_Rbuf, Eepr_AC_Sing_State_SmaWQua);//从eeprom中读出通道状态数据
  66. memcpy(&EE_ACDC_State_ReadReg,&Eeprom_Rbuf,Eepr_AC_Sing_State_SmaWQua); //将数据拷贝到指定的结构体,可能需要注意大小端问题
  67. AT24CxxRead(Eepr_AC_Sing_Thr_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Thr_SmaQua); //从eeprom中读出通道阈值数据
  68. memcpy(&EE_ACDC_ThresVal_ReadReg,&Eeprom_Rbuf,Eepr_AC_Sing_Thr_SmaQua); //将数据拷贝到指定的结构体,可能需要注意大小端问题
  69. //check is
  70. for(Chal_Num=0;Chal_Num<RelaySlaveChaNum;Chal_Num++)
  71. {
  72. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_TopThres > Default_Voltage_Max)
  73. {
  74. EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_TopThres = 0;
  75. }
  76. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_DownThres > Default_Voltage_Max)
  77. {
  78. EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_DownThres = 0;
  79. }
  80. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_P_TopThres > Default_Power_Max)
  81. {
  82. EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_P_TopThres = 0;
  83. }
  84. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_I_TopThres > Default_Current_Max)
  85. {
  86. EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_I_TopThres = 0;
  87. }
  88. }
  89. for(Chal_Num=0;Chal_Num<RelaySlaveChaNum;Chal_Num++)
  90. {
  91. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_TopThres <= THRESHOULD_JUDGMENT)
  92. {
  93. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Vol_Upthr_En = false;
  94. }else
  95. {
  96. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Vol_Upthr_En = true;
  97. }
  98. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_DownThres <= THRESHOULD_JUDGMENT)
  99. {
  100. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Vol_Downthr_En = false;
  101. }else
  102. {
  103. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Vol_Downthr_En = true;
  104. }
  105. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_I_TopThres <= THRESHOULD_JUDGMENT)
  106. {
  107. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Cur_Upthr_En = false;
  108. }else
  109. {
  110. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Cur_Upthr_En = true;
  111. }
  112. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_P_TopThres <= THRESHOULD_JUDGMENT)
  113. {
  114. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Pow_Upthr_En = false;
  115. }else
  116. {
  117. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Pow_Upthr_En = true;
  118. }
  119. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_E_TopThres <= THRESHOULD_JUDGMENT)
  120. {
  121. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Ele_Upthr_En = false;
  122. }else
  123. {
  124. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Ele_Upthr_En = true;
  125. }
  126. }
  127. AT24CxxRead(Eepr_AC_Sing_Coef_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Coef_SmaQua); //从eeprom中读出通道的系数
  128. memcpy(&EE_ACDC_Coef_ReadReg,&Eeprom_Rbuf,Eepr_AC_Sing_Coef_SmaQua); //将数据拷贝到指定的结构体,可能需要注意大小端问题
  129. for(Chal_Num=0;Chal_Num<RelaySlaveChaNum;Chal_Num++) //如果eeprom中没有存入数据设置默认值
  130. {
  131. if((EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_V_k)==0xffffffff) //没有写入电压系数则默认K为1000,B为0;放大1000倍存入的
  132. {
  133. EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_V_k = 1000;
  134. }
  135. if((EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_V_b)==0xffffffff)
  136. {
  137. (EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_V_b) = 0;
  138. }
  139. if((EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_I_k)==0xffffffff) //没有写入电流系数则默认K为1000,B为0;放大1000倍存入的
  140. {
  141. EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_I_k = 1000;
  142. }
  143. if((EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_I_b)==0xffffffff)
  144. {
  145. EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_I_b = 0;
  146. }
  147. }
  148. //read total consumer
  149. AT24CxxRead(Eepr_AC_Sing_Total_Consumer_addr, Eeprom_Rbuf, Eepr_AC_Sing_Total_Consumer_SmaQua);
  150. for(int i = 0; i < RelaySlaveChaNum;i++){
  151. int temp = i << 2;
  152. read_Total_Consumer[i] += Eeprom_Rbuf[temp + 0] << 24;
  153. read_Total_Consumer[i] += Eeprom_Rbuf[temp + 1] << 16;
  154. read_Total_Consumer[i] += Eeprom_Rbuf[temp + 2] << 8;
  155. read_Total_Consumer[i] += Eeprom_Rbuf[temp + 3] << 0;
  156. if(read_Total_Consumer[i] > Default_Consum_Max)
  157. {
  158. read_Total_Consumer[i] = 0;
  159. }
  160. }
  161. //read wanning func
  162. AT24CxxRead(Eepr_AC_Sing_Channel_Func_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Channel_Func_SmaQua);
  163. memcmp(ACDC_Over_WriteReg,Eeprom_Rbuf,Eepr_AC_Sing_Channel_Func_SmaQua);
  164. for(int i=0; i < RelaySlaveChaNum;i++)
  165. {
  166. if(ACDC_Over_WriteReg[i].openration > 0x003f)
  167. {
  168. ACDC_Over_WriteReg[i].openration = 0;
  169. }
  170. }
  171. }
  172. #if ACSingPhSmaCurr
  173. /*********************************************************************************************************
  174. * API函数实现
  175. *********************************************************************************************************/
  176. /*********************************************************************************************************
  177. * 函数名称:Relay1State
  178. * 函数功能:Relay1State模块,控制继电器和更新通道状态
  179. * 输入参数:void
  180. * 输出参数:void
  181. * 返 回 值:void
  182. * 创建日期:2021年07月01日
  183. * 注 意:
  184. *********************************************************************************************************/
  185. void Relay1State(void)
  186. {
  187. if(RelaySlaveChaNum>=1)
  188. {
  189. if(EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State==true)
  190. {
  191. RELAY_1_ON; //开继电器1
  192. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = true;
  193. }
  194. else
  195. {
  196. RELAY_1_OFF; //关继电器1
  197. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = false;
  198. }
  199. }
  200. }
  201. /*********************************************************************************************************
  202. * 函数名称:Relay2State
  203. * 函数功能:Relay2State模块,控制继电器和更新通道状态
  204. * 输入参数:void
  205. * 输出参数:void
  206. * 返 回 值:void
  207. * 创建日期:2021年07月01日
  208. * 注 意:
  209. *********************************************************************************************************/
  210. void Relay2State(void)
  211. {
  212. if(RelaySlaveChaNum>=2)
  213. {
  214. if(EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State==true)
  215. {
  216. RELAY_2_ON; //开继电器2
  217. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = true;
  218. }
  219. else
  220. {
  221. RELAY_2_OFF; //关继电器2
  222. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = false;
  223. }
  224. }
  225. }
  226. /*********************************************************************************************************
  227. * 函数名称:Relay3State
  228. * 函数功能:Relay3State模块,控制继电器和更新通道状态
  229. * 输入参数:void
  230. * 输出参数:void
  231. * 返 回 值:void
  232. * 创建日期:2021年07月01日
  233. * 注 意:
  234. *********************************************************************************************************/
  235. void Relay3State(void)
  236. {
  237. if(RelaySlaveChaNum>=3)
  238. {
  239. if(EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State==true)
  240. {
  241. RELAY_3_ON; //开继电器3
  242. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = true;
  243. }
  244. else
  245. {
  246. RELAY_3_OFF; //关继电器3
  247. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = false;
  248. }
  249. }
  250. }
  251. /*********************************************************************************************************
  252. * 函数名称:Relay4State
  253. * 函数功能:Relay4State模块,控制继电器和更新通道状态
  254. * 输入参数:void
  255. * 输出参数:void
  256. * 返 回 值:void
  257. * 创建日期:2021年07月01日
  258. * 注 意:
  259. *********************************************************************************************************/
  260. void Relay4State(void)
  261. {
  262. if(RelaySlaveChaNum>=4)
  263. {
  264. if(EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State==true)
  265. {
  266. RELAY_4_ON; //开继电器4
  267. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = true;
  268. }
  269. else
  270. {
  271. RELAY_4_OFF; //关继电器4
  272. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = false;
  273. }
  274. }
  275. }
  276. /*********************************************************************************************************
  277. * 函数名称:Relay5State
  278. * 函数功能:Relay5State模块,控制继电器和更新通道状态
  279. * 输入参数:void
  280. * 输出参数:void
  281. * 返 回 值:void
  282. * 创建日期:2021年07月01日
  283. * 注 意:
  284. *********************************************************************************************************/
  285. void Relay5State(void)
  286. {
  287. if(RelaySlaveChaNum>=5)
  288. {
  289. if(EE_ACDC_State_ReadReg[4].ACDC_Cha_On_Off_State==true)
  290. {
  291. RELAY_5_ON; //开继电器5
  292. EE_ACDC_State_ReadRegTrue[4].ACDC_Cha_On_Off_State = true;
  293. }
  294. else
  295. {
  296. RELAY_5_OFF; //关继电器5
  297. EE_ACDC_State_ReadRegTrue[4].ACDC_Cha_On_Off_State = false;
  298. }
  299. }
  300. }
  301. /*********************************************************************************************************
  302. * 函数名称:Relay6State
  303. * 函数功能:Relay6State模块,控制继电器和更新通道状态
  304. * 输入参数:void
  305. * 输出参数:void
  306. * 返 回 值:void
  307. * 创建日期:2021年07月01日
  308. * 注 意:
  309. *********************************************************************************************************/
  310. void Relay6State(void)
  311. {
  312. if(RelaySlaveChaNum>=6)
  313. {
  314. if(EE_ACDC_State_ReadReg[5].ACDC_Cha_On_Off_State==true)
  315. {
  316. RELAY_6_ON; //开继电器6
  317. EE_ACDC_State_ReadRegTrue[5].ACDC_Cha_On_Off_State = true;
  318. }
  319. else
  320. {
  321. RELAY_6_OFF; //关继电器6
  322. EE_ACDC_State_ReadRegTrue[5].ACDC_Cha_On_Off_State = false;
  323. }
  324. }
  325. }
  326. /*********************************************************************************************************
  327. * 函数名称:Relay7State
  328. * 函数功能:Relay7State模块,控制继电器和更新通道状态
  329. * 输入参数:void
  330. * 输出参数:void
  331. * 返 回 值:void
  332. * 创建日期:2021年07月01日
  333. * 注 意:
  334. *********************************************************************************************************/
  335. void Relay7State(void)
  336. {
  337. if(RelaySlaveChaNum>=7)
  338. {
  339. if(EE_ACDC_State_ReadReg[6].ACDC_Cha_On_Off_State==true)
  340. {
  341. RELAY_7_ON; //开继电器7
  342. EE_ACDC_State_ReadRegTrue[6].ACDC_Cha_On_Off_State = true;
  343. }
  344. else
  345. {
  346. RELAY_7_OFF; //关继电器7
  347. EE_ACDC_State_ReadRegTrue[6].ACDC_Cha_On_Off_State = false;
  348. }
  349. }
  350. }
  351. /*********************************************************************************************************
  352. * 函数名称:Relay8State
  353. * 函数功能:Relay8State模块,控制继电器和更新通道状态
  354. * 输入参数:void
  355. * 输出参数:void
  356. * 返 回 值:void
  357. * 创建日期:2021年07月01日
  358. * 注 意:
  359. *********************************************************************************************************/
  360. void Relay8State(void)
  361. {
  362. if(RelaySlaveChaNum>=8)
  363. {
  364. if(EE_ACDC_State_ReadReg[7].ACDC_Cha_On_Off_State==true)
  365. {
  366. RELAY_8_ON; //开继电器8
  367. EE_ACDC_State_ReadRegTrue[7].ACDC_Cha_On_Off_State = true;
  368. }
  369. else
  370. {
  371. RELAY_8_OFF; //关继电器8
  372. EE_ACDC_State_ReadRegTrue[7].ACDC_Cha_On_Off_State = false;
  373. }
  374. }
  375. }
  376. /*********************************************************************************************************
  377. * 函数名称:RelayState
  378. * 函数功能:RelayState模块,控制继电器和更新通道状态
  379. * 输入参数:void
  380. * 输出参数:void
  381. * 返 回 值:void
  382. * 创建日期:2021年07月01日
  383. * 注 意:
  384. *********************************************************************************************************/
  385. void RelayState(void)
  386. {
  387. BUFF;
  388. Relay1State();
  389. Relay2State();
  390. Relay3State();
  391. Relay4State();
  392. Relay5State();
  393. Relay6State();
  394. Relay7State();
  395. Relay8State();
  396. LOCK;
  397. }
  398. #endif
  399. #if ACSingPhHigCurr
  400. /*********************************************************************************************************
  401. * API函数实现
  402. *********************************************************************************************************/
  403. /*********************************************************************************************************
  404. * 函数名称:Relay1State
  405. * 函数功能:Relay1State模块,控制继电器和更新通道状态
  406. * 输入参数:void
  407. * 输出参数:void
  408. * 返 回 值:void
  409. * 创建日期:2021年07月01日
  410. * 注 意:
  411. *********************************************************************************************************/
  412. void Relay1State(void)
  413. {
  414. if(RelaySlaveChaNum>=1)
  415. {
  416. if(EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State==true)
  417. {
  418. RELAY_1_ON; //开继电器1
  419. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = true;
  420. }
  421. else
  422. {
  423. RELAY_1_OFF; //关继电器1
  424. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = false;
  425. }
  426. }
  427. }
  428. /*********************************************************************************************************
  429. * 函数名称:Relay2State
  430. * 函数功能:Relay2State模块,控制继电器和更新通道状态
  431. * 输入参数:void
  432. * 输出参数:void
  433. * 返 回 值:void
  434. * 创建日期:2021年07月01日
  435. * 注 意:
  436. *********************************************************************************************************/
  437. void Relay2State(void)
  438. {
  439. if(RelaySlaveChaNum>=2)
  440. {
  441. if(EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State==true)
  442. {
  443. RELAY_2_ON; //开继电器2
  444. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = true;
  445. }
  446. else
  447. {
  448. RELAY_2_OFF; //关继电器2
  449. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = false;
  450. }
  451. }
  452. }
  453. /*********************************************************************************************************
  454. * 函数名称:Relay3State
  455. * 函数功能:Relay3State模块,控制继电器和更新通道状态
  456. * 输入参数:void
  457. * 输出参数:void
  458. * 返 回 值:void
  459. * 创建日期:2021年07月01日
  460. * 注 意:
  461. *********************************************************************************************************/
  462. void Relay3State(void)
  463. {
  464. if(RelaySlaveChaNum>=3)
  465. {
  466. if(EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State==true)
  467. {
  468. RELAY_3_ON; //开继电器3
  469. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = true;
  470. }
  471. else
  472. {
  473. RELAY_3_OFF; //关继电器3
  474. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = false;
  475. }
  476. }
  477. }
  478. /*********************************************************************************************************
  479. * 函数名称:Relay4State
  480. * 函数功能:Relay4State模块,控制继电器和更新通道状态
  481. * 输入参数:void
  482. * 输出参数:void
  483. * 返 回 值:void
  484. * 创建日期:2021年07月01日
  485. * 注 意:
  486. *********************************************************************************************************/
  487. void Relay4State(void)
  488. {
  489. if(RelaySlaveChaNum>=4)
  490. {
  491. if(EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State==true)
  492. {
  493. RELAY_4_ON; //开继电器4
  494. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = true;
  495. }
  496. else
  497. {
  498. RELAY_4_OFF; //关继电器4
  499. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = false;
  500. }
  501. }
  502. }
  503. /*********************************************************************************************************
  504. * 函数名称:RelayState
  505. * 函数功能:RelayState模块,控制继电器和更新通道状态
  506. * 输入参数:void
  507. * 输出参数:void
  508. * 返 回 值:void
  509. * 创建日期:2021年07月01日
  510. * 注 意:
  511. *********************************************************************************************************/
  512. void RelayState(void)
  513. {
  514. BUFF;
  515. Relay1State();
  516. Relay2State();
  517. Relay3State();
  518. Relay4State();
  519. LOCK;
  520. }
  521. #endif
  522. /*********************************************************************************************************
  523. * 函数名称:WarnVolUpthrState
  524. * 函数功能:根据读取的数据判断是否触发阈值
  525. * 输入参数:void
  526. * 输出参数:void
  527. * 返 回 值:void
  528. * 创建日期:2021年07月01日
  529. * 注 意:
  530. *
  531. *********************************************************************************************************/
  532. void WarnVolUpthrState(void)
  533. {
  534. uint32_t chn_num = 0;
  535. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  536. {
  537. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_En)
  538. {
  539. if(AC_Ele_ReadReg[chn_num].AC_V>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_TopThres)
  540. {
  541. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = true;
  542. if(ACDC_Over_WriteReg[chn_num].openration & Voltage_Max_Func)
  543. {
  544. over_Func_flag[chn_num] = 1;
  545. }
  546. }
  547. else
  548. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
  549. }
  550. else
  551. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
  552. }
  553. }
  554. /*********************************************************************************************************
  555. * 函数名称:WarnVolDownthrState
  556. * 函数功能:根据读取的数据判断是否触发阈值
  557. * 输入参数:void
  558. * 输出参数:void
  559. * 返 回 值:void
  560. * 创建日期:2021年07月01日
  561. * 注 意:
  562. *
  563. *********************************************************************************************************/
  564. void WarnVolDownthrState(void)
  565. {
  566. uint32_t chn_num = 0;
  567. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  568. {
  569. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_En)
  570. {
  571. if(AC_Ele_ReadReg[chn_num].AC_V < EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_DownThres)
  572. {
  573. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = true;
  574. if(ACDC_Over_WriteReg[chn_num].openration & Voltage_Min_Func)
  575. {
  576. over_Func_flag[chn_num] = 1;
  577. }
  578. }
  579. else
  580. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
  581. }
  582. else
  583. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
  584. }
  585. }
  586. /*********************************************************************************************************
  587. * 函数名称:WarnCurUpthrState
  588. * 函数功能:根据读取的数据判断是否触发阈值
  589. * 输入参数:void
  590. * 输出参数:void
  591. * 返 回 值:void
  592. * 创建日期:2021年07月01日
  593. * 注 意:
  594. *
  595. *********************************************************************************************************/
  596. void WarnCurUpthrState(void)
  597. {
  598. uint32_t chn_num = 0;
  599. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  600. {
  601. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_En)
  602. {
  603. if(AC_Ele_ReadReg[chn_num].AC_I>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_I_TopThres)
  604. {
  605. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = true;
  606. if(ACDC_Over_WriteReg[chn_num].openration & Current_Max_Func)
  607. {
  608. over_Func_flag[chn_num] = 1;
  609. }
  610. }
  611. else
  612. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
  613. }
  614. else
  615. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
  616. }
  617. }
  618. /*********************************************************************************************************
  619. * 函数名称:WarnPowUpthrState
  620. * 函数功能:根据读取的数据判断是否触发阈值
  621. * 输入参数:void
  622. * 输出参数:void
  623. * 返 回 值:void
  624. * 创建日期:2021年07月01日
  625. * 注 意:
  626. *
  627. *********************************************************************************************************/
  628. void WarnPowUpthrState(void)
  629. {
  630. uint32_t chn_num = 0;
  631. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  632. {
  633. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_En)
  634. {
  635. if(AC_Ele_ReadReg[chn_num].AC_P>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_P_TopThres){
  636. EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = true;
  637. if(ACDC_Over_WriteReg[chn_num].openration & Power_Max_Func)
  638. {
  639. over_Func_flag[chn_num] = 1;
  640. }
  641. }
  642. else
  643. EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = false;
  644. }
  645. else
  646. EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = false;
  647. }
  648. }
  649. /*********************************************************************************************************
  650. * 函数名称:WarnEleUpthrState
  651. * 函数功能:根据读取的数据判断是否触发阈值
  652. * 输入参数:void
  653. * 输出参数:void
  654. * 返 回 值:void
  655. * 创建日期:2021年07月01日
  656. * 注 意:
  657. *
  658. *********************************************************************************************************/
  659. void WarnEleUpthrState(void)
  660. {
  661. uint32_t chn_num = 0;
  662. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  663. {
  664. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_En)
  665. {
  666. if(AC_Ele_ReadReg[chn_num].AC_E>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_E_TopThres)
  667. {
  668. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = true;
  669. if(ACDC_Over_WriteReg[chn_num].openration & Consumer_Max_Func)
  670. {
  671. over_Func_flag[chn_num] = 1;
  672. }
  673. }
  674. else
  675. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
  676. }
  677. else
  678. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
  679. }
  680. }
  681. /*********************************************************************************************************
  682. * 函数名称:WarnState
  683. * 函数功能:根据读取的数据判断是否触发阈值
  684. * 输入参数:void
  685. * 输出参数:void
  686. * 返 回 值:void
  687. * 创建日期:2021年07月01日
  688. * 注 意:
  689. *
  690. *********************************************************************************************************/
  691. void WarnState(void)
  692. {
  693. WarnVolUpthrState();
  694. WarnVolDownthrState();
  695. WarnCurUpthrState();
  696. WarnPowUpthrState();
  697. WarnEleUpthrState();
  698. }
  699. /*********************************************************************************************************
  700. * 函数名称:Bubble_Sort
  701. * 函数功能:根据读取的数据判断是否触发阈值
  702. * 输入参数:排序数组
  703. * 输出参数:排序数组的长度
  704. * 返 回 值:void
  705. * 创建日期:2021年07月01日
  706. * 注 意:
  707. *
  708. *********************************************************************************************************/
  709. void Bubble_Sort(unsigned short int arr[], unsigned short int len)
  710. {
  711. unsigned short int i, j, temp;
  712. for (i = 0; i < len - 1; i++)
  713. for (j = 0; j < len - 1 - i; j++)
  714. if (arr[j] > arr[j + 1])
  715. {
  716. temp = arr[j];
  717. arr[j] = arr[j + 1];
  718. arr[j + 1] = temp;
  719. }
  720. }