electricity.c 13 KB

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