Quellcode durchsuchen

稳态值实时判断生效.

git-svn-id: https://202.107.226.68:8443/svn/Services/ResistanceMonitor@81 a05970a1-87b9-9d4f-9ee5-fa77e2ec115b
shenchunzhong vor 1 Jahr
Ursprung
Commit
21898e51b7
4 geänderte Dateien mit 266 neuen und 9 gelöschten Zeilen
  1. 27 4
      4.Data/HttpPrcess.cpp
  2. 1 0
      4.Data/MonitorObject.h
  3. 233 3
      4.Data/ResistAlarm.cpp
  4. 5 2
      4.Data/ResistAlarm.h

+ 27 - 4
4.Data/HttpPrcess.cpp

@@ -2118,14 +2118,14 @@ int DealGetResistData(const httplib::Request& req, const string token, char** js
 				sprintf_s(tablename, 50, "rm_move_%04d%02d", it.GetYear(), it.GetMonth());
 				if (num == 0)
 				{
-					sql = fmt::format("SELECT show_time, curr_val, show_val, posi, [type],[sunroof] FROM {} \
+					sql = fmt::format("SELECT show_time, curr_val, show_val, posi,type,sunroof FROM {} \
 					WHERE mo = '{}' AND mp = '{}' AND show_time >= '{}' AND show_time <= '{}' ",
 						tablename, mo, mp, starttime, endtime).c_str();
 				}
 				else
 				{
 					sql += fmt::format(" UNION ALL "\
-						"SELECT show_time, curr_val, show_val, posi, [type],[sunroof] FROM {} \
+						"SELECT show_time, curr_val, show_val, posi, type,sunroof FROM {} \
 					WHERE mo = '{}' AND mp = '{}' AND show_time >= '{}' AND show_time <= '{}' ",
 						tablename, mo, mp, starttime, endtime).c_str();
 				}
@@ -2308,7 +2308,27 @@ int DealGetResistData(const httplib::Request& req, const string token, char** js
 			}
 			break;
 			default:
-				ASSERT(FALSE);
+				if (pn == ePowerName::PN_FRICTION)
+				{//ÎÈֵ̬
+					yyjson_mut_arr_add_val(convert_points, obj);
+					auto coord = yyjson_mut_arr(doc);
+					yyjson_mut_obj_add_val(doc, obj, "coord", coord);
+					yyjson_mut_arr_add_int(doc, coord, CTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second).GetTime() * 1000 + ts.fraction / 1000000);
+					yyjson_mut_arr_add_int(doc, coord, curr_val);
+					yyjson_mut_obj_add_strcpy(doc, obj, "time", fmt::format("{:0>4}-{:0>2}-{:0>2} {:0>2}:{:0>2}:{:0>2}.{:0>3}",
+						ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, ts.fraction / 1000000).c_str());
+					if (show_val < 0)
+					{
+						show_val = -show_val;
+						yyjson_mut_obj_add_str(doc, obj, "position", "bottom");
+					}
+					yyjson_mut_obj_add_int(doc, obj, "val", show_val);
+					yyjson_mut_obj_add_str(doc, obj, "color", "#802A2A");
+					//TODO ÑÕÉ«
+					yyjson_mut_obj_add_strcpy(doc, obj, "label", ANSItoUTF8(fmt::format("ÎÈֵ̬:{}", show_val)).c_str());
+				}
+				else
+					ASSERT(FALSE);
 				break;
 			}
 
@@ -3371,7 +3391,10 @@ int DealGetResistCurve(const httplib::Request& req, const string token, char** j
 					yyjson_mut_arr_add_val(f_convert_data, o);
 					break;
 				default:
-					ASSERT(FALSE);
+					if (pn == ePowerName::PN_FRICTION)
+						;
+					else
+						ASSERT(FALSE);
 					break;
 				}
 

+ 1 - 0
4.Data/MonitorObject.h

@@ -11,6 +11,7 @@ enum class DAOCHA_POSITION {
 	MP_UNKNOWN = 0,
 	MP_FIX,
 	MP_INVERT,
+	MP_QUARTO,
 };
 
 struct ST_MOMP_INFO

+ 233 - 3
4.Data/ResistAlarm.cpp

