#include "TempHumidityUnit.h" #include "Modbus.h" #include "../config/ConfigManager.h" #include "../PLC/SignalService.h" TempHumidityUnit::TempHumidityUnit(CommunicationCfg* pconfig) :TcpClient(pconfig) { m_TempValue = 0.0f; m_HumidityValue = 0.0f; m_Freq = 300; m_AlarmCfgWrapper = ConfigManager::GetInstance()->GetAlarmCfg(); m_RunCfg = ConfigManager::GetInstance()->GetRunCfg(); } TempHumidityUnit::~TempHumidityUnit() { Shutdown(); } void TempHumidityUnit::InitCommand() { Command* pUnit = new ReadModbus(4, m_Config->m_Addr, 0x0, 2); pUnit->m_Fun = &TempHumidityUnit::PorcReadValue; pUnit->m_Ref = this; pUnit->isNeedDel = false; m_CycleCommands.push_back(pUnit); } void TempHumidityUnit::PorcReadValue(void* pobject, Command* pcommand) { if (pobject == NULL)return; TempHumidityUnit* thu = (TempHumidityUnit*)pobject; unsigned char* rseq = pcommand->m_RespSeq; unsigned char addr = rseq[0]; float temp = (float)(((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)) / 100.0f; float humidity = (float)(((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff)) / 100.0f; EnterCriticalSection(&thu->m_ValueCS); thu->m_TempValue = temp; thu->m_HumidityValue = humidity; LeaveCriticalSection(&thu->m_ValueCS); if (thu->m_AlarmCfgWrapper->m_InnerTempOverLimit) { if (temp > thu->m_RunCfg->m_AlarmTemperture) { if (thu->m_AlarmCfgWrapper->m_InnerTempOverLimit->m_AlarmContinueTick > thu->m_AlarmCfgWrapper->m_InnerTempOverLimit->m_CheckAlarmSetTick) { thu->m_AlarmCfgWrapper->m_InnerTempOverLimit->m_AlarmInfo = to_string(temp); SignalService::GetInstance().SetAlarm(thu->m_AlarmCfgWrapper->m_InnerTempOverLimit, true); } else { thu->m_AlarmCfgWrapper->m_InnerTempOverLimit->m_AlarmContinueTick++; } } else { thu->m_AlarmCfgWrapper->m_InnerTempOverLimit->m_AlarmContinueTick = 0; SignalService::GetInstance().SetAlarm(thu->m_AlarmCfgWrapper->m_InnerTempOverLimit, false); } } if (thu->m_AlarmCfgWrapper->m_InnerHumidityOverLimitAlarm) { if (humidity > thu->m_RunCfg->m_AlarmHumidityValue) { if (thu->m_AlarmCfgWrapper->m_InnerHumidityOverLimitAlarm->m_AlarmContinueTick > thu->m_AlarmCfgWrapper->m_InnerHumidityOverLimitAlarm->m_CheckAlarmSetTick) { thu->m_AlarmCfgWrapper->m_InnerHumidityOverLimitAlarm->m_AlarmInfo = to_string(humidity); SignalService::GetInstance().SetAlarm(thu->m_AlarmCfgWrapper->m_InnerHumidityOverLimitAlarm, true); } else { thu->m_AlarmCfgWrapper->m_InnerHumidityOverLimitAlarm->m_AlarmContinueTick++; } } else { thu->m_AlarmCfgWrapper->m_InnerHumidityOverLimitAlarm->m_AlarmContinueTick = 0; SignalService::GetInstance().SetAlarm(thu->m_AlarmCfgWrapper->m_InnerHumidityOverLimitAlarm, false); } } } void TempHumidityUnit::GetValue(float& temp, float& humidity, BaseStat& bs) { EnterCriticalSection(&m_ValueCS); temp = m_TempValue; humidity = m_HumidityValue; bs = m_BaseStat; LeaveCriticalSection(&m_ValueCS); } void TempHumidityUnit::GetValue(float& temp, float& humidity) { EnterCriticalSection(&m_ValueCS); temp = m_TempValue; humidity = m_HumidityValue; LeaveCriticalSection(&m_ValueCS); }