#include "StdAfx.h" #include #include #include "DrainPoolUnit.h" // 定义给排水单元类实现 CDrainPoolUnit::CDrainPoolUnit() { //m_WaterLevel = 0.1+rand()/(double)(RAND_MAX/10); //30-50之间随机浮点数 // 创建一个随机数引擎 std::random_device rd; // 用于获取随机种子 std::mt19937 gen(rd()); // 以随机种子初始化Mersenne Twister生成器 // 定义分布范围 std::uniform_real_distribution<> dis(0, 9.9999); // 随机范围 // 生成随机浮点数 m_WaterLevel = 20.0; m_bWaterFromTS = FALSE; m_bLevelChange = FALSE; m_fWaterLevelAlarmLow = 10.0; //低水位 m_fWaterLevelAlarmHigh = 80.0; //高水位 m_fWaterLevelClose = 30.0; //关泵 m_fWaterLevelOpenOne = 50.0; //单泵 m_fWaterLevelOpenTwo = 70.0; //双泵 m_fWaterLevelOpenThree = 90.0; //三泵 m_fWaterLevelOpenFour = 90.0; //四泵 } CDrainPoolUnit::~CDrainPoolUnit() { } void CDrainPoolUnit::AddDrainPump( const CString& strPoolStrID, const CString& strPumpStrID, int nType ) { CDrainPump pump; pump.m_strPoolStrID = strPoolStrID; pump.m_strEqpmtStrID = strPumpStrID; pump.m_nType = nType; m_mapDrainPump.insert( make_pair(strPumpStrID, pump) ); AddRunPumpType(nType); } CString CDrainPoolUnit::GetPumpStrIDByType( int nType ) { CString strID = _T(""); map< CString, CDrainPump>::iterator iter = m_mapDrainPump.begin(); for ( ; iter != m_mapDrainPump.end(); iter++ ) { if ( nType == iter->second.m_nType ) { strID = iter->second.m_strEqpmtStrID; break; } } return strID; } bool CDrainPoolUnit::CheckRunPump( int nType ) { bool bRet = false; vector::iterator iterRunType = m_vecRunType.begin(); for ( ; iterRunType != m_vecRunType.end(); iterRunType++ ) { if ( nType == (*iterRunType) ) { bRet = true; break; } } return bRet; } void CDrainPoolUnit::AddRunPumpType( int nType ) { vector::iterator iterRunType = m_vecRunType.begin(); for ( ; iterRunType != m_vecRunType.end(); iterRunType++ ) { if ( nType == (*iterRunType) ) { m_vecRunType.erase(iterRunType); break; } } m_vecRunType.push_back(nType); } void CDrainPoolUnit::DelRunPumpType( int nType ) { vector::iterator iterRunType = m_vecRunType.begin(); for ( ; iterRunType != m_vecRunType.end(); iterRunType++ ) { if ( nType == (*iterRunType) ) { m_vecRunType.erase(iterRunType); break; } } } void CDrainPoolUnit::AddRunPumpStrID( const CString& strEqpmtID ) { map< CString, CDrainPump>::iterator iter = m_mapDrainPump.find(strEqpmtID); if ( iter== m_mapDrainPump.end() ) { return; } AddRunPumpType( iter->second.m_nType); } int CDrainPoolUnit::Size() { return m_mapDrainPump.size(); } CString CDrainPoolUnit::GetFirstPumpStrID() { CString strRet = _T(""); if ( m_mapDrainPump.empty() ) { return strRet; } map< CString, CDrainPump>::iterator iter = m_mapDrainPump.begin(); if ( m_vecRunType.empty() ) { strRet = iter->second.m_strEqpmtStrID; return strRet; } int nFirstType = m_vecRunType[0]; for ( ; iter != m_mapDrainPump.end(); iter++ ) { if ( iter->second.m_nType == nFirstType ) { strRet = iter->second.m_strEqpmtStrID; break; } } return strRet; } CString CDrainPoolUnit::GetSecondPumpStrID() { CString strRet = _T(""); if ( m_mapDrainPump.size() < 2 ) { return strRet; } map< CString, CDrainPump>::iterator iter = m_mapDrainPump.begin(); //iter++; if ( m_vecRunType.size() < 2 ) { strRet = iter->second.m_strEqpmtStrID; return strRet; } int nSecondType = m_vecRunType[0]; for ( ; iter != m_mapDrainPump.end(); iter++ ) { if ( iter->second.m_nType == nSecondType ) { strRet = iter->second.m_strEqpmtStrID; break; } } return strRet; } int CDrainPoolUnit::GetWaterLevel() { int nLevel=-1; // 超低水位 0-10 // 停泵水位 10-30 // 开单泵水位 30-50 // 开双泵水位 50-80 // 超高水位 80-100 //修改界限值,预留缓冲值 mod by yangs if (m_WaterLevel >= m_fWaterLevelAlarmLow && m_WaterLevel < m_fWaterLevelClose) { nLevel=DrainAlarm_Low; } else if (m_WaterLevel >= m_fWaterLevelClose && m_WaterLevel < m_fWaterLevelOpenOne) { nLevel=DrainAlarm_Close; } else if (m_WaterLevel >= m_fWaterLevelOpenOne && (m_WaterLevel < m_fWaterLevelOpenTwo || m_fWaterLevelOpenTwo < 0)) { nLevel=DrainAlarm_OpenOne; } else if (m_WaterLevel >= m_fWaterLevelOpenTwo && (m_WaterLevel < m_fWaterLevelOpenThree || m_fWaterLevelOpenThree < 0)) { nLevel=DrainAlarm_OpenTwo; } else if (m_WaterLevel >= m_fWaterLevelOpenThree && (m_WaterLevel < m_fWaterLevelOpenFour || m_fWaterLevelOpenFour < 0)) { nLevel=DrainAlarm_OpenThree; } else if (m_WaterLevel >= m_fWaterLevelOpenFour) { nLevel = DrainAlarm_OpenFour; } else { nLevel = DrainAlarm_Low; } return nLevel; } bool CDrainPoolUnit::checkWaterLevelAlarmHigh() { return m_WaterLevel >= m_fWaterLevelAlarmHigh; } //add by yangs void CDrainPoolUnit::SetWaterLevelByStatus(int nStatus) { switch(nStatus) { case DrainAlarm_Low:m_WaterLevel = m_fWaterLevelAlarmLow; break; case DrainAlarm_Close:m_WaterLevel = m_fWaterLevelClose; break; case DrainAlarm_OpenOne:m_WaterLevel = m_fWaterLevelOpenOne; break; case DrainAlarm_OpenTwo:m_WaterLevel = m_fWaterLevelOpenTwo; break; case DrainAlarm_OpenThree:m_WaterLevel = m_fWaterLevelOpenThree; break; case DrainAlarm_OpenFour:m_WaterLevel = m_fWaterLevelOpenFour; break; default: break; } } void CDrainPoolUnit::SetWaterLevel_FronTS(float fWaterHeightPercent) { m_bWaterFromTS = TRUE; int nPreLevel = GetWaterLevel(); m_WaterLevel = fWaterHeightPercent; //顺序和前面一句代码不能颠倒,否则自己品味 int nCurLevel = GetWaterLevel(); if ( nCurLevel != nPreLevel ) { m_bLevelChange = TRUE; } }