Main.c 72 KB

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