ffx_master.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //
  2. // Created by DELL on 2024/10/16.
  3. //
  4. #include "ffx_master.h"
  5. #include "modbus.h"
  6. #include "usart.h"
  7. #include "cmsis_os2.h"
  8. #include "mini_gateway_master.h"
  9. #include "modbus_slave.h"
  10. static nmbs_t nmbs;
  11. static uint8_t slaves[5] = {0}; // 保存已经存在的从站号
  12. static uint8_t index = 0;
  13. void search_ffx_slave();
  14. static int32_t uart_read(uint8_t *buf, uint16_t count, int32_t byte_timeout_ms,
  15. void *arg)
  16. {
  17. HAL_StatusTypeDef status = HAL_UART_Receive(&huart2, buf, count, byte_timeout_ms);
  18. if (status == HAL_OK)
  19. {
  20. return count;
  21. } else
  22. {
  23. return 0;
  24. }
  25. }
  26. static int32_t uart_write(const uint8_t *buf, uint16_t count, int32_t byte_timeout_ms,
  27. void *arg)
  28. {
  29. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
  30. HAL_UART_Transmit(&huart2, buf, count, byte_timeout_ms);
  31. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
  32. return count;
  33. }
  34. // task
  35. _Noreturn void ffx_poll_task(void *pv){
  36. for (;;)
  37. {
  38. search_ffx_slave();
  39. HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  40. osDelay(1000 * 60);
  41. }
  42. }
  43. _Noreturn void ffx_mater_task(void *pv)
  44. {
  45. for (;;)
  46. {
  47. ffx_status_t ffxStatus;
  48. bool is_power_on = false;
  49. for (int i = 0; i < sizeof(slaves); i++)
  50. {
  51. if (slaves[i] != 0)
  52. {
  53. nmbs_set_destination_rtu_address(&nmbs, slaves[i]);
  54. uint16_t data[10];
  55. uint16_t inner_data[1];
  56. nmbs_error err = nmbs_read_holding_registers(&nmbs, POWER_FFX_ADDRESS, 2, data);
  57. osDelay(200);
  58. nmbs_read_holding_registers(&nmbs, INNER_NUM_FFX_ADDRESS, 1, &inner_data[0]);
  59. osDelay(200);
  60. nmbs_read_holding_registers(&nmbs, SET_TEMP_FFX_ADDRESS, 1, &data[2]);
  61. osDelay(200);
  62. nmbs_read_holding_registers(&nmbs, FAN_SPEED_FFX_ADDRESS, 1, &data[3]);
  63. osDelay(200);
  64. nmbs_read_holding_registers(&nmbs, TEMP_ON_FFX_ADDRESS, 1, &data[4]);
  65. osDelay(200);
  66. nmbs_read_holding_registers(&nmbs, TEMP_OFF_FFX_ADDRESS, 1, &data[5]);
  67. if (err == NMBS_ERROR_NONE)
  68. {
  69. ffxStatus.power = data[0];
  70. ffxStatus.mode = data[1];
  71. ffxStatus.set_temp = data[2];
  72. ffxStatus.fan_speed = data[3];
  73. ffxStatus.inner_num = inner_data[0];
  74. if (ffxStatus.power && !(is_power_on))
  75. {
  76. is_power_on = true;
  77. set_reg_value(POWER_REG_ADDRESS, ffxStatus.power);
  78. set_reg_value(WORK_MODE_REG_ADDRESS, ffxStatus.mode);
  79. set_reg_value(INNER_REG_ADDRESS, ffxStatus.inner_num);
  80. set_reg_value(FAN_SPEED_REG_ADDRESS, ffxStatus.fan_speed);
  81. set_reg_value(SET_TEMP_REG_ADDRESS, ffxStatus.set_temp);
  82. set_reg_value(TEMP_ON_FFX_ADDRESS, data[4]);
  83. set_reg_value(TEMP_OFF_FFX_ADDRESS, data[5]);
  84. }
  85. sync_ac_status(&ffxStatus);
  86. }
  87. osDelay(500);
  88. }
  89. }
  90. HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);// LED闪烁
  91. if ((ffxStatus.power == 0) && (is_power_on == false))
  92. {
  93. set_reg_value(POWER_REG_ADDRESS, ffxStatus.power);
  94. }
  95. }
  96. }
  97. // 检测从机是否存在
  98. bool check_slave_exist(uint8_t slave_addr)
  99. {
  100. nmbs_set_destination_rtu_address(&nmbs, slave_addr);
  101. uint16_t result;
  102. HAL_Delay(300);
  103. nmbs_error err = nmbs_read_holding_registers(&nmbs, 0x01, 1, &result);
  104. return err == NMBS_ERROR_NONE;
  105. }
  106. // 轮询从站
  107. void search_ffx_slave()
  108. {
  109. for (int i = SLAVE_ADDRESS_START; i <= SLAVE_ADDRESS_END; i++)
  110. {
  111. bool exist = check_slave_exist(i);
  112. if (exist)
  113. {
  114. slaves[index] = i;
  115. index++;
  116. }
  117. // HAL_Delay(500);
  118. }
  119. index = 0;
  120. }
  121. void ffx_master_init()
  122. {
  123. nmbs_platform_conf platformConf;// 配置uart
  124. platformConf.transport = NMBS_TRANSPORT_RTU;// RTU
  125. platformConf.read = &uart_read; // 读写函数
  126. platformConf.write = &uart_write; // 读写函数
  127. nmbs_client_create(&nmbs, &platformConf);// 创建客户端
  128. nmbs_set_read_timeout(&nmbs, 100);
  129. nmbs_set_byte_timeout(&nmbs, 100);
  130. // search_ffx_slave();
  131. // 开启轮询任务
  132. osThreadNew(ffx_poll_task, NULL, NULL);
  133. osThreadNew(ffx_mater_task, NULL, NULL);
  134. }