Main.c 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205
  1. /*********************************************************************************************************
  2. * 模块名称:Main.c
  3. * 摘 要:主文件,包含软硬件初始化函数和main函数
  4. * 当前版本:1.0.0
  5. * 作 者:Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
  6. * 完成日期:2021年07月01日
  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 "gd32e230x_conf.h"
  21. #include "string.h"
  22. #include "NVIC.h"
  23. #include "SysTick.h"
  24. #include "Rcu.h"
  25. #include "Timer.h"
  26. #include "Led.h"
  27. #include "Key.h"
  28. #include "Relay.h"
  29. #include "Uart1.h"
  30. #include "mb.h"
  31. #include "Hlw8110.h"
  32. #include "Config.h"
  33. //#include "Wwdgt.h"
  34. #include "At24cxx.h"
  35. #include "I2c.h"
  36. #include "ReadEeprom.h"
  37. #include "Sn74lvc573.h"
  38. #include "Fwdgt.h"
  39. #include "key_io.h"
  40. #include "Flash.h"
  41. /*********************************************************************************************************
  42. * 宏定义
  43. *********************************************************************************************************/
  44. /*********************************************************************************************************
  45. * 枚举结构体
  46. *********************************************************************************************************/
  47. /*********************************************************************************************************
  48. * 内部变量定义
  49. *********************************************************************************************************/
  50. static unsigned char RelaySlaveAddress=0x00;
  51. static unsigned int Uart0_Baud=115200;
  52. static unsigned char channel=0;
  53. unsigned long int Delay_Ms_1=0;
  54. static unsigned char Delay_End_flag=0;
  55. unsigned short int Devid_ChalNum = ACSingCurrid*256+RelaySlaveChaNum;//设备类型和通道数
  56. //测试EEPROM使用
  57. //static unsigned char pBuffer1[] = {0xff};
  58. //static unsigned int buf_qua=0;
  59. //static unsigned char pBuffer2[] = "hello MCU!";
  60. //static unsigned char pBuffer3[sizeof(pBuffer1)] = {};
  61. ACDC_Delay_struct_WriteReg ACDC_Delay_WriteReg[RelaySlaveChaNum];
  62. AC_Ele_struct_ReadReg AC_Ele_ReadReg[RelaySlaveChaNum];
  63. ACDC_State_struct_WriteReg ACDC_State_WriteReg[RelaySlaveChaNum];
  64. ACDC_ThresVal_struct_WriteReg ACDC_ThresVal_WriteReg[RelaySlaveChaNum];
  65. ACDC_Coef_struct_WriteReg ACDC_Coef_WriteReg[RelaySlaveChaNum];
  66. EE_ACDC_Delay_struct_ReadReg_On EE_ACDC_Delay_ReadReg_On[RelaySlaveChaNum];
  67. EE_ACDC_Delay_struct_ReadReg_Off EE_ACDC_Delay_ReadReg_Off[RelaySlaveChaNum];
  68. EE_ACDC_State_struct_ReadReg EE_ACDC_State_ReadReg[RelaySlaveChaNum];
  69. EE_ACDC_State_struct_ReadRegTrue EE_ACDC_State_ReadRegTrue[RelaySlaveChaNum];
  70. EE_ACDC_ThresVal_struct_ReadReg EE_ACDC_ThresVal_ReadReg[RelaySlaveChaNum];
  71. EE_ACDC_Coef_struct_ReadReg EE_ACDC_Coef_ReadReg[RelaySlaveChaNum];
  72. EE_ACDC_Total_Consumption EE_ACDC_Total_Consum_Read_Reg[RelaySlaveChaNum];
  73. ACDC_Consumer_Clear EE_ACDC_Consumer_Clear[RelaySlaveChaNum] = {0};
  74. ACDC_Over_Func_WriteReg ACDC_Over_WriteReg[RelaySlaveChaNum];
  75. //float hlw8110_store[RelaySlaveChaNum] = {0.0};
  76. //uint8_t kwh_1s_read_flag = 0;
  77. ACDC_All_Chn_Consumption ACDC_Total_All_Chn_Read_Reg;
  78. EE_ACDC_ThresVal_struct_ReadReg EE_ACDC_All_ThrVal;
  79. ACDC_Over_Func_WriteReg ACDC_Over_AllWriteReg;
  80. ACDC_Wann_Read_Reg_t ACDC_Wann_All = {0};
  81. EE_ACDC_State_All_Reg_En_t EE_ACDC_State_All_en;
  82. AC_Ele_struct_ReadReg AC_Ele_ReadReg_All;
  83. uint32_t normal_running_time = 0;
  84. uint8_t over_Func_flag[RelaySlaveChaNum] = {0};
  85. uint8_t over_func_all_flag = 0;
  86. uint32_t read_Total_Consumer[RelaySlaveChaNum] = {0};
  87. //uint32_t hlw8100_flash_backup[RelaySlaveChaNum] = {0};
  88. //uint32_t Hlw8110_Flash_value[RelaySlaveChaNum] = {0};
  89. float Hlw8110_Restore[RelaySlaveChaNum]={0.0};
  90. uint32_t write_2_minute_flag = 0;
  91. //uint8_t read_kWh_flag = 0;
  92. uint16_t detection_value = 0;
  93. #if SUPPORT_SELF_LOCK
  94. uint8_t handle_k_1_status = 1;
  95. uint8_t handle_k_2_status = 1;
  96. uint8_t handle_k_3_status = 1;
  97. uint8_t handle_k_4_status = 1;
  98. bool key_1 = 0;
  99. bool key_2 = 0;
  100. bool key_3 = 0;
  101. bool key_4 = 0;
  102. #endif
  103. META_DATA_S meta_data = {0};
  104. information_t infomation;
  105. unsigned short int Sort_Onbuf[RelaySlaveChaNum];
  106. unsigned short int Sort_Offbuf[RelaySlaveChaNum];
  107. unsigned long int AC_V_Total; //交流电压总结果
  108. unsigned long int AC_LINE_Freq_Total; //交流电流总结果
  109. unsigned int Start_Read_Flag; //开始读取数据标志
  110. unsigned char Jlink_Sta_Flag = 0; //Jlink 是否在线的标志位
  111. unsigned int StaticCur = 50; //设置每个通道的静态电流
  112. unsigned char No_Load[RelaySlaveChaNum]={0};
  113. unsigned char test1;
  114. extern float F_AC_V; // 电压有效值
  115. extern float F_AC_I; // A通道电流
  116. extern float F_AC_P; // A通道有功功率
  117. extern float F_AC_LINE_Freq; // 市电线性频率
  118. extern float F_AC_E; // A通道有功电能(量)
  119. extern float F_AC_PF; // 功率因素,A通道和B通道只能选其一
  120. /*********************************************************************************************************
  121. * 内部函数声明
  122. *********************************************************************************************************/
  123. static void InitSoftware(void); //初始化软件相关的模块
  124. static void InitHardware(void); //初始化硬件相关的模块
  125. static void Proc2msTask_Start(void); //2ms处理任务
  126. static void Proc1SecTask(void); //1s处理任务
  127. static void over_RelayState(void);
  128. static void over_RelayState_ch(uint8_t channel);
  129. static void all_over_RelayState(void);
  130. void switch_recode();
  131. #if SUPPORT_SWITCH_REMENBER
  132. bool handle_status[RelaySlaveChaNum] = {0};
  133. #if ((RelaySlaveChaNum == 6) || (SUPPORT_2_DETECTION && RelaySlaveChaNum == 8))
  134. uint8_t handle_detection[2] = {1,1};
  135. uint32_t input_1_ms_count = 0;
  136. uint32_t input_2_ms_count = 0;
  137. uint8_t input_1_en = 0;
  138. uint8_t input_2_en = 0;
  139. #else
  140. uint8_t handle_detection[1] = {1};
  141. #endif
  142. #endif
  143. uint8_t upgreade_flag = 0;
  144. uint8_t consumer_clear_flag = 0;
  145. uint32_t all_val = 0;
  146. /*********************************************************************************************************
  147. * 内部函数实现
  148. *********************************************************************************************************/
  149. /*********************************************************************************************************
  150. * 函数名称:InitSoftware
  151. * 函数功能:所有的软件相关的模块初始化函数都放在此函数中
  152. * 输入参数:void
  153. * 输出参数:void
  154. * 返 回 值:void
  155. * 创建日期:2021年07月01日
  156. * 注 意:
  157. *********************************************************************************************************/
  158. static void InitSoftware(void)
  159. {
  160. eMBInit(MB_RTU, RelaySlaveAddress, 0, Uart0_Baud, MB_PAR_NONE); // 初始化modbus为RTU方式,地址RelaySlaveAddress, 波特率Uart0_Baud,无校验
  161. eMBEnable(); // 使能modbus协议栈
  162. }
  163. static void app_init(META_DATA_S *meta)
  164. {
  165. flash_get_meta_data(meta);
  166. nvic_vector_table_set(NVIC_VECTTAB_FLASH,meta->rom_addr - NVIC_VECTTAB_FLASH);
  167. __enable_irq();
  168. }
  169. void break_2_boot_upgreade(void)
  170. {
  171. meta_data.errno = 0;
  172. meta_data.operation_flag = 1;
  173. meta_data.recent_running_time = normal_running_time;
  174. flash_erase_meta();
  175. flash_write_meta(&meta_data);
  176. __disable_irq();
  177. //__set_FAULTMASK(1);
  178. NVIC_SystemReset();
  179. }
  180. void check_channel_reset()
  181. {
  182. if(consumer_clear_flag){
  183. for(int i = 0; i < RelaySlaveChaNum;i++)
  184. {
  185. if(EE_ACDC_Consumer_Clear[i].flag)
  186. {
  187. if(EE_ACDC_Consumer_Clear[i].value)
  188. {
  189. int temp = i << 2;
  190. uint8_t buff[4] = {0};
  191. //AT24CxxWrite(Eepr_AC_Sing_Total_Consumer_addr+temp, buff,4);
  192. read_Total_Consumer[i] = 0;
  193. Hlw8110_Restore[i] = 0.0;
  194. // channel_reset(i);
  195. EE_ACDC_Consumer_Clear[i].value = 0;
  196. }
  197. EE_ACDC_Consumer_Clear[i].flag = 0;
  198. }
  199. }
  200. consumer_clear_flag = 0;
  201. }
  202. }
  203. /*********************************************************************************************************
  204. * 函数名称:Proc100msTask
  205. * 函数功能:100ms处理任务 循环读取电能计量芯片的数据
  206. * 输入参数:void
  207. * 输出参数:void
  208. * 返 回 值:void
  209. * 创建日期:2021年07月01日
  210. * 注 意:进行通道之间的轮询读取数据
  211. * 注 意:真值表
  212. * XEN# YEN# SEL2 SEL1 SEL0 AX AY 串口通道 实际通道 channel RELAY RELAY
  213. * 0 0 0 0 0 选择A0X 选择A0Y TR4 4 3 4
  214. * 0 0 0 0 1 选择A1X 选择A1Y TR3 3 2 3
  215. * 0 0 0 1 0 选择A2X 选择A2Y TR2 2 1 2
  216. * 0 0 0 1 1 选择A3X 选择A3Y RT1 1 0 1 靠电压互感器那边(8通道小电流)
  217. * 0 0 1 0 0 选择A4X 选择A4Y TR8 8 7 8 1
  218. * 0 0 1 0 1 选择A5X 选择A5Y TR7 7 6 7 2
  219. * 0 0 1 1 0 选择A6X 选择A6Y TR6 6 5 6 3
  220. * 0 0 1 1 1 选择A7X 选择A7Y TR5 5 4 5 4靠电压互感器那边(4通道大电流)
  221. * 1 1 X X X 全部断开 全部断开
  222. *********************************************************************************************************/
  223. static void Proc100msTask(void)
  224. {
  225. unsigned int chal_num=0;
  226. if(Get100msFlag()) //判断100ms标志状态
  227. {
  228. #if SUPPORT_TWIN_FIRE
  229. uint32_t voltage = 0;
  230. uint32_t current = 0;
  231. uint32_t power = 0;
  232. uint32_t consumer = 0;
  233. uint32_t fac = 0;
  234. uint32_t freq = 0;
  235. uint32_t data_v = 0;
  236. uint32_t data_i = 0;
  237. if((Start_Read_Flag)&&(channel==0x00)) //只有读完数据之后且现在轮询到通道0才会继续更新电压和频率值
  238. {
  239. Start_Read_Flag = 0;
  240. }
  241. select_channel(channel);
  242. Calculate_HLW8110_MeterData();
  243. data_v = (F_AC_V*EE_ACDC_Coef_ReadReg[channel].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[channel].ACDC_V_b/1000);
  244. data_i = (F_AC_I*EE_ACDC_Coef_ReadReg[channel].ACDC_I_k)+(EE_ACDC_Coef_ReadReg[channel].ACDC_I_b/1000);
  245. voltage = data_v;
  246. current = data_i;
  247. power = F_AC_P*1000;
  248. freq = F_AC_LINE_Freq*1000;
  249. Hlw8110_Restore[channel] += F_AC_E;
  250. fac = F_AC_PF*1000;
  251. select_channel(channel + 4);
  252. Calculate_HLW8110_MeterData();
  253. data_v = (F_AC_V*EE_ACDC_Coef_ReadReg[channel].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[channel].ACDC_V_b/1000);
  254. data_i = (F_AC_I*EE_ACDC_Coef_ReadReg[channel].ACDC_I_k)+(EE_ACDC_Coef_ReadReg[channel].ACDC_I_b/1000);
  255. voltage = data_v > voltage ? data_v : voltage;
  256. current += data_i;
  257. power += (F_AC_P*1000);
  258. Hlw8110_Restore[channel] += F_AC_E;
  259. consumer = Hlw8110_Restore[channel]*1000 + read_Total_Consumer[channel];
  260. fac = fac > (F_AC_PF*1000) ? fac : (F_AC_PF*1000);
  261. if(voltage <=1000)
  262. {
  263. current = 0;
  264. freq = 0;
  265. fac = 0;
  266. power = 0;
  267. }
  268. AC_Ele_ReadReg[channel].AC_V = voltage*(1.732);
  269. AC_Ele_ReadReg[channel].AC_I = current;
  270. AC_Ele_ReadReg[channel].AC_LINE_Freq = freq;
  271. AC_Ele_ReadReg[channel].AC_P = power;
  272. AC_Ele_ReadReg[channel].AC_PF =fac;
  273. AC_Ele_ReadReg[channel].AC_E = consumer;
  274. #else
  275. select_channel(channel);
  276. Calculate_HLW8110_MeterData();
  277. //AC_Ele_ReadReg[0].AC_V=(F_AC_V*EE_ACDC_Coef_ReadReg[0].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[0].ACDC_V_b/1000);
  278. if((Start_Read_Flag)&&(channel==0x00)) //只有读完数据之后且现在轮询到通道0才会继续更新电压和频率值
  279. {
  280. Start_Read_Flag = 0;
  281. }
  282. AC_Ele_ReadReg[channel].AC_V=(F_AC_V*EE_ACDC_Coef_ReadReg[0].ACDC_V_k)+(EE_ACDC_Coef_ReadReg[channel].ACDC_V_b/1000);//实际的电压放大1000倍,实际的K,B值要缩小1000倍
  283. AC_Ele_ReadReg_All.AC_V = AC_Ele_ReadReg[0].AC_V;
  284. if(AC_Ele_ReadReg[channel].AC_V <= 10000) //小于10V频率为0
  285. {
  286. AC_Ele_ReadReg[channel].AC_LINE_Freq=0;
  287. AC_Ele_ReadReg[channel].AC_V = 0;
  288. }
  289. else
  290. {
  291. AC_Ele_ReadReg[channel].AC_LINE_Freq=F_AC_LINE_Freq*1000;
  292. }
  293. AC_Ele_ReadReg[channel].AC_I=(F_AC_I*EE_ACDC_Coef_ReadReg[channel].ACDC_I_k)+(EE_ACDC_Coef_ReadReg[channel].ACDC_I_b/1000);//实际的电流放大1000倍,实际的K,B值要缩小1000倍
  294. if((AC_Ele_ReadReg[channel].AC_I)<=No_Load[channel])
  295. {
  296. AC_Ele_ReadReg[channel].AC_I = 0;
  297. }
  298. if((AC_Ele_ReadReg[channel].AC_I)<=No_Load[channel])
  299. AC_Ele_ReadReg[channel].AC_P=0; //有功功率
  300. else
  301. AC_Ele_ReadReg[channel].AC_P=F_AC_P*1000; //有功功率
  302. Hlw8110_Restore[channel] += F_AC_E;
  303. AC_Ele_ReadReg[channel].AC_E=(Hlw8110_Restore[channel]*1000 + read_Total_Consumer[channel]); //电能
  304. AC_Ele_ReadReg[channel].AC_PF=F_AC_PF*1000; //功率因素
  305. #endif
  306. // AC_Ele_ReadReg_All.AC_V = AC_Ele_ReadReg[0].AC_V;
  307. // AC_Ele_ReadReg_All.AC_I += AC_Ele_ReadReg[channel].AC_I; //all current
  308. // AC_Ele_ReadReg_All.AC_P += AC_Ele_ReadReg[channel].AC_P;
  309. // AC_Ele_ReadReg_All.AC_LINE_Freq = AC_Ele_ReadReg[0].AC_LINE_Freq;
  310. // AC_Ele_ReadReg_All.AC_PF= AC_Ele_ReadReg[channel].AC_PF;
  311. EE_ACDC_Total_Consum_Read_Reg[channel].ACDC_Consumption = AC_Ele_ReadReg[channel].AC_E; //total consumer
  312. // ACDC_Total_All_Chn_Read_Reg.ACDC_All_Consumption += EE_ACDC_Total_Consum_Read_Reg[channel].ACDC_Consumption;
  313. all_val += EE_ACDC_Total_Consum_Read_Reg[channel].ACDC_Consumption;
  314. // AC_Ele_ReadReg_All.AC_E += EE_ACDC_Total_Consum_Read_Reg[channel].ACDC_Consumption;
  315. WarnState_ch(channel); //更新状态寄存器的告警阈值
  316. //over_RelayState();
  317. #if(!SUPPORT_OUTPUT_NOT_CTRL)
  318. over_RelayState_ch(channel);
  319. #endif
  320. channel=channel+1;
  321. if(channel>=RelaySlaveChaNum){
  322. // ACDC_Total_All_Chn_Read_Reg.ACDC_All_Consumption = all_val;
  323. // AC_Ele_ReadReg_All.AC_E = all_val;
  324. // all_val = 0;
  325. // jugement all
  326. // All_Warn_State();
  327. // all_over_RelayState();
  328. channel=0;
  329. // AC_Ele_ReadReg_All.AC_I = 0;
  330. //AC_Ele_ReadReg_All.AC_E = 0;
  331. // AC_Ele_ReadReg_All.AC_P = 0;
  332. }
  333. // Uart_Read_HLW8110_Reg(REG_HFCONST_ADDR,2);//测试使用,看是否和电能计量芯片是否通信成功,成功串口接收到10 00 48
  334. Clr100msFlag(); //清除100ms标志
  335. }
  336. }
  337. void set_channel_status(uint8_t channel,uint8_t status)
  338. {
  339. if(status)
  340. {
  341. EE_ACDC_State_ReadReg[channel].ACDC_Cha_On_Off_State = true;
  342. }else
  343. {
  344. EE_ACDC_State_ReadReg[channel].ACDC_Cha_On_Off_State = false;
  345. }
  346. }
  347. /*********************************************************************************************************
  348. * 函数名称:InitHardware
  349. * 函数功能:所有的硬件相关的模块初始化函数都放在此函数中
  350. * 输入参数:void
  351. * 输出参数:void
  352. * 返 回 值:void米皮米mimMMDAAADFADAdadafadfyang
  353. * 创建日期:2021年07月01日
  354. * 注 意:
  355. *********************************************************************************************************/
  356. static void InitHardware(void)
  357. {
  358. unsigned int i;
  359. //SystemInit(); //系统初始化,函数里面默认是配置为内部晶振
  360. // InitRCU(); //初始化RCC模块,使用外部晶振则需要打开此函数
  361. ViewRcuClock(); //在线调试查看系统时钟频率
  362. InitNVIC(); //初始化NVIC模块
  363. for(i=0;i<RelaySlaveChaNum;i++)
  364. No_Load[i] = StaticCur;
  365. InitSysTick(); //初始化SysTick模块
  366. Init74Lvc(); //初始化74lvc573锁存器
  367. if(gpio_input_bit_get(LOCK_LE_CH_RCU,LOCK_CHECK)) //更新程序后没有及时的拔掉下载器则置标志位,不用等到程序进入主循环LED闪烁左右判断依据
  368. Jlink_Sta_Flag = 1;
  369. InitLED(); //初始化LED模块
  370. InitKey(); //初始化Key模块
  371. InitRelay(); //初始化Relay模块
  372. InitTimer(); //初始化Timer模块
  373. InitAT24Cxx(); //初始化24C64模块
  374. InitUART1(9600); //初始化UART1模块 电能计量芯片默认的波特率为9600,偶校验
  375. InitCH448F(); //初始化CH448F,使能XEN YEN
  376. key_io_init(NULL);
  377. RelaySlaveAddress=ReadKeyValue(); //读取从机的地址
  378. InitSoftware(); //初始化软件相关函数,就是modbus这个部分
  379. channel = 0;
  380. while(1) //切换开关轮询初始化8110计量芯片
  381. {
  382. select_channel(channel);
  383. Init_HLW8110();
  384. #if SUPPORT_TWIN_FIRE
  385. select_channel(channel+4);
  386. Init_HLW8110();
  387. #endif
  388. channel++;
  389. if(channel>=RelaySlaveChaNum){
  390. channel=0;
  391. break;
  392. }
  393. }
  394. #if SURPPORT_2_2
  395. solid_on();
  396. BUFF;
  397. LOCK;
  398. #endif
  399. ReadEeprom();
  400. #if SUPPORT_4_ON
  401. solid_4_on();
  402. BUFF;
  403. LOCK;
  404. EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State = true;
  405. EE_ACDC_State_ReadRegTrue[0].ACDC_Cha_On_Off_State = true;
  406. EE_ACDC_State_ReadReg[1].ACDC_Cha_On_Off_State = true;
  407. EE_ACDC_State_ReadRegTrue[1].ACDC_Cha_On_Off_State = true;
  408. EE_ACDC_State_ReadReg[2].ACDC_Cha_On_Off_State = true;
  409. EE_ACDC_State_ReadRegTrue[2].ACDC_Cha_On_Off_State = true;
  410. EE_ACDC_State_ReadReg[3].ACDC_Cha_On_Off_State = true;
  411. EE_ACDC_State_ReadRegTrue[3].ACDC_Cha_On_Off_State = true;
  412. #endif
  413. strcpy(infomation.date,__DATE__);
  414. strcat(infomation.date," ");
  415. strcat(infomation.date,__TIME__);
  416. strcpy(infomation.ver,VERSION);
  417. infomation.channels = RelaySlaveChaNum;
  418. flash_get_infomation(&infomation);
  419. Delay_Ms_1 = 0;
  420. #if SUPPORT_DETECTION
  421. detection_value = get_detection();
  422. #endif
  423. //check_or_control_detection();
  424. switch_recode();
  425. #if SUPPORT_SELF_LOCK
  426. key_1 = get_key_io_1();
  427. key_2 = get_key_io_2();
  428. key_3 = get_key_io_3();
  429. key_4 = get_key_io_4();
  430. #if RelaySlaveChaNum >= 1
  431. if(key_1 == false)
  432. {
  433. handle_k_1_status = 0;
  434. set_channel_status(0,0);
  435. }
  436. #endif
  437. #if RelaySlaveChaNum >= 2
  438. if(key_2 == false)
  439. {
  440. handle_k_2_status = 0;
  441. set_channel_status(1,0);
  442. }
  443. #endif
  444. #if RelaySlaveChaNum >= 3
  445. if(key_3 == false)
  446. {
  447. handle_k_3_status = 0;
  448. set_channel_status(2,0);
  449. }
  450. #endif
  451. #if RelaySlaveChaNum >= 4
  452. if(key_4 == false)
  453. {
  454. handle_k_4_status = 0;
  455. set_channel_status(3,0);
  456. }
  457. #endif
  458. #endif
  459. #if (!SUPPORT_OUTPUT_NOT_CTRL)
  460. while(1)
  461. {
  462. eMBPoll();
  463. //Proc100msTask(); //100ms处理任务
  464. //Proc1SecTask(); //1s处理任务
  465. if((gpio_input_bit_get(LOCK_LE_CH_RCU,LOCK_CHECK))||(Jlink_Sta_Flag==0x01)) //如果有jlink接入,则不会动作继电器,直接跳出进入主函数
  466. {
  467. //补上电平,让IO输出电平,有一个起始状态,但不会动作,锁存器起作用
  468. RelayState();
  469. Delay_Ms_1 = 0;
  470. Delay_End_flag = 0;
  471. Jlink_Sta_Flag = 0;
  472. timer_disable(TIMER14);
  473. break;
  474. }
  475. Proc2msTask_Start(); //2ms处理任务完成后才初始化modbus。
  476. if(Delay_End_flag)
  477. {
  478. timer_disable(TIMER14);
  479. Delay_Ms_1 = 0;
  480. Delay_End_flag = 0;
  481. break;
  482. }
  483. }
  484. #else
  485. Delay_Ms_1 = 0;
  486. Delay_End_flag = 0;
  487. Jlink_Sta_Flag = 0;
  488. timer_disable(TIMER14);
  489. #endif
  490. }
  491. void switch_recode()
  492. {
  493. #if (!SUPPORT_OUTPUT_NOT_CTRL)
  494. #if SUPPORT_DETECTION
  495. #if SUPPORT_SWITCH_REMENBER
  496. #if ((RelaySlaveChaNum == 6) || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))
  497. if((detection_value & 1) == 0)
  498. {
  499. if(handle_detection[0] == 1)
  500. {
  501. uint8_t channel = (RelaySlaveChaNum % 2) ? (RelaySlaveChaNum/2 +1) : (RelaySlaveChaNum / 2);
  502. for(uint8_t k = 0; k < channel;k++)
  503. handle_status[k] = EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State;
  504. EE_ACDC_State_ReadReg[0].ACDC_ALLCha_Off_State=true;
  505. for(uint8_t k = 0; k < channel;k++)
  506. EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State=false;
  507. for(uint8_t k = 0; k < channel;k++)
  508. RelayState_ch(k);
  509. handle_detection[0] = 0;
  510. }
  511. }else
  512. {
  513. if(handle_detection[0] == 0)
  514. {
  515. handle_detection[0] = 1;
  516. uint8_t channel = (RelaySlaveChaNum % 2) ? (RelaySlaveChaNum/2 +1) : (RelaySlaveChaNum / 2);
  517. for(uint8_t k = 0; k < channel;k++)
  518. EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State=handle_status[k];
  519. EE_ACDC_State_ReadReg[0].ACDC_ALLCha_On_State=true;
  520. input_1_en = 1;
  521. input_1_ms_count = 0;
  522. }
  523. }
  524. if((detection_value & 2) == 0)
  525. {
  526. if(handle_detection[1] == 1)
  527. {
  528. uint8_t channel = (RelaySlaveChaNum % 2) ? (RelaySlaveChaNum/2 +1) : (RelaySlaveChaNum /2);
  529. for(uint8_t k = channel; k < RelaySlaveChaNum;k++)
  530. handle_status[k] = EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State;
  531. EE_ACDC_State_ReadReg[0].ACDC_ALLCha_Off_State=true;
  532. for(uint8_t k = channel; k < RelaySlaveChaNum;k++)
  533. EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State=false;
  534. for(uint8_t k = channel; k < RelaySlaveChaNum;k++)
  535. RelayState_ch(k);
  536. handle_detection[1] = 0;
  537. }
  538. }else
  539. {
  540. if(handle_detection[1] == 0)
  541. {
  542. handle_detection[1] = 1;
  543. uint8_t channel = (RelaySlaveChaNum % 2) ? (RelaySlaveChaNum/2 +1) : (RelaySlaveChaNum / 2);
  544. for(uint8_t k = channel; k < RelaySlaveChaNum;k++)
  545. EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State=handle_status[k];
  546. EE_ACDC_State_ReadReg[0].ACDC_ALLCha_On_State=true;
  547. input_2_en = 1;
  548. input_2_ms_count = 0;
  549. }
  550. }
  551. #elif (SUPPORT_TWIN_FIRE)
  552. if((detection_value & 0x3) != 0x3)
  553. {
  554. if(handle_detection[0] == 1)
  555. {
  556. for(int i = 0;i < RelaySlaveChaNum;i++)
  557. handle_status[i] = EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State;
  558. }
  559. handle_detection[0] = 0;
  560. EE_ACDC_State_ReadReg[0].ACDC_ALLCha_Off_State=true;
  561. for(int i = 0;i < RelaySlaveChaNum;i++)
  562. EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State = false;
  563. RelayState();
  564. }else
  565. {
  566. if(handle_detection[0] == 0)
  567. {
  568. handle_detection[0] = 1;
  569. for(int i = 0;i < RelaySlaveChaNum;i++)
  570. EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State=handle_status[i];
  571. EE_ACDC_State_ReadReg[0].ACDC_ALLCha_On_State=true;
  572. All_On_Flag = 1; //全开标志置1
  573. All_Off_Flag = 0;
  574. Delay_Ms_2 = 0;
  575. timer_enable(TIMER14);
  576. //RelayState();
  577. }
  578. }
  579. #else
  580. if(detection_value == 0)
  581. {
  582. if(handle_detection[0] == 1)
  583. {
  584. for(int i = 0;i < RelaySlaveChaNum;i++)
  585. handle_status[i] = EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State;
  586. }
  587. handle_detection[0] = 0;
  588. EE_ACDC_State_ReadReg[0].ACDC_ALLCha_Off_State=true;
  589. for(int i = 0;i < RelaySlaveChaNum;i++)
  590. EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State = false;
  591. RelayState();
  592. }else
  593. {
  594. if(handle_detection[0] == 0)
  595. {
  596. handle_detection[0] = 1;
  597. for(int i = 0;i < RelaySlaveChaNum;i++)
  598. EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State=handle_status[i];
  599. EE_ACDC_State_ReadReg[0].ACDC_ALLCha_On_State=true;
  600. All_On_Flag = 1; //全开标志置1
  601. All_Off_Flag = 0;
  602. Delay_Ms_2 = 0;
  603. timer_enable(TIMER14);
  604. //RelayState();
  605. }
  606. }
  607. #endif
  608. #else
  609. #if (RelaySlaveChaNum == 6 || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))
  610. if((detection_value & 1) == 0)
  611. {
  612. for(int i = 0; i < (RelaySlaveChaNum)/2;i++)
  613. {
  614. set_channel_status(i,0);
  615. }
  616. RelayState();
  617. }
  618. if((detection_value & 2) == 0)
  619. {
  620. for(int i = (RelaySlaveChaNum)/2; i < RelaySlaveChaNum;i++)
  621. {
  622. set_channel_status(i,0);
  623. }
  624. RelayState();
  625. }
  626. #elif (SUPPORT_TWIN_FIRE)
  627. if((detection_value & 0x3) != 0x3)
  628. {
  629. for(int i = 0; i < (RelaySlaveChaNum)/2;i++)
  630. {
  631. set_channel_status(i,0);
  632. }
  633. RelayState();
  634. }
  635. #else
  636. if(detection_value == 0)
  637. {
  638. for(int i = 0; i < RelaySlaveChaNum;i++)
  639. {
  640. set_channel_status(i,0);
  641. }
  642. RelayState();
  643. }
  644. #endif
  645. #endif
  646. #endif
  647. #else
  648. #endif
  649. }
  650. /*********************************************************************************************************
  651. * 函数名称:Proc20msTask_Start
  652. * 函数功能:2ms处理任务开机根据延时开启继电器
  653. * 输入参数:void
  654. * 输出参数:void
  655. * 返 回 值:void
  656. * 创建日期:2021年07月01日
  657. * 注 意:需要对应读取关系
  658. *********************************************************************************************************/
  659. static void Proc2msTask_Start(void)
  660. {
  661. if(Get2msFlag()) //判断2ms标志状态
  662. {
  663. #if SUPPORT_DETECTION
  664. if(detection_value == 0)
  665. {
  666. Delay_End_flag = 1;
  667. Clr2msFlag();
  668. return;
  669. }
  670. //#if ((RelaySlaveChaNum == 6) || ((RelaySlaveChaNum == 8) && SUPPORT_2_DETECTION))
  671. // if((detection_value & 0x1) == 0)
  672. // {
  673. // uint8_t k = 0;
  674. // for(k=0;k <(RelaySlaveChaNum)/2;k++)
  675. // EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State = false;
  676. // }
  677. // if((detection_value & 0x2) == 0)
  678. // {
  679. // uint8_t k = 0;
  680. // for(k=(RelaySlaveChaNum)/2;k <RelaySlaveChaNum;k++)
  681. // EE_ACDC_State_ReadReg[k].ACDC_Cha_On_Off_State = false;
  682. // }
  683. //#endif
  684. #endif
  685. Delay_Ms_1 = Delay_Ms_1 +1;
  686. #if (RelaySlaveChaNum >= 1)
  687. if((EE_ACDC_Delay_ReadReg_On[0].ACDC_Delay==Delay_Ms_1)||(EE_ACDC_Delay_ReadReg_On[0].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[0].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  688. {
  689. BUFF;
  690. Relay1State();
  691. LOCK;
  692. }
  693. #endif
  694. #if (RelaySlaveChaNum >= 2)
  695. if((EE_ACDC_Delay_ReadReg_On[1].ACDC_Delay==Delay_Ms_1)||(EE_ACDC_Delay_ReadReg_On[1].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[1].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  696. {
  697. BUFF;
  698. Relay2State();
  699. LOCK;
  700. }
  701. #endif
  702. #if (RelaySlaveChaNum >= 3)
  703. if((EE_ACDC_Delay_ReadReg_On[2].ACDC_Delay==Delay_Ms_1)||(EE_ACDC_Delay_ReadReg_On[2].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[2].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  704. {
  705. BUFF;
  706. Relay3State();
  707. LOCK;
  708. }
  709. #endif
  710. #if (RelaySlaveChaNum >= 4)
  711. if((EE_ACDC_Delay_ReadReg_On[3].ACDC_Delay==Delay_Ms_1)||(EE_ACDC_Delay_ReadReg_On[3].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[3].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  712. {
  713. BUFF;
  714. Relay4State();
  715. LOCK;
  716. }
  717. #endif
  718. #if (RelaySlaveChaNum >= 5)
  719. if((EE_ACDC_Delay_ReadReg_On[4].ACDC_Delay==Delay_Ms_1)||(EE_ACDC_Delay_ReadReg_On[4].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[4].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  720. {
  721. BUFF;
  722. Relay5State();
  723. LOCK;
  724. }
  725. #endif
  726. #if (RelaySlaveChaNum >= 6)
  727. if((EE_ACDC_Delay_ReadReg_On[5].ACDC_Delay==Delay_Ms_1)||(EE_ACDC_Delay_ReadReg_On[5].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[5].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  728. {
  729. BUFF;
  730. Relay6State();
  731. LOCK;
  732. }
  733. #endif
  734. #if (RelaySlaveChaNum >= 7)
  735. if((EE_ACDC_Delay_ReadReg_On[6].ACDC_Delay==Delay_Ms_1)||(EE_ACDC_Delay_ReadReg_On[6].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[6].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  736. {
  737. BUFF;
  738. Relay7State();
  739. LOCK;
  740. }
  741. #endif
  742. #if (RelaySlaveChaNum >= 8)
  743. if((EE_ACDC_Delay_ReadReg_On[7].ACDC_Delay==Delay_Ms_1)||(EE_ACDC_Delay_ReadReg_On[7].ACDC_Delay==0xffff)||(EE_ACDC_Delay_ReadReg_On[7].ACDC_Delay==0))//确保这里的和读取电能参数的顺序是一致的
  744. {
  745. BUFF;
  746. Relay8State();
  747. LOCK;
  748. }
  749. #endif
  750. if((Sort_Onbuf[RelaySlaveChaNum-1]==Delay_Ms_1)||(Sort_Onbuf[RelaySlaveChaNum-1]==0xffff)||(Sort_Onbuf[RelaySlaveChaNum-1]==0)) //当达到最大延时时间后退出当前循环
  751. Delay_End_flag = 1; //这里还需要排序,然后才能生效
  752. Clr2msFlag(); //清除2ms标志
  753. }
  754. }
  755. /*********************************************************************************************************
  756. * 函数名称:Proc1SecTask
  757. * 函数功能:1s处理任务
  758. * 输入参数:void
  759. * 输出参数:void
  760. * 返 回 值:void
  761. * 创建日期:2021年07月01日
  762. * 注 意:开启闪烁LED的功能
  763. *********************************************************************************************************/
  764. static void Proc1SecTask(void)
  765. {
  766. //detection_value = get_detection();
  767. if(Get1SecFlag()) //判断1s标志状态
  768. {
  769. LEDFlicker2();
  770. Clr1SecFlag(); //清除1s标志
  771. normal_running_time++;
  772. #if SUPPORT_DETECTION
  773. detection_value = get_detection();
  774. #endif
  775. #if SUPPORT_SELF_LOCK
  776. key_1 = get_key_io_1();
  777. key_2 = get_key_io_2();
  778. key_3 = get_key_io_3();
  779. key_4 = get_key_io_4();
  780. #endif
  781. }
  782. }
  783. static void all_over_RelayState(void)
  784. {
  785. //all
  786. if(over_func_all_flag)
  787. {
  788. for(int i = 0 ; i < RelaySlaveChaNum;i++)
  789. set_channel_status(i,0);
  790. RelayState();
  791. }
  792. return;
  793. }
  794. static void over_RelayState(void)
  795. {
  796. for(int i = 0; i < RelaySlaveChaNum;i++)
  797. {
  798. if(over_Func_flag[i])
  799. {
  800. set_channel_status(i,0);
  801. RelayState_ch(i);
  802. over_Func_flag[i] = 0;
  803. }
  804. }
  805. }
  806. static void over_RelayState_ch(uint8_t channel)
  807. {
  808. if(over_Func_flag[channel])
  809. {
  810. set_channel_status(channel,0);
  811. RelayState_ch(channel);
  812. over_Func_flag[channel] = 0;
  813. }
  814. }
  815. #if SUPPORT_ALL_ON_OFF
  816. void check_or_controll_all()
  817. {
  818. bool rst = false;
  819. bool test = false;
  820. rst = get_rst();
  821. test = get_test();
  822. if(detection_value != 0)
  823. {
  824. if(rst != test)
  825. {
  826. uint8_t buff[20]= {0};
  827. timer_disable(TIMER14);
  828. if(rst)
  829. {
  830. // while(All_On_Flag == 1)
  831. // DelayNms(5);
  832. All_Off_Flag = 1; //全关标志置1
  833. All_On_Flag = 0;
  834. Delay_Ms_2 = 0;
  835. EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State=false;
  836. EE_ACDC_State_ReadReg[0].ACDC_ALLCha_Off_State=true;
  837. for(int i =0; i < RelaySlaveChaNum;i++){
  838. EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State = false;
  839. }
  840. }
  841. else
  842. {
  843. // while(All_Off_Flag == 1)
  844. // DelayNms(5);
  845. All_Off_Flag =0;
  846. All_On_Flag = 1; //全关标志置1
  847. EE_ACDC_State_ReadReg[0].ACDC_Cha_On_Off_State=true;
  848. EE_ACDC_State_ReadReg[0].ACDC_ALLCha_On_State=true;
  849. for(int i =0; i < RelaySlaveChaNum;i++)
  850. EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State = true;
  851. Delay_Ms_2 = 0;
  852. }
  853. memcpy(&buff,&EE_ACDC_State_ReadReg,RelaySlaveChaNum*2);
  854. AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr,buff,RelaySlaveChaNum*2);
  855. timer_enable(TIMER14);
  856. }
  857. }else
  858. {
  859. for(int i =0; i < RelaySlaveChaNum;i++){
  860. EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State = false;
  861. set_channel_status(i,0);
  862. }
  863. RelayState();
  864. }
  865. }
  866. #endif
  867. #if SUPPORT_SELF_LOCK
  868. void sub_control()
  869. {
  870. if(detection_value == 0) //all close
  871. {
  872. for(int i = 0; i < RelaySlaveChaNum;i++){
  873. EE_ACDC_State_ReadReg[i].ACDC_Cha_On_Off_State = false;
  874. set_channel_status(i,0);
  875. }
  876. RelayState();
  877. if(key_1 == false)
  878. {
  879. handle_k_1_status = 0;
  880. }
  881. if(key_2 == false)
  882. {
  883. handle_k_2_status = 0;
  884. }
  885. if(key_3 == false)
  886. {
  887. handle_k_3_status = 0;
  888. }
  889. if(key_4 == false)
  890. {
  891. handle_k_4_status = 0;
  892. }
  893. }else
  894. {
  895. #if (RelaySlaveChaNum >= 1)
  896. if(key_1 == false ) //not in line
  897. {
  898. if(handle_k_1_status == 1)
  899. {
  900. set_channel_status(0,0);
  901. Relay1State();
  902. BUFF;
  903. LOCK;
  904. AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr,(uint8_t*)&(EE_ACDC_State_ReadReg[0]),2);
  905. handle_k_1_status = 0;
  906. }
  907. }else
  908. {
  909. if(handle_k_1_status == 0)
  910. {
  911. handle_k_1_status = 1;
  912. set_channel_status(0,1);
  913. Relay1State();
  914. BUFF;
  915. LOCK;
  916. AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr,(uint8_t*)&(EE_ACDC_State_ReadReg[0]),2);
  917. }
  918. }
  919. #endif
  920. #if (RelaySlaveChaNum >= 2 )
  921. if(key_2 == false)
  922. {
  923. if(handle_k_2_status == 1)
  924. {
  925. set_channel_status(1,0);
  926. Relay2State();
  927. BUFF;
  928. LOCK;
  929. AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+2,(uint8_t*)&(EE_ACDC_State_ReadReg[1]),2);
  930. handle_k_2_status = 0;
  931. }
  932. }else
  933. {
  934. if(handle_k_2_status == 0)
  935. {
  936. handle_k_2_status = 1;
  937. set_channel_status(1,1);
  938. Relay2State();
  939. BUFF;
  940. LOCK;
  941. AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+2,(uint8_t*)&(EE_ACDC_State_ReadReg[1]),2);
  942. }
  943. }
  944. #endif
  945. #if (RelaySlaveChaNum >= 3)
  946. if(key_3 == false)
  947. {
  948. if(handle_k_3_status == 1)
  949. {
  950. set_channel_status(2,0);
  951. Relay3State();
  952. BUFF;
  953. LOCK;
  954. AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+4,(uint8_t*)&(EE_ACDC_State_ReadReg[2]),2);
  955. handle_k_3_status = 0;
  956. }
  957. }else
  958. {
  959. if(handle_k_3_status == 0)
  960. {
  961. handle_k_3_status = 1;
  962. set_channel_status(2,1);
  963. Relay3State();
  964. BUFF;
  965. LOCK;
  966. AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+4,(uint8_t*)&(EE_ACDC_State_ReadReg[2]),2);
  967. }
  968. }
  969. #endif
  970. #if (RelaySlaveChaNum >= 4)
  971. if(key_4 == false)
  972. {
  973. if(handle_k_4_status == 1)
  974. {
  975. set_channel_status(3,0);
  976. Relay4State();
  977. BUFF;
  978. LOCK;
  979. AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+6,(uint8_t*)&(EE_ACDC_State_ReadReg[3]),2);
  980. handle_k_4_status = 0;
  981. }
  982. }else
  983. {
  984. if(handle_k_4_status == 0)
  985. {
  986. handle_k_4_status = 1;
  987. set_channel_status(3,1);
  988. Relay4State();
  989. BUFF;
  990. LOCK;
  991. AT24CxxWrite(Eepr_AC_Sing_State_SmaWAddr+6,(uint8_t*)&(EE_ACDC_State_ReadReg[3]),2);
  992. }
  993. }
  994. #endif
  995. }
  996. }
  997. #endif
  998. /*********************************************************************************************************
  999. * 函数名称:main
  1000. * 函数功能:主函数
  1001. * 输入参数:void
  1002. * 输出参数:void
  1003. * 返 回 值:int
  1004. * 创建日期:2021年07月01日
  1005. * 注 意:
  1006. *********************************************************************************************************/
  1007. int main(void)
  1008. {
  1009. app_init(&meta_data);
  1010. InitHardware(); //初始化硬件相关函数
  1011. Fwdgt_Init(); //watch dog
  1012. while(1)
  1013. {
  1014. eMBPoll();
  1015. Proc100msTask(); //100ms处理任务
  1016. check_channel_reset();
  1017. Proc1SecTask(); //1s处理任务
  1018. Fwdgt_reload();
  1019. #if(!SUPPORT_OUTPUT_NOT_CTRL)
  1020. switch_recode();
  1021. #if SUPPORT_ALL_ON_OFF
  1022. check_or_controll_all();
  1023. #endif
  1024. #if SUPPORT_SELF_LOCK
  1025. sub_control();
  1026. #endif
  1027. #endif
  1028. if(upgreade_flag)
  1029. {
  1030. upgreade_flag = 0;
  1031. break_2_boot_upgreade();
  1032. }
  1033. if(write_2_minute_flag == 1)
  1034. {
  1035. write_2_minute_flag = 0;
  1036. uint8_t buff[4*RelaySlaveChaNum] = {0};
  1037. for(int i = 0 ; i < RelaySlaveChaNum;i++)
  1038. {
  1039. int temp = i << 2;
  1040. buff[temp + 0] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 24;
  1041. buff[temp + 1] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 16;
  1042. buff[temp + 2] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 8;
  1043. buff[temp + 3] = EE_ACDC_Total_Consum_Read_Reg[i].ACDC_Consumption >> 0;
  1044. }
  1045. AT24CxxWrite(Eepr_AC_Sing_Total_Consumer_addr, buff,4*RelaySlaveChaNum);
  1046. }
  1047. }
  1048. }
  1049. /*freemodbus作者使用了assert,故增加如下代码,同时
  1050. *options for target 对话框,target页面,勾选Use MicroLib
  1051. */
  1052. #ifdef USE_FULL_ASSERT
  1053. /**
  1054. * @brief Reports the name of the source file and the source line number
  1055. * where the assert_param error has occurred.
  1056. * @param file: pointer to the source file name
  1057. * @param line: assert_param error line source number
  1058. * @retval None
  1059. */
  1060. void assert_failed(uint8_t* file, uint32_t line)
  1061. {
  1062. /* User can add his own implementation to report the file name and line number,
  1063. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  1064. /* Infinite loop */
  1065. while (1)
  1066. {
  1067. }
  1068. }
  1069. #else
  1070. void __aeabi_assert(const char * x1, const char * x2, int x3)
  1071. {
  1072. (void)x3;
  1073. }
  1074. #endif