electricity.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. #include "electricity.h"
  2. #include "uart.h"
  3. #include "common.h"
  4. #include "board_cfg.h"
  5. #include "Hlw8110.h"
  6. #include "relay.h"
  7. static board_t *board = 0;
  8. static void read_ele(uint8_t channel);
  9. static void check_wanning(uint8_t in_out,uint8_t channel);
  10. static void opt_over_func(uint8_t channel);
  11. #define AC3PPDU_Lack_Voltage (30000)
  12. extern float F_AC_V;
  13. extern float F_AC_I;
  14. extern float F_AC_P;
  15. extern float F_AC_LINE_Freq;
  16. extern float F_AC_E;
  17. extern float F_AC_PF;
  18. extern float F_AC_PS;
  19. extern uint8_t voltage_flag;
  20. float elec[RelaySlaveChaNum] = {0.0};
  21. void electricity_init(void)
  22. {
  23. board = get_board();
  24. uart1_config(9600);
  25. ch448f_config();
  26. for(int i = 0 ; i < RelaySlaveChaNum;i++)
  27. {
  28. select_channel(i);
  29. Init_HLW8110();
  30. }
  31. board->read_ele = read_ele;
  32. board->check_wanning = check_wanning;
  33. board->opt_overfunc = opt_over_func;
  34. }
  35. static void read_ele(uint8_t channel)
  36. {
  37. if(channel < RelaySlaveChaNum)
  38. {
  39. select_channel(channel);
  40. #if (AC_3_3 || AC_3_4 || AC_3_3_MON)
  41. voltage_flag = channel;
  42. #else
  43. if(channel >= PT_SUB_COUNT)
  44. {
  45. voltage_flag = 1;
  46. }else
  47. {
  48. voltage_flag = 0;
  49. }
  50. #endif
  51. Calculate_HLW8110_MeterData();
  52. if(F_AC_V > 20 && F_AC_LINE_Freq < 1.0)
  53. {
  54. reinit_hlw8110();
  55. Calculate_HLW8110_MeterData();
  56. }
  57. if(F_AC_V < 1.0)
  58. {
  59. F_AC_V = 0.0;
  60. F_AC_I = 0.0;
  61. F_AC_P = 0.0;
  62. F_AC_PS = 0.0;
  63. F_AC_LINE_Freq = 0.0;
  64. F_AC_PF = 0.0;
  65. }else if(F_AC_PF < 0.05 || F_AC_PF > 1 || F_AC_P < 1)
  66. {
  67. F_AC_I = 0.0;
  68. F_AC_P = 0.0;
  69. F_AC_PS = 0.0;
  70. F_AC_PF = 0.0;
  71. }
  72. board->md_data.r_data.output[channel].voltage = F_AC_V * 1000;
  73. board->md_data.r_data.output[channel].current = F_AC_I * 1000;
  74. board->md_data.r_data.output[channel].power = F_AC_P * 1000;
  75. board->md_data.r_data.output[channel].freq = F_AC_LINE_Freq * 1000;
  76. board->md_data.r_data.output[channel].factor = F_AC_PF * 1000;
  77. board->md_data.r_data.output[channel].n_power = F_AC_PS * 1000;
  78. elec[channel] += F_AC_E;
  79. board->md_data.r_data.output[channel].consumer = board->ele_restore[channel] + (uint32_t)(elec[channel] * 1000);
  80. board->md_data.r_data.output[channel].s_power = (F_AC_PF > 0) ? ((F_AC_P / F_AC_PF)-F_AC_PS) *1000 : 0;
  81. }
  82. }
  83. static uint16_t count = 0;
  84. static void check_wanning(uint8_t in_out,uint8_t channel)
  85. {
  86. if(in_out == ELE_INPUT)
  87. {
  88. #if (AC_3_3 || AC_3_4 ||AC_3_3_MON)
  89. board->md_data.r_data.i_voltage[A] = board->md_data.r_data.output[A].voltage;
  90. board->md_data.r_data.i_voltage[B] = board->md_data.r_data.output[B].voltage;
  91. board->md_data.r_data.i_voltage[C] = board->md_data.r_data.output[C].voltage;
  92. board->md_data.r_data.i_current[A] = board->md_data.r_data.output[A].current;
  93. board->md_data.r_data.i_current[B] = board->md_data.r_data.output[B].current;
  94. board->md_data.r_data.i_current[C] = board->md_data.r_data.output[C].current;
  95. board->md_data.r_data.i_power[A] = board->md_data.r_data.output[A].power;
  96. board->md_data.r_data.i_power[B] = board->md_data.r_data.output[B].power;
  97. board->md_data.r_data.i_power[C] = board->md_data.r_data.output[C].power;
  98. board->md_data.r_data.i_consumer[A] = board->md_data.r_data.output[A].consumer;
  99. board->md_data.r_data.i_consumer[B] = board->md_data.r_data.output[B].consumer;
  100. board->md_data.r_data.i_consumer[C] = board->md_data.r_data.output[C].consumer;
  101. #else
  102. //voltage
  103. uint32_t _data = 0;
  104. for(int i = 0 ; i < PT_SUB_COUNT;i++)
  105. {
  106. _data = (board->md_data.r_data.output[i].voltage > _data) ? board->md_data.r_data.output[i].voltage : _data;
  107. }
  108. board->md_data.r_data.i_voltage[A] = _data;
  109. _data = 0;
  110. for(int i = PT_SUB_COUNT ; i < RelaySlaveChaNum;i++)
  111. {
  112. _data = (board->md_data.r_data.output[i].voltage > _data) ? board->md_data.r_data.output[i].voltage : _data;
  113. }
  114. board->md_data.r_data.i_voltage[B] = _data;
  115. //current
  116. _data = 0;
  117. for(int i = 0 ; i < PT_SUB_COUNT;i++)
  118. {
  119. _data += board->md_data.r_data.output[i].current;
  120. }
  121. board->md_data.r_data.i_current[A] = _data;
  122. _data = 0;
  123. for(int i = PT_SUB_COUNT ; i < RelaySlaveChaNum;i++)
  124. {
  125. _data += board->md_data.r_data.output[i].current;
  126. }
  127. board->md_data.r_data.i_current[B] = _data;
  128. //power
  129. _data = 0;
  130. for(int i = 0 ; i < PT_SUB_COUNT;i++)
  131. {
  132. _data += board->md_data.r_data.output[i].power;
  133. }
  134. board->md_data.r_data.i_power[A] = _data;
  135. _data = 0;
  136. for(int i = PT_SUB_COUNT ; i < RelaySlaveChaNum;i++)
  137. {
  138. _data += board->md_data.r_data.output[i].power;
  139. }
  140. board->md_data.r_data.i_power[B] = _data;
  141. //consumer
  142. _data = 0;
  143. for(int i = 0 ; i < PT_SUB_COUNT;i++)
  144. {
  145. _data += board->md_data.r_data.output[i].consumer;
  146. }
  147. board->md_data.r_data.i_consumer[A] = _data;
  148. _data = 0;
  149. for(int i = PT_SUB_COUNT ; i < RelaySlaveChaNum;i++)
  150. {
  151. _data += board->md_data.r_data.output[i].consumer;
  152. }
  153. board->md_data.r_data.i_consumer[B] = _data;
  154. #endif
  155. uint32_t Vmax = 0;
  156. uint32_t Vmin = 0;
  157. uint32_t sort_buff[3] = {0};
  158. sort_buff[0] = board->md_data.r_data.i_voltage[A];
  159. sort_buff[1] = board->md_data.r_data.i_voltage[B];
  160. #if (AC_3_3 || AC_3_4 ||AC_3_3_MON)
  161. sort_buff[2] = board->md_data.r_data.i_voltage[C];
  162. Vmax = (sort_buff[0] >= sort_buff[1]) ? sort_buff[0] :sort_buff[1];
  163. Vmax = (Vmax >= sort_buff[2]) ? Vmax : sort_buff[2];
  164. Vmin = (sort_buff[0] <= sort_buff[1]) ? sort_buff[0] :sort_buff[1];
  165. Vmin = (Vmin <= sort_buff[2]) ? Vmin : sort_buff[2];
  166. #else
  167. Vmax = sort_buff[0] >sort_buff[1] ? sort_buff[0] : sort_buff[1];
  168. Vmin = sort_buff[0] >sort_buff[1] ? sort_buff[1] : sort_buff[2];
  169. #endif
  170. if((Vmin < AC3PPDU_Lack_Voltage) && (Vmax != 0) && (Vmax > (AC3PPDU_Lack_Voltage*2)))
  171. {
  172. uint32_t v_mid = AC3PPDU_Lack_Voltage *2;
  173. count ++;
  174. if(count == 2)
  175. {
  176. if(board->md_data.r_data.i_voltage[A] < v_mid)
  177. {
  178. board->md_data.r_data.Lack_A = WANNING_SET;
  179. }
  180. if(board->md_data.r_data.i_voltage[B] < v_mid)
  181. {
  182. board->md_data.r_data.Lack_B = WANNING_SET;
  183. }
  184. #if(AC_3_3 || AC_3_4 ||AC_3_3_MON)
  185. if(board->md_data.r_data.i_voltage[C] < v_mid)
  186. {
  187. board->md_data.r_data.Lack_C = WANNING_SET;
  188. }
  189. #endif
  190. count = 0;
  191. }
  192. }else
  193. {
  194. board->md_data.r_data.Lack_A = WANNING_UNSET;
  195. board->md_data.r_data.Lack_B = WANNING_UNSET;
  196. #if(AC_3_3 || AC_3_4 ||AC_3_3_MON)
  197. board->md_data.r_data.Lack_C = WANNING_UNSET;
  198. #endif
  199. count = 0;
  200. }
  201. board->md_data.r_data.w_input.v_A_up = (board->md_data.r_data.i_voltage[A] > board->md_data.rw_data.i_V_max) ? WANNING_SET : WANNING_UNSET;
  202. board->md_data.r_data.w_input.v_B_up = (board->md_data.r_data.i_voltage[B] > board->md_data.rw_data.i_V_max) ? WANNING_SET : WANNING_UNSET;
  203. board->md_data.r_data.w_input.v_A_low = (board->md_data.r_data.i_voltage[A] < board->md_data.rw_data.i_V_min) ? WANNING_SET : WANNING_UNSET;
  204. board->md_data.r_data.w_input.v_B_low = (board->md_data.r_data.i_voltage[B] < board->md_data.rw_data.i_V_min) ? WANNING_SET : WANNING_UNSET;
  205. board->md_data.r_data.w_input.i_A_up = (board->md_data.r_data.i_current[A] > board->md_data.rw_data.i_I_max) ? WANNING_SET : WANNING_UNSET;
  206. board->md_data.r_data.w_input.i_B_up = (board->md_data.r_data.i_current[B] > board->md_data.rw_data.i_I_max) ? WANNING_SET : WANNING_UNSET;
  207. board->md_data.r_data.w_input.p_A_up = (board->md_data.r_data.i_power[A] > board->md_data.rw_data.i_P_max) ? WANNING_SET : WANNING_UNSET;
  208. board->md_data.r_data.w_input.p_B_up = (board->md_data.r_data.i_power[B] > board->md_data.rw_data.i_P_max) ? WANNING_SET : WANNING_UNSET;
  209. board->md_data.r_data.w_input.c_A_up = (board->md_data.r_data.i_consumer[A] > board->md_data.rw_data.i_C_max) ? WANNING_SET : WANNING_UNSET;
  210. board->md_data.r_data.w_input.c_B_up = (board->md_data.r_data.i_consumer[B] > board->md_data.rw_data.i_C_max) ? WANNING_SET : WANNING_UNSET;
  211. board->md_data.r_data.w_input.lack_A = board->md_data.r_data.Lack_A;
  212. board->md_data.r_data.w_input.lack_B = board->md_data.r_data.Lack_B;
  213. #if(AC_3_3 || AC_3_4 ||AC_3_3_MON)
  214. board->md_data.r_data.w_input.v_C_up = (board->md_data.r_data.i_voltage[C] > board->md_data.rw_data.i_V_max) ? WANNING_SET : WANNING_UNSET;
  215. board->md_data.r_data.w_input.v_C_low = (board->md_data.r_data.i_voltage[C] < board->md_data.rw_data.i_V_min) ? WANNING_SET : WANNING_UNSET;
  216. board->md_data.r_data.w_input.i_C_up = (board->md_data.r_data.i_current[C] > board->md_data.rw_data.i_I_max) ? WANNING_SET : WANNING_UNSET;
  217. board->md_data.r_data.w_input.p_C_up = (board->md_data.r_data.i_power[C] > board->md_data.rw_data.i_P_max) ? WANNING_SET : WANNING_UNSET;
  218. board->md_data.r_data.w_input.c_C_up = (board->md_data.r_data.i_consumer[C] > board->md_data.rw_data.i_C_max) ? WANNING_SET : WANNING_UNSET;
  219. board->md_data.r_data.w_input.lack_C = board->md_data.r_data.Lack_C;
  220. #endif
  221. }else
  222. {
  223. if(channel < RelaySlaveChaNum)
  224. {
  225. if(IS_VOLTAGE_MAX_EN(board->out_wanning_en[channel]) &&
  226. board->md_data.r_data.output[channel].voltage > board->md_data.rw_data.o_V_max[channel])
  227. {
  228. board->md_data.r_data.wanning[channel].v_up = WANNING_SET;
  229. if(board->md_data.rw_data.over_func[channel].v_up_func)
  230. {
  231. board->over_func[channel] = 1;
  232. }
  233. }else
  234. {
  235. board->md_data.r_data.wanning[channel].v_up = WANNING_UNSET;
  236. }
  237. if(IS_VOLTAGE_MIN_EN(board->out_wanning_en[channel]) &&
  238. board->md_data.r_data.output[channel].voltage < board->md_data.rw_data.o_V_min[channel])
  239. {
  240. board->md_data.r_data.wanning[channel].v_low = WANNING_SET;
  241. if(board->md_data.rw_data.over_func[channel].v_low_func)
  242. {
  243. board->over_func[channel] = 1;
  244. }
  245. }else
  246. {
  247. board->md_data.r_data.wanning[channel].v_low = WANNING_UNSET;
  248. }
  249. if(IS_CURRENT_MAX_EN(board->out_wanning_en[channel]) &&
  250. board->md_data.r_data.output[channel].current > board->md_data.rw_data.o_I_max[channel])
  251. {
  252. board->md_data.r_data.wanning[channel].i_up = WANNING_SET;
  253. if(board->md_data.rw_data.over_func[channel].i_up_func)
  254. {
  255. board->over_func[channel] = 1;
  256. }
  257. }else
  258. {
  259. board->md_data.r_data.wanning[channel].i_up = WANNING_UNSET;
  260. }
  261. if(IS_POWER_MAX_EN(board->out_wanning_en[channel]) &&
  262. board->md_data.r_data.output[channel].power > board->md_data.rw_data.o_P_max[channel])
  263. {
  264. board->md_data.r_data.wanning[channel].p_up = WANNING_SET;
  265. if(board->md_data.rw_data.over_func[channel].p_up_func)
  266. {
  267. board->over_func[channel] = 1;
  268. }
  269. }else
  270. {
  271. board->md_data.r_data.wanning[channel].p_up = WANNING_UNSET;
  272. }
  273. if(IS_CONSUMER_MAX_EN(board->out_wanning_en[channel]) &&
  274. board->md_data.r_data.output[channel].consumer > board->md_data.rw_data.o_C_max[channel])
  275. {
  276. board->md_data.r_data.wanning[channel].c_up = WANNING_SET;
  277. if(board->md_data.rw_data.over_func[channel].c_up_func)
  278. {
  279. board->over_func[channel] = 1;
  280. }
  281. }else
  282. {
  283. board->md_data.r_data.wanning[channel].c_up = WANNING_UNSET;
  284. }
  285. }
  286. }
  287. }
  288. static void opt_over_func(uint8_t channel)
  289. {
  290. #if (!SUPPORT_MON)
  291. #if (AC_3_3 || AC_3_4 || AC_3_3_MON)
  292. for(int i = 0; i < RelaySlaveChaNum ;i+=3)
  293. {
  294. if(board->md_data.rw_data.channel_ctrl[i ] == 0 &&
  295. board->md_data.rw_data.channel_ctrl[i+1] == 0 &&
  296. board->md_data.rw_data.channel_ctrl[i+2] == 0)
  297. {
  298. if(board->over_func[i] || board->over_func[i+1] || board->over_func[i+2]) //3 pha
  299. {
  300. board->over_func[i ] = 1;
  301. board->over_func[i+1] = 1;
  302. board->over_func[i+2] = 1;
  303. #if SUPPORT_ZERO_CRTL
  304. board->n_over_func = 1;
  305. #endif
  306. }
  307. }
  308. }
  309. async_data da = {0};
  310. da.method = PROMPT_CTRL;
  311. da.status = RELAY_CLOSE;
  312. da.w_eep_flag = FLAG_N_W_EEP;
  313. for(int i = 0; i < RelaySlaveChaNum ;i++)
  314. {
  315. if(board->over_func[i])
  316. {
  317. board->over_func[i] = 0;
  318. if(board->md_data.r_data.status[i] == RELAY_OPEN)
  319. {
  320. da.channel = i;
  321. da.fire_or_zero = _FIRE;
  322. da.reg = &board->relay_staging_staus[i];
  323. set_relay_sta_async(&da);
  324. }
  325. }
  326. }
  327. #if SUPPORT_ZERO_CRTL
  328. if(board->n_over_func)
  329. {
  330. board->n_over_func = 0;
  331. if(board->md_data.r_data.N_status == RELAY_OPEN)
  332. {
  333. da.channel = 0;
  334. da.fire_or_zero = _ZERO;
  335. da.reg = &board->relay_zero_staging_status;
  336. set_relay_sta_async(&da);
  337. }
  338. }
  339. #endif
  340. #else
  341. for(int i = 0; i < PT_SUB_COUNT ;i++)
  342. {
  343. if(board->md_data.rw_data.channel_ctrl[i ] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
  344. {
  345. if(board->over_func[i] || board->over_func[i+PT_SUB_COUNT])
  346. {
  347. board->over_func[i] = board->over_func[i+PT_SUB_COUNT] = 1;
  348. }
  349. }
  350. }
  351. async_data da = {0};
  352. da.method = PROMPT_CTRL;
  353. da.status = RELAY_CLOSE;
  354. da.w_eep_flag = FLAG_N_W_EEP;
  355. for(int i = 0; i < RelaySlaveChaNum ;i++)
  356. {
  357. if(board->over_func[i])
  358. {
  359. board->over_func[i] = 0;
  360. if(board->md_data.r_data.status[i] == RELAY_OPEN)
  361. {
  362. da.channel = i;
  363. da.fire_or_zero = _FIRE;
  364. da.reg = &board->relay_staging_staus[i];
  365. set_relay_sta_async(&da);
  366. }
  367. }
  368. }
  369. #endif
  370. #endif
  371. }