plc_communicator.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #ifndef PLC_COMMUNICATOR_HH
  2. #define PLC_COMMUNICATOR_HH
  3. #include <iostream>
  4. #include <string.h>
  5. #include <mutex>
  6. #include <vector>
  7. #include <thread>
  8. #include <unistd.h>
  9. #include <chrono>
  10. #include <cmath>
  11. // #include <fstream>
  12. // #include <stdint.h>
  13. // #include <unistd.h>
  14. // #include <sys/types.h>
  15. // #include <sys/stat.h>
  16. // #include <fcntl.h>
  17. // #include "../error.h"
  18. #include "../task/task_command_manager.h"
  19. #include "../error_code/error_code.h"
  20. #include "plc_task.h"
  21. #include "LibmodbusWrapper.h"
  22. #include "../tool/StdCondition.h"
  23. #include "../tool/MeasureTopicPublisher.h"
  24. #include "plc_module.pb.h"
  25. #include "plc_message.pb.h"
  26. #include <google/protobuf/io/coded_stream.h>
  27. #include <google/protobuf/io/zero_copy_stream_impl.h>
  28. #include <google/protobuf/text_format.h>
  29. using google::protobuf::io::FileInputStream;
  30. using google::protobuf::io::FileOutputStream;
  31. using google::protobuf::io::ZeroCopyInputStream;
  32. using google::protobuf::io::CodedInputStream;
  33. using google::protobuf::io::ZeroCopyOutputStream;
  34. using google::protobuf::io::CodedOutputStream;
  35. using google::protobuf::Message;
  36. #include "glog/logging.h"
  37. #include <nnxx/message.h>
  38. #include <nnxx/message_control.h>
  39. #include <nnxx/socket.h>
  40. #include <nnxx/reqrep.h>
  41. //#include <nnxx/unittest.h>
  42. #include <nnxx/timeout.h>
  43. #include <nnxx/error.h>
  44. #include <cstring>
  45. #include <nnxx/message.h>
  46. const int PLC_SIGNAL_BEGIN_OFFSET=2;
  47. const int PLC_REGION_NUM=6;
  48. const int PLC_SIGNAL_NUM_PER_REGION=12;
  49. const int PLC_SLEEP_IN_MILLISECONDS=200;
  50. const int PLC_LASER_START_ADDR = 0;
  51. const int PLC_LASER_STATUS_ADDR = 1;
  52. const int PLC_LASER_X_ADDR = 2;
  53. const int PLC_LASER_Y_ADDR = 3;
  54. const int PLC_LASER_ANGLE_ADDR = 4;
  55. const int PLC_LASER_LENGTH_ADDR = 5;
  56. const int PLC_LASER_WIDTH_ADDR = 6;
  57. const int PLC_LASER_HEIGHT_ADDR = 7;
  58. const int PLC_LASER_CORRECTNESS_ADDR = 8;
  59. const int PLC_LASER_WHEELBASE_ADDR = 9;
  60. typedef Error_manager(*Command_Callback)(int terminal_id, void * p_owner);
  61. // plc通信类,modbus通信
  62. class Plc_Communicator
  63. {
  64. public:
  65. Plc_Communicator(plc_module::plc_connection_params connection_params);
  66. ~Plc_Communicator();
  67. // get set 方法
  68. bool get_initialize_status();
  69. bool get_connection();
  70. Error_manager get_error();
  71. // 设置plc检测到指令后外部回调函数
  72. Error_manager set_plc_callback(Command_Callback callback, void * p_owner);
  73. // 执行任务单
  74. Error_manager execute_task(Task_Base* task);
  75. // 获取实时数据
  76. Error_manager get_plc_data(std::vector<uint16_t> &plc_data,int terminal_id=-1);
  77. // 设置plc状态更新超时时间
  78. Error_manager set_status_update_timeout(int millisecond);
  79. struct plc_region_status{
  80. std::chrono::steady_clock::time_point last_time_point;
  81. int current_status;
  82. int cmd;
  83. };
  84. private:
  85. // 读写线程函数
  86. Error_manager ReadProtoParam(std::string path);
  87. static void plc_update_thread(Plc_Communicator* plc_communicator);
  88. static void plc_publish_message(Plc_Communicator* plc);
  89. Error_manager write_result_to_plc(struct measure_result result);
  90. // 连接函数
  91. Error_manager connect();
  92. Error_manager disconnect();
  93. private:
  94. bool mb_plc_is_connected; // 指示plc连接状态
  95. bool mb_plc_initialized; // 指示plc是否初始化
  96. bool mb_plc_is_updating; // 指示plc线程在运行
  97. void* mp_plc_owner; // 回调函数所有者句柄
  98. Command_Callback m_plc_callback; // 回调函数
  99. std::thread* m_plc_message_thread; // plc
  100. std::thread* m_plc_thread; // plc更新线程句柄
  101. StdCondition m_plc_cond_exit; // plc更新线程退出条件控制变量
  102. std::mutex m_plc_mutex; // plc更新互斥锁,锁住与wrapper相关的所有操作
  103. modbus::CLibmodbusWrapper m_plc_wrapper; // plc连接与读写封装实例
  104. std::string m_plc_ip_str; // plc连接ip
  105. int m_plc_port; // plc连接端口
  106. int m_plc_slave_id; // plc连接id
  107. int m_plc_status_update_timeout; // plc状态更新超时时间
  108. std::vector<uint16_t> m_plc_data; // 从plc获取的实时数据
  109. Error_manager m_plc_current_error; // 当前plc出现的错误
  110. // 当前系统状态,实时更新到plc。状态254-255每1秒互换,状态1从收到指令开始,紧接着改为状态2,
  111. // 之后根据外部传入的task,决定写入3或4,默认3保留3秒,4持续保留直到新指令
  112. plc_region_status m_plc_region_status[PLC_REGION_NUM];
  113. // plc_module::plc_connection_params m_connection_params; // 连接参数
  114. };
  115. #endif // !PLC_COMMUNICATOR_HH