@@ -746,7 +746,7 @@ void CResistAlarmMng::InsertToDBByMove(string mo, string mp, time_t show_time, t
 	auto strStartTime = start_time ? CTime(start_time).Format("%Y-%m-%d %H:%M:%S") : "";
 	auto strEndTime = end_time ? CTime(end_time).Format("%Y-%m-%d %H:%M:%S") : "";
 
-	CString sql = fmt::format("INSERT INTO {} (mo,mp,show_time,start_time,end_time,curr_val,show_val,idx,posi,[type],sunroof,mark) values ('{}', '{}', '{}', '{}','{}', {}, {}, {}, {}, {}, {}, '{}');",
+	CString sql = fmt::format("INSERT INTO {} (mo,mp,show_time,start_time,end_time,curr_val,show_val,idx,posi,type,sunroof,mark) values ('{}', '{}', '{}', '{}','{}', {}, {}, {}, {}, {}, {}, '{}');",
 		table_name, mo, mp, strShowTime, strStartTime, strEndTime, curr_val, show_val, idx, posi, type, sunroof, mark).c_str();
 
 	if (CDBConnectPool::Instance()->DBExecuteSQL(sql) == FALSE)
@@ -1132,6 +1132,176 @@ void CResistAlarmMng::JudgeAlarm(CResistAlarmMng* pService, CONVERT_RESIST_OVER_
 	}
 }
 
+void CResistAlarmMng::JudgeAlarm(CResistAlarmMng* pService, FRICTION_OVER_LIMIT_INFO* pAlarmSet, time_t show_time, int show_val, eDaoChaPosi posi, eUpOrDownInfo eUpOrDown, void* pMoMpInfo)
+{
+	if (pAlarmSet == nullptr || pAlarmSet->enable == false) return;
+	auto pInfo = (ST_MOMP_INFO*)pMoMpInfo;
+	
+	bool bNew = false;
+	ALARM_INFO* pAlarmInfo = nullptr;
+	bool bAlarm = false, bWarn = false; int alarm_value = show_val, alarm_refer; time_t alarm_time = show_time;
+	CTime ctAlarmTime = CTime(alarm_time / 1000);
+	eLowHigh loworhigh = eLowHigh::LH_UNKNOWN; //0:最小值  1:最大值
+	{
+		if (show_val >= pAlarmSet->up_alarm_low_limit)
+		{
+			bAlarm = true;
+			alarm_refer = pAlarmSet->up_alarm_low_limit;
+			alarm_value = show_val;
+			loworhigh = eLowHigh::LH_HIGH;
+		}
+		else if (show_val <= pAlarmSet->dw_alarm_high_limit)
+		{
+			bAlarm = true;
+			alarm_refer = pAlarmSet->dw_alarm_high_limit;
+			alarm_value = show_val;
+			loworhigh = eLowHigh::LH_LOW;
+		}
+		else if (show_val >= pAlarmSet->up_warn_low_limit)
+		{
+			bWarn = true;
+			alarm_refer = pAlarmSet->up_warn_low_limit;
+			alarm_value = show_val;
+			loworhigh = eLowHigh::LH_HIGH;
+		}
+		else if (show_val <= pAlarmSet->dw_warn_high_limit)
+		{
+			bWarn = true;
+			alarm_refer = pAlarmSet->dw_warn_high_limit;
+			alarm_value = show_val;
+			loworhigh = eLowHigh::LH_LOW;
+		}
+
+		if (bAlarm == false && bWarn == false)
+		{
+			{
+				std::lock_guard<mutex> lock(pService->m_mtxAlarm);
+				for (auto it = pService->m_lstUnConfirmAlarm.begin(); it != pService->m_lstUnConfirmAlarm.end();)
+				{
+					auto alarm = *it;
+					if (alarm->no == 2 && alarm->type == pAlarmSet->type //预警和报警单独计算  //
+						&& alarm->posi == posi && alarm->recoveryTime.wYear < 2000
+						&& alarm->mo.compare(pInfo->mo) == 0 && alarm->mp.compare(pInfo->mp) == 0) //跟上次报警时间超过1小时,则算新报警
+					{
+						pAlarmInfo = alarm;
+						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(alarm->recoveryTime);
+							}
+
+							g_p315ClientManager->GetTcpClient()->SendAlarmData(alarm->zzjno, 2, CTime(pAlarmInfo->time).GetTime(), alarm_time / 1000,
+								pAlarmInfo->type, posi, pAlarmInfo->level, loworhigh,
+								TIEDA_ACQ_VALUE(alarm->val, TIEDA_VAL_STATE::TVS_MOVEING), TIEDA_ACQ_VALUE(alarm->refer_val, TIEDA_VAL_STATE::TVS_MOVEING), 0);
+						}
+					}
+					++it;
+				}
+			}
+			return;
+		}
+
+		//查找是否原有的报警已存在
+		uint8_t level = 0;
+		if (bAlarm) level = 1;
+
+		{
+			std::lock_guard<mutex> lock(pService->m_mtxAlarm);
+			for (const auto& alarm : pService->m_lstUnConfirmAlarm)
+			{
+				if (alarm->no == 2 && alarm->type == pAlarmSet->type && level == alarm->level && alarm->recoveryTime.wYear < 2000 //预警和报警单独计算
+					&& alarm->mo.compare(pInfo->mo) == 0 && alarm->mp.compare(pInfo->mp) == 0)
+				{
+					pAlarmInfo = alarm;
+					break;
+				}
+			}
+		}
+
+		ALARM_INFO* pNewAlarmInfo = nullptr;
+		{
+			bNew = true;
+			pNewAlarmInfo = new ALARM_INFO;
+			pNewAlarmInfo->event_id = hjfunc_GetGUID();
+			pNewAlarmInfo->rel_id = pAlarmInfo ? pAlarmInfo->event_id : "";
+			pNewAlarmInfo->id = ++pService->m_nAlarmID;
+			pNewAlarmInfo->level = (bAlarm == 1);
+			pNewAlarmInfo->mo = pInfo->mo;
+			pNewAlarmInfo->mp = pInfo->mp;
+			pNewAlarmInfo->no = 2;
+			ctAlarmTime.GetAsSystemTime(pNewAlarmInfo->time);
+			pNewAlarmInfo->time.wMilliseconds = alarm_time % 1000;
+			pNewAlarmInfo->type = pAlarmSet->type;
+			pNewAlarmInfo->val = alarm_value;
+			pNewAlarmInfo->refer_val = alarm_refer;
+			pNewAlarmInfo->posi = posi;
+			pNewAlarmInfo->zzjno = pInfo->zzjno;
+			pNewAlarmInfo->sunroof = CSkylightMng::GetInstance()->IsSkylight(&pNewAlarmInfo->time);
+			char szInfo[200] = { 0 };
+			sprintf_s(szInfo, sizeof(szInfo), "摩擦力稳态值%s超限,报警值为%dN, 参考值为%dN",
+				loworhigh == eLowHigh::LH_LOW ? "下" : "上", alarm_value, alarm_refer);
+
+			pNewAlarmInfo->desc = szInfo;
+			lock_guard<mutex> lock(pService->m_mtxAlarm);
+			pService->m_lstUnConfirmAlarm.push_back(pNewAlarmInfo);
+		}
+
+		//send
+		if (bNew) //不再推送
+		{
+			rapidjson::StringBuffer buffer;
+			auto ret = AlarmInfo2Pack(pNewAlarmInfo, buffer);
+			const char* output = buffer.GetString();
+			CAppService::Instance()->GetMgServer()->SendToAllClient(output, buffer.GetLength());
+		}
+
+		//主动推送315
+		if (bNew)
+		{
+			g_p315ClientManager->GetTcpClient()->SendAlarmData(pNewAlarmInfo->zzjno, 1, CTime(pNewAlarmInfo->time).GetTime(), 0xFFFFFFFF,
+				pNewAlarmInfo->type, posi, pNewAlarmInfo->level, loworhigh,
+				TIEDA_ACQ_VALUE(alarm_value, TIEDA_VAL_STATE::TVS_MOVEING), TIEDA_ACQ_VALUE(alarm_refer, TIEDA_VAL_STATE::TVS_MOVEING), 0);
+		}
+		//save
+		{
+			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);",
+				pNewAlarmInfo->id, pNewAlarmInfo->mo.c_str(), pNewAlarmInfo->mp.c_str(), pNewAlarmInfo->no, pNewAlarmInfo->type,
+				ctAlarmTime.Format("%Y-%m-%d %H:%M:%S"), pNewAlarmInfo->level, pNewAlarmInfo->desc.c_str(), pNewAlarmInfo->suggest.c_str(), pNewAlarmInfo->val,
+				pNewAlarmInfo->event_id.c_str(), pNewAlarmInfo->rel_id.c_str(), uint8_t(pNewAlarmInfo->posi), uint8_t(pNewAlarmInfo->loworhigh), pNewAlarmInfo->refer_val,
+				pNewAlarmInfo->sunroof);
+
+			if (false == CDBConnectPool::Instance()->DBExecuteSQL(sql))
+				CSimpleLog::Error("执行语句失败" + sql);
+			else
+			{
+				uint8_t* pack = nullptr; int len = 0;
+				auto packno = CResistAlarmMng::GeneralNewAlarmData(pNewAlarmInfo, &pack, &len);
+				if (packno) CSuperManager::Instance()->SendPack(pack, len, packno, E_ZL_PROTOCAL::ZL_ALARM_DATA, true);
+				delete[] pack;
+				pack = nullptr;
+			}
+		}
+	}
+}
+
 void CResistAlarmMng::JudgeAlarm2(CResistAlarmMng* pService, RETENSION_FORCE_DROP* pRetensionForceDropInfo, time_t show_time, int show_val, eSuoBiPosi posi, string mo, string mp, uint32_t zzjno)
 {
 	if (pRetensionForceDropInfo == nullptr || pRetensionForceDropInfo->enable == false) return;
@@ -1701,7 +1871,7 @@ void CResistAlarmMng::ThreadProcAlarmSet(DWORD_PTR param)
 		{
 			if (item.second == nullptr) continue;
 			if (item.second->enable == false) continue;
-			if (item.second->type != eZL_ALARMTYPE::MAX_OVER_LIMIT && item.second->type != eZL_ALARMTYPE::FRICTION_OVER_LIMIT) //这个逻辑里面只支持这两种
+			if (item.second->type != eZL_ALARMTYPE::MAX_OVER_LIMIT) //这个逻辑里面只支持这两种
 				continue;
 			if (item.second->no < 0 || item.second->no > 2) continue;
 
@@ -1928,6 +2098,7 @@ void CResistAlarmMng::ThreadProcAlarmSet(DWORD_PTR param)
 					}
 
 				}
