modbustest.hpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. //
  2. // Created by lloyd on 2020/10/20.
  3. //
  4. #include <iostream>
  5. #include "modbus.h"
  6. #include "../DataMapping/dgns_gtgktype.h"
  7. class modbustest {
  8. public:
  9. char DataStr[4000];
  10. public:
  11. void maintest() {
  12. printf("Compiled with libmodbus version %s\n", LIBMODBUS_VERSION_STRING);
  13. printf("Linked with libmodbus version %d.%d.%d\n",
  14. libmodbus_version_major, libmodbus_version_minor, libmodbus_version_micro);
  15. if (LIBMODBUS_VERSION_CHECK(2, 1, 0)) {
  16. printf("The functions to read/write float values are available (2.1.0).\n");
  17. }
  18. if (LIBMODBUS_VERSION_CHECK(2, 1, 1)) {
  19. printf("Oh gosh, brand new API (2.1.1)!\n");
  20. }
  21. }
  22. void testMondbusTCPClient() {
  23. const char *chIp = "192.168.1.57";
  24. int nPort = 502;
  25. modbus_t *pmbs_ctx = modbus_new_tcp(chIp, nPort);
  26. int nRet = modbus_connect(pmbs_ctx);
  27. if (-1 == nRet) {
  28. printf("connect failed: %s\n", modbus_strerror(errno));
  29. modbus_free(pmbs_ctx);
  30. }
  31. // 设置Modbus超时时间
  32. struct timeval tv;
  33. tv.tv_sec = 1;
  34. tv.tv_usec = 0;
  35. //设置modbus超时时间为1000毫秒
  36. modbus_set_response_timeout(pmbs_ctx, &tv);
  37. // 定义存放数据的数组
  38. //uint16_t tab_reg[9999] = {0};
  39. // 每隔1秒钟发送Modbus TCP请求,读取对应寄存器并打印出数据
  40. // while (true)
  41. // {
  42. printf("--------------------------------------------------\n");
  43. /*int address;
  44. switch (address) {
  45. case 40984:
  46. break;
  47. case 40985:
  48. break;
  49. case 40991:
  50. break;
  51. case 40993:
  52. break;
  53. // case 40985:
  54. // break;
  55. // case 40985:
  56. // break;
  57. default:
  58. break;
  59. }*/
  60. //1.gtdata read
  61. // 读取保持寄存器的值,起始地址为 ,寄存器个数为 ,读取到 数组中
  62. uint16_t pointnum;
  63. modbus_set_slave(pmbs_ctx, 1);
  64. int regs = modbus_read_registers(pmbs_ctx, 40984, 1, &pointnum);
  65. if (regs != 1) return;
  66. printf("gt pointnum: %d \n", pointnum);
  67. uint16_t timebyte[5];
  68. modbus_set_slave(pmbs_ctx, 1);
  69. regs = modbus_read_registers(pmbs_ctx, 40985, 6, timebyte);
  70. if (regs != 6) return;
  71. printf("gt date: %04X年%02X月%02X日 %02X:%02X:%02X\n", timebyte[0], timebyte[1], timebyte[2], timebyte[3],
  72. timebyte[4], timebyte[5]);
  73. uint16_t chongci;
  74. modbus_set_slave(pmbs_ctx, 1);
  75. regs = modbus_read_registers(pmbs_ctx, 40991, 1, &chongci);
  76. if (regs != 1) return;
  77. printf("gt chongci: %5.2f \n", 60.0 / (chongci / 1000.0));
  78. uint16_t chongcheng;
  79. modbus_set_slave(pmbs_ctx, 1);
  80. regs = modbus_read_registers(pmbs_ctx, 40993, 1, &chongcheng);
  81. if (regs != 1) return;
  82. printf("gt chongcheng: %5.2f \n", chongcheng / 100.0);
  83. uint16_t WeiYi[250];
  84. uint16_t ZaiHe[250];
  85. //weiyi
  86. modbus_set_slave(pmbs_ctx, 1);
  87. regs = modbus_read_registers(pmbs_ctx, 41001, 125, &WeiYi[0]);
  88. if (regs != 125) return;
  89. modbus_set_slave(pmbs_ctx, 1);
  90. regs = modbus_read_registers(pmbs_ctx, 41126, 125, &WeiYi[125]);
  91. if (regs != 125) return;
  92. //zaihe
  93. modbus_set_slave(pmbs_ctx, 1);
  94. regs = modbus_read_registers(pmbs_ctx, 41251, 125, &ZaiHe[0]);
  95. if (regs != 125) return;
  96. modbus_set_slave(pmbs_ctx, 1);
  97. regs = modbus_read_registers(pmbs_ctx, 41376, 125, &ZaiHe[125]);
  98. if (regs != 125) return;
  99. //char DataStr[4000];
  100. char *strTMP = new char[8];
  101. for (int i = 0; i < 250; i++) {
  102. sprintf(strTMP, "%03d%05d", WeiYi[i], ZaiHe[i]);
  103. for (int j = 0; j < 8; j++) {
  104. DataStr[i * 8 + j] = strTMP[j];
  105. }
  106. }
  107. printf("gt weiyi + zaihe: %s \n", DataStr);
  108. printf("--------------------------------------------------\n");
  109. // 获取当前时间
  110. // 获取系统时间
  111. //time_t now_time = time(NULL);
  112. // 获取本地时间
  113. //struct tm *t_tm = localtime(&now_time);
  114. // 将时间转换为秒
  115. //time_t mk_time = mktime(t_tm);
  116. // 输出当前时间
  117. //printf("当前数据时间为:%04d-%02d-%02d %02d:%02d:%02d\n", t_tm->tm_year+1900, t_tm->tm_mon + 1,t_tm->tm_mday, t_tm->tm_hour, t_tm->tm_min,t_tm->tm_sec);
  118. //2.gongtu shuju write where wrtie?
  119. //预置单寄存器 把具体二进值装入一个保持寄存器
  120. uint16_t tmpbuff[5] = {1, 2, 3, 4, 5};
  121. nRet = modbus_write_registers(pmbs_ctx, 42001, 5, tmpbuff);
  122. //
  123. // Sleep(1000);
  124. // }
  125. // 关闭modbus连接
  126. modbus_close(pmbs_ctx);
  127. //释放modbus资源,使用完libmodbus需要释放掉
  128. modbus_free(pmbs_ctx);
  129. }
  130. std::map<int, std::string> gktypes;
  131. std::map<std::string, dgns_gtgktype> gktypes_;
  132. uint16_t *trans_gtcvr_out_content_to_modbuscode_rf(std::string gk_content) {
  133. dgns_gtgktype type_gkout = gktypes_[gk_content];
  134. //modbustranscode ----> uint16_t[]
  135. // delete [
  136. // delete last ]
  137. // split ] ---std::string[]
  138. //for std::string[] --->int[]
  139. //std::vector<uint16_t> p;
  140. uint16_t *p = new uint16_t[5];
  141. std::list<uint16_t> p1;
  142. return p;
  143. }
  144. /**
  145. * 标准工况类型编码后内容输入到modbus server
  146. * @param buff 工况既定标准输出编码数组
  147. * @param buffnum 个数
  148. * @return
  149. */
  150. bool write_gtcvr_out_content_to_modbus_tcp_server(uint16_t *buff, unsigned int buffnum) {
  151. //TODO:完成工况类型标准输入modbus server
  152. //like ::::
  153. //int nRet = modbus_write_registers(pmbs_ctx, 42001, 5, tmpbuff);
  154. return true;//返回写入成功与否
  155. }
  156. /**
  157. * 标准工况类型编码后内容输入到modbus server
  158. * @param buff 工况既定标准输出编码数组 using vector as container
  159. * @return
  160. */
  161. bool write_gtcvr_out_content_to_modbus_tcp_server(std::vector<uint16_t> buff) {
  162. //TODO:完成工况类型标准输入modbus server
  163. //like ::::
  164. //int nRet = modbus_write_registers(pmbs_ctx, 42001, 5, tmpbuff);
  165. return true;//返回写入成功与否
  166. }
  167. };