📄 mydllpro.cpp
字号:
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 + -