ReadEeprom.c 27 KB

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