#include "ChillerClient.h" //#include "Modbus.h" //#include "../SystemInfo.h" #include "../external/imgui/imgui_custom.h" #include "../Toast.h" ChillerClient::ChillerClient(void* pconfig,int* tp) :TcpClient(pconfig) { m_Freq = 150; m_Type = tp; size_t ptrSize = sizeof(nullptr); //指针大小 void* startPtr = &m_DoluyoChillerStat.m_startFlag + 1; size_t count = ((size_t)&m_DoluyoChillerStat.m_endFlag - (size_t)startPtr) / ptrSize; InsertMp(startPtr, count); startPtr = &m_HansChillerstat.m_startFlag + 1; count = ((size_t)&m_HansChillerstat.m_endFlag - (size_t)startPtr) / ptrSize; InsertMp(startPtr, count); startPtr = &m_TongFeiStat.m_startFlag + 1; count = ((size_t)&m_TongFeiStat.m_endFlag - (size_t)startPtr) / ptrSize; InsertMp(startPtr, count); } ChillerClient::~ChillerClient() { Shutdown(); } //void ChillerClient::InitCommand() //{ // if ((*m_Type) == ExtCfg::DOLUYO) // { // Command* pCommand = new ReadModbus(m_Config->m_Addr, 0x2D, 38); // pCommand->m_Fun = &ChillerClient::ProcDoluyoInfo; // pCommand->m_Ref = this; // pCommand->isNeedDel = false; // // Command* pReadTarge = new ReadModbus(m_Config->m_Addr, 0x8E, 1); // pReadTarge->m_Fun = &ChillerClient::ProcDoluyoReadTargeValue; // pReadTarge->m_Ref = this; // pReadTarge->isNeedDel = false; // // m_CycleCommands.push_back(pCommand); // m_CycleCommands.push_back(pReadTarge); // } // else if((*m_Type)==ExtCfg::HANS) { // Command* pCommand = new ReadModbus(m_Config->m_Addr, 0x100, 16); // pCommand->m_Fun = &ChillerClient::ProcHansInfo; // pCommand->m_Ref = this; // pCommand->isNeedDel = false; // m_CycleCommands.push_back(pCommand); // } // else if ((*m_Type) == ExtCfg::TONGFEI) { // Command* alarmInput = new ReadCoilModbus(m_Config->m_Addr, 0x01, 20); // alarmInput->m_Fun = &ChillerClient::ProcTongfeiAlarmInputInfo; // alarmInput->m_Ref = this; // alarmInput->isNeedDel = false; // // Command* alarmState = new ReadModbus(m_Config->m_Addr, 57, 1); // alarmState->m_Fun = &ChillerClient::ProcTongfeiAlarmStateInfo; // alarmState->m_Ref = this; // alarmState->isNeedDel = false; // // Command* userParams = new ReadModbus(m_Config->m_Addr, 0x02, 5); // userParams->m_Fun = &ChillerClient::ProcTongfeiUserParamsInfo; // userParams->m_Ref = this; // userParams->isNeedDel = false; // // Command* anaShow = new ReadModbus(m_Config->m_Addr, 150, 9); // anaShow->m_Fun = &ChillerClient::ProcTongfeiAnaShowInfo; // anaShow->m_Ref = this; // anaShow->isNeedDel = false; // // Command* anaShow2 = new ReadModbus(m_Config->m_Addr, 720, 4); // anaShow2->m_Fun = &ChillerClient::ProcTongfeiAnaShowInfo2; // anaShow2->m_Ref = this; // anaShow2->isNeedDel = false; // // Command* anaShow3 = new ReadModbus(m_Config->m_Addr, 741, 5); // anaShow3->m_Fun = &ChillerClient::ProcTongfeianaShowInfo3; // anaShow3->m_Ref = this; // anaShow3->isNeedDel = false; // // m_CycleCommands.push_back(alarmInput); // m_CycleCommands.push_back(alarmState); // m_CycleCommands.push_back(userParams); // m_CycleCommands.push_back(anaShow); // m_CycleCommands.push_back(anaShow2); // m_CycleCommands.push_back(anaShow3); // } // //} //void ChillerClient::SetDoluyoTargetTempValue(float value) //{ // short realvalue = (short)(value * 10); // WriteModbus* pSet = new WriteModbus(m_Config->m_Addr, 0x8E); // pSet->AddShort(realvalue); // pSet->m_Fun = &ChillerClient::ProcDoluyoSettingValue; // pSet->m_Ref = this; // // EnterCriticalSection(&m_RtcCS); // m_RTCommands.push(pSet); // LeaveCriticalSection(&m_RtcCS); //} //void ChillerClient::ProcDoluyoInfo(void* pobject, Command* pcommand) //{ // if (pobject == NULL)return; // ChillerClient* pDlc = (ChillerClient*)pobject; // unsigned char* rseq = pcommand->m_RespSeq; // unsigned char addr = rseq[0]; // // short watertempValue = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)); // unsigned short runinfo = (((rseq[63] & 0xff) << 8) + (rseq[64] & 0xff)); // unsigned short runs = (((rseq[65] & 0xff) << 8) + (rseq[66] & 0xff)); // unsigned short alarminfo = (((rseq[67] & 0xff) << 8) + (rseq[68] & 0xff)); // unsigned short levelalarm = (((rseq[77] & 0xff) << 8) + (rseq[78] & 0xff)); // //short tempSetValue = (((rseq[197] & 0xff) << 8) + (rseq[198] & 0xff)); // // //pDlc->m_ValueMutex.lock(); // // EnterCriticalSection(&pDlc->m_ValueCS); // pDlc->m_DoluyoChillerStat.m_tempRealtimeValue->SetValue((float)watertempValue / 10.0f); // pDlc->m_DoluyoChillerStat.m_runInfo->SetValue(runinfo); // switch (runs) { // case 0:pDlc->m_DoluyoChillerStat.m_isRun->SetValue(false); break; // case 1:pDlc->m_DoluyoChillerStat.m_isRun->SetValue(true); break; // case 2:pDlc->m_DoluyoChillerStat.m_isRun->SetValue(false); break; // } // pDlc->m_DoluyoChillerStat.m_alarmInfo->SetValue(alarminfo); // pDlc->m_DoluyoChillerStat.m_isLevelAlarm->SetValue(((levelalarm == 0) ? false : true)); // //stat->tempSettingValue = (float)tempSetValue / 10.0f; // LeaveCriticalSection(&pDlc->m_ValueCS); //} //void ChillerClient::ProcDoluyoReadTargeValue(void* pobject, Command* pcommand) //{ // if (pobject == NULL)return; // ChillerClient* pDlc = (ChillerClient*)pobject; // unsigned char* rseq = pcommand->m_RespSeq; // unsigned char addr = rseq[0]; // // //unsigned char* rseq = pcommand->m_RespSeq; // short tempValue = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)); // EnterCriticalSection(&pDlc->m_ValueCS); // pDlc->m_DoluyoChillerStat.m_tempSettingValue->SetValue((float)tempValue / 10.0f); // LeaveCriticalSection(&pDlc->m_ValueCS); //} //void ChillerClient::ProcDoluyoSettingValue(void* pobject, Command* pcommand) //{ // ChillerClient* pDlc = (ChillerClient*)pobject; // WriteModbus* setCommand =(WriteModbus*) pcommand; // WriteModbus* pSave = new WriteModbus(setCommand->m_addr, 0x19); // pSave->AddShort(0x0500); // pSave->m_Ref = pDlc; // EnterCriticalSection(&pDlc->m_RtcCS); // pDlc->m_RTCommands.push(pSave); // LeaveCriticalSection(&pDlc->m_RtcCS); //} void ChillerClient::GetDoluyoStat(DoluyoChillerstat& stat1) { EnterCriticalSection(&m_ValueCS); stat1.baseStat = m_BaseStat; stat1.alarmInfo = m_DoluyoChillerStat.m_alarmInfo->GetValue(); stat1.isRun = m_DoluyoChillerStat.m_isRun->GetValue(); stat1.runInfo = m_DoluyoChillerStat.m_runInfo->GetValue(); stat1.tempRealtimeValue = m_DoluyoChillerStat.m_tempRealtimeValue->GetValue(); stat1.tempSettingValue = m_DoluyoChillerStat.m_tempSettingValue->GetValue(); stat1.isLevelAlarm = m_DoluyoChillerStat.m_isLevelAlarm->GetValue(); LeaveCriticalSection(&m_ValueCS); } void ChillerClient::GetHansStat(HansChillerstat& stat) { EnterCriticalSection(&m_ValueCS); /*stat.baseStat = m_BaseStat; stat.alarmInfo = m_Stat.alarmInfo; stat.isRun = m_Stat.isRun; stat.runInfo = m_Stat.runInfo; stat.tempRealtimeValue = m_Stat.tempRealtimeValue; stat.tempSettingValue = m_Stat.tempSettingValue; stat.isLevelAlarm = m_Stat.isLevelAlarm;*/ stat.baseStat = m_BaseStat; stat.m_WaterOutTemp = m_HansChillerstat.m_WaterOutTemp->GetValue(); stat.m_Flow = m_HansChillerstat.m_Flow->GetValue(); stat.m_SettingTemp = m_HansChillerstat.m_SettingTemp->GetValue(); stat.m_RunIndicate = m_HansChillerstat.m_RunIndicate->GetValue(); stat.m_WorkIndicate = m_HansChillerstat.m_WorkIndicate->GetValue(); stat.m_CompressorIndicate = m_HansChillerstat.m_CompressorIndicate->GetValue(); stat.m_WaterPumpIndicate = m_HansChillerstat.m_WaterPumpIndicate->GetValue(); stat.m_HeaterIndicate = m_HansChillerstat.m_HeaterIndicate->GetValue(); stat.m_FanIndicate = m_HansChillerstat.m_FanIndicate->GetValue(); stat.m_SolenoidValveIndicate = m_HansChillerstat.m_SolenoidValveIndicate->GetValue(); stat.m_LowTempErrorIndicate = m_HansChillerstat.m_LowTempErrorIndicate->GetValue(); stat.m_TempUndulateIndicate = m_HansChillerstat.m_TempUndulateIndicate->GetValue(); stat.m_HeaterExceptionIndicate = m_HansChillerstat.m_HeaterExceptionIndicate->GetValue(); stat.m_IOSignalIndicate = m_HansChillerstat.m_IOSignalIndicate->GetValue(); stat.m_IsAlarm = m_HansChillerstat.m_IsAlarm->GetValue(); stat.m_FlowAlarm = m_HansChillerstat.m_FlowAlarm->GetValue(); stat.m_TempAlarm = m_HansChillerstat.m_TempAlarm->GetValue(); stat.m_PressureAlarm = m_HansChillerstat.m_PressureAlarm->GetValue(); stat.m_WaterLevelAlarm = m_HansChillerstat.m_WaterLevelAlarm->GetValue(); stat.m_TempSensorAlarm = m_HansChillerstat.m_TempSensorAlarm->GetValue(); stat.m_SolenoidValveAlarm = m_HansChillerstat.m_SolenoidValveAlarm->GetValue(); stat.m_PhaseSeqAlarm = m_HansChillerstat.m_PhaseSeqAlarm->GetValue(); stat.m_CompressorStartFreqAlarm = m_HansChillerstat.m_CompressorStartFreqAlarm->GetValue(); stat.m_IO0Alarm = m_HansChillerstat.m_IO0Alarm->GetValue(); stat.m_IO1Alarm = m_HansChillerstat.m_IO1Alarm->GetValue(); stat.m_IO2Alarm = m_HansChillerstat.m_IO2Alarm->GetValue(); stat.m_IO3Alarm = m_HansChillerstat.m_IO3Alarm->GetValue(); stat.m_IO4Alarm = m_HansChillerstat.m_IO4Alarm->GetValue(); LeaveCriticalSection(&m_ValueCS); } void ChillerClient::GetTongFeiStat(TongFeiStat& stat) { EnterCriticalSection(&m_ValueCS); stat.m_BaseStat = m_BaseStat; stat.m_IsLowVoltageAlarm = m_TongFeiStat.m_IsLowVoltageAlarm->GetValue(); stat.m_IsHydraulicFailure = m_TongFeiStat.m_IsHydraulicFailure->GetValue(); stat.m_IsLevelFailure = m_TongFeiStat.m_IsLevelFailure->GetValue(); stat.m_IsLiquidPumpAlarm = m_TongFeiStat.m_IsLiquidPumpAlarm->GetValue(); stat.m_IsPressAlarm = m_TongFeiStat.m_IsPressAlarm->GetValue(); stat.m_IsElectricHeatingFailure = m_TongFeiStat.m_IsElectricHeatingFailure->GetValue(); stat.m_IsAntifreezeAlarm = m_TongFeiStat.m_IsAntifreezeAlarm->GetValue(); stat.m_IsLiquidTempTooHigh = m_TongFeiStat.m_IsLiquidTempTooHigh->GetValue(); stat.m_IsLiquidTempProbeFailure = m_TongFeiStat.m_IsLiquidTempProbeFailure->GetValue(); stat.m_IsEffluentTempProbeFailure = m_TongFeiStat.m_IsEffluentTempProbeFailure->GetValue(); stat.m_IsAmbientTempProbeFailure = m_TongFeiStat.m_IsAmbientTempProbeFailure->GetValue(); stat.m_IsCondensationTempProbeFailure = m_TongFeiStat.m_IsCondensationTempProbeFailure->GetValue(); stat.m_IsEvaporationInletTempProbeFailure = m_TongFeiStat.m_IsEvaporationInletTempProbeFailure->GetValue(); stat.m_IsEvaporationOutletTempProbeFailure = m_TongFeiStat.m_IsEvaporationOutletTempProbeFailure->GetValue(); stat.m_IsCondensationTempTooHigh = m_TongFeiStat.m_IsCondensationTempTooHigh->GetValue(); stat.m_IsPhaseOrderError = m_TongFeiStat.m_IsPhaseOrderError->GetValue(); stat.m_IsPowerFailure = m_TongFeiStat.m_IsPowerFailure->GetValue(); stat.m_IsCompressorFailure = m_TongFeiStat.m_IsCompressorFailure->GetValue(); stat.m_IsAmbientTempTooHigh = m_TongFeiStat.m_IsAmbientTempTooHigh->GetValue(); stat.m_IsAmbientTempException = m_TongFeiStat.m_IsAmbientTempException->GetValue(); stat.m_AlarmState = m_TongFeiStat.m_AlarmState->GetValue(); stat.m_RoomTempSettingValue = m_TongFeiStat.m_RoomTempSettingValue->GetValue(); stat.m_ConstantTempSettingValue = m_TongFeiStat.m_ConstantTempSettingValue->GetValue(); stat.m_WorkMode = m_TongFeiStat.m_WorkMode->GetValue(); stat.m_RefrigerationMethod = m_TongFeiStat.m_RefrigerationMethod->GetValue(); stat.m_LiquidAlarmTemp = m_TongFeiStat.m_LiquidAlarmTemp->GetValue(); stat.m_UnitStatus = m_TongFeiStat.m_UnitStatus->GetValue(); stat.m_LiquidTempProbe = m_TongFeiStat.m_LiquidTempProbe->GetValue(); stat.m_EffluentTempProbe = m_TongFeiStat.m_EffluentTempProbe->GetValue(); stat.m_AmbientTempProbe = m_TongFeiStat.m_AmbientTempProbe->GetValue(); stat.m_CondensationTempProbe = m_TongFeiStat.m_CondensationTempProbe->GetValue(); stat.m_EvaporationInletTempProbe = m_TongFeiStat.m_EvaporationInletTempProbe->GetValue(); stat.m_EvaporationOutletTempProbe = m_TongFeiStat.m_EvaporationOutletTempProbe->GetValue(); stat.m_WorkingFrequency = m_TongFeiStat.m_WorkingFrequency->GetValue(); stat.m_OverHeatingValue = m_TongFeiStat.m_OverHeatingValue->GetValue(); stat.m_EEV1 = m_TongFeiStat.m_EEV1->GetValue(); stat.m_EEV2 = m_TongFeiStat.m_EEV2->GetValue(); stat.m_CondensingFanRatio = m_TongFeiStat.m_CondensingFanRatio->GetValue(); stat.m_ElectricHeatingRatio = m_TongFeiStat.m_ElectricHeatingRatio->GetValue(); stat.m_FlowRate = m_TongFeiStat.m_FlowRate->GetValue(); LeaveCriticalSection(&m_ValueCS); } //void ChillerClient::ProcHansInfo(void* pobject, Command* pcommand) //{ // if (pobject == NULL)return; // ChillerClient* pDlc = (ChillerClient*)pobject; // unsigned char* rseq = pcommand->m_RespSeq; // // short state1 = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)); // short state2 = (((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff)); // // float waterOutTemp = (float)(((rseq[9] & 0xff) << 8) + (rseq[10] & 0xff)) / 10.0f; // float flow = (float)(((rseq[23] & 0xff) << 8) + (rseq[24] & 0xff)) / 10.0f; // float settingTemp = (float)(((rseq[33] & 0xff) << 8) + (rseq[34] & 0xff)) / 10.0f; // // EnterCriticalSection(&pDlc->m_ValueCS); // pDlc->m_HansChillerstat.m_WaterOutTemp->SetValue(waterOutTemp); // pDlc->m_HansChillerstat.m_Flow->SetValue(flow); // pDlc->m_HansChillerstat.m_SettingTemp->SetValue(settingTemp); // pDlc->m_HansChillerstat.m_RunIndicate->SetValue((state1 & 0x01) ? true : false); //运行指示 // pDlc->m_HansChillerstat.m_WorkIndicate->SetValue((state1 & 0x02) ? true : false); //工作正常指示 // pDlc->m_HansChillerstat.m_IsAlarm->SetValue((state1 & 0x04) ? true : false); //报警 // pDlc->m_HansChillerstat.m_CompressorIndicate->SetValue((state1 & 0x08) ? true : false); //压缩机指示 // pDlc->m_HansChillerstat.m_WaterPumpIndicate->SetValue((state1 & 0x10) ? true : false); //水泵指示 // pDlc->m_HansChillerstat.m_HeaterIndicate->SetValue((state1 & 0x20) ? true : false); //加热器指示 // pDlc->m_HansChillerstat.m_FanIndicate->SetValue((state1 & 0x40) ? true : false); //风机指示 // pDlc->m_HansChillerstat.m_SolenoidValveIndicate->SetValue((state1 & 0x80) ? true : false); //电磁阀指示 // pDlc->m_HansChillerstat.m_FlowAlarm->SetValue((state1 & 0x100) ? true : false); //流量报警 // pDlc->m_HansChillerstat.m_TempAlarm->SetValue((state1 & 0x200) ? true : false); //温度报警 // pDlc->m_HansChillerstat.m_PressureAlarm->SetValue((state1 & 0x400) ? true : false); //压力报警 // pDlc->m_HansChillerstat.m_WaterLevelAlarm->SetValue((state1 & 0x800) ? true : false); //液位报警 // pDlc->m_HansChillerstat.m_LowTempErrorIndicate->SetValue((state1 & 0x1000) ? true : false); //低温错误指示 // pDlc->m_HansChillerstat.m_TempUndulateIndicate->SetValue((state1 & 0x2000) ? true : false); //温度波动指示 // // pDlc->m_HansChillerstat.m_TempSensorAlarm->SetValue((state2 & 0x01) ? true : false); //温度传感器故障报警 // pDlc->m_HansChillerstat.m_SolenoidValveAlarm->SetValue((state2 & 0x02) ? true : false); //电磁阀故障报警 // pDlc->m_HansChillerstat.m_HeaterExceptionIndicate->SetValue((state2 & 0x04) ? true : false); //加热器异常指示 // pDlc->m_HansChillerstat.m_IOSignalIndicate->SetValue((state2 & 0x08) ? true : false); //IO信号指示 // pDlc->m_HansChillerstat.m_PhaseSeqAlarm->SetValue((state2 & 0x10) ? true : false); //相序报警 // pDlc->m_HansChillerstat.m_CompressorStartFreqAlarm->SetValue((state2 & 0x20) ? true : false); //压缩机起动频繁报警 // pDlc->m_HansChillerstat.m_IO0Alarm->SetValue((state2 & 0x100) ? true : false); //IO0错误报警 // pDlc->m_HansChillerstat.m_IO1Alarm->SetValue((state2 & 0x200) ? true : false); //IO0错误报警 // pDlc->m_HansChillerstat.m_IO2Alarm->SetValue((state2 & 0x400) ? true : false); //IO0错误报警 // pDlc->m_HansChillerstat.m_IO3Alarm->SetValue((state2 & 0x800) ? true : false); //IO0错误报警 // pDlc->m_HansChillerstat.m_IO4Alarm->SetValue((state2 & 0x1000) ? true : false); //IO0错误报警 // LeaveCriticalSection(&pDlc->m_ValueCS); // // //g_SystemInfo->LockInfo(); // //g_SystemInfo->m_WaterTemp = waterOutTemp; // //g_SystemInfo->UnlockInfo(); //} //void ChillerClient::SetHansTargetTempValue(float value) //{ // short realvalue = (short)(value * 10); // WriteModbus* pSet = new WriteModbus(m_Config->m_Addr, 271); // pSet->AddShort(realvalue); // pSet->m_Ref = this; // EnterCriticalSection(&m_RtcCS); // m_RTCommands.push(pSet); // LeaveCriticalSection(&m_RtcCS); //} void ChillerClient::DrawUI() { if (!m_IsShowUI) return; if(1/*m_Config->m_ClientCode=="LASER_CHILLER"*/)ImGui::Begin(_(u8"激光器冷水机").c_str(), &m_IsShowUI, ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav); else if(0/*m_Config->m_ClientCode == "PURIFIER_CHILLER"*/)ImGui::Begin(_(u8"净化器冷水机").c_str(), &m_IsShowUI, ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav); else ImGui::Begin(_(u8"冷水机").c_str(), &m_IsShowUI, ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoNav); if ((*m_Type) == ExtCfg::DOLUYO) { DoluyoChillerstat stat; GetDoluyoStat(stat); if (stat.baseStat.isConnected)ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0), _(u8"冷水机通讯连接:正常").c_str()); else ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0), _(u8"冷水机通讯连接:断开").c_str()); ImGui::Text(_(u8"冷水机水温:%.1f ℃").c_str(), stat.tempRealtimeValue); ImGui::Text(_(u8"冷水机设定水温:%.1f ℃").c_str(), stat.tempSettingValue); ImGui::Text(_(u8"冷水机运行状态:%s").c_str(), stat.GetRunInfo().c_str()); ImGui::Text(_(u8"冷水机故障信息:%s").c_str(), stat.GetAlarmInfo().c_str()); if (!stat.isLevelAlarm) ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0), _(u8"冷水机液位:正常").c_str()); else ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0), _(u8"冷水机液位:报警").c_str()); } else if ((*m_Type) == ExtCfg::HANS) { HansChillerstat cs; GetHansStat(cs); ImGui::BeginGroup(); if (IsServerConnected()) { ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0), _(u8"端口连接:正常").c_str()); } else { ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0), _(u8"端口连接:断开").c_str()); } if (IsComConnected()) { ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0), _(u8"通讯连接:正常").c_str()); } else { ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0), _(u8"通讯连接:断开").c_str()); } ImGui::Dummy(ImVec2(0, 10)); ImGui::Text(_(u8"冷水机水温:%.1f ℃").c_str(), cs.m_WaterOutTemp); ImGui::Text(_(u8"流量:%.1f L/min").c_str(), cs.m_Flow); ImGui::Text(_(u8"设置温度:%.1f ℃").c_str(), cs.m_SettingTemp); ImGui::EndGroup(); ImGui::SameLine(); ImGui::SeparatorEx(ImGuiSeparatorFlags_Vertical); ImGui::SameLine(); ImGui::BeginGroup(); ImGui::Text(_(u8"运行指示:%s").c_str(), cs.m_RunIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::Text(_(u8"工作正常指示:%s").c_str(), cs.m_WorkIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::Text(_(u8"压缩机指示:%s").c_str(), cs.m_CompressorIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::Text(_(u8"水泵指示:%s").c_str(), cs.m_WaterPumpIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::Text(_(u8"加热器指示:%s").c_str(), cs.m_HeaterIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::Text(_(u8"风机指示:%s").c_str(), cs.m_FanIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::Text(_(u8"电磁阀指示:%s").c_str(), cs.m_SolenoidValveIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::Text(_(u8"低温错误指示:%s").c_str(), cs.m_LowTempErrorIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::Text(_(u8"温度波动指示:%s").c_str(), cs.m_TempUndulateIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::Text(_(u8"加热器异常指示:%s").c_str(), cs.m_HeaterExceptionIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::Text(_(u8"IO信号指示:%s").c_str(), cs.m_IOSignalIndicate ? _(u8"是").c_str() : _(u8"否").c_str()); ImGui::EndGroup(); ImGui::SameLine(); ImGui::SeparatorEx(ImGuiSeparatorFlags_Vertical); ImGui::SameLine(); ImGui::BeginGroup(); if (cs.m_IsAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_FlowAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"流量报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"流量报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_TempAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"温度报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"温度报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_PressureAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"压力报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"压力报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_WaterLevelAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"液位报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"液位报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_TempSensorAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"温度传感器故障报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"温度传感器故障报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_SolenoidValveAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"电磁阀故障报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"电磁阀故障报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_PhaseSeqAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"相序报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"相序报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_CompressorStartFreqAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"压缩机起动频繁报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"压缩机起动频繁报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_IO0Alarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"IO0错误报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"IO0错误报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_IO1Alarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"IO1错误报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"IO1错误报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_IO2Alarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"IO2错误报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"IO2错误报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_IO3Alarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"IO3错误报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"IO3错误报警:%s").c_str(), _(u8"否").c_str()); if (cs.m_IO4Alarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"IO4错误报警:%s").c_str(), _(u8"是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"IO4错误报警:%s").c_str(), _(u8"否").c_str()); ImGui::EndGroup(); } else if ((*m_Type) == ExtCfg::TONGFEI) { TongFeiStat tfs; GetTongFeiStat(tfs); ImGui::BeginGroup(); if (IsServerConnected()) { ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0), _(u8"端口连接:正常").c_str()); } else { ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0), _(u8"端口连接:断开").c_str()); } if (IsComConnected()) { ImGui::TextColored(ImVec4(0.0, 1.0, 0.0, 1.0), _(u8"通讯连接:正常").c_str()); } else { ImGui::TextColored(ImVec4(1.0, 0.0, 0.0, 1.0), _(u8"通讯连接:断开").c_str()); } ImGui::Dummy(ImVec2(0, 10)); ImGui::Text(_(u8"室温同调预设温度:%.1f ℃").c_str(), tfs.m_RoomTempSettingValue); ImGui::Text(_(u8"恒温预设温度:%.1f ℃").c_str(), tfs.m_ConstantTempSettingValue); string workModeStr = _(u8"未知").c_str(); if (tfs.m_WorkMode==0) { workModeStr = _(u8"手动").c_str(); } else if (tfs.m_WorkMode == 1) { workModeStr = _(u8"自动").c_str(); } else if (tfs.m_WorkMode == 2) { workModeStr = _(u8"机外").c_str(); } ImGui::Text(_(u8"工作模式:%s").c_str(), workModeStr.c_str()); string refrigerationMethod = _(u8"未知").c_str(); if (tfs.m_RefrigerationMethod == 0) { refrigerationMethod = _(u8"室温同调").c_str(); } else if (tfs.m_RefrigerationMethod == 1) { refrigerationMethod = _(u8"恒温控制").c_str(); } ImGui::Text(_(u8"制冷方式:%s").c_str(), refrigerationMethod.c_str()); ImGui::Text(_(u8"出液报警温度:%.1f ℃").c_str(), tfs.m_LiquidAlarmTemp); string unitStatus = _(u8"未知").c_str(); if (tfs.m_UnitStatus == 0) { unitStatus = _(u8"停止").c_str(); } else if (tfs.m_UnitStatus == 1) { unitStatus = _(u8"运行").c_str(); } else if (tfs.m_UnitStatus == 2) { unitStatus = _(u8"停机中").c_str(); } else if (tfs.m_UnitStatus == 3) { unitStatus = _(u8"防冻中").c_str(); } else if (tfs.m_UnitStatus == 4) { unitStatus = _(u8"无流量").c_str(); } ImGui::Text(_(u8"机组状态:%s").c_str(), unitStatus.c_str()); ImGui::Text(_(u8"液温温度探头:%.2f ℃").c_str(), tfs.m_LiquidTempProbe); ImGui::Text(_(u8"出液温度探头:%.1f ℃").c_str(), tfs.m_EffluentTempProbe); ImGui::Text(_(u8"环境温度探头:%.1f ℃").c_str(), tfs.m_AmbientTempProbe); ImGui::Text(_(u8"冷凝温度探头:%.1f ℃").c_str(), tfs.m_CondensationTempProbe); ImGui::Text(_(u8"蒸发进口温度探头:%.1f ℃").c_str(), tfs.m_EvaporationInletTempProbe); ImGui::Text(_(u8"蒸发出口温度探头:%.1f ℃").c_str(), tfs.m_EvaporationOutletTempProbe); ImGui::Text(_(u8"运行频率:%.1f Hz").c_str(), tfs.m_WorkingFrequency); ImGui::Text(_(u8"过热度:%.1f ℃").c_str(), tfs.m_OverHeatingValue); ImGui::Text(_(u8"戴流EEV:%.1f").c_str(), tfs.m_EEV1); ImGui::Text(_(u8"旁通EEV:%.1f").c_str(), tfs.m_EEV2); ImGui::Text(_(u8"冷凝风机比例:%.1f").c_str(), tfs.m_CondensingFanRatio); ImGui::Text(_(u8"电加热比例:%.1f").c_str(), tfs.m_ElectricHeatingRatio); ImGui::Text(_(u8"流量:%.1f").c_str(), tfs.m_FlowRate); ImGui::EndGroup(); ImGui::SameLine(); ImGui::SeparatorEx(ImGuiSeparatorFlags_Vertical); ImGui::SameLine(); ImGui::BeginGroup(); string alarmStateStr = _(u8"未知").c_str(); if (tfs.m_AlarmState == 0) { alarmStateStr = _(u8"正常").c_str(); } else if (tfs.m_AlarmState == 1) { alarmStateStr = _(u8"故障").c_str(); } else if (tfs.m_AlarmState == 2) { alarmStateStr = _(u8"信号等待").c_str(); } ImGui::Text(_(u8"故障状态:%s").c_str(), alarmStateStr.c_str()); if (tfs.m_IsLowVoltageAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"低压报警:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"低压报警:否").c_str()); if (tfs.m_IsHydraulicFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"液路故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"液路故障:否").c_str()); if (tfs.m_IsLevelFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"液位故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"液位故障:否").c_str()); if (tfs.m_IsLiquidPumpAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"液泵热继电器报警:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"液泵热继电器报警:否").c_str()); if (tfs.m_IsPressAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"压机热继电器报警:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"压机热继电器报警:否").c_str()); if (tfs.m_IsElectricHeatingFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"电加热故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"电加热故障:否").c_str()); if (tfs.m_IsAntifreezeAlarm)ImGui::TextColored(Toast::COLOR_RED, _(u8"防冻报警:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"防冻报警:否").c_str()); if (tfs.m_IsLiquidTempTooHigh)ImGui::TextColored(Toast::COLOR_RED, _(u8"液温太高:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"液温太高:否").c_str()); if (tfs.m_IsLiquidTempProbeFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"液温温度探头故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"液温温度探头故障:否").c_str()); if (tfs.m_IsEffluentTempProbeFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"出液温度探头故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"出液温度探头故障:否").c_str()); if (tfs.m_IsAmbientTempProbeFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"环境温度探头故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"环境温度探头故障:否").c_str()); if (tfs.m_IsCondensationTempProbeFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"冷凝温度探头故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"冷凝温度探头故障:否").c_str()); if (tfs.m_IsEvaporationInletTempProbeFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"蒸发进口温度探头故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"蒸发进口温度探头故障:否").c_str()); if (tfs.m_IsEvaporationOutletTempProbeFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"蒸发出口温度探头故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"蒸发出口温度探头故障:否").c_str()); if (tfs.m_IsCondensationTempTooHigh)ImGui::TextColored(Toast::COLOR_RED, _(u8"冷凝温度过高:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"冷凝温度过高:否").c_str()); if (tfs.m_IsPhaseOrderError)ImGui::TextColored(Toast::COLOR_RED, _(u8"相序错误:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"相序错误:否").c_str()); if (tfs.m_IsPowerFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"电源故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"电源故障:否").c_str()); if (tfs.m_IsCompressorFailure)ImGui::TextColored(Toast::COLOR_RED, _(u8"压缩机故障:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"压缩机故障:否").c_str()); if (tfs.m_IsAmbientTempTooHigh)ImGui::TextColored(Toast::COLOR_RED, _(u8"环境温度太高:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"环境温度太高:否").c_str()); if (tfs.m_IsAmbientTempException)ImGui::TextColored(Toast::COLOR_RED, _(u8"环境温度异常:是").c_str()); else ImGui::TextColored(Toast::COLOR_GREEN, _(u8"环境温度异常:否").c_str()); ImGui::EndGroup(); } ImGui::End(); } //void ChillerClient::ProcTongfeiAlarmInputInfo(void* pobject, Command* pcommand) //{ // if (pobject == NULL)return; // ChillerClient* cc = (ChillerClient*)pobject; // unsigned char* rseq = pcommand->m_RespSeq; // // bitset<8> arr1(rseq[3]); // bitset<8> arr2(rseq[4]); // bitset<8> arr3(rseq[5]); // EnterCriticalSection(&cc->m_ValueCS); // cc->m_TongFeiStat.m_IsLowVoltageAlarm->SetValue(arr1[0]); // cc->m_TongFeiStat.m_IsHydraulicFailure->SetValue(arr1[1]); // cc->m_TongFeiStat.m_IsLevelFailure->SetValue(arr1[2]); // cc->m_TongFeiStat.m_IsLiquidPumpAlarm->SetValue(arr1[3]); // cc->m_TongFeiStat.m_IsPressAlarm->SetValue(arr1[4]); // cc->m_TongFeiStat.m_IsElectricHeatingFailure->SetValue(arr1[5]); // cc->m_TongFeiStat.m_IsAntifreezeAlarm->SetValue(arr1[6]); // cc->m_TongFeiStat.m_IsLiquidTempTooHigh->SetValue(arr1[7]); // // cc->m_TongFeiStat.m_IsLiquidTempProbeFailure->SetValue(arr2[0]); // cc->m_TongFeiStat.m_IsEffluentTempProbeFailure->SetValue(arr2[1]); // cc->m_TongFeiStat.m_IsAmbientTempProbeFailure->SetValue(arr2[2]); // cc->m_TongFeiStat.m_IsCondensationTempProbeFailure->SetValue(arr2[3]); // cc->m_TongFeiStat.m_IsEvaporationInletTempProbeFailure->SetValue(arr2[4]); // cc->m_TongFeiStat.m_IsEvaporationOutletTempProbeFailure->SetValue(arr2[5]); // cc->m_TongFeiStat.m_IsCondensationTempTooHigh->SetValue(arr2[6]); // cc->m_TongFeiStat.m_IsPhaseOrderError->SetValue(arr2[7]); // // cc->m_TongFeiStat.m_IsPowerFailure->SetValue(arr3[0]); // cc->m_TongFeiStat.m_IsCompressorFailure->SetValue(arr3[1]); // cc->m_TongFeiStat.m_IsAmbientTempTooHigh->SetValue(arr3[2]); // cc->m_TongFeiStat.m_IsAmbientTempException->SetValue(arr3[3]); // LeaveCriticalSection(&cc->m_ValueCS); //} // //void ChillerClient::ProcTongfeiAlarmStateInfo(void* pobject, Command* pcommand) //{ // if (pobject == NULL)return; // ChillerClient* cc = (ChillerClient*)pobject; // unsigned char* rseq = pcommand->m_RespSeq; // // short state1 = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)); // EnterCriticalSection(&cc->m_ValueCS); // cc->m_TongFeiStat.m_AlarmState->SetValue(state1); // LeaveCriticalSection(&cc->m_ValueCS); //} // //void ChillerClient::ProcTongfeiUserParamsInfo(void* pobject, Command* pcommand) //{ // if (pobject == NULL)return; // ChillerClient* cc = (ChillerClient*)pobject; // unsigned char* rseq = pcommand->m_RespSeq; // // short roomTempSettingValue = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)); // short constantTempSettingValue = (((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff)); // short workMode = (((rseq[7] & 0xff) << 8) + (rseq[8] & 0xff)); // short refrigerationMethod = (((rseq[9] & 0xff) << 8) + (rseq[10] & 0xff)); // short liquidAlarmTemp = (((rseq[11] & 0xff) << 8) + (rseq[12] & 0xff)); // // EnterCriticalSection(&cc->m_ValueCS); // cc->m_TongFeiStat.m_RoomTempSettingValue->SetValue((float)roomTempSettingValue/10.0f); // cc->m_TongFeiStat.m_ConstantTempSettingValue->SetValue((float)constantTempSettingValue / 10.0f); // cc->m_TongFeiStat.m_WorkMode->SetValue((int)workMode); // cc->m_TongFeiStat.m_RefrigerationMethod->SetValue(refrigerationMethod); // cc->m_TongFeiStat.m_LiquidAlarmTemp->SetValue((float)liquidAlarmTemp / 10.0f); // LeaveCriticalSection(&cc->m_ValueCS); //} //void ChillerClient::ProcTongfeiAnaShowInfo(void* pobject, Command* pcommand) //{ // if (pobject == NULL)return; // ChillerClient* cc = (ChillerClient*)pobject; // unsigned char* rseq = pcommand->m_RespSeq; // // short liquidTempProbe = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)); // short effluentTempProbe = (((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff)); // short ambientTempProbe = (((rseq[7] & 0xff) << 8) + (rseq[8] & 0xff)); // short condensationTempProbe = (((rseq[9] & 0xff) << 8) + (rseq[10] & 0xff)); // short evaporationInletTempProbe = (((rseq[11] & 0xff) << 8) + (rseq[12] & 0xff)); // short evaporationOutletTempProbe = (((rseq[13] & 0xff) << 8) + (rseq[14] & 0xff)); // // short unitStatus = (((rseq[19] & 0xff) << 8) + (rseq[20] & 0xff)); // EnterCriticalSection(&cc->m_ValueCS); // cc->m_TongFeiStat.m_LiquidTempProbe->SetValue((float)liquidTempProbe/10.0f); // cc->m_TongFeiStat.m_EffluentTempProbe->SetValue((float)effluentTempProbe / 10.0f); // cc->m_TongFeiStat.m_AmbientTempProbe->SetValue((float)ambientTempProbe / 10.0f); // cc->m_TongFeiStat.m_CondensationTempProbe->SetValue((float)condensationTempProbe / 10.0f); // cc->m_TongFeiStat.m_EvaporationInletTempProbe->SetValue((float)evaporationInletTempProbe / 10.0f); // cc->m_TongFeiStat.m_EvaporationOutletTempProbe->SetValue((float)evaporationOutletTempProbe / 10.0f); // cc->m_TongFeiStat.m_UnitStatus->SetValue(unitStatus); // LeaveCriticalSection(&cc->m_ValueCS); //} //void ChillerClient::ProcTongfeiAnaShowInfo2(void* pobject, Command* pcommand) //{ // if (pobject == NULL)return; // ChillerClient* cc = (ChillerClient*)pobject; // unsigned char* rseq = pcommand->m_RespSeq; // // short WorkingFrequency = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)); // short OverHeatingValue = (((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff)); // short EEV1 = (((rseq[7] & 0xff) << 8) + (rseq[8] & 0xff)); // short EEV2 = (((rseq[9] & 0xff) << 8) + (rseq[10] & 0xff)); // // EnterCriticalSection(&cc->m_ValueCS); // cc->m_TongFeiStat.m_WorkingFrequency->SetValue((float)WorkingFrequency / 10.0f); // cc->m_TongFeiStat.m_OverHeatingValue->SetValue((float)OverHeatingValue / 10.0f); // cc->m_TongFeiStat.m_EEV1->SetValue((float)EEV1/10.0f); // cc->m_TongFeiStat.m_EEV2->SetValue((float)EEV2/10.0f); // LeaveCriticalSection(&cc->m_ValueCS); //} //void ChillerClient::ProcTongfeianaShowInfo3(void* pobject, Command* pcommand) //{ // if (pobject == NULL)return; // ChillerClient* cc = (ChillerClient*)pobject; // unsigned char* rseq = pcommand->m_RespSeq; // // short CondensingFanRatio = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)); // short ElectricHeatingRatio = (((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff)); // short FlowRate = (((rseq[11] & 0xff) << 8) + (rseq[12] & 0xff)); // // EnterCriticalSection(&cc->m_ValueCS); // cc->m_TongFeiStat.m_CondensingFanRatio->SetValue((float)CondensingFanRatio / 10.0f); // cc->m_TongFeiStat.m_ElectricHeatingRatio->SetValue((float)ElectricHeatingRatio / 10.0f); // cc->m_TongFeiStat.m_FlowRate->SetValue((float)FlowRate/10.0f); // LeaveCriticalSection(&cc->m_ValueCS); //}