#include "WaterTempClient.h" #include "Modbus.h" #include "../utils/DataByte.h" #include "../config/ConfigManager.h" #include "../SystemInfo.h" #include "../PLC/SignalService.h" WaterTempClient::WaterTempClient(CommunicationCfg* pconfig) :TcpClient(pconfig) , m_WaterTemp(0.0f) { m_ExtCfg = ConfigManager::GetInstance()->GetExtCfg(); m_AlarmCfgWrapper = ConfigManager::GetInstance()->GetAlarmCfg(); } void WaterTempClient::InitCommand() { Command* pCommand = new ReadModbus(m_Config->m_Addr->GetValue(), 0x0, 1); pCommand->m_Fun = &WaterTempClient::ProcTempInfo; pCommand->m_Ref = this; pCommand->isNeedDel = false; m_CycleCommands.push_back(pCommand); } void WaterTempClient::ProcTempInfo(void* pobject, Command* pcommand) { if (pobject == NULL)return; WaterTempClient* client = (WaterTempClient*)pobject; unsigned char* rseq = pcommand->m_RespSeq; short temp1 = ((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff); float waterTemp = (float)temp1 / 10.0f - 200.0f; EnterCriticalSection(&client->m_ValueCS); client->m_WaterTemp = waterTemp; LeaveCriticalSection(&client->m_ValueCS); g_SystemInfo->LockInfo(); g_SystemInfo->m_PipeWaterTemp = waterTemp; g_SystemInfo->UnlockInfo(); time_t tnow; time(&tnow); if (tnow - SignalService::GetInstance().GetWaterAlarmCheckTime() > 60 * 5) { if (waterTemp < client->m_ExtCfg->m_PipeWaterTempDownLimit || waterTemp > client->m_ExtCfg->m_PipeWaterTempUpLimit) { if (client->m_AlarmCfgWrapper->m_PipeWaterTempAlarm->m_AlarmContinueTick > 10) { client->m_AlarmCfgWrapper->m_PipeWaterTempAlarm->m_AlarmInfo = to_string(waterTemp); SignalService::GetInstance().SetAlarm(client->m_AlarmCfgWrapper->m_PipeWaterTempAlarm, true); } else { client->m_AlarmCfgWrapper->m_PipeWaterTempAlarm->m_AlarmContinueTick++; } } else { client->m_AlarmCfgWrapper->m_PipeWaterTempAlarm->m_AlarmContinueTick = 0; SignalService::GetInstance().SetAlarm(client->m_AlarmCfgWrapper->m_PipeWaterTempAlarm, false); } } else { client->m_AlarmCfgWrapper->m_PipeWaterTempAlarm->m_AlarmContinueTick = 0; SignalService::GetInstance().SetAlarm(client->m_AlarmCfgWrapper->m_PipeWaterTempAlarm, false); } } float WaterTempClient::GetWaterTemp() { float rel = 0.0f; EnterCriticalSection(&m_ValueCS); rel = m_WaterTemp; LeaveCriticalSection(&m_ValueCS); return rel; }