123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- // MGE.cpp : 定义 DLL 的初始化例程。
- //
- #include "stdafx.h"
- #include "Head.h"
- #include "winsock2.h"
- #include <stdlib.h>
- #include ".\modbustcp.h"
- #include<vector>
- #pragma comment(lib, "ws2_32.lib ")
- vector<__NET_STRUCT> g_vtNetStruct;
- vector<RESPONSE_STRUCT>g_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; k<g_vtNetStruct.size(); k++)
- {
- if (g_vtNetStruct[k].pClientskt->m_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; i<g_vtNetStruct.size(); i++)
- {
- if (g_vtNetStruct[i].pClientskt->m_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);
- }
|