Selaa lähdekoodia

1、修改拔插传感器过快导致其他传感器掉线问题(检测3次超时才认为掉线)

liyuezong 1 vuosi sitten
vanhempi
commit
fb459a3ed1
3 muutettua tiedostoa jossa 69 lisäystä ja 8 poistoa
  1. 66 8
      pro/src/app.c
  2. 2 0
      pro/src/common.h
  3. 1 0
      pro/src/sensor_handle.h

+ 66 - 8
pro/src/app.c

@@ -1902,13 +1902,26 @@ static void* sensor_thread(void* arg)
 #endif
                 if (ret == -1)
                 {
-                    _globalSensorMangerTemp->sensor_status = 1;
+                    //log_i("485 Timeout sensorAddr=%d, ret=%d\n", _globalSensorMangerTemp->sensor_addr, ret);
+                    _globalSensorMangerTemp->sensor_check_count++;
+
+                    if (_globalSensorMangerTemp->sensor_check_count >= SENSOR_MAX_CHECK_COUNT)
+                    {
+                        _globalSensorMangerTemp->sensor_status = 1;
+                        _globalSensorMangerTemp->sensor_check_count = SENSOR_MAX_CHECK_COUNT;
+                    }
+                    else
+                    {
+                        _globalSensorInfo.val1 = _globalSensorMangerTemp->Cur_sensor_info.val1;
+                        _globalSensorInfo.val2 = _globalSensorMangerTemp->Cur_sensor_info.val2;
+                    }
                 }
                 else
                 {
                     _globalSensorMangerTemp->sensor_status = 0;
                     _globalSensorInfo.val1 = temperature;
                     _globalSensorInfo.val2 = humidity;
+                    _globalSensorMangerTemp->sensor_check_count=0;
                 }
                 // log_d("sensor val:%0.2f %0.2f\n",temperature,humidity);
                 // printf("get temperature=%f   humidity=%f\n",temperature,humidity);
@@ -2002,13 +2015,25 @@ static void* sensor_thread(void* arg)
                                               &CO2);
                 if (ret == -1)
                 {
-                    _globalSensorMangerTemp->sensor_status = 1;
+                    _globalSensorMangerTemp->sensor_check_count++;
+
+                    if (_globalSensorMangerTemp->sensor_check_count >= SENSOR_MAX_CHECK_COUNT)
+                    {
+                        _globalSensorMangerTemp->sensor_status = 1;
+                        _globalSensorMangerTemp->sensor_check_count = SENSOR_MAX_CHECK_COUNT;
+                    }
+                    else
+                    {
+                        _globalSensorInfo.val1 = _globalSensorMangerTemp->Cur_sensor_info.val1;
+                        _globalSensorInfo.val2 = _globalSensorMangerTemp->Cur_sensor_info.val2;
+                    }
                 }
                 else
                 {
                     _globalSensorMangerTemp->sensor_status = 0;
                     _globalSensorInfo.val1 = CO2;
                     _globalSensorInfo.val2 = 0;
+                    _globalSensorMangerTemp->sensor_check_count = 0;
                 }
                 _globalSensorMangerTemp->Cur_sensor_info = _globalSensorInfo;
                 for(int i = 0 ; i < NOARTH_MAX_SENSOR;i++)           //最多4个
@@ -2043,13 +2068,24 @@ static void* sensor_thread(void* arg)
                 sensor_dat_t sdat;
                 ret = sensor_get_data(SENSOR_TYPE_TEMP, SENSOR_TYPE_TEMP_BTG50H8EL3200, _globalSensorMangerTemp->sensor_addr, 0, &sdat);
                 if (ret == -1){
-                    //log_w("Relay modbus Error:%s\n", modbus_strerror(errno));
-                    _globalSensorMangerTemp->sensor_status = 1;
+                    _globalSensorMangerTemp->sensor_check_count++;
+
+                    if (_globalSensorMangerTemp->sensor_check_count >= SENSOR_MAX_CHECK_COUNT)
+                    {
+                        _globalSensorMangerTemp->sensor_status = 1;
+                        _globalSensorMangerTemp->sensor_check_count = SENSOR_MAX_CHECK_COUNT;
+                    }
+                    else
+                    {
+                        _globalSensorInfo.val1 = _globalSensorMangerTemp->Cur_sensor_info.val1;
+                        _globalSensorInfo.val2 = _globalSensorMangerTemp->Cur_sensor_info.val2;
+                    }
                 }
                 else {
                     _globalSensorMangerTemp->sensor_status = 0;
                     _globalSensorInfo.val1 = sdat.val[0];
                     _globalSensorInfo.val2 = 0.0f;
+                    _globalSensorMangerTemp->sensor_check_count = 0;
                 }
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
                 set_sensor_val_modbus(_globalDeviceManager,&_globalSensorInfo,_globalSensorMangerTemp->sensor_addr);
