constants_is_three.c 7.9 KB

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