#include "StdAfx.h" #include #include #include "So7_TCPIP_Server.h" const int WSA_MAJOR_VERSION = 1; const int WSA_MINOR_VERSION = 1; #define WSA_VERSION MAKEWORD(WSA_MAJOR_VERSION, WSA_MINOR_VERSION) #define SOCKADDR_LEN sizeof(SOCKADDR_IN) const BYTE CommHeader[]={0x46,0x49,0x4E,0x53}; const BYTE HandShaking[]={0X46,0X49,0X4E,0X53,0X00,0X00,0X00,0X10,0X00,0X00,0X00,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X05}; const BYTE DRW_SData[]={0X46,0X49,0X4E,0X53,0X00,0X00,0X00,0X16,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X00,0XC0,0X00,0X02,0X00,0X03,0X00,0X00,0X05,0X00,0XFF,0X01,0X01,0X00,0X00}; const int DRW_SDataIndexDataSize1=6; const int DRW_SDataIndexDataSize2=7; const int DRW_SDataHeadDataSize=8; const int DRW_SDataIndexData=30; const int DRW_RDataIndexDA1=20; const int DRW_RDataIndexSA1=23; const int DRW_RDataIndexCMD1=26; const int DRW_RDataIndexCMD2=27; const int DRW_RDataIndexAddr1=29; const int DRW_RDataIndexAddr2=30; const int DRW_RDataIndexCh1=32; const int DRW_RDataIndexCh2=33; const int DRW_RDataIndexData=34; const int DRW_RDataCCLen=0x1A; const int DRW_RSDataIndexBufSize1=6; const int DRW_RSDataIndexBufSize2=7; struct_so7_tcpip_buff CSo7_TCPIP_Server::m_TCPIPBuf[lChannelSize]; s_tcpip_state CSo7_TCPIP_Server::m_TCPIPServerState; HANDLE CSo7_TCPIP_Server::m_Thread_Id=NULL; HANDLE CSo7_TCPIP_Server::m_Thread_Mutex=NULL; HANDLE CSo7_TCPIP_Server::m_MultiThread_Mutex=NULL; int CSo7_TCPIP_Server::m_Thread_State=TCPIP_THREAD_PAUSED; WSAEVENT CSo7_TCPIP_Server::m_SocketEvents[WSA_MAXIMUM_WAIT_EVENTS] = { NULL }; SOCKET CSo7_TCPIP_Server::m_ClientSocket[WSA_MAXIMUM_WAIT_EVENTS] = { NULL }; int CSo7_TCPIP_Server::m_nClients = 0; //================================================================ CSo7_TCPIP_Server::CSo7_TCPIP_Server() { m_hMsgWnd=NULL; m_ServerStarted=FALSE; m_Socket=INVALID_SOCKET; m_SreverIPAddress.S_un.S_un_b.s_b1=127; m_SreverIPAddress.S_un.S_un_b.s_b2=0; m_SreverIPAddress.S_un.S_un_b.s_b3=0; m_SreverIPAddress.S_un.S_un_b.s_b4=1; m_iServerPortNumber=static_cast(0); for (int i=0;i(0); for (int i=0;ih_addr_list[0],sizeof(in_addr)); _IPAddress=m_SreverIPAddress; first = FALSE; } _IPAddress=m_SreverIPAddress; return TRUE; } //================================================================ BOOL CSo7_TCPIP_Server::CreateAndListen() { if(m_Socket == INVALID_SOCKET) ::closesocket(m_Socket); // 创建套节字 m_Socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(m_Socket == INVALID_SOCKET) return FALSE; // 填写要关联的本地地址 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(m_iServerPortNumber); sin.sin_addr.s_addr = INADDR_ANY; // 绑定端口 if(::bind(m_Socket, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR) { return FALSE; } // 设置socket为窗口通知消息类型 //::WSAAsyncSelect(m_Socket, m_hMsgWnd, WM_SOCKET, FD_ACCEPT|FD_CLOSE); WSAEVENT m_SocketEvent = ::WSACreateEvent(); ::WSAEventSelect(m_Socket, m_SocketEvent, FD_ACCEPT|FD_CLOSE); m_SocketEvents[m_nClients] = m_SocketEvent; m_ClientSocket[m_nClients] = m_Socket; m_nClients++; // 进入监听模式 ::listen(m_Socket, 5); Create_Thread(); return TRUE; } //================================================================ void CSo7_TCPIP_Server::Create_Thread() { if (!m_Thread_Id) { m_Thread_State = TCPIP_THREAD_RUNNING; m_Thread_Id = CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)m_Thread,(LPVOID)this,0,NULL); m_Thread_Mutex = CreateMutex(NULL,FALSE,NULL); m_MultiThread_Mutex = CreateMutex(NULL,FALSE,NULL); } } //================================================================ void CSo7_TCPIP_Server::Exit_Thread() { m_Thread_State = TCPIP_THREAD_EXIT; for (int i = 0; i < m_nClients; i++) { ::WSASetEvent(m_SocketEvents[i]); } if(m_Thread_Id) { DWORD dwCode = STILL_ACTIVE; while(dwCode == STILL_ACTIVE) { GetExitCodeThread(m_Thread_Id,&dwCode); Sleep(1); } } m_Thread_State = TCPIP_THREAD_EXIT; ReleaseMutex(m_Thread_Mutex); CloseHandle(m_Thread_Mutex); ReleaseMutex(m_MultiThread_Mutex); CloseHandle(m_MultiThread_Mutex); m_Thread_Id=NULL; } //================================================================ unsigned __stdcall CSo7_TCPIP_Server::m_Thread(LPVOID pThis) { CSo7_TCPIP_Server* _This = (CSo7_TCPIP_Server*)pThis; for(;;) { if(m_Thread_State == TCPIP_THREAD_EXIT) ExitThread(0); switch(m_Thread_State) { case TCPIP_THREAD_RUNNING: { // 在所有事件对象上等待 int nIndex = ::WSAWaitForMultipleEvents(m_nClients, m_SocketEvents, FALSE, WSA_INFINITE, FALSE); // 对每个事件调用WSAWaitForMultipleEvents函数,以便确定它的状态 nIndex = nIndex - WSA_WAIT_EVENT_0; { int i=nIndex; // 获取到来的通知消息,WSAEnumNetworkEvents函数会自动重置受信事件 WSANETWORKEVENTS event; ::WSAEnumNetworkEvents(m_ClientSocket[i], m_SocketEvents[i], &event); if (event.lNetworkEvents & FD_ACCEPT) // 处理FD_ACCEPT通知消息 { _This->OnSocket(m_ClientSocket[i], FD_ACCEPT); } else if (event.lNetworkEvents & FD_CONNECT) // 处理FD_ACCEPT通知消息 { _This->OnSocket(m_ClientSocket[i], FD_CONNECT); } else if (event.lNetworkEvents & FD_READ) // 处理FD_READ通知消息 { _This->OnSocket(m_ClientSocket[i], FD_READ); } else if (event.lNetworkEvents & FD_CLOSE) // 处理FD_CLOSE通知消息 { _This->OnSocket(m_ClientSocket[i], FD_CLOSE); } else if (event.lNetworkEvents & FD_WRITE) // 处理FD_WRITE通知消息 { _This->OnSocket(m_ClientSocket[i], FD_WRITE); } } break; } case TCPIP_THREAD_PAUSED: { break; } case TCPIP_THREAD_EXIT: { ExitThread(0); break; } } }; m_Thread_State=TCPIP_THREAD_EXIT; ExitThread(0); } //================================================================ BOOL CSo7_TCPIP_Server::AddClient(SOCKET s) { if(m_nClients < WSA_MAXIMUM_WAIT_EVENTS) { WSAEVENT _SocketEvent = ::WSACreateEvent(); ::WSAEventSelect(s, _SocketEvent, FD_READ|FD_WRITE|FD_CLOSE); m_SocketEvents[m_nClients] = _SocketEvent; m_ClientSocket[m_nClients] = s; m_nClients++; return TRUE; } return FALSE; } //================================================================ void CSo7_TCPIP_Server::RemoveClient(SOCKET s) { BOOL bFind = FALSE; int i(0); for(i=0; i=MAX_DM_PAGE_NUMBER) { _DataSize=MAX_DM_PAGE_NUMBER-_StartAddr; } #ifdef PLC_KEYENCE for(int i=0;i<_DataSize;i++) { int iBufSize=strlen(m_TCPIPBuf[CH_SEND]._buffer); sprintf_s(&m_TCPIPBuf[CH_SEND]._buffer[iBufSize],TCPIP_MAX_BUFF_SIZE-iBufSize,"%05u ",(unsigned short)DM200[_StartAddr+i]); } int iBufSize=strlen(m_TCPIPBuf[CH_SEND]._buffer); m_TCPIPBuf[CH_SEND]._buffer[iBufSize-1]=0x0D; m_TCPIPBuf[CH_SEND]._buffer[iBufSize++]=0x0A; m_TCPIPBuf[CH_SEND]._buffer[iBufSize]=0x00; m_TCPIPBuf[CH_SEND]._size=iBufSize; #else for (int i=0;i<_DataSize;i++) { sData=DM200[_StartAddr+i]; m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=(sData>>8) & 0x0ff; m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=sData & 0x0ff; } short sDataSize(0); sDataSize=(DRW_SDataIndexData-DRW_SDataHeadDataSize+_DataSize*2); m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize1]=static_cast((sDataSize>>8) & 0x0ff); m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize2]=static_cast(sDataSize & 0x0ff); m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_DataSize*2; #endif SendBuffer(); return TRUE; } //================================================================ BOOL CSo7_TCPIP_Server::Response_PLC_DM5000_R(short _StartAddr,short _DataSize) { if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET) { return FALSE; } m_ClearSendBuf(); _StartAddr-=5000; if ((_StartAddr+_DataSize)>=MAX_DM_PAGE_NUMBER) { _DataSize=MAX_DM_PAGE_NUMBER-_StartAddr; } #ifdef PLC_KEYENCE for(int i=0;i<_DataSize;i++) { int iBufSize=strlen(m_TCPIPBuf[CH_SEND]._buffer); sprintf_s(&m_TCPIPBuf[CH_SEND]._buffer[iBufSize],TCPIP_MAX_BUFF_SIZE-iBufSize,"%05u ",(unsigned short)DM5000[_StartAddr+i]); } int iBufSize=strlen(m_TCPIPBuf[CH_SEND]._buffer); m_TCPIPBuf[CH_SEND]._buffer[iBufSize-1]=0x0D; m_TCPIPBuf[CH_SEND]._buffer[iBufSize++]=0x0A; m_TCPIPBuf[CH_SEND]._buffer[iBufSize]=0x00; m_TCPIPBuf[CH_SEND]._size=iBufSize; #else memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData)); for (int i=0;i<_DataSize;i++) { sData=DM5000[_StartAddr+i]; m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=(sData>>8) & 0x0ff; m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=sData & 0x0ff; } short sDataSize(0); sDataSize=(DRW_SDataIndexData-DRW_SDataHeadDataSize+_DataSize*2); m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize1]=static_cast((sDataSize>>8) & 0x0ff); m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize2]=static_cast(sDataSize & 0x0ff); m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_DataSize*2; #endif SendBuffer(); return TRUE; } //================================================================ BOOL CSo7_TCPIP_Server::Response_PLC_DM20000_R(short _StartAddr,short _DataSize) { if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET) { return FALSE; } m_ClearSendBuf(); unsigned long lStartAddr=static_cast(_StartAddr-20000); if ((lStartAddr+_DataSize)>=MAX_DM_PAGE_NUMBER) { lStartAddr=MAX_DM_PAGE_NUMBER-lStartAddr; } #ifdef PLC_KEYENCE for(int i=0;i<_DataSize;i++) { int iBufSize=strlen(m_TCPIPBuf[CH_SEND]._buffer); sprintf_s(&m_TCPIPBuf[CH_SEND]._buffer[iBufSize],TCPIP_MAX_BUFF_SIZE-iBufSize,"%05u ",(unsigned short)DM10000[lStartAddr+i]); } int iBufSize=strlen(m_TCPIPBuf[CH_SEND]._buffer); m_TCPIPBuf[CH_SEND]._buffer[iBufSize-1]=0x0D; m_TCPIPBuf[CH_SEND]._buffer[iBufSize++]=0x0A; m_TCPIPBuf[CH_SEND]._buffer[iBufSize]=0x00; m_TCPIPBuf[CH_SEND]._size=iBufSize; #else memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData)); for (int i=0;i<_DataSize;i++) { sData=DM10000[_StartAddr+i]; m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=(sData>>8) & 0x0ff; m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=sData & 0x0ff; } short sDataSize(0); sDataSize=(DRW_SDataIndexData-DRW_SDataHeadDataSize+_DataSize*2); m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize1]=static_cast((sDataSize>>8) & 0x0ff); m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize2]=static_cast(sDataSize & 0x0ff); m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_DataSize*2; #endif SendBuffer(); return TRUE; } //================================================================ BOOL CSo7_TCPIP_Server::Response_PLC_DM10000_R(short _StartAddr,short _DataSize) { if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET) { return FALSE; } m_ClearSendBuf(); _StartAddr-=10000; if ((_StartAddr+_DataSize)>=MAX_DM_PAGE_NUMBER) { _DataSize=MAX_DM_PAGE_NUMBER-_StartAddr; } #ifdef PLC_KEYENCE for(int i=0;i<_DataSize;i++) { int iBufSize=strlen(m_TCPIPBuf[CH_SEND]._buffer); sprintf_s(&m_TCPIPBuf[CH_SEND]._buffer[iBufSize],TCPIP_MAX_BUFF_SIZE-iBufSize,"%05u ",(unsigned short)DM10000[_StartAddr+i]); } int iBufSize=strlen(m_TCPIPBuf[CH_SEND]._buffer); m_TCPIPBuf[CH_SEND]._buffer[iBufSize-1]=0x0D; m_TCPIPBuf[CH_SEND]._buffer[iBufSize++]=0x0A; m_TCPIPBuf[CH_SEND]._buffer[iBufSize]=0x00; m_TCPIPBuf[CH_SEND]._size=iBufSize; #else memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData)); for (int i=0;i<_DataSize;i++) { sData=DM10000[_StartAddr+i]; m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=(sData>>8) & 0x0ff; m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=sData & 0x0ff; } short sDataSize(0); sDataSize=(DRW_SDataIndexData-DRW_SDataHeadDataSize+_DataSize*2); m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize1]=static_cast((sDataSize>>8) & 0x0ff); m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize2]=static_cast(sDataSize & 0x0ff); m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_DataSize*2; #endif SendBuffer(); return TRUE; } //================================================================ BOOL CSo7_TCPIP_Server::RESPONSE_PLC_DM36000_R(short _StartAddr,short _DataSize) { if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET) { return FALSE; } m_ClearSendBuf(); short DM36000[100]={0}; int m_CCDData_D36000[20]={0}; int iDataNumber(1); int Index(0); for (int iFix=0;iFix<2;iFix++) { m_CCDData_D36000[Index++]=(0xA001+iFix)*1000; double dRand(0.0); if(iDataNumber>0) m_CCDData_D36000[Index++]=iDataNumber*1000; double dRandMin=0.0; double dRandMax=1.0; static int iTestCnts=0; iTestCnts++; for (int ii=0;ii(dRand*1000); } } m_CCDData_D36000[0]=(Index)*1000; int iData(0); BYTE DM_Data[4]={0,0,0,0}; int StartAddr(0); for (int i=0;i<20;i++) { iData=m_CCDData_D36000[i]; DM_Data[0]=(iData>>24) & 0x0ff; DM_Data[1]=(iData>>16) & 0x0ff; DM_Data[2]=(iData>>8) & 0x0ff; DM_Data[3]=iData & 0x0ff; DM36000[StartAddr+2*i]=(DM_Data[2]<<8)+DM_Data[3]; DM36000[StartAddr+2*i+1]=(DM_Data[0]<<8)+DM_Data[1]; } _StartAddr-=36000; if ((_StartAddr+_DataSize)>=MAX_DM_PAGE_NUMBER) { _DataSize=MAX_DM_PAGE_NUMBER-_StartAddr; } for(int i=0;i<_DataSize;i++) { int iBufSize=strlen(m_TCPIPBuf[CH_SEND]._buffer); sprintf_s(&m_TCPIPBuf[CH_SEND]._buffer[iBufSize],TCPIP_MAX_BUFF_SIZE-iBufSize,"%05u ",(unsigned short)DM36000[_StartAddr+i]); } int iBufSize=strlen(m_TCPIPBuf[CH_SEND]._buffer); m_TCPIPBuf[CH_SEND]._buffer[iBufSize-1]=0x0D; m_TCPIPBuf[CH_SEND]._buffer[iBufSize++]=0x0A; m_TCPIPBuf[CH_SEND]._buffer[iBufSize]=0x00; m_TCPIPBuf[CH_SEND]._size=iBufSize; SendBuffer(); return TRUE; } //================================================================ BOOL CSo7_TCPIP_Server::_Send_Cmd_Write_State() { if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET) { return FALSE; } m_ClearSendBuf(); #ifdef PLC_KEYENCE int iBufSize=0; m_TCPIPBuf[CH_SEND]._buffer[iBufSize++]='O'; m_TCPIPBuf[CH_SEND]._buffer[iBufSize++]='K'; m_TCPIPBuf[CH_SEND]._buffer[iBufSize++]=0x0D; m_TCPIPBuf[CH_SEND]._buffer[iBufSize++]=0x0A; m_TCPIPBuf[CH_SEND]._buffer[iBufSize]=0x00; m_TCPIPBuf[CH_SEND]._size=iBufSize; #else m_TCPIPBuf[CH_SEND]._size=0; #endif SendBuffer(); return TRUE; } //================================================================ LRESULT CSo7_TCPIP_Server::OnSocket(WPARAM wParam, LPARAM lParam) { SOCKET s = wParam; switch (lParam) { case FD_ACCEPT: { if(m_nClients < WSA_MAXIMUM_WAIT_EVENTS) { SOCKET client = ::accept(s, NULL, NULL); AddClient(client); } else { AfxMessageBox(_T("连接客户太多!")); }; ::SendMessage(m_hMsgWnd,WM_TCPIP_MSG,FD_ACCEPT,0); } break; case FD_READ: { UpdateActiveClient(s); m_ProcessSocketReadEvent(s); } break; case FD_WRITE: //This event happens when the tcp buffers are ready for another send. //So if there is not enough room for the first write the event will happen //and then the buffers are ready for more. m_ProcessSocketWriteEvent(); ::SendMessage(m_hMsgWnd,WM_TCPIP_MSG,FD_WRITE,0); break; case FD_CLOSE: { RemoveClient(s); ::closesocket(s); ::SendMessage(m_hMsgWnd,WM_TCPIP_MSG,FD_CLOSE,0); } break; } return 0; } //================================================================ void CSo7_TCPIP_Server::m_ClearSendBuf(void) { int i; for(i=0;i=m_TCPIPBuf[CH_SEND]._size) { m_TCPIPBuf[CH_SEND]._size = 0; m_TCPIPBuf[CH_SEND]._CompletedSize = 0; m_TCPIPBuf[CH_SEND]._hProtoPending=FALSE; break; } } } //================================================================ void CSo7_TCPIP_Server::m_ProcessSocketWriteEvent(void) { int errorCode, numBytesSent; SOCKET s = m_Socket; if(m_TCPIPBuf[CH_SEND]._size <= 0) return; char* sendBuf = m_TCPIPBuf[CH_SEND]._buffer; while(1) { numBytesSent = send(s, &(sendBuf[m_TCPIPBuf[CH_SEND]._CompletedSize]), m_TCPIPBuf[CH_SEND]._size-m_TCPIPBuf[CH_SEND]._CompletedSize, 0); if(numBytesSent == SOCKET_ERROR) { errorCode = WSAGetLastError(); if(errorCode == WSAEWOULDBLOCK) { return; //Should get a FD_WRITE event if this happens. Send the rest from there. } else { //showSocketError(errorCode); return; } } else { m_TCPIPBuf[CH_SEND]._CompletedSize += numBytesSent; } if(m_TCPIPBuf[CH_SEND]._CompletedSize>=m_TCPIPBuf[CH_SEND]._size) { m_TCPIPBuf[CH_SEND]._CompletedSize = 0; m_ClearSendBuf(); break; } } } //================================================================ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s) { int bytesReceived=0; int errorCode; bytesReceived = recv(s, &(m_TCPIPBuf[CH_RECV]._buffer[0]), TCPIP_MAX_BUFF_SIZE, 0); if(bytesReceived == SOCKET_ERROR) { errorCode = WSAGetLastError(); if (errorCode == WSAEWOULDBLOCK) { //have to wait for the next receive event return; } else { //showSocketError(errorCode); return; } } m_TCPIPBuf[CH_RECV]._CompletedSize += bytesReceived; m_TCPIPBuf[CH_RECV]._size = m_TCPIPBuf[CH_RECV]._CompletedSize; m_TCPIPMsg.Init(); TRACE0("m_ProcessSocketReadEvent\r\n"); #ifdef PLC_KEYENCE if (strstr(m_TCPIPBuf[CH_RECV]._buffer, "RD")) { unsigned long iAddr(0); unsigned long iDataSize(1); char cRecvDataTmp[30]={0}; int iRecvDataIndex(0); int iBufferSize=m_TCPIPBuf[CH_RECV]._size; int index(0); iRecvDataIndex=0; int iLoopCount(0); do { cRecvDataTmp[index++]=m_TCPIPBuf[CH_RECV]._buffer[iRecvDataIndex++]; if (m_TCPIPBuf[CH_RECV]._buffer[iRecvDataIndex]==0x20 ||m_TCPIPBuf[CH_RECV]._buffer[iRecvDataIndex]==0x0D) { if (iLoopCount==1) { char cTmp[30]={0}; int iii(0); for (int i=0;i(atoi(cTmp)); } else if (iLoopCount==2) { iDataSize=static_cast(atoi(cRecvDataTmp)); } iLoopCount++; index=0; memset(cRecvDataTmp,0,30*sizeof(char)); } } while (iRecvDataIndex<=iBufferSize&&m_TCPIPBuf[CH_RECV]._buffer[iRecvDataIndex]!=0x0D); m_TCPIPMsg._CmdType=0; m_TCPIPMsg._DataAddr=iAddr; m_TCPIPMsg._DataSize=iDataSize; if (iAddr>=36000) { RESPONSE_PLC_DM36000_R((short)iAddr,(short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_UNKNOWN; m_TCPIPMsg._MsgType=RESPONSE_READ_ERRCODE; } else if (iAddr>=30000) { RESPONSE_PLC_DM_UNKNOWN((short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_UNKNOWN; m_TCPIPMsg._MsgType=RESPONSE_READ_ERRCODE; } else if (iAddr>=28000) { RESPONSE_PLC_DM_UNKNOWN((short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_UNKNOWN; } else if (iAddr>=26000) { short saddr=(short)(iAddr-6000+800); Response_PLC_DM20000_R((short)saddr,(short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_CCD_DATA; } else if (iAddr>=22000) { Response_PLC_DM20000_R((short)iAddr,(short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_CCD_DATA; } else if (iAddr>=20000) { Response_PLC_DM20000_R((short)iAddr,(short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_CCD_DATA; } else if (iAddr>=10000) { Response_PLC_DM10000_R((short)iAddr,(short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_CCD_DATA; } else if (iAddr>=5100) { Response_PLC_DM5000_R((short)iAddr,(short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_PLC_CALIB_POS; } else if (iAddr>=5000) { Response_PLC_DM5000_R((short)iAddr,(short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_PLC_STATE; } else if (iAddr>=200) { Response_PLC_DM200_R((short)iAddr,(short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_PLC_STATE; } else { RESPONSE_PLC_DM_UNKNOWN((short)iDataSize); m_TCPIPMsg._MsgType=RESPONSE_UNKNOWN; } } else if (strstr(m_TCPIPBuf[CH_RECV]._buffer, "WR")) { short iAddr(0); short iDataSize(1); short sRecvData[1024]={0}; int iRecvDataSize=0; char cRecvDataTmp[30]={0}; int iRecvDataIndex(0); int iBufferSize=m_TCPIPBuf[CH_RECV]._size; int index(0); iRecvDataIndex=0; int iLoopCount(0); do { cRecvDataTmp[index++]=m_TCPIPBuf[CH_RECV]._buffer[iRecvDataIndex++]; if (m_TCPIPBuf[CH_RECV]._buffer[iRecvDataIndex]==0x20 ||m_TCPIPBuf[CH_RECV]._buffer[iRecvDataIndex]==0x0D) { if (iLoopCount==1) { char cTmp[30]={0}; int iii(0); for (int i=0;i(atoi(cTmp)); } else if (iLoopCount==2) { iDataSize=static_cast(atoi(cRecvDataTmp)); } else if (iLoopCount>=3) { sRecvData[iRecvDataSize++]=static_cast(atoi(cRecvDataTmp)); } iLoopCount++; index=0; memset(cRecvDataTmp,0,30*sizeof(char)); } } while (iRecvDataIndex<=iBufferSize&&m_TCPIPBuf[CH_RECV]._buffer[iRecvDataIndex]!=0x0D); m_TCPIPMsg._CmdType=1; m_TCPIPMsg._DataAddr=iAddr; m_TCPIPMsg._DataSize=iDataSize; if (iAddr>=8000) { static clock_t m_FinishTime(0),m_StartTime(0),m_AverageTime(0),m_Count(0); int iStartAddr(0); iStartAddr=iAddr-8000; if (iStartAddr==11) { if (m_Count>0) { m_FinishTime=clock(); } m_AverageTime+=m_FinishTime-m_StartTime; m_Count++; TRACE2("Bin Result=%d;Time=%d.\r\n",DM8000[iStartAddr],m_FinishTime-m_StartTime); m_StartTime=clock(); } for (int i=0;i=200) { int iStartAddr(0); iStartAddr=iAddr-200; for (int i=0;i=20000) { m_TCPIPMsg._MsgType=RESPONSE_READ_ERRCODE; } else if (iAddr>=10000) { Response_PLC_DM10000_R(iAddr,iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_CCD_DATA; } else if (iAddr>=5100) { Response_PLC_DM5000_R(iAddr,iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_PLC_CALIB_POS; } else if (iAddr>=5000) { Response_PLC_DM5000_R(iAddr,iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_PLC_STATE; } else if (iAddr>=200) { Response_PLC_DM200_R(iAddr,iDataSize); m_TCPIPMsg._MsgType=RESPONSE_READ_PLC_STATE; } else { RESPONSE_PLC_DM_UNKNOWN(); m_TCPIPMsg._MsgType=RESPONSE_UNKNOWN; } } else if (m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCMD1]==0x01 &&m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCMD2]==0x02) { short iAddr(0); short iDataSize(0); BYTE bData[2]={0,0}; bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr1]; bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr2]; iAddr=(bData[0]<<8)+bData[1]; bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh1]; bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh2]; iDataSize=(bData[0]<<8)+bData[1]; m_TCPIPMsg._CmdType=1; m_TCPIPMsg._DataAddr=iAddr; m_TCPIPMsg._DataSize=iDataSize; if (iAddr>=8000) { int iBuffsize(0); int iStartAddr(0); iStartAddr=iAddr-8000; bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize1]; bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize2]; iBuffsize=(bData[0]<<8)+bData[1]; iBuffsize-=DRW_RDataCCLen; for (int i=0;i=200) { int iBuffsize(0); int iStartAddr(0); iStartAddr=iAddr-200; bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize1]; bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize2]; iBuffsize=(bData[0]<<8)+bData[1]; iBuffsize-=DRW_RDataCCLen; for (int i=0;i