PLCModbus.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "PLCModbus.h"
  2. namespace plc_modbus
  3. {
  4. //********************** constructor **********************
  5. CPLCModbus::CPLCModbus(void *pOwnerObject)
  6. {
  7. this->ip = 0;
  8. this->port = 0;
  9. }
  10. CPLCModbus::~CPLCModbus()
  11. {
  12. }
  13. //********************** init **********************
  14. bool CPLCModbus::connect(const char *ip, int port)
  15. {
  16. /* TCP */
  17. this->ip = ip;
  18. this->port = port;
  19. this->ctx = modbus_new_tcp(ip, port);
  20. modbus_set_debug(this->ctx, true);
  21. if (modbus_connect(this->ctx) == -1)
  22. {
  23. std::cout << "Connection failed: " << modbus_strerror(errno) << std::endl;
  24. modbus_free(this->ctx);
  25. return false;
  26. }
  27. else
  28. {
  29. std::cout << "connected" << std::endl;
  30. if(ctx==NULL){
  31. std::cout << "connected NULL" << std::endl;
  32. return false;
  33. }
  34. return true;
  35. }
  36. }
  37. void CPLCModbus::disconnect()
  38. {
  39. /* Close the connection */
  40. modbus_close(this->ctx);
  41. modbus_free(this->ctx);
  42. }
  43. bool CPLCModbus::reconnect()
  44. {
  45. CPLCModbus::disconnect();
  46. return CPLCModbus::connect(this->ip, this->port);
  47. }
  48. //********************** basic funcs **********************
  49. uint16_t CPLCModbus::get_current_stage()
  50. {
  51. uint16_t current_stage[] = {1};
  52. bool result = this->read_register(CURRENT_STAGE_ADDRESS, current_stage);
  53. if(result && current_stage)
  54. {
  55. return current_stage[0];
  56. }else{
  57. return (uint16_t)-1;
  58. }
  59. }
  60. uint16_t CPLCModbus::get_finish_status()
  61. {
  62. uint16_t finish_status[] = {1};
  63. bool result = this->read_register(FINISH_TRAJECTORY_ADDRESS, finish_status);
  64. if (result && finish_status)
  65. {
  66. return finish_status[0];
  67. }
  68. else
  69. {
  70. return (uint16_t)-1;
  71. }
  72. }
  73. bool CPLCModbus::update_trajectory(uint16_t update_flag, uint16_t *dest)
  74. {
  75. bool result = true;
  76. uint16_t updt_flag[1] = {update_flag};
  77. if (dest)
  78. {
  79. result &= this->write_registers(POSE_ADDRESS_START, POSE_COUNT * 2, dest);
  80. result &= this->write_register(UPDATE_FLAG_ADDRESS, updt_flag);
  81. return result;
  82. }else{
  83. return false;
  84. }
  85. }
  86. bool CPLCModbus::set_slave(int slave)
  87. {
  88. int rc = modbus_set_slave(this->ctx, slave);
  89. if (rc != 1)
  90. {
  91. std::cout << "set slave failed: " << rc << "," << modbus_strerror(errno) << std::endl;
  92. return false;
  93. }
  94. else
  95. {
  96. return true;
  97. }
  98. }
  99. bool CPLCModbus::read_registers(int addr, int nb, uint16_t *dest)
  100. {
  101. int rc = modbus_read_registers(this->ctx, addr, nb, dest);
  102. if (rc != nb)
  103. {
  104. std::cout << "read failed: " << rc << "," << modbus_strerror(errno) << std::endl;
  105. return false;
  106. }
  107. else
  108. {
  109. return true;
  110. }
  111. }
  112. bool CPLCModbus::write_registers(int addr, int nb, uint16_t *src)
  113. {
  114. int rc = modbus_write_registers(this->ctx, addr, nb, src);
  115. if (rc != nb)
  116. {
  117. std::cout << "write failed: " << rc << "," << modbus_strerror(errno) << std::endl;
  118. return false;
  119. }
  120. else
  121. {
  122. return true;
  123. }
  124. }
  125. bool CPLCModbus::read_register(int addr, uint16_t *dest)
  126. {
  127. int rc = modbus_read_registers(this->ctx, addr, 1, dest);
  128. if (rc != 1)
  129. {
  130. return false;
  131. }
  132. else
  133. {
  134. return true;
  135. }
  136. }
  137. bool CPLCModbus::write_register(int addr, uint16_t *src)
  138. {
  139. int rc = modbus_write_register(this->ctx, addr, src[0]);
  140. if (rc != 1)
  141. {
  142. return false;
  143. }
  144. else
  145. {
  146. return true;
  147. }
  148. }
  149. } // namespace plc_modbus