TCPIP SERVER

This commit is contained in:
TAO Cheng
2014-11-12 15:40:40 +08:00
parent cba2694c0c
commit c78c3c6f28
5 changed files with 125 additions and 60 deletions
@@ -62,10 +62,12 @@ CSo7_TCPIP_Server::CSo7_TCPIP_Server()
m_TCPIPBuf[i]._hProtoPending = false;
m_TCPIPBuf[i]._event = NULL;
};
for(int i=0;i<MAX_CCD_ADDR;i++)
{
m_CCDData_D10000[i]=0;
}
DM5000= (short *)malloc(MAX_DM_PAGE_NUMBER);
DM8000= (short *)malloc(MAX_DM_PAGE_NUMBER);
DM10000= (short *)malloc(MAX_DM_PAGE_NUMBER);
memset(DM5000,0,MAX_DM_PAGE_NUMBER);
memset(DM8000,0,MAX_DM_PAGE_NUMBER);
memset(DM10000,0,MAX_DM_PAGE_NUMBER);
}
@@ -78,6 +80,12 @@ CSo7_TCPIP_Server::~CSo7_TCPIP_Server()
free(m_TCPIPBuf[i]._buffer);
m_TCPIPBuf[i]._buffer=NULL;
}
free(DM5000);
DM5000=NULL;
free(DM8000);
DM8000=NULL;
free(DM10000);
DM10000=NULL;
}
//================================================================
int CSo7_TCPIP_Server::Init_Winsock()
@@ -145,11 +153,6 @@ BOOL CSo7_TCPIP_Server::StopServer()
m_ClientSocket[i]=INVALID_SOCKET;
}
m_nClients=0;
for(int i=0;i<MAX_CCD_ADDR;i++)
{
m_CCDData_D10000[i]=0;
}
}
return TRUE;
}
@@ -275,7 +278,7 @@ void CSo7_TCPIP_Server::CloseAllSocket()
}
//================================================================
BOOL CSo7_TCPIP_Server::RESPONSE_UNKNOWN_State()
BOOL CSo7_TCPIP_Server::RESPONSE_PLC_DM_UNKNOWN()
{
if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET)
{
@@ -303,7 +306,7 @@ BOOL CSo7_TCPIP_Server::Response_Handshake()
return TRUE;
}
//================================================================
BOOL CSo7_TCPIP_Server::Response_PLC_State(short _datasize)
BOOL CSo7_TCPIP_Server::Response_PLC_DM5000_R(short _StartAddr,short _DataSize)
{
if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET)
{
@@ -311,22 +314,27 @@ BOOL CSo7_TCPIP_Server::Response_PLC_State(short _datasize)
}
m_ClearSendBuf();
memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData));
int iData=m_TCPIPServerState._PLCRunningState;
for (int i=0;i<_datasize;i++)
short sData(0);
_StartAddr-=5000;
if ((_StartAddr+_DataSize)>=MAX_DM_PAGE_NUMBER)
{
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=(iData>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=iData & 0x0ff;
_DataSize=MAX_DM_PAGE_NUMBER-_StartAddr;
}
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;
}
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData-DRW_SDataHeadDataSize+_datasize);
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_datasize*2;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData-DRW_SDataHeadDataSize+_DataSize);
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_DataSize*2;
SendBuffer();
return TRUE;
}
//================================================================
BOOL CSo7_TCPIP_Server::Response_Sensor_State(short _datasize)
BOOL CSo7_TCPIP_Server::Response_PLC_DM10000_R(short _StartAddr,short _DataSize)
{
if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET)
{
@@ -335,19 +343,28 @@ BOOL CSo7_TCPIP_Server::Response_Sensor_State(short _datasize)
m_ClearSendBuf();
memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData));
for (int i=0;i<_datasize;i++)
short sData(0);
_StartAddr-=10000;
if ((_StartAddr+_DataSize)>=MAX_DM_PAGE_NUMBER)
{
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+i]=m_TCPIPServerState._PLCSensorState[i];
_DataSize=MAX_DM_PAGE_NUMBER-_StartAddr;
}
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;
}
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData-DRW_SDataHeadDataSize+_datasize);
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_datasize*2;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData-DRW_SDataHeadDataSize+_DataSize);
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_DataSize*2;
SendBuffer();
return TRUE;
}
//================================================================
BOOL CSo7_TCPIP_Server::Response_CCD_DATA(short _Addr,short _datasize)
BOOL CSo7_TCPIP_Server::Response_PLC_DM8000_W(short _StartAddr,short _DataSize)
{
if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET)
{
@@ -355,27 +372,26 @@ BOOL CSo7_TCPIP_Server::Response_CCD_DATA(short _Addr,short _datasize)
}
m_ClearSendBuf();
memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData));
int iData(0);
BYTE DM_Data[4]={0,0,0,0};
for (int i=0;i<_datasize;i++)
short sData(0);
_StartAddr-=8000;
if ((_StartAddr+_DataSize)>=MAX_DM_PAGE_NUMBER)
{
iData=m_CCDData_D10000[_Addr+i/2];
DM_Data[2]=(iData>>24) & 0x0ff;
DM_Data[3]=(iData>>16) & 0x0ff;
DM_Data[0]=(iData>>8) & 0x0ff;
DM_Data[1]=iData & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=DM_Data[2*(i%2)+0];
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=DM_Data[2*(i%2)+1];
_DataSize=MAX_DM_PAGE_NUMBER-_StartAddr;
}
for (int i=0;i<_DataSize;i++)
{
sData=DM8000[_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;
}
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData-DRW_SDataHeadDataSize+_datasize);
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_datasize*2;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData-DRW_SDataHeadDataSize+_DataSize);
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_DataSize*2;
SendBuffer();
return TRUE;
}
//================================================================
BOOL CSo7_TCPIP_Server::_Send_Cmd_Write_State()
{
@@ -570,8 +586,8 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s)
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_RDataIndexAddr1];
bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr2];
bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh1];
bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh2];
iDataSize=(bData[0]<<8)+bData[1];
if (iAddr>=20000)
@@ -580,17 +596,17 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s)
}
else if (iAddr>=10000)
{
Response_CCD_DATA((iAddr-10060),iDataSize);
Response_PLC_DM10000_R(iAddr,iDataSize);
iPara=RESPONSE_READ_CCD_DATA;
}
else if (iAddr>=5000)
{
Response_PLC_State(1);
Response_PLC_DM5000_R(iAddr,iDataSize);
iPara=RESPONSE_READ_PLC_STATE;
}
else
{
RESPONSE_UNKNOWN_State();
RESPONSE_PLC_DM_UNKNOWN();
iPara=RESPONSE_UNKNOWN;
}
}
@@ -603,17 +619,17 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s)
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_RDataIndexAddr1];
bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr2];
bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh1];
bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh2];
iDataSize=(bData[0]<<8)+bData[1];
if (iAddr>=8000)
{
RESPONSE_UNKNOWN_State();
RESPONSE_PLC_DM_UNKNOWN();
iPara=RESPONSE_WRITE_PLC_STATE;
}
else
{
RESPONSE_UNKNOWN_State();
RESPONSE_PLC_DM_UNKNOWN();
iPara=RESPONSE_UNKNOWN;
}
}
@@ -16,6 +16,8 @@
#define PLC_MAX_SENSOR_STATE 20
#define MAX_CCD_ADDR 120
#define MAX_DM_PAGE_NUMBER 1024
enum OMRON_PLC_SENSOR
{
OMRON_PLC_CCD1_CAMERA1=0,
@@ -93,17 +95,21 @@ public:
static struct_so7_tcpip_buff m_TCPIPBuf[lChannelSize];
static s_tcpip_state m_TCPIPServerState;
int m_CCDData_D10000[MAX_CCD_ADDR];
short *DM5000;
short *DM8000;
short *DM10000;
BOOL StartServer(HWND _hWnd,short _nPort);
BOOL StopServer();
BOOL _Send_Cmd_Write_State();
BOOL Response_Handshake();
BOOL Response_PLC_State(short _datasize);
BOOL Response_Sensor_State(short _datasize);
BOOL Response_CCD_DATA(short _Addr,short _datasize);
BOOL Response_PLC_DM5000_R(short _StartAddr,short _DataSize);//PLC State
BOOL Response_PLC_DM10000_R(short _StartAddr,short _DataSize);//CCD
BOOL Response_PLC_DM8000_W(short _StartAddr,short _DataSize);//PC State
BOOL RESPONSE_UNKNOWN_State();
BOOL RESPONSE_PLC_DM_UNKNOWN();
LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
private:
@@ -24,7 +24,10 @@ IMPLEMENT_DYNAMIC(CSo7_Util_PLC_TCPIP_SERVER, CDialog)
CSo7_Util_PLC_TCPIP_SERVER::CSo7_Util_PLC_TCPIP_SERVER(CWnd* pParent /*=NULL*/)
: CDialog(CSo7_Util_PLC_TCPIP_SERVER::IDD, pParent)
{
for(int i=0;i<MAX_CCD_ADDR;i++)
{
m_CCDData_D10000[i]=0;
}
}
CSo7_Util_PLC_TCPIP_SERVER::~CSo7_Util_PLC_TCPIP_SERVER()
@@ -152,7 +155,15 @@ void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedButtonPlcTcpipServerUpdatestate()
GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_PLC_STATE)->GetWindowText(str);
cTempValue=T2A(str);
g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCRunningState=static_cast<BYTE>(atoi(cTempValue));
BYTE DM_Data[4]={0,0,0,0};
g_pSo7_TCPIP_Server->DM5000[0]=static_cast<short>(g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCRunningState);
for (int i=1;i<=8;i++)
{
DM_Data[0]=g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCSensorState[(i-1)*2];
DM_Data[1]=g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCSensorState[(i-1)*2+1];
g_pSo7_TCPIP_Server->DM5000[i]=(DM_Data[0]<<8)+DM_Data[1];
}
}
@@ -201,11 +212,29 @@ void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateListControl(int _type)
{
csTmp=m_DataList.GetItemText(iRow,iCol);
cTmp=T2A(csTmp);
if (g_pSo7_TCPIP_Server)
{
g_pSo7_TCPIP_Server->m_CCDData_D10000[iRow]=atoi(cTmp);
}
m_CCDData_D10000[iRow]=atoi(cTmp);
}
for (int iRow=0;iRow<MAX_CCD_ADDR;iRow++)
{
m_CCDData_D10000[iRow];
}
if (g_pSo7_TCPIP_Server)
{
int iData(0);
BYTE DM_Data[4]={0,0,0,0};
int StartAddr(60);
for (int i=0;i<MAX_CCD_ADDR;i++)
{
iData=m_CCDData_D10000[i];
DM_Data[0]=(iData>>24) & 0x0ff;
DM_Data[1]=(iData>>16) & 0x0ff;
DM_Data[2]=(iData>>8) & 0x0ff;
DM_Data[3]=iData & 0x0ff;
g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i]=(DM_Data[2]<<8)+DM_Data[3];
g_pSo7_TCPIP_Server->DM10000[StartAddr+2*i+1]=(DM_Data[0]<<8)+DM_Data[1];
}
}
break;
}
default:break;
@@ -224,6 +253,18 @@ void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedCancel()
CDialog::OnCancel();
}
//=====================================================================================
BOOL CSo7_Util_PLC_TCPIP_SERVER::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
if(pMsg->wParam==VK_RETURN || pMsg->wParam==VK_ESCAPE)
{
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
//=====================================================================================
//Print message on edit control
void CSo7_Util_PLC_TCPIP_SERVER::OutputWithScroll(const CString &strNewText,CEdit &edtOutput)
{
@@ -16,6 +16,7 @@ public:
CString m_csMSG;
CEdit m_edMSG;
int m_CCDData_D10000[MAX_CCD_ADDR];
protected:
CEditableListCtrl m_DataList;
@@ -30,6 +31,7 @@ public:
afx_msg void OnBnClickedButtonPlcTcpipServerUpdatestate();
afx_msg void OnBnClickedButtonClearMsg();
afx_msg void OnBnClickedCancel();
afx_msg BOOL PreTranslateMessage(MSG* pMsg);
LRESULT OnSocket(WPARAM w, LPARAM p);