📄 ca2ipro.cpp
字号:
int nSen = 0;
for(int k=0; k<32; k++)
{
if(pData[k+4] != 0)
nSen = k;
}
m_nMaxNo[pPac->nSubType] = (nSen+1)*8;
}
while (position)
{
ID_NO2 *idNo = (ID_NO2*)pPac->varList.GetNext(position);
switch (pPac->nRegType)
{
case MULTISP_REG :
idNo->plcValue.byteVal = pData[idNo->wNo+2];
m_nSelectLoopNo[idNo->wNo] = pData[idNo->wNo+2];
SetLoopNum(pData+3);
idNo->wQualities = 0xc0;
break;
case ADAPTER_REG :
{
int m_nTemp = 0;
m_nTemp = (int)pData[2];
/**///m_nSleepTime[m_nTemp] = (int)((pData[3]+18)*3*0.02)+5;//根据回路子站数计算
idNo->plcValue.byteVal = pData[idNo->wNo+3];
m_nTemp = m_nTemp*33+idNo->wNo;
m_nHaveSensor[m_nTemp] = pData[idNo->wNo+3];
idNo->wQualities = 0xc0;
break;
}
case MSPDATA_REG :
case SENDATA_REG :
{
BYTE nLoopNum = 0;
BYTE nRemainder = pData[3]%4;
if( nRemainder == 0)
nLoopNum = pData[3]/4;
else
nLoopNum = 1+( (pData[3]-nRemainder)/4 );
if(idNo->wNo == 0 )
{//数据有效判断码
idNo->plcValue.byteVal = pData[nSend-3];
m_bData0 = pData[nSend-3];
}
else if(idNo->wNo == 33)
{//子站长度
idNo->plcValue.byteVal = pData[3];
m_bData33 = pData[3];
}
else if(idNo->wNo == 34)
{
idNo->plcValue.byteVal = pData[nSend-3];
m_bData34 = pData[nSend-3];
}
else
{
if(idNo->wNo<=nLoopNum)
{//计算字站灯及检测器的数据
memset(m_nData, 0, sizeof(m_nData));
memcpy(m_nData, pData+4, nLoopNum);
#ifdef OUT_DEBUG_MESSAGE
memset(buf, 0, sizeof(buf));
sprintf(buf, " 回路%d数据%d:", pPac->nSubType, nLoopNum);
for (int j=0; j<nLoopNum; j++)
{
itoa((BYTE)m_nData[j], buf+strlen(buf), 16);
strcat(buf + strlen(buf), " ");
}
ShowMessage(buf);
#endif
idNo->plcValue.byteVal = GetData(m_nData, idNo->wNo, pPac->nRegType, nLoopNum);
//idNo->plcValue.byteVal = pData[idNo->wNo+3];
}
}
if(idNo->wNo == 34)
{
idNo->wQualities = 0xc0;
}
else if(idNo->wNo == 0)//(pData[nSend-3] == 0xC0 || idNo->wNo == 0 || idNo->wNo == 33)
{
if(pData[nSend-3] == 0xC0 || pData[nSend-3] == 0xCC)
{
idNo->wQualities = 0xc0;
}
else
{
idNo->wQualities = 0xa0;
}
}
else if(idNo->wNo == 33)
{
idNo->wQualities = 0xc0;
}
else
{
if(pData[nSend-3] == 0xC0)
{
idNo->wQualities = 0xc0;
}
else
{
idNo->wQualities = 0xa0;
}
}
if(idNo->wNo > nLoopNum && idNo->wNo != 33 && idNo->wNo != 34)
{
idNo->wQualities = 0xa0;
}
/* BYTE nLoopNum = 0;
BYTE nRemainder = pData[3]%8;
if( nRemainder == 0)
nLoopNum = pData[3]/8;
else
nLoopNum = 1+( (pData[3]-nRemainder)/8 );
if(idNo->wNo == 0 )
{
idNo->plcValue.byteVal = pData[nSend-3];
}
else if(idNo->wNo == 33)
{
idNo->plcValue.byteVal = pData[3];
}
else
{
if(idNo->wNo<=nLoopNum)
{
idNo->plcValue.byteVal = pData[idNo->wNo+3];
}
}
if(pData[nSend-3] == 0xC0 || idNo->wNo == 0 || idNo->wNo == 33)
{
idNo->wQualities = 0xc0;
}
else
{
idNo->wQualities = 0xa0;
}
if(idNo->wNo > nLoopNum && idNo->wNo != 33 )
{
idNo->wQualities = 0xa0;
}
*/ m_nLastLoopNum = pPac->nSubType;//ljh add 2002-11-26
m_nLastRegType = pPac->nRegType;//ljh add 2002-11-26
m_nLastDataLen = nLoopNum;//ljh add 2002-11-26
break;
}
case DKSDATA_REG:
case DKGDATA_REG:
{
BYTE nLoopNum = 0;
BYTE nRemainder = pData[3]%8;
if( nRemainder == 0)
nLoopNum = pData[3]/8;
else
nLoopNum = 1+( (pData[3]-nRemainder)/8 );
if(idNo->wNo == 0 )
{//数据有效判断码
idNo->plcValue.byteVal = pData[nSend-3];
}
else if(idNo->wNo == 33)
{//子站长度
idNo->plcValue.byteVal = pData[3];
}
else if(idNo->wNo == 34)
{
idNo->plcValue.byteVal = pData[nSend-3];
}
else
{//灯坑水数据
if(idNo->wNo<=nLoopNum)
{
idNo->plcValue.byteVal = pData[idNo->wNo+3];
}
}
if(idNo->wNo == 34)
{//无论何值都更新
idNo->wQualities = 0xc0;
}
else if(idNo->wNo == 0)//(pData[nSend-3] == 0xC0 || idNo->wNo == 0 || idNo->wNo == 33)
{//C0 CC 时更新,其他值不更新
if(pData[nSend-3] == 0xC0 || pData[nSend-3] == 0xCC)
{
idNo->wQualities = 0xc0;
}
else
{
idNo->wQualities = 0xa0;
}
}
else if(idNo->wNo == 33)
{//无论何值都更新
idNo->wQualities = 0xc0;
}
else
{//C0时更新,其他值不更新
if(pData[nSend-3] == 0xC0)
{
idNo->wQualities = 0xc0;
}
else
{
idNo->wQualities = 0xa0;
}
}
if(idNo->wNo > nLoopNum && idNo->wNo != 33 && idNo->wNo != 34)
{
idNo->wQualities = 0xa0;
}
break;
}
default :
break;
}
//idNo->wQualities = 0xc0;
CoFileTimeNow(&idNo->ftTimeStamps);
}
}
else
{
return TRUE;
}
return bPacSuc;
}
BOOL CCA2IPro::CheckDigit(PPACKET pPac, BYTE *buf, int nLen)
{
BOOL bRetval = RECEIVE_ERROR_RECEIVED;
int nDataLen = 0;
if(pPac->nPacketType == PT_WRITE)
{
if (nLen >= 3 && buf[0] == 0xaa)
bRetval = RECEIVE_RECEIVED;
else
bRetval = RECEIVE_ERROR_RECEIVED;
if(bRetval == RECEIVE_RECEIVED && pPac->nRegType == TON_REG)
{
IdNo2 *pIdNo = (IdNo2*)pPac->varList.GetHead();
if(pIdNo->plcValue.bitVal)
m_bOn = TRUE;
else
m_bOn = FALSE;
}
if(bRetval == RECEIVE_RECEIVED && pPac->nRegType == TOFF_REG)
m_bOn = FALSE;
}
if(pPac->nPacketType == PT_READ)
{
switch (pPac->nRegType)
{
case MULTISP_REG :
if (nLen >= 9 && buf[0] == 0xc3 && buf[8] == 0x68)
bRetval = RECEIVE_RECEIVED;
else
bRetval = RECEIVE_ERROR_RECEIVED;
break;
case ADAPTER_REG :
if (nLen >= 38 && buf[0] == 0xc9 && buf[37] == 0x68)
bRetval = RECEIVE_RECEIVED;
else
bRetval = RECEIVE_ERROR_RECEIVED;
break;
case MSPDATA_REG :
case SENDATA_REG :
{
BYTE nDataLen = 0;
BYTE nLoopNum = 0;
BYTE nRemainder = buf[3]%4;
if( nRemainder == 0)
nLoopNum = buf[3]/4;
else
nLoopNum = 1+( (buf[3]-nRemainder)/4 );
//nLoopNum = 2*nLoopNum;
nDataLen = buf[1];
if(nLen>= (7+nLoopNum) && buf[0] == 0x9c && buf[7+nLoopNum-1] == 0x68)
//if(nLen>= (7+nDataLen) && buf[0] == 0x9c && buf[7+nDataLen-1] == 0x68)
{
bRetval = RECEIVE_RECEIVED;
}
else
{
bRetval = RECEIVE_ERROR_RECEIVED;
}
break;
}
case DKSDATA_REG :
case DKGDATA_REG:
{
BYTE nDataLen = 0;
BYTE nLoopNum = 0;
BYTE nRemainder = buf[3]%8;
if( nRemainder == 0)
nLoopNum = buf[3]/8;
else
nLoopNum = 1+( (buf[3]-nRemainder)/8 );
//nLoopNum = 2*nLoopNum;
nDataLen = buf[1];
if(nLen>= (7+nLoopNum) && buf[0] == 0x7A && buf[7+nLoopNum-1] == 0x68)
//if(nLen>= (7+nDataLen) && buf[0] == 0x7A && buf[7+nDataLen-1] == 0x68)
{
bRetval = RECEIVE_RECEIVED;
}
else
{
bRetval = RECEIVE_ERROR_RECEIVED;
}
break;
}
default :
bRetval = RECEIVE_ERROR_RECEIVED;
break;
}
}
return bRetval;
}
BYTE CCA2IPro::CRC_ADD(BYTE *buf, int nLen)
{
BYTE bVal = 0;
for (int n=0; n<nLen; n++)
bVal += buf[n];
return bVal;
}
BOOL CCA2IPro::InitialComm(LPVOID pData)
{
ComDevice *pcc = (ComDevice *)pData;
m_nTimeOut = pcc->timeOut;
CString strComm;
strComm.Empty();
strComm.Format("\\\\.\\%s", pcc->deviceName);
HANDLE hComm = CreateFile(strComm, GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL /*| FILE_FLAG_OVERLAPPED*/, NULL);
if (INVALID_HANDLE_VALUE == hComm)
{
m_nLastErrorCode = FAILED_OPEN_COM;
return FALSE;
}
//Setup COM port.
SetupComm(hComm, 256, 256);
BYTE stopBits;
switch (pcc->stopBits)
{
case 1:
stopBits = 0;
break;
case 2:
stopBits = 2;
break;
default:
stopBits = 0;
}
DCB dcb;
GetCommState(hComm, &dcb);
dcb.BaudRate = (DWORD)pcc->baudRate;
dcb.ByteSize = (BYTE)pcc->dataBits;
dcb.StopBits = stopBits;
dcb.Parity = (BYTE)pcc->parity;
// dcb.fChEvt = TRUE;
// dcb.EvtChar = (char)0x0d;
if (!SetCommState(hComm, &dcb))
{
CloseHandle(hComm);
m_nLastErrorCode = COMMUNICATION_CONFIG_ERROR;
return FALSE;
}
//Set COM event mask.
DWORD flag = 0;
flag = EV_RXFLAG;
SetCommMask(hComm, flag | EV_BREAK);
// purge any information in the buffer
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 = 100;//2*CBR_9600/BAUDRATE( npTTYInfo ) ;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hComm, &CommTimeOuts);
m_hComm = hComm;
return TRUE;
}
BOOL CCA2IPro::GetSendString(PPACKET pPac, BYTE *buf, int &nLen, int &nReceLen)
{
BYTE *pStart = buf;
ID_NO2 *pIdNo = (ID_NO2*)pPac->varList.GetHead();
BOOL bRet = FALSE;
nLen = 0;
if (pPac->nPacketType == PT_READ)
{
switch(pPac->nRegType)
{
case MULTISP_REG ://查询多路串口参数
pStart[nLen++] = 0x55;
pStart[nLen++] = 7;
pStart[nLen++] = 1;
pStart[nLen++] = 0xff;
pStart[nLen++] = 0xff;
bRet = TRUE;
break;
case ADAPTER_REG ://查询通讯适配器的参数
pStart[nLen++] = 0x66;
pStart[nLen++] = 7;
pStart[nLen++] = 1;
//pStart[nLen++] = (char)pIdNo->wNo;
pStart[nLen++] = (char)pPac->nSubType;
pStart[nLen++] = 0xff;
bRet = TRUE;
break;
case MSPDATA_REG ://单回路子站灯数据查询
case SENDATA_REG ://单回路子站检测器数据查询
pStart[nLen++] = 0x66;
pStart[nLen++] = 7;
pStart[nLen++] = 4;
pStart[nLen++] = (char)pPac->nSubType;
pStart[nLen++] = 0xff;
bRet = TRUE;
break;
case DKSDATA_REG ://单回路灯坑水数据查询
pStart[nLen++] = 0x66;
pStart[nLen++] = 7;
pStart[nLen++] = 3;
pStart[nLen++] = (char)pPac->nSubType;
pStart[nLen++] = 0xff;
bRet = TRUE;
break;
case DKGDATA_REG://单回路灯坑盖数据查询
pStart[nLen++] = 0x66;
pStart[nLen++] = 7;
pStart[nLen++] = 5;
pStart[nLen++] = (char)pPac->nSubType;
pStart[nLen++] = 0xff;
bRet = TRUE;
break;
default :
bRet = FALSE;
break;
}
pStart[nLen++] = CRC_ADD(pStart, 5);
}
else //write===============================
{
switch (pPac->nRegType)
{
case MULTISP_REG ://设置多路串口回路数
{
pStart[nLen++] = 0x55;
pStart[nLen++] = 10;
pStart[nLen++] = 3;
for(int i=0; i<5; i++)
{
if( i == pIdNo->wNo )
{
pStart[nLen++] = pIdNo->plcValue.byteVal;
}
else
{
pStart[nLen++] = m_nSelectLoopNo[i];
}
}
//pStart[nLen++] = 0xff;
pStart[nLen++] = CRC_ADD(pStart, 8);
bRet = TRUE;
break;
}
case ADAPTER_REG : //设置通讯适配器的回路号
{
int nOneNum = 0;
int nOneVal = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -