ReadEeprom.c 30 KB

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