From 02f8764bf8ea4823e9bddf92e488b8aeb854a72b Mon Sep 17 00:00:00 2001 From: wangxx1809 Date: Fri, 12 Apr 2024 15:51:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BE=85=E6=9C=BA=E5=8F=82=E6=95=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrintC/DataManage/RWData.h | 2 + PrintC/config/bean/IOCfg.h | 1 + PrintC/output/Release/log/2024.hbd | Bin 122880 -> 122880 bytes PrintS/Communication/BaseClient.cpp | 45 ++- PrintS/Communication/BaseClient.h | 10 + PrintS/Communication/BaseData.h | 165 +++++++++++ PrintS/Communication/ChillerClient.cpp | 372 ++++++++++++------------ PrintS/Communication/ChillerClient.h | 273 +++++++++++------ PrintS/Communication/IPGLaserClient.h | 108 +++---- PrintS/Communication/TempCtrlClient.cpp | 85 +++--- PrintS/Communication/TempCtrlClient.h | 76 +++-- PrintS/Communication/UPSClient.cpp | 83 +++--- PrintS/Communication/UPSClient.h | 87 ++++-- PrintS/Config/bean/IOCfg.h | 3 +- PrintS/DataManage/ClientInfo.cpp | 13 + PrintS/DataManage/ClientInfo.h | 2 + PrintS/DataManage/RWData.h | 5 +- PrintS/PLC/CoreCommunication.cpp | 18 +- PrintS/PLC/SysParam.cpp | 43 ++- PrintS/PrintS.vcxproj | 1 + PrintS/PrintS.vcxproj.filters | 3 + PrintS/job/MetaData.h | 6 +- PrintS/job/VolumeCalc.cpp | 4 +- PrintS/protobuf/stream.proto | 1 + 24 files changed, 930 insertions(+), 476 deletions(-) create mode 100644 PrintS/Communication/BaseData.h diff --git a/PrintC/DataManage/RWData.h b/PrintC/DataManage/RWData.h index 8ef764c..05d39fd 100644 --- a/PrintC/DataManage/RWData.h +++ b/PrintC/DataManage/RWData.h @@ -30,9 +30,11 @@ enum DATATYPE { iFLOAT }; + struct Item { std::string nameKey; //参数key std::string strValue; //value + //bool isOutPut; //是否只读 false:只读 DATATYPE valueType; //数据类型 }; diff --git a/PrintC/config/bean/IOCfg.h b/PrintC/config/bean/IOCfg.h index e3164b0..16f4bc4 100644 --- a/PrintC/config/bean/IOCfg.h +++ b/PrintC/config/bean/IOCfg.h @@ -1770,6 +1770,7 @@ public: keyStr = it->nameKey; if (m_IOCfgMap.find(keyStr) != m_IOCfgMap.end() && it->valueType == iBOOL) { m_IOCfgMap[keyStr]->m_IsActive = (bool)atoi(it->strValue.c_str()); + //m_IOCfgMap[keyStr]->m_IsOutput = it->isOutPut; } ++it; } diff --git a/PrintC/output/Release/log/2024.hbd b/PrintC/output/Release/log/2024.hbd index f5746cc2909752d3616a0255b4b021bc6e9e6a37..a69834f6e450d7005c848a03fd1d07d648e480ff 100644 GIT binary patch delta 16526 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 + } + m_baseMp.clear(); + LeaveCriticalSection(&m_ValueCS); + DeleteCriticalSection(&m_ValueCS); DeleteCriticalSection(&m_RtcCS); + + } void BaseClient::Startup() @@ -116,6 +126,33 @@ void BaseClient::UpdateCycleCommands() } } +void BaseClient::InsertMp(void* startPtr, size_t count) { + size_t ptrSize = sizeof(nullptr); //指针大小 + for (int i = 0; i < count; ++i) { + BaseData* bd = *((BaseData**)((char*)startPtr + ptrSize * i)); + if (m_baseMp.find(bd->GetCode()) != m_baseMp.end()) { + printf("%s is repeated...\n", bd->GetCode().data()); + } + else { m_baseMp.insert(make_pair(bd->GetCode(), bd)); } + } +} + +void BaseClient::SendToClients() { + string valStr = ""; + DATATYPE dataType; + list its; + + EnterCriticalSection(&m_ValueCS); + auto baseItem = m_baseMp.begin(); + while (baseItem != m_baseMp.end()) { + its.emplace_back(Item{ baseItem->first,baseItem->second->GetValueStr(),baseItem->second->GetDataType() }); + ++baseItem; + } + ClientWrapper::Instance()->PushAllClient(new WriteData(SYSPARAMDATA, its)); + LeaveCriticalSection(&m_ValueCS); +} + + S7Client::S7Client(CommunicationCfg* pconfig) :m_S7Client(nullptr) @@ -458,6 +495,8 @@ TcpClient::TcpClient(CommunicationCfg* pconfig, int freq) TcpClient::~TcpClient() { Shutdown(); + + } void TcpClient::Init() @@ -604,3 +643,5 @@ void TcpClient::Shutdown() if (m_Client.IsOpen())m_Client.Close(); } + + diff --git a/PrintS/Communication/BaseClient.h b/PrintS/Communication/BaseClient.h index a1df5cd..19acce5 100644 --- a/PrintS/Communication/BaseClient.h +++ b/PrintS/Communication/BaseClient.h @@ -9,6 +9,9 @@ #include #include #include "ConnectInterface.h" +#include "BaseData.h" +#include + class BaseStat { public: @@ -45,6 +48,7 @@ public: virtual bool IsComConnected() { return m_BaseStat.isConnected; } void ClearCycleCommand(); + void SendToClients(); protected: virtual void InitCommand() = 0; virtual unsigned int GetInterval() { return 600; } @@ -63,6 +67,7 @@ protected: virtual void CycleBegin() {}; + void InsertMp(void* startPtr, size_t count); protected: HANDLE m_Thread; @@ -75,6 +80,8 @@ protected: //CSocketHandle m_Client; uint64_t m_LastCycleTickcount; BaseStat m_BaseStat; + + unordered_map m_baseMp; }; class S7Client :public BaseClient @@ -160,10 +167,13 @@ private: virtual void ReadTimeoutProc(Command* pcommand); virtual void ReadSuccessProc(int rlength, unsigned char* buffer, Command* pcommand); unsigned int GetInterval() { return m_Config->m_Interval; } + protected: CSocketHandle m_Client; CommunicationCfg* m_Config; int m_Freq; int m_ReadTimeout; int m_WriteTimeout; + + }; diff --git a/PrintS/Communication/BaseData.h b/PrintS/Communication/BaseData.h new file mode 100644 index 0000000..d3abd93 --- /dev/null +++ b/PrintS/Communication/BaseData.h @@ -0,0 +1,165 @@ +#pragma once +#include +#include "../DataManage/RWData.h" + +class BaseData { +public: + BaseData(const std::string& code,const std::string& context):m_code(code),m_context(context){} + virtual ~BaseData() {} + + virtual void SetValue(float f) {} + virtual void SetValue(int i) {} + virtual void SetValue(unsigned short us) {} + virtual void SetValue(short s) {} + virtual void SetValue(bool b) {} + + //virtual void GetValue(DATATYPE& dataType, float& f) {} + //virtual void GetValue(DATATYPE& dataType, int& i) {} + //virtual void GetValue(DATATYPE& dataType, unsigned short& us) {} + //virtual void GetValue(DATATYPE& dataType, short& s) {} + //virtual void GetValue(DATATYPE& dataType, bool& b) {} + + std::string GetCode() { return m_code; } + virtual std::string GetValueStr() { return ""; } + virtual DATATYPE GetDataType() { return UNKNOW; } +private: + std::string m_code; //key编码 + std::string m_context; //中文内容 + +}; + +class FloatData : public BaseData { +public: + FloatData(const std::string& code, const std::string& context/*, float val*/) + : BaseData(code, context), m_value(0.0f) { + //if (m_baseMp.find(code) != m_baseMp.end()) { + // printf("%s is repeated...", code.c_str()); + //} + //else { + // m_baseMp.insert(make_pair(code, this)); + //} + } + ~FloatData() {} + + void SetValue(float f) { m_value = f; } + //void GetValue(DATATYPE& dataType, float& f) { dataType = iFLOAT; f = m_value; } + DATATYPE GetDataType() { return iFLOAT; } + float GetValue() { return m_value; } + virtual std::string GetValueStr() { return to_string(m_value); } +private: + float m_value; +}; + + +class IntData : public BaseData { +public: + IntData(const std::string& code, const std::string& context/*, int val*/) + : BaseData(code, context), m_value(0) { + //if (m_baseMp.find(code) != m_baseMp.end()) { + // printf("%s is repeated...", code.c_str()); + //} + //else { + // m_baseMp.insert(make_pair(code, this)); + //} + } + ~IntData() {} + + void SetValue(int i) { m_value = i; } + //void GetValue(DATATYPE& dataType,int& i) { dataType = iINT; i = m_value; } + DATATYPE GetDataTypeI() { return iINT; } + int GetValue() { return m_value; } + virtual std::string GetValueStr() { return to_string(m_value); } +private: + int m_value; +}; + + +class ShortData : public BaseData { +public: + ShortData(const std::string& code, const std::string& context/*, short val*/) + : BaseData(code, context), m_value(0) { + //if (m_baseMp.find(code) != m_baseMp.end()) { + // printf("%s is repeated...", code.c_str()); + //} + //else { + // m_baseMp.insert(make_pair(code, this)); + //} + } + ~ShortData() {} + + void SetValue(short s) { m_value = s; } + //void GetValue(DATATYPE& dataType, short& s) { dataType = iSHORT; s = m_value; } + DATATYPE GetDataType() { return iSHORT; } + short GetValue() { return m_value; } + virtual std::string GetValueStr() { return to_string(m_value); } +private: + short m_value; +}; + +class UShortData : public BaseData { +public: + UShortData(const std::string& code, const std::string& context/*, unsigned short val*/) + : BaseData(code, context), m_value(0) { + //if (m_baseMp.find(code) != m_baseMp.end()) { + // printf("%s is repeated...", code.c_str()); + //} + //else { + // m_baseMp.insert(make_pair(code, this)); + //} + } + ~UShortData() {} + + void SetValue(unsigned short us) { m_value = us; } + //void GetValue(DATATYPE& dataType, unsigned short& us) { dataType = iUSHORT; us = m_value; } + DATATYPE GetDataType() { return iUSHORT; } + unsigned short GetValue() { return m_value; } + virtual std::string GetValueStr() { return to_string(m_value); } +private: + unsigned short m_value; +}; + + +class BoolData : public BaseData { +public: + BoolData(const std::string& code, const std::string& context/*, bool val*/) + : BaseData(code, context), m_value(0) { + //if (m_baseMp.find(code) != m_baseMp.end()) { + // printf("%s is repeated...", code.c_str()); + //} + //else { + // m_baseMp.insert(make_pair(code, this)); + //} + } + ~BoolData() {} + + void SetValue(bool b) { m_value = b; } + //string GetValueStr() { return to_string(m_value); } + DATATYPE GetDataType() { return iBOOL; } + bool GetValue() { return m_value; } + virtual std::string GetValueStr() { return to_string(m_value); } +private: + bool m_value; +}; + + +class UcharData : public BaseData { +public: + UcharData(const std::string& code, const std::string& context/*, bool val*/) + : BaseData(code, context), m_value(0) { + //if (m_baseMp.find(code) != m_baseMp.end()) { + // printf("%s is repeated...", code.c_str()); + //} + //else { + // m_baseMp.insert(make_pair(code, this)); + //} + } + ~UcharData() {} + + void SetValue(UCHAR uc) { m_value = uc; } + //void GetValue(DATATYPE& dataType, UCHAR& uc) { dataType = iUCHAR; uc = m_value; } + DATATYPE GetDataType() { return iUCHAR; } + UCHAR GetValue() { return m_value; } + virtual std::string GetValueStr() { return to_string(m_value); } +private: + UCHAR m_value; +}; \ No newline at end of file diff --git a/PrintS/Communication/ChillerClient.cpp b/PrintS/Communication/ChillerClient.cpp index fe069c9..8c808f0 100644 --- a/PrintS/Communication/ChillerClient.cpp +++ b/PrintS/Communication/ChillerClient.cpp @@ -8,8 +8,22 @@ ChillerClient::ChillerClient(CommunicationCfg* pconfig,int* tp) :TcpClient(pconf { 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() { @@ -112,15 +126,15 @@ void ChillerClient::ProcDoluyoInfo(void* pobject, Command* pcommand) //pDlc->m_ValueMutex.lock(); EnterCriticalSection(&pDlc->m_ValueCS); - pDlc->m_DoluyoChillerStat.tempRealtimeValue = (float)watertempValue / 10.0f; - pDlc->m_DoluyoChillerStat.runInfo = runinfo; + pDlc->m_DoluyoChillerStat.m_tempRealtimeValue->SetValue((float)watertempValue / 10.0f); + pDlc->m_DoluyoChillerStat.m_runInfo->SetValue(runinfo); switch (runs) { - case 0:pDlc->m_DoluyoChillerStat.isRun = false; break; - case 1:pDlc->m_DoluyoChillerStat.isRun = true; break; - case 2:pDlc->m_DoluyoChillerStat.isRun = false; break; + 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.alarmInfo = alarminfo; - pDlc->m_DoluyoChillerStat.isLevelAlarm= ((levelalarm == 0) ? false : true); + 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); } @@ -135,7 +149,7 @@ void ChillerClient::ProcDoluyoReadTargeValue(void* pobject, Command* pcommand) //unsigned char* rseq = pcommand->m_RespSeq; short tempValue = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)); EnterCriticalSection(&pDlc->m_ValueCS); - pDlc->m_DoluyoChillerStat.tempSettingValue = (float)tempValue / 10.0f; + pDlc->m_DoluyoChillerStat.m_tempSettingValue->SetValue((float)tempValue / 10.0f); LeaveCriticalSection(&pDlc->m_ValueCS); } @@ -152,110 +166,110 @@ void ChillerClient::ProcDoluyoSettingValue(void* pobject, Command* pcommand) } -void ChillerClient::GetDoluyoStat(DoluyoChillerstat& stat1) -{ - EnterCriticalSection(&m_ValueCS); - stat1.baseStat = m_BaseStat; - stat1.alarmInfo = m_DoluyoChillerStat.alarmInfo; - stat1.isRun = m_DoluyoChillerStat.isRun; - stat1.runInfo = m_DoluyoChillerStat.runInfo; - stat1.tempRealtimeValue = m_DoluyoChillerStat.tempRealtimeValue; - stat1.tempSettingValue = m_DoluyoChillerStat.tempSettingValue; - stat1.isLevelAlarm = m_DoluyoChillerStat.isLevelAlarm; - LeaveCriticalSection(&m_ValueCS); -} +//void ChillerClient::GetDoluyoStat(DoluyoChillerstat& stat1) +//{ +// EnterCriticalSection(&m_ValueCS); +// stat1.baseStat = m_BaseStat; +// stat1.alarmInfo = m_DoluyoChillerStat.alarmInfo; +// stat1.isRun = m_DoluyoChillerStat.isRun; +// stat1.runInfo = m_DoluyoChillerStat.runInfo; +// stat1.tempRealtimeValue = m_DoluyoChillerStat.tempRealtimeValue; +// stat1.tempSettingValue = m_DoluyoChillerStat.tempSettingValue; +// stat1.isLevelAlarm = m_DoluyoChillerStat.isLevelAlarm; +// 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; - stat.m_Flow = m_HansChillerstat.m_Flow; - stat.m_SettingTemp = m_HansChillerstat.m_SettingTemp; - stat.m_RunIndicate = m_HansChillerstat.m_RunIndicate; - stat.m_WorkIndicate = m_HansChillerstat.m_WorkIndicate; - stat.m_CompressorIndicate = m_HansChillerstat.m_CompressorIndicate; - stat.m_WaterPumpIndicate = m_HansChillerstat.m_WaterPumpIndicate; - stat.m_HeaterIndicate = m_HansChillerstat.m_HeaterIndicate; - stat.m_FanIndicate = m_HansChillerstat.m_FanIndicate; - stat.m_SolenoidValveIndicate = m_HansChillerstat.m_SolenoidValveIndicate; - stat.m_LowTempErrorIndicate = m_HansChillerstat.m_LowTempErrorIndicate; - stat.m_TempUndulateIndicate = m_HansChillerstat.m_TempUndulateIndicate; - stat.m_HeaterExceptionIndicate = m_HansChillerstat.m_HeaterExceptionIndicate; - stat.m_IOSignalIndicate = m_HansChillerstat.m_IOSignalIndicate; - stat.m_IsAlarm = m_HansChillerstat.m_IsAlarm; - stat.m_FlowAlarm = m_HansChillerstat.m_FlowAlarm; - stat.m_TempAlarm = m_HansChillerstat.m_TempAlarm; - stat.m_PressureAlarm = m_HansChillerstat.m_PressureAlarm; - stat.m_WaterLevelAlarm = m_HansChillerstat.m_WaterLevelAlarm; - stat.m_TempSensorAlarm = m_HansChillerstat.m_TempSensorAlarm; - stat.m_SolenoidValveAlarm = m_HansChillerstat.m_SolenoidValveAlarm; - stat.m_PhaseSeqAlarm = m_HansChillerstat.m_PhaseSeqAlarm; - stat.m_CompressorStartFreqAlarm = m_HansChillerstat.m_CompressorStartFreqAlarm; - stat.m_IO0Alarm = m_HansChillerstat.m_IO0Alarm; - stat.m_IO1Alarm = m_HansChillerstat.m_IO1Alarm; - stat.m_IO2Alarm = m_HansChillerstat.m_IO2Alarm; - stat.m_IO3Alarm = m_HansChillerstat.m_IO3Alarm; - stat.m_IO4Alarm = m_HansChillerstat.m_IO4Alarm; - 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; +// stat.m_Flow = m_HansChillerstat.m_Flow; +// stat.m_SettingTemp = m_HansChillerstat.m_SettingTemp; +// stat.m_RunIndicate = m_HansChillerstat.m_RunIndicate; +// stat.m_WorkIndicate = m_HansChillerstat.m_WorkIndicate; +// stat.m_CompressorIndicate = m_HansChillerstat.m_CompressorIndicate; +// stat.m_WaterPumpIndicate = m_HansChillerstat.m_WaterPumpIndicate; +// stat.m_HeaterIndicate = m_HansChillerstat.m_HeaterIndicate; +// stat.m_FanIndicate = m_HansChillerstat.m_FanIndicate; +// stat.m_SolenoidValveIndicate = m_HansChillerstat.m_SolenoidValveIndicate; +// stat.m_LowTempErrorIndicate = m_HansChillerstat.m_LowTempErrorIndicate; +// stat.m_TempUndulateIndicate = m_HansChillerstat.m_TempUndulateIndicate; +// stat.m_HeaterExceptionIndicate = m_HansChillerstat.m_HeaterExceptionIndicate; +// stat.m_IOSignalIndicate = m_HansChillerstat.m_IOSignalIndicate; +// stat.m_IsAlarm = m_HansChillerstat.m_IsAlarm; +// stat.m_FlowAlarm = m_HansChillerstat.m_FlowAlarm; +// stat.m_TempAlarm = m_HansChillerstat.m_TempAlarm; +// stat.m_PressureAlarm = m_HansChillerstat.m_PressureAlarm; +// stat.m_WaterLevelAlarm = m_HansChillerstat.m_WaterLevelAlarm; +// stat.m_TempSensorAlarm = m_HansChillerstat.m_TempSensorAlarm; +// stat.m_SolenoidValveAlarm = m_HansChillerstat.m_SolenoidValveAlarm; +// stat.m_PhaseSeqAlarm = m_HansChillerstat.m_PhaseSeqAlarm; +// stat.m_CompressorStartFreqAlarm = m_HansChillerstat.m_CompressorStartFreqAlarm; +// stat.m_IO0Alarm = m_HansChillerstat.m_IO0Alarm; +// stat.m_IO1Alarm = m_HansChillerstat.m_IO1Alarm; +// stat.m_IO2Alarm = m_HansChillerstat.m_IO2Alarm; +// stat.m_IO3Alarm = m_HansChillerstat.m_IO3Alarm; +// stat.m_IO4Alarm = m_HansChillerstat.m_IO4Alarm; +// LeaveCriticalSection(&m_ValueCS); +//} -void ChillerClient::GetTongFeiStat(TongFeiStat& stat) -{ - EnterCriticalSection(&m_ValueCS); - stat.m_BaseStat = m_BaseStat; - stat.m_IsLowVoltageAlarm = m_TongFeiStat.m_IsLowVoltageAlarm; - stat.m_IsHydraulicFailure = m_TongFeiStat.m_IsHydraulicFailure; - stat.m_IsLevelFailure = m_TongFeiStat.m_IsLevelFailure; - stat.m_IsLiquidPumpAlarm = m_TongFeiStat.m_IsLiquidPumpAlarm; - stat.m_IsPressAlarm = m_TongFeiStat.m_IsPressAlarm; - stat.m_IsElectricHeatingFailure = m_TongFeiStat.m_IsElectricHeatingFailure; - stat.m_IsAntifreezeAlarm = m_TongFeiStat.m_IsAntifreezeAlarm; - stat.m_IsLiquidTempTooHigh = m_TongFeiStat.m_IsLiquidTempTooHigh; - stat.m_IsLiquidTempProbeFailure = m_TongFeiStat.m_IsLiquidTempProbeFailure; - stat.m_IsEffluentTempProbeFailure = m_TongFeiStat.m_IsEffluentTempProbeFailure; - stat.m_IsAmbientTempProbeFailure = m_TongFeiStat.m_IsAmbientTempProbeFailure; - stat.m_IsCondensationTempProbeFailure = m_TongFeiStat.m_IsCondensationTempProbeFailure; - stat.m_IsEvaporationInletTempProbeFailure = m_TongFeiStat.m_IsEvaporationInletTempProbeFailure; - stat.m_IsEvaporationOutletTempProbeFailure = m_TongFeiStat.m_IsEvaporationOutletTempProbeFailure; - stat.m_IsCondensationTempTooHigh = m_TongFeiStat.m_IsCondensationTempTooHigh; - stat.m_IsPhaseOrderError = m_TongFeiStat.m_IsPhaseOrderError; - stat.m_IsPowerFailure = m_TongFeiStat.m_IsPowerFailure; - stat.m_IsCompressorFailure = m_TongFeiStat.m_IsCompressorFailure; - stat.m_IsAmbientTempTooHigh = m_TongFeiStat.m_IsAmbientTempTooHigh; - stat.m_IsAmbientTempException = m_TongFeiStat.m_IsAmbientTempException; - - stat.m_AlarmState = m_TongFeiStat.m_AlarmState; - stat.m_RoomTempSettingValue = m_TongFeiStat.m_RoomTempSettingValue; - stat.m_ConstantTempSettingValue = m_TongFeiStat.m_ConstantTempSettingValue; - stat.m_WorkMode = m_TongFeiStat.m_WorkMode; - stat.m_RefrigerationMethod = m_TongFeiStat.m_RefrigerationMethod; - stat.m_LiquidAlarmTemp = m_TongFeiStat.m_LiquidAlarmTemp; - stat.m_UnitStatus = m_TongFeiStat.m_UnitStatus; - - stat.m_LiquidTempProbe = m_TongFeiStat.m_LiquidTempProbe; - stat.m_EffluentTempProbe = m_TongFeiStat.m_EffluentTempProbe; - stat.m_AmbientTempProbe = m_TongFeiStat.m_AmbientTempProbe; - stat.m_CondensationTempProbe = m_TongFeiStat.m_CondensationTempProbe; - stat.m_EvaporationInletTempProbe = m_TongFeiStat.m_EvaporationInletTempProbe; - stat.m_EvaporationOutletTempProbe = m_TongFeiStat.m_EvaporationOutletTempProbe; - - stat.m_WorkingFrequency = m_TongFeiStat.m_WorkingFrequency; - stat.m_OverHeatingValue = m_TongFeiStat.m_OverHeatingValue; - stat.m_EEV1 = m_TongFeiStat.m_EEV1; - stat.m_EEV2 = m_TongFeiStat.m_EEV2; - stat.m_CondensingFanRatio = m_TongFeiStat.m_CondensingFanRatio; - stat.m_ElectricHeatingRatio = m_TongFeiStat.m_ElectricHeatingRatio; - stat.m_FlowRate = m_TongFeiStat.m_FlowRate; - LeaveCriticalSection(&m_ValueCS); -} +//void ChillerClient::GetTongFeiStat(TongFeiStat& stat) +//{ +// EnterCriticalSection(&m_ValueCS); +// stat.m_BaseStat = m_BaseStat; +// stat.m_IsLowVoltageAlarm = m_TongFeiStat.m_IsLowVoltageAlarm; +// stat.m_IsHydraulicFailure = m_TongFeiStat.m_IsHydraulicFailure; +// stat.m_IsLevelFailure = m_TongFeiStat.m_IsLevelFailure; +// stat.m_IsLiquidPumpAlarm = m_TongFeiStat.m_IsLiquidPumpAlarm; +// stat.m_IsPressAlarm = m_TongFeiStat.m_IsPressAlarm; +// stat.m_IsElectricHeatingFailure = m_TongFeiStat.m_IsElectricHeatingFailure; +// stat.m_IsAntifreezeAlarm = m_TongFeiStat.m_IsAntifreezeAlarm; +// stat.m_IsLiquidTempTooHigh = m_TongFeiStat.m_IsLiquidTempTooHigh; +// stat.m_IsLiquidTempProbeFailure = m_TongFeiStat.m_IsLiquidTempProbeFailure; +// stat.m_IsEffluentTempProbeFailure = m_TongFeiStat.m_IsEffluentTempProbeFailure; +// stat.m_IsAmbientTempProbeFailure = m_TongFeiStat.m_IsAmbientTempProbeFailure; +// stat.m_IsCondensationTempProbeFailure = m_TongFeiStat.m_IsCondensationTempProbeFailure; +// stat.m_IsEvaporationInletTempProbeFailure = m_TongFeiStat.m_IsEvaporationInletTempProbeFailure; +// stat.m_IsEvaporationOutletTempProbeFailure = m_TongFeiStat.m_IsEvaporationOutletTempProbeFailure; +// stat.m_IsCondensationTempTooHigh = m_TongFeiStat.m_IsCondensationTempTooHigh; +// stat.m_IsPhaseOrderError = m_TongFeiStat.m_IsPhaseOrderError; +// stat.m_IsPowerFailure = m_TongFeiStat.m_IsPowerFailure; +// stat.m_IsCompressorFailure = m_TongFeiStat.m_IsCompressorFailure; +// stat.m_IsAmbientTempTooHigh = m_TongFeiStat.m_IsAmbientTempTooHigh; +// stat.m_IsAmbientTempException = m_TongFeiStat.m_IsAmbientTempException; +// +// stat.m_AlarmState = m_TongFeiStat.m_AlarmState; +// stat.m_RoomTempSettingValue = m_TongFeiStat.m_RoomTempSettingValue; +// stat.m_ConstantTempSettingValue = m_TongFeiStat.m_ConstantTempSettingValue; +// stat.m_WorkMode = m_TongFeiStat.m_WorkMode; +// stat.m_RefrigerationMethod = m_TongFeiStat.m_RefrigerationMethod; +// stat.m_LiquidAlarmTemp = m_TongFeiStat.m_LiquidAlarmTemp; +// stat.m_UnitStatus = m_TongFeiStat.m_UnitStatus; +// +// stat.m_LiquidTempProbe = m_TongFeiStat.m_LiquidTempProbe; +// stat.m_EffluentTempProbe = m_TongFeiStat.m_EffluentTempProbe; +// stat.m_AmbientTempProbe = m_TongFeiStat.m_AmbientTempProbe; +// stat.m_CondensationTempProbe = m_TongFeiStat.m_CondensationTempProbe; +// stat.m_EvaporationInletTempProbe = m_TongFeiStat.m_EvaporationInletTempProbe; +// stat.m_EvaporationOutletTempProbe = m_TongFeiStat.m_EvaporationOutletTempProbe; +// +// stat.m_WorkingFrequency = m_TongFeiStat.m_WorkingFrequency; +// stat.m_OverHeatingValue = m_TongFeiStat.m_OverHeatingValue; +// stat.m_EEV1 = m_TongFeiStat.m_EEV1; +// stat.m_EEV2 = m_TongFeiStat.m_EEV2; +// stat.m_CondensingFanRatio = m_TongFeiStat.m_CondensingFanRatio; +// stat.m_ElectricHeatingRatio = m_TongFeiStat.m_ElectricHeatingRatio; +// stat.m_FlowRate = m_TongFeiStat.m_FlowRate; +// LeaveCriticalSection(&m_ValueCS); +//} void ChillerClient::ProcHansInfo(void* pobject, Command* pcommand) { @@ -271,35 +285,35 @@ void ChillerClient::ProcHansInfo(void* pobject, Command* pcommand) float settingTemp = (float)(((rseq[33] & 0xff) << 8) + (rseq[34] & 0xff)) / 10.0f; EnterCriticalSection(&pDlc->m_ValueCS); - pDlc->m_HansChillerstat.m_WaterOutTemp = waterOutTemp; - pDlc->m_HansChillerstat.m_Flow = flow; - pDlc->m_HansChillerstat.m_SettingTemp = settingTemp; - pDlc->m_HansChillerstat.m_RunIndicate = (state1 & 0x01) ? true : false; //运行指示 - pDlc->m_HansChillerstat.m_WorkIndicate = (state1 & 0x02) ? true : false; //工作正常指示 - pDlc->m_HansChillerstat.m_IsAlarm = (state1 & 0x04) ? true : false; //报警 - pDlc->m_HansChillerstat.m_CompressorIndicate = (state1 & 0x08) ? true : false; //压缩机指示 - pDlc->m_HansChillerstat.m_WaterPumpIndicate = (state1 & 0x10) ? true : false; //水泵指示 - pDlc->m_HansChillerstat.m_HeaterIndicate = (state1 & 0x20) ? true : false; //加热器指示 - pDlc->m_HansChillerstat.m_FanIndicate = (state1 & 0x40) ? true : false; //风机指示 - pDlc->m_HansChillerstat.m_SolenoidValveIndicate = (state1 & 0x80) ? true : false; //电磁阀指示 - pDlc->m_HansChillerstat.m_FlowAlarm = (state1 & 0x100) ? true : false; //流量报警 - pDlc->m_HansChillerstat.m_TempAlarm = (state1 & 0x200) ? true : false; //温度报警 - pDlc->m_HansChillerstat.m_PressureAlarm = (state1 & 0x400) ? true : false; //压力报警 - pDlc->m_HansChillerstat.m_WaterLevelAlarm = (state1 & 0x800) ? true : false; //液位报警 - pDlc->m_HansChillerstat.m_LowTempErrorIndicate = (state1 & 0x1000) ? true : false; //低温错误指示 - pDlc->m_HansChillerstat.m_TempUndulateIndicate = (state1 & 0x2000) ? true : false; //温度波动指示 + 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 = (state2 & 0x01) ? true : false; //温度传感器故障报警 - pDlc->m_HansChillerstat.m_SolenoidValveAlarm = (state2 & 0x02) ? true : false; //电磁阀故障报警 - pDlc->m_HansChillerstat.m_HeaterExceptionIndicate = (state2 & 0x04) ? true : false; //加热器异常指示 - pDlc->m_HansChillerstat.m_IOSignalIndicate = (state2 & 0x08) ? true : false; //IO信号指示 - pDlc->m_HansChillerstat.m_PhaseSeqAlarm = (state2 & 0x10) ? true : false; //相序报警 - pDlc->m_HansChillerstat.m_CompressorStartFreqAlarm = (state2 & 0x20) ? true : false; //压缩机起动频繁报警 - pDlc->m_HansChillerstat.m_IO0Alarm = (state2 & 0x100) ? true : false; //IO0错误报警 - pDlc->m_HansChillerstat.m_IO1Alarm = (state2 & 0x200) ? true : false; //IO0错误报警 - pDlc->m_HansChillerstat.m_IO2Alarm = (state2 & 0x400) ? true : false; //IO0错误报警 - pDlc->m_HansChillerstat.m_IO3Alarm = (state2 & 0x800) ? true : false; //IO0错误报警 - pDlc->m_HansChillerstat.m_IO4Alarm = (state2 & 0x1000) ? true : false; //IO0错误报警 + 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(); @@ -601,28 +615,28 @@ void ChillerClient::ProcTongfeiAlarmInputInfo(void* pobject, Command* pcommand) bitset<8> arr2(rseq[4]); bitset<8> arr3(rseq[5]); EnterCriticalSection(&cc->m_ValueCS); - cc->m_TongFeiStat.m_IsLowVoltageAlarm = arr1[0]; - cc->m_TongFeiStat.m_IsHydraulicFailure = arr1[1]; - cc->m_TongFeiStat.m_IsLevelFailure = arr1[2]; - cc->m_TongFeiStat.m_IsLiquidPumpAlarm = arr1[3]; - cc->m_TongFeiStat.m_IsPressAlarm = arr1[4]; - cc->m_TongFeiStat.m_IsElectricHeatingFailure = arr1[5]; - cc->m_TongFeiStat.m_IsAntifreezeAlarm = arr1[6]; - cc->m_TongFeiStat.m_IsLiquidTempTooHigh = arr1[7]; + 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 = arr2[0]; - cc->m_TongFeiStat.m_IsEffluentTempProbeFailure = arr2[1]; - cc->m_TongFeiStat.m_IsAmbientTempProbeFailure = arr2[2]; - cc->m_TongFeiStat.m_IsCondensationTempProbeFailure = arr2[3]; - cc->m_TongFeiStat.m_IsEvaporationInletTempProbeFailure = arr2[4]; - cc->m_TongFeiStat.m_IsEvaporationOutletTempProbeFailure = arr2[5]; - cc->m_TongFeiStat.m_IsCondensationTempTooHigh = arr2[6]; - cc->m_TongFeiStat.m_IsPhaseOrderError = arr2[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 = arr3[0]; - cc->m_TongFeiStat.m_IsCompressorFailure = arr3[1]; - cc->m_TongFeiStat.m_IsAmbientTempTooHigh = arr3[2]; - cc->m_TongFeiStat.m_IsAmbientTempException = arr3[3]; + 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); } @@ -634,7 +648,7 @@ void ChillerClient::ProcTongfeiAlarmStateInfo(void* pobject, Command* pcommand) short state1 = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff)); EnterCriticalSection(&cc->m_ValueCS); - cc->m_TongFeiStat.m_AlarmState = state1; + cc->m_TongFeiStat.m_AlarmState->SetValue(state1); LeaveCriticalSection(&cc->m_ValueCS); } @@ -651,11 +665,11 @@ void ChillerClient::ProcTongfeiUserParamsInfo(void* pobject, Command* pcommand) short liquidAlarmTemp = (((rseq[11] & 0xff) << 8) + (rseq[12] & 0xff)); EnterCriticalSection(&cc->m_ValueCS); - cc->m_TongFeiStat.m_RoomTempSettingValue = (float)roomTempSettingValue/10.0f; - cc->m_TongFeiStat.m_ConstantTempSettingValue = (float)constantTempSettingValue / 10.0f; - cc->m_TongFeiStat.m_WorkMode = workMode; - cc->m_TongFeiStat.m_RefrigerationMethod = refrigerationMethod; - cc->m_TongFeiStat.m_LiquidAlarmTemp = (float)liquidAlarmTemp / 10.0f; + 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) @@ -673,13 +687,13 @@ void ChillerClient::ProcTongfeiAnaShowInfo(void* pobject, Command* pcommand) short unitStatus = (((rseq[19] & 0xff) << 8) + (rseq[20] & 0xff)); EnterCriticalSection(&cc->m_ValueCS); - cc->m_TongFeiStat.m_LiquidTempProbe = (float)liquidTempProbe/10.0f; - cc->m_TongFeiStat.m_EffluentTempProbe = (float)effluentTempProbe / 10.0f; - cc->m_TongFeiStat.m_AmbientTempProbe = (float)ambientTempProbe / 10.0f; - cc->m_TongFeiStat.m_CondensationTempProbe = (float)condensationTempProbe / 10.0f; - cc->m_TongFeiStat.m_EvaporationInletTempProbe = (float)evaporationInletTempProbe / 10.0f; - cc->m_TongFeiStat.m_EvaporationOutletTempProbe = (float)evaporationOutletTempProbe / 10.0f; - cc->m_TongFeiStat.m_UnitStatus = unitStatus; + 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); } @@ -695,10 +709,10 @@ void ChillerClient::ProcTongfeiAnaShowInfo2(void* pobject, Command* pcommand) short EEV2 = (((rseq[9] & 0xff) << 8) + (rseq[10] & 0xff)); EnterCriticalSection(&cc->m_ValueCS); - cc->m_TongFeiStat.m_WorkingFrequency = (float)WorkingFrequency / 10.0f; - cc->m_TongFeiStat.m_OverHeatingValue = (float)OverHeatingValue / 10.0f; - cc->m_TongFeiStat.m_EEV1 = (float)EEV1/10.0f; - cc->m_TongFeiStat.m_EEV2 = (float)EEV2/10.0f; + 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); } @@ -713,8 +727,8 @@ void ChillerClient::ProcTongfeianaShowInfo3(void* pobject, Command* pcommand) short FlowRate = (((rseq[11] & 0xff) << 8) + (rseq[12] & 0xff)); EnterCriticalSection(&cc->m_ValueCS); - cc->m_TongFeiStat.m_CondensingFanRatio = (float)CondensingFanRatio / 10.0f; - cc->m_TongFeiStat.m_ElectricHeatingRatio = (float)ElectricHeatingRatio / 10.0f; - cc->m_TongFeiStat.m_FlowRate = (float)FlowRate/10.0f; + 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); } \ No newline at end of file diff --git a/PrintS/Communication/ChillerClient.h b/PrintS/Communication/ChillerClient.h index 6f79555..eddcccd 100644 --- a/PrintS/Communication/ChillerClient.h +++ b/PrintS/Communication/ChillerClient.h @@ -2,22 +2,30 @@ #include "BaseClient.h" #include "../config/ConfigManager.h" #include "../LanguageManager.h" +#include +#pragma pack(1) class DoluyoChillerstat { public: - explicit DoluyoChillerstat() { - tempRealtimeValue = 0; - runInfo = 0; - isRun = false; - alarmInfo = 0; - tempSettingValue = 0; - isLevelAlarm = false; + explicit DoluyoChillerstat() + : m_tempRealtimeValue(new FloatData("tempRealtimeValue",u8"水箱温度")) + , m_runInfo(new UShortData("runInfo",u8"水箱温度")) + , m_isRun(new BoolData("isRun","水箱温度")) + , m_alarmInfo(new UShortData("alarmInfo","水箱温度")) + , m_tempSettingValue(new FloatData("tempSettingValue","水箱温度")) + , m_isLevelAlarm(new BoolData("isLevelAlarm","水箱温度")){ + //tempRealtimeValue = 0; + //runInfo = 0; + //isRun = false; + //alarmInfo = 0; + //tempSettingValue = 0; + //isLevelAlarm = false; } string GetRunInfo() { string str = ""; - switch (runInfo) { + switch (m_runInfo->GetValue()) { case 0:str = _(u8"待机"); break; case 2:str = _(u8"关机过程"); break; case 4:str = _(u8"制冷运行"); break; @@ -29,7 +37,7 @@ public: string GetAlarmInfo() { string str = ""; - switch (alarmInfo) + switch (m_alarmInfo->GetValue()) { case 0:str = _(u8"无故障"); break; case 1:str = _(u8"提示故障"); break; @@ -40,19 +48,58 @@ public: public: BaseStat baseStat; - float tempRealtimeValue; //水箱温度 - unsigned short runInfo; //运行消息 0:待机 2:关机过程 4:制冷运行 5:制热运行 6:化霜运行 - unsigned char isRun; //开关机 - unsigned short alarmInfo; //故障消息 0:无故障 1:提示故障 2:停机故障 - float tempSettingValue; //设定温度 - bool isLevelAlarm; //液位报警 + + char m_startFlag; //成员变量开始标记 + //float tempRealtimeValue; //水箱温度 + FloatData* m_tempRealtimeValue; //水箱温度 + //unsigned short runInfo; //运行消息 0:待机 2:关机过程 4:制冷运行 5:制热运行 6:化霜运行 + UShortData* m_runInfo; //运行消息 0:待机 2:关机过程 4:制冷运行 5:制热运行 6:化霜运行 + //bool isRun; //开关机 + BoolData* m_isRun; //开关机 + //unsigned short alarmInfo; //故障消息 0:无故障 1:提示故障 2:停机故障 + UShortData* m_alarmInfo; //故障消息 0:无故障 1:提示故障 2:停机故障 + //float tempSettingValue; //设定温度 + FloatData* m_tempSettingValue; //设定温度 + //bool isLevelAlarm; //液位报警 + BoolData* m_isLevelAlarm; //液位报警 + char m_endFlag; //成员变量结束标记 }; class HansChillerstat //冷水机 { public: - HansChillerstat() { - m_WaterOutTemp=0.0f; + HansChillerstat() + : m_WaterOutTemp(new FloatData("WaterOutTemp", u8"出水温度")) + , m_Flow(new FloatData("Flow", u8"流量")) + , m_SettingTemp(new FloatData("SettingTemp", u8"设置温度")) + , m_RunIndicate(new BoolData("RunIndicate", u8"运行指示")) + , m_WorkIndicate(new BoolData("WorkIndicate", u8"工作正常指示")) + , m_IsAlarm(new BoolData("IsAlarm", u8"报警")) + , m_CompressorIndicate(new BoolData("CompressorIndicate", u8"压缩机指示")) + , m_WaterPumpIndicate(new BoolData("WaterPumpIndicate", u8"水泵指示")) + , m_HeaterIndicate(new BoolData("HeaterIndicate", u8"加热器指示")) + , m_FanIndicate(new BoolData("FanIndicate", u8"风机指示")) + , m_SolenoidValveIndicate(new BoolData("SolenoidValveIndicate", u8"电磁阀指示")) + , m_FlowAlarm(new BoolData("FlowAlarm", u8"流量报警")) + , m_TempAlarm(new BoolData("TempAlarm", u8"温度报警")) + , m_PressureAlarm(new BoolData("PressureAlarm", u8"压力报警")) + , m_WaterLevelAlarm(new BoolData("WaterLevelAlarm", u8"液位报警")) + , m_LowTempErrorIndicate(new BoolData("LowTempErrorIndicate", u8"低温错误指示")) + , m_TempUndulateIndicate(new BoolData("TempUndulateIndicate", u8"温度波动指示")) + , m_TempSensorAlarm(new BoolData("TempSensorAlarm", u8"温度传感器故障报警")) + , m_SolenoidValveAlarm(new BoolData("SolenoidValveAlarm", u8"电磁阀故障报警")) + , m_HeaterExceptionIndicate(new BoolData("HeaterExceptionIndicate", u8"加热器异常指示")) + , m_IOSignalIndicate(new BoolData("IOSignalIndicate", u8"IO信号指示")) + , m_PhaseSeqAlarm(new BoolData("PhaseSeqAlarm", u8"相序报警")) + , m_CompressorStartFreqAlarm(new BoolData("CompressorStartFreqAlarm", u8"压缩机起动频繁报警")) + , m_IO0Alarm(new BoolData("IO0Alarm", u8"IO0错误报警")) + , m_IO1Alarm(new BoolData("IO1Alarm", u8"IO1错误报警")) + , m_IO2Alarm(new BoolData("IO2Alarm", u8"IO2错误报警")) + , m_IO3Alarm(new BoolData("IO3Alarm", u8"IO3错误报警")) + , m_IO4Alarm(new BoolData("IO4Alarm", u8"IO4错误报警")) + + { + /* m_WaterOutTemp=0.0f; m_Flow=0.0f; m_SettingTemp=0.0f; @@ -81,92 +128,144 @@ public: m_IO1Alarm = false; m_IO2Alarm = false; m_IO3Alarm = false; - m_IO4Alarm = false; + m_IO4Alarm = false;*/ } ~HansChillerstat(){} public: BaseStat baseStat; - float m_WaterOutTemp; //出水温度 - float m_Flow; //流量 - float m_SettingTemp; //设置温度 + char m_startFlag; //成员变量开始标记 - bool m_RunIndicate; //运行指示 - bool m_WorkIndicate; //工作正常指示 - bool m_IsAlarm; //报警 - bool m_CompressorIndicate; //压缩机指示 - bool m_WaterPumpIndicate; //水泵指示 - bool m_HeaterIndicate; //加热器指示 - bool m_FanIndicate; //风机指示 - bool m_SolenoidValveIndicate; //电磁阀指示 - bool m_FlowAlarm; //流量报警 - bool m_TempAlarm; //温度报警 - bool m_PressureAlarm; //压力报警 - bool m_WaterLevelAlarm; //液位报警 - bool m_LowTempErrorIndicate; //低温错误指示 - bool m_TempUndulateIndicate; //温度波动指示 + FloatData* m_WaterOutTemp; //出水温度 + FloatData* m_Flow; //流量 + FloatData* m_SettingTemp; //设置温度 + + BoolData* m_RunIndicate; //运行指示 + BoolData* m_WorkIndicate; //工作正常指示 + BoolData* m_IsAlarm; //报警 + BoolData* m_CompressorIndicate; //压缩机指示 + BoolData* m_WaterPumpIndicate; //水泵指示 + BoolData* m_HeaterIndicate; //加热器指示 - bool m_TempSensorAlarm; //温度传感器故障报警 - bool m_SolenoidValveAlarm; //电磁阀故障报警 - bool m_HeaterExceptionIndicate; //加热器异常指示 - bool m_IOSignalIndicate; //IO信号指示 - bool m_PhaseSeqAlarm; //相序报警 - bool m_CompressorStartFreqAlarm; //压缩机起动频繁报警 - bool m_IO0Alarm; //IO0错误报警 - bool m_IO1Alarm; //IO1错误报警 - bool m_IO2Alarm; //IO2错误报警 - bool m_IO3Alarm; //IO3错误报警 - bool m_IO4Alarm; //IO4错误报警 + BoolData* m_FanIndicate; //风机指示 + BoolData* m_SolenoidValveIndicate; //电磁阀指示 + BoolData* m_FlowAlarm; //流量报警 + BoolData* m_TempAlarm; //温度报警 + BoolData* m_PressureAlarm; //压力报警 + BoolData* m_WaterLevelAlarm; //液位报警 + BoolData* m_LowTempErrorIndicate; //低温错误指示 + BoolData* m_TempUndulateIndicate; //温度波动指示 + + BoolData* m_TempSensorAlarm; //温度传感器故障报警 + BoolData* m_SolenoidValveAlarm; //电磁阀故障报警 + BoolData* m_HeaterExceptionIndicate; //加热器异常指示 + BoolData* m_IOSignalIndicate; //IO信号指示 + BoolData* m_PhaseSeqAlarm; //相序报警 + BoolData* m_CompressorStartFreqAlarm; //压缩机起动频繁报警 + BoolData* m_IO0Alarm; //IO0错误报警 + BoolData* m_IO1Alarm; //IO1错误报警 + BoolData* m_IO2Alarm; //IO2错误报警 + BoolData* m_IO3Alarm; //IO3错误报警 + BoolData* m_IO4Alarm; //IO4错误报警 + + char m_endFlag; //成员变量结束标记 }; class TongFeiStat { public: + TongFeiStat() + : m_IsLowVoltageAlarm(new BoolData("IsLowVoltageAlarm", u8"低压报警")) + , m_IsHydraulicFailure(new BoolData("IsHydraulicFailure", u8"液路故障")) + , m_IsLevelFailure(new BoolData("IsLevelFailure", u8"液位故障")) + , m_IsLiquidPumpAlarm(new BoolData("IsLiquidPumpAlarm", u8"液泵热继电器报警")) + , m_IsPressAlarm(new BoolData("IsPressAlarm", u8"压机热继电器报警")) + , m_IsElectricHeatingFailure(new BoolData("IsElectricHeatingFailure", u8"电加热故障")) + , m_IsAntifreezeAlarm(new BoolData("IsAntifreezeAlarm", u8"防冻报警")) + , m_IsLiquidTempTooHigh(new BoolData("IsLiquidTempTooHigh", u8"液温太高")) + , m_IsLiquidTempProbeFailure(new BoolData("IsLiquidTempProbeFailure", u8"液温温度探头故障")) + , m_IsEffluentTempProbeFailure(new BoolData("IsEffluentTempProbeFailure", u8"出液温度探头故障")) + , m_IsAmbientTempProbeFailure(new BoolData("IsAmbientTempProbeFailure", u8"环境温度探头故障")) + , m_IsCondensationTempProbeFailure(new BoolData("IsCondensationTempProbeFailure", u8"冷凝温度探头故障")) + , m_IsEvaporationInletTempProbeFailure(new BoolData("IsEvaporationInletTempProbeFailure", u8"蒸发进口温度探头故障")) + , m_IsEvaporationOutletTempProbeFailure(new BoolData("IsEvaporationOutletTempProbeFailure", u8"蒸发出口温度探头故障")) + , m_IsCondensationTempTooHigh(new BoolData("IsCondensationTempTooHigh", u8"冷凝温度过高")) + , m_IsPhaseOrderError(new BoolData("IsPhaseOrderError", u8"相序错误")) + , m_IsPowerFailure(new BoolData("IsPowerFailure", u8"电源故障")) + , m_IsCompressorFailure(new BoolData("IsCompressorFailure", u8"压缩机故障")) + , m_IsAmbientTempTooHigh(new BoolData("IsAmbientTempTooHigh", u8"环境温度太高")) + , m_IsAmbientTempException(new BoolData("IsAmbientTempException", u8"环境温度异常")) + , m_AlarmState(new IntData("AlarmState", u8"故障状态")) + , m_RoomTempSettingValue(new FloatData("RoomTempSettingValue", u8"室温同调预设温度")) + , m_ConstantTempSettingValue(new FloatData("ConstantTempSettingValue", u8"恒温预设温度")) + , m_WorkMode(new IntData("WorkMode", u8"工作模式")) + , m_RefrigerationMethod(new IntData("RefrigerationMethod", u8"制冷方式")) + , m_LiquidAlarmTemp(new FloatData("LiquidAlarmTemp", u8"出液报警温度")) + , m_UnitStatus(new IntData("UnitStatus", u8"机组状态")) + , m_LiquidTempProbe(new FloatData("LiquidTempProbe", u8"液温温度探头")) + , m_EffluentTempProbe(new FloatData("EffluentTempProbe", u8"出液温度探头")) + , m_AmbientTempProbe(new FloatData("AmbientTempProbe", u8"环境温度探头")) + , m_CondensationTempProbe(new FloatData("CondensationTempProbe", u8"冷凝温度探头")) + , m_EvaporationInletTempProbe(new FloatData("EvaporationInletTempProbe", u8"蒸发进口温度探头")) + , m_EvaporationOutletTempProbe(new FloatData("EvaporationOutletTempProbe", u8"蒸发出口温度探头")) + , m_WorkingFrequency(new FloatData("WorkingFrequency", u8"运行频率")) + , m_OverHeatingValue(new FloatData("OverHeatingValue", u8"过热度")) + , m_EEV1(new FloatData("EEV1", u8"蒸发出口温度探头")) + , m_EEV2(new FloatData("EEV2", u8"蒸发出口温度探头")) + , m_CondensingFanRatio(new FloatData("CondensingFanRatio", u8"冷凝风机比例")) + , m_ElectricHeatingRatio(new FloatData("ElectricHeatingRatio", u8"电加热比例")) + , m_FlowRate(new FloatData("FlowRate", u8"流量")) + { + + } + BaseStat m_BaseStat; - bool m_IsLowVoltageAlarm; //低压报警 - bool m_IsHydraulicFailure; //液路故障 - bool m_IsLevelFailure; //液位故障 - bool m_IsLiquidPumpAlarm; //液泵热继电器报警 - bool m_IsPressAlarm; //压机热继电器报警 - bool m_IsElectricHeatingFailure; //电加热故障 - bool m_IsAntifreezeAlarm; //防冻报警 - bool m_IsLiquidTempTooHigh; //液温太高 - bool m_IsLiquidTempProbeFailure; //液温温度探头故障 - bool m_IsEffluentTempProbeFailure; //出液温度探头故障 - bool m_IsAmbientTempProbeFailure; //环境温度探头故障 - bool m_IsCondensationTempProbeFailure; //冷凝温度探头故障 - bool m_IsEvaporationInletTempProbeFailure; //蒸发进口温度探头故障 - bool m_IsEvaporationOutletTempProbeFailure; //蒸发出口温度探头故障 - bool m_IsCondensationTempTooHigh; //冷凝温度过高 - bool m_IsPhaseOrderError; //相序错误 - bool m_IsPowerFailure; //电源故障 - bool m_IsCompressorFailure; //压缩机故障 - bool m_IsAmbientTempTooHigh; //环境温度太高 - bool m_IsAmbientTempException; //环境温度异常 + char m_startFlag; //成员变量开始标记 + BoolData* m_IsLowVoltageAlarm; //低压报警 + BoolData* m_IsHydraulicFailure; //液路故障 + BoolData* m_IsLevelFailure; //液位故障 + BoolData* m_IsLiquidPumpAlarm; //液泵热继电器报警 + BoolData* m_IsPressAlarm; //压机热继电器报警 + BoolData* m_IsElectricHeatingFailure; //电加热故障 + BoolData* m_IsAntifreezeAlarm; //防冻报警 + BoolData* m_IsLiquidTempTooHigh; //液温太高 + BoolData* m_IsLiquidTempProbeFailure; //液温温度探头故障 + BoolData* m_IsEffluentTempProbeFailure; //出液温度探头故障 + BoolData* m_IsAmbientTempProbeFailure; //环境温度探头故障 + BoolData* m_IsCondensationTempProbeFailure; //冷凝温度探头故障 + BoolData* m_IsEvaporationInletTempProbeFailure; //蒸发进口温度探头故障 + BoolData* m_IsEvaporationOutletTempProbeFailure; //蒸发出口温度探头故障 + BoolData* m_IsCondensationTempTooHigh; //冷凝温度过高 + BoolData* m_IsPhaseOrderError; //相序错误 + BoolData* m_IsPowerFailure; //电源故障 + BoolData* m_IsCompressorFailure; //压缩机故障 + BoolData* m_IsAmbientTempTooHigh; //环境温度太高 + BoolData* m_IsAmbientTempException; //环境温度异常 + IntData* m_AlarmState; //故障状态 + FloatData* m_RoomTempSettingValue; //室温同调预设温度 + FloatData* m_ConstantTempSettingValue; //恒温预设温度 + IntData* m_WorkMode; //工作模式 + IntData* m_RefrigerationMethod; //制冷方式 + FloatData* m_LiquidAlarmTemp; //出液报警温度 + IntData* m_UnitStatus; //机组状态 + FloatData* m_LiquidTempProbe; //液温温度探头 + FloatData* m_EffluentTempProbe; //出液温度探头 + FloatData* m_AmbientTempProbe; //环境温度探头 + FloatData* m_CondensationTempProbe; //冷凝温度探头 + FloatData* m_EvaporationInletTempProbe; //蒸发进口温度探头 + FloatData* m_EvaporationOutletTempProbe; //蒸发出口温度探头 + FloatData* m_WorkingFrequency; //运行频率 + FloatData* m_OverHeatingValue; //过热度 + FloatData* m_EEV1; + FloatData* m_EEV2; + FloatData* m_CondensingFanRatio; //冷凝风机比例 + FloatData* m_ElectricHeatingRatio; //电加热比例 + FloatData* m_FlowRate; //流量 - int m_AlarmState; //故障状态 - float m_RoomTempSettingValue; //室温同调预设温度 - float m_ConstantTempSettingValue; //恒温预设温度 - int m_WorkMode; //工作模式 - int m_RefrigerationMethod; //制冷方式 - float m_LiquidAlarmTemp; //出液报警温度 - int m_UnitStatus; //机组状态 - - float m_LiquidTempProbe; //液温温度探头 - float m_EffluentTempProbe; //出液温度探头 - float m_AmbientTempProbe; //环境温度探头 - float m_CondensationTempProbe; //冷凝温度探头 - float m_EvaporationInletTempProbe; //蒸发进口温度探头 - float m_EvaporationOutletTempProbe; //蒸发出口温度探头 - float m_WorkingFrequency; //运行频率 - float m_OverHeatingValue; //过热度 - float m_EEV1; - float m_EEV2; - float m_CondensingFanRatio; //冷凝风机比例 - float m_ElectricHeatingRatio; //电加热比例 - float m_FlowRate; //流量 + char m_endFlag; //成员变量开始标记 }; +#pragma pack() class ChillerClient:public TcpClient { diff --git a/PrintS/Communication/IPGLaserClient.h b/PrintS/Communication/IPGLaserClient.h index 0dedb61..7851694 100644 --- a/PrintS/Communication/IPGLaserClient.h +++ b/PrintS/Communication/IPGLaserClient.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "BaseClient.h" #include "../config/bean/AlarmCfg.h" class IPGLaserState { @@ -38,39 +38,40 @@ public: } public: - float currentSetpoint; //ܵ - float laserTemperature; //ڲʵ¶ - string outputPower; //W - int moduleErrorCode; //ģ - bool isOverheat; //¶ȹ - bool isEmissionOn; //ʹ - bool isHighBackReflectionLevel; //߷ - bool isExtCtrlEnable; //ⲿģʽ - bool isModuleDisconnected; //ģʧ - bool isModuleAlarm; //ģ - bool isAimingBeamON; //⿪ - //bool isPulseTooShort; //̫С - //bool isPulseMode; //ģʽ - bool isPowerSupplyOff; //ģԴر - bool isModulationEnabled; //ģʽ - bool isEmission; //ⷢ -// bool isGateModeEnabled; //Gateģʽ -// bool isHighPulseEnergy; //̫ - bool isExtEmissionCtrlEnabled; //ⲿEmissionƿ - bool isPowerSupplyFailure; //ģԴ - //bool isLockFrontPanel; //ǰʾ - //bool isKeyswitchInREMPosition; //Կ׿REMλ - //bool isWaveformPulseModeEnabled;//ģʽ - //bool isHighDutyCycle; //̫ - bool isLowTemperature; //¶ȹ - bool isPowerSupplyVotageAlarm; //ģԴѹΧ - bool isLeakageCurrentTooHigh; //© - bool isExtRedLightCtrlEnabled; //ⲿƿ - bool isCritialError; //ؼ - bool isOpticalInterlockActive; //ѧ·ȫ· - //bool isAveragePowerTooHigh; //ƽ̫ + float currentSetpoint; //激光二极管电流设置 + float laserTemperature; //内部实际温度 + string outputPower; //输出功率W + int moduleErrorCode; //模块错误代码 + bool isOverheat; //温度过热 + bool isEmissionOn; //使能 + bool isHighBackReflectionLevel; //高反报警 + bool isExtCtrlEnable; //外部控制模式 + bool isModuleDisconnected; //激光模块失连 + bool isModuleAlarm; //激光模块故障 + bool isAimingBeamON; //红光开 + //bool isPulseTooShort; //脉冲宽度太小 + //bool isPulseMode; //脉冲模式 + bool isPowerSupplyOff; //模块主电源关闭 + bool isModulationEnabled; //调制模式开启 + bool isEmission; //激光发射 +// bool isGateModeEnabled; //Gate模式开启 +// bool isHighPulseEnergy; //脉冲能量太大 + bool isExtEmissionCtrlEnabled; //外部Emission控制开启 + bool isPowerSupplyFailure; //模块主电源故障 + //bool isLockFrontPanel; //前显示面板锁定 + //bool isKeyswitchInREMPosition; //钥匙开关REM位置 + //bool isWaveformPulseModeEnabled;//波形脉冲模式开启 + //bool isHighDutyCycle; //脉冲周期太长 + bool isLowTemperature; //温度过低 + bool isPowerSupplyVotageAlarm; //模块主电源电压超范围 + bool isLeakageCurrentTooHigh; //漏电流过大 + bool isExtRedLightCtrlEnabled; //外部红光控制开启 + bool isCritialError; //关键错误 + bool isOpticalInterlockActive; //光学回路安全互锁开路 + //bool isAveragePowerTooHigh; //平均功率太高 }; + class IPGLaserClient:public TcpClient { public: @@ -121,29 +122,30 @@ public: } public: - float currentSetpoint; //ܵ - float laserTemperature; //ڲʵ¶ - string outputPower; //W - int moduleErrorCode; //ģ - bool isCommandBufferOverload; //ָ - bool isOverheat; //¶ȹ - bool isEmissionOn; //ʹ - bool isHighBackReflectionLevel; //߷ - bool isAnalogPowerControlEnable; // - bool isAimingBeamON; //⿪ - bool isPowerSupplyOff; //ģԴر - bool isModulationEnabled; //ģʽ - bool isEmission; //ⷢ - bool isGateModeEnable; //ģʽ - bool isHardwareEmissionCtrlEnabled; //Ӳط俪 - bool isPowerSupplyFailure; //ģԴ - bool isLowTemperature; //¶ȹ - bool isPowerSupplyAlarm; //籨 - bool isHardwareAimingBeanControlEnable; //Ӳغ⿪ - bool isCritialError; //ؼ - bool isFiberInterlockActive; //·ڲ + float currentSetpoint; //激光二极管电流设置 + float laserTemperature; //内部实际温度 + string outputPower; //输出功率W + int moduleErrorCode; //模块错误代码 + bool isCommandBufferOverload; //指令溢出 + bool isOverheat; //温度过热 + bool isEmissionOn; //使能 + bool isHighBackReflectionLevel; //高反报警 + bool isAnalogPowerControlEnable; //功率外控 + bool isAimingBeamON; //红光开 + bool isPowerSupplyOff; //模块主电源关闭 + bool isModulationEnabled; //调制模式开启 + bool isEmission; //激光发射 + bool isGateModeEnable; //门模式开启 + bool isHardwareEmissionCtrlEnabled; //硬控发射开启 + bool isPowerSupplyFailure; //模块主电源故障 + bool isLowTemperature; //温度过低 + bool isPowerSupplyAlarm; //供电报警 + bool isHardwareAimingBeanControlEnable; //硬控红光开启 + bool isCritialError; //关键错误 + bool isFiberInterlockActive; //光路内部锁定 }; + class IPGLaserClientV1 :public TcpClient { public: diff --git a/PrintS/Communication/TempCtrlClient.cpp b/PrintS/Communication/TempCtrlClient.cpp index 2148c50..f42f470 100644 --- a/PrintS/Communication/TempCtrlClient.cpp +++ b/PrintS/Communication/TempCtrlClient.cpp @@ -1,12 +1,19 @@ -#include "TempCtrlClient.h" +#include "TempCtrlClient.h" #include "Aibus.h" #include #include "../SystemInfo.h" -//#include "../config/ConfigManager.h" -//#include "../global.h" TempCtrlClient::TempCtrlClient(CommunicationCfg* pconfig):TcpClient(pconfig) { + size_t ptrSize = sizeof(nullptr); //指针大小 + + void* startPtr = &m_Stat.m_startFlag + 1; + size_t count = ((size_t)&m_Stat.m_endFlag - (size_t)&startPtr) / ptrSize; + InsertMp(startPtr, count); + + startPtr = &m_Stat.alarm.m_startFlag + 1; + count = ((size_t)&m_Stat.alarm.m_endFlag - (size_t)&startPtr) / ptrSize; + InsertMp(startPtr, count); } @@ -28,7 +35,7 @@ void TempCtrlClient::InitCommand() void TempCtrlClient::SetTargeValue(float value) { EnterCriticalSection(&m_RtcCS); - float targevalue = value*m_Stat.scale; + float targevalue = value*m_Stat.scale->GetValue(); Command* pCommand = new Aibus(SET_TARGE_VALUE, 0x1, 0x0, (short)targevalue, false); pCommand->m_Fun = &TempCtrlClient::ProcSetTemp; pCommand->m_Ref = this; @@ -49,21 +56,21 @@ void TempCtrlClient::ProcTempInfo(void* pobject, Command* pcommand) scale *= 10; } EnterCriticalSection(&pTc->m_ValueCS); - pTc->m_Stat.scale = scale; - pTc->m_Stat.measuredValue = (float)((short)(rseq[1] << 8) + rseq[0]) / scale; - pTc->m_Stat.settingValue = (float)((short)(rseq[3] << 8) + rseq[2]) / scale; - pTc->m_Stat.outputValue = rseq[4]; + pTc->m_Stat.scale->SetValue( scale); + pTc->m_Stat.measuredValue->SetValue((float)((short)(rseq[1] << 8) + rseq[0]) / scale); + pTc->m_Stat.settingValue->SetValue((float)((short)(rseq[3] << 8) + rseq[2]) / scale); + pTc->m_Stat.outputValue->SetValue(rseq[4]); bitset<8> bitStatus(rseq[5]); - pTc->m_Stat.alarm.isOverLimit = bitStatus[0]; - pTc->m_Stat.alarm.isLowerLimit = bitStatus[1]; - pTc->m_Stat.alarm.isActiveAlarm = bitStatus[2]; - pTc->m_Stat.alarm.isInactiveAlarm = bitStatus[3]; - pTc->m_Stat.alarm.isInputLimit = bitStatus[4]; - pTc->m_Stat.alarm.al1 = bitStatus[5]; - pTc->m_Stat.alarm.al2 = bitStatus[6]; + pTc->m_Stat.alarm.isOverLimit->SetValue(bitStatus[0]); + pTc->m_Stat.alarm.isLowerLimit->SetValue(bitStatus[1]); + pTc->m_Stat.alarm.isActiveAlarm->SetValue(bitStatus[2]); + pTc->m_Stat.alarm.isInactiveAlarm->SetValue(bitStatus[3]); + pTc->m_Stat.alarm.isInputLimit->SetValue(bitStatus[4]); + pTc->m_Stat.alarm.al1->SetValue(bitStatus[5]); + pTc->m_Stat.alarm.al2->SetValue(bitStatus[6]); EnterCriticalSection(&g_SystemInfo->m_InfoCs); - g_SystemInfo->m_PlatformTemp = pTc->m_Stat.measuredValue; - g_SystemInfo->m_PlatformTempSettingValue = pTc->m_Stat.settingValue; + g_SystemInfo->m_PlatformTemp = pTc->m_Stat.measuredValue->GetValue(); + g_SystemInfo->m_PlatformTempSettingValue = pTc->m_Stat.settingValue->GetValue(); LeaveCriticalSection(&g_SystemInfo->m_InfoCs); LeaveCriticalSection(&pTc->m_ValueCS); @@ -77,32 +84,32 @@ void TempCtrlClient::ProcSetTemp(void* pobject, Command* pcommand) unsigned char* rseq = pcommand->m_RespSeq; float fvalue = 0; EnterCriticalSection(&pTc->m_ValueCS); - int scale = (pTc->m_Stat.scale == 0 ? 1 : pTc->m_Stat.scale); + int scale = (pTc->m_Stat.scale->GetValue() == 0 ? 1 : pTc->m_Stat.scale->GetValue()); fvalue = (float)((short)(rseq[7] << 8) + rseq[6]) / scale; - pTc->m_Stat.measuredValue = (float)((short)(rseq[1] << 8) + rseq[0]) / scale; - pTc->m_Stat.settingValue = (float)((short)(rseq[3] << 8) + rseq[2]) / scale; - pTc->m_Stat.outputValue = rseq[4]; + pTc->m_Stat.measuredValue->SetValue((float)((short)(rseq[1] << 8) + rseq[0]) / scale); + pTc->m_Stat.settingValue->SetValue((float)((short)(rseq[3] << 8) + rseq[2]) / scale); + pTc->m_Stat.outputValue->SetValue(rseq[4]); bitset<8> bitStatus(rseq[5]); - pTc->m_Stat.alarm.isOverLimit = bitStatus[0]; - pTc->m_Stat.alarm.isLowerLimit = bitStatus[1]; - pTc->m_Stat.alarm.isActiveAlarm = bitStatus[2]; - pTc->m_Stat.alarm.isInactiveAlarm = bitStatus[3]; - pTc->m_Stat.alarm.isInputLimit = bitStatus[4]; - pTc->m_Stat.alarm.al1 = bitStatus[5]; - pTc->m_Stat.alarm.al2 = bitStatus[6]; + pTc->m_Stat.alarm.isOverLimit->SetValue(bitStatus[0]); + pTc->m_Stat.alarm.isLowerLimit->SetValue(bitStatus[1]); + pTc->m_Stat.alarm.isActiveAlarm->SetValue(bitStatus[2]); + pTc->m_Stat.alarm.isInactiveAlarm->SetValue(bitStatus[3]); + pTc->m_Stat.alarm.isInputLimit->SetValue(bitStatus[4]); + pTc->m_Stat.alarm.al1->SetValue(bitStatus[5]); + pTc->m_Stat.alarm.al2->SetValue(bitStatus[6]); LeaveCriticalSection(&pTc->m_ValueCS); } -void TempCtrlClient::GetStat(TempStat& stat) -{ - EnterCriticalSection(&m_ValueCS); - memcpy_s(&stat.alarm, sizeof(TempAlarm), &m_Stat.alarm, sizeof(TempAlarm)); - stat.baseStat = m_BaseStat; - stat.measuredValue = m_Stat.measuredValue; - stat.outputValue = m_Stat.outputValue; - stat.scale = m_Stat.scale; - stat.settingValue = m_Stat.settingValue; - LeaveCriticalSection(&m_ValueCS); -} +//void TempCtrlClient::GetStat(TempStat& stat) +//{ +// EnterCriticalSection(&m_ValueCS); +// memcpy_s(&stat.alarm, sizeof(TempAlarm), &m_Stat.alarm, sizeof(TempAlarm)); +// stat.baseStat = m_BaseStat; +// stat.measuredValue = m_Stat.measuredValue; +// stat.outputValue = m_Stat.outputValue; +// stat.scale = m_Stat.scale; +// stat.settingValue = m_Stat.settingValue; +// LeaveCriticalSection(&m_ValueCS); +//} diff --git a/PrintS/Communication/TempCtrlClient.h b/PrintS/Communication/TempCtrlClient.h index 6d24d65..6528610 100644 --- a/PrintS/Communication/TempCtrlClient.h +++ b/PrintS/Communication/TempCtrlClient.h @@ -1,45 +1,65 @@ -#pragma once +#pragma once #include "BaseClient.h" +#pragma pack(1) struct TempAlarm { - bool isOverLimit; //ޱ - bool isLowerLimit; //ޱ - bool isActiveAlarm; //ƫ - bool isInactiveAlarm; //ƫ - bool isInputLimit; //̱ - bool al1; //AL1״̬0Ϊ - bool al2; //AL2״̬0Ϊ - TempAlarm() { - isOverLimit = false; - isLowerLimit = false; - isActiveAlarm = false; - isInactiveAlarm = false; - isInputLimit = false; - al1 = false; - al2 = false; + char m_startFlag; //开始标记 + BoolData* isOverLimit; //上限报警 + BoolData* isLowerLimit; //下限报警 + BoolData* isActiveAlarm; //正偏差报警 + BoolData* isInactiveAlarm; //负偏差报警 + BoolData* isInputLimit; //超量程报警 + BoolData* al1; //AL1状态,0为动作 + BoolData* al2; //AL2状态,0为动作 + + char m_endFlag; //结束标记 + TempAlarm() + : isOverLimit(new BoolData("isOverLimit", u8"上限报警")) + , isLowerLimit(new BoolData("isLowerLimit", u8"下限报警")) + , isActiveAlarm(new BoolData("isActiveAlarm", u8"正偏差报警")) + , isInactiveAlarm(new BoolData("isInactiveAlarm", u8"负偏差报警")) + , isInputLimit(new BoolData("isInputLimit", u8"超量程报警")) + , al1(new BoolData("al1", u8"AL1状态,0为动作")) + , al2(new BoolData("al2", u8"AL2状态,0为动作")){ + //isOverLimit = false; + //isLowerLimit = false; + //isActiveAlarm = false; + //isInactiveAlarm = false; + //isInputLimit = false; + //al1 = false; + //al2 = false; } }; + class TempStat { public: - TempStat() { - measuredValue = 0; - settingValue = 0; - outputValue = 0; - scale = 0; + TempStat() + : measuredValue(new FloatData("measuredValue", u8"测量值")) + , settingValue(new FloatData("settingValue", u8"给定值")) + , outputValue(new UcharData("outputValue", u8"输出值MV")) + , scale(new IntData("scale", u8"数值放大倍数")){ + //measuredValue = 0; + //settingValue = 0; + //outputValue = 0; + //scale = 0; } ~TempStat(){} public: BaseStat baseStat; - float measuredValue; //ֵ - float settingValue; //ֵ - unsigned char outputValue; //ֵMV - TempAlarm alarm; //Ϣ - int scale; //ֵŴ -}; + char m_startFlag; //开始标记 + FloatData* measuredValue; //测量值 + FloatData* settingValue; //给定值 + UcharData* outputValue; //输出值MV + IntData* scale; //数值放大倍数 + char m_endFlag; //开始标记 + + TempAlarm alarm; //报警信息 +}; +#pragma pack() class TempCtrlClient :public TcpClient { @@ -48,7 +68,7 @@ public: ~TempCtrlClient(); void SetTargeValue(float value); - void GetStat(TempStat& stat); + //void GetStat(TempStat& stat); private: void InitCommand(); diff --git a/PrintS/Communication/UPSClient.cpp b/PrintS/Communication/UPSClient.cpp index aaa146b..6d65768 100644 --- a/PrintS/Communication/UPSClient.cpp +++ b/PrintS/Communication/UPSClient.cpp @@ -1,10 +1,16 @@ -#include "UPSClient.h" +#include "UPSClient.h" #include "../utils/StringHelper.h" #include "UpsComand.h" UPSClient::UPSClient(CommunicationCfg* pconfig) :TcpClient(pconfig) { m_Freq = 500; + + size_t ptrSize = sizeof(nullptr); //指针大小 + void* startPtr = &m_Stat.m_startFlag + 1; + size_t count = ((size_t)&m_Stat.m_endFlag - (size_t)&startPtr) / ptrSize; + InsertMp(startPtr, count); + } @@ -49,7 +55,7 @@ void UPSClient::ProcInfo(void* pobject, Command* pcommand) UPSClient* pUw = (UPSClient*)pobject; unsigned char* rseq = pcommand->m_RespSeq; unsigned int dlength = pcommand->m_RespLen; - + float inputVol = (float)((rseq[1] - '0') * 1000 + (rseq[2] - '0') * 100 + (rseq[3] - '0') * 10 + (rseq[5] - '0')) / 10.0f; float lastVol = (float)((rseq[7] - '0') * 1000 + (rseq[8] - '0') * 100 + (rseq[9] - '0') * 10 + (rseq[11] - '0')) / 10.0f; float outputVol = (float)((rseq[13] - '0') * 1000 + (rseq[14] - '0') * 100 + (rseq[15] - '0') * 10 + (rseq[17] - '0')) / 10.0f; @@ -57,23 +63,23 @@ void UPSClient::ProcInfo(void* pobject, Command* pcommand) float outputF = (float)((rseq[23] - '0') * 100 + (rseq[24] - '0') * 10 + (rseq[26] - '0')) / 10.0f; float unitVol = (float)((rseq[28] - '0') * 100 + (rseq[30] - '0') * 10 + (rseq[31] - '0')) / 100.0f; float tempValue = (float)((rseq[33] - '0') * 100 + (rseq[34] - '0') * 10 + (rseq[36] - '0')) / 10.0f; - - EnterCriticalSection(&pUw->m_ValueCS); - pUw->m_Stat.inputVol = inputVol; - pUw->m_Stat.lastVol = lastVol; - pUw->m_Stat.outputVol = outputVol; - pUw->m_Stat.outputLoad = outputLoad; - pUw->m_Stat.outputF = outputF; - pUw->m_Stat.unitVol = unitVol; - pUw->m_Stat.tempValue = tempValue; - pUw->m_Stat.isVolError = (rseq[38] == '1' ? true : false); - pUw->m_Stat.isBatteryVolLow = (rseq[39] == '1' ? true : false); - pUw->m_Stat.isBypassMode = (rseq[40] == '1' ? true : false); - pUw->m_Stat.isUpsError = (rseq[41] == '1' ? true : false); - pUw->m_Stat.upsType = (rseq[42] == '1' ? true : false); - pUw->m_Stat.isTesting = (rseq[43] == '1' ? true : false); - pUw->m_Stat.isShutdown = (rseq[44] == '1' ? true : false); + EnterCriticalSection(&pUw->m_ValueCS); + pUw->m_Stat.inputVol->SetValue(inputVol); + pUw->m_Stat.lastVol->SetValue(lastVol); + pUw->m_Stat.outputVol->SetValue(outputVol); + pUw->m_Stat.outputLoad->SetValue(outputLoad); + pUw->m_Stat.outputF->SetValue(outputF); + pUw->m_Stat.unitVol->SetValue(unitVol); + pUw->m_Stat.tempValue->SetValue(tempValue); + + pUw->m_Stat.isVolError->SetValue((rseq[38] == '1' ? true : false)); + pUw->m_Stat.isBatteryVolLow->SetValue((rseq[39] == '1' ? true : false)); + pUw->m_Stat.isBypassMode->SetValue((rseq[40] == '1' ? true : false)); + pUw->m_Stat.isUpsError->SetValue((rseq[41] == '1' ? true : false)); + pUw->m_Stat.upsType->SetValue((rseq[42] == '1' ? true : false)); + pUw->m_Stat.isTesting->SetValue((rseq[43] == '1' ? true : false)); + pUw->m_Stat.isShutdown->SetValue((rseq[44] == '1' ? true : false)); LeaveCriticalSection(&pUw->m_ValueCS); } @@ -83,23 +89,24 @@ void UPSClient::ProcShutDown(void* pobject, Command* pcommand) } -void UPSClient::GetStat(Upsstat& stat) -{ - EnterCriticalSection(&m_ValueCS); - stat.baseStat = m_BaseStat; - stat.inputVol = m_Stat.inputVol; - stat.isBatteryVolLow = m_Stat.isBatteryVolLow; - stat.isBypassMode = m_Stat.isBypassMode; - stat.isShutdown = m_Stat.isShutdown; - stat.isTesting = m_Stat.isTesting; - stat.isUpsError = m_Stat.isUpsError; - stat.isVolError = m_Stat.isVolError; - stat.lastVol = m_Stat.lastVol; - stat.outputF = m_Stat.outputF; - stat.outputLoad = m_Stat.outputLoad; - stat.outputVol = m_Stat.outputVol; - stat.tempValue = m_Stat.tempValue; - stat.unitVol = m_Stat.unitVol; - stat.upsType = m_Stat.upsType; - LeaveCriticalSection(&m_ValueCS); -} +//void UPSClient::GetStat(Upsstat& stat) +//{ +// EnterCriticalSection(&m_ValueCS); +// stat.baseStat = m_BaseStat; +// stat.inputVol = m_Stat.inputVol; +// stat.isBatteryVolLow = m_Stat.isBatteryVolLow; +// stat.isBypassMode = m_Stat.isBypassMode; +// stat.isShutdown = m_Stat.isShutdown; +// stat.isTesting = m_Stat.isTesting; +// stat.isUpsError = m_Stat.isUpsError; +// stat.isVolError = m_Stat.isVolError; +// stat.lastVol = m_Stat.lastVol; +// stat.outputF = m_Stat.outputF; +// stat.outputLoad = m_Stat.outputLoad; +// stat.outputVol = m_Stat.outputVol; +// stat.tempValue = m_Stat.tempValue; +// stat.unitVol = m_Stat.unitVol; +// stat.upsType = m_Stat.upsType; +// LeaveCriticalSection(&m_ValueCS); +//} + diff --git a/PrintS/Communication/UPSClient.h b/PrintS/Communication/UPSClient.h index 46eb330..200da5e 100644 --- a/PrintS/Communication/UPSClient.h +++ b/PrintS/Communication/UPSClient.h @@ -1,44 +1,67 @@ -#pragma once +#pragma once #include "BaseClient.h" +#pragma pack(1) class Upsstat { public: - Upsstat() { - inputVol = 0; - lastVol = 0; - outputVol = 0; - outputLoad = 0; - outputF = 0; - unitVol = 0; - tempValue = 0; - isVolError = false; - isBatteryVolLow = false; - isBypassMode = false; - isUpsError = false; - upsType = false; - isTesting = false; - isShutdown = false; + Upsstat() + : inputVol(new FloatData("inputVol", u8"输入电压: MMM.M")) + , lastVol(new FloatData("lastVol", u8"上一次转电池放电时电压: NNN.N")) + , outputVol(new FloatData("outputVol", u8"输出电压: PPP.P")) + , outputLoad(new IntData("outputLoad", u8"输出负载百分比: QQQ")) + , outputF(new FloatData("outputF", u8"输入频率: RR.R")) + , unitVol(new FloatData("unitVol", u8"电池单元电压: S.SS")) + , tempValue(new FloatData("tempValue", u8"温度: TT.T")) + , isVolError(new BoolData("isVolError", u8"市电异常")) + , isBatteryVolLow(new BoolData("isBatteryVolLow", u8"电池电压低")) + , isBypassMode(new BoolData("isBypassMode", u8"旁路模式")) + , isUpsError(new BoolData("isUpsError", u8"UPS 故障")) + , upsType(new BoolData("upsType", u8"UPS 后备式 (0 :在线式)")) + , isTesting(new BoolData("isTesting", u8"测试进行中")) + , isShutdown(new BoolData("isShutdown", u8"关机")) + { + //inputVol = 0; + //lastVol = 0; + //outputVol = 0; + //outputLoad = 0; + //outputF = 0; + //unitVol = 0; + //tempValue = 0; + //isVolError = false; + //isBatteryVolLow = false; + //isBypassMode = false; + //isUpsError = false; + //upsType = false; + //isTesting = false; + //isShutdown = false; } ~Upsstat(){} public: BaseStat baseStat; - float inputVol; //ѹ: MMM.M - float lastVol; //һתطŵʱѹ: NNN.N - float outputVol; //ѹ: PPP.P - int outputLoad; //ذٷֱ: QQQ - float outputF; //Ƶ: RR.R - float unitVol; //صԪѹ: S.SS - float tempValue; //¶: TT.T - bool isVolError; //е쳣 - bool isBatteryVolLow; //صѹ - bool isBypassMode; //·ģʽ - bool isUpsError; //UPS - bool upsType; //UPS ʽ (0 ʽ) - bool isTesting; //Խ - bool isShutdown; //ػ + char m_startFlag; //开始标记 + FloatData* inputVol; //输入电压: MMM.M + FloatData* lastVol; //上一次转电池放电时电压: NNN.N + FloatData* outputVol; //输出电压: PPP.P + IntData* outputLoad; //输出负载百分比: QQQ + FloatData* outputF; //输入频率: RR.R + + + FloatData* unitVol; //电池单元电压: S.SS + FloatData* tempValue; //温度: TT.T + BoolData* isVolError; //市电异常 + BoolData* isBatteryVolLow; //电池电压低 + BoolData* isBypassMode; //旁路模式 + BoolData* isUpsError; //UPS 故障 + BoolData* upsType; //UPS 后备式 (0 :在线式) + BoolData* isTesting; //测试进行中 + BoolData* isShutdown; //关机 + + + char m_endFlag; //结束标记 }; +#pragma pack() class UPSClient :public TcpClient { @@ -47,7 +70,9 @@ public: ~UPSClient(); void InitCommand(); void ShutDownUps(float minute); - void GetStat(Upsstat& stat); + //void GetStat(Upsstat& stat); + + //void SendToClients(); private: void static ProcInfo(void* pobject, Command* pcommand); void static ProcShutDown(void* pobject, Command* pcommand); diff --git a/PrintS/Config/bean/IOCfg.h b/PrintS/Config/bean/IOCfg.h index ea1dbb9..55638e2 100644 --- a/PrintS/Config/bean/IOCfg.h +++ b/PrintS/Config/bean/IOCfg.h @@ -54,7 +54,7 @@ public: bool m_IsActive; int m_AuthLess; //用户等级 - string m_ShowContent; + string m_ShowContent; //无用 private: PLCReveiver* m_cc; S7Command* m_CtrlCommand; @@ -1726,6 +1726,7 @@ public: IOCfg* m_CylinderHandDoorClose; //缸体吊装门关位 }; +class TempCtrlClient; class IOCfgWrapper { public: enum SafeDoorState diff --git a/PrintS/DataManage/ClientInfo.cpp b/PrintS/DataManage/ClientInfo.cpp index 75de854..447c4c4 100644 --- a/PrintS/DataManage/ClientInfo.cpp +++ b/PrintS/DataManage/ClientInfo.cpp @@ -47,4 +47,17 @@ void ClientWrapper::PushAllClient(WriteData* wd) { (*client)->PushMsg(wd); ++client; } +} + +bool ClientWrapper::IsExist(ClientInfo* ci) { + std::lock_guard lck(m_mux); + bool flag = false; + auto client = m_clientList.begin(); + while (client != m_clientList.end()) { + if (*client == ci){ + flag = true; break; + } + ++client; + } + return flag; } \ No newline at end of file diff --git a/PrintS/DataManage/ClientInfo.h b/PrintS/DataManage/ClientInfo.h index 92ffdf8..650b854 100644 --- a/PrintS/DataManage/ClientInfo.h +++ b/PrintS/DataManage/ClientInfo.h @@ -75,6 +75,8 @@ public: void PushAllClient(WriteData* wd); + bool IsExist(ClientInfo* ci); + private: ClientWrapper() {} ~ClientWrapper() {} diff --git a/PrintS/DataManage/RWData.h b/PrintS/DataManage/RWData.h index 026b234..ef5c4d1 100644 --- a/PrintS/DataManage/RWData.h +++ b/PrintS/DataManage/RWData.h @@ -50,8 +50,11 @@ enum DATATYPE { iUINT, iFLOAT, iSTRING, - + iCHAR, + iUCHAR, iWORD, + + UNKNOW, }; class ClientInfo; diff --git a/PrintS/PLC/CoreCommunication.cpp b/PrintS/PLC/CoreCommunication.cpp index fa6d227..a8e7444 100644 --- a/PrintS/PLC/CoreCommunication.cpp +++ b/PrintS/PLC/CoreCommunication.cpp @@ -409,24 +409,30 @@ void CoreCommunication::GetEnvState(EnvState& envState) void CoreCommunication::SendProc() { - string keyStr, valStr; + string valStr; DATATYPE dataType; list its; while (!m_sendTdExitFlag) { std::unique_lock lock(m_ValueMtx); - keyStr = valStr = ""; + valStr = ""; its.clear(); auto param = SysParam::m_sysParamMp.begin(); while (param != SysParam::m_sysParamMp.end()) { - keyStr = param->first; valStr = param->second.GetValue(dataType); - its.emplace_back(Item{keyStr,valStr,dataType}); + its.emplace_back(Item{ param->first,valStr,dataType}); ++param; } ClientWrapper::Instance()->PushAllClient(new WriteData(SYSPARAMDATA, its)); - keyStr = valStr = ""; - + valStr = ""; + its.clear(); + auto ioItem = m_IOCfgWrapper->m_IOCfgMap.begin(); + while (ioItem != m_IOCfgWrapper->m_IOCfgMap.end()) { + valStr = to_string(ioItem->second->IsActive()); + its.emplace_back(Item{ ioItem->first,valStr,iBOOL }); + ++param; + } + ClientWrapper::Instance()->PushAllClient(new WriteData(SYSPARAMDATA, its)); std::this_thread::sleep_for(std::chrono::milliseconds(100)); diff --git a/PrintS/PLC/SysParam.cpp b/PrintS/PLC/SysParam.cpp index b7e4d20..c3537b4 100644 --- a/PrintS/PLC/SysParam.cpp +++ b/PrintS/PLC/SysParam.cpp @@ -53,7 +53,12 @@ SysParamFloat::SysParamFloat(int addr, int num, PLCReveiver* cc, const string& c m_CtrlCommand->m_Ref = this; m_CtrlCommand->isNeedDel = false; - m_sysParamMp.insert(make_pair(code,DValue(this))); + if (m_sysParamMp.find(code) != m_sysParamMp.end()) { + printf("%s is repeated...", code.c_str()); + } + else { + m_sysParamMp.insert(make_pair(code, DValue(this))); + } } void SysParamFloat::SetValue(float value) @@ -79,11 +84,22 @@ SysParamFloat::~SysParamFloat() SysParamFloatUI::SysParamFloatUI(SysParamFloat* sp) :SysParamFloat(sp) { - m_sysParamMp.insert(make_pair("UI"+sp->GetCode(), DValue(this))); + + if (m_sysParamMp.find("UI" + sp->GetCode()) != m_sysParamMp.end()) { + printf("%s is repeated...", ("UI" + sp->GetCode()).c_str()); + } + else { + m_sysParamMp.insert(make_pair("UI" + sp->GetCode(), DValue(this))); + } } SysParamWordUI::SysParamWordUI(SysParamWord* sp) :SysParamWord(sp) { - m_sysParamMp.insert(make_pair("UI" + sp->GetCode(), DValue(this))); + if (m_sysParamMp.find("UI" + sp->GetCode()) != m_sysParamMp.end()) { + printf("%s is repeated...", ("UI" + sp->GetCode()).c_str()); + } + else { + m_sysParamMp.insert(make_pair("UI" + sp->GetCode(), DValue(this))); + } } SysParamWord::SysParamWord(int addr, int num, PLCReveiver* cc, const string& context, const string& code ) @@ -101,7 +117,12 @@ SysParamWord::SysParamWord(int addr, int num, PLCReveiver* cc, const string& con m_CtrlCommand->m_Ref = this; m_CtrlCommand->isNeedDel = false; - m_sysParamMp.insert(make_pair(code, DValue(this))); + if (m_sysParamMp.find(code) != m_sysParamMp.end()) { + printf("%s is repeated...", code.c_str()); + } + else { + m_sysParamMp.insert(make_pair(code, DValue(this))); + } } void SysParamWord::SetValue(short value) @@ -138,7 +159,12 @@ SysParamBool::SysParamBool(int addr, int num, PLCReveiver* cc,const string& cont m_CtrlCommand->m_Ref = this; m_CtrlCommand->isNeedDel = false; - m_sysParamMp.insert(make_pair(code, DValue(this))); + if (m_sysParamMp.find(code) != m_sysParamMp.end()) { + printf("%s is repeated...", code.c_str()); + } + else { + m_sysParamMp.insert(make_pair(code, DValue(this))); + } } SysParamBool:: ~SysParamBool() @@ -170,7 +196,12 @@ SysParamInt::SysParamInt(int addr, int num, PLCReveiver* cc, const string& conte m_CtrlCommand->m_Ref = this; m_CtrlCommand->isNeedDel = false; - m_sysParamMp.insert(make_pair(code, DValue(this))); + if (m_sysParamMp.find(code) != m_sysParamMp.end()) { + printf("%s is repeated...", code.c_str()); + } + else { + m_sysParamMp.insert(make_pair(code, DValue(this))); + } } SysParamInt:: ~SysParamInt() diff --git a/PrintS/PrintS.vcxproj b/PrintS/PrintS.vcxproj index 30bdd5c..2f9c223 100644 --- a/PrintS/PrintS.vcxproj +++ b/PrintS/PrintS.vcxproj @@ -347,6 +347,7 @@ + diff --git a/PrintS/PrintS.vcxproj.filters b/PrintS/PrintS.vcxproj.filters index 4e40971..b0155dc 100644 --- a/PrintS/PrintS.vcxproj.filters +++ b/PrintS/PrintS.vcxproj.filters @@ -1744,6 +1744,9 @@ DataManage + + Communication + diff --git a/PrintS/job/MetaData.h b/PrintS/job/MetaData.h index d42a53d..debf40c 100644 --- a/PrintS/job/MetaData.h +++ b/PrintS/job/MetaData.h @@ -467,15 +467,15 @@ public: void UnLockPart() { LeaveCriticalSection(&partCs); } string GetJobTitle(void) { return general_info->job_name; } - unsigned int GetLayerCount(void) { return layers->vector_layers.size(); } - unsigned int GetComponentCount(void) { return partsMap.size(); } + unsigned int GetLayerCount(void) { return (UINT)layers->vector_layers.size(); } + unsigned int GetComponentCount(void) { return (UINT)partsMap.size(); } Layer* GetLayer(unsigned int id); string GetJobUid(void) { return job_id; } void GetPartId(int layerIndex, set& partIds); // float GetProgress(void) { return m_ProgressValue; } //string GetProgressInfo(); float PowderRequiretment(void); - unsigned int GetNumOfScanField() { return machine_type->scanFields.size(); } + unsigned int GetNumOfScanField() { return (UINT)machine_type->scanFields.size(); } vector* GetScanFields() { return &machine_type->scanFields; } diff --git a/PrintS/job/VolumeCalc.cpp b/PrintS/job/VolumeCalc.cpp index 073810d..6985561 100644 --- a/PrintS/job/VolumeCalc.cpp +++ b/PrintS/job/VolumeCalc.cpp @@ -1,4 +1,4 @@ -#define NOMINMAX +#define NOMINMAX #include "VolumeCalc.h" #define CLIPPER_SCALE 1.0e9 @@ -157,7 +157,7 @@ void VolumeCalc::GetLayerBorders(MetaData* metadata, unsigned int layer, PolyTre } if (poly_found) break; - int end_idx = contour.size() - 1; + size_t end_idx = contour.size() - 1; for (size_t j = 0; j < 10 && j < contour.size() - 1; j++) { if (isBetween(contour[end_idx - j], contour[end_idx - j - 1], closed->Contour.back())) { if (!isBetween(closed->Contour.back(), closed->Contour[closed->Contour.size() - 2], contour[end_idx - j - 1]) || diff --git a/PrintS/protobuf/stream.proto b/PrintS/protobuf/stream.proto index 0efa1bc..cb21971 100644 --- a/PrintS/protobuf/stream.proto +++ b/PrintS/protobuf/stream.proto @@ -22,6 +22,7 @@ enum TYPE{ message ParamInfo{ bytes nameKey = 1; //参数key bytes strValue = 2; //value + //bool isOutput = 2; //是否只读 TYPE valueType = 3; //数据类型 }