464 lines
12 KiB
C++
464 lines
12 KiB
C++
|
// ClientSocketThread.cpp : implementation file
|
|||
|
//
|
|||
|
|
|||
|
#include "stdafx.h"
|
|||
|
#include "ModbusClient.h"
|
|||
|
|
|||
|
|
|||
|
// CModbusClient
|
|||
|
const UINT glServerPort = 502;
|
|||
|
|
|||
|
#define RECVDATA_BUFLEN 1024000 //<2F><><EFBFBD>ݽ<EFBFBD><DDBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
#define DATALEN_PERTIME 512 //<2F><><EFBFBD>δ<EFBFBD>Scoket<65><74><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
#define DATADEAL_BUFLEN 512 //<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(TCP֡<50><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>)
|
|||
|
|
|||
|
#define SOCKET_TIME_OUT 500
|
|||
|
|
|||
|
IMPLEMENT_DYNCREATE(CModbusClient, CWinThread)
|
|||
|
|
|||
|
CModbusClient::CModbusClient(CString strIp, int nPort, HWND hWnd)
|
|||
|
{
|
|||
|
m_pRecvDataBuffer = NULL;
|
|||
|
m_pDealBuf = NULL;
|
|||
|
m_iWritePos = 0;
|
|||
|
m_iReadPos = 0;
|
|||
|
m_llDataTotalLen = 0;
|
|||
|
m_llReadTotal = 0;
|
|||
|
m_strSerIP = strIp;
|
|||
|
m_hWnd = hWnd;
|
|||
|
m_bConnected = FALSE;
|
|||
|
m_ReadEventHandle = CreateEvent(NULL, TRUE, FALSE, NULL); //<2F><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>λ
|
|||
|
m_WriteEventHandle = CreateEvent(NULL, TRUE, FALSE, NULL); //<2F><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>λ
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
CModbusClient::CModbusClient()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
CModbusClient::~CModbusClient()
|
|||
|
{
|
|||
|
if (m_pDealBuf)
|
|||
|
{
|
|||
|
delete m_pDealBuf;
|
|||
|
m_pDealBuf =NULL;
|
|||
|
}
|
|||
|
|
|||
|
if (m_pRecvDataBuffer)
|
|||
|
{
|
|||
|
delete m_pRecvDataBuffer;
|
|||
|
m_pRecvDataBuffer =NULL;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
BOOL CModbusClient::InitInstance()
|
|||
|
{
|
|||
|
if (!AfxSocketInit()) // <20><>ʼ<EFBFBD><CABC>CSocket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>
|
|||
|
{
|
|||
|
CWinThread::InitInstance(); //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>socket
|
|||
|
if (!m_socket.Create())
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD>socketʧ<74><CAA7>
|
|||
|
CWinThread::InitInstance(); //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>÷<EFBFBD><C3B7>ͳ<EFBFBD>ʱʱ<CAB1>䣬<EFBFBD><E4A3AC>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|||
|
int nTimeout = SOCKET_TIME_OUT;
|
|||
|
m_socket.SetSockOpt(SO_SNDTIMEO, (char*)&nTimeout, sizeof(nTimeout), SOL_SOCKET);
|
|||
|
|
|||
|
// <20><><EFBFBD>ý<EFBFBD><C3BD>ճ<EFBFBD>ʱʱ<CAB1>䣬<EFBFBD><E4A3AC>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|||
|
nTimeout = SOCKET_TIME_OUT;
|
|||
|
m_socket.SetSockOpt(SO_RCVTIMEO, (char*)&nTimeout, sizeof(nTimeout), SOL_SOCKET);
|
|||
|
|
|||
|
//m_socket.m_pMainDlg = m_pMainDlg;
|
|||
|
m_socket.m_pThrd = this;
|
|||
|
|
|||
|
if (!m_socket.Connect(m_strSerIP, glServerPort))
|
|||
|
{
|
|||
|
CWinThread::InitInstance(); //<2F><><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
|
|||
|
m_bConnected = FALSE;
|
|||
|
//return FALSE;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
m_bConnected = TRUE;
|
|||
|
//<2F><><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD><EFBFBD><EFBFBD>֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
PostMessage(m_hWnd, WM_NETMESSAGE, NET_CONNECT_OK, (LPARAM)m_bDevID);
|
|||
|
}
|
|||
|
|
|||
|
m_pRecvDataBuffer = new BYTE[RECVDATA_BUFLEN];
|
|||
|
ASSERT(m_pRecvDataBuffer != NULL);
|
|||
|
|
|||
|
m_pDealBuf = new BYTE[DATADEAL_BUFLEN];
|
|||
|
ASSERT(m_pDealBuf != NULL);
|
|||
|
|
|||
|
m_iWritePos =0;
|
|||
|
m_iReadPos =0;
|
|||
|
m_llDataTotalLen =0;
|
|||
|
m_llReadTotal =0;
|
|||
|
m_wTcpID =0;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
return TRUE; //<2F>̲߳<DFB3><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
int CModbusClient::ExitInstance()
|
|||
|
{
|
|||
|
if (m_socket.m_hSocket != INVALID_SOCKET)
|
|||
|
{
|
|||
|
m_socket.ShutDown(2);
|
|||
|
m_socket.Close();
|
|||
|
}
|
|||
|
|
|||
|
//m_bConnected = FALSE;
|
|||
|
return CWinThread::ExitInstance();
|
|||
|
}
|
|||
|
|
|||
|
BEGIN_MESSAGE_MAP(CModbusClient, CWinThread)
|
|||
|
ON_THREAD_MESSAGE(WM_THREAD_RECV, OnCustomMsg)
|
|||
|
END_MESSAGE_MAP()
|
|||
|
|
|||
|
|
|||
|
// CModbusClient message handlers
|
|||
|
|
|||
|
void CModbusClient::OnCustomMsg(WPARAM wParam,LPARAM lParam)
|
|||
|
{
|
|||
|
BYTE pReadBf[DATALEN_PERTIME+1] = {0};
|
|||
|
int iRdLen =0;
|
|||
|
|
|||
|
switch(wParam)
|
|||
|
{
|
|||
|
case WP_WPARA_RECV:
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>Ȱѽ<C8B0><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ص<EFBFBD>
|
|||
|
m_socket.AsyncSelect(FD_CLOSE);
|
|||
|
|
|||
|
|
|||
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
iRdLen = m_socket.Receive(pReadBf,DATALEN_PERTIME);
|
|||
|
if (0 ==iRdLen)
|
|||
|
{
|
|||
|
//ToDo:<3A>Զ˶Ͽ<CBB6><CFBF><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
PostMessage(m_hWnd, WM_NETMESSAGE, NET_DISCONNECT, (LPARAM)m_bDevID);
|
|||
|
OutputDebugString(_T("CSerSocketThread:1-<2D><><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>Ϊ0<CEAA><30>TCP<43><50><EFBFBD>ӶϿ<D3B6>......"));
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>Ҫ<EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD>뻺<EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>
|
|||
|
if(m_iWritePos + iRdLen > RECVDATA_BUFLEN)
|
|||
|
{
|
|||
|
int iTailLen = RECVDATA_BUFLEN - m_iWritePos;
|
|||
|
memcpy(m_pRecvDataBuffer +m_iWritePos,pReadBf,iTailLen);
|
|||
|
|
|||
|
int iHeadLen = iRdLen - iTailLen;
|
|||
|
memcpy(m_pRecvDataBuffer,pReadBf + iTailLen,iHeadLen);
|
|||
|
|
|||
|
m_iWritePos = iHeadLen;
|
|||
|
}else{
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>㹻<EFBFBD><E3B9BB><EFBFBD>ɱ<EFBFBD><C9B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
memcpy(m_pRecvDataBuffer+m_iWritePos,pReadBf,iRdLen);
|
|||
|
m_iWritePos += iRdLen;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>
|
|||
|
m_llDataTotalLen += iRdLen;
|
|||
|
AnalysisRecvData();
|
|||
|
|
|||
|
//<2F><><EFBFBD>´<C2B4><F2BFAABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
|||
|
m_socket.AsyncSelect(FD_READ|FD_CLOSE);
|
|||
|
break;
|
|||
|
case WP_WPARA_CLOSE:
|
|||
|
PostMessage(m_hWnd, WM_NETMESSAGE, NET_DISCONNECT, (LPARAM)m_bDevID);
|
|||
|
//m_socket.Close();
|
|||
|
|
|||
|
OutputDebugString(_T("TCP<EFBFBD><EFBFBD><EFBFBD>ӶϿ<EFBFBD>......"));
|
|||
|
break;
|
|||
|
case WP_WPARA_THREAD_QUIT:
|
|||
|
PostQuitMessage(0);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CModbusClient::AnalysisRecvData()
|
|||
|
{
|
|||
|
if (m_llReadTotal + sizeof(ST_MODBUS_MBAP_HEADER) < m_llDataTotalLen) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȴ<EFBFBD><C8B4><EFBFBD>MBAP<41><50>
|
|||
|
{
|
|||
|
memset(m_pDealBuf,0,DATADEAL_BUFLEN);
|
|||
|
|
|||
|
//дָ<D0B4><D6B8><EFBFBD><EFBFBD>ʱ<EFBFBD>䶯<EFBFBD><E4B6AF><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ǰλ<C7B0><CEBB>
|
|||
|
int iRdCurrPos = m_iReadPos;
|
|||
|
int iWrtCurrPos = m_iWritePos;
|
|||
|
|
|||
|
ST_MODBUS_MBAP_HEADER stMbap;
|
|||
|
if(iRdCurrPos < iWrtCurrPos) //дָ<D0B4>볬ǰ<EBB3AC><C7B0>ָ<EFBFBD><D6B8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>֮<EFBFBD><D6AE>
|
|||
|
{
|
|||
|
memcpy(&stMbap,m_pRecvDataBuffer+iRdCurrPos,sizeof(ST_MODBUS_MBAP_HEADER));
|
|||
|
if (m_llReadTotal + sizeof(ST_MODBUS_MBAP_HEADER) +(ntohs(stMbap.wLen) -1) <= m_llDataTotalLen)
|
|||
|
{
|
|||
|
memcpy(m_pDealBuf,m_pRecvDataBuffer+iRdCurrPos,sizeof(ST_MODBUS_MBAP_HEADER)+ ntohs(stMbap.wLen) -1);
|
|||
|
DealFrameData(m_pDealBuf);
|
|||
|
|
|||
|
m_iReadPos +=(sizeof(ST_MODBUS_MBAP_HEADER) + ntohs(stMbap.wLen) -1);
|
|||
|
m_llReadTotal += (sizeof(ST_MODBUS_MBAP_HEADER) + ntohs(stMbap.wLen) -1);
|
|||
|
}else{
|
|||
|
return; //<2F><><EFBFBD><EFBFBD>һ֡
|
|||
|
}
|
|||
|
}
|
|||
|
else{//дָ<D0B4><D6B8><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>ָ<EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2>ͷ
|
|||
|
|
|||
|
if (iRdCurrPos +sizeof(ST_MODBUS_MBAP_HEADER) <= RECVDATA_BUFLEN)
|
|||
|
{
|
|||
|
memcpy(&stMbap,m_pRecvDataBuffer+iRdCurrPos,sizeof(ST_MODBUS_MBAP_HEADER));
|
|||
|
if (m_llReadTotal+sizeof(ST_MODBUS_MBAP_HEADER)+ ntohs(stMbap.wLen) -1 <= m_llDataTotalLen)
|
|||
|
{
|
|||
|
if (iRdCurrPos + sizeof(ST_MODBUS_MBAP_HEADER) + ntohs(stMbap.wLen) -1 <= RECVDATA_BUFLEN) //дָ<D0B4><D6B8><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>ָ<EFBFBD>룬<EFBFBD><EBA3AC>ָ<EFBFBD>뵽<EFBFBD><EBB5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD>Թ<EFBFBD>һ֡<D2BB><D6A1><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
memcpy(m_pDealBuf,m_pRecvDataBuffer+iRdCurrPos,sizeof(ST_MODBUS_MBAP_HEADER)+ ntohs(stMbap.wLen) -1);
|
|||
|
DealFrameData(m_pDealBuf);
|
|||
|
|
|||
|
m_iReadPos +=(sizeof(ST_MODBUS_MBAP_HEADER) + ntohs(stMbap.wLen) -1);
|
|||
|
m_llReadTotal += (sizeof(ST_MODBUS_MBAP_HEADER) +ntohs(stMbap.wLen) -1);
|
|||
|
m_iReadPos =m_iReadPos % RECVDATA_BUFLEN;
|
|||
|
}else{
|
|||
|
//<2F><>ǰ<EFBFBD><C7B0>ָ<EFBFBD>뵽<EFBFBD><EBB5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD>MBAPͷ<50><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
|
|||
|
memcpy(m_pDealBuf,m_pRecvDataBuffer+iRdCurrPos,RECVDATA_BUFLEN - iRdCurrPos);
|
|||
|
memcpy(m_pDealBuf+RECVDATA_BUFLEN - iRdCurrPos,m_pRecvDataBuffer,sizeof(ST_MODBUS_MBAP_HEADER) + ntohs(stMbap.wLen) -1 -(RECVDATA_BUFLEN - iRdCurrPos));
|
|||
|
DealFrameData(m_pDealBuf);
|
|||
|
|
|||
|
m_iReadPos = sizeof(ST_MODBUS_MBAP_HEADER) +ntohs(stMbap.wLen) -1 -(RECVDATA_BUFLEN - iRdCurrPos);
|
|||
|
m_llReadTotal += (sizeof(ST_MODBUS_MBAP_HEADER) + ntohs(stMbap.wLen) -1);
|
|||
|
}
|
|||
|
}
|
|||
|
else{
|
|||
|
return;//<2F><><EFBFBD><EFBFBD>һ֡
|
|||
|
}
|
|||
|
|
|||
|
}else{
|
|||
|
//<2F><>ǰ<EFBFBD><C7B0>ָ<EFBFBD>뵽<EFBFBD><EBB5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD>MBAPͷ<50><CDB7><EFBFBD><EFBFBD><F3B2BFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>ͷ
|
|||
|
memcpy(m_pDealBuf,m_pRecvDataBuffer+iRdCurrPos,RECVDATA_BUFLEN -iRdCurrPos);
|
|||
|
memcpy(m_pDealBuf+RECVDATA_BUFLEN -iRdCurrPos,m_pRecvDataBuffer,sizeof(ST_MODBUS_MBAP_HEADER) -(RECVDATA_BUFLEN - iRdCurrPos));
|
|||
|
|
|||
|
memcpy(&stMbap,m_pDealBuf,sizeof(ST_MODBUS_MBAP_HEADER));
|
|||
|
if (m_llReadTotal+sizeof(ST_MODBUS_MBAP_HEADER)+ ntohs(stMbap.wLen) -1 <= m_llDataTotalLen)
|
|||
|
{
|
|||
|
memcpy(m_pDealBuf,m_pRecvDataBuffer+iRdCurrPos,RECVDATA_BUFLEN -iRdCurrPos);
|
|||
|
memcpy(m_pDealBuf+RECVDATA_BUFLEN -iRdCurrPos,m_pRecvDataBuffer,sizeof(ST_MODBUS_MBAP_HEADER) -(RECVDATA_BUFLEN - iRdCurrPos) + ntohs(stMbap.wLen) -1);
|
|||
|
|
|||
|
DealFrameData(m_pDealBuf);
|
|||
|
|
|||
|
m_iReadPos = sizeof(ST_MODBUS_MBAP_HEADER) -(RECVDATA_BUFLEN - iRdCurrPos) + ntohs(stMbap.wLen) -1;
|
|||
|
m_llReadTotal += (sizeof(ST_MODBUS_MBAP_HEADER) + ntohs(stMbap.wLen) -1);
|
|||
|
}
|
|||
|
else{
|
|||
|
return;//<2F><><EFBFBD><EFBFBD>һ֡
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void CModbusClient::DealFrameData(BYTE* pData)
|
|||
|
{
|
|||
|
BYTE bSampleData[512] ={0};
|
|||
|
NET_PACKET* pNetPacket = NULL;
|
|||
|
int nLen = 0;
|
|||
|
ST_MODBUS_MBAP_HEADER stMbap;
|
|||
|
|
|||
|
BYTE bFuncCode = pData[sizeof(ST_MODBUS_MBAP_HEADER)];
|
|||
|
memcpy(&stMbap,pData,sizeof(ST_MODBUS_MBAP_HEADER));
|
|||
|
|
|||
|
int iFrmLen = ntohs(stMbap.wLen) +6;
|
|||
|
memcpy(bSampleData,pData,iFrmLen);
|
|||
|
|
|||
|
memset(&m_stReadRspFrm, 0, sizeof(ST_MODBUS_SERVER_RSPREAD_FRAME));
|
|||
|
memset(&m_stWrtRspFrm, 0, sizeof(ST_MODBUS_SERVER_RSPWRT_FRAME));
|
|||
|
memset(&m_stRspErrFrm, 0, sizeof(ST_MODBUS_SERVER_RSPERR_FRAME));
|
|||
|
|
|||
|
int iDataLen =ntohs(stMbap.wLen) -1;
|
|||
|
switch(bFuncCode)
|
|||
|
{
|
|||
|
case EN_MODBUS_READ_SINGLECOIL:
|
|||
|
case EN_MODBUS_READ_PERSISREG:
|
|||
|
memcpy(&m_stReadRspFrm,pData,iFrmLen); //ST_MODBUS_SERVER_RSPREAD_FRAME<4D>ij<EFBFBD>ԱbRtnData<74><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD>255<35>ֽڣ<D6BD>ʵ<EFBFBD><CAB5>ռ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD>255<35><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sizeof<6F><66>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
SetEvent(m_ReadEventHandle);
|
|||
|
//((CMechanicalArmOptDlg*)m_pMainDlg)->OnDevReadRspDataToBuffer(m_bDevID,stReadRspFrm);
|
|||
|
|
|||
|
/*pNetPacket = new NET_PACKET;
|
|||
|
pNetPacket->enType = NET_RD_MSG_RET;
|
|||
|
pNetPacket->nDevId = m_bDevID;
|
|||
|
pNetPacket->pData = new char[iFrmLen + 1];
|
|||
|
memcpy(pNetPacket->pData, pData, iFrmLen);
|
|||
|
pNetPacket->pData[iFrmLen] = '\0';
|
|||
|
pNetPacket->lLen = iFrmLen;
|
|||
|
PostMessage(m_hWnd, WM_NETMESSAGE, NET_DATA_MSG, (LPARAM)pNetPacket);*/
|
|||
|
|
|||
|
//delete[] pNetPacket->pData;
|
|||
|
//delete pNetPacket;
|
|||
|
|
|||
|
break;
|
|||
|
case EN_MODBUS_WRITE_SINGLECOIL:
|
|||
|
case EN_MODBUS_WRITE_MULTIREG:
|
|||
|
memcpy(&m_stWrtRspFrm,pData,sizeof(ST_MODBUS_SERVER_RSPWRT_FRAME));
|
|||
|
SetEvent(m_WriteEventHandle);
|
|||
|
//((CMechanicalArmOptDlg*)m_pMainDlg)->OnDevWrtRspDataToBuffer(m_bDevID,stWrtRspFrm);
|
|||
|
/*nLen = sizeof(ST_MODBUS_SERVER_RSPWRT_FRAME);
|
|||
|
pNetPacket = new NET_PACKET;
|
|||
|
pNetPacket->enType = NET_WR_MSG_RET;
|
|||
|
pNetPacket->nDevId = m_bDevID;
|
|||
|
pNetPacket->pData = new char[nLen + 1];
|
|||
|
memcpy(pNetPacket->pData, pData, nLen);
|
|||
|
pNetPacket->pData[nLen] = '\0';
|
|||
|
pNetPacket->lLen = nLen;
|
|||
|
PostMessage(m_hWnd, WM_NETMESSAGE, NET_DATA_MSG, (LPARAM)pNetPacket);*/
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
//ToDo:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
case EN_MODBUS_READ_SINGLECOIL_RSPERR:
|
|||
|
case EN_MODBUS_READ_PERSISREG_RSPERR:
|
|||
|
case EN_MODBUS_WRITE_SINGLECOIL_RSPERR:
|
|||
|
case EN_MODBUS_WRITE_MULTIREG_RSPERR:
|
|||
|
memcpy(&m_stWrtRspFrm,pData,sizeof(ST_MODBUS_SERVER_RSPERR_FRAME));
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int CModbusClient::WriteMultipleRegisters(int nRegAddr, int nRegCnt, short * pWriteData)
|
|||
|
{
|
|||
|
if (m_bConnected == FALSE)
|
|||
|
{
|
|||
|
PostMessage(m_hWnd, WM_NETMESSAGE, NET_DISCONNECT, (LPARAM)m_bDevID);
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
BYTE bData[512] = { 0 };
|
|||
|
|
|||
|
if (m_wTcpID + 1 == 0xFFFF)
|
|||
|
{
|
|||
|
m_wTcpID = 1;
|
|||
|
}
|
|||
|
else {
|
|||
|
m_wTcpID++;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ST_MODBUS_CLIENT_RQTWRTMULTIREG_FRAME frame;
|
|||
|
ST_MODBUS_MBAP_HEADER stMbapHeader;
|
|||
|
stMbapHeader.wTransFlag = htons(m_wTcpID);
|
|||
|
stMbapHeader.wProtocolFlag = 0;
|
|||
|
stMbapHeader.wLen = htons(7 + nRegCnt*2);
|
|||
|
stMbapHeader.bUnitFlag = 0x01;
|
|||
|
|
|||
|
frame.stMbapHeader = stMbapHeader;
|
|||
|
frame.bFuncConde = 0x10; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
frame.wStartAddr = htons(nRegAddr - 40001); //<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
frame.wRegNum = htons(nRegCnt); //<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>
|
|||
|
frame.bLen = nRegCnt * 2; //<2F><><EFBFBD><EFBFBD><EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD>(<28>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*2)
|
|||
|
|
|||
|
for (int i = 0; i < nRegCnt; i++)
|
|||
|
{
|
|||
|
UINT16 uintValue = htons(*(pWriteData+i));
|
|||
|
char* byteArray = (char*)(&uintValue); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>4<EFBFBD>ֽڵ<D6BD><DAB5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
for (int j = 0; j < 2; ++j)
|
|||
|
{
|
|||
|
frame.bRegVal[i*2 + j] = byteArray[j];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int iRtnsend = m_socket.Send(&frame, sizeof(ST_MODBUS_CLIENT_RQTWRTMULTIREG_FRAME) - (255 - nRegCnt * 2));
|
|||
|
if (iRtnsend > 0)
|
|||
|
{
|
|||
|
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5>ź<EFBFBD><C5BA><EFBFBD>
|
|||
|
switch (::WaitForSingleObject(m_WriteEventHandle, SOCKET_TIME_OUT))
|
|||
|
{
|
|||
|
case WAIT_OBJECT_0:
|
|||
|
{
|
|||
|
::ResetEvent(m_WriteEventHandle);
|
|||
|
break;
|
|||
|
}
|
|||
|
case WAIT_TIMEOUT:
|
|||
|
case WAIT_FAILED:
|
|||
|
default:
|
|||
|
{
|
|||
|
PostMessage(m_hWnd, WM_NETMESSAGE, NET_DISCONNECT, (LPARAM)m_bDevID);
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
return iRtnsend;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int CModbusClient::ReadMultipleRegisters(int nRegAddr, int nRegCnt, short * pReadData)
|
|||
|
{
|
|||
|
if (m_bConnected == FALSE)
|
|||
|
{
|
|||
|
PostMessage(m_hWnd, WM_NETMESSAGE, NET_DISCONNECT, (LPARAM)m_bDevID);
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
BYTE bData[512] = { 0 };
|
|||
|
|
|||
|
if (m_wTcpID + 1 == 0xFFFF)
|
|||
|
{
|
|||
|
m_wTcpID = 1;
|
|||
|
}
|
|||
|
else {
|
|||
|
m_wTcpID++;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ST_MODBUS_CLIENT_RQTREAD_FRAME frame;
|
|||
|
ST_MODBUS_MBAP_HEADER stMbapHeader;
|
|||
|
stMbapHeader.wTransFlag = htons(m_wTcpID);
|
|||
|
stMbapHeader.wProtocolFlag = 0;
|
|||
|
stMbapHeader.wLen = htons(6);
|
|||
|
stMbapHeader.bUnitFlag = 0x01;
|
|||
|
|
|||
|
frame.stMbapHeader = stMbapHeader;
|
|||
|
frame.bFuncConde = 0x03; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
frame.wStartAddr = htons(nRegAddr - 40001); //<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
frame.wRegNum = htons(nRegCnt); //<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>
|
|||
|
|
|||
|
|
|||
|
int iRtnsend = m_socket.Send(&frame, sizeof(ST_MODBUS_CLIENT_RQTREAD_FRAME));
|
|||
|
|
|||
|
if (iRtnsend > 0)
|
|||
|
{
|
|||
|
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5>ź<EFBFBD><C5BA><EFBFBD>
|
|||
|
switch (::WaitForSingleObject(m_ReadEventHandle, SOCKET_TIME_OUT))
|
|||
|
{
|
|||
|
case WAIT_OBJECT_0:
|
|||
|
{
|
|||
|
short *pData = (short *)(m_stReadRspFrm.bRtnData);
|
|||
|
for (int i = 0; i < m_stReadRspFrm.bLen / 2; i++)
|
|||
|
{
|
|||
|
pReadData[i] = htons(*(pData + i));
|
|||
|
}
|
|||
|
::ResetEvent(m_ReadEventHandle);
|
|||
|
break;
|
|||
|
}
|
|||
|
case WAIT_TIMEOUT:
|
|||
|
case WAIT_FAILED:
|
|||
|
default:
|
|||
|
{
|
|||
|
PostMessage(m_hWnd, WM_NETMESSAGE, NET_DISCONNECT, (LPARAM)m_bDevID);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return iRtnsend;
|
|||
|
}
|