SanTak.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. #include "stdafx.h"
  2. #include "SanTak.h"
  3. #include "CommProcess.h"
  4. CSanTak::CSanTak(char *szPath,char *szIniName,int nCommPort,int nAddr,int nRate,int nDataBit,int nStopBit,int nParity,int nInterval)
  5. {
  6. #if IS_USE_READMSG_CS
  7. InitializeCriticalSection(&m_csReadMsg);
  8. #endif
  9. MTVERIFY(m_hSemComm = CreateEvent(NULL, TRUE, TRUE, 0));
  10. memset(m_szSanTak_3C_Q1Msg, 0, sizeof(m_szSanTak_3C_Q1Msg));
  11. memset(m_szSanTak_3C_Q4Msg, 0, sizeof(m_szSanTak_3C_Q4Msg));
  12. m_dwOnlineTick = 0;
  13. m_devOnline = TRUE;
  14. }
  15. CSanTak::~CSanTak()
  16. {
  17. #if IS_USE_READMSG_CS
  18. DeleteCriticalSection(& m_csReadMsg);
  19. #endif
  20. MTVERIFY(CloseHandle(m_hSemComm));
  21. CloseComm();
  22. }
  23. BOOL CSanTak::UpsSanTakOpenComm(int nCommPort, int nAddr, int nRate, int nDataBit, int nStopBit, int nParity, int nInterval)
  24. {
  25. BOOL bResult = FALSE;
  26. bResult = OpenComm( nCommPort, nAddr, nRate, nDataBit, nStopBit, nParity, nInterval );
  27. //LOG4C((LOG_NOTICE, "OpenComm = %d",bResult));
  28. return bResult;
  29. }
  30. int CSanTak::GetIniInfo(char *szPath,char *szIniName,char *szCmd,char *IniSendCMD,int &IniSendlen,char *szDataType,int &nIndex,int &nLen, int &iSBit, int &iEBit)
  31. {
  32. CHAR szFile[MAX_PATH + 1] = "";
  33. wsprintf(szFile, "%s\\config\\%s", szPath, szIniName);
  34. IniSendlen = GetPrivateProfileString(szCmd, "SendCmd", "", IniSendCMD, 10, szFile); // 返回的字符串是以\0结束的;
  35. GetPrivateProfileString(szCmd, "type", "", szDataType, 10, szFile);
  36. szDataType[strlen(szDataType)] = '\0';
  37. nIndex = GetPrivateProfileInt(szCmd, "Index", 0, szFile);
  38. nLen = GetPrivateProfileInt(szCmd, "Len", 0, szFile);
  39. iSBit = GetPrivateProfileInt(szCmd, "iSBit", 0, szFile);//从配置文件中取值
  40. iEBit = GetPrivateProfileInt(szCmd, "iEBit", 0, szFile);
  41. //LOG4C((LOG_NOTICE, "Send Command = %s,%d",IniSendCMD,IniSendlen));
  42. return 0;
  43. }
  44. int CSanTak::SendReadRequest(
  45. char szPath[MAX_PATH], // 程序所在路径
  46. char szIniName[MAX_PATH], // 配置文件名称
  47. int nCommPort, // 串行端口
  48. int nAddr, // 设备地址
  49. char szCmd[MAX_CMD], // 请求命令
  50. char szMsg[VAR_MSG], // 响应的值
  51. int nReversed1, // 预留整形参数1接口
  52. int nReversed2, // 预留整形参数2接口
  53. int nReversed3, // 预留整形参数3接口
  54. int nReversed4, // 预留整形参数4接口
  55. int nReversed5, // 预留整形参数5接口
  56. float fReversed1, // 预留float参数1接口
  57. float fReversed2, // 预留float参数2接口
  58. float fReversed3, // 预留float参数3接口
  59. char szReversed1[MAX_RESERVED1], // 预留字符数组参数1接口
  60. char szReversed2[MAX_RESERVED2], // 预留字符数组参数2接口
  61. char szReversed3[MAX_RESERVED3], // 预留字符数组参数3接口
  62. char szReversed4[MAX_RESERVED4], // 预留字符数组参数4接口
  63. char szReversed5[MAX_RESERVED5] // 预留字符数组参数5接口
  64. )
  65. {
  66. CCommProcess *pComm = FindComm(nCommPort);
  67. if( pComm == NULL ) return -1;
  68. int nRet = -1;
  69. int nIndex(0), nLen(0), IniSendlen(0),iSBit(0), iEBit(0);
  70. char IniSendCMD[MAX_CMD] = {0}, szDataType[CMD_TYPE] = {0};
  71. GetIniInfo(szPath,szIniName,szCmd,IniSendCMD,IniSendlen,szDataType,nIndex,nLen,iSBit,iEBit);
  72. //LOG4C((LOG_NOTICE, "Send Command"));
  73. int iCmd = atoi(szCmd + 4);
  74. if( (strlen(m_szSanTak_3C_Q1Msg) == 0 && (iCmd >= 1 && iCmd <= 13)) || iCmd == 1 ||
  75. (strlen(m_szSanTak_3C_Q4Msg) == 0 && (iCmd >= 14 && iCmd <= 19)) || iCmd == 14
  76. )
  77. {
  78. nRet = GetDeviceParam( nAddr,pComm, szCmd, IniSendCMD, IniSendlen );
  79. if ( nRet != 0) return nRet;
  80. }
  81. if( GetTickCount() - m_dwOnlineTick > 60 * 1000 && m_dwOnlineTick > 0 )
  82. m_devOnline = FALSE;
  83. else if( GetTickCount() - m_dwOnlineTick < 60 * 1000 && m_dwOnlineTick > 0 )
  84. m_devOnline = TRUE;
  85. if( m_devOnline == FALSE )
  86. return -1;
  87. nRet = GetSanTak_3C_Q1Msg( nAddr, szCmd, szMsg, nIndex, nLen, szDataType,iSBit,iEBit);
  88. nRet = GetSanTak_3C_Q4Msg( nAddr, szCmd, szMsg, nIndex, nLen, szDataType,iSBit,iEBit);
  89. //LOG4C((LOG_NOTICE, "CDaiKin::SendSetReuest szCmd= %s, szMsg = %s", szCmd, szMsg));
  90. return nRet;
  91. }
  92. int CSanTak::GetDeviceParam(int nAddr,CCommProcess *pComm,char *szCmd,char *IniSendCMD,const int &IniSendlen)
  93. {
  94. int nRet = -1;
  95. nRet = Send_ReadDeviceData(nAddr, pComm, szCmd, IniSendCMD, IniSendlen);
  96. if( nRet != 0 )
  97. return nRet;
  98. nRet = Recv_ReadDeviceData( nAddr, pComm, szCmd);
  99. return nRet;
  100. }
  101. int CSanTak::Send_ReadDeviceData(int nAddr,CCommProcess *pComm,char *szCmd, char *IniSendCMD,const int &IniSendlen)
  102. {
  103. #if DEBUG_SANTAK //开关量,用于测试模拟数据
  104. //if ( strcmp(IniSendCMD,"Q1") == 0)
  105. //{
  106. // IniSendCMD[0] = 0x51;
  107. // IniSendCMD[1] = 0x31;
  108. // //IniSendCMD[2] = 0x0D;
  109. // LOG4C((LOG_NOTICE, "Send_ReadDeviceData = %s",IniSendCMD));
  110. //}
  111. //else
  112. //{
  113. // IniSendCMD[0] = 0x51;
  114. // IniSendCMD[1] = 0x34;
  115. // //IniSendCMD[2] = 0x0D;
  116. // LOG4C((LOG_NOTICE, "Send_ReadDeviceData = %s",IniSendCMD));
  117. //}
  118. IniSendCMD[2] = 0x0D;
  119. if (WaitForSingleObject(m_hSemComm,0) == WAIT_OBJECT_0 )
  120. {
  121. ResetEvent(m_hSemComm);
  122. int nResult = pComm->Write((BYTE *)IniSendCMD, IniSendlen+1);
  123. if (nResult != (IniSendlen+1))
  124. {
  125. SetEvent(m_hSemComm);
  126. return EER_CODE_COM_REGNUM;
  127. }
  128. }
  129. else
  130. {
  131. return ERR_CODE_COM_BUSY; //串口忙
  132. }
  133. #endif
  134. return 0;
  135. }
  136. int CSanTak::Recv_ReadDeviceData(int nAddr,CCommProcess *pComm,char *szCmd)
  137. {
  138. #if DEBUG_SANTAK
  139. int nReadLen = 0;
  140. RESPONSE_STRUCT strcutResponse;
  141. memset(&strcutResponse, 0, sizeof(RESPONSE_STRUCT));
  142. int nReceiveLen = sizeof(RESPONSE_STRUCT);
  143. char *pBuff = new char[nReceiveLen];
  144. ZeroMemory(pBuff,nReceiveLen);
  145. nReadLen = pComm->Read((BYTE *)pBuff,nReceiveLen);
  146. if (nReadLen <= 0)
  147. {
  148. SetEvent(m_hSemComm);
  149. if (pBuff != NULL)
  150. {
  151. delete [] pBuff;
  152. pBuff = NULL;
  153. }
  154. return ERR_CODE_COM_READ_NO_DATA;
  155. }
  156. //长度校验出错
  157. SetSanTakQ1Msg(nAddr, szCmd, pBuff);
  158. SetSanTakQ4Msg(nAddr, szCmd, pBuff);
  159. m_dwOnlineTick = GetTickCount();
  160. SetEvent( m_hSemComm );
  161. if( pBuff != NULL)
  162. {
  163. delete[] pBuff;
  164. pBuff = NULL;
  165. }
  166. #else
  167. SimulationCommData();
  168. #endif
  169. return 0;
  170. }
  171. int CSanTak::GetSanTak_3C_Q1Msg(int nAddr,char *szCmd, char *szRecvMsg,int &nIndex,int &nLen,char *szDataType,const int &iSBit, const int &iEBit)
  172. {
  173. int iCmd = atoi(szCmd + 4);
  174. if ( iCmd >= 1 && iCmd <= 13 )
  175. {
  176. #if IS_USE_READMSG_CS
  177. EnterCriticalSection(&m_csReadMsg);
  178. #endif
  179. DataConversion(szDataType, m_szSanTak_3C_Q1Msg + nIndex, szRecvMsg, nLen, iSBit, iEBit);
  180. #if IS_USE_READMSG_CS
  181. LeaveCriticalSection(&m_csReadMsg);
  182. #endif
  183. }
  184. return 0;
  185. }
  186. int CSanTak::GetSanTak_3C_Q4Msg(int nAddr,char *szCmd, char *szRecvMsg,int &nIndex,int &nLen,char *szDataType,const int &iSBit, const int &iEBit)
  187. {
  188. int iCmd = atoi(szCmd + 4);
  189. if ( iCmd >= 14 && iCmd <= 19)
  190. {
  191. #if IS_USE_READMSG_CS
  192. EnterCriticalSection(&m_csReadMsg);
  193. #endif
  194. DataConversion(szDataType, m_szSanTak_3C_Q4Msg + nIndex, szRecvMsg, nLen, iSBit, iEBit);
  195. #if IS_USE_READMSG_CS
  196. LeaveCriticalSection(&m_csReadMsg);
  197. #endif
  198. }
  199. return 0;
  200. }
  201. void CSanTak::SetSanTakQ1Msg( int nAddr,char *szCmd, char *pBuffer)
  202. {
  203. int iCmd = atoi(szCmd + 4);
  204. if ( iCmd >= 1 && iCmd <= 13 )
  205. {
  206. #if IS_USE_READMSG_CS
  207. EnterCriticalSection(&m_csReadMsg);
  208. #endif
  209. memcpy(m_szSanTak_3C_Q1Msg, pBuffer, sizeof(m_szSanTak_3C_Q1Msg));
  210. #if IS_USE_READMSG_CS
  211. LeaveCriticalSection(&m_csReadMsg);
  212. #endif
  213. }
  214. }
  215. void CSanTak::SetSanTakQ4Msg( int nAddr,char *szCmd, char *pBuffer)
  216. {
  217. int iCmd = atoi(szCmd + 4);
  218. if ( iCmd >= 14 && iCmd <= 19)
  219. {
  220. #if IS_USE_READMSG_CS
  221. EnterCriticalSection(&m_csReadMsg);
  222. #endif
  223. memcpy(m_szSanTak_3C_Q4Msg,pBuffer,sizeof(m_szSanTak_3C_Q4Msg));
  224. #if IS_USE_READMSG_CS
  225. LeaveCriticalSection(&m_csReadMsg);
  226. #endif
  227. }
  228. }
  229. int CSanTak::SendSetReuest(
  230. char *szPath, // 程序所在路径
  231. char *szIniName, // 配置文件名称
  232. int nCommPort, // 串行端口
  233. int nAddr, // 设备地址
  234. char *szCmd, // 请求命令
  235. char *szSetMsg, // 响应的值
  236. int nReversed1, // 预留整形参数1接口
  237. int nReversed2, // 预留整形参数2接口
  238. int nReversed3, // 预留整形参数3接口
  239. int nReversed4, // 预留整形参数4接口
  240. int nReversed5, // 预留整形参数5接口
  241. float fReversed1, // 预留float参数1接口
  242. float fReversed2, // 预留float参数2接口
  243. float fReversed3, // 预留float参数3接口
  244. char *szReversed1, // 预留字符数组参数1接口
  245. char *szReversed2, // 预留字符数组参数2接口
  246. char *szReversed3, // 预留字符数组参数3接口
  247. char *szReversed4, // 预留字符数组参数4接口
  248. char *szReversed5 // 预留字符数组参数5接口 // 预留字符数组参数5接口
  249. )
  250. {
  251. CCommProcess *pComm = FindComm(nCommPort);
  252. if( pComm == NULL ) return -1;
  253. int nRet = -1;
  254. int nIndex(0), nLen(0), IniSendlen(0),iSBit(0), iEBit(0);
  255. char IniSendCMD[MAX_CMD] = {0}, szDataType[CMD_TYPE] = {0};
  256. GetIniInfo(szPath,szIniName,szCmd,IniSendCMD,IniSendlen,szDataType,nIndex,nLen,iSBit,iEBit);
  257. if( nAddr < 1 ) return -1;
  258. if( strcmp(szCmd, "cmd-20") == 0 )
  259. {
  260. char szRecvMsg[10] = {0};
  261. SetDeviceParam( nAddr, pComm, szCmd, szSetMsg, szRecvMsg, IniSendCMD, IniSendlen );
  262. }
  263. return 0;
  264. }
  265. int CSanTak::SetDeviceParam(int nAddr,CCommProcess *pComm,char *szCmd,char *szSetMsg,char *szRecvMsg,char *IniSendCMD, const int &IniSendlen)
  266. {
  267. int nRet = -1;
  268. nRet = Send_WriteDeviceData(nAddr, pComm, szCmd, szSetMsg,IniSendCMD, IniSendlen );
  269. if( nRet != 0 )
  270. {
  271. LOG4C((LOG_NOTICE,"Write Error"));
  272. return nRet; // 串口忙
  273. }
  274. nRet = Recv_WriteDeviceData(nAddr, pComm, szCmd, szRecvMsg);
  275. return nRet;
  276. }
  277. int CSanTak::Send_WriteDeviceData(int naddr, CCommProcess *pComm, char *szCmd, char *szSetMsg, char *IniSendCMD, const int &IniSendlen )
  278. {
  279. #if DEBUG_DAIKIN
  280. ResetEvent( m_hSemComm );
  281. // 读取上次未读的数据,确保空调缓存已无数据;
  282. BYTE byRecv[250] = {0};
  283. pComm->Read(byRecv, 250);
  284. Sleep(1000);
  285. int nResult = pComm->Write(IniSendCMD, IniSendlen);
  286. if( nResult != IniSendlen )
  287. {
  288. SetEvent( m_hSemComm );
  289. return EER_CODE_COM_WRITE_DATA;
  290. }
  291. Sleep(300);
  292. #endif
  293. return 0;
  294. }
  295. int CSanTak::Recv_WriteDeviceData(int nAddr, CCommProcess *pComm, char *szCmd, char *szRecvMsg )
  296. {
  297. int nReceiveLen = 0;
  298. int nProcessLen = 0;
  299. int nReadLen = 0;
  300. char *pBuffer = new char[ nReceiveLen ];
  301. memset(pBuffer, 0, nReceiveLen);
  302. nReadLen = pComm->Read((BYTE *)pBuffer, nReceiveLen);
  303. if( nReadLen <= 0)
  304. {
  305. SetEvent( m_hSemComm );
  306. if( pBuffer != NULL)
  307. {
  308. delete[] pBuffer;
  309. pBuffer = NULL;
  310. }
  311. return ERR_CODE_COM_READ_NO_DATA;
  312. }
  313. return 0;
  314. }
  315. void CSanTak::SimulationCommData(void)
  316. {
  317. }