constants_is_three.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. ////
  2. //// Created by DELL on 2024/10/16.1
  3. /*
  4. * 2025年1月24日,新风加湿机控制部分,解决通讯短暂断开故障
  5. * 2025年1月25日,增加新风除湿机
  6. *
  7. */////
  8. #include "main.h"
  9. #include "constants_is_three.h"
  10. #include "modbus.h"
  11. #include "usart.h"
  12. #include "cmsis_os2.h"
  13. #include "mini_gateway_master.h"
  14. #include "modbus_slave.h"
  15. static nmbs_t nmbs;
  16. uint8_t slaves_2[SLAVE_ADDRESS_END] = {0}; // 保存已经存在的从站号
  17. uint8_t power_count = 0; //
  18. static osMutexId_t constants_is_three_key;
  19. void search_3constants_slave();
  20. static int32_t uart_read(uint8_t *buf, uint16_t count, int32_t byte_timeout_ms,
  21. void *arg) {
  22. HAL_StatusTypeDef status = HAL_UART_Receive(&huart3, buf, count, byte_timeout_ms);
  23. if (status == HAL_OK) {
  24. return count;
  25. } else {
  26. return 0;
  27. }
  28. }
  29. static int32_t uart_write(const uint8_t *buf, uint16_t count, int32_t byte_timeout_ms,
  30. void *arg) {
  31. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
  32. HAL_UART_Transmit(&huart3, buf, count, byte_timeout_ms);
  33. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
  34. return count;
  35. }
  36. //// task
  37. _Noreturn void constants_is_three_poll_task(void *pv) {
  38. for (;;) {
  39. if (osMutexAcquire(constants_is_three_key, osWaitForever) == osOK) {
  40. search_3constants_slave();
  41. osMutexRelease(constants_is_three_key);
  42. }
  43. osDelay(1000 * 60 * 1);
  44. }
  45. }
  46. bool get_three_constants_status_2(ffx_status_t *three_constants_Status) {
  47. uint8_t data1[2] = {0};
  48. data1[0] = get_reg_value(POWER_REG_ADDRESS);
  49. if (data1[0] == 0) {
  50. power_count++;
  51. }
  52. if ((power_count >= 10)||(data1[0] == 1)) {
  53. nmbs_error err = nmbs_write_multiple_registers(&nmbs, THREE_CONSTANTS_POWER_REG_ADDRESS, 1, &data1);
  54. three_constants_Status->power = data1[0];
  55. power_count = 0;
  56. if (err != NMBS_ERROR_NONE) {
  57. return false;
  58. }
  59. }
  60. nmbs_error err = nmbs_read_holding_registers(&nmbs, THREE_CONSTANTS_ERRORS_REG_ADDRESS, 1, &data1);
  61. three_constants_Status->errors = data1[0];
  62. set_reg_value(INNER_ERROR4_REG_ADDRESS, three_constants_Status->errors);
  63. if (err != NMBS_ERROR_NONE) {
  64. return false;
  65. }
  66. return true;
  67. }
  68. //除湿机控制
  69. bool get_dry_status(ffx_status_t *dry_Status) {
  70. uint16_t data[4] = {0};
  71. data[0] = get_reg_value(POWER_REG_ADDRESS);
  72. dry_Status->fresh_air_system = get_reg_value(FRESH_AIR_MODE_REG_ADDRESS);
  73. dry_Status->fan_speed = get_reg_value(FAN_SPEED_REG_ADDRESS);
  74. switch (dry_Status->fresh_air_system) {
  75. case 2://
  76. data[1] = 1;
  77. break;
  78. case 4://
  79. data[1] = 0;
  80. break;
  81. default:
  82. break;
  83. }
  84. switch (dry_Status->fan_speed) {
  85. case 1://
  86. data[2] = 1;
  87. break;
  88. case 2://
  89. data[2] = 1;
  90. break;
  91. case 3://
  92. data[2] = 2;
  93. break;
  94. case 4://
  95. data[2] = 2;
  96. break;
  97. case 5://
  98. data[2] = 3;
  99. break;
  100. default:
  101. break;
  102. }
  103. data[3] = 60;
  104. if (!data[0]) {
  105. power_count++;
  106. }
  107. if ((power_count >= 3)||(data[0] == 1)) {
  108. nmbs_error err = nmbs_write_multiple_registers(&nmbs, DRY_POWER_REG_ADDRESS, 4, &data[0]);
  109. dry_Status->power = data[0];
  110. if (err != NMBS_ERROR_NONE) {
  111. return false;
  112. }
  113. power_count = 0;
  114. }
  115. nmbs_error err = nmbs_read_holding_registers(&nmbs, DRY_ERRORS_REG_ADDRESS, 1, &data);
  116. dry_Status->errors = data[0];
  117. set_reg_value(INNER_ERROR4_REG_ADDRESS, dry_Status->errors);
  118. if (err != NMBS_ERROR_NONE) {
  119. return false;
  120. }
  121. return true;
  122. }
  123. _Noreturn void constants_is_three_poll_mater_task_2(void *pv) {
  124. for (;;) {
  125. if (osMutexAcquire(constants_is_three_key, osWaitForever) == osOK) {
  126. bool fresh_air_flag = false;
  127. for (int i = 0; i < sizeof(slaves_2); i++) {
  128. if (slaves_2[i] == 20) { //新风除湿机,站号20
  129. ffx_status_t Dry_Status;
  130. nmbs_set_destination_rtu_address(&nmbs, slaves_2[i]);
  131. if ((get_reg_value(POWER_REG_ADDRESS) == 0)) {
  132. DEBUG_PRINTF("The REG_POWER_ADDRESS is 0.\r\n");
  133. }
  134. if (get_dry_status(&Dry_Status) && Dry_Status.power == 1) {
  135. set_reg_value(FRESH_AIR_REG_ADDRESS, slaves_2[i]);
  136. }
  137. } else if ((slaves_2[i] != 0) && (slaves_2[i] != 20)) { //新风加湿机,站号7~10
  138. ffx_status_t three_constants_Status;
  139. nmbs_set_destination_rtu_address(&nmbs, slaves_2[i]);
  140. if ((get_reg_value(POWER_REG_ADDRESS) == 0)) {
  141. DEBUG_PRINTF("The REG_POWER_ADDRESS is 0.\r\n");
  142. }
  143. if (get_three_constants_status_2(&three_constants_Status) &&
  144. three_constants_Status.power == 1) {
  145. set_reg_value(FRESH_AIR_REG_ADDRESS, slaves_2[i]);
  146. uint16_t fresh_air_reg[5] = {0};
  147. fresh_air_reg[0] = get_reg_value(WORK_MODE_REG_ADDRESS);
  148. fresh_air_reg[1] = get_reg_value(FRESH_AIR_MODE_REG_ADDRESS);
  149. fresh_air_reg[2] = get_reg_value(FAN_SPEED_REG_ADDRESS);
  150. fresh_air_reg[3] = get_reg_value(HUMP_ON_FFX_ADDRESS);
  151. fresh_air_reg[4] = get_reg_value(HUMP_OFF_FFX_ADDRESS);
  152. nmbs_error err = nmbs_write_multiple_registers(&nmbs, THREE_CONSTANTS_MODE_REG_ADDRESS, 2,
  153. &fresh_air_reg[1]);
  154. osDelay(200);
  155. err = nmbs_write_multiple_registers(&nmbs, THREE_CONSTANTS_HUMP_ON_REG_ADDRESS, 2,
  156. &fresh_air_reg[3]);
  157. }
  158. osDelay(1000);
  159. }
  160. }
  161. osMutexRelease(constants_is_three_key);
  162. osDelay(1000);
  163. }
  164. }
  165. }
  166. //// 检测从机是否存在
  167. bool check_slave_exist_2(uint8_t slave_addr) {
  168. nmbs_set_destination_rtu_address(&nmbs, slave_addr);
  169. uint16_t result;
  170. osDelay(10);
  171. nmbs_error err = nmbs_read_holding_registers(&nmbs, 0x01, 1, &result);
  172. return err == NMBS_ERROR_NONE;
  173. }
  174. //// 轮询从站
  175. void search_3constants_slave() {
  176. for (int i = SLAVE_ADDRESS_START_2; i <= SLAVE_ADDRESS_END_2; i++) {
  177. bool exist = check_slave_exist_2(i);
  178. if (exist != NMBS_ERROR_NONE) {
  179. slaves_2[i - 7] = i;
  180. set_reg_value(INNER_ERROR2_REG_ADDRESS, 0);
  181. }
  182. osDelay(10);
  183. if (exist == NMBS_ERROR_NONE) {
  184. exist = check_slave_exist_2(i);
  185. if (exist != NMBS_ERROR_NONE) {
  186. slaves_2[i - 7] = i;
  187. set_reg_value(INNER_ERROR2_REG_ADDRESS, 0);
  188. } else {
  189. set_reg_value(INNER_ERROR2_REG_ADDRESS, 1);
  190. }
  191. }
  192. osDelay(10);
  193. }
  194. bool exist = check_slave_exist_2(SLAVE_ADDRESS_END_3);
  195. if (exist != NMBS_ERROR_NONE) {
  196. slaves_2[4] = 20;
  197. set_reg_value(INNER_ERROR2_REG_ADDRESS, 0);
  198. }
  199. osDelay(10);
  200. if (exist == NMBS_ERROR_NONE) {
  201. exist = check_slave_exist_2(SLAVE_ADDRESS_END_3);
  202. if (exist != NMBS_ERROR_NONE) {
  203. slaves_2[4] = 20;
  204. set_reg_value(INNER_ERROR2_REG_ADDRESS, 0);
  205. } else {
  206. set_reg_value(INNER_ERROR2_REG_ADDRESS, 1);
  207. }
  208. }
  209. osDelay(100);
  210. }
  211. void constants_is_three_master_init() {
  212. constants_is_three_key = osMutexNew(NULL);
  213. nmbs_platform_conf platformConf;// 配置uart
  214. nmbs_platform_conf_create(&platformConf);
  215. platformConf.transport = NMBS_TRANSPORT_RTU;// RTU
  216. platformConf.read = &uart_read; // 读写函数
  217. platformConf.write = &uart_write; // 读写函数
  218. nmbs_client_create(&nmbs, &platformConf);// 创建客户端
  219. nmbs_set_read_timeout(&nmbs, 400);
  220. nmbs_set_byte_timeout(&nmbs, 400);
  221. // 开启轮询任务
  222. osThreadNew(constants_is_three_poll_task, NULL, NULL);
  223. osThreadNew(constants_is_three_poll_mater_task_2, NULL, NULL);
  224. }