@@ -2062,13 +2098,24 @@ static void* sensor_thread(void* arg)
                 sensor_dat_t sdat;
                 ret = sensor_get_data(SENSOR_TYPE_LEAK, SENSOR_TYPE_LEAK_XWDC01A, _globalSensorMangerTemp->sensor_addr, 0, &sdat);
                 if (ret == -1){
-                    //log_w("Relay modbus Error:%s\n", modbus_strerror(errno));
-                    _globalSensorMangerTemp->sensor_status = 1;
+                    _globalSensorMangerTemp->sensor_check_count++;
+
+                    if (_globalSensorMangerTemp->sensor_check_count >= SENSOR_MAX_CHECK_COUNT)
+                    {
+                        _globalSensorMangerTemp->sensor_status = 1;
+                        _globalSensorMangerTemp->sensor_check_count = SENSOR_MAX_CHECK_COUNT;
+                    }
+                    else
+                    {
+                        _globalSensorInfo.val1 = _globalSensorMangerTemp->Cur_sensor_info.val1;
+                        _globalSensorInfo.val2 = _globalSensorMangerTemp->Cur_sensor_info.val2;
+                    }
                 }
                 else {
                     _globalSensorMangerTemp->sensor_status = 0;
                     _globalSensorInfo.val1 = sdat.flag;
                     _globalSensorInfo.val2 = 0.0f;
+                    _globalSensorMangerTemp->sensor_check_count = 0;
                 }
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
                 for(int i = 0 ; i < NOARTH_MAX_SENSOR;i++)           //最多4个
@@ -2107,14 +2154,25 @@ static void* sensor_thread(void* arg)
 
                 if (ret == -1)
                 {
-                    //log_w("Relay modbus Error:%s\n", modbus_strerror(errno));
-                    _globalSensorMangerTemp->sensor_status = 1;
+                    _globalSensorMangerTemp->sensor_check_count++;
+
+                    if (_globalSensorMangerTemp->sensor_check_count >= SENSOR_MAX_CHECK_COUNT)
+                    {
+                        _globalSensorMangerTemp->sensor_status = 1;
+                        _globalSensorMangerTemp->sensor_check_count = SENSOR_MAX_CHECK_COUNT;
+                    }
+                    else
+                    {
+                        _globalSensorInfo.val1 = _globalSensorMangerTemp->Cur_sensor_info.val1;
+                        _globalSensorInfo.val2 = _globalSensorMangerTemp->Cur_sensor_info.val2;
+                    }
                 }
                 else
                 {
                     _globalSensorMangerTemp->sensor_status = 0;
                     _globalSensorInfo.val1 = temperature;
                     _globalSensorInfo.val2 = temperature2;
+                    _globalSensorMangerTemp->sensor_check_count = 0;
                 }
                 // log_d("sensor val:%0.2f %0.2f\n",temperature,humidity);
                 // printf("get temperature=%f   humidity=%f\n",temperature,humidity);

+ 2 - 0
pro/src/common.h

@@ -838,6 +838,8 @@ typedef struct
     int                 sensor_status                              ;//传感器状态
     int                 sensor_val_count                           ;//传感器值个数
     int                 sensor_node_number                         ;//节点号
+    int                 sensor_check_count;                         //值状态计数
+
     GlobalSensorInfo Cur_sensor_info ;
     GlobalSensorOverManage over_manager                            ;//超限管理   
     GlobalSensorOverInfo warning_status;//报警状态

+ 1 - 0
pro/src/sensor_handle.h

@@ -8,6 +8,7 @@ typedef union {
     float     val[2];
 }sensor_dat_t;
 
+#define SENSOR_MAX_CHECK_COUNT      3
 
 int sensor_get_temperature_value(void* manger,int saddr,float* temp,float* humi);
 int sensor_get_temperature_value_anderson(void* manger,int saddr,float* temp,float* humi);