ReadEeprom.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  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. #ifndef ACSingPhSmaCurrNew
  327. /*********************************************************************************************************
  328. * 函数名称:Relay7State
  329. * 函数功能:Relay7State模块,控制继电器和更新通道状态
  330. * 输入参数:void
  331. * 输出参数:void
  332. * 返 回 值:void
  333. * 创建日期:2021年07月01日
  334. * 注 意:
  335. *********************************************************************************************************/
  336. void Relay7State(void)
  337. {
  338. if(RelaySlaveChaNum>=7)
  339. {
  340. if(EE_ACDC_State_ReadReg[6].ACDC_Cha_On_Off_State==true)
  341. {
  342. RELAY_7_ON; //开继电器7
  343. EE_ACDC_State_ReadRegTrue[6].ACDC_Cha_On_Off_State = true;
  344. }
  345. else
  346. {
  347. RELAY_7_OFF; //关继电器7
  348. EE_ACDC_State_ReadRegTrue[6].ACDC_Cha_On_Off_State = false;
  349. }
  350. }
  351. }
  352. /*********************************************************************************************************
  353. * 函数名称:Relay8State
  354. * 函数功能:Relay8State模块,控制继电器和更新通道状态
  355. * 输入参数:void
  356. * 输出参数:void
  357. * 返 回 值:void
  358. * 创建日期:2021年07月01日
  359. * 注 意:
  360. *********************************************************************************************************/
  361. void Relay8State(void)
  362. {
  363. if(RelaySlaveChaNum>=8)
  364. {
  365. if(EE_ACDC_State_ReadReg[7].ACDC_Cha_On_Off_State==true)
  366. {
  367. RELAY_8_ON; //开继电器8
  368. EE_ACDC_State_ReadRegTrue[7].ACDC_Cha_On_Off_State = true;
  369. }
  370. else
  371. {
  372. RELAY_8_OFF; //关继电器8
  373. EE_ACDC_State_ReadRegTrue[7].ACDC_Cha_On_Off_State = false;
  374. }
  375. }
  376. }
  377. #endif
  378. /*********************************************************************************************************
  379. * 函数名称:RelayState
  380. * 函数功能:RelayState模块,控制继电器和更新通道状态
  381. * 输入参数:void
  382. * 输出参数:void
  383. * 返 回 值:void
  384. * 创建日期:2021年07月01日
  385. * 注 意:
  386. *********************************************************************************************************/
  387. void RelayState(void)
  388. {
  389. BUFF;
  390. Relay1State();
  391. Relay2State();
  392. Relay3State();
  393. Relay4State();
  394. Relay5State();
  395. Relay6State();
  396. #ifndef ACSingPhSmaCurrNew
  397. Relay7State();
  398. Relay8State();
  399. #endif
  400. LOCK;
  401. }
  402. #endif
  403. #if ACSingPhHigCurr
  404. /*********************************************************************************************************
  405. * API函数实现
  406. *********************************************************************************************************/
  407. /*********************************************************************************************************
  408. * 函数名称:Relay1State
  409. * 函数功能:Relay1State模块,控制继电器和更新通道状态
  410. * 输入参数:void
  411. * 输出参数:void
  412. * 返 回 值:void
  413. * 创建日期:2021年07月01日
  414. * 注 意:
  415. *********************************************************************************************************/
  416. void Relay1State(void)
  417. {
  418. if(RelaySlaveChaNum>=1)
  419. {
  420. if(EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State==true)
  421. {
  422. RELAY_1_ON; //开继电器1
  423. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = true;
  424. }
  425. else
  426. {
  427. RELAY_1_OFF; //关继电器1
  428. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = false;
  429. }
  430. }
  431. }
  432. /*********************************************************************************************************
  433. * 函数名称:Relay2State
  434. * 函数功能:Relay2State模块,控制继电器和更新通道状态
  435. * 输入参数:void
  436. * 输出参数:void
  437. * 返 回 值:void
  438. * 创建日期:2021年07月01日
  439. * 注 意:
  440. *********************************************************************************************************/
  441. void Relay2State(void)
  442. {
  443. if(RelaySlaveChaNum>=2)
  444. {
  445. if(EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State==true)
  446. {
  447. RELAY_2_ON; //开继电器2
  448. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = true;
  449. }
  450. else
  451. {
  452. RELAY_2_OFF; //关继电器2
  453. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = false;
  454. }
  455. }
  456. }
  457. /*********************************************************************************************************
  458. * 函数名称:Relay3State
  459. * 函数功能:Relay3State模块,控制继电器和更新通道状态
  460. * 输入参数:void
  461. * 输出参数:void
  462. * 返 回 值:void
  463. * 创建日期:2021年07月01日
  464. * 注 意:
  465. *********************************************************************************************************/
  466. void Relay3State(void)
  467. {
  468. if(RelaySlaveChaNum>=3)
  469. {
  470. if(EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State==true)
  471. {
  472. RELAY_3_ON; //开继电器3
  473. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = true;
  474. }
  475. else
  476. {
  477. RELAY_3_OFF; //关继电器3
  478. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = false;
  479. }
  480. }
  481. }
  482. /*********************************************************************************************************
  483. * 函数名称:Relay4State
  484. * 函数功能:Relay4State模块,控制继电器和更新通道状态
  485. * 输入参数:void
  486. * 输出参数:void
  487. * 返 回 值:void
  488. * 创建日期:2021年07月01日
  489. * 注 意:
  490. *********************************************************************************************************/
  491. void Relay4State(void)
  492. {
  493. if(RelaySlaveChaNum>=4)
  494. {
  495. if(EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State==true)
  496. {
  497. RELAY_4_ON; //开继电器4
  498. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = true;
  499. }
  500. else
  501. {
  502. RELAY_4_OFF; //关继电器4
  503. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = false;
  504. }
  505. }
  506. }
  507. /*********************************************************************************************************
  508. * 函数名称:RelayState
  509. * 函数功能:RelayState模块,控制继电器和更新通道状态
  510. * 输入参数:void
  511. * 输出参数:void
  512. * 返 回 值:void
  513. * 创建日期:2021年07月01日
  514. * 注 意:
  515. *********************************************************************************************************/
  516. void RelayState(void)
  517. {
  518. BUFF;
  519. Relay1State();
  520. Relay2State();
  521. Relay3State();
  522. Relay4State();
  523. LOCK;
  524. }
  525. #endif
  526. /*********************************************************************************************************
  527. * 函数名称:WarnVolUpthrState
  528. * 函数功能:根据读取的数据判断是否触发阈值
  529. * 输入参数:void
  530. * 输出参数:void
  531. * 返 回 值:void
  532. * 创建日期:2021年07月01日
  533. * 注 意:
  534. *
  535. *********************************************************************************************************/
  536. void WarnVolUpthrState(void)
  537. {
  538. uint32_t chn_num = 0;
  539. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  540. {
  541. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_En)
  542. {
  543. if(AC_Ele_ReadReg[chn_num].AC_V>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_TopThres)
  544. {
  545. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = true;
  546. if(ACDC_Over_WriteReg[chn_num].openration & Voltage_Max_Func)
  547. {
  548. over_Func_flag[chn_num] = 1;
  549. }
  550. }
  551. else
  552. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
  553. }
  554. else
  555. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
  556. }
  557. }
  558. /*********************************************************************************************************
  559. * 函数名称:WarnVolDownthrState
  560. * 函数功能:根据读取的数据判断是否触发阈值
  561. * 输入参数:void
  562. * 输出参数:void
  563. * 返 回 值:void
  564. * 创建日期:2021年07月01日
  565. * 注 意:
  566. *
  567. *********************************************************************************************************/
  568. void WarnVolDownthrState(void)
  569. {
  570. uint32_t chn_num = 0;
  571. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  572. {
  573. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_En)
  574. {
  575. if(AC_Ele_ReadReg[chn_num].AC_V < EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_DownThres)
  576. {
  577. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = true;
  578. if(ACDC_Over_WriteReg[chn_num].openration & Voltage_Min_Func)
  579. {
  580. over_Func_flag[chn_num] = 1;
  581. }
  582. }
  583. else
  584. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
  585. }
  586. else
  587. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
  588. }
  589. }
  590. /*********************************************************************************************************
  591. * 函数名称:WarnCurUpthrState
  592. * 函数功能:根据读取的数据判断是否触发阈值
  593. * 输入参数:void
  594. * 输出参数:void
  595. * 返 回 值:void
  596. * 创建日期:2021年07月01日
  597. * 注 意:
  598. *
  599. *********************************************************************************************************/
  600. void WarnCurUpthrState(void)
  601. {
  602. uint32_t chn_num = 0;
  603. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  604. {
  605. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_En)
  606. {
  607. if(AC_Ele_ReadReg[chn_num].AC_I>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_I_TopThres)
  608. {
  609. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = true;
  610. if(ACDC_Over_WriteReg[chn_num].openration & Current_Max_Func)
  611. {
  612. over_Func_flag[chn_num] = 1;
  613. }
  614. }
  615. else
  616. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
  617. }
  618. else
  619. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
  620. }
  621. }
  622. /*********************************************************************************************************
  623. * 函数名称:WarnPowUpthrState
  624. * 函数功能:根据读取的数据判断是否触发阈值
  625. * 输入参数:void
  626. * 输出参数:void
  627. * 返 回 值:void
  628. * 创建日期:2021年07月01日
  629. * 注 意:
  630. *
  631. *********************************************************************************************************/
  632. void WarnPowUpthrState(void)
  633. {
  634. uint32_t chn_num = 0;
  635. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  636. {
  637. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_En)
  638. {
  639. if(AC_Ele_ReadReg[chn_num].AC_P>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_P_TopThres){
  640. EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = true;
  641. if(ACDC_Over_WriteReg[chn_num].openration & Power_Max_Func)
  642. {
  643. over_Func_flag[chn_num] = 1;
  644. }
  645. }
  646. else
  647. EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = false;
  648. }
  649. else
  650. EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = false;
  651. }
  652. }
  653. /*********************************************************************************************************
  654. * 函数名称:WarnEleUpthrState
  655. * 函数功能:根据读取的数据判断是否触发阈值
  656. * 输入参数:void
  657. * 输出参数:void
  658. * 返 回 值:void
  659. * 创建日期:2021年07月01日
  660. * 注 意:
  661. *
  662. *********************************************************************************************************/
  663. void WarnEleUpthrState(void)
  664. {
  665. uint32_t chn_num = 0;
  666. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  667. {
  668. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_En)
  669. {
  670. if(AC_Ele_ReadReg[chn_num].AC_E>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_E_TopThres)
  671. {
  672. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = true;
  673. if(ACDC_Over_WriteReg[chn_num].openration & Consumer_Max_Func)
  674. {
  675. over_Func_flag[chn_num] = 1;
  676. }
  677. }
  678. else
  679. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
  680. }
  681. else
  682. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
  683. }
  684. }
  685. /*********************************************************************************************************
  686. * 函数名称:WarnState
  687. * 函数功能:根据读取的数据判断是否触发阈值
  688. * 输入参数:void
  689. * 输出参数:void
  690. * 返 回 值:void
  691. * 创建日期:2021年07月01日
  692. * 注 意:
  693. *
  694. *********************************************************************************************************/
  695. void WarnState(void)
  696. {
  697. WarnVolUpthrState();
  698. WarnVolDownthrState();
  699. WarnCurUpthrState();
  700. WarnPowUpthrState();
  701. WarnEleUpthrState();
  702. }
  703. /*********************************************************************************************************
  704. * 函数名称:Bubble_Sort
  705. * 函数功能:根据读取的数据判断是否触发阈值
  706. * 输入参数:排序数组
  707. * 输出参数:排序数组的长度
  708. * 返 回 值:void
  709. * 创建日期:2021年07月01日
  710. * 注 意:
  711. *
  712. *********************************************************************************************************/
  713. void Bubble_Sort(unsigned short int arr[], unsigned short int len)
  714. {
  715. unsigned short int i, j, temp;
  716. for (i = 0; i < len - 1; i++)
  717. for (j = 0; j < len - 1 - i; j++)
  718. if (arr[j] > arr[j + 1])
  719. {
  720. temp = arr[j];
  721. arr[j] = arr[j + 1];
  722. arr[j + 1] = temp;
  723. }
  724. }