Explorar o código

Merge branch 'master' of http://jiecheng2024.tpddns.cn:3000/liyuezong/SmartPDCode

guohui %!s(int64=2) %!d(string=hai) anos
pai
achega
e56534a734
Modificáronse 5 ficheiros con 149 adicións e 17 borrados
  1. 1 1
      pro/config/cfg.h
  2. 43 14
      pro/src/app.c
  3. 0 2
      pro/src/breaker_detection.c
  4. 99 0
      pro/src/switch_ctrl.c
  5. 6 0
      pro/src/switch_ctrl.h

+ 1 - 1
pro/config/cfg.h

@@ -80,7 +80,7 @@
     #endif
     
     #undef MAX_CHN_COUNT
-    #define MAX_CHN_COUNT               4//24
+    #define MAX_CHN_COUNT               24
 #endif
 
 

+ 43 - 14
pro/src/app.c

@@ -99,7 +99,6 @@ void* power_thread(void* arg)
     unsigned int sSaveTime = _globalDeviceManager->_globalDevInfo.product_save_time;
     log_d("samp_time:%dms save_time:%dms\n", samp_time,sSaveTime);
 
-    
     bool isErrorBreak=false;
     _globalDeviceManager->_ReloadChm_flag=false;
     list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
@@ -121,7 +120,6 @@ void* power_thread(void* arg)
     }
 
     //db_ow_test(_globalDeviceManager->db, &lastIndex, &lastIndex3);
-
     //采集线程
     while (h->quit==0)
     {
@@ -1225,6 +1223,8 @@ void sensor_alarm(GlobalSensorManger *_globalSensorMangerTemp, int nAlarmType)
 void* breaker_thread(void *arg)
 {
     int r;
+    int ret=0;
+    unsigned int usleepTime = 30000;
     GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
     GlobalBreakerManager *temp = NULL;
     uint16_t value = 0;
@@ -1247,18 +1247,44 @@ void* breaker_thread(void *arg)
             // {
             //     //DI
             // }
-            if(temp->breaker_gather_addr)
+            if( temp->breaker_gather_addr>=BREADER_485_ADDR && temp->breaker_gather_addr<BREADER_485_ADDR+BREAKER_BOARD_MAX)
             {
-                if((temp->breaker_gather_addr-BREADER_485_ADDR < BREAKER_BOARD_MAX) && 
-                           ((breaker_scann->breaker_flag[temp->breaker_gather_addr-BREADER_485_ADDR]) == 1))
+                if( breaker_scann->breaker_flag[temp->breaker_gather_addr-BREADER_485_ADDR] == 1)
                 {
                     int chn = temp->breaker_chn;
-                    temp->breaker_status = breaker_scann->board[temp->breaker_gather_addr-BREADER_485_ADDR].ch_status[chn-1];
+                    if (chn>=1&& chn<=BREAKER_485_CHN_MAX)
+                    {
+                        temp->breaker_status = breaker_scann->board[temp->breaker_gather_addr-BREADER_485_ADDR].ch_status[chn-1];
+                    }
                 }else
                 {
                     temp->breaker_status = 0;
                 }
             }
+
+            if (temp->breaker_gather_addr>0&&temp->breaker_gather_addr<=MAX_CHN_COUNT)
+            {
+                for (size_t i = 0; i < MAX_CHN_COUNT; i++)
+                {
+                    if (_globalDeviceManager->_all_ctrl_board[i].product_saddr != temp->breaker_gather_addr)
+                    {
+                        continue;
+                    }
+                    ret = g_switch_get_breaker_info(&_globalDeviceManager->_globalRelaySampManger,
+                                                    _globalDeviceManager->_all_ctrl_board[i].product_type,
+                                                    _globalDeviceManager->_all_ctrl_board[i].product_saddr,
+                                                    temp);
+                    if (ret < 0)
+                    {
+                        usleep(usleepTime);
+                        ret = g_switch_get_breaker_info(&_globalDeviceManager->_globalRelaySampManger,
+                                                        _globalDeviceManager->_all_ctrl_board[i].product_type,
+                                                        _globalDeviceManager->_all_ctrl_board[i].product_saddr,
+                                                        temp);
+                    }
+                    break;
+                }
+            }
         }
         lock_s_release(LOCK_ID_BREAKER);
         sleep(1);
@@ -1879,21 +1905,24 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
 
     //first scannner breaker borad;
     unsigned short value;
-    breaker_scanner_t* breaker= get_breaker_scanner();
-    memset(breaker,0,sizeof(breaker_scanner_t));
-    for(int i = 0; i < BREAKER_BOARD_MAX; i++)
+    breaker_scanner_t *breaker = get_breaker_scanner();
+    memset(breaker, 0, sizeof(breaker_scanner_t));
+    for (int i = 0; i < BREAKER_BOARD_MAX; i++)
     {
-        ret = breaker_485_get_chn_status((void*)&_globalDeviceManager->_globalRelaySampManger,
-                BREADER_485_ADDR+i,BREADER_485_ADDR_CHN_REG,&value);
-        log_d("ret:%d breaker id:%d .\n",ret,BREADER_485_ADDR+i);
-        if(ret == 0)
+        ret = breaker_485_get_chn_status((void *)&_globalDeviceManager->_globalRelaySampManger,
+                                         BREADER_485_ADDR + i, BREADER_485_ADDR_CHN_REG, &value);
+        log_d("ret:%d breaker id:%d .\n", ret, BREADER_485_ADDR + i);
+        if (ret == 0)
         {
             breaker->breaker_flag[i] = 1;
-        }else
+        }
+        else
         {
             breaker->breaker_flag[i] = 0;
         }
     }
