|
@@ -0,0 +1,222 @@
|
|
|
+////
|
|
|
+//// Created by DELL on 2024/10/16.1
|
|
|
+/*
|
|
|
+ * 2025年1月24日,新风加湿机控制部分,解决通讯短暂断开故障
|
|
|
+ * 2025年1月25日,增加新风除湿机
|
|
|
+ *
|
|
|
+*/////
|
|
|
+#include "main.h"
|
|
|
+#include "constants_is_three.h"
|
|
|
+#include "modbus.h"
|
|
|
+#include "usart.h"
|
|
|
+#include "cmsis_os2.h"
|
|
|
+#include "mini_gateway_master.h"
|
|
|
+#include "modbus_slave.h"
|
|
|
+
|
|
|
+static nmbs_t nmbs;
|
|
|
+uint8_t slaves_2[SLAVE_ADDRESS_END] = {0}; // 保存已经存在的从站号
|
|
|
+static osMutexId_t constants_is_three_key;
|
|
|
+
|
|
|
+void search_3constants_slave();
|
|
|
+
|
|
|
+static int32_t uart_read(uint8_t *buf, uint16_t count, int32_t byte_timeout_ms,
|
|
|
+ void *arg) {
|
|
|
+ HAL_StatusTypeDef status = HAL_UART_Receive(&huart3, buf, count, byte_timeout_ms);
|
|
|
+ if (status == HAL_OK) {
|
|
|
+ return count;
|
|
|
+ } else {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static int32_t uart_write(const uint8_t *buf, uint16_t count, int32_t byte_timeout_ms,
|
|
|
+ void *arg) {
|
|
|
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
|
|
|
+ HAL_UART_Transmit(&huart3, buf, count, byte_timeout_ms);
|
|
|
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
+//// task
|
|
|
+_Noreturn void constants_is_three_poll_task(void *pv) {
|
|
|
+ for (;;) {
|
|
|
+ if (osMutexAcquire(constants_is_three_key, osWaitForever) == osOK) {
|
|
|
+ search_3constants_slave();
|
|
|
+ osMutexRelease(constants_is_three_key);
|
|
|
+ }
|
|
|
+ osDelay(1000 * 60 * 1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+bool get_three_constants_status_2(ffx_status_t *three_constants_Status) {
|
|
|
+ uint8_t data1[2] = {0};
|
|
|
+ data1[0] = get_reg_value(POWER_REG_ADDRESS);
|
|
|
+ nmbs_error err = nmbs_write_multiple_registers(&nmbs, THREE_CONSTANTS_POWER_REG_ADDRESS, 1, &data1);
|
|
|
+ three_constants_Status->power = data1[0];
|
|
|
+ if (err != NMBS_ERROR_NONE) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ err = nmbs_read_holding_registers(&nmbs, THREE_CONSTANTS_ERRORS_REG_ADDRESS, 1, &data1);
|
|
|
+ three_constants_Status->errors = data1[0];
|
|
|
+ set_reg_value(INNER_ERROR4_REG_ADDRESS, three_constants_Status->errors);
|
|
|
+ if (err != NMBS_ERROR_NONE) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+bool get_dry_status(ffx_status_t *dry_Status) {
|
|
|
+ uint16_t data[4] = {0};
|
|
|
+ data[0] = get_reg_value(POWER_REG_ADDRESS);
|
|
|
+ dry_Status->fresh_air_system = get_reg_value(FRESH_AIR_MODE_REG_ADDRESS);
|
|
|
+ dry_Status->fan_speed = get_reg_value(FAN_SPEED_REG_ADDRESS);
|
|
|
+ switch (dry_Status->fresh_air_system) {
|
|
|
+ case 2://
|
|
|
+ data[1] = 1;
|
|
|
+ break;
|
|
|
+ case 4://
|
|
|
+ data[1] = 0;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ switch (dry_Status->fan_speed) {
|
|
|
+ case 1://
|
|
|
+ data[2] = 1;
|
|
|
+ break;
|
|
|
+ case 2://
|
|
|
+ data[2] = 1;
|
|
|
+ break;
|
|
|
+ case 3://
|
|
|
+ data[2] = 2;
|
|
|
+ break;
|
|
|
+ case 4://
|
|
|
+ data[2] = 2;
|
|
|
+ break;
|
|
|
+ case 5://
|
|
|
+ data[2] = 3;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ data[3] = 60;
|
|
|
+ nmbs_error err = nmbs_write_multiple_registers(&nmbs, DRY_POWER_REG_ADDRESS, 4, &data[0]);
|
|
|
+ dry_Status->power = data[0];
|
|
|
+ if (err != NMBS_ERROR_NONE) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ err = nmbs_read_holding_registers(&nmbs, DRY_ERRORS_REG_ADDRESS, 1, &data);
|
|
|
+ dry_Status->errors = data[0];
|
|
|
+ set_reg_value(INNER_ERROR4_REG_ADDRESS, dry_Status->errors);
|
|
|
+ if (err != NMBS_ERROR_NONE) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+_Noreturn void constants_is_three_poll_mater_task_2(void *pv) {
|
|
|
+ for (;;) {
|
|
|
+ if (osMutexAcquire(constants_is_three_key, osWaitForever) == osOK) {
|
|
|
+ bool fresh_air_flag = false;
|
|
|
+ for (int i = 0; i < sizeof(slaves_2); i++) {
|
|
|
+ if (slaves_2[i] == 20) { //新风除湿机,站号20
|
|
|
+ ffx_status_t Dry_Status;
|
|
|
+ nmbs_set_destination_rtu_address(&nmbs, slaves_2[i]);
|
|
|
+ if ((get_reg_value(POWER_REG_ADDRESS) == 0)) {
|
|
|
+ DEBUG_PRINTF("The REG_POWER_ADDRESS is 0.\r\n");
|
|
|
+ }
|
|
|
+ if (get_dry_status(&Dry_Status) && Dry_Status.power == 1) {
|
|
|
+ set_reg_value(FRESH_AIR_REG_ADDRESS, slaves_2[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if ((slaves_2[i] != 0) && (slaves_2[i] != 20)) { //新风加湿机,站号7~10
|
|
|
+ ffx_status_t three_constants_Status;
|
|
|
+ nmbs_set_destination_rtu_address(&nmbs, slaves_2[i]);
|
|
|
+ if ((get_reg_value(POWER_REG_ADDRESS) == 0)) {
|
|
|
+ DEBUG_PRINTF("The REG_POWER_ADDRESS is 0.\r\n");
|
|
|
+ }
|
|
|
+ if (get_three_constants_status_2(&three_constants_Status) &&
|
|
|
+ three_constants_Status.power == 1) {
|
|
|
+ set_reg_value(FRESH_AIR_REG_ADDRESS, slaves_2[i]);
|
|
|
+ uint16_t fresh_air_reg[5] = {0};
|
|
|
+ fresh_air_reg[0] = get_reg_value(WORK_MODE_REG_ADDRESS);
|
|
|
+ fresh_air_reg[1] = get_reg_value(FRESH_AIR_MODE_REG_ADDRESS);
|
|
|
+ fresh_air_reg[2] = get_reg_value(FAN_SPEED_REG_ADDRESS);
|
|
|
+ fresh_air_reg[3] = get_reg_value(HUMP_ON_FFX_ADDRESS);
|
|
|
+ fresh_air_reg[4] = get_reg_value(HUMP_OFF_FFX_ADDRESS);
|
|
|
+ nmbs_error err = nmbs_write_multiple_registers(&nmbs, THREE_CONSTANTS_MODE_REG_ADDRESS, 2,
|
|
|
+ &fresh_air_reg[1]);
|
|
|
+ osDelay(200);
|
|
|
+ err = nmbs_write_multiple_registers(&nmbs, THREE_CONSTANTS_HUMP_ON_REG_ADDRESS, 2,
|
|
|
+ &fresh_air_reg[3]);
|
|
|
+ }
|
|
|
+ osDelay(2000);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ osMutexRelease(constants_is_three_key);
|
|
|
+ osDelay(1000);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+//// 检测从机是否存在
|
|
|
+bool check_slave_exist_2(uint8_t slave_addr) {
|
|
|
+ nmbs_set_destination_rtu_address(&nmbs, slave_addr);
|
|
|
+ uint16_t result;
|
|
|
+ osDelay(10);
|
|
|
+ nmbs_error err = nmbs_read_holding_registers(&nmbs, 0x01, 1, &result);
|
|
|
+ return err == NMBS_ERROR_NONE;
|
|
|
+}
|
|
|
+
|
|
|
+//// 轮询从站
|
|
|
+void search_3constants_slave() {
|
|
|
+ for (int i = SLAVE_ADDRESS_START_2; i <= SLAVE_ADDRESS_END_2; i++) {
|
|
|
+ bool exist = check_slave_exist_2(i);
|
|
|
+ if (exist != NMBS_ERROR_NONE) {
|
|
|
+ slaves_2[i - 7] = i;
|
|
|
+ set_reg_value(INNER_ERROR2_REG_ADDRESS, 0);
|
|
|
+ }
|
|
|
+ osDelay(10);
|
|
|
+ if (exist == NMBS_ERROR_NONE) {
|
|
|
+ exist = check_slave_exist_2(i);
|
|
|
+ if (exist != NMBS_ERROR_NONE) {
|
|
|
+ slaves_2[i - 7] = i;
|
|
|
+ set_reg_value(INNER_ERROR2_REG_ADDRESS, 0);
|
|
|
+ } else {
|
|
|
+ set_reg_value(INNER_ERROR2_REG_ADDRESS, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ osDelay(10);
|
|
|
+ }
|
|
|
+ bool exist = check_slave_exist_2(SLAVE_ADDRESS_END_3);
|
|
|
+ if (exist != NMBS_ERROR_NONE) {
|
|
|
+ slaves_2[4] = 20;
|
|
|
+ set_reg_value(INNER_ERROR2_REG_ADDRESS, 0);
|
|
|
+ }
|
|
|
+ osDelay(10);
|
|
|
+ if (exist == NMBS_ERROR_NONE) {
|
|
|
+ exist = check_slave_exist_2(SLAVE_ADDRESS_END_3);
|
|
|
+ if (exist != NMBS_ERROR_NONE) {
|
|
|
+ slaves_2[4] = 20;
|
|
|
+ set_reg_value(INNER_ERROR2_REG_ADDRESS, 0);
|
|
|
+ } else {
|
|
|
+ set_reg_value(INNER_ERROR2_REG_ADDRESS, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ osDelay(100);
|
|
|
+}
|
|
|
+
|
|
|
+void constants_is_three_master_init() {
|
|
|
+ constants_is_three_key = osMutexNew(NULL);
|
|
|
+ nmbs_platform_conf platformConf;// 配置uart
|
|
|
+ nmbs_platform_conf_create(&platformConf);
|
|
|
+ platformConf.transport = NMBS_TRANSPORT_RTU;// RTU
|
|
|
+ platformConf.read = &uart_read; // 读写函数
|
|
|
+ platformConf.write = &uart_write; // 读写函数
|
|
|
+ nmbs_client_create(&nmbs, &platformConf);// 创建客户端
|
|
|
+ nmbs_set_read_timeout(&nmbs, 400);
|
|
|
+ nmbs_set_byte_timeout(&nmbs, 400);
|
|
|
+ // 开启轮询任务
|
|
|
+ osThreadNew(constants_is_three_poll_task, NULL, NULL);
|
|
|
+ osThreadNew(constants_is_three_poll_mater_task_2, NULL, NULL);
|
|
|
+}
|
|
|
+
|