+				/* 2024年8月24日 放在move中判断
 				else if (item.second->type == eZL_ALARMTYPE::FRICTION_OVER_LIMIT)
 				{
 				auto pInfo = (FRICTION_OVER_LIMIT_INFO*)item.second;
@@ -2139,7 +2310,7 @@ void CResistAlarmMng::ThreadProcAlarmSet(DWORD_PTR param)
 					}
 				}
 
-				}
+				}*/
 				else
 				{
 					//其他未实现
@@ -2859,6 +3030,7 @@ void CResistAlarmMng::ThreadProcMove(DWORD_PTR param)
 				SPDLOG_INFO("扳动判断数据{}.{} map:{} 0:{} 1:{} 2:{}", mo, mp, map2.size(), mapData[0]->size(), mapData[1]->size(), mapData[2]->size());
 				list<CONVERT_RESIST> lstResit2;   //转换力数据
 				list<PASS_RESIST> lstPass;   //过车数据
+				list<FRICTION_RESIST> lstFriction; //摩擦力数据
 				std::map<time_t, int64_t> maxlock0, maxlock1;//锁闭力 前面时间戳, 后面 高4位显示值,  低4位报警值
 				std::map<time_t, int64_t>  retentionforce0, retentionforce1; //保持力 时间戳,  高4位显示值, 低4位报警值
 				mg_per_session_data::GetMaxResistNew(map2, lstResit2, mo, mp);
@@ -2881,6 +3053,42 @@ void CResistAlarmMng::ThreadProcMove(DWORD_PTR param)
 						}
 					}
 				}