+
+    //init power manage
     //搜索子地址
     chn = 1 ;
     nTac_chn=3;

+ 0 - 2
pro/src/breaker_detection.c

@@ -12,8 +12,6 @@
 
 static breaker_scanner_t breaker_scanner;
 
-
-
 int breaker_init(int gpio)
 {
     char buff[1024] = {0};

+ 99 - 0
pro/src/switch_ctrl.c

@@ -2,6 +2,7 @@
 #include "sqlite_handle.h"
 #include "modbus_handle.h"
 #include "hlw8110_habdle.h"
+#include "breaker_detection.h"
 
 /// @brief 获取继电器板类型以及通道
 /// @param manger 
@@ -3014,4 +3015,102 @@ int ResetChmData(int nCtrlType)
     dev_Alarm_Run_message(_globalDeviceManager,strLog,number);
     dev_get_power_ds(_globalDeviceManager->db,&_globalDeviceManager->_globalPowerManger,NULL);
     return ret;
+}
+
+int g_switch_get_breaker_info(void* manger,int ntype,int saddr,GlobalBreakerManager* _breaker)
+{
+    switch (ntype)
+    {
+    case AC_SINGLE_S_TYPE:
+    case AC_SINGLE_B_TYPE:
+    {
+        return g_switch_get_ac_breaker_info(manger, saddr, _breaker);
+    }
+    break;
+    case DCPDU_TYPE:
+    break;
+    case TREE_AC_TYPE:
+    {
+        return g_switch_get_t_ac_breaker_info(manger, saddr, _breaker);
+    }
+    break;
+    case AC_MULTI_S_TYPE:
+    case AC_MULTI_B_TYPE:
+    case DC_IN_TYPE:
+    default:
+        return 1;
+        break;
+    }
+    return 1;
+}
+
+int g_switch_get_ac_breaker_info(void* manger,int saddr,GlobalBreakerManager* _breaker)
+{
+    if (_breaker == NULL)
+    {
+        return -1;
+    }
+    
+    unsigned int offset = 0;
+    unsigned int val = 0;
+    unsigned short data_temp[2] = {0};
+    unsigned int status_temp = 0;
+    int ret = 0;
+    offset = _SWITCH_AC_BREAKER_INFO;
+    // 读取寄存器
+    memset(data_temp, 0, sizeof(data_temp));
+    ret = g_modbus_read_x_reg(manger, saddr, offset, 1, data_temp);
+    if (ret < 0)
+    {
+        log_w("g_switch_get_ac_breaker_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
+        // log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
+        return ret;
+    }
+
+    status_temp=data_temp[0];
+    // 解开关状态数据,单相控制板最多支持2个开关检测
+    if (_breaker->breaker_chn==1)
+    {
+        _breaker->breaker_status  = status_temp & (BIT_00);
+    }
+    else if (_breaker->breaker_chn==2)
+    {
+        _breaker->breaker_status  = status_temp & (BIT_01);
+    }
+    else _breaker->breaker_status  = 0;
+    
+    return 0;
+}
+int g_switch_get_t_ac_breaker_info(void* manger,int saddr,GlobalBreakerManager* _breaker)
+{
+    if (_breaker == NULL)
+    {
+        return -1;
+    }
+    
+    unsigned int offset = 0;
+    unsigned int val = 0;
+    unsigned short data_temp[2] = {0};
+    unsigned int status_temp = 0;
+    int ret = 0;
+    offset = _SWITCH_T_AC_BREAKER_INFO;
+    // 读取寄存器
+    memset(data_temp, 0, sizeof(data_temp));
+    ret = g_modbus_read_x_reg(manger, saddr, offset, 1, data_temp);
+    if (ret < 0)
+    {
+        log_w("g_switch_get_ac_breaker_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
+        // log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
+        return ret;
+    }
+
+    status_temp=data_temp[0];
+    // 解开关状态数据,三相控制板最多支持1个开关检测
+    if (_breaker->breaker_chn==1)
+    {
+        _breaker->breaker_status  = status_temp & (BIT_00);
+    }
+    else _breaker->breaker_status  = 0;
+    
+    return 0;
 }

+ 6 - 0
pro/src/switch_ctrl.h

@@ -25,6 +25,7 @@ enum MODBUS_MODE
 #define _SWITCH_DC_STS_INFO   0x1097        //直流继电器电路控制板开关状态,采集一路输出
 #define _SWITCH_DC_IN_INFO      0x105F      //直流总电流电压采集控制板,采集设备输入电压和输入电流
 
+#define _SWITCH_AC_BREAKER_INFO 0x10D6        //单相控制板开关检测信息
 
 #define _SWITCH_AC_SINGLE_S_START_DELAY_TIME 0x1194        //单相小电流继电器板开启延时
 #define _SWITCH_AC_SINGLE_S_STOP_DELAY_TIME 0x11A6         //单相小电流继电器板关闭延时
@@ -90,6 +91,8 @@ enum MODBUS_MODE
 #define _SWITCH_T_AC_RESET_CONSUMPTION_PH  0x189C          //重置PH耗电量
 #define _SWITCH_T_AC_RESET_CONSUMPTION     0x18A5          //重置all耗电量
 
+#define _SWITCH_T_AC_BREAKER_INFO 0x17D4        //三相控制板开关检测信息
+
 int g_switch_get_type(void* manger,int saddr, int* type,int* chn,int nPowerType);
 
 int g_switch_get_ac_single_s_cur_info(void* manger,int saddr,unsigned char chn,PowerInfo* _power,PowerWarningInfo* _warning);
@@ -181,6 +184,9 @@ int g_switch_set_ac_single_b_time_delay(void* manger,int saddr,unsigned char chn
 int g_switch_set_dc_time_delay(void* manger,int saddr,unsigned int time);
 //int g_switch_set_ac_single_s_ctrl(void* manger,int saddr,unsigned short* sts);
 
+int g_switch_get_breaker_info(void* manger,int ntype,int saddr,GlobalBreakerManager* _breaker);
+int g_switch_get_ac_breaker_info(void* manger,int saddr,GlobalBreakerManager* _breaker);
+int g_switch_get_t_ac_breaker_info(void* manger,int saddr,GlobalBreakerManager* _breaker);
 
 //重新加载端口
 int ResetChmData(int nCtrlType);