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

📄 mydllpro.cpp

📁 组态王驱动sdk开发包,用于组态王驱动开发
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			else if(ret == RECEIVE_ERROR_RECEIVED)
			{
				bError = TRUE ;
				break;
			}				
		}//	if( pThis->PhysicalReceive( Readbuffer, nByteRead ) )
		
		if ( GetTickCount() > dwTimeOutTick )
		{
			//				TRACE(buffer);
			pThis->m_nLastErrorCode = ::GetLastError();
			//				TRACE( "\nFunction processpacket(read) :%s=%sTimeout  Error.\n",buffer,pData );
			//			TRACE( "Time:%d\n",pThis->m_nTimeOut);
			bTimeOut = TRUE;
			break;
		}
	}
	//		if(bTimeOut)
	//		{
	//			ShowMessage("超时错误");
	//			return   FALSE;
	//		}		

	//数据已收完或超时退出。
	bPacSuc =!( bTimeOut||bError);

	if(PT_READ == pPac->nPacketType)
	{
		char  temp[16];		

		if(bPacSuc)		// 处理数据 (读数据)
		{
			position = pPac->varList.GetHeadPosition();			

			int nCount = pPac->varList.GetCount();
			for(int n=0;n<nCount;n++)
			{
				idNo = (ID_NO*)(pPac->varList.GetNext/*At*/(position));

				memset(temp,0,sizeof(temp));	

				int j = 0;

				for(int i=0;i<4;i++)
				{
					if((pData[idNo->wNo * 4 + i] >= 'a') && (pData[idNo->wNo * 4 + i] <= 'j'))
					{
						temp[i+j] = pData[idNo->wNo * 4 + i] - 'a' + '0';
						j++;
						temp[i+j] = '.';
						
					}
					else
					{
						temp[i+j] = pData[idNo->wNo * 4 + i];
					}
				}
				sscanf( temp,"%f",&idNo->plcValue.floatVal);
			}
		}//	if(bPacSuc)		// 处理数据 (读数据)
		else
		{
			//读数据失败
			if(bTimeOut)			
			{
				pThis->m_nLastErrorCode = USER_TIMEOUT_EEROR; 
				return  FALSE;
			}			
			else//(bError)			
			{
				pThis->m_nLastErrorCode = USER_RECEIVE_ERROR_DATA; 
				return  FALSE;
			}			
		}//	Error.
	}//	if(PT_READ == pPac->nPacketType)以上为读数据的处理段。
	else//写数据
	{
		pThis->m_nLastErrorCode = DONOT_WRITE; 
		return  FALSE;
	}	
	return  TRUE;
}

