fast/Plugin/Plc/ModbusClient.cpp

464 lines
12 KiB
C++
Raw Normal View History

2025-01-20 10:30:01 +08:00
// 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;
}