ProtocolModbus.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077
  1. // ProtocolPMC916.cpp: implementation of the CProtocolModbus class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "ProtocolModbus.h"
  6. #include "winsock2.h"
  7. #include "Gree.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. char Hex16(char WillChangeNum[]) //该函数把四位二进制转换成十六进制数
  14. {
  15. int i;
  16. i = (WillChangeNum[3]) + (WillChangeNum[2] * 10) +
  17. (WillChangeNum[1] * 100) + (WillChangeNum[0] * 1000);
  18. switch(i)
  19. {
  20. case 0:
  21. return 0;
  22. case 1:
  23. return 1;
  24. case 10:
  25. return 2;
  26. case 11:
  27. return 3;
  28. case 100:
  29. return 4;
  30. case 101:
  31. return 5;
  32. case 110:
  33. return 6;
  34. case 111:
  35. return 7;
  36. case 1000:
  37. return 8;
  38. case 1001:
  39. return 9;
  40. case 1010:
  41. return 0x0A;
  42. case 1011:
  43. return 0x0B;
  44. case 1100:
  45. return 0x0C;
  46. case 1101:
  47. return 0x0D;
  48. case 1110:
  49. return 0x0E;
  50. case 1111:
  51. return 0x0F;
  52. }
  53. return -1;
  54. }
  55. void Binary2(BYTE WillChangeNum, char *pResult) //该函数把十六进制数转换成四位二进制
  56. {
  57. char ch[4] = {0};
  58. switch(WillChangeNum)
  59. {
  60. case '0':
  61. *pResult = 0;
  62. *(pResult + 1) = 0;
  63. *(pResult + 2) = 0;
  64. *(pResult + 3) = 0;
  65. break;
  66. case '1':
  67. *pResult = 0;
  68. *(pResult + 1) = 0;
  69. *(pResult + 2) = 0;
  70. *(pResult + 3) = 1;
  71. break;
  72. case '2':
  73. *pResult = 0;
  74. *(pResult + 1) = 0;
  75. *(pResult + 2) = 1;
  76. *(pResult + 3) = 0;
  77. break;
  78. case '3':
  79. *pResult = 0;
  80. *(pResult + 1) = 0;
  81. *(pResult + 2) = 1;
  82. *(pResult + 3) = 1;
  83. break;
  84. case '4':
  85. *pResult = 0;
  86. *(pResult + 1) = 1;
  87. *(pResult + 2) = 0;
  88. *(pResult + 3) = 0;
  89. break;
  90. case '5':
  91. *pResult = 0;
  92. *(pResult + 1) = 1;
  93. *(pResult + 2) = 0;
  94. *(pResult + 3) = 1;
  95. break;
  96. case '6':
  97. *pResult = 0;
  98. *(pResult + 1) = 1;
  99. *(pResult + 2) = 1;
  100. *(pResult + 3) = 0;
  101. break;
  102. case '7':
  103. *pResult = 0;
  104. *(pResult + 1) = 1;
  105. *(pResult + 2) = 1;
  106. *(pResult + 3) = 1;
  107. break;
  108. case '8':
  109. *pResult = 1;
  110. *(pResult + 1) = 0;
  111. *(pResult + 2) = 0;
  112. *(pResult + 3) = 0;
  113. break;
  114. case '9':
  115. *pResult = 1;
  116. *(pResult + 1) = 0;
  117. *(pResult + 2) = 0;
  118. *(pResult + 3) = 1;
  119. break;
  120. case 'A':
  121. *pResult = 1;
  122. *(pResult + 1) = 0;
  123. *(pResult + 2) = 1;
  124. *(pResult + 3) = 0;
  125. break;
  126. case 'B':
  127. *pResult = 1;
  128. *(pResult + 1) = 0;
  129. *(pResult + 2) = 1;
  130. *(pResult + 3) = 1;
  131. break;
  132. case 'C':
  133. *pResult = 1;
  134. *(pResult + 1) = 1;
  135. *(pResult + 2) = 0;
  136. *(pResult + 3) = 0;
  137. break;
  138. case 'D':
  139. *pResult = 1;
  140. *(pResult + 1) = 1;
  141. *(pResult + 2) = 0;
  142. *(pResult + 3) = 1;
  143. break;
  144. case 'E':
  145. *pResult = 1;
  146. *(pResult + 1) = 1;
  147. *(pResult + 2) = 1;
  148. *(pResult + 3) = 0;
  149. break;
  150. case 'F':
  151. *pResult = 1;
  152. *(pResult + 1) = 1;
  153. *(pResult + 2) = 1;
  154. *(pResult + 3) = 1;
  155. break;
  156. }
  157. }
  158. void TenHex16(int idnum,char *outchar) //参数是需要转换成16进制数的十进制数
  159. {
  160. char TwoHex[100]; //数组存放二进制数
  161. char Willchange[4]; //每次以4位二进制数为一组 进行十六进制转换
  162. memset(TwoHex,0,100);
  163. memset(Willchange,0,4);
  164. int i=0; //位数
  165. bool HeightBit=0;
  166. for (;;) //转换成二进制
  167. {
  168. if (idnum==1)
  169. {
  170. TwoHex[i]=1;
  171. i++;
  172. break;
  173. }
  174. else
  175. {
  176. TwoHex[i]=idnum%2;
  177. idnum=idnum/2;
  178. }
  179. i++;
  180. }
  181. if (i%2==1) //如果是奇数位则补0 //保证是四位的倍数 后面好处理
  182. {
  183. i++;
  184. TwoHex[i]=0;
  185. }
  186. int p=0;
  187. for (int num=0;num<i;num++)
  188. {
  189. Willchange[p]=TwoHex[num];
  190. p++;
  191. if (p==4) //读取4位一组进行转换
  192. {
  193. p=0;
  194. if (HeightBit==0) //heightBit 判断高位还是地位 =0表示是第一组是低位 放在数组【1】里面
  195. {
  196. outchar[1]=Hex16(Willchange); //二进制 4位为1组 函数返回十六进制
  197. HeightBit=1;
  198. }
  199. else
  200. {
  201. outchar[0]=Hex16(Willchange);
  202. }
  203. }
  204. }
  205. }
  206. BYTE InverseByte(BYTE a)
  207. {
  208. BYTE b = 0;
  209. for (int i = 0; i < 8; i ++)
  210. {
  211. b <<= 1;
  212. if (a & 1)
  213. b |= 1;
  214. a >>= 1;
  215. }
  216. return b;
  217. }
  218. //////////////////////////////////////////////////////////////////////
  219. // Construction/Destruction
  220. //////////////////////////////////////////////////////////////////////
  221. CProtocolModbus::CProtocolModbus() : CProtocol()
  222. {
  223. InitializeCriticalSection( &m_csReadFinished );
  224. InitializeCriticalSection( &m_csWrFinished );
  225. MTVERIFY( m_hSemComm = CreateEvent( NULL, TRUE, TRUE, 0 ) );
  226. }
  227. CProtocolModbus::~CProtocolModbus()
  228. {
  229. DeleteCriticalSection( &m_csReadFinished );
  230. DeleteCriticalSection( &m_csWrFinished );
  231. MTVERIFY( CloseHandle( m_hSemComm ) );
  232. }
  233. int CProtocolModbus::WorkMain(int nAddr, int nDataLen,int nReadPos, char chMsg[80])
  234. {
  235. if(!m_pComm)
  236. return ERR_CODE_GREE_COM_FAULT; // 串口通信故障
  237. int nRet;
  238. #if 0
  239. nRet = RequestStatus(nAddr);
  240. if( nRet != 0 )
  241. {
  242. return nRet; // 串口忙
  243. }
  244. nRet = ResponseStatus(nAddr, nDataLen, nReadPos, chMsg);
  245. #else
  246. nRet = ResponseStatus(nAddr, nDataLen, nReadPos, chMsg);
  247. #endif
  248. return nRet;
  249. }
  250. int CProtocolModbus:: WriteCommand(
  251. int nAddr,
  252. int nWorkStatus, int nWorkMode, int nFanSpeed,
  253. int nPutWind, int nAirTrade, int nSleep, int nLight,
  254. int nTempSetPoint )
  255. {
  256. int iResult = 0;
  257. if(!m_pComm)
  258. return ERR_CODE_GREE_COM_FAULT;
  259. iResult = RequestWrStatus( nAddr, nWorkStatus, nWorkMode,
  260. nFanSpeed, nPutWind, nAirTrade,
  261. nSleep, nLight, nTempSetPoint );
  262. if (iResult == 0)
  263. return ResponseWrStatus( nAddr, nWorkStatus, nWorkMode,
  264. nFanSpeed, nPutWind, nAirTrade,
  265. nSleep, nLight, nTempSetPoint );
  266. else
  267. return iResult;
  268. }
  269. int CProtocolModbus::RequestWrStatus( int nAddr, int nWorkStatus, int nWorkMode, int nFanSpeed,
  270. int nPutWind, int nAirTrade, int nSleep, int nLight,
  271. int nTempSetPoint )
  272. {
  273. //TRACE3("=============WorkStatus = %d, WorkMode = %d, FanSpeed = %d\n",
  274. // nWorkStatus, nWorkMode, nFanSpeed);
  275. //TRACE3("=============PutWind=%d, AirTrade=%d, Sleeep = %d\n", nPutWind, nAirTrade, nSleep);
  276. //TRACE2("=============Light=%d, TempSetPoint=%d\n", nLight, nTempSetPoint);
  277. REQUESTPARAM tagRequest;
  278. int nLen = sizeof(REQUESTPARAM);
  279. memset( &tagRequest, 0, nLen );
  280. tagRequest.btStart = 0x07;
  281. tagRequest.szAddr[0] = ByteToAscii( (nAddr >> 12) & 0x000F );
  282. tagRequest.szAddr[1] = ByteToAscii( (nAddr >> 8) & 0x000F );
  283. tagRequest.szAddr[2] = ByteToAscii( (nAddr >> 4) & 0x000F );
  284. tagRequest.szAddr[3] = ByteToAscii( nAddr & 0x000F );
  285. for( int i = 0; i < 8; i++ )
  286. {
  287. tagRequest.szRsCode[i] = ByteToAscii(0);
  288. }
  289. char chBuffer1High[4];
  290. memset(chBuffer1High, 0, sizeof(chBuffer1High));
  291. char chBuffer1Low[4];
  292. memset(chBuffer1Low, 0, sizeof(chBuffer1Low));
  293. char chBuffer2High[4];
  294. memset(chBuffer2High, 0, sizeof(chBuffer2High));
  295. char chBuffer2Low[4];
  296. memset(chBuffer2Low, 0, sizeof(chBuffer2Low));
  297. char chBuffer3High[4];
  298. memset(chBuffer3High, 0, sizeof(chBuffer3High));
  299. char chBuffer3Low[4];
  300. memset(chBuffer3Low, 0, sizeof(chBuffer3Low));
  301. char chBuffer4High[4];
  302. memset(chBuffer4High, 0, sizeof(chBuffer4High));
  303. char chBuffer4Low[4];
  304. memset(chBuffer4Low, 0, sizeof(chBuffer4Low));
  305. RsCode1 tagRsCode1;
  306. memset(&tagRsCode1, 0, sizeof(RsCode1));
  307. RsCode2 tagRsCode2;
  308. memset(&tagRsCode2, 0, sizeof(RsCode2));
  309. RsCode3 tagRsCode3;
  310. memset(&tagRsCode3, 0, sizeof(RsCode3));
  311. RsCode4 tagRsCode4;
  312. memset(&tagRsCode4, 0, sizeof(RsCode4));
  313. tagRsCode1.szStatus = 1; //这里为设置状态
  314. // 空调开机=1/关机=0
  315. switch( nWorkStatus )
  316. {
  317. case 0:
  318. tagRsCode1.szMode[3] = 0;
  319. tagRsCode1.szMode[0] = 0;
  320. tagRsCode1.szMode[1] = 0;
  321. tagRsCode1.szMode[2] = 0;
  322. break;
  323. case 1:
  324. tagRsCode1.szMode[0] = 1;
  325. // 空调工作模式(0:自动, 1:制冷, 2:抽湿, 3:送风 4:制热)
  326. switch( nWorkMode )
  327. {
  328. case 0:
  329. tagRsCode1.szMode[1] = 0;
  330. tagRsCode1.szMode[2] = 0;
  331. tagRsCode1.szMode[3] = 0;
  332. break;
  333. case 1:
  334. tagRsCode1.szMode[1] = 0;
  335. tagRsCode1.szMode[2] = 0;
  336. tagRsCode1.szMode[3] = 1;
  337. break;
  338. case 2:
  339. tagRsCode1.szMode[1] = 0;
  340. tagRsCode1.szMode[2] = 1;
  341. tagRsCode1.szMode[3] = 0;
  342. break;
  343. case 3:
  344. tagRsCode1.szMode[1] = 0;
  345. tagRsCode1.szMode[2] = 1;
  346. tagRsCode1.szMode[3] = 1;
  347. break;
  348. case 4:
  349. tagRsCode1.szMode[1] = 1;
  350. tagRsCode1.szMode[2] = 0;
  351. tagRsCode1.szMode[3] = 0;
  352. break;
  353. }
  354. break;
  355. }
  356. memcpy(chBuffer1High, &tagRsCode1, sizeof(chBuffer1High));
  357. memcpy(chBuffer1Low, ((char *)&tagRsCode1) + sizeof(chBuffer1High), sizeof(chBuffer1Low));
  358. tagRequest.szRsCode[0] = Hex16(chBuffer1High) + '0';
  359. tagRequest.szRsCode[1] = Hex16(chBuffer1Low) + '0';
  360. // 设定温度
  361. switch(nTempSetPoint)
  362. {
  363. case 16:
  364. tagRsCode2.szTempSetPoint[0] = 0;
  365. tagRsCode2.szTempSetPoint[1] = 0;
  366. tagRsCode2.szTempSetPoint[2] = 0;
  367. tagRsCode2.szTempSetPoint[3] = 0;
  368. break;
  369. case 17:
  370. tagRsCode2.szTempSetPoint[0] = 0;
  371. tagRsCode2.szTempSetPoint[1] = 0;
  372. tagRsCode2.szTempSetPoint[2] = 0;
  373. tagRsCode2.szTempSetPoint[3] = 1;
  374. break;
  375. case 18:
  376. tagRsCode2.szTempSetPoint[0] = 0;
  377. tagRsCode2.szTempSetPoint[1] = 0;
  378. tagRsCode2.szTempSetPoint[2] = 1;
  379. tagRsCode2.szTempSetPoint[3] = 0;
  380. break;
  381. case 19:
  382. tagRsCode2.szTempSetPoint[0] = 0;
  383. tagRsCode2.szTempSetPoint[1] = 0;
  384. tagRsCode2.szTempSetPoint[2] = 1;
  385. tagRsCode2.szTempSetPoint[3] = 1;
  386. break;
  387. case 20:
  388. tagRsCode2.szTempSetPoint[0] = 0;
  389. tagRsCode2.szTempSetPoint[1] = 1;
  390. tagRsCode2.szTempSetPoint[2] = 0;
  391. tagRsCode2.szTempSetPoint[3] = 0;
  392. break;
  393. case 21:
  394. tagRsCode2.szTempSetPoint[0] = 0;
  395. tagRsCode2.szTempSetPoint[1] = 1;
  396. tagRsCode2.szTempSetPoint[2] = 0;
  397. tagRsCode2.szTempSetPoint[3] = 1;
  398. break;
  399. case 22:
  400. tagRsCode2.szTempSetPoint[0] = 0;
  401. tagRsCode2.szTempSetPoint[1] = 1;
  402. tagRsCode2.szTempSetPoint[2] = 1;
  403. tagRsCode2.szTempSetPoint[3] = 0;
  404. break;
  405. case 23:
  406. tagRsCode2.szTempSetPoint[0] = 0;
  407. tagRsCode2.szTempSetPoint[1] = 1;
  408. tagRsCode2.szTempSetPoint[2] = 1;
  409. tagRsCode2.szTempSetPoint[3] = 1;
  410. break;
  411. case 24:
  412. tagRsCode2.szTempSetPoint[0] = 1;
  413. tagRsCode2.szTempSetPoint[1] = 0;
  414. tagRsCode2.szTempSetPoint[2] = 0;
  415. tagRsCode2.szTempSetPoint[3] = 0;
  416. break;
  417. case 25:
  418. tagRsCode2.szTempSetPoint[0] = 1;
  419. tagRsCode2.szTempSetPoint[1] = 0;
  420. tagRsCode2.szTempSetPoint[2] = 0;
  421. tagRsCode2.szTempSetPoint[3] = 1;
  422. break;
  423. case 26:
  424. tagRsCode2.szTempSetPoint[0] = 1;
  425. tagRsCode2.szTempSetPoint[1] = 0;
  426. tagRsCode2.szTempSetPoint[2] = 1;
  427. tagRsCode2.szTempSetPoint[3] = 0;
  428. break;
  429. case 27:
  430. tagRsCode2.szTempSetPoint[0] = 1;
  431. tagRsCode2.szTempSetPoint[1] = 0;
  432. tagRsCode2.szTempSetPoint[2] = 1;
  433. tagRsCode2.szTempSetPoint[3] = 1;
  434. break;
  435. case 28:
  436. tagRsCode2.szTempSetPoint[0] = 1;
  437. tagRsCode2.szTempSetPoint[1] = 1;
  438. tagRsCode2.szTempSetPoint[2] = 0;
  439. tagRsCode2.szTempSetPoint[3] = 0;
  440. break;
  441. case 29:
  442. tagRsCode2.szTempSetPoint[0] = 1;
  443. tagRsCode2.szTempSetPoint[1] = 1;
  444. tagRsCode2.szTempSetPoint[2] = 0;
  445. tagRsCode2.szTempSetPoint[3] = 1;
  446. break;
  447. case 30:
  448. tagRsCode2.szTempSetPoint[0] = 1;
  449. tagRsCode2.szTempSetPoint[1] = 1;
  450. tagRsCode2.szTempSetPoint[2] = 1;
  451. tagRsCode2.szTempSetPoint[3] = 0;
  452. break;
  453. }
  454. // 风速(自动=0, 低风=1, 中风=2, 高风=3)
  455. switch(nFanSpeed)
  456. {
  457. case 0:
  458. tagRsCode2.szFanSpeed[0] = 0;
  459. tagRsCode2.szFanSpeed[1] = 0;
  460. break;
  461. case 1:
  462. tagRsCode2.szFanSpeed[0] = 0;
  463. tagRsCode2.szFanSpeed[1] = 1;
  464. break;
  465. case 2:
  466. tagRsCode2.szFanSpeed[0] = 1;
  467. tagRsCode2.szFanSpeed[1] = 0;
  468. break;
  469. case 3:
  470. tagRsCode2.szFanSpeed[0] = 1;
  471. tagRsCode2.szFanSpeed[1] = 1;
  472. break;
  473. }
  474. // 扫风
  475. switch(nPutWind)
  476. {
  477. case 0:
  478. tagRsCode2.szPutWind = 0;
  479. break;
  480. case 1:
  481. tagRsCode2.szPutWind = 1;
  482. break;
  483. }
  484. // 睡眠
  485. switch(nSleep)
  486. {
  487. case 0:
  488. tagRsCode2.szSleep = 0;
  489. break;
  490. case 1:
  491. tagRsCode2.szSleep = 1;
  492. break;
  493. }
  494. memcpy(chBuffer2High, &tagRsCode2, sizeof(chBuffer2High));
  495. memcpy(chBuffer2Low, ((char *)&tagRsCode2) + sizeof(chBuffer2High), sizeof(chBuffer2Low));
  496. tagRequest.szRsCode[2] = Hex16(chBuffer2High) + '0';
  497. tagRequest.szRsCode[3] = Hex16(chBuffer2Low) + '0';
  498. // 3byte为定时,暂不做处理
  499. memset(&tagRsCode3, 0, sizeof(tagRsCode3));
  500. tagRequest.szRsCode[4] = ByteToAscii(0);
  501. tagRequest.szRsCode[5] = ByteToAscii(0);
  502. // 灯光
  503. switch(nLight)
  504. {
  505. case 0:
  506. tagRsCode4.szLight = 0;
  507. break;
  508. case 1:
  509. tagRsCode4.szLight = 1;
  510. break;
  511. }
  512. // 换气
  513. switch(nAirTrade)
  514. {
  515. case 0:
  516. tagRsCode4.szTradeAir[0] = 0;
  517. tagRsCode4.szTradeAir[1] = 0;
  518. break;
  519. case 1:
  520. tagRsCode4.szTradeAir[0] = 0;
  521. tagRsCode4.szTradeAir[1] = 1;
  522. break;
  523. case 2:
  524. tagRsCode4.szTradeAir[0] = 1;
  525. tagRsCode4.szTradeAir[1] = 0;
  526. break;
  527. }
  528. memcpy(chBuffer4High, &tagRsCode4, sizeof(chBuffer4High));
  529. memcpy(chBuffer4Low, ((char *)&tagRsCode4) + sizeof(chBuffer4High), sizeof(chBuffer4Low));
  530. tagRequest.szRsCode[6] = Hex16(chBuffer4High) + '0';
  531. tagRequest.szRsCode[7] = Hex16(chBuffer4Low) + '0';
  532. // 算检验
  533. BYTE btParityHigh = ( (nAddr >> 12) & 0x000F ) ^
  534. ( (nAddr >> 4) & 0x000F ) ^
  535. (Hex16(chBuffer1High)) ^
  536. (Hex16(chBuffer2High)) ^
  537. 0 ^
  538. (Hex16(chBuffer3High)) ^
  539. (Hex16(chBuffer4High) );
  540. BYTE btParityLow =( (nAddr >> 8) & 0x000F ) ^
  541. ( (nAddr) & 0x000F ) ^
  542. (Hex16(chBuffer1Low)) ^
  543. (Hex16(chBuffer2Low)) ^
  544. 0 ^
  545. (Hex16(chBuffer3Low)) ^
  546. (Hex16(chBuffer4Low) );
  547. tagRequest.szParity[0] = btParityHigh + '0';
  548. tagRequest.szParity[1] = btParityLow + '0';
  549. tagRequest.btEnd = 0x0D;
  550. if( WaitForSingleObject( m_hSemComm, 0 ) == WAIT_OBJECT_0 ) // 有信号才写串口
  551. {
  552. ResetEvent( m_hSemComm );
  553. int nResult = WriteMessage( (BYTE *)&tagRequest, nLen );
  554. if( nResult == nLen )
  555. {
  556. }
  557. else
  558. {
  559. SetEvent( m_hSemComm );
  560. return EER_CODE_GREE_COM_WRITE_DATA;
  561. }
  562. }
  563. else
  564. {
  565. return ERR_CODE_GREE_COM_BUSY;
  566. }
  567. return 0;
  568. }
  569. int CProtocolModbus::ResponseWrStatus( int nAddr, int nWorkStatus, int nWorkMode, int nFanSpeed,
  570. int nPutWind, int nAirTrade, int nSleep, int nLight,
  571. int nTempSetPoint )
  572. {
  573. RESPONSE_STRUCT structResponse;
  574. memset( &structResponse, 0, sizeof(RESPONSE_STRUCT) );
  575. int nLen = sizeof(RESPONSE_STRUCT);
  576. char *pBuffer = new char[ nLen ];
  577. memset(pBuffer, 0, nLen);
  578. int nProcessLen = 0;
  579. int nReadLen = 0;
  580. nReadLen = ReadMessage((BYTE *)pBuffer, nLen);
  581. if( nReadLen <= 0)
  582. {
  583. // 串口没有读到数据
  584. TRACE("串口没有读到数据!\r\n");
  585. SetEvent( m_hSemComm );
  586. if( pBuffer != NULL)
  587. {
  588. delete[] pBuffer;
  589. pBuffer = NULL;
  590. }
  591. return ERR_CODE_GREE_COM_READ_NO_DATA;
  592. }
  593. else if( nReadLen < nLen )
  594. {
  595. TRACE("长度没有收够,断续接收,止到收完为止!\r\n");
  596. SetEvent( m_hSemComm );
  597. if( pBuffer != NULL)
  598. {
  599. delete[] pBuffer;
  600. pBuffer = NULL;
  601. }
  602. return ERR_CODE_GREE_COM_FAULT;
  603. }
  604. // 判断校验
  605. RESPONSE_STRUCT *pResponse = (RESPONSE_STRUCT *)pBuffer;
  606. // 算检验
  607. int high = ( (pResponse->szAddr[0] - '0') ^
  608. (pResponse->szAddr[2] - '0') ^
  609. (pResponse->szRsCode[0] - '0') ^
  610. (pResponse->szRsCode[2] - '0') ^
  611. (pResponse->szRsCode[4] - '0') ^
  612. (pResponse->szRsCode[6] - '0') ^
  613. (pResponse->szEnvTemp[0] - '0') ^
  614. (pResponse->szStatus1[0] - '0') ^
  615. (pResponse->szStatus2[0] - '0') ^
  616. (pResponse->szStatus3[0] - '0') );
  617. int low = ( (pResponse->szAddr[1] - '0') ^
  618. (pResponse->szAddr[3] - '0') ^
  619. (pResponse->szRsCode[1] - '0') ^
  620. (pResponse->szRsCode[3] - '0') ^
  621. (pResponse->szRsCode[5] - '0') ^
  622. (pResponse->szRsCode[7] - '0') ^
  623. (pResponse->szEnvTemp[1] - '0') ^
  624. (pResponse->szStatus1[1] - '0') ^
  625. (pResponse->szStatus2[1] - '0') ^
  626. (pResponse->szStatus3[1] - '0') );
  627. if( !( ((byte)pBuffer[nLen - 2] == ByteToAscii(low) ) && ((byte)pBuffer[nLen - 3] == ByteToAscii(high) ) ) )
  628. {
  629. TRACE("校验码失败!\r\n");
  630. SetEvent( m_hSemComm );
  631. if( pBuffer != NULL)
  632. {
  633. delete[] pBuffer;
  634. pBuffer = NULL;
  635. }
  636. return ERR_CODE_GREE_COM_LRC_LOST;
  637. }
  638. // 设置串口等待事件为有信号
  639. SetEvent( m_hSemComm );
  640. if( pBuffer != NULL)
  641. {
  642. delete[] pBuffer;
  643. pBuffer = NULL;
  644. }
  645. return 0;
  646. }
  647. int CProtocolModbus::RequestStatus(int nAddr)
  648. {
  649. int iLen = sizeof(REQUESTPARAM);
  650. REQUESTPARAM RequestPara;
  651. memset( &RequestPara, 0, iLen );
  652. RequestPara.btStart = 0x07;
  653. RequestPara.szAddr[0] = ByteToAscii( (nAddr >> 12) & 0x000F );
  654. RequestPara.szAddr[1] = ByteToAscii( (nAddr >> 8) & 0x000F );
  655. RequestPara.szAddr[2] = ByteToAscii( (nAddr >> 4) & 0x000F );
  656. RequestPara.szAddr[3] = ByteToAscii( nAddr & 0x000F );
  657. for( int i = 0; i < 8; i++ )
  658. {
  659. RequestPara.szRsCode[i] = ByteToAscii(0);
  660. }
  661. char chBuffer1High[4];
  662. memset( chBuffer1High, 0, sizeof(chBuffer1High) );
  663. char chBuffer1Low[4];
  664. memset( chBuffer1Low, 0, sizeof(chBuffer1Low) );
  665. RsCode1 tagRsCode1;
  666. memset(&tagRsCode1, 0, sizeof(RsCode1));
  667. tagRsCode1.szStatus = 0; //这里为查询状态, 其它位无意义, 所以都置成0
  668. memcpy(chBuffer1High, (char *)&tagRsCode1, sizeof(RsCode1) / 2);
  669. memcpy(chBuffer1Low, ((char *)&tagRsCode1) + sizeof(RsCode1) / 2, sizeof(RsCode1) / 2);
  670. RequestPara.szRsCode[0] = Hex16(chBuffer1High) + '0';
  671. RequestPara.szRsCode[1] = Hex16(chBuffer1Low) + '0';
  672. // 算检验
  673. BYTE btParityHigh = ( (nAddr >> 12) & 0x000F ) ^
  674. ( (nAddr >> 4) & 0x000F ) ^
  675. (Hex16(chBuffer1High));
  676. BYTE btParityLow =( (nAddr >> 8) & 0x000F ) ^
  677. ( (nAddr) & 0x000F ) ^
  678. (Hex16(chBuffer1Low));
  679. RequestPara.szParity[0] = btParityHigh + '0';
  680. RequestPara.szParity[1] = btParityLow + '0';
  681. RequestPara.btEnd = 0x0D;
  682. if( WaitForSingleObject( m_hSemComm, 0 ) == WAIT_OBJECT_0 ) // 有信号才写串口
  683. {
  684. ResetEvent( m_hSemComm );
  685. int nResult = WriteMessage( (BYTE *)&RequestPara, iLen );
  686. if( nResult == iLen )
  687. {
  688. }
  689. else
  690. {
  691. SetEvent( m_hSemComm );
  692. return EER_CODE_GREE_COM_WRITE_DATA;
  693. }
  694. }
  695. else
  696. {
  697. return ERR_CODE_GREE_COM_BUSY;
  698. }
  699. return 0;
  700. }
  701. int CProtocolModbus::ResponseStatus( int nAddr, int nDataLen, int nReadPos, char chMsg[80])
  702. {
  703. #if 1
  704. // 回应
  705. //08 30 30 30 31 3C 39 30 36 30 30 34 32 32 31 36 .0001<9060042216
  706. //34 32 3F 3C 30 32 36 0F 42?<026.
  707. // 08 30 30 30 31 3C 39 39 32 30 30 34 30 32 33 38 34 30 3D 3C 30 37 30 0F
  708. char szBuffer[256];
  709. memset(szBuffer, 0, sizeof(szBuffer));
  710. szBuffer[0] = 0x08;
  711. szBuffer[1] = 0x30;
  712. szBuffer[2] = 0x30;
  713. szBuffer[3] = 0x30;
  714. szBuffer[4] = 0x31;
  715. szBuffer[5] = 0x3C;
  716. szBuffer[6] = 0x39;
  717. szBuffer[7] = 0x39;
  718. szBuffer[8] = 0x32;
  719. szBuffer[9] = 0x30;
  720. szBuffer[10] = 0x30;
  721. szBuffer[11] = 0x34;
  722. szBuffer[12] = 0x30;
  723. szBuffer[13] = 0x32;
  724. szBuffer[14] = 0x33;
  725. szBuffer[15] = 0x38;
  726. szBuffer[16] = 0x34;
  727. szBuffer[17] = 0x30;
  728. szBuffer[18] = 0x3D;
  729. szBuffer[19] = 0x3C;
  730. szBuffer[20] = 0x30;
  731. szBuffer[21] = 0x37;
  732. szBuffer[22] = 0x30;
  733. szBuffer[23] = 0x0F;
  734. int nLen = 24;
  735. RESPONSE_STRUCT *pResponse = (RESPONSE_STRUCT *)szBuffer;
  736. // 算检验
  737. int high = ( (pResponse->szAddr[0] - '0') ^
  738. (pResponse->szAddr[2] - '0') ^
  739. (pResponse->szRsCode[0] - '0') ^
  740. (pResponse->szRsCode[2] - '0') ^
  741. (pResponse->szRsCode[4] - '0') ^
  742. (pResponse->szRsCode[6] - '0') ^
  743. (pResponse->szEnvTemp[0] - '0') ^
  744. (pResponse->szStatus1[0] - '0') ^
  745. (pResponse->szStatus2[0] - '0') ^
  746. (pResponse->szStatus3[0] - '0') );
  747. int low = ( (pResponse->szAddr[1] - '0') ^
  748. (pResponse->szAddr[3] - '0') ^
  749. (pResponse->szRsCode[1] - '0') ^
  750. (pResponse->szRsCode[3] - '0') ^
  751. (pResponse->szRsCode[5] - '0') ^
  752. (pResponse->szRsCode[7] - '0') ^
  753. (pResponse->szEnvTemp[1] - '0') ^
  754. (pResponse->szStatus1[1] - '0') ^
  755. (pResponse->szStatus2[1] - '0') ^
  756. (pResponse->szStatus3[1] - '0') );
  757. if( !( ((byte)szBuffer[nLen - 2] == ByteToAscii(low) ) && ((byte)szBuffer[nLen - 3] == ByteToAscii(high) ) ) )
  758. {
  759. return ERR_CODE_GREE_COM_LRC_LOST;
  760. }
  761. EnterCriticalSection( &m_csReadFinished );
  762. //memcpy( &m_structResponse, pBuffer, sizeof(RESPONSE_STRUCT) );
  763. for( int i = 0; i < nDataLen; i++ )
  764. {
  765. chMsg[i] = szBuffer[nReadPos + i];
  766. }
  767. LeaveCriticalSection(&m_csReadFinished);
  768. // 设置串口等待事件为有信号
  769. SetEvent( m_hSemComm );
  770. #else
  771. RESPONSE_STRUCT structResponse;
  772. memset( &structResponse, 0, sizeof(RESPONSE_STRUCT) );
  773. if (nDataLen <= 0)
  774. {
  775. TRACE("变量长度小于等于0,为非法变量");
  776. return ERR_CODE_GREE_COM_VARLEN;
  777. }
  778. int nLen = sizeof(RESPONSE_STRUCT);// - sizeof(structResponse.StrRtnMsg) + nDataLen;
  779. char *pBuffer = new char[ nLen ];
  780. memset(pBuffer, 0, nLen);
  781. int nProcessLen = 0;
  782. int nReadLen = 0;
  783. nReadLen = ReadMessage((BYTE *)pBuffer, nLen);
  784. if( nReadLen <= 0)
  785. {
  786. // 串口没有读到数据
  787. TRACE("串口没有读到数据!\r\n");
  788. SetEvent( m_hSemComm );
  789. if( pBuffer != NULL)
  790. {
  791. delete[] pBuffer;
  792. pBuffer = NULL;
  793. }
  794. return ERR_CODE_GREE_COM_READ_NO_DATA;
  795. }
  796. else if( nReadLen < nLen )
  797. {
  798. TRACE("长度没有收够,断续接收,止到收完为止!\r\n");
  799. SetEvent( m_hSemComm );
  800. if( pBuffer != NULL)
  801. {
  802. delete[] pBuffer;
  803. pBuffer = NULL;
  804. }
  805. return ERR_CODE_GREE_COM_FAULT;
  806. }
  807. else if( nReadLen > nLen )
  808. {
  809. // 完全代码,不一定能执行到
  810. TRACE("接收的长度超时所需的长度,认为是非法包,扔掉\r\n");
  811. SetEvent( m_hSemComm );
  812. if( pBuffer != NULL)
  813. {
  814. delete[] pBuffer;
  815. pBuffer = NULL;
  816. }
  817. return ERR_CODE_GREE_COM_READ_LEN_OVER;
  818. }
  819. // 判断校验
  820. RESPONSE_STRUCT *pResponse = (RESPONSE_STRUCT *)pBuffer;
  821. // 算检验
  822. int high = ( (pResponse->szAddr[0] - '0') ^
  823. (pResponse->szAddr[2] - '0') ^
  824. (pResponse->szRsCode[0] - '0') ^
  825. (pResponse->szRsCode[2] - '0') ^
  826. (pResponse->szRsCode[4] - '0') ^
  827. (pResponse->szRsCode[6] - '0') ^
  828. (pResponse->szEnvTemp[0] - '0') ^
  829. (pResponse->szStatus1[0] - '0') ^
  830. (pResponse->szStatus2[0] - '0') ^
  831. (pResponse->szStatus3[0] - '0') );
  832. int low = ( (pResponse->szAddr[1] - '0') ^
  833. (pResponse->szAddr[3] - '0') ^
  834. (pResponse->szRsCode[1] - '0') ^
  835. (pResponse->szRsCode[3] - '0') ^
  836. (pResponse->szRsCode[5] - '0') ^
  837. (pResponse->szRsCode[7] - '0') ^
  838. (pResponse->szEnvTemp[1] - '0') ^
  839. (pResponse->szStatus1[1] - '0') ^
  840. (pResponse->szStatus2[1] - '0') ^
  841. (pResponse->szStatus3[1] - '0') );
  842. if( !( ((byte)pBuffer[nLen - 2] == ByteToAscii(low) ) && ((byte)pBuffer[nLen - 3] == ByteToAscii(high) ) ) )
  843. {
  844. TRACE("校验码失败!\r\n");
  845. SetEvent( m_hSemComm );
  846. if( pBuffer != NULL)
  847. {
  848. delete[] pBuffer;
  849. pBuffer = NULL;
  850. }
  851. return ERR_CODE_GREE_COM_LRC_LOST;
  852. }
  853. EnterCriticalSection( &m_csReadFinished );
  854. //memcpy( &m_structResponse, pBuffer, sizeof(RESPONSE_STRUCT) );
  855. for( int i = 0; i < nDataLen; i++ )
  856. {
  857. chMsg[i] = pBuffer[nReadPos + i];
  858. }
  859. LeaveCriticalSection(&m_csReadFinished);
  860. // 设置串口等待事件为有信号
  861. SetEvent( m_hSemComm );
  862. if( pBuffer != NULL)
  863. {
  864. delete[] pBuffer;
  865. pBuffer = NULL;
  866. }
  867. #endif
  868. return 0;
  869. }
  870. UINT CProtocolModbus::GetCRC(BYTE *pBuf, int len)
  871. {
  872. unsigned int Genpoly=0xA001;
  873. unsigned int CRC=0xFFFF;
  874. unsigned int index;
  875. while(len--)
  876. {
  877. CRC=CRC^(unsigned int)*pBuf++;
  878. for(index=0;index<8;index++)
  879. {
  880. if((CRC & 0x0001)==1) CRC=(CRC>>1)^Genpoly;
  881. else (CRC=CRC>>1);
  882. }
  883. }
  884. return(CRC);
  885. }
  886. BOOL CProtocolModbus::InitParam(PPORTPARAM pPortParam, CCommAsyn *pComm)
  887. {
  888. int addr=pPortParam->StartAddr;
  889. m_pComm=pComm;
  890. return TRUE;
  891. }
  892. void strReverse( char *str )
  893. {
  894. int l = strlen(str);
  895. for( int i = 0; i < l; i++ )
  896. {
  897. for(int i = 0; i < l; i++)
  898. {
  899. if( str[i] >= 'A' && str[i] <= 'Z' )
  900. {
  901. str[i] += 32;
  902. }
  903. else if(str[i] >= 'a' && str[i] <= 'z')
  904. {
  905. str[i] -= 32;
  906. }
  907. }
  908. }
  909. }
  910. char lowercase2uppercase(BYTE btSrc)
  911. {
  912. if( btSrc >= 'a' && btSrc <= 'z' )
  913. {
  914. return btSrc - 'a' + 'A';
  915. }
  916. return btSrc;
  917. }
  918. char ByteToAscii(BYTE btSrc)
  919. {
  920. char chDest;
  921. if( btSrc < 10 )
  922. {
  923. chDest = (char)(btSrc % 10 + '0');
  924. chDest = lowercase2uppercase(chDest);
  925. return chDest;
  926. }
  927. else
  928. {
  929. chDest = ByteToAscii( btSrc / 10 ) + (char)( btSrc % 10 + '0' );
  930. chDest = lowercase2uppercase(chDest);
  931. return chDest;
  932. }
  933. }
  934. WORD AsciiToBYTE(BYTE btSrc)
  935. {
  936. WORD chDest = (WORD)btSrc;
  937. if ((btSrc >= 'A')&&(btSrc <= 'F'))
  938. {
  939. chDest = chDest - 'A' + 10;
  940. }
  941. else if ((btSrc >= 'a')&&(btSrc <= 'f'))
  942. {
  943. chDest = chDest - 'a' + 10;
  944. }
  945. else if ((btSrc >= '0')&&(btSrc <= '9'))
  946. {
  947. chDest -= '0';
  948. }
  949. return chDest;
  950. }