ReadEeprom.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927
  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. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = true;
  259. }
  260. else
  261. {
  262. RELAY_1_OFF; //关继电器1
  263. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = false;
  264. }
  265. }
  266. }
  267. /*********************************************************************************************************
  268. * 函数名称:Relay2State
  269. * 函数功能:Relay2State模块,控制继电器和更新通道状态
  270. * 输入参数:void
  271. * 输出参数:void
  272. * 返 回 值:void
  273. * 创建日期:2021年07月01日
  274. * 注 意:
  275. *********************************************************************************************************/
  276. void Relay2State(void)
  277. {
  278. if(RelaySlaveChaNum>=2)
  279. {
  280. if(EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State==true)
  281. {
  282. RELAY_2_ON; //开继电器2
  283. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = true;
  284. }
  285. else
  286. {
  287. RELAY_2_OFF; //关继电器2
  288. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = false;
  289. }
  290. }
  291. }
  292. /*********************************************************************************************************
  293. * 函数名称:Relay3State
  294. * 函数功能:Relay3State模块,控制继电器和更新通道状态
  295. * 输入参数:void
  296. * 输出参数:void
  297. * 返 回 值:void
  298. * 创建日期:2021年07月01日
  299. * 注 意:
  300. *********************************************************************************************************/
  301. void Relay3State(void)
  302. {
  303. if(RelaySlaveChaNum>=3)
  304. {
  305. if(EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State==true)
  306. {
  307. RELAY_3_ON; //开继电器3
  308. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = true;
  309. }
  310. else
  311. {
  312. RELAY_3_OFF; //关继电器3
  313. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = false;
  314. }
  315. }
  316. }
  317. /*********************************************************************************************************
  318. * 函数名称:Relay4State
  319. * 函数功能:Relay4State模块,控制继电器和更新通道状态
  320. * 输入参数:void
  321. * 输出参数:void
  322. * 返 回 值:void
  323. * 创建日期:2021年07月01日
  324. * 注 意:
  325. *********************************************************************************************************/
  326. void Relay4State(void)
  327. {
  328. if(RelaySlaveChaNum>=4)
  329. {
  330. if(EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State==true)
  331. {
  332. RELAY_4_ON; //开继电器4
  333. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = true;
  334. }
  335. else
  336. {
  337. RELAY_4_OFF; //关继电器4
  338. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = false;
  339. }
  340. }
  341. }
  342. /*********************************************************************************************************
  343. * 函数名称:Relay5State
  344. * 函数功能:Relay5State模块,控制继电器和更新通道状态
  345. * 输入参数:void
  346. * 输出参数:void
  347. * 返 回 值:void
  348. * 创建日期:2021年07月01日
  349. * 注 意:
  350. *********************************************************************************************************/
  351. void Relay5State(void)
  352. {
  353. if(RelaySlaveChaNum>=5)
  354. {
  355. if(EE_ACDC_State_ReadReg[4].ACDC_Cha_On_Off_State==true)
  356. {
  357. RELAY_5_ON; //开继电器5
  358. EE_ACDC_State_ReadRegTrue[4].ACDC_Cha_On_Off_State = true;
  359. }
  360. else
  361. {
  362. RELAY_5_OFF; //关继电器5
  363. EE_ACDC_State_ReadRegTrue[4].ACDC_Cha_On_Off_State = false;
  364. }
  365. }
  366. }
  367. /*********************************************************************************************************
  368. * 函数名称:Relay6State
  369. * 函数功能:Relay6State模块,控制继电器和更新通道状态
  370. * 输入参数:void
  371. * 输出参数:void
  372. * 返 回 值:void
  373. * 创建日期:2021年07月01日
  374. * 注 意:
  375. *********************************************************************************************************/
  376. void Relay6State(void)
  377. {
  378. if(RelaySlaveChaNum>=6)
  379. {
  380. if(EE_ACDC_State_ReadReg[5].ACDC_Cha_On_Off_State==true)
  381. {
  382. RELAY_6_ON; //开继电器6
  383. EE_ACDC_State_ReadRegTrue[5].ACDC_Cha_On_Off_State = true;
  384. }
  385. else
  386. {
  387. RELAY_6_OFF; //关继电器6
  388. EE_ACDC_State_ReadRegTrue[5].ACDC_Cha_On_Off_State = false;
  389. }
  390. }
  391. }
  392. #ifndef ACSingPhSmaCurrNew
  393. /*********************************************************************************************************
  394. * 函数名称:Relay7State
  395. * 函数功能:Relay7State模块,控制继电器和更新通道状态
  396. * 输入参数:void
  397. * 输出参数:void
  398. * 返 回 值:void
  399. * 创建日期:2021年07月01日
  400. * 注 意:
  401. *********************************************************************************************************/
  402. void Relay7State(void)
  403. {
  404. if(RelaySlaveChaNum>=7)
  405. {
  406. if(EE_ACDC_State_ReadReg[6].ACDC_Cha_On_Off_State==true)
  407. {
  408. RELAY_7_ON; //开继电器7
  409. EE_ACDC_State_ReadRegTrue[6].ACDC_Cha_On_Off_State = true;
  410. }
  411. else
  412. {
  413. RELAY_7_OFF; //关继电器7
  414. EE_ACDC_State_ReadRegTrue[6].ACDC_Cha_On_Off_State = false;
  415. }
  416. }
  417. }
  418. /*********************************************************************************************************
  419. * 函数名称:Relay8State
  420. * 函数功能:Relay8State模块,控制继电器和更新通道状态
  421. * 输入参数:void
  422. * 输出参数:void
  423. * 返 回 值:void
  424. * 创建日期:2021年07月01日
  425. * 注 意:
  426. *********************************************************************************************************/
  427. void Relay8State(void)
  428. {
  429. if(RelaySlaveChaNum>=8)
  430. {
  431. if(EE_ACDC_State_ReadReg[7].ACDC_Cha_On_Off_State==true)
  432. {
  433. RELAY_8_ON; //开继电器8
  434. EE_ACDC_State_ReadRegTrue[7].ACDC_Cha_On_Off_State = true;
  435. }
  436. else
  437. {
  438. RELAY_8_OFF; //关继电器8
  439. EE_ACDC_State_ReadRegTrue[7].ACDC_Cha_On_Off_State = false;
  440. }
  441. }
  442. }
  443. #endif
  444. /*********************************************************************************************************
  445. * 函数名称:RelayState
  446. * 函数功能:RelayState模块,控制继电器和更新通道状态
  447. * 输入参数:void
  448. * 输出参数:void
  449. * 返 回 值:void
  450. * 创建日期:2021年07月01日
  451. * 注 意:
  452. *********************************************************************************************************/
  453. void RelayState(void)
  454. {
  455. BUFF;
  456. Relay1State();
  457. Relay2State();
  458. Relay3State();
  459. Relay4State();
  460. Relay5State();
  461. Relay6State();
  462. #ifndef ACSingPhSmaCurrNew
  463. Relay7State();
  464. Relay8State();
  465. #endif
  466. LOCK;
  467. }
  468. #endif
  469. #if ACSingPhHigCurr
  470. /*********************************************************************************************************
  471. * API函数实现
  472. *********************************************************************************************************/
  473. /*********************************************************************************************************
  474. * 函数名称:Relay1State
  475. * 函数功能:Relay1State模块,控制继电器和更新通道状态
  476. * 输入参数:void
  477. * 输出参数:void
  478. * 返 回 值:void
  479. * 创建日期:2021年07月01日
  480. * 注 意:
  481. *********************************************************************************************************/
  482. void Relay1State(void)
  483. {
  484. if(RelaySlaveChaNum>=1)
  485. {
  486. if(EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State==true)
  487. {
  488. RELAY_1_ON; //开继电器1
  489. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = true;
  490. }
  491. else
  492. {
  493. RELAY_1_OFF; //关继电器1
  494. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = false;
  495. }
  496. }
  497. }
  498. /*********************************************************************************************************
  499. * 函数名称:Relay2State
  500. * 函数功能:Relay2State模块,控制继电器和更新通道状态
  501. * 输入参数:void
  502. * 输出参数:void
  503. * 返 回 值:void
  504. * 创建日期:2021年07月01日
  505. * 注 意:
  506. *********************************************************************************************************/
  507. void Relay2State(void)
  508. {
  509. if(RelaySlaveChaNum>=2)
  510. {
  511. if(EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State==true)
  512. {
  513. RELAY_2_ON; //开继电器2
  514. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = true;
  515. }
  516. else
  517. {
  518. RELAY_2_OFF; //关继电器2
  519. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = false;
  520. }
  521. }
  522. }
  523. /*********************************************************************************************************
  524. * 函数名称:Relay3State
  525. * 函数功能:Relay3State模块,控制继电器和更新通道状态
  526. * 输入参数:void
  527. * 输出参数:void
  528. * 返 回 值:void
  529. * 创建日期:2021年07月01日
  530. * 注 意:
  531. *********************************************************************************************************/
  532. void Relay3State(void)
  533. {
  534. if(RelaySlaveChaNum>=3)
  535. {
  536. if(EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State==true)
  537. {
  538. RELAY_3_ON; //开继电器3
  539. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = true;
  540. }
  541. else
  542. {
  543. RELAY_3_OFF; //关继电器3
  544. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = false;
  545. }
  546. }
  547. }
  548. /*********************************************************************************************************
  549. * 函数名称:Relay4State
  550. * 函数功能:Relay4State模块,控制继电器和更新通道状态
  551. * 输入参数:void
  552. * 输出参数:void
  553. * 返 回 值:void
  554. * 创建日期:2021年07月01日
  555. * 注 意:
  556. *********************************************************************************************************/
  557. void Relay4State(void)
  558. {
  559. if(RelaySlaveChaNum>=4)
  560. {
  561. if(EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State==true)
  562. {
  563. RELAY_4_ON; //开继电器4
  564. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = true;
  565. }
  566. else
  567. {
  568. RELAY_4_OFF; //关继电器4
  569. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = false;
  570. }
  571. }
  572. }
  573. /*********************************************************************************************************
  574. * 函数名称:RelayState
  575. * 函数功能:RelayState模块,控制继电器和更新通道状态
  576. * 输入参数:void
  577. * 输出参数:void
  578. * 返 回 值:void
  579. * 创建日期:2021年07月01日
  580. * 注 意:
  581. *********************************************************************************************************/
  582. void RelayState(void)
  583. {
  584. BUFF;
  585. Relay1State();
  586. Relay2State();
  587. Relay3State();
  588. Relay4State();
  589. LOCK;
  590. }
  591. #endif
  592. /*********************************************************************************************************
  593. * 函数名称:WarnVolUpthrState
  594. * 函数功能:根据读取的数据判断是否触发阈值
  595. * 输入参数:void
  596. * 输出参数:void
  597. * 返 回 值:void
  598. * 创建日期:2021年07月01日
  599. * 注 意:
  600. *
  601. *********************************************************************************************************/
  602. void WarnVolUpthrState(void)
  603. {
  604. uint32_t chn_num = 0;
  605. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  606. {
  607. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_En)
  608. {
  609. if(AC_Ele_ReadReg[chn_num].AC_V>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_TopThres)
  610. {
  611. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = true;
  612. if(ACDC_Over_WriteReg[chn_num].openration & Voltage_Max_Func)
  613. {
  614. over_Func_flag[chn_num] = 1;
  615. }
  616. }
  617. else
  618. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
  619. }
  620. else
  621. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Upthr_Warn = false;
  622. }
  623. }
  624. /*********************************************************************************************************
  625. * 函数名称:WarnVolDownthrState
  626. * 函数功能:根据读取的数据判断是否触发阈值
  627. * 输入参数:void
  628. * 输出参数:void
  629. * 返 回 值:void
  630. * 创建日期:2021年07月01日
  631. * 注 意:
  632. *
  633. *********************************************************************************************************/
  634. void WarnVolDownthrState(void)
  635. {
  636. uint32_t chn_num = 0;
  637. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  638. {
  639. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_En)
  640. {
  641. if(AC_Ele_ReadReg[chn_num].AC_V < EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_V_DownThres)
  642. {
  643. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = true;
  644. if(ACDC_Over_WriteReg[chn_num].openration & Voltage_Min_Func)
  645. {
  646. over_Func_flag[chn_num] = 1;
  647. }
  648. }
  649. else
  650. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
  651. }
  652. else
  653. EE_ACDC_State_ReadReg[chn_num].ACDC_Vol_Downthr_Warn = false;
  654. }
  655. }
  656. /*********************************************************************************************************
  657. * 函数名称:WarnCurUpthrState
  658. * 函数功能:根据读取的数据判断是否触发阈值
  659. * 输入参数:void
  660. * 输出参数:void
  661. * 返 回 值:void
  662. * 创建日期:2021年07月01日
  663. * 注 意:
  664. *
  665. *********************************************************************************************************/
  666. void WarnCurUpthrState(void)
  667. {
  668. uint32_t chn_num = 0;
  669. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  670. {
  671. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_En)
  672. {
  673. if(AC_Ele_ReadReg[chn_num].AC_I>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_I_TopThres)
  674. {
  675. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = true;
  676. if(ACDC_Over_WriteReg[chn_num].openration & Current_Max_Func)
  677. {
  678. over_Func_flag[chn_num] = 1;
  679. }
  680. }
  681. else
  682. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
  683. }
  684. else
  685. EE_ACDC_State_ReadReg[chn_num].ACDC_Cur_Upthr_Warn = false;
  686. }
  687. }
  688. /*********************************************************************************************************
  689. * 函数名称:WarnPowUpthrState
  690. * 函数功能:根据读取的数据判断是否触发阈值
  691. * 输入参数:void
  692. * 输出参数:void
  693. * 返 回 值:void
  694. * 创建日期:2021年07月01日
  695. * 注 意:
  696. *
  697. *********************************************************************************************************/
  698. void WarnPowUpthrState(void)
  699. {
  700. uint32_t chn_num = 0;
  701. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  702. {
  703. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_En)
  704. {
  705. if(AC_Ele_ReadReg[chn_num].AC_P>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_P_TopThres){
  706. EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = true;
  707. if(ACDC_Over_WriteReg[chn_num].openration & Power_Max_Func)
  708. {
  709. over_Func_flag[chn_num] = 1;
  710. }
  711. }
  712. else
  713. EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = false;
  714. }
  715. else
  716. EE_ACDC_State_ReadReg[chn_num].ACDC_Pow_Upthr_Warn = false;
  717. }
  718. }
  719. /*********************************************************************************************************
  720. * 函数名称:WarnEleUpthrState
  721. * 函数功能:根据读取的数据判断是否触发阈值
  722. * 输入参数:void
  723. * 输出参数:void
  724. * 返 回 值:void
  725. * 创建日期:2021年07月01日
  726. * 注 意:
  727. *
  728. *********************************************************************************************************/
  729. void WarnEleUpthrState(void)
  730. {
  731. uint32_t chn_num = 0;
  732. for(chn_num=0;chn_num<RelaySlaveChaNum;chn_num++)
  733. {
  734. if(EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_En)
  735. {
  736. if(AC_Ele_ReadReg[chn_num].AC_E>EE_ACDC_ThresVal_ReadReg[chn_num].ACDC_E_TopThres)
  737. {
  738. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = true;
  739. if(ACDC_Over_WriteReg[chn_num].openration & Consumer_Max_Func)
  740. {
  741. over_Func_flag[chn_num] = 1;
  742. }
  743. }
  744. else
  745. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
  746. }
  747. else
  748. EE_ACDC_State_ReadReg[chn_num].ACDC_Ele_Upthr_Warn = false;
  749. }
  750. }
  751. /*********************************************************************************************************
  752. * 函数名称:WarnState
  753. * 函数功能:根据读取的数据判断是否触发阈值
  754. * 输入参数:void
  755. * 输出参数:void
  756. * 返 回 值:void
  757. * 创建日期:2021年07月01日
  758. * 注 意:
  759. *
  760. *********************************************************************************************************/
  761. void WarnState(void)
  762. {
  763. WarnVolUpthrState();
  764. WarnVolDownthrState();
  765. WarnCurUpthrState();
  766. WarnPowUpthrState();
  767. WarnEleUpthrState();
  768. }
  769. void All_Warn_State(void)
  770. {
  771. //voltage max
  772. if(EE_ACDC_State_All_en.ACDC_Vol_Upper_En)
  773. {
  774. if(AC_Ele_ReadReg_All.AC_V > EE_ACDC_All_ThrVal.ACDC_V_TopThres)
  775. {
  776. ACDC_Wann_All.wan.ACDC_V_Max = true;
  777. if(ACDC_Over_AllWriteReg.openration & Voltage_Max_Func)
  778. {
  779. over_func_all_flag = 1;
  780. //ACDC_Wann_All.over.ACDC_V_Max_O_Func = true;
  781. }
  782. }else
  783. {
  784. ACDC_Wann_All.wan.ACDC_V_Max = false;
  785. //ACDC_Wann_All.over.ACDC_V_Max_O_Func = false;
  786. }
  787. }else
  788. {
  789. ACDC_Wann_All.wan.ACDC_V_Max = false;
  790. }
  791. //voltage min
  792. if(EE_ACDC_State_All_en.ACDC_Vol_Lower_En)
  793. {
  794. if(AC_Ele_ReadReg_All.AC_V < EE_ACDC_All_ThrVal.ACDC_V_DownThres)
  795. {
  796. ACDC_Wann_All.wan.ACDC_V_Min = true;
  797. if(ACDC_Over_AllWriteReg.openration & Voltage_Min_Func)
  798. {
  799. over_func_all_flag = 1;
  800. }
  801. }else
  802. {
  803. ACDC_Wann_All.wan.ACDC_V_Min = false;
  804. }
  805. }else
  806. {
  807. ACDC_Wann_All.wan.ACDC_V_Min = false;
  808. }
  809. //power max
  810. if(EE_ACDC_State_All_en.ACDC_Power_Upper_En)
  811. {
  812. if(AC_Ele_ReadReg_All.AC_P > EE_ACDC_All_ThrVal.ACDC_P_TopThres)
  813. {
  814. ACDC_Wann_All.wan.ACDC_P_Max = true;
  815. if(ACDC_Over_AllWriteReg.openration & Power_Max_Func)
  816. {
  817. over_func_all_flag = 1;
  818. }
  819. }else
  820. {
  821. ACDC_Wann_All.wan.ACDC_P_Max = false;
  822. }
  823. }else
  824. {
  825. ACDC_Wann_All.wan.ACDC_P_Max = false;
  826. }
  827. //current max
  828. if(EE_ACDC_State_All_en.ACDC_Current_Upper_En)
  829. {
  830. if(AC_Ele_ReadReg_All.AC_I > EE_ACDC_All_ThrVal.ACDC_I_TopThres)
  831. {
  832. ACDC_Wann_All.wan.ACDC_I_Max = true;
  833. if(ACDC_Over_AllWriteReg.openration & Current_Max_Func)
  834. {
  835. over_func_all_flag = 1;
  836. }
  837. }else
  838. {
  839. ACDC_Wann_All.wan.ACDC_I_Max = false;
  840. }
  841. }else
  842. {
  843. ACDC_Wann_All.wan.ACDC_I_Max = false;
  844. }
  845. //consumer max
  846. if(EE_ACDC_State_All_en.ACDC_Consumer_Upper_En)
  847. {
  848. if(AC_Ele_ReadReg_All.AC_E > EE_ACDC_All_ThrVal.ACDC_E_TopThres)
  849. {
  850. ACDC_Wann_All.wan.ACDC_C_Max = true;
  851. if(ACDC_Over_AllWriteReg.openration & Consumer_Max_Func)
  852. {
  853. over_func_all_flag = 1;
  854. }
  855. }else
  856. {
  857. ACDC_Wann_All.wan.ACDC_C_Max = false;
  858. }
  859. }else
  860. {
  861. ACDC_Wann_All.wan.ACDC_C_Max = false;
  862. }
  863. }
  864. /*********************************************************************************************************
  865. * 函数名称:Bubble_Sort
  866. * 函数功能:根据读取的数据判断是否触发阈值
  867. * 输入参数:排序数组
  868. * 输出参数:排序数组的长度
  869. * 返 回 值:void
  870. * 创建日期:2021年07月01日
  871. * 注 意:
  872. *
  873. *********************************************************************************************************/
  874. void Bubble_Sort(unsigned short int arr[], unsigned short int len)
  875. {
  876. unsigned short int i, j, temp;
  877. for (i = 0; i < len - 1; i++)
  878. for (j = 0; j < len - 1 - i; j++)
  879. if (arr[j] > arr[j + 1])
  880. {
  881. temp = arr[j];
  882. arr[j] = arr[j + 1];
  883. arr[j + 1] = temp;
  884. }
  885. }