ReadEeprom.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926
  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. #include "board_cfg.h"
  27. /*********************************************************************************************************
  28. * 宏定义
  29. *********************************************************************************************************/
  30. /*********************************************************************************************************
  31. * 枚举结构体
  32. *********************************************************************************************************/
  33. /*********************************************************************************************************
  34. * 内部变量定义
  35. *********************************************************************************************************/
  36. unsigned char Eeprom_Rbuf[200]={0};
  37. unsigned char Chal_Num;
  38. extern EE_ACDC_Total_Consumption EE_ACDC_Total_Consum_Read_Reg[RelaySlaveChaNum];
  39. extern uint32_t read_Total_Consumer[RelaySlaveChaNum];
  40. extern uint8_t over_Func_flag[RelaySlaveChaNum];
  41. extern EE_ACDC_ThresVal_struct_ReadReg EE_ACDC_All_ThrVal;
  42. extern EE_ACDC_State_All_Reg_En_t EE_ACDC_State_All_en;
  43. extern ACDC_Over_Func_WriteReg ACDC_Over_AllWriteReg;
  44. extern AC_Ele_struct_ReadReg AC_Ele_ReadReg_All;
  45. extern ACDC_Wann_Read_Reg_t ACDC_Wann_All ;
  46. extern uint8_t over_func_all_flag;
  47. /*********************************************************************************************************
  48. * 内部函数声明
  49. *********************************************************************************************************/
  50. /*********************************************************************************************************
  51. * 内部函数实现
  52. *********************************************************************************************************/
  53. /*********************************************************************************************************
  54. * 函数名称:ReadEeprom
  55. * 函数功能:读出Eeprom的数据
  56. * 输入参数:void
  57. * 输出参数:void
  58. * 返 回 值:void
  59. * 创建日期:2021年07月01日
  60. * 注 意:
  61. *********************************************************************************************************/
  62. void ReadEeprom(void)
  63. {
  64. AT24CxxRead(Eepr_AC_Sing_Dela_OnSmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Dela_OnSmaQua); //从eeprom中读出通道开启延时数据
  65. memcpy(&EE_ACDC_Delay_ReadReg_On,&Eeprom_Rbuf,Eepr_AC_Sing_Dela_OnSmaQua); //将数据拷贝到指定的结构体,可能需要注意大小端问题
  66. memcpy(&Sort_Onbuf,&EE_ACDC_Delay_ReadReg_On,Eepr_AC_Sing_Dela_OnSmaQua); //将数据进行排序,然后存入数组中
  67. Bubble_Sort(Sort_Onbuf,RelaySlaveChaNum);
  68. AT24CxxRead(Eepr_AC_Sing_Dela_OffSmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Dela_OffSmaQua); //从eeprom中读出通道关闭延时数据
  69. memcpy(&EE_ACDC_Delay_ReadReg_Off,&Eeprom_Rbuf,Eepr_AC_Sing_Dela_OffSmaQua); //将数据拷贝到指定的结构体,可能需要注意大小端问题
  70. memcpy(&Sort_Offbuf,&EE_ACDC_Delay_ReadReg_Off,Eepr_AC_Sing_Dela_OffSmaQua); //将数据进行排序,然后存入数组中
  71. Bubble_Sort(Sort_Offbuf,RelaySlaveChaNum);
  72. AT24CxxRead(Eepr_AC_Sing_State_SmaWAddr, Eeprom_Rbuf, Eepr_AC_Sing_State_SmaWQua);//从eeprom中读出通道状态数据
  73. memcpy(&EE_ACDC_State_ReadReg,&Eeprom_Rbuf,Eepr_AC_Sing_State_SmaWQua); //将数据拷贝到指定的结构体,可能需要注意大小端问题
  74. AT24CxxRead(Eepr_AC_Sing_Thr_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Thr_SmaQua); //从eeprom中读出通道阈值数据
  75. memcpy(&EE_ACDC_ThresVal_ReadReg,&Eeprom_Rbuf,Eepr_AC_Sing_Thr_SmaQua); //将数据拷贝到指定的结构体,可能需要注意大小端问题
  76. AT24CxxRead(Eepr_AC_Sing_All_Thr_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_All_Thr_SmaQua); //read thr of all
  77. memcpy(&EE_ACDC_All_ThrVal,&Eeprom_Rbuf,Eepr_AC_Sing_All_Thr_SmaQua);
  78. // add by liyi
  79. if(EE_ACDC_All_ThrVal.ACDC_V_TopThres > Default_Voltage_Max)
  80. {
  81. EE_ACDC_All_ThrVal.ACDC_V_TopThres = 0;
  82. }
  83. if(EE_ACDC_All_ThrVal.ACDC_V_DownThres > Default_Voltage_Max)
  84. {
  85. EE_ACDC_All_ThrVal.ACDC_V_DownThres = 0;
  86. }
  87. if(EE_ACDC_All_ThrVal.ACDC_P_TopThres > Default_Power_Max)
  88. {
  89. EE_ACDC_All_ThrVal.ACDC_P_TopThres = 0;
  90. }
  91. if(EE_ACDC_All_ThrVal.ACDC_I_TopThres > Default_Current_Max)
  92. {
  93. EE_ACDC_All_ThrVal.ACDC_I_TopThres = 0;
  94. }
  95. //check is
  96. for(Chal_Num=0;Chal_Num<RelaySlaveChaNum;Chal_Num++)
  97. {
  98. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_TopThres > Default_Voltage_Max)
  99. {
  100. EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_TopThres = 0;
  101. }
  102. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_DownThres > Default_Voltage_Max)
  103. {
  104. EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_DownThres = 0;
  105. }
  106. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_P_TopThres > Default_Power_Max)
  107. {
  108. EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_P_TopThres = 0;
  109. }
  110. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_I_TopThres > Default_Current_Max)
  111. {
  112. EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_I_TopThres = 0;
  113. }
  114. }
  115. if(EE_ACDC_All_ThrVal.ACDC_V_TopThres <= THRESHOULD_JUDGMENT)
  116. {
  117. EE_ACDC_State_All_en.ACDC_Vol_Upper_En = false;
  118. }else
  119. {
  120. EE_ACDC_State_All_en.ACDC_Vol_Upper_En = true;
  121. }
  122. if(EE_ACDC_All_ThrVal.ACDC_V_DownThres <= THRESHOULD_JUDGMENT)
  123. {
  124. EE_ACDC_State_All_en.ACDC_Vol_Lower_En= false;
  125. }else
  126. {
  127. EE_ACDC_State_All_en.ACDC_Vol_Lower_En= true;
  128. }
  129. if(EE_ACDC_All_ThrVal.ACDC_I_TopThres <= THRESHOULD_JUDGMENT)
  130. {
  131. EE_ACDC_State_All_en.ACDC_Current_Upper_En = false;
  132. }else
  133. {
  134. EE_ACDC_State_All_en.ACDC_Current_Upper_En= true;
  135. }
  136. if(EE_ACDC_All_ThrVal.ACDC_P_TopThres <= THRESHOULD_JUDGMENT)
  137. {
  138. EE_ACDC_State_All_en.ACDC_Power_Upper_En = false;
  139. }else
  140. {
  141. EE_ACDC_State_All_en.ACDC_Power_Upper_En = true;
  142. }
  143. if(EE_ACDC_All_ThrVal.ACDC_E_TopThres <= THRESHOULD_JUDGMENT)
  144. {
  145. EE_ACDC_State_All_en.ACDC_Consumer_Upper_En = false;
  146. }else
  147. {
  148. EE_ACDC_State_All_en.ACDC_Consumer_Upper_En= true;
  149. }
  150. for(Chal_Num=0;Chal_Num<RelaySlaveChaNum;Chal_Num++)
  151. {
  152. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_TopThres <= THRESHOULD_JUDGMENT)
  153. {
  154. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Vol_Upthr_En = false;
  155. }else
  156. {
  157. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Vol_Upthr_En = true;
  158. }
  159. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_V_DownThres <= THRESHOULD_JUDGMENT)
  160. {
  161. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Vol_Downthr_En = false;
  162. }else
  163. {
  164. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Vol_Downthr_En = true;
  165. }
  166. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_I_TopThres <= THRESHOULD_JUDGMENT)
  167. {
  168. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Cur_Upthr_En = false;
  169. }else
  170. {
  171. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Cur_Upthr_En = true;
  172. }
  173. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_P_TopThres <= THRESHOULD_JUDGMENT)
  174. {
  175. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Pow_Upthr_En = false;
  176. }else
  177. {
  178. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Pow_Upthr_En = true;
  179. }
  180. if(EE_ACDC_ThresVal_ReadReg[Chal_Num].ACDC_E_TopThres <= THRESHOULD_JUDGMENT)
  181. {
  182. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Ele_Upthr_En = false;
  183. }else
  184. {
  185. EE_ACDC_State_ReadReg[Chal_Num].ACDC_Ele_Upthr_En = true;
  186. }
  187. }
  188. AT24CxxRead(Eepr_AC_Sing_Coef_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Coef_SmaQua); //从eeprom中读出通道的系数
  189. memcpy(&EE_ACDC_Coef_ReadReg,&Eeprom_Rbuf,Eepr_AC_Sing_Coef_SmaQua); //将数据拷贝到指定的结构体,可能需要注意大小端问题
  190. for(Chal_Num=0;Chal_Num<RelaySlaveChaNum;Chal_Num++) //如果eeprom中没有存入数据设置默认值
  191. {
  192. if((EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_V_k)==0xffffffff) //没有写入电压系数则默认K为1000,B为0;放大1000倍存入的
  193. {
  194. EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_V_k = 1000;
  195. }
  196. if((EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_V_b)==0xffffffff)
  197. {
  198. (EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_V_b) = 0;
  199. }
  200. if((EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_I_k)==0xffffffff) //没有写入电流系数则默认K为1000,B为0;放大1000倍存入的
  201. {
  202. EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_I_k = 1000;
  203. }
  204. if((EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_I_b)==0xffffffff)
  205. {
  206. EE_ACDC_Coef_ReadReg[Chal_Num].ACDC_I_b = 0;
  207. }
  208. }
  209. //read total consumer
  210. AT24CxxRead(Eepr_AC_Sing_Total_Consumer_addr, Eeprom_Rbuf, Eepr_AC_Sing_Total_Consumer_SmaQua);
  211. for(int i = 0; i < RelaySlaveChaNum;i++){
  212. int temp = i << 2;
  213. read_Total_Consumer[i] += Eeprom_Rbuf[temp + 0] << 24;
  214. read_Total_Consumer[i] += Eeprom_Rbuf[temp + 1] << 16;
  215. read_Total_Consumer[i] += Eeprom_Rbuf[temp + 2] << 8;
  216. read_Total_Consumer[i] += Eeprom_Rbuf[temp + 3] << 0;
  217. if(read_Total_Consumer[i] > Default_Consum_Max)
  218. {
  219. read_Total_Consumer[i] = 0;
  220. }
  221. }
  222. //read wanning func
  223. AT24CxxRead(Eepr_AC_Sing_Channel_Func_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_Channel_Func_SmaQua);
  224. memcpy(ACDC_Over_WriteReg,Eeprom_Rbuf,Eepr_AC_Sing_Channel_Func_SmaQua);
  225. for(int i=0; i < RelaySlaveChaNum;i++)
  226. {
  227. if(ACDC_Over_WriteReg[i].openration > 0x003f)
  228. {
  229. ACDC_Over_WriteReg[i].openration = 0;
  230. }
  231. }
  232. AT24CxxRead(Eepr_AC_Sing_All_Over_SmaAddr, Eeprom_Rbuf, Eepr_AC_Sing_All_Over_SmaQua);
  233. memcpy(&ACDC_Over_AllWriteReg,Eeprom_Rbuf,Eepr_AC_Sing_All_Over_SmaQua);
  234. if(ACDC_Over_AllWriteReg.openration > 0x003f)
  235. {
  236. ACDC_Over_AllWriteReg.openration = 0;
  237. }
  238. }
  239. #if (RelaySlaveChaNum >= 1)
  240. void Relay1State(void)
  241. {
  242. if(EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State==true)
  243. {
  244. RELAY_1_ON; //开继电器1
  245. #if SUPPORT_TWIN_FIRE
  246. RELAY_5_ON;
  247. #endif
  248. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = true;
  249. }
  250. else
  251. {
  252. RELAY_1_OFF; //关继电器1
  253. #if SUPPORT_TWIN_FIRE
  254. RELAY_5_OFF;
  255. #endif
  256. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = false;
  257. }
  258. }
  259. #endif
  260. #if (RelaySlaveChaNum >= 2)
  261. void Relay2State(void)
  262. {
  263. if(EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State==true)
  264. {
  265. RELAY_2_ON; //开继电器2
  266. #if SUPPORT_TWIN_FIRE
  267. RELAY_6_ON;
  268. #endif
  269. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = true;
  270. }
  271. else
  272. {
  273. RELAY_2_OFF; //关继电器2
  274. #if SUPPORT_TWIN_FIRE
  275. RELAY_6_OFF;
  276. #endif
  277. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = false;
  278. }
  279. }
  280. #endif
  281. #if (RelaySlaveChaNum >= 3)
  282. void Relay3State(void)
  283. {
  284. if(EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State==true)
  285. {
  286. RELAY_3_ON; //开继电器3
  287. #if SUPPORT_TWIN_FIRE
  288. RELAY_7_ON;
  289. #endif
  290. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = true;
  291. }
  292. else
  293. {
  294. RELAY_3_OFF; //关继电器3
  295. #if SUPPORT_TWIN_FIRE
  296. RELAY_7_OFF;
  297. #endif
  298. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = false;
  299. }
  300. }
  301. #endif
  302. #if (RelaySlaveChaNum >= 4)
  303. void Relay4State(void)
  304. {
  305. if(EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State==true)
  306. {
  307. RELAY_4_ON; //开继电器4
  308. #if SUPPORT_TWIN_FIRE
  309. RELAY_8_ON;
  310. #endif
  311. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = true;
  312. }
  313. else
  314. {
  315. RELAY_4_OFF; //关继电器4
  316. #if SUPPORT_TWIN_FIRE
  317. RELAY_8_OFF;
  318. #endif
  319. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = false;
  320. }
  321. }
  322. #endif
  323. #if (RelaySlaveChaNum >= 5)
  324. void Relay5State(void)
  325. {
  326. if(EE_ACDC_State_ReadReg[4].ACDC_Cha_On_Off_State==true)
  327. {
  328. RELAY_5_ON; //开继电器5
  329. EE_ACDC_State_ReadRegTrue[4].ACDC_Cha_On_Off_State = true;
  330. }
  331. else
  332. {
  333. RELAY_5_OFF; //关继电器5
  334. EE_ACDC_State_ReadRegTrue[4].ACDC_Cha_On_Off_State = false;
  335. }
  336. }
  337. #endif
  338. #if (RelaySlaveChaNum >= 6)
  339. void Relay6State(void)
  340. {
  341. if(EE_ACDC_State_ReadReg[5].ACDC_Cha_On_Off_State==true)
  342. {
  343. RELAY_6_ON; //开继电器6
  344. EE_ACDC_State_ReadRegTrue[5].ACDC_Cha_On_Off_State = true;
  345. }
  346. else
  347. {
  348. RELAY_6_OFF; //关继电器6
  349. EE_ACDC_State_ReadRegTrue[5].ACDC_Cha_On_Off_State = false;
  350. }
  351. }
  352. #endif
  353. #if (RelaySlaveChaNum >= 7)
  354. void Relay7State(void)
  355. {
  356. if(RelaySlaveChaNum>=7)
  357. {
  358. if(EE_ACDC_State_ReadReg[6].ACDC_Cha_On_Off_State==true)
  359. {
  360. RELAY_7_ON; //开继电器7
  361. EE_ACDC_State_ReadRegTrue[6].ACDC_Cha_On_Off_State = true;
  362. }
  363. else
  364. {
  365. RELAY_7_OFF; //关继电器7
  366. EE_ACDC_State_ReadRegTrue[6].ACDC_Cha_On_Off_State = false;
  367. }
  368. }
  369. }
  370. #endif
  371. #if (RelaySlaveChaNum >= 8)
  372. void Relay8State(void)
  373. {
  374. if(RelaySlaveChaNum>=8)
  375. {
  376. if(EE_ACDC_State_ReadReg[7].ACDC_Cha_On_Off_State==true)
  377. {
  378. RELAY_8_ON; //开继电器8
  379. EE_ACDC_State_ReadRegTrue[7].ACDC_Cha_On_Off_State = true;
  380. }
  381. else
  382. {
  383. RELAY_8_OFF; //关继电器8
  384. EE_ACDC_State_ReadRegTrue[7].ACDC_Cha_On_Off_State = false;
  385. }
  386. }
  387. }
  388. #endif
  389. void RelayState(void)
  390. {
  391. BUFF;
  392. #if (RelaySlaveChaNum >= 1)
  393. Relay1State();
  394. #endif
  395. #if (RelaySlaveChaNum >= 2)
  396. Relay2State();
  397. #endif
  398. #if (RelaySlaveChaNum >= 3)
  399. Relay3State();
  400. #endif
  401. #if (RelaySlaveChaNum >= 4)
  402. Relay4State();
  403. #endif
  404. #if (RelaySlaveChaNum >= 5)
  405. Relay5State();
  406. #endif
  407. #if (RelaySlaveChaNum >= 6)
  408. Relay6State();
  409. #endif
  410. #if (RelaySlaveChaNum >= 7)
  411. Relay7State();
  412. #endif
  413. #if (RelaySlaveChaNum >= 8)
  414. Relay8State();
  415. #endif
  416. LOCK;
  417. }
  418. void RelayState_ch(uint8_t chx)
  419. {
  420. switch(chx)
  421. {
  422. #if (RelaySlaveChaNum >= 1)
  423. case 0:
  424. Relay1State();
  425. break;
  426. #endif
  427. #if (RelaySlaveChaNum >= 2)
  428. case 1:
  429. Relay2State();
  430. break;
  431. #endif
  432. #if (RelaySlaveChaNum >= 3)
  433. case 2:
  434. Relay3State();
  435. break;
  436. #endif
  437. #if (RelaySlaveChaNum >= 4)
  438. case 3:
  439. Relay4State();
  440. break;
  441. #endif
  442. #if (RelaySlaveChaNum >= 5)
  443. case 4:
  444. Relay5State();
  445. break;
  446. #endif
  447. #if (RelaySlaveChaNum >= 6)
  448. case 5:
  449. Relay6State();
  450. break;
  451. #endif
  452. #if (RelaySlaveChaNum >= 7)
  453. case 6:
  454. Relay7State();
  455. break;
  456. #endif
  457. #if (RelaySlaveChaNum >= 8)
  458. case 7:
  459. Relay8State();
  460. break;
  461. #endif
  462. default:
  463. return;
  464. }
  465. BUFF;
  466. LOCK;
  467. }
  468. /*********************************************************************************************************
  469. * 函数名称:WarnVolUpthrState
  470. * 函数功能:根据读取的数据判断是否触发阈值
  471. * 输入参数:void
  472. * 输出参数:void
  473. * 返 回 值:void
  474. * 创建日期:2021年07月01日
  475. * 注 意:
  476. *
  477. *********************************************************************************************************/
  478. void WarnVolUpthrState(void)
  479. {
  480. uint32_t chn_num = 0;
  481. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  482. {
  483. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_En)
  484. {
  485. if(AC_Ele_ReadReg[chn_num].AC_V>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_TopThres)
  486. {
  487. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = true;
  488. if(ACDC_Over_WriteReg[chn_num].openration & Voltage_Max_Func)
  489. {
  490. over_Func_flag[chn_num] = 1;
  491. }
  492. }
  493. else
  494. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
  495. }
  496. else
  497. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
  498. }
  499. }
  500. void WarnVolUpthrState_ch(uint8_t channel)
  501. {
  502. if(EE_ACDC_State_ReadReg[channel].ACDC_Vol_Upthr_En)
  503. {
  504. if(AC_Ele_ReadReg[channel].AC_V>EE_ACDC_ThresVal_ReadReg[channel].ACDC_V_TopThres)
  505. {
  506. EE_ACDC_State_ReadReg[channel].ACDC_Vol_Upthr_Warn = true;
  507. if(ACDC_Over_WriteReg[channel].openration & Voltage_Max_Func)
  508. {
  509. over_Func_flag[channel] = 1;
  510. }
  511. }
  512. else
  513. EE_ACDC_State_ReadReg[channel].ACDC_Vol_Upthr_Warn = false;
  514. }
  515. else
  516. EE_ACDC_State_ReadReg[channel].ACDC_Vol_Upthr_Warn = false;
  517. }
  518. /*********************************************************************************************************
  519. * 函数名称:WarnVolDownthrState
  520. * 函数功能:根据读取的数据判断是否触发阈值
  521. * 输入参数:void
  522. * 输出参数:void
  523. * 返 回 值:void
  524. * 创建日期:2021年07月01日
  525. * 注 意:
  526. *
  527. *********************************************************************************************************/
  528. void WarnVolDownthrState(void)
  529. {
  530. uint32_t chn_num = 0;
  531. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  532. {
  533. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_En)
  534. {
  535. if(AC_Ele_ReadReg[chn_num].AC_V < EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_DownThres)
  536. {
  537. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = true;
  538. if(ACDC_Over_WriteReg[chn_num].openration & Voltage_Min_Func)
  539. {
  540. over_Func_flag[chn_num] = 1;
  541. }
  542. }
  543. else
  544. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
  545. }
  546. else
  547. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
  548. }
  549. }
  550. void WarnVolDownthrState_ch(uint8_t channel)
  551. {
  552. if(EE_ACDC_State_ReadReg[channel].ACDC_Vol_Downthr_En)
  553. {
  554. if(AC_Ele_ReadReg[channel].AC_V < EE_ACDC_ThresVal_ReadReg[channel].ACDC_V_DownThres)
  555. {
  556. EE_ACDC_State_ReadReg[channel].ACDC_Vol_Downthr_Warn = true;
  557. if(ACDC_Over_WriteReg[channel].openration & Voltage_Min_Func)
  558. {
  559. over_Func_flag[channel] = 1;
  560. }
  561. }
  562. else
  563. EE_ACDC_State_ReadReg[channel].ACDC_Vol_Downthr_Warn = false;
  564. }
  565. else
  566. EE_ACDC_State_ReadReg[channel].ACDC_Vol_Downthr_Warn = false;
  567. }
  568. /*********************************************************************************************************
  569. * 函数名称:WarnCurUpthrState
  570. * 函数功能:根据读取的数据判断是否触发阈值
  571. * 输入参数:void
  572. * 输出参数:void
  573. * 返 回 值:void
  574. * 创建日期:2021年07月01日
  575. * 注 意:
  576. *
  577. *********************************************************************************************************/
  578. void WarnCurUpthrState(void)
  579. {
  580. uint32_t chn_num = 0;
  581. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  582. {
  583. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_En)
  584. {
  585. if(AC_Ele_ReadReg[chn_num].AC_I>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_I_TopThres)
  586. {
  587. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = true;
  588. if(ACDC_Over_WriteReg[chn_num].openration & Current_Max_Func)
  589. {
  590. over_Func_flag[chn_num] = 1;
  591. }
  592. }
  593. else
  594. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
  595. }
  596. else
  597. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
  598. }
  599. }
  600. void WarnCurUpthrState_ch(uint8_t channel)
  601. {
  602. if(EE_ACDC_State_ReadReg[channel].ACDC_Cur_Upthr_En)
  603. {
  604. if(AC_Ele_ReadReg[channel].AC_I>EE_ACDC_ThresVal_ReadReg[channel].ACDC_I_TopThres)
  605. {
  606. EE_ACDC_State_ReadReg[channel].ACDC_Cur_Upthr_Warn = true;
  607. if(ACDC_Over_WriteReg[channel].openration & Current_Max_Func)
  608. {
  609. over_Func_flag[channel] = 1;
  610. }
  611. }
  612. else
  613. EE_ACDC_State_ReadReg[channel].ACDC_Cur_Upthr_Warn = false;
  614. }
  615. else
  616. EE_ACDC_State_ReadReg[channel].ACDC_Cur_Upthr_Warn = false;
  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. void WarnPowUpthrState_ch(uint8_t channel)
  650. {
  651. if(EE_ACDC_State_ReadReg[channel].ACDC_Pow_Upthr_En)
  652. {
  653. if(AC_Ele_ReadReg[channel].AC_P>EE_ACDC_ThresVal_ReadReg[channel].ACDC_P_TopThres){
  654. EE_ACDC_State_ReadReg[channel].ACDC_Pow_Upthr_Warn = true;
  655. if(ACDC_Over_WriteReg[channel].openration & Power_Max_Func)
  656. {
  657. over_Func_flag[channel] = 1;
  658. }
  659. }
  660. else
  661. EE_ACDC_State_ReadReg[channel].ACDC_Pow_Upthr_Warn = false;
  662. }
  663. else
  664. EE_ACDC_State_ReadReg[channel].ACDC_Pow_Upthr_Warn = false;
  665. }
  666. /*********************************************************************************************************
  667. * 函数名称:WarnEleUpthrState
  668. * 函数功能:根据读取的数据判断是否触发阈值
  669. * 输入参数:void
  670. * 输出参数:void
  671. * 返 回 值:void
  672. * 创建日期:2021年07月01日
  673. * 注 意:
  674. *
  675. *********************************************************************************************************/
  676. void WarnEleUpthrState(void)
  677. {
  678. uint32_t chn_num = 0;
  679. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  680. {
  681. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_En)
  682. {
  683. if(AC_Ele_ReadReg[chn_num].AC_E>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_E_TopThres)
  684. {
  685. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = true;
  686. if(ACDC_Over_WriteReg[chn_num].openration & Consumer_Max_Func)
  687. {
  688. over_Func_flag[chn_num] = 1;
  689. }
  690. }
  691. else
  692. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
  693. }
  694. else
  695. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
  696. }
  697. }
  698. void WarnEleUpthrState_ch(uint8_t channel)
  699. {
  700. if(EE_ACDC_State_ReadReg[channel].ACDC_Ele_Upthr_En)
  701. {
  702. if(AC_Ele_ReadReg[channel].AC_E>EE_ACDC_ThresVal_ReadReg[channel].ACDC_E_TopThres)
  703. {
  704. EE_ACDC_State_ReadReg[channel].ACDC_Ele_Upthr_Warn = true;
  705. if(ACDC_Over_WriteReg[channel].openration & Consumer_Max_Func)
  706. {
  707. over_Func_flag[channel] = 1;
  708. }
  709. }
  710. else
  711. EE_ACDC_State_ReadReg[channel].ACDC_Ele_Upthr_Warn = false;
  712. }
  713. else
  714. EE_ACDC_State_ReadReg[channel].ACDC_Ele_Upthr_Warn = false;
  715. }
  716. /*********************************************************************************************************
  717. * 函数名称:WarnState
  718. * 函数功能:根据读取的数据判断是否触发阈值
  719. * 输入参数:void
  720. * 输出参数:void
  721. * 返 回 值:void
  722. * 创建日期:2021年07月01日
  723. * 注 意:
  724. *
  725. *********************************************************************************************************/
  726. void WarnState(void)
  727. {
  728. WarnVolUpthrState();
  729. WarnVolDownthrState();
  730. WarnCurUpthrState();
  731. WarnPowUpthrState();
  732. WarnEleUpthrState();
  733. }
  734. void WarnState_ch(uint8_t channel)
  735. {
  736. WarnVolUpthrState_ch(channel);
  737. WarnVolDownthrState_ch(channel);
  738. WarnCurUpthrState_ch(channel);
  739. WarnPowUpthrState_ch(channel);
  740. WarnEleUpthrState_ch(channel);
  741. }
  742. void All_Warn_State(void)
  743. {
  744. //voltage max
  745. if(EE_ACDC_State_All_en.ACDC_Vol_Upper_En)
  746. {
  747. if(AC_Ele_ReadReg_All.AC_V > EE_ACDC_All_ThrVal.ACDC_V_TopThres)
  748. {
  749. ACDC_Wann_All.wan.ACDC_V_Max = true;
  750. if(ACDC_Over_AllWriteReg.openration & Voltage_Max_Func)
  751. {
  752. over_func_all_flag = 1;
  753. //ACDC_Wann_All.over.ACDC_V_Max_O_Func = true;
  754. }
  755. }else
  756. {
  757. ACDC_Wann_All.wan.ACDC_V_Max = false;
  758. //ACDC_Wann_All.over.ACDC_V_Max_O_Func = false;
  759. }
  760. }else
  761. {
  762. ACDC_Wann_All.wan.ACDC_V_Max = false;
  763. }
  764. //voltage min
  765. if(EE_ACDC_State_All_en.ACDC_Vol_Lower_En)
  766. {
  767. if(AC_Ele_ReadReg_All.AC_V < EE_ACDC_All_ThrVal.ACDC_V_DownThres)
  768. {
  769. ACDC_Wann_All.wan.ACDC_V_Min = true;
  770. if(ACDC_Over_AllWriteReg.openration & Voltage_Min_Func)
  771. {
  772. over_func_all_flag = 1;
  773. }
  774. }else
  775. {
  776. ACDC_Wann_All.wan.ACDC_V_Min = false;
  777. }
  778. }else
  779. {
  780. ACDC_Wann_All.wan.ACDC_V_Min = false;
  781. }
  782. //power max
  783. if(EE_ACDC_State_All_en.ACDC_Power_Upper_En)
  784. {
  785. if(AC_Ele_ReadReg_All.AC_P > EE_ACDC_All_ThrVal.ACDC_P_TopThres)
  786. {
  787. ACDC_Wann_All.wan.ACDC_P_Max = true;
  788. if(ACDC_Over_AllWriteReg.openration & Power_Max_Func)
  789. {
  790. over_func_all_flag = 1;
  791. }
  792. }else
  793. {
  794. ACDC_Wann_All.wan.ACDC_P_Max = false;
  795. }
  796. }else
  797. {
  798. ACDC_Wann_All.wan.ACDC_P_Max = false;
  799. }
  800. //current max
  801. if(EE_ACDC_State_All_en.ACDC_Current_Upper_En)
  802. {
  803. if(AC_Ele_ReadReg_All.AC_I > EE_ACDC_All_ThrVal.ACDC_I_TopThres)
  804. {
  805. ACDC_Wann_All.wan.ACDC_I_Max = true;
  806. if(ACDC_Over_AllWriteReg.openration & Current_Max_Func)
  807. {
  808. over_func_all_flag = 1;
  809. }
  810. }else
  811. {
  812. ACDC_Wann_All.wan.ACDC_I_Max = false;
  813. }
  814. }else
  815. {
  816. ACDC_Wann_All.wan.ACDC_I_Max = false;
  817. }
  818. //consumer max
  819. if(EE_ACDC_State_All_en.ACDC_Consumer_Upper_En)
  820. {
  821. if(AC_Ele_ReadReg_All.AC_E > EE_ACDC_All_ThrVal.ACDC_E_TopThres)
  822. {
  823. ACDC_Wann_All.wan.ACDC_C_Max = true;
  824. if(ACDC_Over_AllWriteReg.openration & Consumer_Max_Func)
  825. {
  826. over_func_all_flag = 1;
  827. }
  828. }else
  829. {
  830. ACDC_Wann_All.wan.ACDC_C_Max = false;
  831. }
  832. }else
  833. {
  834. ACDC_Wann_All.wan.ACDC_C_Max = false;
  835. }
  836. }
  837. /*********************************************************************************************************
  838. * 函数名称:Bubble_Sort
  839. * 函数功能:根据读取的数据判断是否触发阈值
  840. * 输入参数:排序数组
  841. * 输出参数:排序数组的长度
  842. * 返 回 值:void
  843. * 创建日期:2021年07月01日
  844. * 注 意:
  845. *
  846. *********************************************************************************************************/
  847. void Bubble_Sort(unsigned short int arr[], unsigned short int len)
  848. {
  849. unsigned short int i, j, temp;
  850. for (i = 0; i < len - 1; i++)
  851. for (j = 0; j < len - 1 - i; j++)
  852. if (arr[j] > arr[j + 1])
  853. {
  854. temp = arr[j];
  855. arr[j] = arr[j + 1];
  856. arr[j + 1] = temp;
  857. }
  858. }