Ver Fonte

master-250311

燕建军 há 3 meses atrás
pai
commit
e5b87bf0a0
2 ficheiros alterados com 263 adições e 0 exclusões
  1. 41 0
      Core/Inc/constants_is_three.h
  2. 222 0
      Core/Src/constants_is_three.c

+ 41 - 0
Core/Inc/constants_is_three.h

@@ -0,0 +1,41 @@
+//
+// Created by DELL on 2024/10/16.
+//
+
+#ifndef GMV_GATEWAY_BOARD_CONTANTS_IS_THREE_H
+#define GMV_GATEWAY_BOARD_CONTANTS_IS_THREE_H
+
+#include "main.h"
+
+#define SLAVE_ADDRESS_START_2 7       // 从机地址起始
+#define SLAVE_ADDRESS_END_2 10         // 从机地址结束
+#define SLAVE_ADDRESS_END_3 20         // 从机地址结束
+
+#define THREE_CONSTANTS_POWER_REG_ADDRESS 1     // 新风机电源地址
+#define THREE_CONSTANTS_MODE_REG_ADDRESS 2     // 新风机工作模式
+#define THREE_CONSTANTS_FAN_SPEED_REG_ADDRESS 3     // 风机档位
+#define THREE_CONSTANTS_HUMP_ON_REG_ADDRESS 11     // 加湿低位
+#define THREE_CONSTANTS_HUMP_OFF_REG_ADDRESS 12     // 加湿高位
+#define THREE_CONSTANTS_ERRORS_REG_ADDRESS 32     // 新风加湿机故障码
+#define DRY_ERRORS_REG_ADDRESS 0x07     // 新风加湿机故障码
+#define DRY_POWER_REG_ADDRESS 0x14     // 除湿机电源地址
+#define DRY_MODE_REG_ADDRESS 0x15     // 除湿机模式地址
+
+typedef struct
+{
+    uint8_t power;
+    uint8_t mode;
+    uint8_t fresh_air_system;
+    uint8_t fan_speed;
+    uint8_t set_temp;
+    uint8_t inner_num;
+    uint8_t humidity_on;
+    uint8_t humidity_off;
+} ffx_status_t2;
+
+/**
+ * init ffx master
+ */
+void constants_is_three_master_init();
+
+#endif //GMV_GATEWAY_BOARD_FFX_MASTER_H

+ 222 - 0
Core/Src/constants_is_three.c

@@ -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);
+}
+