main.c 76 KB

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