📄 ca2ipro.cpp
字号:
int nOneLen = 0;
pStart[nLen++] = 0x66;
pStart[nLen++] = 0X27;//39;
pStart[nLen++] = 2;
pStart[nLen++] = (char)pPac->nSubType;
pStart[nLen++] = 0;
for(int i=1; i<33; i++)
{
if( i == pIdNo->wNo )
{
pStart[nLen++] = pIdNo->plcValue.byteVal;
if(pIdNo->plcValue.byteVal>0x01)
{
nOneNum++;
nOneVal = pIdNo->plcValue.byteVal;
}
}
else
{
int k = 0;
k = pPac->nSubType*33+i;
pStart[nLen++] = m_nHaveSensor[k];
if(m_nHaveSensor[k]>0x01)
{
nOneNum++;
nOneVal = m_nHaveSensor[k];
}
}
}
nOneLen = (nOneNum-1)*8 + GetOnePos((BYTE)nOneVal);
pStart[4] = nOneLen;
pStart[nLen++] = CRC_ADD(pStart, 37);
bRet = TRUE;
break;
}
case TOFF_REG ://关多路串口的自动轮询
pStart[nLen++] = 0x55;
pStart[nLen++] = 7;
pStart[nLen++] = 5;
pStart[nLen++] = 0xff;
pStart[nLen++] = 0xff;
pStart[nLen++] = CRC_ADD(pStart, 5);
bRet = TRUE;
break;
case TON_REG ://开多路串口的自动轮询
pStart[nLen++] = 0x55;
pStart[nLen++] = 7;
//pStart[nLen++] = 6;
if(pIdNo->plcValue.bitVal)
pStart[nLen++] = 6;
else
pStart[nLen++] = 5;
pStart[nLen++] = 0xff;
pStart[nLen++] = 0xff;
pStart[nLen++] = CRC_ADD(pStart, 5);
bRet = TRUE;
break;
default :
bRet = FALSE;
break;
}
} //end of Process Write Proc
if (bRet)
{
pStart[nLen++] = 0x68;
}
else
nLen = 0;
return bRet;
}
BOOL CCA2IPro::Transmission(BYTE *buf, int &nLen, int nReceLen,PPACKET pPac/*, int SleepTime*/)
{
DWORD dwError = 0;
COMSTAT cs;
ULONG nByteRead = 0, nSend = 0;
if (!WriteFile(m_hComm, buf, nLen, &nSend, NULL))
{
dwError = GetLastError();
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("发送数据失败");
#endif
return FALSE;
}
#ifdef OUT_DEBUG_MESSAGE
char strDisp[5000];
int j = 0;
memset(strDisp, 0, sizeof(strDisp));
strcpy(strDisp, "发送:");
for (j = 0; j < (int)nSend; j++)
{
itoa((BYTE)buf[j], strDisp+strlen(strDisp), 16);
strcat(strDisp + strlen(strDisp), " ");
}
ShowMessage(strDisp);
#endif
//LIJIANHONG 2002-7-28
if(buf[0] == 0xdd || buf[0] == 0xd0)
return TRUE;
Sleep(1200);
int nTime = 0;
//ljh delete 20030508
/* if(pPac != NULL)
{
//if(m_nMaxNo[pPac->nSubType] == 0)
// goto SLEEP_TIME;
#ifdef OUT_DEBUG_MESSAGE
char buf[128];
memset(buf, 0, sizeof(buf));
sprintf(buf, "延时处理:回路号-%d, 子站长度-%d", pPac->nSubType, m_nHaveSensor[pPac->nSubType*33]);
ShowMessage(buf);
#endif
switch(pPac->nRegType)
{//延时处理
case MSPDATA_REG:
{
///int nTime = (m_nSleepTime[SleepTime]+1)*1000;
m_nSleepTime[pPac->nSubType] = (int)((m_nHaveSensor[pPac->nSubType*33]*3*0.04)+1.08)+5+10;
///m_nSleepTime[pPac->nSubType] = (int)((m_nMaxNo[pPac->nSubType]*3*0.04)+1.08)+5;
nTime = (m_nSleepTime[pPac->nSubType]+1)*1000;
break;
}
case SENDATA_REG:
{
m_nSleepTime[pPac->nSubType] = (int)((m_nHaveSensor[pPac->nSubType*33]*3*0.04)+1.08)+5+10;
///m_nSleepTime[pPac->nSubType] = (int)((m_nMaxNo[pPac->nSubType]*3*0.04)+1.08)+5;
nTime = (m_nSleepTime[pPac->nSubType]+1)*1000;
break;
}
case DKSDATA_REG:
{
m_nSleepTime[pPac->nSubType] = (int)((m_nHaveSensor[pPac->nSubType*33]+18)*3*0.02)+5;
///m_nSleepTime[pPac->nSubType] = (int)((m_nMaxNo[pPac->nSubType]+18)*3*0.02)+5;
nTime = (m_nSleepTime[pPac->nSubType]+1)*1000;
break;
}
}
//SLEEP_TIME:
//Sleep(20000);
}
//Sleep(nTime);
//LIJIANHONG 2002-7-28
*/
//ljh delete 20030508
DWORD dwTimeOut = 0;
if(pPac != NULL)
{
if(pPac->nRegType == MSPDATA_REG ||
pPac->nRegType == SENDATA_REG ||
pPac->nRegType == DKSDATA_REG ||
pPac->nRegType == DKGDATA_REG )
{
dwTimeOut = GetTickCount() + 110*1000;//等待110秒 ljh modify 20030508
}
else
{
dwTimeOut = GetTickCount() + m_nTimeOut;
}
}
BYTE pData[1024];
nLen = 0;
while (TRUE)
{
if (GetTickCount() > dwTimeOut)
{
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("接收超时!");
#endif
return FALSE;
}
ClearCommError(m_hComm, &dwError, &cs);
if (cs.cbInQue)
{
if(cs.cbInQue >= 1023)
cs.cbInQue = 1024;
memset(pData, 0, sizeof(pData));
if (!ReadFile(m_hComm, pData, cs.cbInQue, &nByteRead, NULL))
{
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("接收数据失败");
#endif
return FALSE;
}
if((nLen+nByteRead)>=1024)
{
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("接收数据长度大于1024!");
#endif
return FALSE;
}
memcpy(buf+nLen, pData, nByteRead);
nLen += nByteRead;
if(pPac->nRegType == MULTISP_REG && pPac->nPacketType == PT_WRITE)
{
if ((nLen > 10 && buf[nLen-1] == 0x68) || (buf[0] == 0xd0) ||/* (buf[0] == 0xdd) || */(buf[0] == 0xaa) )
{
break;
}
}
else if(pPac->nRegType == ADAPTER_REG && pPac->nPacketType == PT_WRITE)
{
if ((nLen > 39 && buf[nLen-1] == 0x68) || (buf[0] == 0xd0) ||/* (buf[0] == 0xdd) || */(buf[0] == 0xaa) )
{
break;
}
}
else
{
if ((nLen > 7 && buf[nLen-1] == 0x68) || (buf[0] == 0xd0) ||/* (buf[0] == 0xdd) || */(buf[0] == 0xaa) )
{
break;
}
}
}
Sleep(WAIT_INTERVAL);
}
#ifdef OUT_DEBUG_MESSAGE
memset(strDisp, 0, sizeof(strDisp));
strcpy(strDisp, " 接收:");
for (j=0; j<nLen; j++)
{
itoa((BYTE)buf[j], strDisp+strlen(strDisp), 16);
strcat(strDisp + strlen(strDisp), " ");
}
ShowMessage(strDisp);
#endif
return TRUE; //not verified Data validate --left it to corresponding Block PROC
}
void ShowMessage( const char* msg)
{
ATOM msgAtom;
HWND hMessWnd = ::FindWindow( "kingmess", NULL);
if( hMessWnd)
{
unsigned short u_count = 0;
unsigned short out_len = 126;
char szMess[128];
memset(szMess, 0, sizeof(szMess));
u_count = strlen(msg);
if(u_count)
{
u_count = (u_count%out_len)?(u_count/out_len):(u_count/out_len-1);
for(int i=0; i<=u_count; i++)
{
memset(szMess, 0, sizeof(szMess));
strcpy(szMess," ");
strncpy( szMess+strlen(szMess), msg+i*out_len, min(out_len,strlen(msg+i*out_len)) );
szMess[out_len+1] = 0;
msgAtom = GlobalAddAtom( szMess );
ASSERT( msgAtom );
::SendMessage( hMessWnd, WM_MESSAGE_OUTPUT, (WPARAM)msgAtom, 0 );
GlobalDeleteAtom( msgAtom );
}
}
}
}
/*
void ShowMessage(const char *msg) // 显示通信信息
{
HWND hMessWnd = ::FindWindow( "kingmess", NULL);
char szMess[256];
memset(szMess, 0, sizeof(szMess));
ATOM messAtom;
if (hMessWnd)
{
strncpy(szMess, msg, min(255, strlen(msg)));
szMess[255] = 0;
messAtom = GlobalAddAtom(szMess);
//ASSERT(messAtom);
unsigned long messId = WM_MESSAGE_OUTPUT;
::SendMessage(hMessWnd, WM_MESSAGE_OUTPUT, (WPARAM)messAtom, 0);
GlobalDeleteAtom(messAtom);
}
}
*/
BOOL CCA2IPro::InitLoopNoAndNum()
{
/* for(int j=1; j<=32; j++)
{
if(j%2 == 0)
{
LoopNum[j] = 1;
}
else
{
LoopNum[j] = 1;
}
}
*/ BOOL bSuc = FALSE;
int nLoopNum = 0;
BYTE Loop1 = 0;
BYTE Loop2 = 0;
BYTE Loop3 = 0;
BYTE Loop4 = 0;
Loop1 = GetByte(LoopNum+1);
Loop2 = GetByte(LoopNum+9);
Loop3 = GetByte(LoopNum+17);
Loop4 = GetByte(LoopNum+25);
for(int i=1; i<=32; i++)
{
if(LoopNum[i] == 1)
nLoopNum++;
}
m_nSelectLoopNo[0] = nLoopNum;
m_nSelectLoopNo[1] = Loop1;
m_nSelectLoopNo[2] = Loop2;
m_nSelectLoopNo[3] = Loop3;
m_nSelectLoopNo[4] = Loop4;
BYTE buf[2048];
int nLen = 0;
memset(buf, 0, sizeof(buf));
buf[nLen++] = 0x55;
buf[nLen++] = 10;
buf[nLen++] = 3;
for(int k=0; k<5; k++)
{
buf[nLen++] = m_nSelectLoopNo[k];
}
//buf[nLen++] = 0xff;
buf[nLen++] = CRC_ADD(buf, 8);
buf[nLen++] = 0x68;
int nReceLen = 0;
if (!Transmission(buf, nLen, nReceLen,NULL))
{
bSuc = FALSE;
}
BYTE CheckBuf[1024];
memset(CheckBuf, 0, sizeof(CheckBuf));
if(buf[0] != 0xdd)
{
CheckBuf[0] = 0xd0; CheckBuf[1] = 0xd0; CheckBuf[2] = 0xd0;
bSuc = FALSE;
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("设置多路串口回路数失败");
#endif
}
else
{
CheckBuf[0] = 0xdd; CheckBuf[1] = 0xdd; CheckBuf[2] = 0xdd;
bSuc = TRUE;
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("设置多路串口回路数成功");
#endif
}
nLen = 3;
Transmission(CheckBuf, nLen, nLen,NULL);
return bSuc;
}
BYTE CCA2IPro::GetByte(BYTE *Val)
{
int nByteVal = 0;
for(int i=0; i<8; i++)
{
if(Val[i] == 1)
{
nByteVal += (BYTE)pow(2,(7-i));
}
}
return nByteVal;
}
void CCA2IPro::SetLoopNum(BYTE *pData)
{
/* pData[0] = 0x88;
pData[1] = 0x44;
pData[2] = 0x22;
pData[3] = 0x11;
*/
BYTE nConVal = 0;
BYTE nTemp = 0;
nConVal = pData[0];
for(int i=0; i<4; i++)
{
nConVal = pData[i];
for(int k=1; k<=8; k++)
{
nTemp = (BYTE)pow(2,(8-k));
if( (nConVal&nTemp) == nTemp )
{
LoopNum[i*8+k] = 1;
}
else
{
LoopNum[i*8+k] = 0;
}
}
}
}
BYTE CCA2IPro::GetData(char *pBuf, int nNo, int nRegType, int nLen)
{
BYTE bVal = 0;
//int strLen = strlen(pBuf);
int strLen = nLen;
#ifdef OUT_DEBUG_MESSAGE
char buf[128];
//memset(buf, 0, sizeof(buf));
//sprintf(buf, "数据长度=%d, 数据序号=%d.", nLen, nNo);
//ShowMessage(buf);
memset(buf, 0, sizeof(buf));
sprintf(buf, "数据长度=%d, 数据序号=%d.", strLen, nNo);
ShowMessage(buf);
#endif
if(strLen == 0 || nNo < 1)
{
#ifdef OUT_DEBUG_MESSAGE
memset(buf, 0, sizeof(buf));
ShowMessage("在解析数据时发现数据长度错误");
#endif
return 0;
}
WORD wData = 0;
char pData[1024];
memset(pData, 0, sizeof(pData));
//strcpy(pData, pBuf);
memcpy(pData, pBuf, strLen);
char pStr[2];
pStr[0] = pData[(nNo-1)*2+1];
pStr[1] = pData[(nNo-1)*2];
memcpy(&wData, pStr, 2);
for(int i=0; i<8; i++)
{
int nPow = 0;
switch(nRegType)
{
case MSPDATA_REG:
{
nPow = (int)pow(2, (15-2*i));
break;
}
case SENDATA_REG:
{
nPow = (int)pow(2, (15-2*i-1));
break;
}
default:
{
#ifdef OUT_DEBUG_MESSAGE
ShowMessage("在解析数据时发现寄存器类型错误");
#endif
return 0;
}
}
if( (wData&nPow) )
{
bVal = bVal + (BYTE)pow(2, (7-i));
}
}
return bVal;
}
BYTE CCA2IPro::GetOnePos(BYTE bVal)
{
BYTE nRet = 0;
BYTE nAndVal = 0;
for(int i=0; i<8; i++)
{
nAndVal = (BYTE)pow(2, i);
if( (nAndVal&bVal) == nAndVal)
{
nRet = 8-i;
break;
}
}
return nRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -