📄 ca2ipro.cpp
字号:
{
METHOD_PROLOGUE(CCA2IPro, ProtocolImp2);
return pThis->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP_(BOOL) CCA2IPro::XProtocolImp2::SetTrans( LPVOID* pHcomm )
{
METHOD_PROLOGUE(CCA2IPro, ProtocolImp2);
//TO DO: Do your own Initialization.
return TRUE;
}
STDMETHODIMP_(BOOL) CCA2IPro::XProtocolImp2::GetTrans( LPVOID* pHcomm )
{
METHOD_PROLOGUE(CCA2IPro, ProtocolImp2);
//TO DO: Do your own Initialization.
return TRUE;
}
STDMETHODIMP_(BOOL) CCA2IPro::XProtocolImp2::SetInitialString(char* pDeviceName, LPVOID lpDevAddr,LPVOID InitialString)
{
METHOD_PROLOGUE(CCA2IPro, ProtocolImp2);
//TO DO: Do your own Initialization.
return TRUE;
}
STDMETHODIMP_(int) CCA2IPro::XProtocolImp2::ProcessPacket2(LPVOID lpPacket)
{
METHOD_PROLOGUE(CCA2IPro, ProtocolImp2);
PPACKET pPac = (PACKET*)lpPacket;
BOOL bPacSuc = TRUE;
bPacSuc = pThis->ReadPacket(pPac);
return bPacSuc;
}
BOOL CCA2IPro::ReadPacket(PPACKET pPac)
{
POSITION position = pPac->varList.GetHeadPosition();
BOOL bPacSuc = FALSE;
#ifdef OUT_DEBUG_MESSAGE
char buf[2048];
strcpy(buf, "************************************************************************");
ShowMessage(buf);
#endif
//初始化回路寄存器
if (pPac->nRegType == INITLP_REG)
{
int nCount = 0;
nCount = pPac->varList.GetCount();
if(PT_WRITE == pPac->nPacketType)
{
for(int i=0; i<nCount; i++)
{
ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
if(idNo->plcValue.byteVal == 0)
{
LoopNum[idNo->wNo] = 0;
}
else
{
LoopNum[idNo->wNo] = 1;
}
}
InitLoopNoAndNum();
}
if(PT_READ == pPac->nPacketType)
{
int nCount = 0;
nCount = pPac->varList.GetCount();
for(int i=0; i<nCount; i++)
{
ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
idNo->plcValue.byteVal = LoopNum[idNo->wNo];
CoFileTimeNow(&idNo->ftTimeStamps);
idNo->wQualities = 0xc0;
}
}
return TRUE;
}
if(pPac->nRegType == DKSFLAG_REG)
{
if(pPac->nPacketType == PT_READ)
{
int nCount = 0;
nCount = pPac->varList.GetCount();
for(int i=0; i<nCount; i++)
{
ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
idNo->plcValue.byteVal = DKSFlag[idNo->wNo];
CoFileTimeNow(&idNo->ftTimeStamps);
idNo->wQualities = 0xc0;
}
}
else
{
ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
if(idNo->plcValue.byteVal == 0)
DKSFlag[idNo->wNo] = 0;
else
DKSFlag[idNo->wNo] = 1;
}
return TRUE;
}
if(pPac->nRegType == DKGFLAG_REG)
{
if(pPac->nPacketType == PT_READ)
{
int nCount = 0;
nCount = pPac->varList.GetCount();
for(int i=0; i<nCount; i++)
{
ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
idNo->plcValue.byteVal = DKGFlag[idNo->wNo];
CoFileTimeNow(&idNo->ftTimeStamps);
idNo->wQualities = 0xc0;
}
}
else
{
ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
if(idNo->plcValue.byteVal == 0)
DKGFlag[idNo->wNo] = 0;
else
DKGFlag[idNo->wNo] = 1;
}
return TRUE;
}
#ifdef OUT_DEBUG_MESSAGE
memset(buf, 0, sizeof(buf));
strcpy(buf, "处理寄存器: ");
strcpy(buf+strlen(buf), pPac->pszRegName);
strcpy(buf+strlen(buf), " 回路号: ");
sprintf(buf+strlen(buf), "%d", pPac->nSubType);
ShowMessage(buf);
#endif
//只有在多路串口功能打开,且此回路被选定时,才从设备读取数据。
if( (pPac->nPacketType == PT_READ && pPac->nRegType == MSPDATA_REG)||
(pPac->nPacketType == PT_READ && pPac->nRegType == SENDATA_REG)||
(pPac->nPacketType == PT_READ && pPac->nRegType == DKSDATA_REG)||
(pPac->nPacketType == PT_READ && pPac->nRegType == DKGDATA_REG))
{
if(pPac->nRegType != DKSDATA_REG && pPac->nRegType != DKGDATA_REG)
{
if(m_nLastLoopNum != -1
&& pPac->nRegType != m_nLastRegType
&& pPac->nSubType == m_nLastLoopNum
&& m_nLastDataLen != -1)
{//从缓存读取数据
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("Read Data From Buffer!");
#endif
while(position)
{
ID_NO2 * pID = (ID_NO2*)pPac->varList.GetNext(position);
if(pID->wNo == 0 )
{//数据有效判断码
pID->plcValue.byteVal = m_bData0;
}
else if(pID->wNo == 33)
{//子站长度
pID->plcValue.byteVal = m_bData33;
}
else if(pID->wNo == 34)
{
pID->plcValue.byteVal = m_bData34;
}
else
{
if(pID->wNo<=m_nLastDataLen)
{
pID->plcValue.byteVal = GetData(m_nData,pID->wNo,pPac->nRegType,m_nLastDataLen);
}
}
if(pID->wNo == 34)
{
pID->wQualities = 0xc0;
}
else if(pID->wNo == 0)//(pData[nSend-3] == 0xC0 || idNo->wNo == 0 || idNo->wNo == 33)
{
if(m_bData0 == 0xC0 || m_bData0 == 0xCC)
{
pID->wQualities = 0xc0;
}
else
{
pID->wQualities = 0xa0;
}
}
else if(pID->wNo == 33)
{
pID->wQualities = 0xc0;
}
else
{
if(m_bData0 == 0xC0)
{
pID->wQualities = 0xc0;
}
else
{
pID->wQualities = 0xa0;
}
}
if(pID->wNo > m_nLastDataLen && pID->wNo != 33 && pID->wNo != 34)
{
pID->wQualities = 0xa0;
}
CoFileTimeNow(&pID->ftTimeStamps);
}
memset(m_nData, 0, sizeof(m_nData));
m_nLastLoopNum = -1;
m_nLastRegType = -1;
m_nLastDataLen = -1;
m_bData0 = -1;
m_bData33 = -1;
m_bData34 = -1;
return TRUE;
}
}
#ifdef OUT_DEBUG_MESSAGE
char buf[2048];
memset(buf, 0, sizeof(buf));
if(m_bOn)
strcpy(buf, "多路串口打开");
else
strcpy(buf, "多路串口关闭");
ShowMessage(buf);
memset(buf, 0, sizeof(buf));
for(int m=1; m<33; m++)
sprintf(buf+strlen(buf), " %d-%d",m ,LoopNum[pPac->nSubType]);
ShowMessage(buf);
#endif
if(pPac->nRegType == MSPDATA_REG || pPac->nRegType == SENDATA_REG)
{//判断是否置读取灯的数据
if(m_bOn == FALSE || (m_bOn == TRUE && LoopNum[pPac->nSubType] == 0))
{
#ifdef OUT_DEBUG_MESSAGE
memset(buf, 0, sizeof(buf));
strcpy(buf, "未打开多路串口,或未选中此回路号.");
ShowMessage(buf);
memset(buf, 0, sizeof(buf));
strcpy(buf, "从数据缓冲区读取数据");
ShowMessage(buf);
#endif
int nCount = 0;
nCount = pPac->varList.GetCount();
for(int i=0; i<nCount; i++)
{
ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
CoFileTimeNow(&idNo->ftTimeStamps);
idNo->wQualities = 0xa0;
}
return TRUE;
}
}
if(pPac->nRegType == DKSDATA_REG)
{//判断是否置读取水的数据
if(m_bOn == FALSE || (m_bOn == TRUE && DKSFlag[pPac->nSubType] == 0))
{
int nCount = 0;
nCount = pPac->varList.GetCount();
for(int i=0; i<nCount; i++)
{
ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
CoFileTimeNow(&idNo->ftTimeStamps);
idNo->wQualities = 0xa0;
}
return TRUE;
}
}
if(pPac->nRegType == DKGDATA_REG)
{//判断是否置读取水的数据
if(m_bOn == FALSE || (m_bOn == TRUE && DKGFlag[pPac->nSubType] == 0))
{
int nCount = 0;
nCount = pPac->varList.GetCount();
for(int i=0; i<nCount; i++)
{
ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
CoFileTimeNow(&idNo->ftTimeStamps);
idNo->wQualities = 0xa0;
}
return TRUE;
}
}
}
//正常从设备读取数据
int nSend = 0, nSend2 = 0, nReceLen = 0;
BYTE Readbuffer[1024];
BYTE Readbuffer2[1024];
BYTE pData[1024];
BYTE CheckBuf[64]; int nClen = 0;
memset(CheckBuf, 0, sizeof(CheckBuf));
memset(Readbuffer, 0, sizeof(Readbuffer));
memset(Readbuffer2, 0, sizeof(Readbuffer2));
memset(pData, 0, sizeof(pData));
#ifdef OUT_DEBUG_MESSAGE
memset(buf, 0, sizeof(buf));
strcpy(buf, "从设备读取数据");
ShowMessage(buf);
#endif
if (!GetSendString(pPac, Readbuffer, nSend, nReceLen))
{
bPacSuc = FALSE;
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("变量读写属性定义错误");
#endif
return FALSE;//ljh add 2002-1-10
}
else
{
memcpy(Readbuffer2,Readbuffer,sizeof(Readbuffer));
nSend2 = nSend;
if (!Transmission(Readbuffer, nSend, nReceLen,pPac))
{
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("通讯超时错");
#endif
if( (pPac->nPacketType == PT_READ && pPac->nRegType == MSPDATA_REG)||
(pPac->nPacketType == PT_READ && pPac->nRegType == SENDATA_REG)||
(pPac->nPacketType == PT_READ && pPac->nRegType == DKSDATA_REG)||
(pPac->nPacketType == PT_READ && pPac->nRegType == DKGDATA_REG) )
{
POSITION pos = pPac->varList.GetHeadPosition();
while(pos)
{
IdNo2* pIdNo = (IdNo2*)pPac->varList.GetNext(pos);
if(pIdNo->wNo == 34)
{
pIdNo->plcValue.byteVal = 0x01;
pIdNo->wQualities = 0xc0;
}
else
{
pIdNo->wQualities = 0xa0;
}
CoFileTimeNow(&pIdNo->ftTimeStamps);
}
return TRUE;
}
else
{
bPacSuc = FALSE;
return FALSE;
}
}
if(Readbuffer[0] == 0xd0)
{
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("再次发送命令包");
#endif
if (!Transmission(Readbuffer2, nSend2, nReceLen,pPac))
{
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("通讯数据错");
#endif
bPacSuc = FALSE;
return FALSE;
}
memset(Readbuffer, 0, sizeof(Readbuffer));
memcpy(Readbuffer,Readbuffer2,sizeof(Readbuffer2));
nSend = nSend2;
}
if(pPac->nRegType == MSPDATA_REG ||
pPac->nRegType == SENDATA_REG ||
pPac->nRegType == DKSDATA_REG ||
pPac->nRegType == DKGDATA_REG )
{
/* if(Readbuffer[10] == 0xdd)
{
nSend = nSend-13; //memcpy(pData, Readbuffer+3, sizeof(Readbuffer)-3);
memcpy(pData, Readbuffer+13, nSend);
}
else
{
nSend = nSend-10; //memcpy(pData, Readbuffer+3, sizeof(Readbuffer)-3);
memcpy(pData, Readbuffer+10, nSend);
}*/
nSend = nSend-7; //memcpy(pData, Readbuffer+3, sizeof(Readbuffer)-3);
memcpy(pData, Readbuffer+7, nSend);
}
else
{
//nSend = nSend-3; //memcpy(pData, Readbuffer+3, sizeof(Readbuffer)-3);
//memcpy(pData, Readbuffer+3, nSend);
memcpy(pData, Readbuffer, nSend);
}
#ifdef OUT_DEBUG_MESSAGE
memset(buf, 0, sizeof(buf));
strcpy(buf, " 有效数据:");
for (int j=0; j<nSend; j++)
{
itoa((BYTE)pData[j], buf+strlen(buf), 16);
strcat(buf + strlen(buf), " ");
}
ShowMessage(buf);
#endif
if (!CheckDigit(pPac, pData, nSend))
{
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("校验数据错");
#endif
CheckBuf[0] = 0xd0; CheckBuf[1] = 0xd0; CheckBuf[2] = 0xd0;
if( (pPac->nPacketType == PT_READ && pPac->nRegType == MSPDATA_REG)||
(pPac->nPacketType == PT_READ && pPac->nRegType == SENDATA_REG)||
(pPac->nPacketType == PT_READ && pPac->nRegType == DKSDATA_REG)||
(pPac->nPacketType == PT_READ && pPac->nRegType == DKGDATA_REG) )
{
POSITION pos = pPac->varList.GetHeadPosition();
while(pos)
{
IdNo2* pIdNo = (IdNo2*)pPac->varList.GetNext(pos);
if(pIdNo->wNo == 34)
{
pIdNo->plcValue.byteVal = 0x02;
pIdNo->wQualities = 0xc0;
}
else
{
pIdNo->wQualities = 0xa0;
}
CoFileTimeNow(&pIdNo->ftTimeStamps);
}
return TRUE;
}
else
{
bPacSuc = FALSE;
}
//校验错误不发任何数据
}
else
{
if(pPac->nRegType == ADAPTER_REG && pPac->nPacketType == PT_WRITE)
{
ID_NO2 *idNo2 = (ID_NO2*)pPac->varList.GetHead();
/**///int m_nTemp = 0;
int m_nTemp2 = 0;
/**///m_nTemp = (int)pPac->nSubType;
m_nTemp2 = pPac->nSubType*33+idNo2->wNo;
m_nHaveSensor[m_nTemp2] = idNo2->plcValue.byteVal;
/**///m_nSleepTime[m_nTemp] = (int)((m_nHaveSensor[m_nTemp*33]+18)*3*0.02)+5;
}
//校验正确发送0xdd
CheckBuf[0] = 0xdd; CheckBuf[1] = 0xdd; CheckBuf[2] = 0xdd;
bPacSuc = TRUE;
nClen = 3;
Transmission(CheckBuf, nClen, nClen,NULL);
}
//nClen = 3;
//Transmission(CheckBuf, nClen, nClen,0);
}
if (CheckBuf[0] == 0xd0 || !bPacSuc)
{
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("验证通讯错");
#endif
return FALSE;
}
if(PT_READ == pPac->nPacketType)
{
//获取最大检测器编号
if(pPac->nRegType == ADAPTER_REG)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -