Main.c 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822
  1. /*********************************************************************************************************
  2. * 模块名称:Main.c
  3. * 摘 要:主文件,包含软硬件初始化函数和main函数
  4. * 当前版本:1.0.0
  5. * 作 者:anycrying
  6. * 完成日期:2024年05月20日
  7. * 内 容:
  8. * 注 意:注意勾选Options for Target 'Target1'->Code Generation->Use MicroLIB,否则printf无法使用
  9. **********************************************************************************************************
  10. * 取代版本:
  11. * 作 者:
  12. * 完成日期:
  13. * 修改内容:
  14. * 修改文件:
  15. *********************************************************************************************************/
  16. /*********************************************************************************************************
  17. * 包含头文件
  18. *********************************************************************************************************/
  19. #include "Main.h"
  20. #include "string.h"
  21. #include "NVIC.h"
  22. #include "SysTick.h"
  23. #include "Rcu.h"
  24. #include "Timer.h"
  25. #include "Led.h"
  26. #include "Key.h"
  27. #include "Relay.h"
  28. #include "mb.h"
  29. #include "Wwdgt.h"
  30. #include "At24cxx.h"
  31. #include "I2c.h"
  32. #include "ReadEeprom.h"
  33. #include "Sn74hc573.h"
  34. #include <stdbool.h>
  35. #include "Uart1.h"
  36. #include "Hlw8110.h"
  37. #include "stdint.h"
  38. //#include "HT7032_SPI.h"
  39. /*********************************************************************************************************
  40. * 宏定义
  41. *********************************************************************************************************/
  42. /*********************************************************************************************************
  43. * 枚举结构体
  44. *********************************************************************************************************/
  45. AC3PPDU_RELAY_Para_Reg AC3PPDU_RL_time[Output_ChN_default + 2];//包括输入
  46. AC_Output_struct_Reg AC3PPDU_Output[Output_ChN_default + 2];
  47. // Ch n relay control
  48. AC3PPDU_RELAY_Para_Reg AC3PPDU_RL_N_time; // add by liyi
  49. /*********************************************************************************************************
  50. * 内部变量定义
  51. *********************************************************************************************************/
  52. static uint8_t AC3PPDU_SlaveAddress = 0x00;
  53. uint16_t Devid_IDChalNum = 0; //设备类型和通道数
  54. bool Start_Read_Flag = false;//开始读取数据标志
  55. bool Load_conn_end_flag = false;
  56. bool RL_Allon_flag = false;
  57. bool RL_Alloff_flag = false;
  58. bool Fault_stFlag_V = true;
  59. bool Wr_eeprom_begin_flag = false;
  60. bool Vin_LTmax_Enable_flag = false;
  61. bool Vin_LTmin_Enable_flag = false;
  62. bool Iin_LTmax_Enable_flag = false;
  63. bool Win_LTmax_Enable_flag = false;
  64. bool kWhin_LTmax_Enable_flag = false;
  65. static bool Fault_lack_phase_flag = true;
  66. uint8_t OutUnit_control_flag[Output_ChN_default] = {0};
  67. uint8_t Vout_LTmax_Enable_flag[Output_ChN_default] = {0};
  68. uint8_t Vout_LTmin_Enable_flag[Output_ChN_default] = {0};
  69. uint8_t Iout_LTmax_Enable_flag[Output_ChN_default] = {0};
  70. uint8_t Wout_LTmax_Enable_flag[Output_ChN_default] = {0};
  71. uint8_t kWhout_LTmax_Enable_flag[Output_ChN_default] = {0};
  72. uint8_t Wr_eeprom_cnt = 0;
  73. uint8_t cnt = 0;
  74. uint8_t RL_begin_delay_flag[Output_ChN_default] = {0x00};
  75. uint8_t RL_end_delay_flag[Output_ChN_default] = {0x00};
  76. uint8_t RL_ON_flag[Output_ChN_default] = {0x00};
  77. uint8_t RL_OFF_flag[Output_ChN_default] = {0x00};
  78. uint8_t RL_Ton_en_flag[Output_ChN_default] = {0x00};
  79. uint8_t RL_Toff_en_flag[Output_ChN_default] = {0x00};
  80. uint8_t RL_last_state[Output_ChN_default] = {0};
  81. uint8_t RL_now_state[Output_ChN_default] = {0};
  82. uint8_t RL_Func_statu[Output_ChN_default + 1] = {0};
  83. // Ch N relay control
  84. uint8_t OutUnit_N_control_flag = 0; //add by liyi
  85. uint8_t RL_N_begin_delay_flag = 0; //add by liyi
  86. uint8_t RL_N_end_delay_flag = 0; // add by liyi
  87. uint8_t RL_N_ON_flag = 0; // add by liyi
  88. uint8_t RL_N_OFF_flag = 0; // add by liyi
  89. uint8_t RL_N_Ton_en_flag = 0; // add by liyi
  90. uint8_t RL_N_Toff_en_flag = 0; // add by liyi
  91. uint8_t RL_N_last_state=0; // add by liyi
  92. uint8_t RL_N_now_state=0; // add by liyi
  93. extern uint32_t RL_N_delay_cnt; // add by liyi
  94. extern uint32_t RL_N_delay_Limit; // add by liyi
  95. uint32_t hlw8110_base[Output_ChN_default + 1] = {0}; //add by liyi
  96. uint8_t write_kwh2Eeprom_flag = 0;
  97. uint8_t AC3PPDU_active_chn = Output_ChN_default;
  98. uint16_t Fault_state_Reg = 0;
  99. uint16_t Fault_state_Last = 0;
  100. uint8_t AC3PPDU_Vmax_LTen_flag[Output_ChN_default] = {0x01};
  101. uint8_t AC3PPDU_Vmin_LTen_flag[Output_ChN_default] = {0x01};
  102. uint8_t AC3PPDU_Imax_LTen_flag[Output_ChN_default] = {0x01};
  103. uint8_t AC3PPDU_Wmax_LTen_flag[Output_ChN_default] = {0x01};
  104. uint8_t AC3PPDU_kWhmax_LTen_flag[Output_ChN_default] = {0x01};
  105. uint16_t Wr_erom_wait_cnt = 0;
  106. uint16_t AC3PPDU_In_FtSt_flag = 0xffff;
  107. uint32_t AC3PPDU_Iout_Zero[Output_ChN_default] = {0};
  108. uint32_t AC3PPDU_Modbus_Reg[AC3PPDU_Modbus_Reg_len] = {0};
  109. uint32_t AC3PPDU_Iin_Zero = 0;
  110. uint32_t AC3PPDU_Win_Zero = 0;
  111. extern uint8_t ch_cnt;
  112. extern uint16_t Relay_state;
  113. extern uint32_t RL_delay_Limit[Output_ChN_default];
  114. extern uint32_t Modbus_Wr_buff[Mb_Wcmd_Width][Mb_Wcmd_len];
  115. /*********************************************************************************************************
  116. * 内部函数声明
  117. *********************************************************************************************************/
  118. static void InitSoftware(void); //初始化软件相关的模块
  119. static void InitHardware(void); //初始化硬件相关的模块
  120. static void CHK_JLINK(void);
  121. static void MODbus_CMD(void);
  122. static void MODbus_CMD_New(void);
  123. static void Read_HT7032_data(uint8_t cs_x);
  124. static void LimiT_enable_check(uint8_t chx,uint32_t Lt_v);
  125. static void Fault_state_process(uint8_t ch_x);
  126. /*********************************************************************************************************
  127. * 内部函数实现
  128. *********************************************************************************************************/
  129. /*********************************************************************************************************
  130. * 函数名称:InitSoftware
  131. * 函数功能:所有的软件相关的模块初始化函数都放在此函数中
  132. * 输入参数:void
  133. * 输出参数:void
  134. * 返 回 值:void
  135. * 创建日期:2024年05月20日
  136. * 注 意:
  137. *********************************************************************************************************/
  138. static void InitSoftware(void)
  139. {
  140. eMBInit(MB_RTU, AC3PPDU_SlaveAddress, 0, Uart0_Baud, MB_PAR_NONE); // 初始化modbus为RTU方式,地址RelaySlaveAddress, 波特率Uart0_Baud,无校验
  141. eMBEnable(); // 使能modbus协议栈
  142. }
  143. /*********************************************************************************************************
  144. * 函数名称:InitHardware
  145. * 函数功能:所有的硬件相关的模块初始化函数都放在此函数中
  146. * 输入参数:void
  147. * 输出参数:void
  148. * 返 回 值:void米皮米mimMMDAAADFADAdadafadfyang
  149. * 创建日期:2024年05月20日
  150. * 注 意:
  151. *********************************************************************************************************/
  152. static void InitHardware(void)
  153. {
  154. SystemInit(); //系统初始化,函数里面默认是配置为内部晶振
  155. ViewRcuClock(); //在线调试查看系统时钟频率
  156. InitNVIC(); //初始化NVIC模块
  157. InitSysTick(); //初始化SysTick模块
  158. InitLED(); //初始化LED模块
  159. InitKey(); //初始化Key模块
  160. InitRelay(); //初始化Relay模块
  161. Init_74hc573(); //初始化74hc573锁存器
  162. InitTimer(); //初始化Timer模块
  163. InitAT24Cxx(); //初始化24C64模块
  164. ReadEeprom();
  165. InitUART1(9600);
  166. InitCH448F();
  167. int i;
  168. for(i = 1; i <=AC3PPDU_active_chn;i++)
  169. {
  170. switch(i)
  171. {
  172. case 1: //111
  173. {
  174. SEL_0_H;
  175. SEL_1_H;
  176. SEL_2_H;
  177. Init_HLW8110();
  178. }
  179. break;
  180. case 2: //110
  181. {
  182. SEL_0_L;
  183. SEL_1_H;
  184. SEL_2_H;
  185. Init_HLW8110();
  186. }
  187. break;
  188. case 3: //101
  189. {
  190. SEL_0_H;
  191. SEL_1_L;
  192. SEL_2_H;
  193. Init_HLW8110();
  194. }
  195. break;
  196. }
  197. }
  198. //init_HT7032_SPI();
  199. }
  200. /*********************************************************************************************************
  201. * 函数名称:CHK_JLINK
  202. * 函数功能:检测JLINK有没有插上
  203. * 输入参数:void
  204. * 输出参数:void
  205. * 返 回 值:void
  206. * 创建日期:2024年05月20日
  207. * 注 意:
  208. *********************************************************************************************************/
  209. static void CHK_JLINK(void)
  210. {
  211. uint8_t i = 0;
  212. uint8_t j = 0;
  213. uint8_t temp0 = 0;
  214. uint8_t t_RL_state = 0;
  215. if(Chk_Jlink_conn() == false)//如果有jlink接入,则不会动作继电器,直接跳出进入主函数
  216. {
  217. //if(Fault_lack_phase_flag == false)//无缺相故障才能操作继电器
  218. {
  219. // DB_Out1_H;
  220. // DB_Out2_H;
  221. // DB_Out3_H;
  222. // DB_Out4_H ;
  223. // delay_ms(100);
  224. // DB_Out1_L;
  225. // DB_Out2_L;
  226. // DB_Out3_L;
  227. // DB_Out4_L;
  228. //
  229. // BUFF_Data;
  230. // LOCK_Data;
  231. // Ch N
  232. RL_N_now_state = AC3PPDU_RL_N_time.LT_state & 0x01;
  233. if(RL_N_now_state != RL_N_last_state)
  234. {
  235. if(RL_N_now_state > 0) { //open
  236. RL_N_ON_flag = 1; // Ch N open flag
  237. RL_N_OFF_flag = 0;
  238. if((AC3PPDU_RL_N_time.LT_state & 0x40) > 0){ // Ch N have delay
  239. RL_N_begin_delay_flag = 1;
  240. RL_N_end_delay_flag = 0;
  241. RL_N_delay_Limit = AC3PPDU_RL_N_time.RL_ontime * 1000; // exchange to ms
  242. }else {
  243. RL_N_begin_delay_flag = 0;
  244. RL_N_end_delay_flag = 1;
  245. RL_N_delay_Limit = 0;
  246. }
  247. }else { //close
  248. RL_N_ON_flag = 0;
  249. RL_N_OFF_flag = 1; // Ch N close flag
  250. if((AC3PPDU_RL_N_time.LT_state & 0x80) > 0)//有延时
  251. {
  252. RL_N_begin_delay_flag = 1;
  253. RL_N_end_delay_flag = 0;
  254. RL_N_delay_Limit = AC3PPDU_RL_N_time.RL_offtime * 1000;//秒转成毫秒
  255. }
  256. else//无延时
  257. {
  258. RL_N_begin_delay_flag = 0;
  259. RL_N_end_delay_flag = 1;
  260. RL_N_delay_Limit = 0;
  261. }
  262. }
  263. RL_N_last_state = RL_N_now_state;
  264. }else{
  265. OutUnit_N_control_flag = 0;
  266. }
  267. if(RL_N_end_delay_flag > 0){
  268. RL_N_begin_delay_flag = 0;
  269. RL_N_end_delay_flag = 0;
  270. if(RL_N_ON_flag > 0){
  271. DB_Out4_H;
  272. RL_N_ON_flag = 0;
  273. AC3PPDU_Modbus_Reg[Mb_Dbuff_CHNLT_ST_Addr] = AC3PPDU_RL_N_time.LT_state | 0x00000001;
  274. }else if(RL_N_OFF_flag > 0)
  275. {
  276. DB_Out4_L;
  277. RL_N_OFF_flag = 0;
  278. AC3PPDU_Modbus_Reg[Mb_Dbuff_CHNLT_ST_Addr] = AC3PPDU_RL_N_time.LT_state | 0xfffffffe;
  279. }else{
  280. }
  281. //lock
  282. BUFF_Data;
  283. LOCK_Data;
  284. }
  285. for(i = 0;i < Output_ChN_default;i++)
  286. {
  287. RL_now_state[i] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0x01;
  288. if(RL_last_state[i] != RL_now_state[i])
  289. {
  290. if(RL_now_state[i] > 0)//开启
  291. {
  292. RL_ON_flag[i] = 1;
  293. RL_OFF_flag[i] = 0;
  294. if((AC3PPDU_RL_time[i + CH1_out].LT_state & 0x40) > 0)//有延时
  295. {
  296. RL_begin_delay_flag[i] = 1;
  297. RL_end_delay_flag[i] = 0;
  298. RL_delay_Limit[i] = AC3PPDU_RL_time[i + CH1_out].RL_ontime * 1000;//秒转成毫秒
  299. }
  300. else//无延时
  301. {
  302. RL_begin_delay_flag[i] = 0;
  303. RL_end_delay_flag[i] = 1;
  304. RL_delay_Limit[i] = 0;
  305. }
  306. }
  307. else//断开
  308. {
  309. RL_OFF_flag[i] = 1;
  310. RL_ON_flag[i] = 0;
  311. if((AC3PPDU_RL_time[i + CH1_out].LT_state & 0x80) > 0)//有延时
  312. {
  313. RL_begin_delay_flag[i] = 1;
  314. RL_end_delay_flag[i] = 0;
  315. RL_delay_Limit[i] = AC3PPDU_RL_time[i + CH1_out].RL_offtime * 1000;//秒转成毫秒
  316. }
  317. else//无延时
  318. {
  319. RL_begin_delay_flag[i] = 0;
  320. RL_end_delay_flag[i] = 1;
  321. }
  322. }
  323. RL_last_state[i] = RL_now_state[i];
  324. }
  325. else
  326. {
  327. if(OutUnit_control_flag[i] > 0)
  328. {
  329. OutUnit_control_flag[i] = 0;
  330. }
  331. }
  332. ///////
  333. if(RL_end_delay_flag[i] > 0)
  334. {
  335. RL_begin_delay_flag[i] = 0;
  336. RL_end_delay_flag[i] = 0;
  337. if(RL_ON_flag[i] > 0)
  338. {
  339. //Relayx_Onoff_state(i,RELAY_ON);
  340. // setting relay status
  341. switch (i)
  342. {
  343. case 0:
  344. DB_Out1_H;
  345. break;
  346. case 1:
  347. DB_Out2_H;
  348. break;
  349. case 2:
  350. DB_Out3_H;
  351. break;
  352. }
  353. RL_ON_flag[i] = 0;
  354. AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] = AC3PPDU_RL_time[i + CH1_out].LT_state | 0x00000001;
  355. AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)] = AC3PPDU_RL_time[i + CH1_out].LT_state | 0x00000001;
  356. }
  357. else if(RL_OFF_flag[i] > 0)
  358. {
  359. //Relayx_Onoff_state(i,RELAY_OFF);
  360. RL_OFF_flag[i] = 0;
  361. switch (i)
  362. {
  363. case 0:
  364. DB_Out1_L;
  365. break;
  366. case 1:
  367. DB_Out2_L;
  368. break;
  369. case 2:
  370. DB_Out3_L;
  371. break;
  372. }
  373. AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0xfffffffe;
  374. AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0xfffffffe;
  375. }
  376. //Write_74hc573(LK_Relay_D,Relay_state);
  377. BUFF_Data;
  378. LOCK_Data;
  379. }
  380. }
  381. RL_Allon_flag = false;
  382. RL_Alloff_flag = false;
  383. }
  384. }
  385. }
  386. static uint8_t _check(uint8_t *sourse,uint8_t *read,int size)
  387. {
  388. for(int i =0; i < size;i++)
  389. {
  390. if(sourse[i] == read[i])
  391. {
  392. }else
  393. {
  394. return 1;
  395. }
  396. }
  397. return 0;
  398. }
  399. //static uint8_t write_buff[10] = {0};
  400. //static uint8_t read_buff[10] = {0};
  401. //static void iic_allopen(void)
  402. //{
  403. // uint8_t i = 0;
  404. // uint32_t temp_addr;
  405. // //unsigned char buff[100] = {0};
  406. // memset(write_buff,0,10);
  407. // memset(read_buff,0,10);
  408. // for(i = 0;i < Output_ChN_default;i++)
  409. // {
  410. // temp_addr = i << 1;
  411. // Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x41;
  412. // AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
  413. // }
  414. // memcpy(write_buff,(Eeprom_Rbuf + ERom_CH1LT_ST_Addr),(2*Output_ChN_default));
  415. // AT24CxxWrite(ERom_CH1LT_ST_Addr,write_buff,(2*Output_ChN_default));
  416. // AT24CxxRead(ERom_CH1LT_ST_Addr,read_buff,(2*Output_ChN_default));
  417. // if(_check(write_buff,read_buff,(2*Output_ChN_default)))
  418. // {
  419. //
  420. // }
  421. //}
  422. //static void iic_allclose(void)
  423. //{
  424. // uint8_t i = 0;
  425. // uint32_t temp_addr;
  426. // //unsigned char buff[100] = {0};
  427. // memset(write_buff,0,10);
  428. // memset(read_buff,0,10);
  429. //
  430. // for(i = 0;i < Output_ChN_default;i++)
  431. // {
  432. // temp_addr = i << 1;
  433. // Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x80;
  434. // Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] & 0xfe;
  435. // AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
  436. // }
  437. //
  438. // memcpy(write_buff,(Eeprom_Rbuf + ERom_CH1LT_ST_Addr),(2*Output_ChN_default));
  439. // AT24CxxWrite(ERom_CH1LT_ST_Addr,write_buff,(2*Output_ChN_default));
  440. // AT24CxxRead(ERom_CH1LT_ST_Addr,read_buff,(2*Output_ChN_default));
  441. // if(_check(write_buff,read_buff,(2*Output_ChN_default)))
  442. // {
  443. //
  444. // }
  445. //}
  446. // point 3Phase add by liyi
  447. static void check_3_phse()
  448. {
  449. uint8_t Phase_3_Close_flag=0;
  450. if(3 == Phase_N){
  451. for(int i = 0 ; i < Output_ChN_default; i += 3 )
  452. {
  453. Phase_3_Close_flag = 0;
  454. for(int j = 0;j < 3;j++)
  455. {
  456. if(RL_Func_statu[j+i] == 1)
  457. {
  458. Phase_3_Close_flag = 1;
  459. break;
  460. }
  461. }
  462. if(Phase_3_Close_flag)
  463. {
  464. for(int j = 0;j < 3;j++)
  465. {
  466. RL_Func_statu[j+i] = 1;
  467. }
  468. }
  469. Phase_3_Close_flag = 0;
  470. }
  471. }
  472. }
  473. static void RL_Over_Func()
  474. {
  475. check_3_phse();
  476. for(int i = 0; i < Output_ChN_default;i++)
  477. {
  478. if(RL_Func_statu[i])
  479. {
  480. switch(i)
  481. {
  482. case 0:
  483. DB_Out1_L;
  484. break;
  485. case 1:
  486. DB_Out2_L;
  487. break;
  488. case 2:
  489. DB_Out3_L;
  490. break;
  491. case 3:
  492. case 4:
  493. case 5:
  494. case 6:
  495. case 7:
  496. case 8:
  497. default:
  498. break;
  499. }
  500. AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state &0xfffffffe;
  501. AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  502. AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  503. RL_Func_statu[i] = 0;
  504. }
  505. }
  506. BUFF_Data;
  507. LOCK_Data;
  508. }
  509. /*********************************************************************************************************
  510. * 函数名称:main
  511. * 函数功能:主函数
  512. * 输入参数:void
  513. * 输出参数:void
  514. * 返 回 值:int
  515. * 创建日期:2024年05月20日
  516. * 注 意:
  517. *********************************************************************************************************/
  518. int main(void)
  519. {
  520. uint8_t i = 0;
  521. uint8_t j = 0;
  522. uint8_t cnt = 0;
  523. uint32_t temp0 = 0;
  524. uint8_t temp1 = 0;
  525. uint8_t temp2 = 0;
  526. uint32_t temp3 = 0;
  527. uint8_t temp4 = 0;
  528. uint32_t temp_da[8] = {0};
  529. uint32_t temp5 = 0;
  530. uint32_t temp6 = 0;
  531. uint32_t temp7 = 0;
  532. Wr_eeprom_cnt = 0;
  533. Wr_erom_wait_cnt = 0;
  534. Load_conn_end_flag = false;
  535. AC3PPDU_active_chn = Output_ChN_default;
  536. for(i = 0;i < AC3PPDU_active_chn;i++)
  537. {
  538. RL_begin_delay_flag[i] = 0;
  539. RL_end_delay_flag[i] = 0;
  540. }
  541. // Ch N RELAY delay add by liyi
  542. RL_N_begin_delay_flag = 0; //add by liyi
  543. RL_N_end_delay_flag = 0; //add by liyi
  544. InitHardware(); //初始化硬件相关函数
  545. AC3PPDU_SlaveAddress = ReadKeyValue(); //读取从机的地址
  546. InitSoftware(); //初始化软件相关函数
  547. Devid_IDChalNum = AC3PPDU_Device_ID;
  548. Devid_IDChalNum = Devid_IDChalNum << 8;
  549. Devid_IDChalNum += Output_ChN_default;
  550. AC3PPDU_Modbus_Reg[Mb_Dbuff_DevAddr] = Devid_IDChalNum;
  551. AC3PPDU_RL_time[CH_in].LT_state = AC3PPDU_Modbus_Reg[Mb_Dbuff_LT_ST_Addr];
  552. AC3PPDU_RL_time[CH_in].FT_state = AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr];
  553. LimiT_enable_check(CH_in,AC3PPDU_RL_time[CH_in].LT_state);
  554. Enable_74hc573_Output;
  555. for(i = 0;i < Output_ChN_default;i++)
  556. {
  557. RL_last_state[i] = 0;
  558. AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i];
  559. AC3PPDU_RL_time[i + CH1_out].RL_ontime = AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_Ton1_Addr + i];
  560. AC3PPDU_RL_time[i + CH1_out].RL_offtime = AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_Toff1_Addr + i];
  561. LimiT_enable_check((i + CH1_out),AC3PPDU_RL_time[i + CH1_out].LT_state);
  562. }
  563. // Ch N add by liyi
  564. RL_N_last_state = 0;
  565. AC3PPDU_RL_N_time.LT_state = AC3PPDU_Modbus_Reg[Mb_Dbuff_CHNLT_ST_Addr]; // add by liyi
  566. AC3PPDU_RL_N_time.RL_offtime = AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_ToffN_Addr]; // add by liyi
  567. AC3PPDU_RL_N_time.RL_ontime = AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_TonN_Addr]; // add by liyi
  568. AC3PPDU_active_chn = Output_ChN_default; //bug
  569. Fault_state_Last = Fault_state_Reg;
  570. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] = AC3PPDU_APlack_Fault + AC3PPDU_BPlack_Fault;
  571. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] += AC3PPDU_CPlack_Fault;
  572. while(1)
  573. {
  574. //DelayNms(10);
  575. CHK_JLINK();
  576. eMBPoll();
  577. if(Get1SecFlag()) //判断1s标志状态
  578. {
  579. LEDFlicker2();
  580. Clr1SecFlag(); //清除1s标志
  581. }
  582. if(write_kwh2Eeprom_flag) // 120 second recode
  583. {
  584. write_kwh2Eeprom_flag = 0;
  585. for(i = 0; i < Output_ChN_default ;i++)
  586. {
  587. int temp = i << 2;
  588. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+0] = AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr+i] >> 24;
  589. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+1] = AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr+i] >> 16;
  590. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+2] = AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr+i] >> 8;
  591. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+3] = AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr+i];
  592. }
  593. AT24CxxWrite(ERom_TotalWh1_Addr,(Eeprom_Rbuf + ERom_TotalWh1_Addr),4*Output_ChN_default);
  594. }
  595. ////故障指示处理/////
  596. if(Fault_state_Reg > 0)
  597. {
  598. if(Fault_state_Reg != Fault_state_Last)
  599. {
  600. //RL_now_state = RL_now_state & (~Fault_state_Reg);
  601. // Write_74hc573(LK_FalseLed_D,Fault_state_Reg);
  602. // Fault_state_Last = Fault_state_Reg;
  603. }
  604. }
  605. else
  606. {
  607. }
  608. //////////////////////////
  609. if(Start_Read_Flag)//读数据
  610. {
  611. Start_Read_Flag = false;
  612. // for(i = 0;i < HT7032_CS;i++)
  613. // {
  614. // // Read_HT7032_data(i);
  615. // //read Hlw8110 eche one data;
  616. //
  617. //
  618. // }
  619. for(int j = 0 ; j < Hlw8110_CS;j++)
  620. {
  621. read_Hlw8110(j);
  622. }
  623. //输入A相电压,平均
  624. AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] = AC3PPDU_Output[CH1_out].AC_V;
  625. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] += AC3PPDU_Output[CH4_out].AC_V;
  626. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] += AC3PPDU_Output[CH7_out].AC_V;
  627. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] /= 3;
  628. //输入B相电压,平均
  629. AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] = AC3PPDU_Output[CH2_out].AC_V;
  630. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] += AC3PPDU_Output[CH5_out].AC_V;
  631. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] += AC3PPDU_Output[CH8_out].AC_V;
  632. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] /= 3;
  633. //输入C相电压,平均
  634. AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] = AC3PPDU_Output[CH3_out].AC_V;
  635. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] += AC3PPDU_Output[CH6_out].AC_V;
  636. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] += AC3PPDU_Output[CH9_out].AC_V;
  637. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] /= 3;
  638. //输入A相电流,求和
  639. AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] = AC3PPDU_Output[CH1_out].AC_I;
  640. // AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] += AC3PPDU_Output[CH4_out].AC_I;
  641. // AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] += AC3PPDU_Output[CH7_out].AC_I;
  642. //输入B相电流,求和
  643. AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] = AC3PPDU_Output[CH2_out].AC_I;
  644. // AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] += AC3PPDU_Output[CH5_out].AC_I;
  645. // AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] += AC3PPDU_Output[CH8_out].AC_I;
  646. //输入C相电流,求和
  647. AC3PPDU_Modbus_Reg[Mb_Dbuff_ICP_Addr] = AC3PPDU_Output[CH3_out].AC_I;
  648. // AC3PPDU_Modbus_Reg[Mb_Dbuff_ICP_Addr] += AC3PPDU_Output[CH6_out].AC_I;
  649. // AC3PPDU_Modbus_Reg[Mb_Dbuff_ICP_Addr] += AC3PPDU_Output[CH9_out].AC_I;
  650. //输入A相功率,求和
  651. AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] = AC3PPDU_Output[CH1_out].AC_P;
  652. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] += AC3PPDU_Output[CH4_out].AC_P;
  653. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] += AC3PPDU_Output[CH7_out].AC_P;
  654. //输入B相功率,求和
  655. AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] = AC3PPDU_Output[CH2_out].AC_P;
  656. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] += AC3PPDU_Output[CH5_out].AC_P;
  657. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] += AC3PPDU_Output[CH8_out].AC_P;
  658. //输入C相功率,求和
  659. AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] = AC3PPDU_Output[CH3_out].AC_P;
  660. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] += AC3PPDU_Output[CH6_out].AC_P;
  661. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] += AC3PPDU_Output[CH9_out].AC_P;
  662. //输入A相电量,求和
  663. AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] = hlw8110_base[CH1_out] + AC3PPDU_Output[CH1_out].AC_kWh;
  664. //AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH1_out].AC_kWh;
  665. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH4_out].AC_kWh;
  666. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH7_out].AC_kWh;
  667. //输入B相电量,求和
  668. AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] = hlw8110_base[CH2_out] + AC3PPDU_Output[CH2_out].AC_kWh;
  669. //AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH2_out].AC_kWh;
  670. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH5_out].AC_kWh;
  671. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH8_out].AC_kWh;
  672. //输入C相电量,求和
  673. AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] = hlw8110_base[CH3_out] + AC3PPDU_Output[CH3_out].AC_kWh;
  674. //AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH3_out].AC_kWh;
  675. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH6_out].AC_kWh;
  676. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH9_out].AC_kWh;
  677. // for(i =0; i < Output_ChN_default;i++)
  678. // {
  679. // temp0 = i << 2;
  680. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr + i] += (Eeprom_Rbuf [ERom_TotalWh1_Addr +temp0+0] << 24);
  681. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr + i] += (Eeprom_Rbuf [ERom_TotalWh1_Addr +temp0+1] << 16);
  682. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr + i] += (Eeprom_Rbuf [ERom_TotalWh1_Addr +temp0+2] << 8);
  683. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr + i] += (Eeprom_Rbuf [ERom_TotalWh1_Addr +temp0+3]);
  684. // }
  685. // jugement is or not lack pose
  686. for(i = 0;i < (Output_ChN_default + 1);i++)
  687. {
  688. Fault_state_process(i);
  689. }
  690. RL_Over_Func();
  691. //
  692. if(((AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] & AC3PPDU_APlack_Fault) > 0) || ((AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] & AC3PPDU_BPlack_Fault) > 0) || ((AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] & AC3PPDU_CPlack_Fault) > 0))
  693. {
  694. Fault_lack_phase_flag = true;
  695. }
  696. else
  697. {
  698. Fault_lack_phase_flag = false;
  699. }
  700. for(i = 0;i < Output_ChN_default;i++)
  701. {
  702. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + i] > 0)
  703. {
  704. Fault_state_Reg = Fault_state_Reg | (0x0001 << i);
  705. }
  706. else
  707. {
  708. Fault_state_Reg = Fault_state_Reg & (~(0x0001 << i));
  709. }
  710. }
  711. }
  712. //////////////////////////
  713. MODbus_CMD_New();
  714. //MODbus_CMD();
  715. }
  716. }
  717. static void MODbus_CMD_New(void)
  718. {
  719. if(Modbus_Wr_buff[Wr_eeprom_cnt][0] > 0)
  720. {
  721. uint8_t i = 0;
  722. uint32_t temp_addr;
  723. uint32_t base_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1];
  724. uint32_t data = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  725. switch(base_addr)
  726. {
  727. case Mb_Dbuff_ViLit_max_Addr ... Mb_Dbuff_kWhiLit_max_Addr: //input votage max votage min current power coustermer add by liyi
  728. {
  729. temp_addr = base_addr - Mb_Dbuff_ViLit_max_Addr;
  730. temp_addr = temp_addr << 2;
  731. temp_addr += ERom_ViLit_max_Addr;
  732. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  733. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  734. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  735. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  736. AC3PPDU_Modbus_Reg[base_addr] = data;
  737. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  738. }
  739. break;
  740. case Mb_Dbuff_VLit1_max_Addr ... Mb_Dbuff_VLit9_max_Addr: //output voltage max threod for 1,2,3,4,5,6,7,8,9 channels
  741. {
  742. temp_addr = base_addr - Mb_Dbuff_VLit1_max_Addr;
  743. temp_addr = temp_addr << 2;
  744. temp_addr += ERom_VLit1_max_Addr;
  745. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  746. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  747. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  748. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  749. AC3PPDU_Modbus_Reg[base_addr] = data;
  750. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  751. }
  752. break;
  753. case Mb_Dbuff_VLit1_min_Addr ... Mb_Dbuff_VLit9_min_Addr: //output voltage min thred for 1,2,3,4,5,6,7,8,9 channels
  754. {
  755. temp_addr = base_addr - Mb_Dbuff_VLit1_min_Addr;
  756. temp_addr = temp_addr << 2;
  757. temp_addr += ERom_VLit1_min_Addr;
  758. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  759. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  760. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  761. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  762. AC3PPDU_Modbus_Reg[base_addr] = data;
  763. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  764. }
  765. break;
  766. case Mb_Dbuff_ILit1_max_Addr ... Mb_Dbuff_ILit9_max_Addr: // output current max throud for 1,2,3,4,5,6,7,8,9 channels
  767. {
  768. temp_addr = base_addr - Mb_Dbuff_ILit1_max_Addr;
  769. temp_addr = temp_addr << 2;
  770. temp_addr += ERom_ILit1_max_Addr;
  771. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  772. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  773. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  774. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  775. AC3PPDU_Modbus_Reg[base_addr] = data;
  776. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  777. }
  778. break;
  779. case Mb_Dbuff_WLit1_max_Addr ... Mb_Dbuff_WLit9_max_Addr: //output power max .....
  780. {
  781. temp_addr = base_addr - Mb_Dbuff_WLit1_max_Addr;
  782. temp_addr = temp_addr << 2;
  783. temp_addr += ERom_WLit1_max_Addr;
  784. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  785. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  786. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  787. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  788. AC3PPDU_Modbus_Reg[base_addr] = data;
  789. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  790. }
  791. break;
  792. case Mb_Dbuff_kWhLit1_max_Addr ... Mb_Dbuff_kWhLit9_max_Addr: //output customers max .....
  793. {
  794. temp_addr = base_addr - Mb_Dbuff_kWhLit1_max_Addr;
  795. temp_addr = temp_addr << 2;
  796. temp_addr += ERom_kWhLit1_max_Addr;
  797. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  798. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  799. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  800. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  801. AC3PPDU_Modbus_Reg[base_addr] = data;
  802. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  803. }
  804. break;
  805. case Mb_Dbuff_RL_Allon_Addr: //relay all on
  806. {
  807. RL_Allon_flag = true;
  808. for(i = 0;i < Output_ChN_default;i++)
  809. {
  810. temp_addr = i << 1;
  811. Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x41;
  812. AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
  813. }
  814. AT24CxxWrite(ERom_CH1LT_ST_Addr,(Eeprom_Rbuf + ERom_CH1LT_ST_Addr),(2*Output_ChN_default));
  815. Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x41;
  816. AC3PPDU_RL_N_time.LT_state = Eeprom_Rbuf[ERom_CHNLT_ST_Addr];
  817. AT24CxxWrite(ERom_CHNLT_ST_Addr,(Eeprom_Rbuf + ERom_CHNLT_ST_Addr),2);
  818. }
  819. break;
  820. case Mb_Dbuff_RL_Alloff_Addr: //relay all off
  821. {
  822. RL_Alloff_flag = true;
  823. for(i = 0;i < Output_ChN_default;i++)
  824. {
  825. temp_addr = i << 1;
  826. Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x80;
  827. Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] & 0xfe;
  828. AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
  829. }
  830. AT24CxxWrite(ERom_CH1LT_ST_Addr,(Eeprom_Rbuf + ERom_CH1LT_ST_Addr),(2*Output_ChN_default));
  831. Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x80;
  832. Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] & 0xfe;
  833. AC3PPDU_RL_N_time.LT_state = Eeprom_Rbuf[ERom_CHNLT_ST_Addr];
  834. AT24CxxWrite(ERom_CHNLT_ST_Addr,(Eeprom_Rbuf + ERom_CHNLT_ST_Addr),2);
  835. }
  836. break;
  837. case Mb_Dbuff_LT_ST_Addr: //set input status
  838. {
  839. AC3PPDU_RL_time[CH_in].LT_state = data;
  840. Eeprom_Rbuf[ERom_LT_ST_Addr] = data;
  841. AC3PPDU_Modbus_Reg[base_addr] = data;
  842. AT24CxxWriteOneByte(ERom_LT_ST_Addr,Eeprom_Rbuf[ERom_LT_ST_Addr]);
  843. LimiT_enable_check(CH_in,AC3PPDU_RL_time[CH_in].LT_state);
  844. }
  845. break;
  846. case Mb_Dbuff_CH1LT_ST_Addr ... Mb_Dbuff_CHNLT_ST_Addr: //set output relay statues
  847. {
  848. temp_addr = base_addr - Mb_Dbuff_CH1LT_ST_Addr;
  849. if(temp_addr == 9) { //Ch N
  850. AC3PPDU_RL_N_time.LT_state = data;
  851. }else{
  852. AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = data;
  853. LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
  854. }
  855. temp_addr = temp_addr << 1;
  856. temp_addr += ERom_CH1LT_ST_Addr;
  857. Eeprom_Rbuf[temp_addr] = data;
  858. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  859. }
  860. break;
  861. case Mb_Dbuff_OUTCH1_ST_Addr ... Mb_Dbuff_OUTCH3_ST_Addr: //set output channel relay's status
  862. {
  863. temp_addr = base_addr - Mb_Dbuff_OUTCH1_ST_Addr;
  864. OutUnit_control_flag[temp_addr] = 1;
  865. temp_addr *= 3;
  866. AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = data;
  867. AC3PPDU_RL_time[temp_addr + CH2_out].LT_state = data;
  868. AC3PPDU_RL_time[temp_addr + CH3_out].LT_state = data;
  869. LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
  870. LimiT_enable_check((temp_addr + CH2_out),AC3PPDU_RL_time[temp_addr + CH2_out].LT_state);
  871. LimiT_enable_check((temp_addr + CH3_out),AC3PPDU_RL_time[temp_addr + CH3_out].LT_state);
  872. temp_addr = temp_addr << 1;
  873. Eeprom_Rbuf[temp_addr + ERom_CH1LT_ST_Addr] = data;
  874. Eeprom_Rbuf[temp_addr + ERom_CH2LT_ST_Addr] = data;
  875. Eeprom_Rbuf[temp_addr + ERom_CH3LT_ST_Addr] = data;
  876. AT24CxxWriteOneByte(temp_addr + ERom_CH1LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH1LT_ST_Addr]);
  877. AT24CxxWriteOneByte(temp_addr + ERom_CH2LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH2LT_ST_Addr]);
  878. AT24CxxWriteOneByte(temp_addr + ERom_CH3LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH3LT_ST_Addr]);
  879. /*
  880. AC3PPDU_RL_time[CH7_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  881. AC3PPDU_RL_time[CH8_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  882. AC3PPDU_RL_time[CH9_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  883. LimiT_enable_check((CH7_out - temp_addr),AC3PPDU_RL_time[CH7_out - temp_addr].LT_state);
  884. LimiT_enable_check((CH8_out - temp_addr),AC3PPDU_RL_time[CH8_out - temp_addr].LT_state);
  885. LimiT_enable_check((CH9_out - temp_addr),AC3PPDU_RL_time[CH9_out - temp_addr].LT_state);
  886. temp_addr = temp_addr << 1;
  887. Eeprom_Rbuf[ERom_CH7LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  888. Eeprom_Rbuf[ERom_CH8LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  889. Eeprom_Rbuf[ERom_CH9LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  890. AT24CxxWriteOneByte(ERom_CH7LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH7LT_ST_Addr - temp_addr]);
  891. AT24CxxWriteOneByte(ERom_CH8LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH8LT_ST_Addr - temp_addr]);
  892. AT24CxxWriteOneByte(ERom_CH9LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH9LT_ST_Addr - temp_addr]);*/
  893. }
  894. break;
  895. case Mb_Dbuff_RL_Ton1_Addr ... Mb_Dbuff_RL_TonN_Addr: //set on status delay for 1,2,3,4,5,6,7,8,9,N channels
  896. {
  897. temp_addr = base_addr - Mb_Dbuff_RL_Ton1_Addr;
  898. if(temp_addr == 9){ //Ch N add by liyi
  899. AC3PPDU_RL_N_time.RL_ontime = data;
  900. }else
  901. {
  902. AC3PPDU_RL_time[temp_addr + CH1_out].RL_ontime = data;
  903. }
  904. temp_addr += ERom_RL_Ton1_Addr;
  905. Eeprom_Rbuf[temp_addr] = data;
  906. AC3PPDU_Modbus_Reg[base_addr] = Eeprom_Rbuf[temp_addr];
  907. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  908. }
  909. break;
  910. case Mb_Dbuff_RL_Toff1_Addr ... Mb_Dbuff_RL_ToffN_Addr: //set off status delay for 1,2,3,4,5,6,7,8,9,N channels
  911. {
  912. temp_addr = base_addr - Mb_Dbuff_RL_Toff1_Addr;
  913. if(temp_addr == 9){
  914. AC3PPDU_RL_N_time.RL_offtime = data;
  915. }else {
  916. AC3PPDU_RL_time[temp_addr + CH1_out].RL_offtime = data;
  917. }
  918. temp_addr += ERom_RL_Toff1_Addr;
  919. Eeprom_Rbuf[temp_addr] = data;
  920. AC3PPDU_Modbus_Reg[base_addr] = Eeprom_Rbuf[temp_addr];
  921. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  922. }
  923. break;
  924. case Mb_Dbuff_RL_Over_Ch1_Func ... Mb_Dbuff_RL_Over_Ch9_Func: //threod over limit operation
  925. {
  926. temp_addr = base_addr - Mb_Dbuff_RL_Over_Ch1_Func;
  927. temp_addr += ERom_RL_Over_Ch1_Addr;
  928. Eeprom_Rbuf[temp_addr] = data;
  929. AC3PPDU_Modbus_Reg[base_addr] = Eeprom_Rbuf[temp_addr];
  930. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  931. }
  932. break;
  933. case Mb_Dbuff_Clear_Chn1_Consumer ... Mb_Dbuff_Clear_Chn9_Consumer:
  934. {
  935. if(data)
  936. {
  937. temp_addr = base_addr - Mb_Dbuff_Clear_Chn1_Consumer;
  938. hlw8110_base[temp_addr] = 0;
  939. temp_addr = temp_addr << 2;
  940. temp_addr += ERom_TotalWh1_Addr;
  941. Eeprom_Rbuf[temp_addr+0] = 0;
  942. Eeprom_Rbuf[temp_addr+1] = 0;
  943. Eeprom_Rbuf[temp_addr+2] = 0;
  944. Eeprom_Rbuf[temp_addr+3] = 0;
  945. AT24CxxWrite(temp_addr,Eeprom_Rbuf+temp_addr,4);
  946. }
  947. }
  948. case Mb_Dbuff_Clear_Chnall_Consumer:
  949. {
  950. if(data){
  951. for(i = 0; i < Output_ChN_default ;i++)
  952. {
  953. int temp = i << 2;
  954. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+0] = 0;
  955. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+1] = 0;
  956. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+2] = 0;
  957. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+3] = 0;
  958. hlw8110_base[i] = 0;
  959. }
  960. AT24CxxWrite(ERom_TotalWh1_Addr,(Eeprom_Rbuf + ERom_TotalWh1_Addr),4*Output_ChN_default);
  961. }
  962. }
  963. default:
  964. break;
  965. }
  966. Modbus_Wr_buff[Wr_eeprom_cnt][0] = 0;
  967. Wr_eeprom_begin_flag = true;
  968. }
  969. Wr_eeprom_cnt++;
  970. if(Wr_eeprom_cnt >= Mb_Wcmd_Width)
  971. {
  972. Wr_eeprom_cnt = 0;
  973. }
  974. }
  975. /*********************************************************************************************************
  976. * 函数名称:MODbus_CMD
  977. * 函数功能:modbus命令池处理
  978. * 输入参数:void
  979. * 输出参数:void
  980. * 返 回 值:void
  981. * 创建日期:2024年05月06日
  982. * 注 意:
  983. *********************************************************************************************************/
  984. static void MODbus_CMD(void)
  985. {
  986. if(Modbus_Wr_buff[Wr_eeprom_cnt][0] > 0)
  987. {
  988. uint8_t i = 0;
  989. uint32_t temp_addr;
  990. if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_ViLit_max_Addr)//此地址内不可操作
  991. {
  992. ;
  993. }
  994. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_ViLit_max_Addr)//设置输入电压最大阈值
  995. {
  996. Eeprom_Rbuf[ERom_ViLit_max_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  997. Eeprom_Rbuf[ERom_ViLit_max_Addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  998. Eeprom_Rbuf[ERom_ViLit_max_Addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  999. Eeprom_Rbuf[ERom_ViLit_max_Addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1000. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1001. AT24CxxWrite(ERom_ViLit_max_Addr,(Eeprom_Rbuf + ERom_ViLit_max_Addr),4);
  1002. }
  1003. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_ViLit_min_Addr)//设置输入电压最小阈值
  1004. {
  1005. Eeprom_Rbuf[ERom_ViLit_min_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1006. Eeprom_Rbuf[ERom_ViLit_min_Addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1007. Eeprom_Rbuf[ERom_ViLit_min_Addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1008. Eeprom_Rbuf[ERom_ViLit_min_Addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1009. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1010. AT24CxxWrite(ERom_ViLit_min_Addr,(Eeprom_Rbuf + ERom_ViLit_min_Addr),4);
  1011. }
  1012. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_IiLit_max_Addr)//设置输入电流最大阈值
  1013. {
  1014. Eeprom_Rbuf[ERom_IiLit_max_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1015. Eeprom_Rbuf[ERom_IiLit_max_Addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1016. Eeprom_Rbuf[ERom_IiLit_max_Addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1017. Eeprom_Rbuf[ERom_IiLit_max_Addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1018. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1019. AT24CxxWrite(ERom_IiLit_max_Addr,(Eeprom_Rbuf + ERom_IiLit_max_Addr),4);
  1020. }
  1021. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_WiLit_max_Addr)//设置输入功率最大阈值
  1022. {
  1023. Eeprom_Rbuf[ERom_WiLit_max_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1024. Eeprom_Rbuf[ERom_WiLit_max_Addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1025. Eeprom_Rbuf[ERom_WiLit_max_Addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1026. Eeprom_Rbuf[ERom_WiLit_max_Addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1027. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1028. AT24CxxWrite(ERom_WiLit_max_Addr,(Eeprom_Rbuf + ERom_WiLit_max_Addr),4);
  1029. }
  1030. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_kWhiLit_max_Addr)//设置输入电量最大阈值
  1031. {
  1032. Eeprom_Rbuf[ERom_kWhiLit_max_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1033. Eeprom_Rbuf[ERom_kWhiLit_max_Addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1034. Eeprom_Rbuf[ERom_kWhiLit_max_Addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1035. Eeprom_Rbuf[ERom_kWhiLit_max_Addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1036. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1037. AT24CxxWrite(ERom_kWhiLit_max_Addr,(Eeprom_Rbuf + ERom_kWhiLit_max_Addr),4);
  1038. }
  1039. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_VLit1_min_Addr)//设置输出电压最大阈值
  1040. {
  1041. temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_VLit1_max_Addr;
  1042. temp_addr = temp_addr << 2;
  1043. temp_addr += ERom_VLit1_max_Addr;
  1044. Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1045. Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1046. Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1047. Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1048. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1049. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  1050. }
  1051. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_ILit1_max_Addr)//设置输出电压最小阈值
  1052. {
  1053. temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_VLit1_min_Addr;
  1054. temp_addr = temp_addr << 2;
  1055. temp_addr += ERom_VLit1_min_Addr;
  1056. Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1057. Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1058. Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1059. Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1060. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1061. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  1062. }
  1063. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_WLit1_max_Addr)//设置输出电流最大阈值
  1064. {
  1065. temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_ILit1_max_Addr;
  1066. temp_addr = temp_addr << 2;
  1067. temp_addr += ERom_ILit1_max_Addr;
  1068. Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1069. Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1070. Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1071. Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1072. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1073. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  1074. }
  1075. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_kWhLit1_max_Addr)//设置输出功率最大阈值
  1076. {
  1077. temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_WLit1_max_Addr;
  1078. temp_addr = temp_addr << 2;
  1079. temp_addr += ERom_WLit1_max_Addr;
  1080. Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1081. Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1082. Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1083. Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1084. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1085. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  1086. }
  1087. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_RL_Allon_Addr)//设置输出电量最大阈值
  1088. {
  1089. temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_kWhLit1_max_Addr;
  1090. temp_addr = temp_addr << 2;
  1091. temp_addr += ERom_kWhLit1_max_Addr;
  1092. Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1093. Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1094. Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1095. Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1096. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1097. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  1098. }
  1099. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_RL_Allon_Addr)//设置全开
  1100. {
  1101. RL_Allon_flag = true;
  1102. for(i = 0;i < Output_ChN_default;i++)
  1103. {
  1104. temp_addr = i << 1;
  1105. Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x41;
  1106. AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
  1107. }
  1108. AT24CxxWrite(ERom_CH1LT_ST_Addr,(Eeprom_Rbuf + ERom_CH1LT_ST_Addr),(2*Output_ChN_default));
  1109. //iic_allopen();
  1110. Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x41;
  1111. //Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x01;
  1112. AC3PPDU_RL_N_time.LT_state = Eeprom_Rbuf[ERom_CHNLT_ST_Addr];
  1113. AT24CxxWrite(ERom_CHNLT_ST_Addr,(Eeprom_Rbuf + ERom_CHNLT_ST_Addr),2);
  1114. }
  1115. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_RL_Alloff_Addr)//设置全关
  1116. {
  1117. RL_Alloff_flag = true;
  1118. for(i = 0;i < Output_ChN_default;i++)
  1119. {
  1120. temp_addr = i << 1;
  1121. Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x80;
  1122. Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] & 0xfe;
  1123. AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
  1124. }
  1125. //
  1126. AT24CxxWrite(ERom_CH1LT_ST_Addr,(Eeprom_Rbuf + ERom_CH1LT_ST_Addr),(2*Output_ChN_default));
  1127. //iic_allclose();
  1128. Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x80;
  1129. Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] & 0xfe;
  1130. AC3PPDU_RL_N_time.LT_state = Eeprom_Rbuf[ERom_CHNLT_ST_Addr];
  1131. AT24CxxWrite(ERom_CHNLT_ST_Addr,(Eeprom_Rbuf + ERom_CHNLT_ST_Addr),2);
  1132. }
  1133. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_LT_ST_Addr)//设置输入状态
  1134. {
  1135. AC3PPDU_RL_time[CH_in].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1136. Eeprom_Rbuf[ERom_LT_ST_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1137. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1138. AT24CxxWriteOneByte(ERom_LT_ST_Addr,Eeprom_Rbuf[ERom_LT_ST_Addr]);
  1139. LimiT_enable_check(CH_in,AC3PPDU_RL_time[CH_in].LT_state);
  1140. }
  1141. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_OUTCH1_ST_Addr)//设置单通道继电器状态
  1142. {
  1143. temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_CH1LT_ST_Addr;
  1144. if(temp_addr == 9) { //Ch N
  1145. AC3PPDU_RL_N_time.LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1146. }else{
  1147. AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1148. LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
  1149. }
  1150. temp_addr = temp_addr << 1;
  1151. temp_addr += ERom_CH1LT_ST_Addr;
  1152. Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1153. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1154. }
  1155. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_RL_Ton1_Addr)//设置输出通道继电器状态
  1156. {
  1157. temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_OUTCH1_ST_Addr;
  1158. OutUnit_control_flag[temp_addr] = 1;
  1159. temp_addr *= 3;
  1160. AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1161. AC3PPDU_RL_time[temp_addr + CH2_out].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1162. AC3PPDU_RL_time[temp_addr + CH3_out].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1163. LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
  1164. LimiT_enable_check((temp_addr + CH2_out),AC3PPDU_RL_time[temp_addr + CH2_out].LT_state);
  1165. LimiT_enable_check((temp_addr + CH3_out),AC3PPDU_RL_time[temp_addr + CH3_out].LT_state);
  1166. temp_addr = temp_addr << 1;
  1167. Eeprom_Rbuf[temp_addr + ERom_CH1LT_ST_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1168. Eeprom_Rbuf[temp_addr + ERom_CH2LT_ST_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1169. Eeprom_Rbuf[temp_addr + ERom_CH3LT_ST_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1170. AT24CxxWriteOneByte(temp_addr + ERom_CH1LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH1LT_ST_Addr]);
  1171. AT24CxxWriteOneByte(temp_addr + ERom_CH2LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH2LT_ST_Addr]);
  1172. AT24CxxWriteOneByte(temp_addr + ERom_CH3LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH3LT_ST_Addr]);
  1173. /*
  1174. AC3PPDU_RL_time[CH7_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1175. AC3PPDU_RL_time[CH8_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1176. AC3PPDU_RL_time[CH9_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1177. LimiT_enable_check((CH7_out - temp_addr),AC3PPDU_RL_time[CH7_out - temp_addr].LT_state);
  1178. LimiT_enable_check((CH8_out - temp_addr),AC3PPDU_RL_time[CH8_out - temp_addr].LT_state);
  1179. LimiT_enable_check((CH9_out - temp_addr),AC3PPDU_RL_time[CH9_out - temp_addr].LT_state);
  1180. temp_addr = temp_addr << 1;
  1181. Eeprom_Rbuf[ERom_CH7LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1182. Eeprom_Rbuf[ERom_CH8LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1183. Eeprom_Rbuf[ERom_CH9LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1184. AT24CxxWriteOneByte(ERom_CH7LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH7LT_ST_Addr - temp_addr]);
  1185. AT24CxxWriteOneByte(ERom_CH8LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH8LT_ST_Addr - temp_addr]);
  1186. AT24CxxWriteOneByte(ERom_CH9LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH9LT_ST_Addr - temp_addr]);*/
  1187. }
  1188. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_RL_Toff1_Addr)//设置开启延时
  1189. {
  1190. temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_RL_Ton1_Addr;
  1191. if(temp_addr == 9){ //Ch N add by liyi
  1192. AC3PPDU_RL_N_time.RL_ontime = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1193. }else
  1194. {
  1195. AC3PPDU_RL_time[temp_addr + CH1_out].RL_ontime = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1196. }
  1197. temp_addr += ERom_RL_Ton1_Addr;
  1198. Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1199. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Eeprom_Rbuf[temp_addr];
  1200. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1201. }
  1202. else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] <= Mb_Dbuff_RL_ToffN_Addr)//设置继电器关断延时
  1203. {
  1204. temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_RL_Toff1_Addr;
  1205. if(temp_addr == 9){
  1206. AC3PPDU_RL_N_time.RL_offtime = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1207. }else {
  1208. AC3PPDU_RL_time[temp_addr + CH1_out].RL_offtime = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1209. }
  1210. temp_addr += ERom_RL_Toff1_Addr;
  1211. Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1212. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Eeprom_Rbuf[temp_addr];
  1213. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1214. }else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] <= Mb_Dbuff_RL_Over_Ch9_Func && Modbus_Wr_buff[Wr_eeprom_cnt][1] >= Mb_Dbuff_RL_Over_Ch1_Func)
  1215. {
  1216. temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_RL_Over_Ch1_Func;
  1217. temp_addr += ERom_RL_Over_Ch1_Addr;
  1218. Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1219. AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Eeprom_Rbuf[temp_addr];
  1220. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1221. }
  1222. Modbus_Wr_buff[Wr_eeprom_cnt][0] = 0;
  1223. Wr_eeprom_begin_flag = true;
  1224. }
  1225. Wr_eeprom_cnt++;
  1226. if(Wr_eeprom_cnt >= Mb_Wcmd_Width)
  1227. {
  1228. Wr_eeprom_cnt = 0;
  1229. }
  1230. }
  1231. /*********************************************************************************************************
  1232. * 函数名称:LimiT_enable_check
  1233. * 函数功能:输入和各输出通道标识位检查
  1234. * 输入参数:chx:第x通道或输入通道;Lt_v:对应通道的状态标识值
  1235. * 输出参数:void
  1236. * 返 回 值:void
  1237. * 创建日期:2024年05月06日
  1238. * 注 意:
  1239. *********************************************************************************************************/
  1240. static void LimiT_enable_check(uint8_t ch_x,uint32_t Lt_v)
  1241. {
  1242. uint16_t temp0 = 0;
  1243. temp0 = Lt_v >> 1;
  1244. //通道最大电压
  1245. if((temp0 & AC3PPDU_Vmax_LT_enable) == AC3PPDU_Vmax_LT_enable)
  1246. {
  1247. AC3PPDU_Vmax_LTen_flag[ch_x] = 1;
  1248. }
  1249. else
  1250. {
  1251. AC3PPDU_Vmax_LTen_flag[ch_x] = 0;
  1252. }
  1253. //最小电压
  1254. if((temp0 & AC3PPDU_Vmin_LT_enable) == AC3PPDU_Vmin_LT_enable)
  1255. {
  1256. AC3PPDU_Vmin_LTen_flag[ch_x] = 1;
  1257. }
  1258. else
  1259. {
  1260. AC3PPDU_Vmin_LTen_flag[ch_x] = 0;
  1261. }
  1262. //最大电流
  1263. if((temp0 & AC3PPDU_Imax_LT_enable) == AC3PPDU_Imax_LT_enable)
  1264. {
  1265. AC3PPDU_Imax_LTen_flag[ch_x] = 1;
  1266. }
  1267. else
  1268. {
  1269. AC3PPDU_Imax_LTen_flag[ch_x] = 0;
  1270. }
  1271. //最大功率
  1272. if((temp0 & AC3PPDU_Wmax_LT_enable) == AC3PPDU_Wmax_LT_enable)
  1273. {
  1274. AC3PPDU_Wmax_LTen_flag[ch_x] = 1;
  1275. }
  1276. else
  1277. {
  1278. AC3PPDU_Wmax_LTen_flag[ch_x] = 0;
  1279. }
  1280. //最大电量
  1281. if((temp0 & AC3PPDU_kWhmax_LT_enable) == AC3PPDU_kWhmax_LT_enable)
  1282. {
  1283. AC3PPDU_kWhmax_LTen_flag[ch_x] = 1;
  1284. }
  1285. else
  1286. {
  1287. AC3PPDU_kWhmax_LTen_flag[ch_x] = 0;
  1288. }
  1289. }
  1290. /*********************************************************************************************************
  1291. * 函数名称:Fault_state_process
  1292. * 函数功能:输入和各输出通道的故障状态处理
  1293. * 输入参数:void
  1294. * 输出参数:void
  1295. * 返 回 值:void
  1296. * 创建日期:2024年05月06日
  1297. * 注 意:
  1298. *********************************************************************************************************/
  1299. static void Fault_state_process(uint8_t ch_x)
  1300. {
  1301. uint16_t i = 0;
  1302. if(ch_x != CH_in)
  1303. i = (ch_x -1)<< 3;
  1304. if(ch_x == CH_in)
  1305. {
  1306. uint32_t sort_buff[3] = {0};
  1307. uint32_t Vmax = 0;
  1308. uint32_t Vmin = 0;
  1309. sort_buff[0] = AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr];
  1310. sort_buff[1] = AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr];
  1311. sort_buff[2] = AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr];
  1312. Vmax = (sort_buff[0] >= sort_buff[1]) ? sort_buff[0] :sort_buff[1];
  1313. Vmax = (Vmin >= sort_buff[2]) ? Vmax : sort_buff[2];
  1314. Vmin = (sort_buff[0] <= sort_buff[1]) ? sort_buff[0] :sort_buff[1];
  1315. Vmin = (Vmin <= sort_buff[2]) ? Vmin : sort_buff[2];
  1316. if((Vmin < AC3PPDU_Lack_Voltage) && (Vmax != 0) && (Vmax / AC3PPDU_Lack_Voltage > 3))
  1317. {
  1318. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] < AC3PPDU_Lack_Voltage)
  1319. {
  1320. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackA_Addr] = 1;
  1321. }
  1322. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] < AC3PPDU_Lack_Voltage)
  1323. {
  1324. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackB_Addr] = 1;
  1325. }
  1326. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] < AC3PPDU_Lack_Voltage)
  1327. {
  1328. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackC_Addr] =1;
  1329. }
  1330. }else
  1331. {
  1332. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackA_Addr] = 0;
  1333. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackB_Addr] = 0;
  1334. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackC_Addr] = 0;
  1335. }
  1336. }
  1337. ////电压最大、最小、缺相阈值使能,进行判断
  1338. if(AC3PPDU_Vmax_LTen_flag[ch_x] > 0)
  1339. {
  1340. if(ch_x > CH_in)//输出通道
  1341. {
  1342. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + ch_x-1])//大于最大
  1343. {
  1344. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_Vmax_Fault;
  1345. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmin_NFault;
  1346. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func+ch_x-1] & (AC3PPDU_Over_V_Max_Func_enable)) //is or not open func
  1347. {
  1348. RL_Func_statu[ch_x] = 1;
  1349. }
  1350. }
  1351. else if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + ch_x-1])//大于最小,小于最大,正常
  1352. {
  1353. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmax_NFault;
  1354. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmin_NFault;
  1355. }
  1356. else//小于最小
  1357. {
  1358. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmax_NFault;
  1359. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_Vmin_Fault;
  1360. }
  1361. }
  1362. else//输入通道
  1363. {
  1364. //A相
  1365. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_max_Addr])//超限
  1366. {
  1367. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_AVmax_Fault;
  1368. }
  1369. else
  1370. {
  1371. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AVmax_NFault;
  1372. }
  1373. //B相
  1374. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_max_Addr])//超限
  1375. {
  1376. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BVmax_Fault;
  1377. }
  1378. else
  1379. {
  1380. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BVmax_NFault;
  1381. }
  1382. //C相
  1383. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_max_Addr])//超限
  1384. {
  1385. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CVmax_Fault;
  1386. }
  1387. else
  1388. {
  1389. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CVmax_NFault;
  1390. }
  1391. }
  1392. }
  1393. else
  1394. {
  1395. if(ch_x > CH_in)
  1396. {
  1397. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmax_NFault;
  1398. }
  1399. else
  1400. {
  1401. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AVmax_NFault;
  1402. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BVmax_NFault;
  1403. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CVmax_NFault;
  1404. }
  1405. }
  1406. //最小电压
  1407. if(AC3PPDU_Vmin_LTen_flag[ch_x] > 0)
  1408. {
  1409. if(ch_x > CH_in)//输出通道
  1410. {
  1411. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + ch_x -1])//大于最大 revice by liyi max -> min
  1412. {
  1413. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmin_NFault;
  1414. }
  1415. else//小于最小
  1416. {
  1417. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_Vmin_Fault;
  1418. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + ch_x - 1] & (AC3PPDU_Over_V_Min_Func_enable)) //is or not open func add by liyi
  1419. {
  1420. RL_Func_statu[ch_x] = 1;
  1421. }
  1422. }
  1423. }
  1424. else//输入通道
  1425. {
  1426. //A相
  1427. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_min_Addr])//
  1428. {
  1429. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AVmin_NFault;
  1430. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_APlack_NFault;
  1431. }
  1432. else if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] > 1000)
  1433. {
  1434. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_AVmin_Fault;
  1435. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_APlack_NFault;
  1436. }
  1437. else
  1438. {
  1439. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AVmin_NFault;
  1440. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_APlack_Fault;
  1441. }
  1442. //B相
  1443. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_min_Addr])//
  1444. {
  1445. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BVmin_NFault;
  1446. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BPlack_NFault;
  1447. }
  1448. else if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] > 1000)
  1449. {
  1450. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BVmin_Fault;
  1451. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BPlack_NFault;
  1452. }
  1453. else
  1454. {
  1455. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BVmin_NFault;
  1456. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BPlack_Fault;
  1457. }
  1458. //C相
  1459. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_min_Addr])//超限
  1460. {
  1461. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CVmin_NFault;
  1462. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CPlack_NFault;
  1463. }
  1464. else if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] > 1000)
  1465. {
  1466. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CVmin_Fault;
  1467. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CPlack_NFault;
  1468. }
  1469. else
  1470. {
  1471. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CVmin_NFault;
  1472. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CPlack_Fault;
  1473. }
  1474. }
  1475. }
  1476. else
  1477. {
  1478. if(ch_x > CH_in)
  1479. {
  1480. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmin_NFault;
  1481. }
  1482. else
  1483. {
  1484. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AVmin_NFault;
  1485. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BVmin_NFault;
  1486. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CVmin_NFault;
  1487. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] > 1000)
  1488. {
  1489. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_APlack_NFault;
  1490. }
  1491. else
  1492. {
  1493. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_APlack_Fault;
  1494. }
  1495. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] > 1000)
  1496. {
  1497. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BPlack_NFault;
  1498. }
  1499. else
  1500. {
  1501. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BPlack_Fault;
  1502. }
  1503. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] > 1000)
  1504. {
  1505. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CPlack_NFault;
  1506. }
  1507. else
  1508. {
  1509. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CPlack_Fault;
  1510. }
  1511. }
  1512. }
  1513. //电流最大
  1514. if(AC3PPDU_Imax_LTen_flag[ch_x] > 0)
  1515. {
  1516. if(ch_x > CH_in)//输出通道
  1517. {
  1518. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + 1 + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + ch_x -1])
  1519. {
  1520. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_Imax_Fault;
  1521. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + ch_x-1] & (AC3PPDU_Over_I_Max_Func_enable)) //is or not open func add by liyi
  1522. {
  1523. RL_Func_statu[ch_x] = 1;
  1524. }
  1525. }
  1526. else
  1527. {
  1528. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Imax_NFault;
  1529. }
  1530. }
  1531. else//输入通道
  1532. {
  1533. if((AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_IiLit_max_Addr]))//超限
  1534. {
  1535. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_AImax_Fault;
  1536. }
  1537. else
  1538. {
  1539. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AImax_NFault;
  1540. }
  1541. if((AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_IiLit_max_Addr]))//超限
  1542. {
  1543. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BImax_Fault;
  1544. }
  1545. else
  1546. {
  1547. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BImax_NFault;
  1548. }
  1549. if((AC3PPDU_Modbus_Reg[Mb_Dbuff_ICP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_IiLit_max_Addr]))//超限
  1550. {
  1551. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CImax_Fault;
  1552. }
  1553. else
  1554. {
  1555. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CImax_NFault;
  1556. }
  1557. }
  1558. }
  1559. else
  1560. {
  1561. if(ch_x > CH_in)
  1562. {
  1563. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Imax_NFault;
  1564. }
  1565. else
  1566. {
  1567. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AImax_NFault;
  1568. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BImax_NFault;
  1569. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CImax_NFault;
  1570. }
  1571. }
  1572. //功率最大
  1573. if(AC3PPDU_Wmax_LTen_flag[ch_x] > 0)
  1574. {
  1575. if(ch_x > CH_in)//输出通道
  1576. {
  1577. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + 2 + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + ch_x -1])
  1578. {
  1579. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_Wmax_Fault;
  1580. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + ch_x-1] & (AC3PPDU_Over_P_Max_Func_enable)) //is or not open func add by liyi
  1581. {
  1582. RL_Func_statu[ch_x] = 1;
  1583. }
  1584. }
  1585. else
  1586. {
  1587. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Wmax_NFault;
  1588. }
  1589. }
  1590. else//输入通道
  1591. {
  1592. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1593. {
  1594. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_AWmax_Fault;
  1595. }
  1596. else
  1597. {
  1598. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AWmax_NFault;
  1599. }
  1600. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1601. {
  1602. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BWmax_Fault;
  1603. }
  1604. else
  1605. {
  1606. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BWmax_NFault;
  1607. }
  1608. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1609. {
  1610. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CWmax_Fault;
  1611. }
  1612. else
  1613. {
  1614. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CWmax_NFault;
  1615. }
  1616. }
  1617. }
  1618. else
  1619. {
  1620. if(ch_x > CH_in)
  1621. {
  1622. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Wmax_NFault;
  1623. }
  1624. else
  1625. {
  1626. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AWmax_NFault;
  1627. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BWmax_NFault;
  1628. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CWmax_NFault;
  1629. }
  1630. }
  1631. //电量最大
  1632. if(AC3PPDU_kWhmax_LTen_flag[ch_x] > 0)
  1633. {
  1634. if(ch_x > CH_in)//输出通道
  1635. {
  1636. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + 3 + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + ch_x-1])
  1637. {
  1638. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_kWhmax_Fault;
  1639. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func + ch_x-1] & (AC3PPDU_Over_C_Max_Func_enable)) //is or not open func add by liyi
  1640. {
  1641. RL_Func_statu[ch_x] = 1;
  1642. }
  1643. }
  1644. else
  1645. {
  1646. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_kWhmax_NFault;
  1647. }
  1648. }
  1649. else//输入通道
  1650. {
  1651. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1652. {
  1653. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_AkWhmax_Fault;
  1654. }
  1655. else
  1656. {
  1657. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AkWhmax_NFault;
  1658. }
  1659. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1660. {
  1661. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BkWhmax_Fault;
  1662. }
  1663. else
  1664. {
  1665. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BkWhmax_NFault;
  1666. }
  1667. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1668. {
  1669. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CkWhmax_Fault;
  1670. }
  1671. else
  1672. {
  1673. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CkWhmax_NFault;
  1674. }
  1675. }
  1676. }
  1677. else
  1678. {
  1679. if(ch_x > CH_in)
  1680. {
  1681. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_kWhmax_NFault;
  1682. }
  1683. else
  1684. {
  1685. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AkWhmax_NFault;
  1686. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BkWhmax_NFault;
  1687. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CkWhmax_NFault;
  1688. }
  1689. }
  1690. }
  1691. #ifdef USE_FULL_ASSERT
  1692. void assert_failed(uint8_t* file, uint32_t line)
  1693. {
  1694. while (1);
  1695. }
  1696. #else
  1697. void __aeabi_assert(const char * x1, const char * x2, int x3)
  1698. {
  1699. (void)x3;
  1700. }
  1701. #endif