eda9015.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. #include "StdAfx.h"
  2. #include ".\eda9015.h"
  3. eda9015::eda9015(char *szPath,char *szIniName,int nCommPort,int nAddr,int nRate,int nDataBit,int nStopBit,int nParity,int nInterval)
  4. {
  5. #if IS_USE_READMSG_CS
  6. InitializeCriticalSection( &m_csReadMsg ); //初始化一个临界资源对象
  7. #endif
  8. MTVERIFY( m_hSemComm = CreateEvent( NULL, TRUE, TRUE, 0) ); //CreateEvent()创建或打开一个命名的或无名的事件对象
  9. for( int i = 0; i < MAX_ADDR; i++ )
  10. {
  11. memset(m_sz_0_7_Msg[i], 0, sizeof(m_sz_0_7_Msg[i]));
  12. memset(m_sz_8_11_Msg[i], 0, sizeof(m_sz_8_11_Msg[i]));
  13. m_devOnline[i] = TRUE;
  14. m_dwOnlineTick[i] = 0;
  15. }
  16. }
  17. eda9015::~eda9015()
  18. {
  19. #if IS_USE_READMSG_CS
  20. DeleteCriticalSection( &m_csReadMsg );
  21. #endif
  22. MTVERIFY( CloseHandle( m_hSemComm ) );
  23. CloseComm();
  24. }
  25. BOOL eda9015::eda9015_OpenComm(int nCommPort, int nAddr, int nRate, int nDataBit, int nStopBit, int nParity, int nInterval)
  26. {
  27. BOOL bResult = FALSE;
  28. bResult = OpenComm( nCommPort, nAddr, nRate, nDataBit, nStopBit, nParity, nInterval );
  29. if( TRUE == bResult )
  30. {
  31. LOG4C((LOG_NOTICE,"COM%d 打开成功",nCommPort));
  32. }
  33. else
  34. LOG4C((LOG_NOTICE,"COM%d 打开失败",nCommPort));
  35. return bResult;
  36. }
  37. int eda9015::GetIniInfo(char *szPath,char *szIniName,char *szCmd,char *IniSendCMD,int &IniSendlen,char *szDataType,int &nIndex,int &nLen, int &iSBit, int &iEBit)
  38. {
  39. CHAR szFile[MAX_PATH + 1] = "";
  40. wsprintf(szFile, "%s\\config\\%s", szPath, szIniName);
  41. IniSendlen = GetPrivateProfileString(szCmd, "SendCmd", "", IniSendCMD, 10, szFile); // 返回的字符串是以\0结束的;
  42. GetPrivateProfileString(szCmd, "type", "", szDataType, 10, szFile);
  43. szDataType[strlen(szDataType)] = '\0';
  44. nIndex = GetPrivateProfileInt(szCmd, "Index", 0, szFile);
  45. nLen = GetPrivateProfileInt(szCmd, "Len", 0, szFile);
  46. iSBit = GetPrivateProfileInt(szCmd, "iSBit", 0, szFile);//从配置文件中取值
  47. iEBit = GetPrivateProfileInt(szCmd, "iEBit", 0, szFile);
  48. return 0;
  49. }
  50. // 发送读取设备参数请求
  51. int eda9015::SendReadRequest(
  52. char szPath[MAX_PATH], // 程序所在路径
  53. char szIniName[MAX_PATH], // 配置文件名称
  54. int nCommPort, // 串行端口
  55. int nAddr, // 设备地址
  56. char szCmd[MAX_CMD], // 请求命令
  57. char szMsg[VAR_MSG], // 响应的值
  58. int nReversed1, // 预留整形参数1接口
  59. int nReversed2, // 预留整形参数2接口
  60. int nReversed3, // 预留整形参数3接口
  61. int nReversed4, // 预留整形参数4接口
  62. int nReversed5, // 预留整形参数5接口
  63. float fReversed1, // 预留float参数1接口
  64. float fReversed2, // 预留float参数2接口
  65. float fReversed3, // 预留float参数3接口
  66. char szReversed1[MAX_RESERVED1], // 预留字符数组参数1接口
  67. char szReversed2[MAX_RESERVED2], // 预留字符数组参数2接口
  68. char szReversed3[MAX_RESERVED3], // 预留字符数组参数3接口
  69. char szReversed4[MAX_RESERVED4], // 预留字符数组参数4接口
  70. char szReversed5[MAX_RESERVED5] // 预留字符数组参数5接口
  71. )
  72. {
  73. CCommProcess *pComm = FindComm(nCommPort);
  74. if( pComm == NULL ) return -1;
  75. int nRet = -1;
  76. int nIndex(0), nLen(0), IniSendlen(0),iSBit(0), iEBit(0);
  77. char IniSendCMD[MAX_CMD] = {0}, szDataType[CMD_TYPE] = {0};
  78. GetIniInfo(szPath,szIniName,szCmd,IniSendCMD,IniSendlen,szDataType,nIndex,nLen,iSBit,iEBit);
  79. if( (strlen(m_sz_0_7_Msg[nAddr -1]) == 0 && strcmp(IniSendCMD,"73")) || strcmp(szCmd,"cmd-1") == 0 ||
  80. (strlen(m_sz_8_11_Msg[nAddr -1]) == 0 && strcmp(IniSendCMD,"85")) || strcmp(szCmd,"cmd-9") == 0 )
  81. {
  82. nRet = GetDeviceParam( nAddr,pComm, szCmd, IniSendCMD, IniSendlen );
  83. if ( nRet != 0)
  84. return nRet;
  85. }
  86. if( GetTickCount() - m_dwOnlineTick[nAddr - 1] > 60 *1000 && m_dwOnlineTick[nAddr - 1] > 0 )
  87. m_devOnline[nAddr - 1] = FALSE;
  88. else if( GetTickCount() - m_dwOnlineTick[nAddr - 1] < 60 *1000 && m_dwOnlineTick[nAddr - 1] > 0 )
  89. m_devOnline[nAddr - 1] = TRUE;
  90. if( m_devOnline[nAddr - 1] == FALSE )
  91. return -1;
  92. nRet = Get_07VarMsg( nAddr, szCmd,IniSendCMD, szMsg, nIndex, nLen, szDataType,iSBit,iEBit);
  93. nRet = Get_8EVarMsg( nAddr, szCmd,IniSendCMD, szMsg, nIndex, nLen, szDataType,iSBit,iEBit);
  94. LOG4C((LOG_NOTICE,"COM%d,Addr=%d, %s = %s",nCommPort,nAddr,szCmd,szMsg));
  95. return nRet;
  96. }
  97. int eda9015::GetDeviceParam(int nAddr,CCommProcess *pComm,char *szCmd,char *IniSendCMD,const int &IniSendlen)
  98. {
  99. int nRet = -1;
  100. nRet = Send_ReadDeviceData(nAddr,pComm,szCmd,IniSendCMD,IniSendlen);
  101. if( nRet != 0 )
  102. return nRet;
  103. nRet = Recv_ReadDeviceData( nAddr,pComm,szCmd,IniSendCMD);
  104. return nRet;
  105. }
  106. int eda9015::SendSetReuest(
  107. char *szPath, // 程序所在路径
  108. char *szIniName, // 配置文件名称
  109. int nCommPort, // 串行端口
  110. int nAddr, // 设备地址
  111. char *szCmd, // 请求命令
  112. char *szMsg, // 响应的值
  113. int nReversed1, // 预留整形参数1接口
  114. int nReversed2, // 预留整形参数2接口
  115. int nReversed3, // 预留整形参数3接口
  116. int nReversed4, // 预留整形参数4接口
  117. int nReversed5, // 预留整形参数5接口
  118. float fReversed1, // 预留float参数1接口
  119. float fReversed2, // 预留float参数2接口
  120. float fReversed3, // 预留float参数3接口
  121. char *szReversed1, // 预留字符数组参数1接口
  122. char *szReversed2, // 预留字符数组参数2接口
  123. char *szReversed3, // 预留字符数组参数3接口
  124. char *szReversed4, // 预留字符数组参数4接口
  125. char *szReversed5 // 预留字符数组参数5接口
  126. )
  127. {
  128. return 0;
  129. }
  130. int eda9015::Send_ReadDeviceData(int nAddr,CCommProcess *pComm,char *szCmd, const char *IniSendCMD,const int &IniSendlen)
  131. {
  132. #if DEBUG_EDA9015
  133. int iSendLen = 0;
  134. BYTE byArySend[5] = {0};
  135. // SOI
  136. byArySend[0] = 0x23;
  137. // 地址;
  138. byArySend[1] = ByteToAscii((nAddr>>4) & 0x0f);
  139. byArySend[2] = ByteToAscii(nAddr & 0x0f);
  140. // EOI;
  141. byArySend[3] = atoi(IniSendCMD);
  142. byArySend[4] = 0x0D;
  143. iSendLen = 5;
  144. if( WaitForSingleObject( m_hSemComm, 0 ) == WAIT_OBJECT_0 ) // 有信号才写串口
  145. {
  146. ResetEvent( m_hSemComm );
  147. int nResult = pComm->Write(byArySend, iSendLen);
  148. if( nResult != iSendLen )
  149. {
  150. LOG4C((LOG_NOTICE,"Send_ReadDeviceData::发送命令失败"));
  151. SetEvent( m_hSemComm );
  152. return ERR_CODE_COM_FAULT;
  153. }
  154. }
  155. else
  156. {
  157. LOG4C((LOG_NOTICE,"Send_ReadDeviceData::线程信号外"));
  158. return ERR_CODE_COM_BUSY;
  159. }
  160. #endif
  161. return 0;
  162. }
  163. int eda9015::Recv_ReadDeviceData(int nAddr,CCommProcess *pComm,char *szCmd,char *szSendMsg)
  164. {
  165. #if DEBUG_EDA9015
  166. BYTE *byAryRecv = new BYTE[250];
  167. ZeroMemory(byAryRecv, 250);
  168. int iRecvLen = pComm->Read(byAryRecv, 250);
  169. if( iRecvLen <= 0)
  170. {
  171. SetEvent( m_hSemComm );
  172. if( iRecvLen != NULL)
  173. {
  174. LOG4C((LOG_NOTICE,"Recv_ReadDeviceData::无数据返回"));
  175. delete[] byAryRecv;
  176. byAryRecv = NULL;
  177. }
  178. return ERR_CODE_COM_READ_NO_DATA;
  179. }
  180. Set_07VarMsg( nAddr,szCmd,szSendMsg,(char*)byAryRecv);
  181. Set_8EVarMsg( nAddr,szCmd,szSendMsg,(char*)byAryRecv);
  182. m_dwOnlineTick[nAddr -1] = GetTickCount();
  183. SetEvent( m_hSemComm );
  184. if( byAryRecv != NULL)
  185. {
  186. delete[] byAryRecv;
  187. byAryRecv = NULL;
  188. }
  189. #else
  190. SimulationCommData();
  191. #endif
  192. return 0;
  193. }
  194. void eda9015::Set_07VarMsg( int nAddr,char *szCmd,char *szSendCMD, char *pBuffer)
  195. {
  196. if ( strcmp(szSendCMD,"73") == 0)
  197. {
  198. #if IS_USE_READMSG_CS
  199. EnterCriticalSection( &m_csReadMsg );
  200. #endif
  201. memcpy(m_sz_0_7_Msg[nAddr-1], pBuffer, sizeof(m_sz_0_7_Msg[nAddr-1]));
  202. #if IS_USE_READMSG_CS
  203. LeaveCriticalSection(&m_csReadMsg);
  204. #endif
  205. }
  206. }
  207. void eda9015::Set_8EVarMsg( int nAddr,char *szCmd,char *szSendCMD, char *pBuffer)
  208. {
  209. if ( strcmp(szSendCMD,"85") == 0)
  210. {
  211. #if IS_USE_READMSG_CS
  212. EnterCriticalSection( &m_csReadMsg );
  213. #endif
  214. memcpy(m_sz_8_11_Msg[nAddr-1], pBuffer, sizeof(m_sz_8_11_Msg[nAddr-1]));
  215. #if IS_USE_READMSG_CS
  216. LeaveCriticalSection(&m_csReadMsg);
  217. #endif
  218. }
  219. }
  220. int eda9015::Get_07VarMsg(int nAddr,char *szCmd,char *szSendCMD, char *szRecvMsg,int &nIndex,int &nLen,char *szDataType,const int &iSBit, const int &iEBit)
  221. {
  222. int nRet = 0;
  223. if ( strcmp(szSendCMD,"73") == 0)
  224. {
  225. #if IS_USE_READMSG_CS
  226. EnterCriticalSection( &m_csReadMsg );
  227. #endif
  228. DataConversion(szDataType, m_sz_0_7_Msg[nAddr -1] + nIndex, szRecvMsg, nLen, 0, 0);
  229. {// 系数转换;
  230. float fNum = atof(szRecvMsg);
  231. //fNum -= 4;
  232. sprintf(szRecvMsg,"%f",fNum);
  233. }
  234. #if IS_USE_READMSG_CS
  235. LeaveCriticalSection(&m_csReadMsg);
  236. nRet = 0;
  237. #endif
  238. }
  239. return nRet;
  240. }
  241. int eda9015::Get_8EVarMsg(int nAddr,char *szCmd,char *szSendCMD, char *szRecvMsg,int &nIndex,int &nLen,char *szDataType,const int &iSBit, const int &iEBit)
  242. {
  243. int nRet = 0;
  244. if ( strcmp(szSendCMD,"85") == 0)
  245. {
  246. #if IS_USE_READMSG_CS
  247. EnterCriticalSection( &m_csReadMsg );
  248. #endif
  249. DataConversion(szDataType, m_sz_8_11_Msg[nAddr -1] + nIndex, szRecvMsg, nLen, 0, 0);
  250. {// 系数转换;
  251. float fNum = atof(szRecvMsg);
  252. //fNum -= 4;
  253. sprintf(szRecvMsg,"%f",fNum);
  254. }
  255. #if IS_USE_READMSG_CS
  256. LeaveCriticalSection(&m_csReadMsg);
  257. nRet = 0;
  258. #endif
  259. }
  260. return nRet;
  261. }
  262. void eda9015::SimulationCommData(void)
  263. {
  264. //memcpy(m_szMsg,":0104061F0801030109EF..",sizeof(":010406120801030109EF.."));
  265. }