|
@@ -38,9 +38,11 @@ void* power_thread(void* arg)
|
|
|
GlobalPowerManger* _globalPowerMangerTemp = NULL ;
|
|
GlobalPowerManger* _globalPowerMangerTemp = NULL ;
|
|
|
GlobalPowerInfo _globalPowerInfo ;
|
|
GlobalPowerInfo _globalPowerInfo ;
|
|
|
GlobalPowerInfo _globalTotalPowerInfo ; //总电源信息
|
|
GlobalPowerInfo _globalTotalPowerInfo ; //总电源信息
|
|
|
- GlobalTreeACManager pTreeAPowerInfo; //三相子电源信息
|
|
|
|
|
|
|
+ GlobalTreeACManager* pTreeAPowerInfo; //三相子电源信息
|
|
|
GlobalTreeACManager* _pTreeACPowerMangerTemp = NULL ;
|
|
GlobalTreeACManager* _pTreeACPowerMangerTemp = NULL ;
|
|
|
PowerWarningInfo _globalPowerWarningInfo ;
|
|
PowerWarningInfo _globalPowerWarningInfo ;
|
|
|
|
|
+ float Vavg[3]={0.0,0.0,0.0};
|
|
|
|
|
+ int VavgTimes[3]={0,0,0};
|
|
|
struct tm* t ;
|
|
struct tm* t ;
|
|
|
struct timeval tv;
|
|
struct timeval tv;
|
|
|
struct timezone tz ;
|
|
struct timezone tz ;
|
|
@@ -144,6 +146,8 @@ void* power_thread(void* arg)
|
|
|
}
|
|
}
|
|
|
bool SaveDBFlag=false; //数据库存储记录,只要有通道存,就存一次总通道数据
|
|
bool SaveDBFlag=false; //数据库存储记录,只要有通道存,就存一次总通道数据
|
|
|
int _chn = 0;
|
|
int _chn = 0;
|
|
|
|
|
+ memset(Vavg,0.0,sizeof(Vavg));
|
|
|
|
|
+ memset(VavgTimes,0,sizeof(VavgTimes));
|
|
|
//数据刷新
|
|
//数据刷新
|
|
|
pthread_mutex_lock(&__globalDeviceManage._power_update);
|
|
pthread_mutex_lock(&__globalDeviceManage._power_update);
|
|
|
list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
|
|
list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
|
|
@@ -262,7 +266,100 @@ void* power_thread(void* arg)
|
|
|
dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_P_UP);
|
|
dev_Alarm_send_message(_globalDeviceManager,_globalPowerMangerTemp,WARNING_P_UP);
|
|
|
}
|
|
}
|
|
|
//动作
|
|
//动作
|
|
|
|
|
+ if (__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
|
|
|
|
|
+ {
|
|
|
|
|
+ GlobalTreeACManager *_pTreeACPowerPhData = NULL;
|
|
|
|
|
+ memset(&_globalPowerInfo._power_info, 0, sizeof(_globalPowerInfo._power_info));
|
|
|
|
|
+ int k = 0;
|
|
|
|
|
+ list_for_each_entry(_pTreeACPowerMangerTemp, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B && _pTreeACPowerMangerTemp->product_ph_outputStatus == 2)
|
|
|
|
|
+ {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ memcpy(&_pTreeACPowerMangerTemp->_PowerInfo, &_globalDeviceManager->_all_ctrl_board[_pTreeACPowerMangerTemp->product_saddr]._PowerInfo[_pTreeACPowerMangerTemp->product_ch_addr - 1], sizeof(PowerInfo));
|
|
|
|
|
+ memcpy(&_pTreeACPowerMangerTemp->_PowerWarninginfo, &_globalDeviceManager->_all_ctrl_board[_pTreeACPowerMangerTemp->product_saddr]._PowerWarninginfo[_pTreeACPowerMangerTemp->product_ch_addr - 1], sizeof(PowerWarningInfo));
|
|
|
|
|
+ gettimeofday(&tv, NULL);
|
|
|
|
|
+ // t = localtime(&tv.tv_sec);
|
|
|
|
|
+ // 计算总三项总数据
|
|
|
|
|
+ _globalPowerInfo._power_info.voltage = _pTreeACPowerMangerTemp->_PowerInfo.voltage;
|
|
|
|
|
+ _globalPowerInfo._power_info.current += _pTreeACPowerMangerTemp->_PowerInfo.current;
|
|
|
|
|
+ _globalPowerInfo._power_info.power += _pTreeACPowerMangerTemp->_PowerInfo.power;
|
|
|
|
|
+ _globalPowerInfo._power_info.freq = _pTreeACPowerMangerTemp->_PowerInfo.freq;
|
|
|
|
|
+ _globalPowerInfo._power_info.consumption += _pTreeACPowerMangerTemp->_PowerInfo.consumption;
|
|
|
|
|
+ _globalPowerInfo._power_info.factor = _pTreeACPowerMangerTemp->_PowerInfo.factor;
|
|
|
|
|
+ //
|
|
|
|
|
+ pTreeAPowerInfo = NULL;
|
|
|
|
|
+ list_for_each_entry(pTreeAPowerInfo, &_globalDeviceManager->_globalPowerManger.list_Tree_AC, list_Tree_AC)
|
|
|
|
|
+ {
|
|
|
|
|
+ int nTreeACType = pTreeAPowerInfo->product_ph_type;
|
|
|
|
|
+ if (nTreeACType < 0 || nTreeACType > 3) // 不是ABC相的情况直接跳过
|
|
|
|
|
+ {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (nTreeACType == _pTreeACPowerMangerTemp->product_ph_type)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (VavgTimes[nTreeACType] == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ Vavg[nTreeACType] =_pTreeACPowerMangerTemp->_PowerInfo.voltage;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ Vavg[nTreeACType] = (Vavg[nTreeACType] * VavgTimes[nTreeACType] + _pTreeACPowerMangerTemp->_PowerInfo.voltage) / VavgTimes[nTreeACType] ;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ pTreeAPowerInfo->_PowerInfo.voltage = Vavg[nTreeACType];
|
|
|
|
|
+ pTreeAPowerInfo->_PowerInfo.current += _pTreeACPowerMangerTemp->_PowerInfo.current;
|
|
|
|
|
+ pTreeAPowerInfo->_PowerInfo.power += _pTreeACPowerMangerTemp->_PowerInfo.power;
|
|
|
|
|
+ pTreeAPowerInfo->_PowerInfo.freq = _pTreeACPowerMangerTemp->_PowerInfo.freq;
|
|
|
|
|
+ pTreeAPowerInfo->_PowerInfo.consumption += _pTreeACPowerMangerTemp->_PowerInfo.consumption;
|
|
|
|
|
+ pTreeAPowerInfo->_PowerInfo.factor = _pTreeACPowerMangerTemp->_PowerInfo.factor;
|
|
|
|
|
+ VavgTimes[nTreeACType]+=1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (__globalDeviceManage.triphasic_mmap)
|
|
|
|
|
+ {
|
|
|
|
|
+ __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_consumption = _pTreeACPowerMangerTemp->_PowerInfo.consumption * 1000;
|
|
|
|
|
+ __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_current = _pTreeACPowerMangerTemp->_PowerInfo.current * 1000;
|
|
|
|
|
+ __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_power = _pTreeACPowerMangerTemp->_PowerInfo.power * 1000;
|
|
|
|
|
+ __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_voltage = _pTreeACPowerMangerTemp->_PowerInfo.voltage * 1000;
|
|
|
|
|
+ __globalDeviceManage.triphasic_mmap->chn_info[_chn].chn_type = _pTreeACPowerMangerTemp->product_ph_type;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ if (_globalPowerInfo._power_info.status == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ _globalPowerInfo._power_info.status = _pTreeACPowerMangerTemp->_PowerInfo.status;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ _globalPowerInfo._power_info.status = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (__globalDeviceManage.triphasic_mmap)
|
|
|
|
|
+ __globalDeviceManage.triphasic_mmap->pw_o_chn[_chn].chn[k].o_status = _globalPowerInfo._power_info.status;
|
|
|
|
|
+ time_t now;
|
|
|
|
|
+ time(&now);
|
|
|
|
|
+ t = localtime(&now);
|
|
|
|
|
+
|
|
|
|
|
+ char buffer[80];
|
|
|
|
|
+ strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
|
|
|
|
|
+ memset(_globalPowerInfo.samp_time, 0, sizeof(_globalPowerInfo.samp_time));
|
|
|
|
|
+ strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
|
|
|
|
|
+ sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
|
|
|
|
|
+ strcat(_globalPowerInfo.samp_time, buffer);
|
|
|
|
|
+
|
|
|
|
|
+ if (difftime(now, _pTreeACPowerMangerTemp->product_log_time) > (sSaveTime / 1000))
|
|
|
|
|
+ {
|
|
|
|
|
+ _pTreeACPowerMangerTemp->product_log_time = now;
|
|
|
|
|
+ /* code */
|
|
|
|
|
+ // 插入数据库
|
|
|
|
|
+ if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &nSaveTacIndex, _globalPowerInfo.samp_time) != 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ log_d("ph_ch%d insert data error.\n", _pTreeACPowerMangerTemp->product_ch_id);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
case DC_OUT_TYPE:
|
|
case DC_OUT_TYPE:
|
|
@@ -648,6 +745,50 @@ void* power_thread(void* arg)
|
|
|
}
|
|
}
|
|
|
__globalDeviceManage.triphasic_mmap->dev_chn = __globalDeviceManage._global_device_info->product_pwr_type << 8 | _chn;
|
|
__globalDeviceManage.triphasic_mmap->dev_chn = __globalDeviceManage._global_device_info->product_pwr_type << 8 | _chn;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
|
|
|
|
|
+ {
|
|
|
|
|
+ _pTreeACPowerMangerTemp = NULL;
|
|
|
|
|
+ list_for_each_entry(_pTreeACPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list_Tree_AC, list_Tree_AC)
|
|
|
|
|
+ {
|
|
|
|
|
+ int nTreeACType = _pTreeACPowerMangerTemp->product_ph_type;
|
|
|
|
|
+ if (nTreeACType < 0 || nTreeACType > 3) // 不是ABC相的情况直接跳过
|
|
|
|
|
+ {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (_globalDeviceManager->triphasic_mmap)
|
|
|
|
|
+ {
|
|
|
|
|
+ _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_consumption = _pTreeACPowerMangerTemp->_PowerInfo.consumption * 1000;
|
|
|
|
|
+ _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_power = _pTreeACPowerMangerTemp->_PowerInfo.power * 1000;
|
|
|
|
|
+ _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_voltage = _pTreeACPowerMangerTemp->_PowerInfo.voltage * 1000;
|
|
|
|
|
+ _globalDeviceManager->triphasic_mmap->i_total.pw_i_total[nTreeACType].i_total_current = _pTreeACPowerMangerTemp->_PowerInfo.current * 1000;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ time_t now;
|
|
|
|
|
+ time(&now);
|
|
|
|
|
+ t = localtime(&now);
|
|
|
|
|
+
|
|
|
|
|
+ char buffer[80];
|
|
|
|
|
+ strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
|
|
|
|
|
+ memset(_globalPowerInfo.samp_time, 0, sizeof(_globalPowerInfo.samp_time));
|
|
|
|
|
+ strftime(_globalPowerInfo.samp_time, sizeof(_globalPowerInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
|
|
|
|
|
+ sprintf(buffer, ".%03ld", tv.tv_usec / 1000);
|
|
|
|
|
+ strcat(_globalPowerInfo.samp_time, buffer);
|
|
|
|
|
+ if (difftime(now, _pTreeACPowerMangerTemp->product_log_time) > (sSaveTime / 1000))
|
|
|
|
|
+ {
|
|
|
|
|
+ _pTreeACPowerMangerTemp->product_log_time = now;
|
|
|
|
|
+ /* code */
|
|
|
|
|
+ // 插入数据库
|
|
|
|
|
+ if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &nSaveTacIndex, _globalPowerInfo.samp_time) != 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ log_d("ph_ch%d insert data error.\n", _pTreeACPowerMangerTemp->product_ch_id);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (_globalDeviceManager->triphasic_mmap)
|
|
|
|
|
+ {
|
|
|
|
|
+ __globalDeviceManage.triphasic_mmap->dev_chn = __globalDeviceManage._global_device_info->product_pwr_type << 8 | _chn;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
//插入总电源信息
|
|
//插入总电源信息
|
|
|
gettimeofday(&tv, &tz);
|
|
gettimeofday(&tv, &tz);
|
|
@@ -886,8 +1027,11 @@ void* sensor_thread(void* arg)
|
|
|
_globalDeviceManager->single_mmap->total_temp.humidity = _globalSensorInfo.val2 *100;
|
|
_globalDeviceManager->single_mmap->total_temp.humidity = _globalSensorInfo.val2 *100;
|
|
|
}else
|
|
}else
|
|
|
{
|
|
{
|
|
|
- _globalDeviceManager->triphasic_mmap->temperature = temperature *100;
|
|
|
|
|
- _globalDeviceManager->triphasic_mmap->humidity = humidity * 100;
|
|
|
|
|
|
|
+ if (_globalDeviceManager->triphasic_mmap)
|
|
|
|
|
+ {
|
|
|
|
|
+ _globalDeviceManager->triphasic_mmap->temperature = temperature * 100;
|
|
|
|
|
+ _globalDeviceManager->triphasic_mmap->humidity = humidity * 100;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
_globalSensorInfo.product_log_time=_globalSensorMangerTemp->Cur_sensor_info.product_log_time;;
|
|
_globalSensorInfo.product_log_time=_globalSensorMangerTemp->Cur_sensor_info.product_log_time;;
|
|
|
_globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
|
|
_globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
|
|
@@ -1286,7 +1430,10 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
|
|
|
log_i("all chn data inserted ok.\n");
|
|
log_i("all chn data inserted ok.\n");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- if (_globalDeviceManager->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_Tree||_globalDeviceManager->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_One)
|
|
|
|
|
|
|
+ if (_globalDeviceManager->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_Tree
|
|
|
|
|
+ ||_globalDeviceManager->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_One
|
|
|
|
|
+ ||_globalDeviceManager->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_One_B
|
|
|
|
|
+ )
|
|
|
{
|
|
{
|
|
|
__globalDeviceManage.nTreeACLshow=0;
|
|
__globalDeviceManage.nTreeACLshow=0;
|
|
|
_globalDeviceManager->useSlaveCount++;
|
|
_globalDeviceManager->useSlaveCount++;
|
|
@@ -1460,11 +1607,76 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
|
|
|
log_i("chn %d data inserted ok.\n",(i-1)*AC_SINGLE_S_CUR_CHN_NUM+j+1);
|
|
log_i("chn %d data inserted ok.\n",(i-1)*AC_SINGLE_S_CUR_CHN_NUM+j+1);
|
|
|
}
|
|
}
|
|
|
*/
|
|
*/
|
|
|
- }
|
|
|
|
|
- _globalPowerMangerTemp->product_saddr = i ;
|
|
|
|
|
- //添加到队尾
|
|
|
|
|
- list_add_tail(&_globalPowerMangerTemp->list,&_globalDeviceManager->_globalPowerManger.list);
|
|
|
|
|
- chn+=1;
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ if (type == AC_SINGLE_B_TYPE && _globalDeviceManager->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
|
|
|
|
|
+ {
|
|
|
|
|
+ // 初始化三相子通道
|
|
|
|
|
+ GlobalTreeACManager *_globalTACManager = NULL;
|
|
|
|
|
+ INIT_LIST_HEAD(&_globalPowerMangerTemp->list_Tree_AC);
|
|
|
|
|
+ for (size_t indexT = 0; indexT < 3; indexT++)
|
|
|
|
|
+ {
|
|
|
|
|
+ _globalTACManager = (GlobalTreeACManager *)malloc(sizeof(GlobalTreeACManager));
|
|
|
|
|
+ memset(_globalTACManager, 0, sizeof(GlobalTreeACManager));
|
|
|
|
|
+ if (_globalTACManager == NULL)
|
|
|
|
|
+ {
|
|
|
|
|
+ log_e("_globalTACManager malloc error.\n");
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ }
|
|
|
|
|
+ _globalTACManager->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
|
|
|
|
|
+ memset(_globalTACManager->global_over_manager, 0, sizeof(GlobalOverManager));
|
|
|
|
|
+ if (_globalTACManager->global_over_manager == NULL)
|
|
|
|
|
+ {
|
|
|
|
|
+ log_e("_globalTACManager->global_over_manager malloc error.\n");
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ }
|
|
|
|
|
+ ret = dev_get_t_ac_power_manage_info(_globalDeviceManager->db,
|
|
|
|
|
+ _globalDeviceManager->_global_device_info->product_id, i,
|
|
|
|
|
+ j + 1, // 1*8+j
|
|
|
|
|
+ nTac_chn,
|
|
|
|
|
+ _globalTACManager);
|
|
|
|
|
+ _globalTACManager->product_ch_addr = j + 1;
|
|
|
|
|
+ // 未查询到信息 则插入
|
|
|
|
|
+ if (ret == -1)
|
|
|
|
|
+ {
|
|
|
|
|
+ _globalTACManager->product_id = _globalDeviceManager->_global_device_info->product_id;
|
|
|
|
|
+ _globalTACManager->product_saddr = i;
|
|
|
|
|
+ _globalTACManager->product_ch_id = _globalPowerMangerTemp->product_ch_id;
|
|
|
|
|
+ _globalTACManager->product_ch_addr = j + 1;
|
|
|
|
|
+ _globalTACManager->product_ph_id = nTac_chn;
|
|
|
|
|
+ _globalTACManager->product_ph_type = indexT;
|
|
|
|
|
+ _globalTACManager->product_ph_outputType = 2; // 1三相2单相
|
|
|
|
|
+ if (nTac_chn == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ _globalTACManager->product_ph_outputStatus = 1; // 1输出2不输出
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ _globalTACManager->product_ph_outputStatus = 2; // 1输出2不输出
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (dev_insert_t_ac_power_manage_info(_globalDeviceManager->db,
|
|
|
|
|
+ _globalDeviceManager->_global_device_info->product_id,
|
|
|
|
|
+ _globalTACManager->product_ch_id,
|
|
|
|
|
+ _globalTACManager) != 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ log_e("address %d ph_chn %d data inserted error.\n", i, nTac_chn);
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // 绑定到三项通道
|
|
|
|
|
+ _globalTACManager->product_saddr = i;
|
|
|
|
|
+ _globalTACManager->product_ph_type = indexT;
|
|
|
|
|
+ if (_globalPowerMangerTemp)
|
|
|
|
|
+ {
|
|
|
|
|
+ list_add_tail(&_globalTACManager->list_Tree_AC, &_globalPowerMangerTemp->list_Tree_AC);
|
|
|
|
|
+ }
|
|
|
|
|
+ nTac_chn += 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ _globalPowerMangerTemp->product_saddr = i;
|
|
|
|
|
+ // 添加到队尾
|
|
|
|
|
+ list_add_tail(&_globalPowerMangerTemp->list, &_globalDeviceManager->_globalPowerManger.list);
|
|
|
|
|
+ chn += 1;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|