2024-04-15 10:08:28 +08:00
|
|
|
|
#include "OxygenClient.h"
|
2024-03-19 17:45:12 +08:00
|
|
|
|
#include "Modbus.h"
|
|
|
|
|
#include <shared_mutex>
|
|
|
|
|
#include "../SystemInfo.h"
|
|
|
|
|
#include "../config/ConfigManager.h"
|
|
|
|
|
|
|
|
|
|
OxygenClient::OxygenClient(CommunicationCfg* pconfig) :TcpClient(pconfig)
|
|
|
|
|
{
|
|
|
|
|
m_Freq = 100;
|
|
|
|
|
m_ExtCfg = ConfigManager::GetInstance()->GetExtCfg();
|
2024-04-15 10:08:28 +08:00
|
|
|
|
|
|
|
|
|
//size_t ptrSize = sizeof(nullptr); //指针大小
|
|
|
|
|
//void* startPtr = &m_DoluyoChillerStat.m_startFlag + 1;
|
2024-04-23 13:41:16 +08:00
|
|
|
|
//size_t count = ((size_t)&m_DoluyoChillerStat.m_endFlag - (size_t)startPtr) / ptrSize;
|
2024-04-15 10:08:28 +08:00
|
|
|
|
//InsertMp(startPtr, count);
|
2024-03-19 17:45:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OxygenClient::~OxygenClient()
|
|
|
|
|
{
|
|
|
|
|
Shutdown();
|
|
|
|
|
//OutputDebugString("oxygen close\n");
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-15 10:08:28 +08:00
|
|
|
|
|
2024-04-16 13:32:05 +08:00
|
|
|
|
//void OxygenClient::AddToBaseMp(const string& suff, Oxygenstat* stat) {
|
|
|
|
|
// size_t ptrSize = sizeof(nullptr); //指针大小
|
|
|
|
|
// void* startPtr = &stat->m_startFlag + 1;
|
2024-04-23 13:41:16 +08:00
|
|
|
|
// size_t count = ((size_t)&stat->m_endFlag - (size_t)startPtr) / ptrSize;
|
2024-04-16 13:32:05 +08:00
|
|
|
|
// for (size_t i = 0; i < count; ++i) {
|
|
|
|
|
// BaseData* bd = *((BaseData**)((char*)startPtr + ptrSize * i));
|
|
|
|
|
// string code = bd->GetCode() + suff; //区分key,添加上"_i"
|
|
|
|
|
// if (m_baseMp.find(code) != m_baseMp.end()) {
|
|
|
|
|
// printf("%s is repeated...\n", code.c_str());
|
|
|
|
|
// }
|
|
|
|
|
// else { m_baseMp.insert(make_pair(code, bd)); }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
//}
|
2024-04-15 10:08:28 +08:00
|
|
|
|
|
2024-03-19 17:45:12 +08:00
|
|
|
|
void OxygenClient::InitCommand()
|
|
|
|
|
{
|
|
|
|
|
map<int, int> tref;
|
|
|
|
|
tref[1] = m_ExtCfg->m_Oxygen1SensorType;
|
|
|
|
|
tref[2] = m_ExtCfg->m_Oxygen2SensorType;
|
|
|
|
|
tref[3] = m_ExtCfg->m_OutOxygenSensorType;
|
|
|
|
|
tref[4] = m_ExtCfg->m_CleanBoxOxygenSensorType;
|
|
|
|
|
for (int i = 1; i <= 4;i++) {
|
|
|
|
|
Oxygenstat* stat = new Oxygenstat();
|
2024-04-16 13:32:05 +08:00
|
|
|
|
//AddToBaseMp("_"+to_string(i), stat); //添加到map
|
|
|
|
|
|
|
|
|
|
size_t ptrSize = sizeof(nullptr); //指针大小
|
|
|
|
|
void* startPtr = &stat->m_startFlag + 1;
|
2024-04-23 13:41:16 +08:00
|
|
|
|
size_t count = ((size_t)&stat->m_endFlag - (size_t)startPtr) / ptrSize;
|
2024-04-16 13:32:05 +08:00
|
|
|
|
InsertMp(startPtr, count, "_" + to_string(i));
|
|
|
|
|
|
2024-03-19 17:45:12 +08:00
|
|
|
|
m_Oxygens[i] = stat;
|
|
|
|
|
switch (tref[i]) {
|
|
|
|
|
case ExtCfg::MOT500_LOW: {
|
|
|
|
|
Command* stat3Value = new ReadModbus(i, 0x6004, 11);
|
|
|
|
|
stat3Value->m_Fun = &OxygenClient::ProcNewVersion;
|
|
|
|
|
stat3Value->m_Ref = this;
|
|
|
|
|
stat3Value->isNeedDel = false;
|
|
|
|
|
m_CycleCommands.push_back(stat3Value);
|
|
|
|
|
}break;
|
|
|
|
|
case ExtCfg::MOT500_HIGH: {
|
|
|
|
|
Command* stat1Value = new ReadModbus(i, 0x05, 2);
|
|
|
|
|
stat1Value->m_Fun = &OxygenClient::ProcPointInfo;
|
|
|
|
|
stat1Value->m_Ref = this;
|
|
|
|
|
stat1Value->isNeedDel = false;
|
|
|
|
|
|
|
|
|
|
Command* pValue1 = new ReadModbus(i, 0x09D0, 2);
|
|
|
|
|
pValue1->m_Fun = &OxygenClient::PorcConcentrationValue;
|
|
|
|
|
pValue1->m_Ref = this;
|
|
|
|
|
pValue1->isNeedDel = false;
|
|
|
|
|
|
|
|
|
|
Command* ptempValue1 = new ReadModbus(i, 0x0A07, 2);
|
|
|
|
|
ptempValue1->m_Fun = &OxygenClient::ProcTempInfo;
|
|
|
|
|
ptempValue1->m_Ref = this;
|
|
|
|
|
ptempValue1->isNeedDel = false;
|
|
|
|
|
|
|
|
|
|
m_CycleCommands.push_back(stat1Value);
|
|
|
|
|
m_CycleCommands.push_back(pValue1);
|
|
|
|
|
m_CycleCommands.push_back(ptempValue1);
|
|
|
|
|
}break;
|
|
|
|
|
case ExtCfg::HT: {
|
|
|
|
|
Command* pPointInfo = new ReadModbus(i, 0x02, 2);
|
|
|
|
|
pPointInfo->m_Fun = &OxygenClient::PorcOxygenValue;
|
|
|
|
|
pPointInfo->m_Ref = this;
|
|
|
|
|
pPointInfo->isNeedDel = false;
|
|
|
|
|
m_CycleCommands.push_back(pPointInfo);
|
|
|
|
|
}break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < m_CycleCommands.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
ReadModbus* command = (ReadModbus*)m_CycleCommands[i];
|
|
|
|
|
if (command->m_addr == 4)
|
|
|
|
|
{
|
|
|
|
|
//m_PurifierOxygenCommands.push_back(command);
|
|
|
|
|
if (!m_ExtCfg->m_HasCleanBoxOxygenSensor)
|
|
|
|
|
{
|
|
|
|
|
command->isNeedSend = false;
|
|
|
|
|
command->isNeedRead = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void OxygenClient::ProcPointInfo(void* pobject, Command* pcommand)
|
|
|
|
|
{
|
|
|
|
|
if (pobject == NULL)return;
|
|
|
|
|
OxygenClient* pOD = (OxygenClient*)pobject;
|
|
|
|
|
unsigned char* rseq = pcommand->m_RespSeq;
|
|
|
|
|
unsigned char addr = rseq[0];
|
|
|
|
|
unsigned short pointindex = ((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff);
|
|
|
|
|
unsigned short unit = ((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff);
|
|
|
|
|
int scale = 1;
|
|
|
|
|
for (unsigned short i = 0; i < pointindex; i++) {
|
|
|
|
|
scale *= 10;
|
|
|
|
|
}
|
|
|
|
|
if (pOD->m_Oxygens.find(addr) == pOD->m_Oxygens.end())return;
|
|
|
|
|
Oxygenstat* stat = pOD->m_Oxygens[addr];
|
|
|
|
|
|
|
|
|
|
EnterCriticalSection(&pOD->m_ValueCS);
|
2024-04-15 10:08:28 +08:00
|
|
|
|
stat->scale->SetValue(scale);
|
2024-03-19 17:45:12 +08:00
|
|
|
|
switch (unit) {
|
2024-04-15 10:08:28 +08:00
|
|
|
|
case 0:stat->valueUnit ->SetValue("PPM"); break;
|
|
|
|
|
case 1:stat->valueUnit->SetValue("VOL"); break;
|
|
|
|
|
case 2:stat->valueUnit->SetValue("LEL"); break;
|
2024-03-19 17:45:12 +08:00
|
|
|
|
}
|
|
|
|
|
LeaveCriticalSection(&pOD->m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OxygenClient::PorcConcentrationValue(void* pobject, Command* pcommand)
|
|
|
|
|
{
|
|
|
|
|
if (pobject == NULL)return;
|
|
|
|
|
OxygenClient* pOD = (OxygenClient*)pobject;
|
|
|
|
|
unsigned char* rseq = pcommand->m_RespSeq;
|
|
|
|
|
unsigned char addr = rseq[0];
|
|
|
|
|
unsigned int concentrationValue = (((rseq[3] & 0xff) << 24) + ((rseq[4] & 0xff) << 16) + ((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff));
|
|
|
|
|
if (pOD->m_Oxygens.find(addr) == pOD->m_Oxygens.end())return;
|
|
|
|
|
Oxygenstat* stat = pOD->m_Oxygens[addr];
|
|
|
|
|
if (stat->scale == 0)return;
|
|
|
|
|
EnterCriticalSection(&pOD->m_ValueCS);
|
2024-04-15 10:08:28 +08:00
|
|
|
|
stat->concentrationValue->SetValue((float)concentrationValue / stat->scale->GetValue());
|
2024-03-19 17:45:12 +08:00
|
|
|
|
LeaveCriticalSection(&pOD->m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OxygenClient::ProcTempInfo(void* pobject, Command* pcommand)
|
|
|
|
|
{
|
|
|
|
|
if (pobject == NULL)return;
|
|
|
|
|
OxygenClient* pOD = (OxygenClient*)pobject;
|
|
|
|
|
unsigned char* rseq = pcommand->m_RespSeq;
|
|
|
|
|
unsigned char addr = rseq[0];
|
|
|
|
|
short tempValue = (((rseq[3] & 0xff) << 8) + (rseq[4] & 0xff));
|
|
|
|
|
unsigned short humidityValue = ((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff);
|
|
|
|
|
if (pOD->m_Oxygens.find(addr) == pOD->m_Oxygens.end())return;
|
|
|
|
|
Oxygenstat* stat = pOD->m_Oxygens[addr];
|
|
|
|
|
EnterCriticalSection(&pOD->m_ValueCS);
|
2024-04-15 10:08:28 +08:00
|
|
|
|
stat->tempValue->SetValue((float)tempValue / 10.0f);
|
|
|
|
|
stat->humidityValue->SetValue((float)humidityValue / 100.0f);
|
2024-03-19 17:45:12 +08:00
|
|
|
|
LeaveCriticalSection(&pOD->m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OxygenClient::ServerDisconnectProc() {
|
|
|
|
|
EnterCriticalSection(&m_ValueCS);
|
|
|
|
|
for (auto& chiller : m_Oxygens) {
|
|
|
|
|
chiller.second->baseStat.isConnected = false;
|
|
|
|
|
}
|
|
|
|
|
LeaveCriticalSection(&m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void OxygenClient::WriteSuccessProc(int wlength, unsigned char* buffer, Command* pcommand)
|
|
|
|
|
{
|
|
|
|
|
Modbus* command = (Modbus*)pcommand;
|
|
|
|
|
unsigned char addr = command->m_addr;
|
|
|
|
|
if (m_Oxygens.find(addr) == m_Oxygens.end())return;
|
|
|
|
|
EnterCriticalSection(&m_ValueCS);
|
|
|
|
|
m_Oxygens[addr]->baseStat.writeTimeoutFlag = 0;
|
|
|
|
|
LeaveCriticalSection(&m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
void OxygenClient::WriteTimeoutProc(Command* pcommand)
|
|
|
|
|
{
|
|
|
|
|
Modbus* command = (Modbus*)pcommand;
|
|
|
|
|
unsigned char addr = command->m_addr;
|
|
|
|
|
if (m_Oxygens.find(addr) == m_Oxygens.end())return;
|
|
|
|
|
EnterCriticalSection(&m_ValueCS);
|
|
|
|
|
Oxygenstat* oxygen = m_Oxygens[addr];
|
|
|
|
|
oxygen->baseStat.writeTimeoutFlag++;
|
|
|
|
|
if (oxygen->baseStat.writeTimeoutFlag >= m_Config->m_AlarmTimeoutTimes) {
|
|
|
|
|
oxygen->baseStat.isConnected = false;
|
|
|
|
|
}
|
|
|
|
|
LeaveCriticalSection(&m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void OxygenClient::ReadTimeoutProc(Command* pcommand)
|
|
|
|
|
{
|
|
|
|
|
Modbus* command = (Modbus*)pcommand;
|
|
|
|
|
unsigned char addr = command->m_addr;
|
|
|
|
|
if (m_Oxygens.find(addr) == m_Oxygens.end())return;
|
|
|
|
|
EnterCriticalSection(&m_ValueCS);
|
|
|
|
|
Oxygenstat* oxygen = m_Oxygens[addr];
|
|
|
|
|
oxygen->baseStat.readTimeoutFlag++;
|
|
|
|
|
if (oxygen->baseStat.readTimeoutFlag >= m_Config->m_AlarmTimeoutTimes) {
|
|
|
|
|
oxygen->baseStat.isConnected = false;
|
|
|
|
|
}
|
|
|
|
|
LeaveCriticalSection(&m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void OxygenClient::ReadSuccessProc(int rlength, unsigned char* buffer, Command* pcommand)
|
|
|
|
|
{
|
|
|
|
|
Modbus* command = (Modbus*)pcommand;
|
|
|
|
|
unsigned char addr = command->m_addr;
|
|
|
|
|
if (m_Oxygens.find(addr) == m_Oxygens.end())return;
|
|
|
|
|
EnterCriticalSection(&m_ValueCS);
|
|
|
|
|
Oxygenstat* oxygen = m_Oxygens[addr];
|
|
|
|
|
oxygen->baseStat.readTimeoutFlag = 0;
|
|
|
|
|
oxygen->baseStat.isConnected = true;
|
|
|
|
|
LeaveCriticalSection(&m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OxygenClient::GetOxygenStat(unsigned char addr, Oxygenstat& stat)
|
|
|
|
|
{
|
|
|
|
|
if (m_Oxygens.find(addr) == m_Oxygens.end())return;
|
|
|
|
|
Oxygenstat* oxygenstat =m_Oxygens[addr];
|
|
|
|
|
EnterCriticalSection(&m_ValueCS);
|
|
|
|
|
stat.baseStat = oxygenstat->baseStat;
|
|
|
|
|
stat.concentrationValue= oxygenstat->concentrationValue;
|
|
|
|
|
stat.valueUnit= oxygenstat->valueUnit;
|
|
|
|
|
stat.scale= oxygenstat->scale;
|
|
|
|
|
stat.tempValue= oxygenstat->tempValue;
|
|
|
|
|
stat.humidityValue= oxygenstat->humidityValue;
|
|
|
|
|
LeaveCriticalSection(&m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OxygenClient::GetOxygenStat(Oxygenstat& stat1, Oxygenstat& stat2, Oxygenstat& stat3)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
EnterCriticalSection(&m_ValueCS);
|
|
|
|
|
Oxygenstat* oxygen1=m_Oxygens[1];
|
|
|
|
|
Oxygenstat* oxygen2 = m_Oxygens[2];
|
|
|
|
|
Oxygenstat* outside = m_Oxygens[3];
|
|
|
|
|
stat1.baseStat = oxygen1->baseStat;
|
|
|
|
|
stat1.concentrationValue = oxygen1->concentrationValue;
|
|
|
|
|
stat1.valueUnit = oxygen1->valueUnit;
|
|
|
|
|
stat1.scale = oxygen1->scale;
|
|
|
|
|
stat1.tempValue = oxygen1->tempValue;
|
|
|
|
|
stat1.humidityValue = oxygen1->humidityValue;
|
|
|
|
|
|
|
|
|
|
stat2.baseStat = oxygen2->baseStat;
|
|
|
|
|
stat2.concentrationValue = oxygen2->concentrationValue;
|
|
|
|
|
stat2.valueUnit = oxygen2->valueUnit;
|
|
|
|
|
stat2.scale = oxygen2->scale;
|
|
|
|
|
stat2.tempValue = oxygen2->tempValue;
|
|
|
|
|
stat2.humidityValue = oxygen2->humidityValue;
|
|
|
|
|
|
|
|
|
|
stat3.baseStat = outside->baseStat;
|
|
|
|
|
stat3.concentrationValue = outside->concentrationValue;
|
|
|
|
|
stat3.valueUnit = outside->valueUnit;
|
|
|
|
|
stat3.scale = outside->scale;
|
|
|
|
|
stat3.tempValue = outside->tempValue;
|
|
|
|
|
stat3.humidityValue = outside->humidityValue;
|
|
|
|
|
|
|
|
|
|
LeaveCriticalSection(&m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OxygenClient::PorcOxygenValue(void* pobject, Command* pcommand)
|
|
|
|
|
{
|
|
|
|
|
if (pobject == NULL)return;
|
|
|
|
|
OxygenClient* pOD = (OxygenClient*)pobject;
|
|
|
|
|
unsigned char* rseq = pcommand->m_RespSeq;
|
|
|
|
|
unsigned char addr = rseq[0];
|
|
|
|
|
if (pOD->m_Oxygens.find(addr) == pOD->m_Oxygens.end())return;
|
|
|
|
|
int value = ((rseq[3] & 0xff) << 24) + ((rseq[4] & 0xff) << 16) + ((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff);
|
|
|
|
|
EnterCriticalSection(&pOD->m_ValueCS);
|
2024-04-15 10:08:28 +08:00
|
|
|
|
pOD->m_Oxygens[addr]->concentrationValue->SetValue((float)value / 100.0f);
|
2024-03-19 17:45:12 +08:00
|
|
|
|
LeaveCriticalSection(&pOD->m_ValueCS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OxygenClient::ProcNewVersion(void* pobject, Command* pcommand)
|
|
|
|
|
{
|
|
|
|
|
if (pobject == NULL)return;
|
|
|
|
|
OxygenClient* pOD = (OxygenClient*)pobject;
|
|
|
|
|
unsigned char* rseq = pcommand->m_RespSeq;
|
|
|
|
|
unsigned char addr = rseq[0];
|
|
|
|
|
if (pOD->m_Oxygens.find(addr) == pOD->m_Oxygens.end())return;
|
|
|
|
|
unsigned char pointindex = rseq[4];
|
|
|
|
|
unsigned short unit = ((rseq[5] & 0xff) << 8) + (rseq[6] & 0xff);
|
|
|
|
|
unsigned int concentrationValue = (((rseq[7] & 0xff) << 24) + ((rseq[8] & 0xff) << 16) + ((rseq[9] & 0xff) << 8) + (rseq[10] & 0xff));
|
|
|
|
|
unsigned int concentrationAgValue = (((rseq[11] & 0xff) << 24) + ((rseq[12] & 0xff) << 16) + ((rseq[13] & 0xff) << 8) + (rseq[14] & 0xff));
|
|
|
|
|
//unsigned short alarm = ((rseq[15] & 0xff) << 8) + (rseq[16] & 0xff);
|
|
|
|
|
//unsigned int concentrationRangeValue = (((rseq[17] & 0xff) << 24) + ((rseq[18] & 0xff) << 16) + ((rseq[19] & 0xff) << 8) + (rseq[20] & 0xff));
|
|
|
|
|
short tempValue = (((rseq[21] & 0xff) << 8) + (rseq[22] & 0xff));
|
|
|
|
|
unsigned short humidityValue = ((rseq[23] & 0xff) << 8) + (rseq[24] & 0xff);
|
|
|
|
|
int scale = 1;
|
|
|
|
|
for (unsigned char i = 0; i < pointindex; i++) {
|
|
|
|
|
scale *= 10;
|
|
|
|
|
}
|
|
|
|
|
Oxygenstat* stat = pOD->m_Oxygens[addr];
|
|
|
|
|
EnterCriticalSection(&pOD->m_ValueCS);
|
2024-04-15 10:08:28 +08:00
|
|
|
|
stat->scale->SetValue(scale);
|
2024-03-19 17:45:12 +08:00
|
|
|
|
switch (unit) {
|
2024-04-15 10:08:28 +08:00
|
|
|
|
case 0:stat->valueUnit->SetValue("PPM"); break;
|
|
|
|
|
case 1:stat->valueUnit->SetValue("VOL"); break;
|
|
|
|
|
case 2:stat->valueUnit->SetValue("LEL"); break;
|
2024-03-19 17:45:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-04-15 10:08:28 +08:00
|
|
|
|
if(stat->scale!=0)stat->concentrationValue->SetValue((float)concentrationValue / stat->scale->GetValue());
|
|
|
|
|
else stat->concentrationValue->SetValue((float)concentrationValue);
|
2024-05-06 10:49:15 +08:00
|
|
|
|
stat->concentrationAgValue->SetValue((float)concentrationAgValue);
|
2024-04-15 10:08:28 +08:00
|
|
|
|
stat->tempValue->SetValue((float)tempValue / 10.0f);
|
|
|
|
|
stat->humidityValue->SetValue((float)humidityValue / 1000.0f);
|
2024-03-19 17:45:12 +08:00
|
|
|
|
LeaveCriticalSection(&pOD->m_ValueCS);
|
|
|
|
|
}
|