Add RW data.

This commit is contained in:
TAO Cheng
2014-10-30 15:40:07 +08:00
parent 211ca66956
commit 0e4bb3e352
6 changed files with 198 additions and 48 deletions
@@ -7,9 +7,26 @@ 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 char BufferHeader[4]={0x46,0x49,0x4E,0x53};
const char HandShaking[]={0x46,0x49,0x4E,0x53,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
const BYTE CommHeader[]={0x46,0x49,0x4E,0x53};
const BYTE HandShaking[]={0x46,0x49,0x4E,0x53,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
const BYTE DRW_SData[]={0x46,0x49,0x4E,0x53,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x02,0x00,0x05,0x00,0x00,0x03,0x00,0xFF,0x01,0x01,0x82,0x00,0x0A,0x00,0x00,0x01};
const int DRW_SDataIndexDA1=20;
const int DRW_SDataIndexSA1=23;
const int DRW_SDataIndexCMD1=26;
const int DRW_SDataIndexCMD2=27;
const int DRW_SDataIndexAddr1=29;
const int DRW_SDataIndexAddr2=30;
const int DRW_SDataIndexCh1=32;
const int DRW_SDataIndexCh2=33;
const int DRW_SDataIndexData=34;
const int DRW_SDataCCLen=0x1A;
const int DRW_RSDataIndexBufSize1=6;
const int DRW_RSDataIndexBufSize2=7;
const int DRW_RDataIndexData=30;
const int DRW_RDataCCLen=0x16;
HANDLE CSo7_TCPIP::m_Thread_Id=NULL;
HANDLE CSo7_TCPIP::m_Thread_Mutex=NULL;
@@ -40,12 +57,14 @@ CSo7_TCPIP::CSo7_TCPIP()
m_TCPIPBuf[i]._hProtoPending = false;
m_TCPIPBuf[i]._event = NULL;
};
m_TCPIPData.s_status._handshaking=false;
m_TCPIPData.s_status._HandshakingSucceed=false;
m_TCPIPData.s_status._WriteDataCompleted=false;
m_TCPIPData.s_status._ReadDataCompleted=false;
m_TCPIPData.s_status._SendReturnCode=TCPIP_CONNECT_OK;
m_TCPIPData.s_status._RecvReturnCode=TCPIP_CONNECT_OK;
m_TCPIPData.s_recv_data._type=0;
m_TCPIPData.s_recv_data._DataSize=0;
m_TCPIPData.s_recv_data._dbBuff=(double *)malloc(TCPIP_MAX_DAT_SIZE);
m_TCPIPData.s_recv_data._iData=(int *)malloc(TCPIP_MAX_DAT_SIZE);
}
@@ -58,8 +77,8 @@ CSo7_TCPIP::~CSo7_TCPIP()
free(m_TCPIPBuf[i]._buffer);
m_TCPIPBuf[i]._buffer=NULL;
}
free(m_TCPIPData.s_recv_data._dbBuff);
m_TCPIPData.s_recv_data._dbBuff=NULL;
free(m_TCPIPData.s_recv_data._iData);
m_TCPIPData.s_recv_data._iData=NULL;
}
//================================================================
void CSo7_TCPIP::Create_Thread()
@@ -103,14 +122,8 @@ void CSo7_TCPIP::_do_single_threaded_tcpip_comm(bool _bWaitForRsponse)
Sleep(3);
}
m_TCPIPBuf[CH_SEND]._hProtoPending = TRUE;
if (_bWaitForRsponse)
{
m_TCPIPBuf[CH_RECV]._hProtoPending = TRUE;
}
else
{
m_TCPIPBuf[CH_RECV]._hProtoPending = FALSE;
}
UNREFERENCED_PARAMETER(_bWaitForRsponse);
m_TCPIPBuf[CH_RECV]._hProtoPending = FALSE;
SetEvent(m_TCPIPBuf[CH_SEND]._event);
while ((m_TCPIPBuf[CH_SEND]._hProtoPending == TRUE) || (m_TCPIPBuf[CH_RECV]._hProtoPending == TRUE))
{
@@ -258,27 +271,72 @@ TCPIP_RETURN_CODE CSo7_TCPIP::Handshaking()
}
//================================================================
TCPIP_RETURN_CODE CSo7_TCPIP::Send(int _Addr,int _Data)
TCPIP_RETURN_CODE CSo7_TCPIP::_Send_Cmd_Write_D_Data(const short& _Addr,short* _Data,int _DataSize)
{
_Addr=0;
_Data=0;
if(m_Socket == INVALID_SOCKET)
{
return TCPIP_INVAILD_SOCKET;
}
return TCPIP_CONNECT_OK;
WaitForSingleObject(m_Thread_Mutex, INFINITE);
m_ClearSendBuf();
memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData));
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDA1]=m_SreverIPAddress.S_un.S_un_b.s_b4;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexSA1]=m_ClientIPAddress.S_un.S_un_b.s_b4;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCMD1]=0x01;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCMD2]=0x02;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexAddr1]=(_Addr>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexAddr2]=_Addr & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCh1]=(_DataSize>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCh2]=_DataSize & 0x0ff;
for (int i=0;i<_DataSize;i++)
{
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=(_Data[i]>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=_Data[i] & 0x0ff;
}
short sTmpData(0);
sTmpData=static_cast<short>(DRW_SDataCCLen+2*_DataSize);
m_TCPIPBuf[CH_SEND]._buffer[DRW_RSDataIndexBufSize1]=(sTmpData>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_RSDataIndexBufSize2]=sTmpData & 0x0ff;
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+2*_DataSize;
m_TCPIPBuf[CH_SEND]._save_send_cmd=TCPIP_CMD_WRITE_D_DATA;
m_TCPIPData.s_status._WriteDataCompleted=false;
m_Thread_State=TCPIP_THREAD_RUNNING;
_do_single_threaded_tcpip_comm();
ReleaseMutex(m_Thread_Mutex);
return m_TCPIPData.s_status._SendReturnCode;
}
//================================================================
TCPIP_RETURN_CODE CSo7_TCPIP::Recv(int _Addr,int& _Data,bool _bWait)
TCPIP_RETURN_CODE CSo7_TCPIP::_Send_Cmd_Read_D_Data(const short& _Addr,const short& _DataSize)
{
_Addr=0;
_Data=0;
_bWait=false;
if(m_Socket == INVALID_SOCKET)
{
return TCPIP_INVAILD_SOCKET;
}
return TCPIP_CONNECT_OK;
WaitForSingleObject(m_Thread_Mutex, INFINITE);
m_ClearSendBuf();
memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData));
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDA1]=m_SreverIPAddress.S_un.S_un_b.s_b4;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexSA1]=m_ClientIPAddress.S_un.S_un_b.s_b4;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCMD1]=0x01;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCMD2]=0x01;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexAddr1]=(_Addr>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexAddr2]=_Addr & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCh1]=(_DataSize>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCh2]=_DataSize & 0x0ff;
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData;
m_TCPIPBuf[CH_SEND]._save_send_cmd=TCPIP_CMD_READ_D_DATA;
m_TCPIPData.s_status._ReadDataCompleted=false;
m_Thread_State=TCPIP_THREAD_RUNNING;
_do_single_threaded_tcpip_comm();
ReleaseMutex(m_Thread_Mutex);
return m_TCPIPData.s_status._SendReturnCode;
}
//================================================================
LRESULT CSo7_TCPIP::OnSocket(WPARAM wParam, LPARAM lParam)
@@ -295,7 +353,7 @@ LRESULT CSo7_TCPIP::OnSocket(WPARAM wParam, LPARAM lParam)
{
case FD_CONNECT:
{
}
break;
case FD_READ:
@@ -426,15 +484,40 @@ void CSo7_TCPIP::m_ProcessSocketReadEvent(SOCKET s)
switch (m_TCPIPBuf[CH_SEND]._save_send_cmd)
{
case TCPIP_CMD_HANDSHAKING:
if (m_TCPIPBuf[CH_RECV]._CompletedSize==24)
{
m_TCPIPData.s_status._handshaking=true;
}
else
{
m_TCPIPData.s_status._handshaking=false;
if (m_TCPIPBuf[CH_RECV]._CompletedSize==24)
{
m_TCPIPData.s_status._HandshakingSucceed=true;
}
else
{
m_TCPIPData.s_status._HandshakingSucceed=false;
}
break;
}
case TCPIP_CMD_READ_D_DATA:
{
int _BufferSize(0);
BYTE _bData[2]={0,0};
_BufferSize=static_cast<int>(static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize2]));
_BufferSize-=DRW_RDataCCLen;
m_TCPIPData.s_recv_data._DataSize=0;
for (int i=0;i<_BufferSize;i+=2)
{
_bData[0]=static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i]);
_bData[1]=static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+1]);
m_TCPIPData.s_recv_data._iData[m_TCPIPData.s_recv_data._DataSize]=static_cast<int>(_bData[0]*256+_bData[1]);
m_TCPIPData.s_recv_data._DataSize++;
}
m_TCPIPData.s_status._ReadDataCompleted=true;
break;
}
case TCPIP_CMD_WRITE_D_DATA:
{
m_TCPIPData.s_status._WriteDataCompleted=true;
break;
}
break;
default:break;
}
m_TCPIPBuf[CH_RECV]._CompletedSize = 0;
@@ -31,8 +31,8 @@ enum TCPIP_CMD
{
TCPIP_CMD_NONE=0,
TCPIP_CMD_HANDSHAKING,
TCPIP_CMD_READ_DATA,
TCPIP_CMD_WRITE_DATA,
TCPIP_CMD_READ_D_DATA,
TCPIP_CMD_WRITE_D_DATA,
TCPIP_CMD_TATAL
};
@@ -67,13 +67,15 @@ struct struct_so7_tcpip_data
{
int _type;
int _DataSize;
double *_dbBuff;
int* _iData;
} s_recv_data;
struct s_status
{
TCPIP_RETURN_CODE _SendReturnCode;
TCPIP_RETURN_CODE _RecvReturnCode;
bool _handshaking;
bool _HandshakingSucceed;
bool _WriteDataCompleted;
bool _ReadDataCompleted;
} s_status;
};
#pragma pack(pop)
@@ -93,11 +95,12 @@ public:
static int m_Thread_State;
TCPIP_RETURN_CODE Connect(const HWND& _hWnd,const in_addr& _IPAddress,const u_short& _nPortNumber);
TCPIP_RETURN_CODE Send(int _Addr,int _Data);
TCPIP_RETURN_CODE Recv(int _Addr,int& _Data,bool _bWait);
TCPIP_RETURN_CODE DisConnect();
TCPIP_RETURN_CODE GetHostIPAddr(in_addr& _IPAddress);
TCPIP_RETURN_CODE Handshaking();
TCPIP_RETURN_CODE _Send_Cmd_Write_D_Data(const short& _Addr,short* _Data,int _DataSize);
TCPIP_RETURN_CODE _Send_Cmd_Read_D_Data(const short& _StartAddr,const short& _DataSize);
LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
private:
@@ -1050,11 +1050,13 @@ BEGIN
PUSHBUTTON "Read Data",IDC_BUTTON_PLC_TCPIP_READ,203,30,63,18
PUSHBUTTON "Write Data",IDC_BUTTON_PLC_TCPIP_WRITE,203,62,63,18
GROUPBOX "TCP/IP Control",IDC_STATIC,110,12,174,81
EDITTEXT IDC_EDIT_PLC_TCPIP_ADDR,141,32,40,14,ES_AUTOHSCROLL
LTEXT "Addr",IDC_STATIC,116,35,16,8
EDITTEXT IDC_EDIT_PLC_TCPIP_Data,141,61,40,14,ES_AUTOHSCROLL
LTEXT "Data",IDC_STATIC,116,64,16,8
EDITTEXT IDC_EDIT_PLC_TCPIP_ADDR,144,28,40,14,ES_AUTOHSCROLL
LTEXT "Addr",IDC_STATIC,120,30,16,8
EDITTEXT IDC_EDIT_PLC_TCPIP_Data,144,74,40,14,ES_AUTOHSCROLL
LTEXT "Data",IDC_STATIC,120,76,16,8
PUSHBUTTON "Handshaking",IDC_BUTTON_PLC_TCPIP_HANDSHAKING,28,49,63,18
EDITTEXT IDC_EDIT_PLC_TCPIP_DATA_SIZE,144,51,40,14,ES_AUTOHSCROLL
LTEXT "Size",IDC_STATIC,120,53,14,8
END
@@ -73,20 +73,54 @@ void CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipDisconnect()
void CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipRead()
{
;
CString str;
UpdateData(TRUE);
USES_CONVERSION;
GetDlgItem(IDC_EDIT_PLC_TCPIP_ADDR)->GetWindowText(str);
const char* cTempValue=T2A(str);
short sAddr=static_cast<short>(atoi(cTempValue));
GetDlgItem(IDC_EDIT_PLC_TCPIP_DATA_SIZE)->GetWindowText(str);
cTempValue=T2A(str);
short sSize=static_cast<short>(atoi(cTempValue));
TCPIP_RETURN_CODE rCode=g_pSo7_TCPIP->_Send_Cmd_Read_D_Data(sAddr,sSize);
m_csMSG.Format(_T(">> Read ReturnCode:%d."),rCode);
OutputWithScroll(m_csMSG,m_edMSG);
}
void CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipHandshaking()
{
TCPIP_RETURN_CODE rCode=g_pSo7_TCPIP->Handshaking();
m_csMSG.Format(_T("[Handshaking] Send ReturnCode:%d."),rCode);
m_csMSG.Format(_T(">> Handshaking ReturnCode:%d."),rCode);
OutputWithScroll(m_csMSG,m_edMSG);
}
void CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipWrite()
{
TCPIP_RETURN_CODE rCode=g_pSo7_TCPIP->Send(1001,0);
m_csMSG.Format(_T("Write ReturnCode:%d."),rCode);
CString str;
UpdateData(TRUE);
USES_CONVERSION;
GetDlgItem(IDC_EDIT_PLC_TCPIP_ADDR)->GetWindowText(str);
const char* cTempValue=T2A(str);
short sAddr=static_cast<short>(atoi(cTempValue));
GetDlgItem(IDC_EDIT_PLC_TCPIP_Data)->GetWindowText(str);
cTempValue=T2A(str);
int sData=(atoi(cTempValue));
GetDlgItem(IDC_EDIT_PLC_TCPIP_DATA_SIZE)->GetWindowText(str);
cTempValue=T2A(str);
int sSize=(atoi(cTempValue));
short* _Data=new short[sSize];
for(int i=0;i<sSize;i++)
{
_Data[i]=static_cast<short>(sData);
}
TCPIP_RETURN_CODE rCode=g_pSo7_TCPIP->_Send_Cmd_Write_D_Data(sAddr,_Data,(int)sSize);
delete []_Data;
m_csMSG.Format(_T(">> Write ReturnCode:%d."),rCode);
OutputWithScroll(m_csMSG,m_edMSG);
}
@@ -141,12 +175,39 @@ LRESULT CSo7_Util_PLC_TCPIP::OnTCPIPRecv(WPARAM w, LPARAM p)
{
if (g_pSo7_TCPIP)
{
m_csMSG.Format(_T(">> Handshaking status:%d."),g_pSo7_TCPIP->m_TCPIPData.s_status._handshaking);
m_csMSG.Format(_T("<< Handshaking status:%d."),g_pSo7_TCPIP->m_TCPIPData.s_status._HandshakingSucceed);
OutputWithScroll(m_csMSG,m_edMSG);
}
m_csMSG=_T("[Handshaking]");
break;
}
case TCPIP_CMD_READ_D_DATA:
{
if (g_pSo7_TCPIP)
{
CString csTmp;
m_csMSG=_T("");
m_csMSG.Format(_T("<< Read status:%d;Data:"),g_pSo7_TCPIP->m_TCPIPData.s_status._ReadDataCompleted);
for (int i=0;i<g_pSo7_TCPIP->m_TCPIPData.s_recv_data._DataSize;i++)
{
csTmp.Format(_T("%0X,"),g_pSo7_TCPIP->m_TCPIPData.s_recv_data._iData[i]);
m_csMSG+=csTmp;
}
OutputWithScroll(m_csMSG,m_edMSG);
m_csMSG=_T("[Read]");
}
break;
}
case TCPIP_CMD_WRITE_D_DATA:
{
if (g_pSo7_TCPIP)
{
m_csMSG.Format(_T("<< Write status:%d."),g_pSo7_TCPIP->m_TCPIPData.s_status._WriteDataCompleted);
OutputWithScroll(m_csMSG,m_edMSG);
}
m_csMSG=_T("[Write]");
break;
}
default:
{
m_csMSG=_T("[Unknown]");
@@ -163,7 +224,7 @@ LRESULT CSo7_Util_PLC_TCPIP::OnTCPIPRecv(WPARAM w, LPARAM p)
m_csMSG+=_T("RecvData:");
for (int i=0;i<g_pSo7_TCPIP->m_TCPIPBuf[CH_RECV]._size;i++)
{
csTmp.Format(_T("0x%X "),g_pSo7_TCPIP->m_TCPIPBuf[CH_RECV]._buffer[i]);
csTmp.Format(_T("0x%02X "),static_cast<BYTE>(g_pSo7_TCPIP->m_TCPIPBuf[CH_RECV]._buffer[i]));
m_csMSG+=csTmp;
}
}
@@ -1054,8 +1054,9 @@
#define IDC_EDIT_PLC_TCPIP_ADDR 1887
#define IDC_EDIT_MSG 1888
#define IDC_EDIT_PLC_TCPIP_Data 1889
#define IDC_BUTTON_PLC_TCPIP_CONNECT2 1890
#define IDC_BUTTON_PLC_TCPIP_HANDSHAKING 1890
#define IDC_EDIT_PLC_TCPIP_ADDR2 1891
#define IDC_EDIT_PLC_TCPIP_DATA_SIZE 1891
#define IDC_BUTTON_DIY_EXIT_BUTTON 32740
#define ID_EDIT_SO7_CONFIG_MOTION 32741