mini_gateway_master.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. //
  2. // Created by DELL on 2024/10/16.
  3. //
  4. #include <stdint.h>
  5. #include "mini_gateway_master.h"
  6. #include "usart.h"
  7. #include "modbus.h"
  8. #include "cmsis_os2.h"
  9. #include "modbus_slave.h"
  10. uint8_t error_count = 0;
  11. static nmbs_t nmbs;
  12. extern uint8_t slaves[SLAVE_ADDRESS_END]; // 保存已经存在的从站号
  13. //static osMutexId_t mini_mutex;
  14. extern uint8_t is_slave_exist;
  15. static uint8_t coil[INNER_SLAVE_ADDRESS_END] = {0};
  16. static int32_t uart_read(uint8_t *buf, uint16_t count, int32_t byte_timeout_ms,
  17. void *arg) {
  18. HAL_StatusTypeDef status = HAL_UART_Receive(&huart4, buf, count, byte_timeout_ms);
  19. if (status == HAL_OK) {
  20. return count;
  21. } else {
  22. return 0;
  23. }
  24. }
  25. static int32_t uart_write(const uint8_t *buf, uint16_t count, int32_t byte_timeout_ms,
  26. void *arg) {
  27. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
  28. HAL_UART_Transmit(&huart4, buf, count, byte_timeout_ms);
  29. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
  30. return count;
  31. }
  32. void sync_ac_status(ffx_status_t *status) {
  33. uint16_t power;
  34. uint16_t mode;
  35. uint16_t fan_speed;
  36. uint16_t set_temp;
  37. if (status->power == 0x01) {
  38. power = 0xAA;
  39. fan_speed = status->fan_speed + 1;
  40. set_temp = status->set_temp;
  41. } else
  42. power = 0x55;
  43. mode = status->mode + 1;
  44. switch (status->mode) {
  45. case 0://制冷模式
  46. mode = status->mode + 1;
  47. break;
  48. case 1://制热模式
  49. mode = status->mode + 3;
  50. break;
  51. case 2://除湿模式
  52. mode = status->mode;
  53. break;
  54. case 3://送风模式
  55. mode = status->mode;
  56. break;
  57. case 4://加湿模式、送风
  58. mode = 3;
  59. break;
  60. default:
  61. break;
  62. }
  63. uint16_t regs[5] = {power, mode, set_temp * 10, fan_speed, 0};
  64. nmbs_error err2 = nmbs_write_multiple_registers(&nmbs, 102 + 25 * (status->inner_num - 1), 5, regs);
  65. if (err2 == NMBS_ERROR_NONE) {
  66. set_reg_value(INNER_ERROR1_REG_ADDRESS, 0);
  67. error_count = 0;
  68. } else {
  69. set_reg_value(INNER_ERROR1_REG_ADDRESS, 1);
  70. error_count++;
  71. }
  72. }
  73. _Noreturn void mini_mater_task(void *pv) {
  74. uint8_t is_error_ffx[8] = {0};
  75. for (;;) {
  76. // if (osMutexAcquire(mini_mutex, osWaitForever) == osOK) {
  77. bool is_power_on = false;
  78. ffx_status_t status;
  79. for (int i = 0; i < sizeof(coil); i++) {
  80. if (coil[i] != 0) {
  81. uint16_t data[10];
  82. uint8_t inner_num = i + 1;
  83. nmbs_error err = nmbs_read_holding_registers(&nmbs,
  84. (MINI_GATEWAY_INNER_POWER_ADDRESS + 25 * i),
  85. 4, &data[0]);
  86. if (err == NMBS_ERROR_NONE) {
  87. status.power = data[0];
  88. status.mode = data[1];
  89. status.fan_speed = data[3] - 2;
  90. status.set_temp = data[2] / 10;
  91. status.inner_num = inner_num;
  92. if ((status.power == INNER_POWER_ON) && (is_power_on == false)) {
  93. osDelay(100);
  94. is_power_on = true;
  95. set_reg_value(POWER_REG_ADDRESS, status.power);
  96. set_reg_value(WORK_MODE_REG_ADDRESS, status.mode);
  97. set_reg_value(FAN_SPEED_REG_ADDRESS, status.fan_speed);
  98. set_reg_value(SET_TEMP_REG_ADDRESS, status.set_temp);
  99. set_reg_value(INNER_ERROR1_REG_ADDRESS, 0);
  100. error_count = 0;
  101. }
  102. } else {
  103. error_count++;
  104. is_error_ffx[i]++;
  105. is_power_on = true;
  106. if ((status.power == INNER_POWER_OFF) && is_error_ffx[i] > 3) {
  107. set_reg_value(INNER_ERROR1_REG_ADDRESS, 1);
  108. set_reg_value(POWER_REG_ADDRESS, status.power);
  109. error_count = 0;
  110. is_error_ffx[i] = 0;
  111. }
  112. }
  113. }
  114. osDelay(1000);
  115. }
  116. if ((status.power == INNER_POWER_OFF) && (is_power_on == false)) {
  117. set_reg_value(INNER_ERROR1_REG_ADDRESS, 0);
  118. set_reg_value(POWER_REG_ADDRESS, status.power);
  119. error_count = 0;
  120. }
  121. osDelay(1000);
  122. // osMutexRelease(mini_mutex);
  123. // }
  124. }
  125. }
  126. // 检测从机是否存在
  127. bool check_inner_slave_exist(uint8_t slave_addr) {
  128. nmbs_set_destination_rtu_address(&nmbs, slave_addr); // 设置从机地址
  129. bool result;
  130. osDelay(100);
  131. nmbs_read_coils(&nmbs, MINI_GATEWAY_INNER_COIL_ADDRESS + slave_addr - 1, 1, &result);
  132. if (result) {
  133. return true;
  134. } else {
  135. return false;
  136. }
  137. }
  138. _Noreturn void gateway_poll_task(void *pv) {
  139. uint8_t count = 0;
  140. for (;;) {
  141. nmbs_bitfield regs = {0};
  142. // if (osMutexAcquire(mini_mutex, osWaitForever) == osOK) {
  143. for (int i = 0; i <= INNER_SLAVE_ADDRESS_END; i++) {
  144. coil[i] = 0;
  145. }
  146. nmbs_error err1 = nmbs_read_coils(&nmbs, MINI_GATEWAY_INNER_COIL_ADDRESS, 8, &regs[0]);
  147. nmbs_read_coils(&nmbs, MINI_GATEWAY_INNER_COIL2_ADDRESS, 8, &regs[1]);
  148. nmbs_read_coils(&nmbs, MINI_GATEWAY_INNER_COIL_ERROR3_ADDRESS, 1, &regs[3]);
  149. nmbs_read_coils(&nmbs, MINI_GATEWAY_INNER_COIL_ERROR4_ADDRESS, 1, &regs[4]);
  150. osDelay(500);
  151. if (err1 == NMBS_ERROR_NONE) {
  152. set_reg_value(INNER_GROUP1_REG_ADDRESS, regs[0]);
  153. set_reg_value(INNER_GROUP2_REG_ADDRESS, regs[1]);
  154. set_reg_value(INNER_ERROR1_REG_ADDRESS, 0);
  155. set_reg_value(INNER_ERROR3_REG_ADDRESS, regs[3] << 2);
  156. set_reg_value(INNER_ERROR4_REG_ADDRESS, regs[4] << 3);
  157. error_count = 0;
  158. uint8_t buf;
  159. for (int i = 0; i <= INNER_SLAVE_ADDRESS_END; i++) {
  160. buf = (regs[0] - is_slave_exist) << (7 - i);
  161. coil[i] = buf >> (7);
  162. }
  163. } else {
  164. nmbs_error err2 = nmbs_read_coils(&nmbs, MINI_GATEWAY_INNER_COIL_ADDRESS, 8, &regs[0]);
  165. osDelay(300);
  166. if (err2 == NMBS_ERROR_NONE) {
  167. uint8_t buf;
  168. for (int i = 0; i <= INNER_SLAVE_ADDRESS_END; i++) {
  169. buf = (regs[0] - is_slave_exist) << (7 - i);
  170. coil[i] = buf >> (7);
  171. }
  172. error_count = 0;
  173. set_reg_value(INNER_GROUP1_REG_ADDRESS, regs[0]);
  174. }
  175. }
  176. count--;
  177. osDelay(500);
  178. // osMutexRelease(mini_mutex);
  179. osDelay(1000 * 60 * 10);
  180. // }
  181. }
  182. }
  183. void mini_gateway_master_init(void) {
  184. // mini_mutex = osMutexNew(NULL);
  185. nmbs_platform_conf platformConf;// 配置uart
  186. nmbs_platform_conf_create(&platformConf);
  187. platformConf.transport = NMBS_TRANSPORT_RTU;// RTU
  188. platformConf.read = &uart_read; // 读写函数1
  189. platformConf.write = &uart_write; // 读写函数
  190. nmbs_client_create(&nmbs, &platformConf);// 创建客户端
  191. nmbs_set_read_timeout(&nmbs, 300);
  192. nmbs_set_byte_timeout(&nmbs, 300);
  193. nmbs_set_destination_rtu_address(&nmbs, MINI_GATEWAY_SLAVE_ADDRESS);
  194. osThreadNew(gateway_poll_task, NULL, NULL);
  195. osThreadNew(mini_mater_task, NULL, NULL);
  196. }