Main.c 35 KB

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