+				//摩擦力过滤
+				for (auto it = lstResit2.begin(); it != lstResit2.end();)
+				{
+					int first_value = 0, last_value = 0;
+					auto ii = map2.find(it->tmStart);
+					ASSERT(ii != map2.end());
+					first_value = ii->second.first_val;
+					ii = map2.find(it->tmEnd);
+					if (ii == map2.end())
+						ii = map2.find(it->tmEnd - 1);
+					ASSERT(ii != map2.end());
+					last_value = ii->second.end_val;
+					auto dif = abs(last_value - first_value);
+					auto strLog = fmt::format("[摩擦力判断]{}  first:{}  last:{} dif:{}",
+						CTime(it->time / 1000).Format("%Y-%m-%d %H:%M:%S"), first_value, last_value, dif);
+					if (dif > 1000)
+					{
+						SPDLOG_INFO(strLog);
+						if (it->tmEnd - it->tmStart >= 4)
+						{
+							FRICTION_RESIST info;
+							info.peak_time = it->time;
+							info.peak_val = it->val;
+							info.show_time = it->time; //暂时赋值峰值
+							info.show_val = last_value;
+							info.tmStart = it->tmStart;
+							info.tmEnd = it->tmEnd;
+							info.t = strLog;
+							info.bUpOrDown = it->bUpOrDown;
+							lstFriction.emplace_back(info);
+						}
+						it = lstResit2.erase(it);
+					}
+					else
+						++it;
+				}
 				if (lstResit2.size())
 				{
 					mg_per_session_data::GetMaxLockNew(map0, lstResit2, maxlock0, retentionforce0);
@@ -3080,6 +3288,28 @@ void CResistAlarmMng::ThreadProcMove(DWORD_PTR param)
 					//SPDLOG_INFO("扳动判断数据结束{}.{} 315 上送", mo, mp);
 				}
 
