Main.c 58 KB

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