Main.c 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092
  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. //close
  460. DB_Out1_L;
  461. DB_Out2_L;
  462. DB_Out3_L;
  463. for(uint8_t i = 0; i < Output_ChN_default;i++)
  464. {
  465. AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state &0xfffffffe;
  466. RL_now_state[i] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0x01;
  467. uint8_t stat = AC3PPDU_RL_time[i + CH1_out].LT_state;
  468. if(RL_now_state[i] != RL_last_state[i])
  469. {
  470. RL_last_state[i] = RL_now_state[i];
  471. }
  472. // save value to eeprom
  473. AT24CxxWriteOneByte(ERom_CH1LT_ST_Addr+i,stat);
  474. AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  475. AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  476. }
  477. }
  478. if(rst != test)
  479. {
  480. if(rst)
  481. {
  482. DB_Out1_L;
  483. DB_Out2_L;
  484. DB_Out3_L;
  485. for(uint8_t i = 0; i < Output_ChN_default;i++)
  486. {
  487. AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state &0xfffffffe;
  488. RL_now_state[i] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0x01;
  489. uint8_t stat = AC3PPDU_RL_time[i + CH1_out].LT_state;
  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. AT24CxxWriteOneByte(ERom_CH1LT_ST_Addr+i,stat);
  496. AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  497. AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  498. }
  499. }else
  500. {
  501. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Detection] == 0x1)
  502. {
  503. DB_Out1_H;
  504. DB_Out2_H;
  505. DB_Out3_H;
  506. for(uint8_t i = 0; i < Output_ChN_default;i++)
  507. {
  508. AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state | 0x00000001;
  509. RL_now_state[i] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0x01;
  510. if(RL_now_state[i] != RL_last_state[i])
  511. {
  512. RL_last_state[i] = RL_now_state[i];
  513. }
  514. // save value to eeprom
  515. uint8_t stat = AC3PPDU_RL_time[i + CH1_out].LT_state;
  516. AT24CxxWriteOneByte(ERom_CH1LT_ST_Addr+i,stat);
  517. AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  518. AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)] = AC3PPDU_RL_time[i + CH1_out].LT_state | 0x00000001;
  519. }
  520. }
  521. }
  522. }
  523. BUFF_Data;
  524. LOCK_Data;
  525. // for(uint8_t i = 0; i < Output_ChN_default;i++)
  526. // {
  527. // rst = get_rst(i+CH1_out);
  528. // test = get_test(i+CH1_out);
  529. // if(rst != test)
  530. // {
  531. // if(rst)
  532. // {
  533. // switch (i)
  534. // {
  535. // case 0:
  536. // DB_Out1_L;
  537. // break;
  538. // case 1:
  539. // DB_Out2_L;
  540. // break;
  541. // case 2:
  542. // DB_Out3_L;
  543. // break;
  544. // default:
  545. // break;
  546. // }
  547. // AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state &0xfffffffe;
  548. // RL_now_state[i] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0x01;
  549. // uint8_t stat = AC3PPDU_RL_time[i + CH1_out].LT_state;
  550. // if(RL_now_state[i] != RL_last_state[i])
  551. // {
  552. // RL_last_state[i] = RL_now_state[i];
  553. // }
  554. // // save value to eeprom
  555. // AT24CxxWriteOneByte(ERom_CH1LT_ST_Addr+i,stat);
  556. // AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  557. // AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  558. // }else
  559. // {
  560. // switch (i)
  561. // {
  562. // case 0:
  563. // DB_Out1_H;
  564. // break;
  565. // case 1:
  566. // DB_Out2_H;
  567. // break;
  568. // case 2:
  569. // DB_Out3_H;
  570. // break;
  571. // default:
  572. // break;
  573. // }
  574. // AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state | 0x00000001;
  575. // RL_now_state[i] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0x01;
  576. // if(RL_now_state[i] != RL_last_state[i])
  577. // {
  578. // RL_last_state[i] = RL_now_state[i];
  579. // }
  580. // // save value to eeprom
  581. // uint8_t stat = AC3PPDU_RL_time[i + CH1_out].LT_state;
  582. // AT24CxxWriteOneByte(ERom_CH1LT_ST_Addr+i,stat);
  583. // AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  584. // AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)] = AC3PPDU_RL_time[i + CH1_out].LT_state | 0x00000001;
  585. // }
  586. // }
  587. // }
  588. // BUFF_Data;
  589. // LOCK_Data;
  590. }
  591. static void RL_Over_Func()
  592. {
  593. check_3_phse();
  594. for(int i = 0; i < Output_ChN_default;i++)
  595. {
  596. if(RL_Func_statu[i+1])
  597. {
  598. switch(i)
  599. {
  600. case 0:
  601. DB_Out1_L;
  602. break;
  603. case 1:
  604. DB_Out2_L;
  605. break;
  606. case 2:
  607. DB_Out3_L;
  608. break;
  609. case 3:
  610. case 4:
  611. case 5:
  612. case 6:
  613. case 7:
  614. case 8:
  615. default:
  616. break;
  617. }
  618. AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_RL_time[i + CH1_out].LT_state &0xfffffffe;
  619. RL_now_state[i] = AC3PPDU_RL_time[i + CH1_out].LT_state & 0x01;
  620. if(RL_now_state[i] != RL_last_state[i])
  621. {
  622. RL_last_state[i] = RL_now_state[i];
  623. }
  624. AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  625. AC3PPDU_Modbus_Reg[Mb_Dbuff_OUTCH1_ST_Addr + (i % 3)] = AC3PPDU_RL_time[i + CH1_out].LT_state;
  626. RL_Func_statu[i+1] = 0;
  627. }
  628. }
  629. BUFF_Data;
  630. LOCK_Data;
  631. }
  632. /*********************************************************************************************************
  633. * 函数名称:main
  634. * 函数功能:主函数
  635. * 输入参数:void
  636. * 输出参数:void
  637. * 返 回 值:int
  638. * 创建日期:2024年05月20日
  639. * 注 意:
  640. *********************************************************************************************************/
  641. int main(void)
  642. {
  643. uint8_t i = 0;
  644. uint8_t j = 0;
  645. uint8_t cnt = 0;
  646. uint32_t temp0 = 0;
  647. uint8_t temp1 = 0;
  648. uint8_t temp2 = 0;
  649. uint32_t temp3 = 0;
  650. uint8_t temp4 = 0;
  651. uint32_t temp_da[8] = {0};
  652. uint32_t temp5 = 0;
  653. uint32_t temp6 = 0;
  654. uint32_t temp7 = 0;
  655. Wr_eeprom_cnt = 0;
  656. Wr_erom_wait_cnt = 0;
  657. Load_conn_end_flag = false;
  658. AC3PPDU_active_chn = Output_ChN_default;
  659. for(i = 0;i < AC3PPDU_active_chn;i++)
  660. {
  661. RL_begin_delay_flag[i] = 0;
  662. RL_end_delay_flag[i] = 0;
  663. }
  664. // Ch N RELAY delay add by liyi
  665. RL_N_begin_delay_flag = 0; //add by liyi
  666. RL_N_end_delay_flag = 0; //add by liyi
  667. InitHardware(); //初始化硬件相关函数
  668. AC3PPDU_SlaveAddress = ReadKeyValue(); //读取从机的地址
  669. InitSoftware(); //初始化软件相关函数
  670. Devid_IDChalNum = AC3PPDU_Device_ID;
  671. Devid_IDChalNum = Devid_IDChalNum << 8;
  672. Devid_IDChalNum += Output_ChN_default;
  673. AC3PPDU_Modbus_Reg[Mb_Dbuff_DevAddr] = Devid_IDChalNum;
  674. AC3PPDU_RL_time[CH_in].LT_state = AC3PPDU_Modbus_Reg[Mb_Dbuff_LT_ST_Addr];
  675. AC3PPDU_RL_time[CH_in].FT_state = AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr];
  676. LimiT_enable_check(CH_in,AC3PPDU_RL_time[CH_in].LT_state);
  677. Enable_74hc573_Output;
  678. for(i = 0;i < Output_ChN_default;i++)
  679. {
  680. RL_last_state[i] = 0;
  681. AC3PPDU_RL_time[i + CH1_out].LT_state = AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1LT_ST_Addr + i];
  682. AC3PPDU_RL_time[i + CH1_out].RL_ontime = AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_Ton1_Addr + i];
  683. AC3PPDU_RL_time[i + CH1_out].RL_offtime = AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_Toff1_Addr + i];
  684. LimiT_enable_check((i + CH1_out),AC3PPDU_RL_time[i + CH1_out].LT_state);
  685. }
  686. // Ch N add by liyi
  687. RL_N_last_state = 0;
  688. AC3PPDU_RL_N_time.LT_state = AC3PPDU_Modbus_Reg[Mb_Dbuff_CHNLT_ST_Addr]; // add by liyi
  689. AC3PPDU_RL_N_time.RL_offtime = AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_ToffN_Addr]; // add by liyi
  690. AC3PPDU_RL_N_time.RL_ontime = AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_TonN_Addr]; // add by liyi
  691. AC3PPDU_active_chn = Output_ChN_default; //bug
  692. Fault_state_Last = Fault_state_Reg;
  693. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] = AC3PPDU_APlack_Fault + AC3PPDU_BPlack_Fault;
  694. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] += AC3PPDU_CPlack_Fault;
  695. Fwdgt_Init(); //
  696. while(1)
  697. {
  698. //DelayNms(10);
  699. Fwdgt_reload();
  700. key_io_control();
  701. dev_info = (AC3PPDU_Device_ID << 8 | Output_ChN_default);
  702. CHK_JLINK();
  703. eMBPoll();
  704. if(Get1SecFlag()) //判断1s标志状态
  705. {
  706. LEDFlicker2();
  707. Clr1SecFlag(); //清除1s标志
  708. }
  709. if(write_kwh2Eeprom_flag) // 120 second recode
  710. {
  711. write_kwh2Eeprom_flag = 0;
  712. for(i = 0; i < Output_ChN_default ;i++)
  713. {
  714. int temp = i << 2;
  715. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+0] = AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr+i] >> 24;
  716. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+1] = AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr+i] >> 16;
  717. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+2] = AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr+i] >> 8;
  718. Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+3] = AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr+i];
  719. }
  720. AT24CxxWrite(ERom_TotalWh1_Addr,(Eeprom_Rbuf + ERom_TotalWh1_Addr),4*Output_ChN_default);
  721. }
  722. ////故障指示处理/////
  723. if(Fault_state_Reg > 0)
  724. {
  725. if(Fault_state_Reg != Fault_state_Last)
  726. {
  727. //RL_now_state = RL_now_state & (~Fault_state_Reg);
  728. // Write_74hc573(LK_FalseLed_D,Fault_state_Reg);
  729. // Fault_state_Last = Fault_state_Reg;
  730. }
  731. }
  732. else
  733. {
  734. }
  735. //////////////////////////
  736. if(Start_Read_Flag)//读数据
  737. {
  738. Start_Read_Flag = false;
  739. // for(i = 0;i < HT7032_CS;i++)
  740. // {
  741. // // Read_HT7032_data(i);
  742. // //read Hlw8110 eche one data;
  743. //
  744. //
  745. // }
  746. if(kwh_200ms_read_flag)
  747. {
  748. for(int j = 0 ; j < Hlw8110_CS;j++)
  749. {
  750. //if(!reset_hlw8110_flag[j])
  751. read_Hlw8110(j,1);
  752. }
  753. kwh_200ms_read_flag = 0;
  754. }else
  755. {
  756. for(int j = 0 ; j < Hlw8110_CS;j++)
  757. {
  758. //if(!reset_hlw8110_flag[j])
  759. read_Hlw8110(j,0);
  760. }
  761. }
  762. //输入A相电压,平均
  763. AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] = AC3PPDU_Output[CH1_out].AC_V;
  764. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] += AC3PPDU_Output[CH4_out].AC_V;
  765. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] += AC3PPDU_Output[CH7_out].AC_V;
  766. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] /= 3;
  767. //输入B相电压,平均
  768. AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] = AC3PPDU_Output[CH2_out].AC_V;
  769. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] += AC3PPDU_Output[CH5_out].AC_V;
  770. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] += AC3PPDU_Output[CH8_out].AC_V;
  771. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] /= 3;
  772. //输入C相电压,平均
  773. AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] = AC3PPDU_Output[CH3_out].AC_V;
  774. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] += AC3PPDU_Output[CH6_out].AC_V;
  775. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] += AC3PPDU_Output[CH9_out].AC_V;
  776. // AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] /= 3;
  777. //输入A相电流,求和
  778. AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] = AC3PPDU_Output[CH1_out].AC_I;
  779. // AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] += AC3PPDU_Output[CH4_out].AC_I;
  780. // AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] += AC3PPDU_Output[CH7_out].AC_I;
  781. //输入B相电流,求和
  782. AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] = AC3PPDU_Output[CH2_out].AC_I;
  783. // AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] += AC3PPDU_Output[CH5_out].AC_I;
  784. // AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] += AC3PPDU_Output[CH8_out].AC_I;
  785. //输入C相电流,求和
  786. AC3PPDU_Modbus_Reg[Mb_Dbuff_ICP_Addr] = AC3PPDU_Output[CH3_out].AC_I;
  787. // AC3PPDU_Modbus_Reg[Mb_Dbuff_ICP_Addr] += AC3PPDU_Output[CH6_out].AC_I;
  788. // AC3PPDU_Modbus_Reg[Mb_Dbuff_ICP_Addr] += AC3PPDU_Output[CH9_out].AC_I;
  789. //输入A相功率,求和
  790. AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] = AC3PPDU_Output[CH1_out].AC_P;
  791. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] += AC3PPDU_Output[CH4_out].AC_P;
  792. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] += AC3PPDU_Output[CH7_out].AC_P;
  793. //输入B相功率,求和
  794. AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] = AC3PPDU_Output[CH2_out].AC_P;
  795. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] += AC3PPDU_Output[CH5_out].AC_P;
  796. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] += AC3PPDU_Output[CH8_out].AC_P;
  797. //输入C相功率,求和
  798. AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] = AC3PPDU_Output[CH3_out].AC_P;
  799. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] += AC3PPDU_Output[CH6_out].AC_P;
  800. // AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] += AC3PPDU_Output[CH9_out].AC_P;
  801. //输入A相电量,求和
  802. AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] = hlw8110_base[CH1_out] + (hlw8110_store[CH1_out]*1000);
  803. //AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH1_out].AC_kWh;
  804. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH4_out].AC_kWh;
  805. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] += AC3PPDU_Output[CH7_out].AC_kWh;
  806. //输入B相电量,求和
  807. AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] = hlw8110_base[CH2_out] + (hlw8110_store[CH2_out]*1000);
  808. //AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH2_out].AC_kWh;
  809. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH5_out].AC_kWh;
  810. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] += AC3PPDU_Output[CH8_out].AC_kWh;
  811. //输入C相电量,求和
  812. AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] = hlw8110_base[CH3_out] + (hlw8110_store[CH3_out]*1000);
  813. //AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH3_out].AC_kWh;
  814. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH6_out].AC_kWh;
  815. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] += AC3PPDU_Output[CH9_out].AC_kWh;
  816. // for(i =0; i < Output_ChN_default;i++)
  817. // {
  818. // temp0 = i << 2;
  819. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr + i] += (Eeprom_Rbuf [ERom_TotalWh1_Addr +temp0+0] << 24);
  820. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr + i] += (Eeprom_Rbuf [ERom_TotalWh1_Addr +temp0+1] << 16);
  821. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr + i] += (Eeprom_Rbuf [ERom_TotalWh1_Addr +temp0+2] << 8);
  822. // AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr + i] += (Eeprom_Rbuf [ERom_TotalWh1_Addr +temp0+3]);
  823. // }
  824. // jugement is or not lack pose
  825. for(i = 0;i < (Output_ChN_default + 1);i++)
  826. {
  827. Fault_state_process(i);
  828. }
  829. RL_Over_Func();
  830. //
  831. 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))
  832. {
  833. Fault_lack_phase_flag = true;
  834. }
  835. else
  836. {
  837. Fault_lack_phase_flag = false;
  838. }
  839. for(i = 0;i < Output_ChN_default;i++)
  840. {
  841. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_CH1FT_ST_Addr + i] > 0)
  842. {
  843. Fault_state_Reg = Fault_state_Reg | (0x0001 << i);
  844. }
  845. else
  846. {
  847. Fault_state_Reg = Fault_state_Reg & (~(0x0001 << i));
  848. }
  849. }
  850. }
  851. //////////////////////////
  852. MODbus_CMD_New();
  853. //MODbus_CMD();
  854. }
  855. }
  856. static void MODbus_CMD_New(void)
  857. {
  858. if(Modbus_Wr_buff[Wr_eeprom_cnt][0] > 0)
  859. {
  860. uint8_t i = 0;
  861. uint32_t temp_addr;
  862. uint32_t base_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1];
  863. uint32_t data = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  864. uint32_t value = 0;
  865. switch(base_addr)
  866. {
  867. case Mb_Dbuff_ViLit_max_Addr ... Mb_Dbuff_kWhiLit_max_Addr: //input votage max votage min current power coustermer add by liyi
  868. {
  869. temp_addr = base_addr - Mb_Dbuff_ViLit_max_Addr;
  870. temp_addr = temp_addr << 2;
  871. temp_addr += ERom_ViLit_max_Addr;
  872. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  873. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  874. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  875. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  876. AC3PPDU_Modbus_Reg[base_addr] = data;
  877. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  878. }
  879. break;
  880. 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
  881. {
  882. temp_addr = base_addr - Mb_Dbuff_VLit1_max_Addr;
  883. value = temp_addr;
  884. temp_addr = temp_addr << 2;
  885. temp_addr += ERom_VLit1_max_Addr;
  886. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  887. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  888. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  889. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  890. AC3PPDU_Modbus_Reg[base_addr] = data;
  891. if(AC3PPDU_Modbus_Reg[base_addr] < THRESHOULD_JUDGMENT)
  892. {
  893. AC3PPDU_RL_time[value + CH1_out].LT_state &= (Shield_Vmax_Threshould_Disable);
  894. LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
  895. }
  896. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  897. }
  898. break;
  899. 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
  900. {
  901. temp_addr = base_addr - Mb_Dbuff_VLit1_min_Addr;
  902. value = temp_addr;
  903. temp_addr = temp_addr << 2;
  904. temp_addr += ERom_VLit1_min_Addr;
  905. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  906. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  907. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  908. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  909. AC3PPDU_Modbus_Reg[base_addr] = data;
  910. if(AC3PPDU_Modbus_Reg[base_addr] < THRESHOULD_JUDGMENT)
  911. {
  912. AC3PPDU_RL_time[value + CH1_out].LT_state &= (Shield_Vmin_Threshould_Disable);
  913. LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
  914. }
  915. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  916. }
  917. break;
  918. 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
  919. {
  920. temp_addr = base_addr - Mb_Dbuff_ILit1_max_Addr;
  921. value = temp_addr;
  922. temp_addr = temp_addr << 2;
  923. temp_addr += ERom_ILit1_max_Addr;
  924. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  925. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  926. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  927. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  928. AC3PPDU_Modbus_Reg[base_addr] = data;
  929. if(AC3PPDU_Modbus_Reg[base_addr] < THRESHOULD_JUDGMENT)
  930. {
  931. AC3PPDU_RL_time[value + CH1_out].LT_state &= (Shield_Imax_Threshould_Disable);
  932. LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
  933. }
  934. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  935. }
  936. break;
  937. case Mb_Dbuff_WLit1_max_Addr ... Mb_Dbuff_WLit9_max_Addr: //output power max .....
  938. {
  939. temp_addr = base_addr - Mb_Dbuff_WLit1_max_Addr;
  940. value = temp_addr;
  941. temp_addr = temp_addr << 2;
  942. temp_addr += ERom_WLit1_max_Addr;
  943. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  944. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  945. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  946. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  947. AC3PPDU_Modbus_Reg[base_addr] = data;
  948. if(AC3PPDU_Modbus_Reg[base_addr] < THRESHOULD_JUDGMENT)
  949. {
  950. AC3PPDU_RL_time[value + CH1_out].LT_state &= (Shield_Wmax_Threshould_Disable);
  951. LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
  952. }
  953. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  954. }
  955. break;
  956. case Mb_Dbuff_kWhLit1_max_Addr ... Mb_Dbuff_kWhLit9_max_Addr: //output customers max .....
  957. {
  958. temp_addr = base_addr - Mb_Dbuff_kWhLit1_max_Addr;
  959. value = temp_addr;
  960. temp_addr = temp_addr << 2;
  961. temp_addr += ERom_kWhLit1_max_Addr;
  962. Eeprom_Rbuf[temp_addr + 0] = data >> 24;
  963. Eeprom_Rbuf[temp_addr + 1] = data >> 16;
  964. Eeprom_Rbuf[temp_addr + 2] = data >> 8;
  965. Eeprom_Rbuf[temp_addr + 3] = data >> 0;
  966. AC3PPDU_Modbus_Reg[base_addr] = data;
  967. if(AC3PPDU_Modbus_Reg[base_addr] < THRESHOULD_JUDGMENT)
  968. {
  969. AC3PPDU_RL_time[value + CH1_out].LT_state &= (Shield_Kwhmax_Threshould_Disable);
  970. LimiT_enable_check((value + CH1_out),AC3PPDU_RL_time[value + CH1_out].LT_state);
  971. }
  972. AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  973. }
  974. break;
  975. case Mb_Dbuff_RL_Allon_Addr: //relay all on
  976. {
  977. RL_Allon_flag = true;
  978. for(i = 0;i < Output_ChN_default;i++)
  979. {
  980. temp_addr = i << 1;
  981. Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x41;
  982. AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
  983. }
  984. AT24CxxWrite(ERom_CH1LT_ST_Addr,(Eeprom_Rbuf + ERom_CH1LT_ST_Addr),(2*Output_ChN_default));
  985. Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x41;
  986. AC3PPDU_RL_N_time.LT_state = Eeprom_Rbuf[ERom_CHNLT_ST_Addr];
  987. AT24CxxWrite(ERom_CHNLT_ST_Addr,(Eeprom_Rbuf + ERom_CHNLT_ST_Addr),2);
  988. }
  989. break;
  990. case Mb_Dbuff_RL_Alloff_Addr: //relay all off
  991. {
  992. RL_Alloff_flag = true;
  993. for(i = 0;i < Output_ChN_default;i++)
  994. {
  995. temp_addr = i << 1;
  996. Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x80;
  997. Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] & 0xfe;
  998. AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
  999. }
  1000. AT24CxxWrite(ERom_CH1LT_ST_Addr,(Eeprom_Rbuf + ERom_CH1LT_ST_Addr),(2*Output_ChN_default));
  1001. Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x80;
  1002. Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] & 0xfe;
  1003. AC3PPDU_RL_N_time.LT_state = Eeprom_Rbuf[ERom_CHNLT_ST_Addr];
  1004. AT24CxxWrite(ERom_CHNLT_ST_Addr,(Eeprom_Rbuf + ERom_CHNLT_ST_Addr),2);
  1005. }
  1006. break;
  1007. case Mb_Dbuff_LT_ST_Addr: //set input status
  1008. {
  1009. AC3PPDU_RL_time[CH_in].LT_state = data;
  1010. Eeprom_Rbuf[ERom_LT_ST_Addr] = data;
  1011. AC3PPDU_Modbus_Reg[base_addr] = data;
  1012. AT24CxxWriteOneByte(ERom_LT_ST_Addr,Eeprom_Rbuf[ERom_LT_ST_Addr]);
  1013. LimiT_enable_check(CH_in,AC3PPDU_RL_time[CH_in].LT_state);
  1014. }
  1015. break;
  1016. case Mb_Dbuff_CH1LT_ST_Addr ... Mb_Dbuff_CHNLT_ST_Addr: //set output relay statues
  1017. {
  1018. temp_addr = base_addr - Mb_Dbuff_CH1LT_ST_Addr;
  1019. // if(temp_addr == 9) { //Ch N
  1020. // AC3PPDU_RL_N_time.LT_state = data;
  1021. // }else{
  1022. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
  1023. {
  1024. data &= (Shield_Vmax_Threshould_Disable);
  1025. }
  1026. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + temp_addr] < THRESHOULD_JUDGMENT)
  1027. {
  1028. data &= (Shield_Vmin_Threshould_Disable);
  1029. }
  1030. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
  1031. {
  1032. data &= (Shield_Imax_Threshould_Disable);
  1033. }
  1034. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
  1035. {
  1036. data &= (Shield_Wmax_Threshould_Disable);
  1037. }
  1038. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
  1039. {
  1040. data &= (Shield_Kwhmax_Threshould_Disable);
  1041. }
  1042. AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = data;
  1043. LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
  1044. // }
  1045. temp_addr = temp_addr << 1;
  1046. temp_addr += ERom_CH1LT_ST_Addr;
  1047. Eeprom_Rbuf[temp_addr] = data;
  1048. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1049. }
  1050. break;
  1051. case Mb_Dbuff_OUTCH1_ST_Addr ... Mb_Dbuff_OUTCH3_ST_Addr: //set output channel relay's status
  1052. {
  1053. temp_addr = base_addr - Mb_Dbuff_OUTCH1_ST_Addr;
  1054. OutUnit_control_flag[temp_addr] = 1;
  1055. temp_addr *= 3;
  1056. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
  1057. {
  1058. data &= (Shield_Vmax_Threshould_Disable);
  1059. }
  1060. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + temp_addr] < THRESHOULD_JUDGMENT)
  1061. {
  1062. data &= (Shield_Vmin_Threshould_Disable);
  1063. }
  1064. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
  1065. {
  1066. data &= (Shield_Imax_Threshould_Disable);
  1067. }
  1068. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
  1069. {
  1070. data &= (Shield_Wmax_Threshould_Disable);
  1071. }
  1072. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + temp_addr] < THRESHOULD_JUDGMENT)
  1073. {
  1074. data &= (Shield_Kwhmax_Threshould_Disable);
  1075. }
  1076. AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = data;
  1077. AC3PPDU_RL_time[temp_addr + CH2_out].LT_state = data;
  1078. AC3PPDU_RL_time[temp_addr + CH3_out].LT_state = data;
  1079. LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
  1080. LimiT_enable_check((temp_addr + CH2_out),AC3PPDU_RL_time[temp_addr + CH2_out].LT_state);
  1081. LimiT_enable_check((temp_addr + CH3_out),AC3PPDU_RL_time[temp_addr + CH3_out].LT_state);
  1082. temp_addr = temp_addr << 1;
  1083. Eeprom_Rbuf[temp_addr + ERom_CH1LT_ST_Addr] = data;
  1084. Eeprom_Rbuf[temp_addr + ERom_CH2LT_ST_Addr] = data;
  1085. Eeprom_Rbuf[temp_addr + ERom_CH3LT_ST_Addr] = data;
  1086. AT24CxxWriteOneByte(temp_addr + ERom_CH1LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH1LT_ST_Addr]);
  1087. AT24CxxWriteOneByte(temp_addr + ERom_CH2LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH2LT_ST_Addr]);
  1088. AT24CxxWriteOneByte(temp_addr + ERom_CH3LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH3LT_ST_Addr]);
  1089. /*
  1090. AC3PPDU_RL_time[CH7_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1091. AC3PPDU_RL_time[CH8_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1092. AC3PPDU_RL_time[CH9_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1093. LimiT_enable_check((CH7_out - temp_addr),AC3PPDU_RL_time[CH7_out - temp_addr].LT_state);
  1094. LimiT_enable_check((CH8_out - temp_addr),AC3PPDU_RL_time[CH8_out - temp_addr].LT_state);
  1095. LimiT_enable_check((CH9_out - temp_addr),AC3PPDU_RL_time[CH9_out - temp_addr].LT_state);
  1096. temp_addr = temp_addr << 1;
  1097. Eeprom_Rbuf[ERom_CH7LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1098. Eeprom_Rbuf[ERom_CH8LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1099. Eeprom_Rbuf[ERom_CH9LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1100. AT24CxxWriteOneByte(ERom_CH7LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH7LT_ST_Addr - temp_addr]);
  1101. AT24CxxWriteOneByte(ERom_CH8LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH8LT_ST_Addr - temp_addr]);
  1102. AT24CxxWriteOneByte(ERom_CH9LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH9LT_ST_Addr - temp_addr]);*/
  1103. }
  1104. break;
  1105. 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
  1106. {
  1107. temp_addr = base_addr - Mb_Dbuff_RL_Ton1_Addr;
  1108. if(temp_addr == 9){ //Ch N add by liyi
  1109. AC3PPDU_RL_N_time.RL_ontime = data;
  1110. }else
  1111. {
  1112. AC3PPDU_RL_time[temp_addr + CH1_out].RL_ontime = data;
  1113. }
  1114. AC3PPDU_RL_N_time.RL_ontime = data;
  1115. temp_addr += ERom_RL_Ton1_Addr;
  1116. Eeprom_Rbuf[temp_addr] = data;
  1117. Eeprom_Rbuf[ERom_RL_TonN_Addr] = data;
  1118. AC3PPDU_Modbus_Reg[base_addr] = Eeprom_Rbuf[temp_addr];
  1119. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_TonN_Addr] = Eeprom_Rbuf[ERom_RL_TonN_Addr];
  1120. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1121. AT24CxxWriteOneByte(ERom_RL_TonN_Addr,Eeprom_Rbuf[ERom_RL_TonN_Addr]);
  1122. }
  1123. break;
  1124. 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
  1125. {
  1126. temp_addr = base_addr - Mb_Dbuff_RL_Toff1_Addr;
  1127. if(temp_addr == 9){
  1128. AC3PPDU_RL_N_time.RL_offtime = data;
  1129. }else {
  1130. AC3PPDU_RL_time[temp_addr + CH1_out].RL_offtime = data;
  1131. }
  1132. AC3PPDU_RL_N_time.RL_offtime = data;
  1133. temp_addr += ERom_RL_Toff1_Addr;
  1134. Eeprom_Rbuf[temp_addr] = data;
  1135. Eeprom_Rbuf[ERom_RL_ToffN_Addr] = data;
  1136. AC3PPDU_Modbus_Reg[base_addr] = Eeprom_Rbuf[temp_addr];
  1137. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_ToffN_Addr] = Eeprom_Rbuf[ERom_RL_ToffN_Addr];
  1138. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1139. AT24CxxWriteOneByte(ERom_RL_ToffN_Addr,Eeprom_Rbuf[ERom_RL_ToffN_Addr]);
  1140. }
  1141. break;
  1142. case Mb_Dbuff_RL_Over_Ch1_Func ... Mb_Dbuff_RL_Over_Ch9_Func: //threod over limit operation
  1143. {
  1144. temp_addr = base_addr - Mb_Dbuff_RL_Over_Ch1_Func;
  1145. temp_addr += ERom_RL_Over_Ch1_Addr;
  1146. Eeprom_Rbuf[temp_addr] = data;
  1147. AC3PPDU_Modbus_Reg[base_addr] = Eeprom_Rbuf[temp_addr];
  1148. AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1149. }
  1150. break;
  1151. case Mb_Dbuff_Clear_Chn1_Consumer ... Mb_Dbuff_Clear_Chn9_Consumer:
  1152. {
  1153. if(data)
  1154. {
  1155. temp_addr = base_addr - Mb_Dbuff_Clear_Chn1_Consumer;
  1156. // uint8_t value = temp_addr;
  1157. //Hlw8110_Flash_value[temp_addr+CH1_out] = AC3PPDU_Output[temp_addr+CH1_out].AC_kWh;
  1158. //Hlw8110_Flash_value[temp_addr+CH1_out] = Hlw8110_Flash_Backup[temp_addr+CH1_out];
  1159. //hlw8110_base[temp_addr+CH1_out] = 0;
  1160. // temp_addr = temp_addr << 2;
  1161. // temp_addr += ERom_TotalWh1_Addr;
  1162. // Eeprom_Rbuf[temp_addr+0] = 0;
  1163. // Eeprom_Rbuf[temp_addr+1] = 0;
  1164. // Eeprom_Rbuf[temp_addr+2] = 0;
  1165. // Eeprom_Rbuf[temp_addr+3] = 0;
  1166. // channel_reset(temp_addr+CH1_out);
  1167. // InitUART1(9600);
  1168. // hlw8110_init(value+CH1_out);
  1169. // reset_hlw8110_flag[value] = 0;
  1170. // AT24CxxWrite(temp_addr,Eeprom_Rbuf+temp_addr,4);
  1171. //HLW8110_BasekWh[temp_addr+CH1_out] = 0;
  1172. hlw8110_base[temp_addr+CH1_out] = 0;
  1173. hlw8110_store[temp_addr+CH1_out] = 0.0;
  1174. }
  1175. }
  1176. case Mb_Dbuff_Clear_Chnall_Consumer:
  1177. {
  1178. if(data){
  1179. // for(i = 0; i < Output_ChN_default ;i++)
  1180. // {
  1181. // int temp = i << 2;
  1182. // //Hlw8110_Flash_value[i+CH1_out] = AC3PPDU_Output[i+CH1_out].AC_kWh;
  1183. // //Hlw8110_Flash_value[i+CH1_out] = Hlw8110_Flash_Backup[i+CH1_out];
  1184. // Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+0] = 0;
  1185. // Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+1] = 0;
  1186. // Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+2] = 0;
  1187. // Eeprom_Rbuf[ERom_TotalWh1_Addr+temp+3] = 0;
  1188. // hlw8110_base[i+CH1_out] = 0;
  1189. // channel_reset(i+CH1_out);
  1190. // }
  1191. // InitUART1(9600);
  1192. // //InitCH448F();
  1193. // for(i = 0; i < Output_ChN_default ;i++)
  1194. // {
  1195. // //hlw8110_init(i+CH1_out);
  1196. // //reset_hlw8110_flag[i] = 0;
  1197. //
  1198. // }
  1199. // AT24CxxWrite(ERom_TotalWh1_Addr,(Eeprom_Rbuf + ERom_TotalWh1_Addr),4*Output_ChN_default);
  1200. for(i = 0; i < Output_ChN_default;i++)
  1201. {
  1202. //HLW8110_BasekWh[CH1_out+i] = 0;
  1203. hlw8110_base[i+CH1_out] = 0;
  1204. hlw8110_store[i+CH1_out] = 0.0;
  1205. }
  1206. }
  1207. }
  1208. break;
  1209. default:
  1210. break;
  1211. }
  1212. Modbus_Wr_buff[Wr_eeprom_cnt][0] = 0;
  1213. Wr_eeprom_begin_flag = true;
  1214. }
  1215. Wr_eeprom_cnt++;
  1216. if(Wr_eeprom_cnt >= Mb_Wcmd_Width)
  1217. {
  1218. Wr_eeprom_cnt = 0;
  1219. }
  1220. }
  1221. /*********************************************************************************************************
  1222. * 函数名称:MODbus_CMD
  1223. * 函数功能:modbus命令池处理
  1224. * 输入参数:void
  1225. * 输出参数:void
  1226. * 返 回 值:void
  1227. * 创建日期:2024年05月06日
  1228. * 注 意:
  1229. *********************************************************************************************************/
  1230. //static void MODbus_CMD(void)
  1231. //{
  1232. // if(Modbus_Wr_buff[Wr_eeprom_cnt][0] > 0)
  1233. // {
  1234. // uint8_t i = 0;
  1235. // uint32_t temp_addr;
  1236. // if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_ViLit_max_Addr)//此地址内不可操作
  1237. // {
  1238. // ;
  1239. // }
  1240. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_ViLit_max_Addr)//设置输入电压最大阈值
  1241. // {
  1242. // Eeprom_Rbuf[ERom_ViLit_max_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1243. // Eeprom_Rbuf[ERom_ViLit_max_Addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1244. // Eeprom_Rbuf[ERom_ViLit_max_Addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1245. // Eeprom_Rbuf[ERom_ViLit_max_Addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1246. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1247. // AT24CxxWrite(ERom_ViLit_max_Addr,(Eeprom_Rbuf + ERom_ViLit_max_Addr),4);
  1248. // }
  1249. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_ViLit_min_Addr)//设置输入电压最小阈值
  1250. // {
  1251. // Eeprom_Rbuf[ERom_ViLit_min_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1252. // Eeprom_Rbuf[ERom_ViLit_min_Addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1253. // Eeprom_Rbuf[ERom_ViLit_min_Addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1254. // Eeprom_Rbuf[ERom_ViLit_min_Addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1255. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1256. // AT24CxxWrite(ERom_ViLit_min_Addr,(Eeprom_Rbuf + ERom_ViLit_min_Addr),4);
  1257. // }
  1258. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_IiLit_max_Addr)//设置输入电流最大阈值
  1259. // {
  1260. // Eeprom_Rbuf[ERom_IiLit_max_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1261. // Eeprom_Rbuf[ERom_IiLit_max_Addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1262. // Eeprom_Rbuf[ERom_IiLit_max_Addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1263. // Eeprom_Rbuf[ERom_IiLit_max_Addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1264. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1265. // AT24CxxWrite(ERom_IiLit_max_Addr,(Eeprom_Rbuf + ERom_IiLit_max_Addr),4);
  1266. // }
  1267. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_WiLit_max_Addr)//设置输入功率最大阈值
  1268. // {
  1269. // Eeprom_Rbuf[ERom_WiLit_max_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1270. // Eeprom_Rbuf[ERom_WiLit_max_Addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1271. // Eeprom_Rbuf[ERom_WiLit_max_Addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1272. // Eeprom_Rbuf[ERom_WiLit_max_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(ERom_WiLit_max_Addr,(Eeprom_Rbuf + ERom_WiLit_max_Addr),4);
  1275. // }
  1276. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_kWhiLit_max_Addr)//设置输入电量最大阈值
  1277. // {
  1278. // Eeprom_Rbuf[ERom_kWhiLit_max_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1279. // Eeprom_Rbuf[ERom_kWhiLit_max_Addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1280. // Eeprom_Rbuf[ERom_kWhiLit_max_Addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1281. // Eeprom_Rbuf[ERom_kWhiLit_max_Addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1282. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1283. // AT24CxxWrite(ERom_kWhiLit_max_Addr,(Eeprom_Rbuf + ERom_kWhiLit_max_Addr),4);
  1284. // }
  1285. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_VLit1_min_Addr)//设置输出电压最大阈值
  1286. // {
  1287. // temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_VLit1_max_Addr;
  1288. // temp_addr = temp_addr << 2;
  1289. // temp_addr += ERom_VLit1_max_Addr;
  1290. // Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1291. // Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1292. // Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1293. // Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1294. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1295. // AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  1296. // }
  1297. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_ILit1_max_Addr)//设置输出电压最小阈值
  1298. // {
  1299. // temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_VLit1_min_Addr;
  1300. // temp_addr = temp_addr << 2;
  1301. // temp_addr += ERom_VLit1_min_Addr;
  1302. // Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1303. // Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1304. // Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1305. // Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1306. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1307. // AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  1308. // }
  1309. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_WLit1_max_Addr)//设置输出电流最大阈值
  1310. // {
  1311. // temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_ILit1_max_Addr;
  1312. // temp_addr = temp_addr << 2;
  1313. // temp_addr += ERom_ILit1_max_Addr;
  1314. // Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1315. // Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1316. // Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1317. // Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1318. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1319. // AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  1320. // }
  1321. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_kWhLit1_max_Addr)//设置输出功率最大阈值
  1322. // {
  1323. // temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_WLit1_max_Addr;
  1324. // temp_addr = temp_addr << 2;
  1325. // temp_addr += ERom_WLit1_max_Addr;
  1326. // Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1327. // Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1328. // Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1329. // Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1330. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1331. // AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  1332. // }
  1333. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_RL_Allon_Addr)//设置输出电量最大阈值
  1334. // {
  1335. // temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_kWhLit1_max_Addr;
  1336. // temp_addr = temp_addr << 2;
  1337. // temp_addr += ERom_kWhLit1_max_Addr;
  1338. // Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 24;
  1339. // Eeprom_Rbuf[temp_addr + 1] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 16;
  1340. // Eeprom_Rbuf[temp_addr + 2] = Modbus_Wr_buff[Wr_eeprom_cnt][2] >> 8;
  1341. // Eeprom_Rbuf[temp_addr + 3] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1342. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1343. // AT24CxxWrite(temp_addr,(Eeprom_Rbuf + temp_addr),4);
  1344. // }
  1345. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_RL_Allon_Addr)//设置全开
  1346. // {
  1347. // RL_Allon_flag = true;
  1348. // for(i = 0;i < Output_ChN_default;i++)
  1349. // {
  1350. // temp_addr = i << 1;
  1351. // Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x41;
  1352. // AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
  1353. // }
  1354. // AT24CxxWrite(ERom_CH1LT_ST_Addr,(Eeprom_Rbuf + ERom_CH1LT_ST_Addr),(2*Output_ChN_default));
  1355. // //iic_allopen();
  1356. // Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x41;
  1357. // //Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x01;
  1358. // AC3PPDU_RL_N_time.LT_state = Eeprom_Rbuf[ERom_CHNLT_ST_Addr];
  1359. // AT24CxxWrite(ERom_CHNLT_ST_Addr,(Eeprom_Rbuf + ERom_CHNLT_ST_Addr),2);
  1360. //
  1361. // }
  1362. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_RL_Alloff_Addr)//设置全关
  1363. // {
  1364. // RL_Alloff_flag = true;
  1365. // for(i = 0;i < Output_ChN_default;i++)
  1366. // {
  1367. // temp_addr = i << 1;
  1368. // Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] | 0x80;
  1369. // Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr] & 0xfe;
  1370. // AC3PPDU_RL_time[i + CH1_out].LT_state = Eeprom_Rbuf[ERom_CH1LT_ST_Addr + temp_addr];
  1371. // }
  1372. ////
  1373. // AT24CxxWrite(ERom_CH1LT_ST_Addr,(Eeprom_Rbuf + ERom_CH1LT_ST_Addr),(2*Output_ChN_default));
  1374. // //iic_allclose();
  1375. // Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] | 0x80;
  1376. // Eeprom_Rbuf[ERom_CHNLT_ST_Addr] = Eeprom_Rbuf[ERom_CHNLT_ST_Addr] & 0xfe;
  1377. // AC3PPDU_RL_N_time.LT_state = Eeprom_Rbuf[ERom_CHNLT_ST_Addr];
  1378. //
  1379. // AT24CxxWrite(ERom_CHNLT_ST_Addr,(Eeprom_Rbuf + ERom_CHNLT_ST_Addr),2);
  1380. // }
  1381. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] == Mb_Dbuff_LT_ST_Addr)//设置输入状态
  1382. // {
  1383. // AC3PPDU_RL_time[CH_in].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1384. // Eeprom_Rbuf[ERom_LT_ST_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1385. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1386. // AT24CxxWriteOneByte(ERom_LT_ST_Addr,Eeprom_Rbuf[ERom_LT_ST_Addr]);
  1387. // LimiT_enable_check(CH_in,AC3PPDU_RL_time[CH_in].LT_state);
  1388. // }
  1389. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_OUTCH1_ST_Addr)//设置单通道继电器状态
  1390. // {
  1391. // temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_CH1LT_ST_Addr;
  1392. // if(temp_addr == 9) { //Ch N
  1393. // AC3PPDU_RL_N_time.LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1394. // }else{
  1395. // AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1396. // LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
  1397. // }
  1398. // temp_addr = temp_addr << 1;
  1399. // temp_addr += ERom_CH1LT_ST_Addr;
  1400. // Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1401. // AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1402. // }
  1403. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_RL_Ton1_Addr)//设置输出通道继电器状态
  1404. // {
  1405. // temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_OUTCH1_ST_Addr;
  1406. // OutUnit_control_flag[temp_addr] = 1;
  1407. // temp_addr *= 3;
  1408. //
  1409. // AC3PPDU_RL_time[temp_addr + CH1_out].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1410. // AC3PPDU_RL_time[temp_addr + CH2_out].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1411. // AC3PPDU_RL_time[temp_addr + CH3_out].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1412. //
  1413. // LimiT_enable_check((temp_addr + CH1_out),AC3PPDU_RL_time[temp_addr + CH1_out].LT_state);
  1414. // LimiT_enable_check((temp_addr + CH2_out),AC3PPDU_RL_time[temp_addr + CH2_out].LT_state);
  1415. // LimiT_enable_check((temp_addr + CH3_out),AC3PPDU_RL_time[temp_addr + CH3_out].LT_state);
  1416. //
  1417. // temp_addr = temp_addr << 1;
  1418. // Eeprom_Rbuf[temp_addr + ERom_CH1LT_ST_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1419. // Eeprom_Rbuf[temp_addr + ERom_CH2LT_ST_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1420. // Eeprom_Rbuf[temp_addr + ERom_CH3LT_ST_Addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1421. //
  1422. // AT24CxxWriteOneByte(temp_addr + ERom_CH1LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH1LT_ST_Addr]);
  1423. // AT24CxxWriteOneByte(temp_addr + ERom_CH2LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH2LT_ST_Addr]);
  1424. // AT24CxxWriteOneByte(temp_addr + ERom_CH3LT_ST_Addr,Eeprom_Rbuf[temp_addr + ERom_CH3LT_ST_Addr]);
  1425. //
  1426. // /*
  1427. // AC3PPDU_RL_time[CH7_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1428. // AC3PPDU_RL_time[CH8_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1429. // AC3PPDU_RL_time[CH9_out - temp_addr].LT_state = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1430. //
  1431. // LimiT_enable_check((CH7_out - temp_addr),AC3PPDU_RL_time[CH7_out - temp_addr].LT_state);
  1432. // LimiT_enable_check((CH8_out - temp_addr),AC3PPDU_RL_time[CH8_out - temp_addr].LT_state);
  1433. // LimiT_enable_check((CH9_out - temp_addr),AC3PPDU_RL_time[CH9_out - temp_addr].LT_state);
  1434. //
  1435. // temp_addr = temp_addr << 1;
  1436. // Eeprom_Rbuf[ERom_CH7LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1437. // Eeprom_Rbuf[ERom_CH8LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1438. // Eeprom_Rbuf[ERom_CH9LT_ST_Addr - temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1439. //
  1440. // AT24CxxWriteOneByte(ERom_CH7LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH7LT_ST_Addr - temp_addr]);
  1441. // AT24CxxWriteOneByte(ERom_CH8LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH8LT_ST_Addr - temp_addr]);
  1442. // AT24CxxWriteOneByte(ERom_CH9LT_ST_Addr - temp_addr,Eeprom_Rbuf[ERom_CH9LT_ST_Addr - temp_addr]);*/
  1443. // }
  1444. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] < Mb_Dbuff_RL_Toff1_Addr)//设置开启延时
  1445. // {
  1446. // temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_RL_Ton1_Addr;
  1447. // if(temp_addr == 9){ //Ch N add by liyi
  1448. // AC3PPDU_RL_N_time.RL_ontime = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1449. // }else
  1450. // {
  1451. // AC3PPDU_RL_time[temp_addr + CH1_out].RL_ontime = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1452. // }
  1453. // temp_addr += ERom_RL_Ton1_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. // else if(Modbus_Wr_buff[Wr_eeprom_cnt][1] <= Mb_Dbuff_RL_ToffN_Addr)//设置继电器关断延时
  1459. // {
  1460. // temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_RL_Toff1_Addr;
  1461. // if(temp_addr == 9){
  1462. // AC3PPDU_RL_N_time.RL_offtime = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1463. // }else {
  1464. // AC3PPDU_RL_time[temp_addr + CH1_out].RL_offtime = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1465. // }
  1466. //
  1467. // temp_addr += ERom_RL_Toff1_Addr;
  1468. // Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1469. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Eeprom_Rbuf[temp_addr];
  1470. // AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1471. // }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)
  1472. // {
  1473. // temp_addr = Modbus_Wr_buff[Wr_eeprom_cnt][1] - Mb_Dbuff_RL_Over_Ch1_Func;
  1474. // temp_addr += ERom_RL_Over_Ch1_Addr;
  1475. // Eeprom_Rbuf[temp_addr] = Modbus_Wr_buff[Wr_eeprom_cnt][2];
  1476. // AC3PPDU_Modbus_Reg[Modbus_Wr_buff[Wr_eeprom_cnt][1]] = Eeprom_Rbuf[temp_addr];
  1477. // AT24CxxWriteOneByte(temp_addr,Eeprom_Rbuf[temp_addr]);
  1478. // }
  1479. // Modbus_Wr_buff[Wr_eeprom_cnt][0] = 0;
  1480. // Wr_eeprom_begin_flag = true;
  1481. // }
  1482. // Wr_eeprom_cnt++;
  1483. // if(Wr_eeprom_cnt >= Mb_Wcmd_Width)
  1484. // {
  1485. // Wr_eeprom_cnt = 0;
  1486. // }
  1487. //}
  1488. /*********************************************************************************************************
  1489. * 函数名称:LimiT_enable_check
  1490. * 函数功能:输入和各输出通道标识位检查
  1491. * 输入参数:chx:第x通道或输入通道;Lt_v:对应通道的状态标识值
  1492. * 输出参数:void
  1493. * 返 回 值:void
  1494. * 创建日期:2024年05月06日
  1495. * 注 意:
  1496. *********************************************************************************************************/
  1497. static void LimiT_enable_check(uint8_t ch_x,uint32_t Lt_v)
  1498. {
  1499. uint16_t temp0 = 0;
  1500. temp0 = Lt_v >> 1;
  1501. if(ch_x > 3)
  1502. {
  1503. return;
  1504. }
  1505. //通道最大电压
  1506. if((temp0 & AC3PPDU_Vmax_LT_enable) == AC3PPDU_Vmax_LT_enable)
  1507. {
  1508. AC3PPDU_Vmax_LTen_flag[ch_x] = 1;
  1509. }
  1510. else
  1511. {
  1512. AC3PPDU_Vmax_LTen_flag[ch_x] = 0;
  1513. }
  1514. //最小电压
  1515. if((temp0 & AC3PPDU_Vmin_LT_enable) == AC3PPDU_Vmin_LT_enable)
  1516. {
  1517. AC3PPDU_Vmin_LTen_flag[ch_x] = 1;
  1518. }
  1519. else
  1520. {
  1521. AC3PPDU_Vmin_LTen_flag[ch_x] = 0;
  1522. }
  1523. //最大电流
  1524. if((temp0 & AC3PPDU_Imax_LT_enable) == AC3PPDU_Imax_LT_enable)
  1525. {
  1526. AC3PPDU_Imax_LTen_flag[ch_x] = 1;
  1527. }
  1528. else
  1529. {
  1530. AC3PPDU_Imax_LTen_flag[ch_x] = 0;
  1531. }
  1532. //最大功率
  1533. if((temp0 & AC3PPDU_Wmax_LT_enable) == AC3PPDU_Wmax_LT_enable)
  1534. {
  1535. AC3PPDU_Wmax_LTen_flag[ch_x] = 1;
  1536. }
  1537. else
  1538. {
  1539. AC3PPDU_Wmax_LTen_flag[ch_x] = 0;
  1540. }
  1541. //最大电量
  1542. if((temp0 & AC3PPDU_kWhmax_LT_enable) == AC3PPDU_kWhmax_LT_enable)
  1543. {
  1544. AC3PPDU_kWhmax_LTen_flag[ch_x] = 1;
  1545. }
  1546. else
  1547. {
  1548. AC3PPDU_kWhmax_LTen_flag[ch_x] = 0;
  1549. }
  1550. }
  1551. /*********************************************************************************************************
  1552. * 函数名称:Fault_state_process
  1553. * 函数功能:输入和各输出通道的故障状态处理
  1554. * 输入参数:void
  1555. * 输出参数:void
  1556. * 返 回 值:void
  1557. * 创建日期:2024年05月06日
  1558. * 注 意:
  1559. *********************************************************************************************************/
  1560. static void Fault_state_process(uint8_t ch_x)
  1561. {
  1562. uint16_t i = 0;
  1563. if(ch_x != CH_in)
  1564. i = (ch_x -1)<< 3;
  1565. if(ch_x == CH_in)
  1566. {
  1567. uint32_t sort_buff[3] = {0};
  1568. uint32_t Vmax = 0;
  1569. uint32_t Vmin = 0;
  1570. sort_buff[0] = AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr];
  1571. sort_buff[1] = AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr];
  1572. sort_buff[2] = AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr];
  1573. Vmax = (sort_buff[0] >= sort_buff[1]) ? sort_buff[0] :sort_buff[1];
  1574. Vmax = (Vmin >= sort_buff[2]) ? Vmax : sort_buff[2];
  1575. Vmin = (sort_buff[0] <= sort_buff[1]) ? sort_buff[0] :sort_buff[1];
  1576. Vmin = (Vmin <= sort_buff[2]) ? Vmin : sort_buff[2];
  1577. if((Vmin < AC3PPDU_Lack_Voltage) && (Vmax != 0) && (Vmax / AC3PPDU_Lack_Voltage > 3))
  1578. {
  1579. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] < AC3PPDU_Lack_Voltage)
  1580. {
  1581. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackA_Addr] = 1;
  1582. }
  1583. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] < AC3PPDU_Lack_Voltage)
  1584. {
  1585. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackB_Addr] = 1;
  1586. }
  1587. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] < AC3PPDU_Lack_Voltage)
  1588. {
  1589. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackC_Addr] =1;
  1590. }
  1591. }else
  1592. {
  1593. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackA_Addr] = 0;
  1594. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackB_Addr] = 0;
  1595. AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_LackC_Addr] = 0;
  1596. }
  1597. return;
  1598. }
  1599. ////电压最大、最小、缺相阈值使能,进行判断
  1600. if(AC3PPDU_Vmax_LTen_flag[ch_x] > 0)
  1601. {
  1602. if(ch_x > CH_in)//输出通道
  1603. {
  1604. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_max_Addr + ch_x-1])//大于最大
  1605. {
  1606. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_Vmax_Fault;
  1607. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmin_NFault;
  1608. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_RL_Over_Ch1_Func+ch_x-1] & (AC3PPDU_Over_V_Max_Func_enable)) //is or not open func
  1609. {
  1610. RL_Func_statu[ch_x] = 1;
  1611. }
  1612. }
  1613. else if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_VLit1_min_Addr + ch_x-1])//大于最小,小于最大,正常
  1614. {
  1615. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmax_NFault;
  1616. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmin_NFault;
  1617. }
  1618. else//小于最小
  1619. {
  1620. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmax_NFault;
  1621. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_Vmin_Fault;
  1622. }
  1623. }
  1624. else//输入通道
  1625. {
  1626. //A相
  1627. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_max_Addr])//超限
  1628. {
  1629. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_AVmax_Fault;
  1630. }
  1631. else
  1632. {
  1633. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AVmax_NFault;
  1634. }
  1635. //B相
  1636. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_max_Addr])//超限
  1637. {
  1638. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BVmax_Fault;
  1639. }
  1640. else
  1641. {
  1642. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BVmax_NFault;
  1643. }
  1644. //C相
  1645. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_max_Addr])//超限
  1646. {
  1647. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CVmax_Fault;
  1648. }
  1649. else
  1650. {
  1651. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CVmax_NFault;
  1652. }
  1653. }
  1654. }
  1655. else
  1656. {
  1657. if(ch_x > CH_in)
  1658. {
  1659. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmax_NFault;
  1660. }
  1661. else
  1662. {
  1663. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AVmax_NFault;
  1664. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BVmax_NFault;
  1665. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CVmax_NFault;
  1666. }
  1667. }
  1668. //最小电压
  1669. if(AC3PPDU_Vmin_LTen_flag[ch_x] > 0)
  1670. {
  1671. if(ch_x > CH_in)//输出通道
  1672. {
  1673. 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
  1674. {
  1675. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_Vmin_Fault;
  1676. 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
  1677. {
  1678. RL_Func_statu[ch_x] = 1;
  1679. }
  1680. }
  1681. else//小于最小
  1682. {
  1683. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmin_NFault;
  1684. }
  1685. }
  1686. else//输入通道
  1687. {
  1688. //A相
  1689. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_min_Addr])//
  1690. {
  1691. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AVmin_NFault;
  1692. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_APlack_NFault;
  1693. }
  1694. else if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] > 1000)
  1695. {
  1696. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_AVmin_Fault;
  1697. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_APlack_NFault;
  1698. }
  1699. else
  1700. {
  1701. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AVmin_NFault;
  1702. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_APlack_Fault;
  1703. }
  1704. //B相
  1705. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_min_Addr])//
  1706. {
  1707. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BVmin_NFault;
  1708. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BPlack_NFault;
  1709. }
  1710. else if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] > 1000)
  1711. {
  1712. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BVmin_Fault;
  1713. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BPlack_NFault;
  1714. }
  1715. else
  1716. {
  1717. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BVmin_NFault;
  1718. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BPlack_Fault;
  1719. }
  1720. //C相
  1721. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ViLit_min_Addr])//超限
  1722. {
  1723. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CVmin_NFault;
  1724. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CPlack_NFault;
  1725. }
  1726. else if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] > 1000)
  1727. {
  1728. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CVmin_Fault;
  1729. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CPlack_NFault;
  1730. }
  1731. else
  1732. {
  1733. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CVmin_NFault;
  1734. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CPlack_Fault;
  1735. }
  1736. }
  1737. }
  1738. else
  1739. {
  1740. if(ch_x > CH_in)
  1741. {
  1742. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Vmin_NFault;
  1743. }
  1744. else
  1745. {
  1746. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AVmin_NFault;
  1747. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BVmin_NFault;
  1748. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CVmin_NFault;
  1749. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VAP_Addr] > 1000)
  1750. {
  1751. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_APlack_NFault;
  1752. }
  1753. else
  1754. {
  1755. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_APlack_Fault;
  1756. }
  1757. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VBP_Addr] > 1000)
  1758. {
  1759. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BPlack_NFault;
  1760. }
  1761. else
  1762. {
  1763. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BPlack_Fault;
  1764. }
  1765. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_VCP_Addr] > 1000)
  1766. {
  1767. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CPlack_NFault;
  1768. }
  1769. else
  1770. {
  1771. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CPlack_Fault;
  1772. }
  1773. }
  1774. }
  1775. //电流最大
  1776. if(AC3PPDU_Imax_LTen_flag[ch_x] > 0)
  1777. {
  1778. if(ch_x > CH_in)//输出通道
  1779. {
  1780. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + 1 + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_ILit1_max_Addr + ch_x -1])
  1781. {
  1782. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_Imax_Fault;
  1783. 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
  1784. {
  1785. RL_Func_statu[ch_x] = 1;
  1786. }
  1787. }
  1788. else
  1789. {
  1790. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Imax_NFault;
  1791. }
  1792. }
  1793. else//输入通道
  1794. {
  1795. if((AC3PPDU_Modbus_Reg[Mb_Dbuff_IAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_IiLit_max_Addr]))//超限
  1796. {
  1797. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_AImax_Fault;
  1798. }
  1799. else
  1800. {
  1801. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AImax_NFault;
  1802. }
  1803. if((AC3PPDU_Modbus_Reg[Mb_Dbuff_IBP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_IiLit_max_Addr]))//超限
  1804. {
  1805. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BImax_Fault;
  1806. }
  1807. else
  1808. {
  1809. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BImax_NFault;
  1810. }
  1811. if((AC3PPDU_Modbus_Reg[Mb_Dbuff_ICP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_IiLit_max_Addr]))//超限
  1812. {
  1813. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CImax_Fault;
  1814. }
  1815. else
  1816. {
  1817. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CImax_NFault;
  1818. }
  1819. }
  1820. }
  1821. else
  1822. {
  1823. if(ch_x > CH_in)
  1824. {
  1825. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Imax_NFault;
  1826. }
  1827. else
  1828. {
  1829. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AImax_NFault;
  1830. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BImax_NFault;
  1831. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CImax_NFault;
  1832. }
  1833. }
  1834. //功率最大
  1835. if(AC3PPDU_Wmax_LTen_flag[ch_x] > 0)
  1836. {
  1837. if(ch_x > CH_in)//输出通道
  1838. {
  1839. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + 2 + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WLit1_max_Addr + ch_x -1])
  1840. {
  1841. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_Wmax_Fault;
  1842. 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
  1843. {
  1844. RL_Func_statu[ch_x] = 1;
  1845. }
  1846. }
  1847. else
  1848. {
  1849. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Wmax_NFault;
  1850. }
  1851. }
  1852. else//输入通道
  1853. {
  1854. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_WAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1855. {
  1856. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_AWmax_Fault;
  1857. }
  1858. else
  1859. {
  1860. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AWmax_NFault;
  1861. }
  1862. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_WBP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1863. {
  1864. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BWmax_Fault;
  1865. }
  1866. else
  1867. {
  1868. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BWmax_NFault;
  1869. }
  1870. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_WCP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1871. {
  1872. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CWmax_Fault;
  1873. }
  1874. else
  1875. {
  1876. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CWmax_NFault;
  1877. }
  1878. }
  1879. }
  1880. else
  1881. {
  1882. if(ch_x > CH_in)
  1883. {
  1884. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_Wmax_NFault;
  1885. }
  1886. else
  1887. {
  1888. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AWmax_NFault;
  1889. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BWmax_NFault;
  1890. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CWmax_NFault;
  1891. }
  1892. }
  1893. //电量最大
  1894. if(AC3PPDU_kWhmax_LTen_flag[ch_x] > 0)
  1895. {
  1896. if(ch_x > CH_in)//输出通道
  1897. {
  1898. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_Out1Para_Addr + 6 + i] > AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhLit1_max_Addr + ch_x-1])
  1899. {
  1900. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] |= AC3PPDU_kWhmax_Fault;
  1901. 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
  1902. {
  1903. RL_Func_statu[ch_x] = 1;
  1904. }
  1905. }
  1906. else
  1907. {
  1908. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_kWhmax_NFault;
  1909. }
  1910. }
  1911. else//输入通道
  1912. {
  1913. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhAP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1914. {
  1915. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_AkWhmax_Fault;
  1916. }
  1917. else
  1918. {
  1919. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AkWhmax_NFault;
  1920. }
  1921. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhBP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1922. {
  1923. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_BkWhmax_Fault;
  1924. }
  1925. else
  1926. {
  1927. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BkWhmax_NFault;
  1928. }
  1929. if(AC3PPDU_Modbus_Reg[Mb_Dbuff_kWhCP_Addr] > AC3PPDU_Modbus_Reg[Mb_Dbuff_WiLit_max_Addr])//超限
  1930. {
  1931. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] |= AC3PPDU_CkWhmax_Fault;
  1932. }
  1933. else
  1934. {
  1935. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CkWhmax_NFault;
  1936. }
  1937. }
  1938. }
  1939. else
  1940. {
  1941. if(ch_x > CH_in)
  1942. {
  1943. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr + ch_x] &= AC3PPDU_kWhmax_NFault;
  1944. }
  1945. else
  1946. {
  1947. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_AkWhmax_NFault;
  1948. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_BkWhmax_NFault;
  1949. AC3PPDU_Modbus_Reg[Mb_Dbuff_FT_ST_Addr] &= AC3PPDU_CkWhmax_NFault;
  1950. }
  1951. }
  1952. }
  1953. #ifdef USE_FULL_ASSERT
  1954. void assert_failed(uint8_t* file, uint32_t line)
  1955. {
  1956. while (1);
  1957. }
  1958. #else
  1959. void __aeabi_assert(const char * x1, const char * x2, int x3)
  1960. {
  1961. (void)x3;
  1962. }
  1963. #endif