+				//摩檫力逻辑
+				if (lstFriction.size())
+				{
+					pMompInfo;
+					auto pAlarmSet = (FRICTION_OVER_LIMIT_INFO*)pService->Find(mo, mp, 2, eZL_ALARMTYPE::FRICTION_OVER_LIMIT);
+					auto mg_315_server = g_p315ClientManager->GetTcpClient();
+
+					for (auto& it : lstFriction)
+					{
+						CResistAlarmMng::InsertToDBByMove(mo, mp, it.peak_time, it.tmStart, it.tmEnd, it.peak_val, it.bUpOrDown == eUpOrDownInfo::UOD_DOWN ? -it.show_val :it.show_val, 2,
+							(uint8_t)eDaoChaPosi::DCP_UNKNOWN, (uint8_t)ePowerName::PN_FRICTION, fmt::format("稳态值:{}", it.show_val));
+
+						//CMonitorObjectMng::Instance()->UpdateZZJEPOS(mo + "." + mp, DAOCHA_POSITION::MP_QUARTO); //四开
+
+						JudgeAlarm(pService, pAlarmSet, it.show_time, it.show_val, eDaoChaPosi::DCP_UNKNOWN, it.bUpOrDown, (void*)pMompInfo);
+
+						//发送315曲线数据
+						//if (mapData[0])
+						//	mg_315_server->SendCurveData(pMompInfo->zzjno, eDaoChaPosi::DCP_UNKNOWN, 1, true, mapData, it.tmStart, it.tmEnd);
+					}
+				}
+
 				delete mapData[0];
 				delete mapData[1];
 				delete mapData[2];

+ 5 - 2
4.Data/ResistAlarm.h

@@ -224,10 +224,13 @@ private:
 	//判断报警,且保存数据
 	static void JudgeAlarm(CResistAlarmMng* pService, RETENSION_FORCE_DROP* pConstRetensionForceWaveInfo,
 		time_t show_time, int show_val, eSuoBiPosi posi, string mo, string mp, void* pMoMpInfo);
+	//摩檫力报警判断
+	static void JudgeAlarm(CResistAlarmMng* pService, FRICTION_OVER_LIMIT_INFO* pAlarmSet,
+		time_t show_time, int show_val, eDaoChaPosi posi, eUpOrDownInfo eUpOrDown, void* pMoMpInfo);
 
 	//报警规则检测线程
-	static void ThreadProcAlarmSet(DWORD_PTR);
-	//设备报警检测线程
+	static void ThreadProcAlarmSet(DWORD_PTR);	
+	//设备报警检测线程	
 	static void ThreadProcDevice(DWORD_PTR);
 	//扳动线程检测线程
 	static void ThreadProcMove(DWORD_PTR);