|
|
@@ -1185,7 +1185,7 @@ void CResistAlarmMng::JudgeAlarm(CResistAlarmMng* pService, RETENSION_FORCE_DROP
|
|
|
ctAlarmTime.GetAsSystemTime(pAlarm->recoveryTime);
|
|
|
}
|
|
|
|
|
|
- g_p315ClientManager->GetTcpClient()->SendAlarmData(zzjno, 2, CTime(pAlarmInfo->time).GetTime(), alarm_time / 1000,
|
|
|
+ g_p315ClientManager->GetTcpClient()->SendAlarmData(zzjno, 2, CTime(pAlarmInfo->time).GetTime(), ctAlarmTime.GetTime(),
|
|
|
pAlarmInfo->type, posi == eSuoBiPosi::SB_FIX ? eDaoChaPosi::DCP_FIX : eDaoChaPosi::DCP_INVERT, pAlarmInfo->level, pAlarm->loworhigh,
|
|
|
TIEDA_ACQ_VALUE(pAlarm->val, TIEDA_VAL_STATE::TVS_AFTER_MOVE), TIEDA_ACQ_VALUE(pAlarm->refer_val, TIEDA_VAL_STATE::TVS_AFTER_MOVE), 0);
|
|
|
}
|
|
|
@@ -1284,6 +1284,199 @@ void CResistAlarmMng::JudgeAlarm(CResistAlarmMng* pService, RETENSION_FORCE_DROP
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void CResistAlarmMng::JudgeAlarm(CResistAlarmMng* pService, RETENSION_FORCE_DROP* pConstRetensionForceWaveInfo,
|
|
|
+ time_t show_time, int show_val, eSuoBiPosi posi, string mo, string mp, uint32_t zzjno, void* pInfo)
|
|
|
+{
|
|
|
+ ASSERT(pConstRetensionForceWaveInfo);
|
|
|
+ ST_MOMP_INFO* pMoMpInfo = (ST_MOMP_INFO*)pInfo;
|
|
|
+ CTime ctShowTime(show_time / 1000);
|
|
|
+ bool bSkylight = CSkylightMng::GetInstance()->IsSkylight(&ctShowTime);
|
|
|
+ int nOldVal = 0;
|
|
|
+ if (bSkylight && show_val == 0)
|
|
|
+ {
|
|
|
+ if (posi == eSuoBiPosi::SB_FIX)
|
|
|
+ {
|
|
|
+ pMoMpInfo->fix_const_retension_force = INT_MIN;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ pMoMpInfo->invert_const_retension_force = INT_MIN;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (posi == eSuoBiPosi::SB_FIX)
|
|
|
+ {
|
|
|
+ nOldVal = pMoMpInfo->fix_const_retension_force;
|
|
|
+ if (nOldVal == INT_MIN)
|
|
|
+ {
|
|
|
+ pMoMpInfo->fix_const_retension_force = show_val;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ nOldVal = pMoMpInfo->invert_const_retension_force;
|
|
|
+ if (nOldVal == INT_MIN)
|
|
|
+ {
|
|
|
+ pMoMpInfo->invert_const_retension_force = show_val;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ASSERT(pConstRetensionForceWaveInfo);
|
|
|
+ if (pConstRetensionForceWaveInfo->enable == false) return;
|
|
|
+
|
|
|
+ if (nOldVal != INT_MIN)
|
|
|
+ {
|
|
|
+ int nRatio = show_val * 100 / nOldVal;
|
|
|
+ eLowHigh loworhigh = eLowHigh::LH_UNKNOWN;
|
|
|
+ int alarm_refer = 0;
|
|
|
+ if (nOldVal != 0)
|
|
|
+ {
|
|
|
+ //下降20%或上升40% 进行预警
|
|
|
+ if (pConstRetensionForceWaveInfo->dw_alarm_low_drop != INT_MIN && nRatio <= (100 - pConstRetensionForceWaveInfo->dw_alarm_low_drop))
|
|
|
+ {
|
|
|
+ loworhigh = eLowHigh::LH_LOW;
|
|
|
+ alarm_refer = nOldVal * (100 - pConstRetensionForceWaveInfo->dw_alarm_low_drop) / 100;
|
|
|
+ }
|
|
|
+ else if (nRatio >= (100 + pConstRetensionForceWaveInfo->alarm_high_percent))
|
|
|
+ {
|
|
|
+ loworhigh = eLowHigh::LH_HIGH;
|
|
|
+ alarm_refer = nOldVal * (100 + pConstRetensionForceWaveInfo->alarm_high_percent) / 100;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ALARM_INFO* pAlarmInfo = nullptr;
|
|
|
+ CTime ctAlarmTime(show_time / 1000);
|
|
|
+ bool bNew = false;
|
|
|
+ //产生预警
|
|
|
+ if (loworhigh != eLowHigh::LH_UNKNOWN)
|
|
|
+ {
|
|
|
+ //查找是否原有的报警已存在
|
|
|
+ int level = 0;// 预警
|
|
|
+ {
|
|
|
+ std::lock_guard<mutex> lock(pService->m_mtxAlarm);
|
|
|
+ for (const auto& alarm : pService->m_lstUnConfirmAlarm)
|
|
|
+ {
|
|
|
+ if (alarm->no == (uint8_t)posi && alarm->type == eZL_ALARMTYPE::RETENSION_FORCE
|
|
|
+ && level == alarm->level && alarm->recoveryTime.wYear < 2000 //预警和报警单独计算
|
|
|
+ && alarm->mo.compare(mo) == 0 && alarm->mp.compare(mp) == 0)
|
|
|
+ {
|
|
|
+ pAlarmInfo = alarm;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pAlarmInfo == nullptr)
|
|
|
+ {
|
|
|
+ bNew = true;
|
|
|
+ pAlarmInfo = new ALARM_INFO;
|
|
|
+ pAlarmInfo->event_id = hjfunc_GetGUID();
|
|
|
+ pAlarmInfo->id = ++pService->m_nAlarmID;
|
|
|
+ pAlarmInfo->level = level;// 预警
|
|
|
+ pAlarmInfo->mo = mo;
|
|
|
+ pAlarmInfo->mp = mp;
|
|
|
+ pAlarmInfo->no = (uint8_t)posi;
|
|
|
+ ctAlarmTime.GetAsSystemTime(pAlarmInfo->time);
|
|
|
+ pAlarmInfo->time.wMilliseconds = show_time % 1000;
|
|
|
+ pAlarmInfo->type = eZL_ALARMTYPE::RETENSION_FORCE;
|
|
|
+ pAlarmInfo->val = show_val;
|
|
|
+ pAlarmInfo->refer_val = alarm_refer;
|
|
|
+ pAlarmInfo->posi = (posi == eSuoBiPosi::SB_FIX ? eDaoChaPosi::DCP_FIX : eDaoChaPosi::DCP_INVERT);
|
|
|
+ pAlarmInfo->loworhigh = loworhigh;
|
|
|
+ pAlarmInfo->zzjno = zzjno;
|
|
|
+ pAlarmInfo->sunroof = CSkylightMng::GetInstance()->IsSkylight(&pAlarmInfo->time);
|
|
|
+ char szInfo[200] = { 0 };
|
|
|
+ sprintf_s(szInfo, sizeof(szInfo), "保持力异常报警,位置:%s, 报警值为%dN, 上一次值:%dN, 参考值为%dN",
|
|
|
+ posi == eSuoBiPosi::SB_FIX ? "定位" : "反位", show_val, nOldVal, alarm_refer);
|
|
|
+
|
|
|
+ pAlarmInfo->desc = szInfo;
|
|
|
+ lock_guard<mutex> lock(pService->m_mtxAlarm);
|
|
|
+ pService->m_lstUnConfirmAlarm.push_back(pAlarmInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ //主动推送315
|
|
|
+ if (bNew)
|
|
|
+ {
|
|
|
+ g_p315ClientManager->GetTcpClient()->SendAlarmData(zzjno, 1, CTime(pAlarmInfo->time).GetTime(), 0xFFFFFFFF,
|
|
|
+ pAlarmInfo->type, posi == eSuoBiPosi::SB_FIX ? eDaoChaPosi::DCP_FIX : eDaoChaPosi::DCP_INVERT, pAlarmInfo->level, loworhigh,
|
|
|
+ TIEDA_ACQ_VALUE(pAlarmInfo->val, TIEDA_VAL_STATE::TVS_AFTER_MOVE), TIEDA_ACQ_VALUE(pAlarmInfo->refer_val, TIEDA_VAL_STATE::TVS_AFTER_MOVE), 0);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (bNew)
|
|
|
+ {
|
|
|
+ CString sql;
|
|
|
+ sql.Format("INSERT INTO [rm_alarm]([ID],[mo],[mp],[no],[type],[occur_time],[level],[desc],[suggest],[val],[event_id],[rel_id],posi,loworhigh,referval,[sunroof]) "\
|
|
|
+ "VALUES(%d, '%s', '%s', %d, %d, '%s', %d, '%s', '%s', %d, '%s', '%s',%d,%d,%d,%d);",
|
|
|
+ pAlarmInfo->id, pAlarmInfo->mo.c_str(), pAlarmInfo->mp.c_str(), pAlarmInfo->no, pAlarmInfo->type,
|
|
|
+ ctAlarmTime.Format("%Y-%m-%d %H:%M:%S"), pAlarmInfo->level, pAlarmInfo->desc.c_str(), pAlarmInfo->suggest.c_str(), pAlarmInfo->val,
|
|
|
+ pAlarmInfo->event_id.c_str(), pAlarmInfo->rel_id.c_str(), uint8_t(pAlarmInfo->posi), uint8_t(pAlarmInfo->loworhigh), pAlarmInfo->refer_val,
|
|
|
+ pAlarmInfo->sunroof);
|
|
|
+
|
|
|
+ if (false == CDBConnectPool::Instance()->DBExecuteSQL(sql))
|
|
|
+ CSimpleLog::Error("执行语句失败" + sql);
|
|
|
+ else
|
|
|
+ {
|
|
|
+ uint8_t* pack = nullptr; int len = 0;
|
|
|
+ auto packno = CResistAlarmMng::GeneralNewAlarmData(pAlarmInfo, &pack, &len);
|
|
|
+ if (packno) CSuperManager::Instance()->SendPack(pack, len, packno, E_ZL_PROTOCAL::ZL_ALARM_DATA, true);
|
|
|
+ delete[] pack;
|
|
|
+ pack = nullptr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //恢复
|
|
|
+ {
|
|
|
+ std::lock_guard<mutex> lock(pService->m_mtxAlarm);
|
|
|
+ for (auto it = pService->m_lstUnConfirmAlarm.begin(); it != pService->m_lstUnConfirmAlarm.end();)
|
|
|
+ {
|
|
|
+ auto pAlarm = *it;
|
|
|
+ if (pAlarm->no == (uint8_t)posi && pAlarm->type == eZL_ALARMTYPE::RETENSION_FORCE && pAlarm->recoveryTime.wYear < 2000 //预警和报警单独计算
|
|
|
+ && pAlarm->mo.compare(mo) == 0 && pAlarm->mp.compare(mp) == 0)
|
|
|
+ {
|
|
|
+ pAlarmInfo = pAlarm;
|
|
|
+ if (pAlarmInfo)
|
|
|
+ {
|
|
|
+ //恢复
|
|
|
+ //1. 更新数据库
|
|
|
+ //2. 更新内存数据
|
|
|
+ //3. 上送恢复消息
|
|
|
+ if (ctAlarmTime.GetTime() == 0) ctAlarmTime = CTime::GetCurrentTime();
|
|
|
+ string recovery_time = ctAlarmTime.Format("%Y-%m-%d %H:%M:%S");
|
|
|
+ CString sql;
|
|
|
+ sql.Format("UPDATE [rm_alarm] SET [recovery_time]='%s' WHERE ID = %d;", recovery_time.c_str(), pAlarmInfo->id);
|
|
|
+ CDBConnectPool::Instance()->DBExecuteSQL(sql);
|
|
|
+
|
|
|
+ if (pAlarmInfo->ack_result == 1)
|
|
|
+ {
|
|
|
+ it = pService->m_lstUnConfirmAlarm.erase(it);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ctAlarmTime.GetAsSystemTime(pAlarm->recoveryTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ g_p315ClientManager->GetTcpClient()->SendAlarmData(zzjno, 2, CTime(pAlarmInfo->time).GetTime(), ctAlarmTime.GetTime(),
|
|
|
+ pAlarmInfo->type, posi == eSuoBiPosi::SB_FIX ? eDaoChaPosi::DCP_FIX : eDaoChaPosi::DCP_INVERT, pAlarmInfo->level, pAlarm->loworhigh,
|
|
|
+ TIEDA_ACQ_VALUE(pAlarm->val, TIEDA_VAL_STATE::TVS_AFTER_MOVE), TIEDA_ACQ_VALUE(pAlarm->refer_val, TIEDA_VAL_STATE::TVS_AFTER_MOVE), 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ it++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void CResistAlarmMng::JudgeAlarm1(CResistAlarmMng* pService, RETENSION_FORCE_DROP* pRetensionForceDropInfo, time_t show_time, int show_val,
|
|
|
eSuoBiPosi posi, string mo, string mp, uint32_t zzjno)
|
|
|
{
|
|
|
@@ -2190,6 +2383,13 @@ void CResistAlarmMng::ThreadProcAlarmSet(DWORD_PTR param)
|
|
|
else
|
|
|
continue;
|
|
|
|
|
|
+ //zzj位置是否变化
|
|
|
+ bool bEPOSChanged = CMonitorObjectMng::Instance()->IsZZJEPOSChanged(momp,
|
|
|
+ (eSuoBiPosi)pAlarmSet->no == eSuoBiPosi::SB_FIX ? DAOCHA_POSITION::MP_FIX : DAOCHA_POSITION::MP_INVERT, tt);
|
|
|
+
|
|
|
+ //位置变化后不能使用
|
|
|
+ if (bEPOSChanged) continue;
|
|
|
+
|
|
|
int nMinVal = INT_MAX;
|
|
|
time_t tMinTime = 0;
|
|
|
{
|
|
|
@@ -2220,6 +2420,9 @@ void CResistAlarmMng::ThreadProcAlarmSet(DWORD_PTR param)
|
|
|
if (nMinVal != INT_MAX)
|
|
|
JudgeAlarm(pService, pAlarmSet, tMinTime, nMinVal, (eSuoBiPosi)pAlarmSet->no, pInfo->mo, pInfo->mp, pInfo->zzjno);
|
|
|
}
|
|
|
+
|
|
|
+ //清理无效位置
|
|
|
+ CMonitorObjectMng::Instance()->ClearZZJHistroyEPOS(tt);
|
|
|
}
|
|
|
|
|
|
} while (pService->m_bWork);
|
|
|
@@ -2689,6 +2892,22 @@ void CResistAlarmMng::ThreadProcMove(DWORD_PTR param)
|
|
|
auto pFixSuobiOverInfo = (SUOBI_OVER_LIMIT_INFO*)pService->Find(mo, mp, (uint8_t)eSuoBiPosi::SB_FIX, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);
|
|
|
//反位
|
|
|
auto pInvertSuobiOverInfo = (SUOBI_OVER_LIMIT_INFO*)pService->Find(mo, mp, (uint8_t)eSuoBiPosi::SB_INVERT, eZL_ALARMTYPE::SUOBI_LOCK_LIMIT);
|
|
|
+
|
|
|
+ //定位保持力报警设置项
|
|
|
+ auto pFixConstRetensionForceWaveInfo = (RETENSION_FORCE_DROP*)pService->Find(mo, mp, (uint8_t)eSuoBiPosi::SB_FIX, eZL_ALARMTYPE::RETENSION_FORCE);
|
|
|
+ if (pFixConstRetensionForceWaveInfo == nullptr)//默认开启
|
|
|
+ {
|
|
|
+ pFixConstRetensionForceWaveInfo = new RETENSION_FORCE_DROP;
|
|
|
+ pService->Insert(mo, mp, (uint8_t)eSuoBiPosi::SB_FIX, (uint8_t)eZL_ALARMTYPE::RETENSION_FORCE, pFixConstRetensionForceWaveInfo);
|
|
|
+ }
|
|
|
+ //反位
|
|
|
+ auto pInvertConstRetensionForceWaveInfo = (RETENSION_FORCE_DROP*)pService->Find(mo, mp, (uint8_t)eSuoBiPosi::SB_INVERT, eZL_ALARMTYPE::RETENSION_FORCE);
|
|
|
+ if (pInvertConstRetensionForceWaveInfo == nullptr)//默认开启
|
|
|
+ {
|
|
|
+ pInvertConstRetensionForceWaveInfo = new RETENSION_FORCE_DROP;
|
|
|
+ pService->Insert(mo, mp, (uint8_t)eSuoBiPosi::SB_INVERT, (uint8_t)eZL_ALARMTYPE::RETENSION_FORCE, pInvertConstRetensionForceWaveInfo);
|
|
|
+ }
|
|
|
+
|
|
|
//获取报警设置 end
|
|
|
|
|
|
eDaoChaPosi posiLock0;
|
|
|
@@ -2710,7 +2929,7 @@ void CResistAlarmMng::ThreadProcMove(DWORD_PTR param)
|
|
|
CResistAlarmMng::InsertToDBByMove(mo, mp, it.first, 0, 0,
|
|
|
(int)it.second, show_val, i, (uint8_t)eDaoChaPosi::DCP_FIX, (uint8_t)ePowerName::PN_RETENTION, fmt::format("保持力:{}", show_val));
|
|
|
|
|
|
- //JudgeAlarm(pService, pFixSuobiOverInfo, it.first, show_val, eSuoBiPosi::SB_FIX, mo, mp, zzjno);
|
|
|
+ JudgeAlarm(pService, pFixConstRetensionForceWaveInfo, it.first, show_val, eSuoBiPosi::SB_FIX, mo, mp, pMompInfo->zzjno, pMompInfo);
|
|
|
}
|
|
|
|
|
|
for (auto& it : maxlock1)
|
|
|
@@ -2728,7 +2947,7 @@ void CResistAlarmMng::ThreadProcMove(DWORD_PTR param)
|
|
|
CResistAlarmMng::InsertToDBByMove(mo, mp, it.first, 0, 0,
|
|
|
(int)it.second, show_val, i, (uint8_t)eDaoChaPosi::DCP_INVERT, (uint8_t)ePowerName::PN_RETENTION, fmt::format("保持力:{}", show_val));
|
|
|
|
|
|
- //JudgeAlarm(pService, pFixSuobiOverInfo, it.first, show_val, eSuoBiPosi::SB_FIX, mo, mp, zzjno);
|
|
|
+ JudgeAlarm(pService, pInvertConstRetensionForceWaveInfo, it.first, show_val, eSuoBiPosi::SB_FIX, mo, mp, pMompInfo->zzjno, pMompInfo);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
@@ -2750,7 +2969,7 @@ void CResistAlarmMng::ThreadProcMove(DWORD_PTR param)
|
|
|
CResistAlarmMng::InsertToDBByMove(mo, mp, it.first, 0, 0, (int)it.second, show_val, i,
|
|
|
(uint8_t)eDaoChaPosi::DCP_INVERT, (uint8_t)ePowerName::PN_RETENTION, fmt::format("保持力:{}", show_val));
|
|
|
|
|
|
- //JudgeAlarm(pService, pInvertSuobiOverInfo, it.first, show_val, eSuoBiPosi::SB_INVERT, mo, mp, zzjno);
|
|
|
+ JudgeAlarm(pService, pInvertConstRetensionForceWaveInfo, it.first, show_val, eSuoBiPosi::SB_INVERT, mo, mp, pMompInfo->zzjno);
|
|
|
}
|
|
|
|
|
|
for (auto& it : maxlock1)
|
|
|
@@ -2768,7 +2987,7 @@ void CResistAlarmMng::ThreadProcMove(DWORD_PTR param)
|
|
|
CResistAlarmMng::InsertToDBByMove(mo, mp, it.first, 0, 0, (int)it.second, show_val, i,
|
|
|
(uint8_t)eDaoChaPosi::DCP_FIX, (uint8_t)ePowerName::PN_RETENTION, fmt::format("保持力:{}", show_val));
|
|
|
|
|
|
- //JudgeAlarm(pService, pFixSuobiOverInfo, it.first, show_val, eSuoBiPosi::SB_FIX, mo, mp, zzjno);
|
|
|
+ JudgeAlarm(pService, pFixConstRetensionForceWaveInfo, it.first, show_val, eSuoBiPosi::SB_FIX, mo, mp, pMompInfo->zzjno, pMompInfo);
|
|
|
}
|
|
|
|
|
|
}
|