GrpcPrint/PrintS/Communication/WaterTempClient.cpp

74 lines
2.3 KiB
C++
Raw Permalink Normal View History

#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;
}