WORD	MYDLLPro::MyConvert( LPVOID lpDbItem, LPVOID lpVar,
								 LPVOID lRegInfos ,int reg_type_num)
{
	MINIDBITEM * pDbItem = (MINIDBITEM *)lpDbItem;
	PLCVAR *pPlcVar = (PLCVAR *) lpVar;
	REG_INFO *gsRegInfos = (REG_INFO *)lRegInfos;
	char buf[128];
	BYTE bError = 0;	
	
	memset( buf, 0, sizeof(buf) );
	strcpy(buf,pDbItem->szRegister);
//	_strupr(buf);                   
	
	char  *pChar = buf;
	char  *pdest;
	//过滤掉寄存器名前后的空格
	while( *pChar == ' ' && (pChar-buf) < 32 )
	     pChar ++;
	int nLen = strlen(pChar);
	if( nLen == 0 )
	{
		m_nLastErrorCode = USER_REGNAME_C_ERROR;         //寄存器名错误
		return 1; 
	}
		
	while( nLen > 0 && pChar[nLen-1] == ' '){
			pChar[nLen-1] = 0;
			nLen--;
	}

	int  nRegType = -1;
	do{
		nRegType++;
		pdest = strstr(pChar,gsRegInfos[nRegType].sRegName);
		if( pdest == pChar )
		{
			//以下判断pChar后是否数字,在nLowIndex,nUpperIndex之间否。
			ASSERT( gsRegInfos[nRegType].nLowIndex <= gsRegInfos[nRegType].nUpperIndex );
			pPlcVar->nNo = 0;
	
			if( gsRegInfos[nRegType].nLowIndex <= gsRegInfos[nRegType].nUpperIndex )
			{
				int regLen = strlen(gsRegInfos[nRegType].sRegName);
				char pTmp[10];	//存放pChar后部分的数字
				memset( pTmp, 0, sizeof(pTmp) );
				strcpy( pTmp,pChar+regLen );
			
				int i = 0;    	   
				bError = FALSE;
				
				while( *(pTmp + i ) != 0x0 )
				{
					if((*(pTmp + i ) < '0')||(*(pTmp + i ) > '9'))
					{
						bError = 1;
						break;
					}
					i++;
				}
				if(*(pTmp) == 0x0)
					bError = 1;					
				
				if(bError == 1)
				{
					m_nLastErrorCode =  USER_REG_DECIMAL;         //"寄存器后应加十进制数字,\n 范围0-15!",	
					return 1; 
				}								
//				if(bError == 2)
//				{
//					m_nLastErrorCode =  USER_REG_DATA;         //"寄存器后应加数字!",	
//					return 1; 
//				}

				int  nNo = 0;
				sscanf( pTmp,"%u",&nNo);

				if( ( nNo < gsRegInfos[nRegType].nLowIndex||nNo >gsRegInfos[nRegType].nUpperIndex)) 
				{
					m_nLastErrorCode =  USER_REG_DECIMAL;         //"寄存器后应加十进制数字,\n 范围0-15!"	
					return 1; 					
				}
				else
				{//成功
					pPlcVar ->nRegType = nRegType;					
					pPlcVar -> nNo = nNo;					
					pPlcVar -> pszRegName = gsRegInfos[nRegType].sRegName;
				}//else//成功
			
				//只有:寄存器名字正确,且数字在范围内,才能执行到此行。
				if( pDbItem->nDataType & gsRegInfos[nRegType].wDataType )
				{
					if(pDbItem->nDataType == FLOAT_DATATYPE)
					{
						pPlcVar->nDataType = pDbItem->nDataType;
						return 0;
					}
					else
					{
						m_nLastErrorCode =  USER_FLOATDATA;         //应选FLOAT
						return 1;
					}
										
				}			
				else
				{				
					m_nLastErrorCode =  USER_FLOATDATA;         //应选FLOAT
					return 1;				
				}				
			}
			else
			{
				m_nLastErrorCode = USER_REG_DECIMAL;        //寄存器越界
				return 1; 
			}				
		}		//if(  pdest == pChar )匹配
	}while( nRegType < reg_type_num-1 );
	
	m_nLastErrorCode =  USER_REGNAME_C_ERROR;         //寄存器名错误
	return 1;	//查找完所有寄存器名都不匹配。
}

void MYDLLPro::GetSendString(PPACKET pPac,
			char * buf, int&  nLen)//,LPVOID lRegInfos)
{
	/*******************************************************/
	//	Change your source code here
	/*******************************************************/

	nLen = 0;
    
	ASSERT(pPac->nUnitNo>=0);

    char buffer[256];
	char addr[100];
	char   checkaddresult;
	char   H_checkaddresult;
	char   L_checkaddresult;

	memset(buffer, 0, sizeof(buffer));
	memset(addr, 0, sizeof(addr));		
		
	POSITION  position = pPac->varList.GetHeadPosition();
	ID_NO *idNo = (ID_NO*)(pPac->varList.GetNext(position));	

	buf[0] = (char)pPac->nUnitNo;
	buf[1] = 'd';

	checkaddresult = CheckADD(buf, 2);
	H_checkaddresult = (checkaddresult >> 4) & 0x0f;
	L_checkaddresult = checkaddresult & 0x0f;

	if(H_checkaddresult > 9)
		buf[2] = H_checkaddresult - 10 + 'a';
	else
		buf[2] = H_checkaddresult + '0';

	if(L_checkaddresult > 9)
		buf[3] = L_checkaddresult - 10 + 'a';
	else
		buf[3] = L_checkaddresult + '0';	
	
	buf[4] = (char)0x0d;
	buf[5] = 0;

	nLen = 5;
}
// Function name	: CSR73aProto::PhysicalSend
// Description	    : 从串口发送数据。
// Return type		: int :成功发送数据个数(in byte)。
//						失败则为-1。
// Argument         : char * buf:发送数据缓冲区。
// Argument         : int nLen:发送数据长度。
int MYDLLPro::PhysicalSend(char * buf, int nLen)
{
    if ( nLen <=0 )
		return -1;
//	char *pData = new char[nLen+2];
	char pData1[256];
	memcpy( pData1, buf, nLen );
	pData1[nLen] = 0;

    ULONG nSend = 0;
	if(!WriteFile(m_hComm, pData1, nLen, &nSend, NULL))
	{
//		
//		
		m_nLastErrorCode = GetLastError();
		return -1;
	}

/*#ifdef  _DEBUG
	pData1[nLen] = 0;
#endif*/	
//	TRACE("\n");
//	TRACE("\n");
//	TRACE("Physical send true!\n");

    return  (int)nSend;
}

