⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ca2ipro.cpp

📁 民航二所单片机驱动开发
💻 CPP
📖 第 1 页 / 共 4 页
字号:
{
    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 + -