Main.c 80 KB

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