modbustcp.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. // MGE.cpp : 定义 DLL 的初始化例程。
  2. //
  3. #include "stdafx.h"
  4. #include "Head.h"
  5. #include "winsock2.h"
  6. #include <stdlib.h>
  7. #include ".\modbustcp.h"
  8. #include<vector>
  9. #pragma comment(lib, "ws2_32.lib ")
  10. vector<__NET_STRUCT> g_vtNetStruct;
  11. vector<RESPONSE_STRUCT>g_Response;
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #endif
  15. BOOL InitNet( int nAddr, int nNetPort, char strIpAddr[32], int iVarID);
  16. int NetDataCollect(int nNetPort, int nAddr, char strIpAddr[32], WORD wRegNum,
  17. WORD wStartAddr, WORD wTranProcessID, WORD wProtocolID,
  18. int nFuncCode, int iVarID);
  19. int GetNetIndex(int nNetPort, int nAddr, char strIpAddr[32]);
  20. BEGIN_MESSAGE_MAP(CModbustcpApp, CWinApp)
  21. END_MESSAGE_MAP()
  22. CModbustcpApp::CModbustcpApp()
  23. {
  24. // TODO: 在此处添加构造代码,
  25. // 将所有重要的初始化放置在 InitInstance 中
  26. }
  27. // 唯一的一个 CMGEApp 对象
  28. CModbustcpApp theApp;
  29. // CMGEApp 初始化
  30. BOOL CModbustcpApp::InitInstance()
  31. {
  32. CWinApp::InitInstance();
  33. return TRUE;
  34. }
  35. int CModbustcpApp::ExitInstance()
  36. {
  37. // TODO: 在此添加专用代码和/或调用基类
  38. // 关闭已经打开的串口
  39. for( unsigned int i = 0; i < g_vtNetStruct.size(); i++ )
  40. {
  41. if( g_vtNetStruct[i].pClientskt )
  42. {
  43. delete g_vtNetStruct[i].pClientskt;
  44. g_vtNetStruct[i].pClientskt = NULL;
  45. }
  46. }
  47. return CWinApp::ExitInstance();
  48. }
  49. int GetNetIndex( int nNetPort, int nAddr, char strIpAddr[32])
  50. {
  51. for( int i = 0; i < (int)g_vtNetStruct.size(); i++ )
  52. {
  53. if( (g_vtNetStruct[i].nNetPort == nNetPort) && (strcmp(g_vtNetStruct[i].strIpAddr, strIpAddr) == 0))// && g_vtComStruct[i].nAddr == nAddr)
  54. {
  55. return i;
  56. }
  57. }
  58. return -1;
  59. }
  60. int TCP_DLLInit( int nNetPort, int nAddr, char strIpAddr[32], WORD wRegNum,
  61. WORD wStartAddr, WORD wTranProcessID, WORD wProtocolID,
  62. int nFuncCode, int iVarID)
  63. {
  64. return NetDataCollect(nNetPort, nAddr, strIpAddr, wRegNum, wStartAddr,
  65. wTranProcessID,wProtocolID,nFuncCode,iVarID);
  66. }
  67. void TCP_DLLUnInit()
  68. {
  69. // 关闭串口,放到退出Dll时去关闭 ExitInstance
  70. return;
  71. }
  72. //初始化网络
  73. BOOL TCP_DLLInitNet( int nAddr, int nNetPort, char strIpAddr[32], int iVarID)
  74. {
  75. if (InitNet( nAddr, nNetPort, strIpAddr, iVarID))
  76. {
  77. return TRUE;
  78. }
  79. else
  80. {
  81. return FALSE;
  82. }
  83. }
  84. BOOL InitNet( int nAddr, int nNetPort, char strIpAddr[32],int iVarID)
  85. {
  86. CClientSocket *pClientSkt = NULL;
  87. int nNetIndex = GetNetIndex( nNetPort, nAddr, strIpAddr );
  88. pClientSkt = new CClientSocket;
  89. char chNetPort[8] = {0};
  90. itoa(nNetPort, chNetPort, 10);
  91. NET_STRUCT tagNetStruct = {0};
  92. if( nNetIndex == -1 )
  93. {
  94. if(!pClientSkt->Connection(strIpAddr, chNetPort))
  95. {
  96. delete pClientSkt;
  97. pClientSkt = NULL;
  98. return FALSE;
  99. }
  100. else
  101. {
  102. tagNetStruct.nAddr = nAddr;
  103. tagNetStruct.nNetPort = nNetPort;
  104. tagNetStruct.pClientskt = pClientSkt;
  105. tagNetStruct.pClientskt->m_structResponse.iVarlid = iVarID;
  106. memcpy(tagNetStruct.strIpAddr, strIpAddr, sizeof(tagNetStruct.strIpAddr));
  107. // 网络端口只打开一次且按顺序打开,不存在资源共享冲突,所以不用加保护
  108. g_vtNetStruct.push_back( tagNetStruct );
  109. }
  110. }else
  111. {
  112. tagNetStruct.nAddr = nAddr;
  113. tagNetStruct.nNetPort = nNetPort;
  114. tagNetStruct.pClientskt = g_vtNetStruct[nNetIndex].pClientskt;//pClientSkt;
  115. tagNetStruct.pClientskt->m_structResponse.iVarlid = iVarID;
  116. g_vtNetStruct.push_back( tagNetStruct );
  117. }
  118. return TRUE;
  119. }
  120. int TCP_DLLRequestStatusData(int nNetPort, int nAddr, char strIpAddr[32], char *pData, int iVarid)
  121. {
  122. int nNetIndex = GetNetIndex( nNetPort, nAddr, strIpAddr);
  123. if( nNetIndex == -1 ) return ERR_CODE_MODBUS_TCP_NET_FAULT;
  124. for (int k=0; k<g_vtNetStruct.size(); k++)
  125. {
  126. if (g_vtNetStruct[k].pClientskt->m_structResponse.iVarlid == iVarid)
  127. {
  128. nNetIndex = k;
  129. break;
  130. }
  131. }
  132. CClientSocket *pNet = NULL;
  133. pNet = g_vtNetStruct[nNetIndex].pClientskt;
  134. int nByteNum = pNet->m_structResponse.DataLen;//pNet->m_structResponse.StatusStruct.RtnByteNum[0];
  135. if( nByteNum == 0 )//设备没有请求到数据
  136. {
  137. return ERR_CODE_MODBUS_TCP_NET_READ_NO_DATA;
  138. }
  139. int i = 0;
  140. while( i < nByteNum )
  141. {
  142. pData[i] = pNet->m_structResponse.StrRtnMsg[i];
  143. i++;
  144. }
  145. return 0;
  146. }
  147. int TCP_DLLRequestWrStatusData(int nNetPort, int nAddr, char *pData)
  148. {
  149. //int nCommIndex = GetCommIndex( nCommPort, nAddr );
  150. //if( nCommIndex == -1 ) return ERR_CODE_MODBUS_ASC_COM_FAULT;
  151. //CCommAsyn *pComm = NULL;
  152. //pComm = g_vtComStruct[nCommIndex].pComm;
  153. //char DataLen[4] = {0};
  154. //DataLen[0] = pComm->m_pProtocol->m_RequestWrParam.RequestRegNum[0];
  155. //DataLen[1] = pComm->m_pProtocol->m_RequestWrParam.RequestRegNum[1];
  156. //DataLen[2] = pComm->m_pProtocol->m_RequestWrParam.RequestRegNum[2];
  157. //DataLen[3] = pComm->m_pProtocol->m_RequestWrParam.RequestRegNum[3];
  158. //int nByteNum = atoi((const char*)DataLen);
  159. //if( nByteNum == 0 ) // 设备没有请求到数据
  160. //{
  161. // return ERR_CODE_MODBUS_ASC_COM_READ_NO_DATA;
  162. //}
  163. //int i = 0;
  164. //int nNum = 4 * nByteNum;
  165. //while( i < nNum )
  166. //{
  167. // pData[i] = pComm->m_pProtocol->m_RequestWrParam.Data[i];
  168. // i++;
  169. //}
  170. return 0;
  171. }
  172. int TCP_DLLWrNet(int nNetPort, int nAddr, SETBASEPARAM SetBasePara, double Data, int nDataLen)
  173. {
  174. //int nCommIndex = GetCommIndex( nCommPort, nAddr );
  175. //if( nCommIndex == -1 ) return ERR_CODE_MODBUS_ASC_COM_FAULT;
  176. //CCommAsyn *pComm = NULL;
  177. //pComm = g_vtComStruct[nCommIndex].pComm;
  178. //int iResult = pComm->WriteCommand(SetBasePara, Data, nDataLen);
  179. //return iResult;
  180. return 0;
  181. }
  182. int NetDataCollect(int nNetPort, int nAddr, char strIpAddr[32],
  183. WORD wRegNum, WORD wStartAddr, WORD wTranProcessID,
  184. WORD wProtocolID, int nFuncCode,int iVarID)
  185. {
  186. REQUESTPARAM SetBasePara = {0};
  187. int nNetIndex = GetNetIndex( nNetPort, nAddr, strIpAddr);
  188. if( nNetIndex == -1 ) return ERR_CODE_MODBUS_TCP_NET_FAULT;
  189. for (int i=0; i<g_vtNetStruct.size(); i++)
  190. {
  191. if (g_vtNetStruct[i].pClientskt->m_structResponse.iVarlid == iVarID)
  192. {
  193. nNetIndex = i;
  194. break;
  195. }
  196. }
  197. CClientSocket *pClientSkt = NULL;
  198. pClientSkt = g_vtNetStruct[nNetIndex].pClientskt;
  199. WORD wByteNum = sizeof(SetBasePara.RegNum) +
  200. sizeof(SetBasePara.StartAddr) +
  201. sizeof(SetBasePara.Header.EquipAddr) +
  202. sizeof(SetBasePara.Header.FuncCode);
  203. SetBasePara.Header.TranProcessID = htons(wTranProcessID);
  204. SetBasePara.Header.ProtocolID = htons(wProtocolID);
  205. SetBasePara.Header.FuncCode = nFuncCode;
  206. SetBasePara.Header.EquipAddr = (BYTE)nAddr;
  207. SetBasePara.Header.ByteNum = htons(wByteNum);
  208. SetBasePara.RegNum = htons(wRegNum);
  209. SetBasePara.StartAddr = htons(wStartAddr);
  210. return pClientSkt->WorkMain(SetBasePara,iVarID);
  211. }