BOOL MYDLLPro::InitialComm( LPVOID pData )
{
	struct ComDevice *pcd = (ComDevice *)pData;

	m_nTimeOut = pcd->timeOut;

	//Open COM prot.
	HANDLE hComm = CreateFile( pcd->deviceName, GENERIC_READ | GENERIC_WRITE, 0, 
				NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL /*| FILE_FLAG_OVERLAPPED*/, NULL );
	if ( INVALID_HANDLE_VALUE==hComm )
	{
		TRACE( "Error in open COM port: .\n", pcd->deviceName );
		return FALSE;
	}

	//Setup COM port.
	SetupComm( hComm, RX_QUEU, TX_QUEU );
	
	BYTE stopbits;
	switch ( pcd->stopBits )
	{
		case 1:
			stopbits = 0;
			break;
		case 2:
			stopbits = 2;
			break;
		default:
			stopbits = 0;
	}

	DCB dcb;
	GetCommState( hComm, &dcb );
	dcb.BaudRate = (WORD)pcd->baudRate;
	dcb.ByteSize = (BYTE)pcd->dataBits;
	dcb.StopBits = stopbits;//(BYTE)pcc->bByteSize;
	dcb.Parity   = (BYTE)pcd->parity;

	if ( !SetCommState( hComm, &dcb ) )
	{
		CloseHandle( hComm );
		TRACE( "Error in SetCommDcb.\n" );
		ASSERT( FALSE );
		return FALSE;
	}

	//Set COM event mask.
	DWORD flag;

	flag = EV_RXCHAR;
	SetCommMask( hComm, flag|EV_BREAK );

//Setup COM timeout
    PurgeComm( hComm, PURGE_TXABORT | PURGE_RXABORT |
                                      PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
    // set up for Non_blocking IO.
	COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
    CommTimeOuts.ReadTotalTimeoutConstant = 0 ;
    // CBR_9600 is approximately 1byte/ms. For our purposes, allow
    // double the expected time per character for a fudge factor.
    CommTimeOuts.WriteTotalTimeoutMultiplier = 5;//2*CBR_9600/BAUDRATE( npTTYInfo ) ;
    CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
    SetCommTimeouts( hComm, &CommTimeOuts ) ;

	m_hComm = hComm;
	return  TRUE;
}

int MYDLLPro::PreProcessData(PPACKET pPac, char *pData, int  nRecLen, int& nByteRead)
{
	char   checkaddresult;
	char   H_checkaddresult;
	char   L_checkaddresult;
	
	if(pData[nRecLen - 1] != (char)0x0d)
		return RECEIVE_ERROR_RECEIVED ;

	checkaddresult = CheckADD(pData, 64);
	H_checkaddresult = (checkaddresult >> 4) & 0x0f;
	L_checkaddresult = checkaddresult & 0x0f;

	if(H_checkaddresult > 9)
		H_checkaddresult = H_checkaddresult - 10 + 'a';
	else
		H_checkaddresult = H_checkaddresult + '0';

	if(L_checkaddresult > 9)
		L_checkaddresult = L_checkaddresult - 10 + 'a';
	else
		L_checkaddresult = L_checkaddresult + '0';	

	if(pData[nRecLen - 3] != H_checkaddresult)
		return RECEIVE_ERROR_RECEIVED ;
	if(pData[nRecLen - 2] != L_checkaddresult)
		return RECEIVE_ERROR_RECEIVED ;
	
	return RECEIVE_RECEIVED;
}

BYTE MYDLLPro::CheckADD(char* pData, int nLen)
{   
	BYTE checkSum = (BYTE)*pData;

	for(int i=1; i<nLen; i++)
		checkSum += (BYTE)pData[i];
    
	return checkSum;
}

BOOL String2FLOAT(char* str,float& f)
{
	BOOL bSign1,bSign2 ;
	bSign1 = (str[0]&0x80)?1:0 ;
	bSign2 = (str[0]&0x40)?1:0 ;
	LONG nNum ;
	float temp = 0 ;
	int i;
	for(i=3;i>0;i--)
	{
		temp += (BYTE)str[i] ;
		temp /= 256 ;
	}
	nNum = str[0]&0x3F ;
	if(bSign2)
		nNum = -nNum ;
	f = (float)pow(2,nNum) ;
	f *= temp ;
	if(bSign1)
		f = -f ;
	return TRUE ;
}

#ifdef   TEST_ShowMessage 
void ShowMessage( const char* msg)  // 显示通信信息
{
     HWND hMessWnd = ::FindWindow( "kingmess", NULL);
     char szMess[128];
	 
     ATOM messAtom;
	 if( hMessWnd){
         strncpy( szMess, msg,min(127,strlen(msg)) );              
		 szMess[127] = 0;
         messAtom = GlobalAddAtom( szMess );
		 ASSERT( messAtom );
		 unsigned long messId = WM_MESSAGE_OUTPUT;
		 ::SendMessage( hMessWnd, WM_MESSAGE_OUTPUT, (WPARAM)messAtom, 0 );
		 GlobalDeleteAtom( messAtom );
	 }
}
// *********    wxj  add    *********

// 函数名称 : ConVertBufToShowMessage
// 函数说明 :  将一个缓冲区BufAfterConVert中的16进制数转换成ASCII码后,放入BufAfterConVert
// 返回值   : BYTE:返回BCD的低字节
// 参数     : char * BufBeforeConVert: 需要转换缓冲区指针
// 参数     : char * BufAfterConVert:存放转换结果的缓冲区指针
// 参数     : int ConVertlong  需要转换的字符长度,最多转换50个字节

void ConVertBufToShowMessage(char * BufBeforeConVert, char * BufAfterConVert, int ConVertlong)
{
	ASSERT(ConVertlong < 50);

	for(int i = 0; i < ConVertlong; i++)
	{
		if((((BufBeforeConVert[i] >> 4) & 0x0f) >= 0) && (((BufBeforeConVert[i] >> 4) & 0x0f) <= 9))
			BufAfterConVert[2 * i] = ((BufBeforeConVert[i] >> 4) & 0x0f) + '0';
		else if((((BufBeforeConVert[i] >> 4) & 0x0f) >= 10) && (((BufBeforeConVert[i] >> 4) & 0x0f) < 16))
			BufAfterConVert[2 * i] = ((BufBeforeConVert[i] >> 4) & 0x0f) + 'A' - 10;

		if(((BufBeforeConVert[i] & 0x0f) >= 0) && ((BufBeforeConVert[i] & 0x0f) <= 9))
			BufAfterConVert[2 * i + 1] = (BufBeforeConVert[i] & 0x0f) + '0';
		else if(((BufBeforeConVert[i] & 0x0f) >= 10) && ((BufBeforeConVert[i] & 0x0f) < 16))
			BufAfterConVert[2 * i + 1] = (BufBeforeConVert[i] & 0x0f) + 'A' - 10 ;	
	}
	BufAfterConVert[ConVertlong * 2] = 0;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -