leicai.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. #include "StdAfx.h"
  2. #include ".\leicai.h"
  3. leicai::leicai(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));
  9. for (int i = 0 ; i < MAX_ADDR; i++)
  10. {
  11. memset(m_sz_Msg[i], 0, sizeof(m_sz_Msg[i]));
  12. m_devOnline[i] = TRUE;
  13. m_dwOnlineTick[i] = 0;
  14. }
  15. }
  16. leicai::~leicai(void)
  17. {
  18. #if IS_USE_READMSG_CS
  19. DeleteCriticalSection(& m_csReadMsg);
  20. #endif
  21. MTVERIFY(CloseHandle(m_hSemComm));
  22. CloseComm();
  23. }
  24. BOOL leicai::leicaiOpenComm(int nCommPort, int nAddr, int nRate, int nDataBit, int nStopBit, int nParity, int nInterval)
  25. {
  26. BOOL bResult = FALSE;
  27. bResult = OpenComm( nCommPort, nAddr, nRate, nDataBit, nStopBit, nParity, nInterval );
  28. return bResult;
  29. }
  30. int leicai::SendReadRequest(
  31. char *szPath, // 程序所在路径
  32. char *szIniName, // 配置文件名称
  33. int nCommPort, // 串行端口
  34. int nAddr, // 设备地址
  35. char *szCmd, // 请求命令
  36. char *szMsg, // 响应的值
  37. int nReversed1, // 预留整形参数1接口
  38. int nReversed2, // 预留整形参数2接口
  39. int nReversed3, // 预留整形参数3接口
  40. int nReversed4, // 预留整形参数4接口
  41. int nReversed5, // 预留整形参数5接口
  42. float fReversed1, // 预留float参数1接口
  43. float fReversed2, // 预留float参数2接口
  44. float fReversed3, // 预留float参数3接口
  45. char *szReversed1, // 预留字符数组参数1接口
  46. char *szReversed2, // 预留字符数组参数2接口
  47. char *szReversed3, // 预留字符数组参数3接口
  48. char *szReversed4, // 预留字符数组参数4接口
  49. char *szReversed5 // 预留字符数组参数5接口
  50. )
  51. {
  52. CCommProcess *pComm = FindComm(nCommPort);
  53. if( pComm == NULL ) return -1;
  54. int nRet = -1;
  55. int nIndex(0), nLen(0), IniSendlen(0),iSBit(0), iEBit(0);
  56. char IniSendCMD[MAX_CMD] = {0}, szDataType[CMD_TYPE] = {0};
  57. GetIniInfo(szPath,szIniName,szCmd,IniSendCMD,IniSendlen,szDataType,nIndex,nLen,iSBit,iEBit);
  58. if( ( strlen(m_sz_Msg[nAddr -1]) == 0 && strcmp(IniSendCMD,"G1") == 0 ) || strcmp(szCmd, "cmd-1") == 0 )
  59. {
  60. nRet = GetDeviceParam(nAddr,pComm,IniSendCMD,IniSendlen);
  61. if( nRet != 0 )
  62. {
  63. LOG4C((LOG_NOTICE,"收发数据失败"));
  64. return nRet;
  65. }
  66. }
  67. if( GetTickCount() - m_dwOnlineTick[nAddr -1] > 60 * 1000 && m_dwOnlineTick[nAddr -1] > 0 )
  68. m_devOnline[nAddr -1] = FALSE;
  69. else if( GetTickCount() - m_dwOnlineTick[nAddr -1] < 60 * 1000 && m_dwOnlineTick[nAddr -1] > 0 )
  70. m_devOnline[nAddr -1] = TRUE;
  71. if( m_devOnline[nAddr -1] == FALSE )
  72. return -1;
  73. nRet = Getleicai_Msg(nAddr,IniSendCMD, szMsg, nIndex, nLen,szDataType,iSBit,iEBit );
  74. LOG4C((LOG_NOTICE, "COM%d,Addr=%d, %s = %s",nCommPort,nAddr,szCmd,szMsg));
  75. return nRet;
  76. }
  77. int leicai::GetDeviceParam( int nAddr,CCommProcess *pComm, char *IniSendCMD,const int &IniSendlen)
  78. {
  79. int nRet = -1;
  80. nRet = Send_ReadDeviceData(nAddr,pComm,IniSendCMD,IniSendlen);
  81. if( nRet != 0 )
  82. return nRet;
  83. nRet = Recv_ReadDeviceData(nAddr,pComm,IniSendCMD);
  84. return nRet;
  85. }
  86. // IniSendCMD 2个byte;
  87. int leicai::Send_ReadDeviceData(int nAddr,CCommProcess *pComm,const char *IniSendCMD,const int &IniSendlen)
  88. {
  89. #if DEBUG_LEICAI
  90. BYTE byArySend[9] = {0};
  91. // Addr;
  92. byArySend[0] = nAddr;
  93. // fuc;
  94. byArySend[1] = 0x04;
  95. // Ver;
  96. byArySend[2] = 0x00;
  97. byArySend[3] = 0x00;
  98. byArySend[4] = 0x00;
  99. byArySend[5] = 0x03;
  100. int iCrc = GetModbus16CRC( byArySend, 6);
  101. BYTE high = iCrc>>8&0xff;
  102. BYTE low = iCrc&0xff;
  103. byArySend[6] = low;
  104. byArySend[7] = high;
  105. int nDatalen = 8;
  106. if (WaitForSingleObject(m_hSemComm,0) == WAIT_OBJECT_0 )
  107. {
  108. ResetEvent(m_hSemComm);
  109. int nResult = pComm->Write(byArySend, nDatalen);
  110. if (nResult != nDatalen)
  111. {
  112. SetEvent(m_hSemComm);
  113. LOG4C((LOG_NOTICE,"实际写长度不一致"));
  114. return EER_CODE_LEICAI_COM_REGNUM;
  115. }
  116. }
  117. else
  118. {
  119. LOG4C((LOG_NOTICE,"线程信号外"));
  120. return ERR_CODE_LEICAI_COM_BUSY;
  121. }
  122. #endif
  123. return 0;
  124. }
  125. int leicai::Recv_ReadDeviceData(int nAddr,CCommProcess *pComm,char *szSendCMD)
  126. {
  127. #if DEBUG_LEICAI
  128. int nReceiveLen = 260;
  129. int nReadLen = 0;
  130. char *pBuff = new char[nReceiveLen];
  131. memset(pBuff, 0 , nReceiveLen);
  132. nReadLen = pComm->Read((BYTE *)pBuff,nReceiveLen);
  133. if (nReadLen <= 0)
  134. {
  135. SetEvent(m_hSemComm);
  136. if (pBuff != NULL)
  137. {
  138. delete [] pBuff;
  139. pBuff = NULL;
  140. }
  141. LOG4C((LOG_NOTICE,"接收数据长度 = 0"));
  142. return ERR_CODE_LEICAI_COM_READ_NO_DATA;
  143. } //长度校验出错 ;
  144. Setleicai_Msg(nAddr, szSendCMD, pBuff);
  145. m_dwOnlineTick[nAddr -1] = GetTickCount();
  146. SetEvent( m_hSemComm );
  147. if( pBuff != NULL)
  148. {
  149. delete[] pBuff;
  150. pBuff = NULL;
  151. }
  152. #else
  153. SimulationCommData();
  154. #endif
  155. return 0;
  156. }
  157. void leicai::Setleicai_Msg( int nAddr, char *szSendCMD,char *pBuffer)
  158. {
  159. if ( strcmp(szSendCMD,"G1") == 0 )
  160. {
  161. #if IS_USE_READMSG_CS
  162. EnterCriticalSection(&m_csReadMsg);
  163. #endif
  164. memcpy(m_sz_Msg[nAddr -1], pBuffer, sizeof(m_sz_Msg[nAddr -1]));
  165. #if IS_USE_READMSG_CS
  166. LeaveCriticalSection(&m_csReadMsg);
  167. #endif
  168. }
  169. }
  170. int leicai::Getleicai_Msg( int nAddr,char *szSendCMD, char *szMsg,int &nIndex,int &nLen,char *szType,int startBit,int endBit )
  171. {
  172. int nRet = 0;
  173. if ( strcmp(szSendCMD,"G1") == 0 )
  174. {
  175. #if IS_USE_READMSG_CS
  176. EnterCriticalSection(&m_csReadMsg);
  177. #endif
  178. _BYTE_2_Decimal(szMsg, (BYTE*)m_sz_Msg[nAddr -1]+nIndex);
  179. //DataConversion(szType, m_sz_Msg + nIndex, szMsg, nLen, 0, 0);
  180. #if IS_USE_READMSG_CS
  181. LeaveCriticalSection(&m_csReadMsg);
  182. #endif
  183. nRet = 0;
  184. }
  185. return nRet;
  186. }
  187. void leicai::GetSystemTime(BYTE *szSystemTime)
  188. {
  189. // 获取当地时间;
  190. SYSTEMTIME systm;
  191. ::GetLocalTime(&systm);
  192. szSystemTime[0] = digit_to_hex(systm.wYear & 0x0F); // 年;
  193. szSystemTime[1] = digit_to_hex(systm.wMonth); // 月;
  194. szSystemTime[2] = digit_to_hex(systm.wDay); // 日;
  195. szSystemTime[3] = digit_to_hex(systm.wDayOfWeek); // 星;
  196. if ( systm.wSecond >= 54)
  197. {
  198. if ( systm.wMinute == 59)
  199. {
  200. szSystemTime[4] = digit_to_hex(systm.wHour+1); // 时;
  201. szSystemTime[5] = digit_to_hex(0); // 分;
  202. szSystemTime[6] = digit_to_hex(0); // 秒;
  203. }
  204. else
  205. {
  206. szSystemTime[4] = digit_to_hex(systm.wHour);
  207. szSystemTime[5] = digit_to_hex(systm.wMinute + 1);
  208. szSystemTime[6] = digit_to_hex(0);
  209. }
  210. }
  211. else
  212. {
  213. szSystemTime[4] = digit_to_hex(systm.wHour);
  214. szSystemTime[5] = digit_to_hex(systm.wMinute);
  215. szSystemTime[6] = digit_to_hex(systm.wSecond + 4);
  216. }
  217. }
  218. // 发送设置设备参数请求
  219. int leicai::SendSetReuest(
  220. char *szPath,
  221. char *szIniName,
  222. int nCommPort,
  223. int nAddr,
  224. char *szCmd,
  225. char *szSetMsg,
  226. int nReversed1,
  227. int nReversed2,
  228. int nReversed3,
  229. int nReversed4,
  230. int nReversed5,
  231. float fReversed1,
  232. float fReversed2,
  233. float fReversed3,
  234. char *szReversed1,
  235. char *szReversed2,
  236. char *szReversed3,
  237. char *szReversed4,
  238. char *szReversed5
  239. )
  240. {
  241. if ( strcmp(szCmd,"cmd-4") != 0)
  242. return -1;
  243. CCommProcess *pComm = FindComm(nCommPort);
  244. if( pComm == NULL ) return -1;
  245. int nRet = -1;
  246. int nIndex(0), nLen(0), IniSendlen(0),iSBit(0), iEBit(0);
  247. char IniSendCMD[MAX_CMD] = {0}, szDataType[CMD_TYPE] = {0};
  248. GetIniInfo(szPath,szIniName,szCmd,IniSendCMD,IniSendlen,szDataType,nIndex,nLen,iSBit,iEBit);
  249. char szRecvMsg[10] = {0};
  250. SetDeviceParam(nAddr, pComm, szCmd, szSetMsg,szRecvMsg,IniSendCMD,IniSendlen);
  251. return 0;
  252. }
  253. int leicai::SetDeviceParam(int nAddr,CCommProcess *pComm,char *szCmd,char *szSetMsg,char *szRecvMsg,char *IniSendCMD, const int &IniSendlen)
  254. {
  255. int nRet = -1;
  256. nRet = Send_WriteDeviceData(nAddr, pComm, szCmd, szSetMsg,IniSendCMD, IniSendlen );
  257. if( nRet != 0 )
  258. return nRet; // 串口忙
  259. nRet = Recv_WriteDeviceData(nAddr, pComm, szCmd, szRecvMsg);
  260. return nRet;
  261. }
  262. int leicai::Send_WriteDeviceData( int nAddr,CCommProcess *pComm, char *szCmd, char *szSetMsg,char *IniSendCMD, const int &IniSendlen)
  263. {
  264. #if DEBUG_LEICAI
  265. BYTE byArySend[9] = {0};
  266. // Addr;
  267. byArySend[0] = nAddr;
  268. // fuc;
  269. byArySend[1] = 0x06;
  270. // Ver;
  271. byArySend[2] = 0x00;
  272. byArySend[3] = 0x01;
  273. GetSystemTime(byArySend+4);
  274. int iCrc = GetModbus16CRC( byArySend, 11);
  275. BYTE high = iCrc>>8&0xff;
  276. BYTE low = iCrc&0xff;
  277. byArySend[11] = low;
  278. byArySend[12] = high;
  279. int iSendLen = 13;
  280. /************************************************************************/
  281. ResetEvent( m_hSemComm );
  282. // 读取上次未读的数据,确保空调缓存已无数据;
  283. BYTE byRecv[250] = {0};
  284. pComm->Read(byRecv, 250);
  285. Sleep(500);
  286. int nResult = pComm->Write(byArySend, iSendLen);
  287. if( nResult != iSendLen )
  288. {
  289. SetEvent( m_hSemComm );
  290. return EER_CODE_LEICAI_COM_WRITE_DATA;
  291. }
  292. Sleep(300);
  293. #endif
  294. return 0;
  295. }
  296. int leicai::Recv_WriteDeviceData(int nAddr, CCommProcess *pComm, char *szCmd, char *szRecvMsg)
  297. {
  298. #if DEBUG_LEICAI
  299. int nReceiveLen = 250;
  300. int nProcessLen = 0;
  301. int nReadLen = 0;
  302. char *pBuffer = new char[ nReceiveLen ];
  303. memset(pBuffer, 0, nReceiveLen);
  304. Sleep(200);
  305. nReadLen = pComm->Read((BYTE *)pBuffer, nReceiveLen);
  306. if( nReadLen <= 0)
  307. {
  308. SetEvent( m_hSemComm );
  309. if( pBuffer != NULL)
  310. {
  311. delete[] pBuffer;
  312. pBuffer = NULL;
  313. }
  314. LOG4C((LOG_NOTICE,"写 串口没有读到数据"));
  315. return ERR_CODE_LEICAI_COM_READ_NO_DATA;
  316. }
  317. // 设置串口等待事件为有信号;
  318. SetEvent( m_hSemComm );
  319. if( pBuffer != NULL)
  320. {
  321. delete[] pBuffer;
  322. pBuffer = NULL;
  323. }
  324. #else
  325. SimulationCommData();
  326. #endif
  327. return 0;
  328. }
  329. void leicai::SimulationCommData(void)
  330. {
  331. //01 04 0B 02 56 03 12 11 10 06 04 10 23 35 6E 1F
  332. }