main.c 77 KB

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