// MGE.cpp : 定义 DLL 的初始化例程。 // #include "stdafx.h" #include "Head.h" #include "winsock2.h" #include #include ".\modbustcp.h" #include #pragma comment(lib, "ws2_32.lib ") vector<__NET_STRUCT> g_vtNetStruct; vectorg_Response; #ifdef _DEBUG #define new DEBUG_NEW #endif BOOL InitNet( int nAddr, int nNetPort, char strIpAddr[32], int iVarID); int NetDataCollect(int nNetPort, int nAddr, char strIpAddr[32], WORD wRegNum, WORD wStartAddr, WORD wTranProcessID, WORD wProtocolID, int nFuncCode, int iVarID); int GetNetIndex(int nNetPort, int nAddr, char strIpAddr[32]); BEGIN_MESSAGE_MAP(CModbustcpApp, CWinApp) END_MESSAGE_MAP() CModbustcpApp::CModbustcpApp() { // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance 中 } // 唯一的一个 CMGEApp 对象 CModbustcpApp theApp; // CMGEApp 初始化 BOOL CModbustcpApp::InitInstance() { CWinApp::InitInstance(); return TRUE; } int CModbustcpApp::ExitInstance() { // TODO: 在此添加专用代码和/或调用基类 // 关闭已经打开的串口 for( unsigned int i = 0; i < g_vtNetStruct.size(); i++ ) { if( g_vtNetStruct[i].pClientskt ) { delete g_vtNetStruct[i].pClientskt; g_vtNetStruct[i].pClientskt = NULL; } } return CWinApp::ExitInstance(); } int GetNetIndex( int nNetPort, int nAddr, char strIpAddr[32]) { for( int i = 0; i < (int)g_vtNetStruct.size(); i++ ) { if( (g_vtNetStruct[i].nNetPort == nNetPort) && (strcmp(g_vtNetStruct[i].strIpAddr, strIpAddr) == 0))// && g_vtComStruct[i].nAddr == nAddr) { return i; } } return -1; } int TCP_DLLInit( int nNetPort, int nAddr, char strIpAddr[32], WORD wRegNum, WORD wStartAddr, WORD wTranProcessID, WORD wProtocolID, int nFuncCode, int iVarID) { return NetDataCollect(nNetPort, nAddr, strIpAddr, wRegNum, wStartAddr, wTranProcessID,wProtocolID,nFuncCode,iVarID); } void TCP_DLLUnInit() { // 关闭串口,放到退出Dll时去关闭 ExitInstance return; } //初始化网络 BOOL TCP_DLLInitNet( int nAddr, int nNetPort, char strIpAddr[32], int iVarID) { if (InitNet( nAddr, nNetPort, strIpAddr, iVarID)) { return TRUE; } else { return FALSE; } } BOOL InitNet( int nAddr, int nNetPort, char strIpAddr[32],int iVarID) { CClientSocket *pClientSkt = NULL; int nNetIndex = GetNetIndex( nNetPort, nAddr, strIpAddr ); pClientSkt = new CClientSocket; char chNetPort[8] = {0}; itoa(nNetPort, chNetPort, 10); NET_STRUCT tagNetStruct = {0}; if( nNetIndex == -1 ) { if(!pClientSkt->Connection(strIpAddr, chNetPort)) { delete pClientSkt; pClientSkt = NULL; return FALSE; } else { tagNetStruct.nAddr = nAddr; tagNetStruct.nNetPort = nNetPort; tagNetStruct.pClientskt = pClientSkt; tagNetStruct.pClientskt->m_structResponse.iVarlid = iVarID; memcpy(tagNetStruct.strIpAddr, strIpAddr, sizeof(tagNetStruct.strIpAddr)); // 网络端口只打开一次且按顺序打开,不存在资源共享冲突,所以不用加保护 g_vtNetStruct.push_back( tagNetStruct ); } }else { tagNetStruct.nAddr = nAddr; tagNetStruct.nNetPort = nNetPort; tagNetStruct.pClientskt = g_vtNetStruct[nNetIndex].pClientskt;//pClientSkt; tagNetStruct.pClientskt->m_structResponse.iVarlid = iVarID; g_vtNetStruct.push_back( tagNetStruct ); } return TRUE; } int TCP_DLLRequestStatusData(int nNetPort, int nAddr, char strIpAddr[32], char *pData, int iVarid) { int nNetIndex = GetNetIndex( nNetPort, nAddr, strIpAddr); if( nNetIndex == -1 ) return ERR_CODE_MODBUS_TCP_NET_FAULT; for (int k=0; km_structResponse.iVarlid == iVarid) { nNetIndex = k; break; } } CClientSocket *pNet = NULL; pNet = g_vtNetStruct[nNetIndex].pClientskt; int nByteNum = pNet->m_structResponse.DataLen;//pNet->m_structResponse.StatusStruct.RtnByteNum[0]; if( nByteNum == 0 )//设备没有请求到数据 { return ERR_CODE_MODBUS_TCP_NET_READ_NO_DATA; } int i = 0; while( i < nByteNum ) { pData[i] = pNet->m_structResponse.StrRtnMsg[i]; i++; } return 0; } int TCP_DLLRequestWrStatusData(int nNetPort, int nAddr, char *pData) { //int nCommIndex = GetCommIndex( nCommPort, nAddr ); //if( nCommIndex == -1 ) return ERR_CODE_MODBUS_ASC_COM_FAULT; //CCommAsyn *pComm = NULL; //pComm = g_vtComStruct[nCommIndex].pComm; //char DataLen[4] = {0}; //DataLen[0] = pComm->m_pProtocol->m_RequestWrParam.RequestRegNum[0]; //DataLen[1] = pComm->m_pProtocol->m_RequestWrParam.RequestRegNum[1]; //DataLen[2] = pComm->m_pProtocol->m_RequestWrParam.RequestRegNum[2]; //DataLen[3] = pComm->m_pProtocol->m_RequestWrParam.RequestRegNum[3]; //int nByteNum = atoi((const char*)DataLen); //if( nByteNum == 0 ) // 设备没有请求到数据 //{ // return ERR_CODE_MODBUS_ASC_COM_READ_NO_DATA; //} //int i = 0; //int nNum = 4 * nByteNum; //while( i < nNum ) //{ // pData[i] = pComm->m_pProtocol->m_RequestWrParam.Data[i]; // i++; //} return 0; } int TCP_DLLWrNet(int nNetPort, int nAddr, SETBASEPARAM SetBasePara, double Data, int nDataLen) { //int nCommIndex = GetCommIndex( nCommPort, nAddr ); //if( nCommIndex == -1 ) return ERR_CODE_MODBUS_ASC_COM_FAULT; //CCommAsyn *pComm = NULL; //pComm = g_vtComStruct[nCommIndex].pComm; //int iResult = pComm->WriteCommand(SetBasePara, Data, nDataLen); //return iResult; return 0; } int NetDataCollect(int nNetPort, int nAddr, char strIpAddr[32], WORD wRegNum, WORD wStartAddr, WORD wTranProcessID, WORD wProtocolID, int nFuncCode,int iVarID) { REQUESTPARAM SetBasePara = {0}; int nNetIndex = GetNetIndex( nNetPort, nAddr, strIpAddr); if( nNetIndex == -1 ) return ERR_CODE_MODBUS_TCP_NET_FAULT; for (int i=0; im_structResponse.iVarlid == iVarID) { nNetIndex = i; break; } } CClientSocket *pClientSkt = NULL; pClientSkt = g_vtNetStruct[nNetIndex].pClientskt; WORD wByteNum = sizeof(SetBasePara.RegNum) + sizeof(SetBasePara.StartAddr) + sizeof(SetBasePara.Header.EquipAddr) + sizeof(SetBasePara.Header.FuncCode); SetBasePara.Header.TranProcessID = htons(wTranProcessID); SetBasePara.Header.ProtocolID = htons(wProtocolID); SetBasePara.Header.FuncCode = nFuncCode; SetBasePara.Header.EquipAddr = (BYTE)nAddr; SetBasePara.Header.ByteNum = htons(wByteNum); SetBasePara.RegNum = htons(wRegNum); SetBasePara.StartAddr = htons(wStartAddr); return pClientSkt->WorkMain(SetBasePara,iVarID); }