plc_modbus_uml.wsd 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. @startuml
  2. title PLC模块
  3. note top of CLibmodbusWrapper
  4. ×PLC底层封装类,非线程安全
  5. end note
  6. class CLibmodbusWrapper
  7. {
  8. +CLibmodbusWrapper();
  9. +virtual ~CLibmodbusWrapper();
  10. +int initialize(const char *ip, int port, int slave_id);
  11. +void deinitialize();
  12. +int read_registers(int addr, int nb, uint16_t *dest);
  13. +int write_registers(int addr, int nb, uint16_t *dest);
  14. +int read_register(int addr, uint16_t *dest);
  15. +int write_register(int addr, uint16_t *dest);
  16. +inline bool is_connected() { return (0 == _ctx) ? false : true; };
  17. +inline std::string getIP() { return _ip; };
  18. +inline int getPort() { return _port; };
  19. +inline int getSlave() { return _slave_id; };
  20. -modbus_t* _ctx;
  21. -std::string _ip;
  22. -int _port;
  23. -int _slave_id;
  24. }
  25. note right of Plc_Communicator
  26. ×PLC通信类,核心模块,线程安全,包括:
  27. ×根据plc信号调用回调进行测量
  28. *将测量系统实时状态与测量结果写入plc
  29. end note
  30. class Plc_Communicator
  31. {
  32. +Plc_Communicator(plc_module::plc_connection_params connection_params);
  33. +~Plc_Communicator();
  34. +bool get_initialize_status();// 获取初始化状态
  35. +bool get_connection();// 获取连接状态
  36. +Error_manager get_error();// 获取历史错误信息
  37. +Error_manager set_plc_callback(Command_Callback callback, void * p_owner);// 设置plc检测到指令后外部回调函数
  38. +Error_manager execute_task(Task_Base* task);// 执行任务单
  39. +Error_manager get_plc_data(std::vector<uint16_t> &plc_data,int terminal_id=-1);// 获取实时数据
  40. +Error_manager set_status_update_timeout(int millisecond);// 设置plc状态更新超时时间
  41. +struct plc_region_status // 包含时间戳、指令信息、实时状态
  42. {
  43. std::chrono::steady_clock::time_point last_time_point;
  44. int current_status;
  45. int cmd;
  46. };
  47. -Error_manager ReadProtoParam(std::string path);// 读配置函数
  48. -static void plc_update_thread(Plc_Communicator* plc_communicator);// 读PLC各雷达模块信息线程函数
  49. -static void plc_publish_message(Plc_Communicator* plc);// 发布读取结果到UI线程函数
  50. -Error_manager write_result_to_plc(struct measure_result result);// 写测量数据到PLC函数
  51. -Error_manager connect();// 连接函数
  52. -Error_manager disconnect();// 断开连接
  53. -bool mb_plc_is_connected;// 指示plc连接状态
  54. -bool mb_plc_initialized; // 指示plc是否初始化
  55. -bool mb_plc_is_updating; // 指示plc线程在运行
  56. -void* mp_plc_owner; // 回调函数所有者句柄
  57. -Command_Callback m_plc_callback; // 回调函数
  58. -std::thread* m_plc_message_thread; // plc
  59. -std::thread* m_plc_thread; // plc更新线程句柄
  60. -StdCondition m_plc_cond_exit; // plc更新线程退出条件控制变量
  61. -std::mutexm_plc_mutex; // plc更新互斥锁,锁住与wrapper相关的所有操作
  62. -modbus::CLibmodbusWrapper m_plc_wrapper; // plc连接与读写封装实例
  63. -std::string m_plc_ip_str;// plc连接ip
  64. -int m_plc_port; // plc连接端口
  65. -int m_plc_slave_id; // plc连接id
  66. -int m_plc_status_update_timeout; // plc状态更新超时时间
  67. -std::vector<uint16_t> m_plc_data; // 从plc获取的实时数据
  68. -Error_manager m_plc_current_error; // 当前plc出现的错误
  69. // 当前系统状态,实时更新到plc。状态254-255每1秒互换,状态1从收到指令开始,紧接着改为状态2,
  70. // 之后根据外部传入的task,决定写入3或4,默认3保留3秒,4持续保留直到新指令
  71. -plc_region_status m_plc_region_status[PLC_REGION_NUM];
  72. }
  73. class plc_message::plcMsg << (M,#00FF77) message>>
  74. {
  75. plcStatus plc_status=1;
  76. int32 plc_values=2;
  77. }
  78. class plc_module::plc_connection_params << (M,#00FF77) message>>
  79. {
  80. string ip=1;
  81. int32 port=2;
  82. int32 slave_id=3;
  83. }
  84. class plc_module::Plc_msg << (M,#00FF77) message>>
  85. {
  86. PLC_STATUS status=1;
  87. int32 plc_values=2;
  88. }
  89. class Plc_Task
  90. {
  91. +virtual Error_manager init();
  92. +Plc_Task();
  93. +~Plc_Task();
  94. +Error_manager set_result(struct measure_result result);// 将测量结果存入该任务单
  95. +Error_manager get_result(struct measure_result &result);// 将测量结果传出
  96. +bool get_result_set_flag();// 获取测量结果是否已存入该任务单的指标
  97. -struct measure_result m_measure_result;// 存放测量结果
  98. -bool mb_result_set_flag;// 已获取结果
  99. -struct measure_result
  100. {
  101. int terminal_id;
  102. float x;
  103. float y;
  104. float angle;
  105. float length;
  106. float width;
  107. float height;
  108. float wheel_base;
  109. bool correctness;
  110. };
  111. }
  112. class Task_Base
  113. {
  114. +Task_Base();
  115. +~Task_Base();
  116. +virtual Error_manager init();//初始化任务单,初始任务单类型为 UNKONW_TASK
  117. +Error_manager update_statu(Task_statu task_statu,std::string statu_information="");更新任务单; task_statu: 任务状态; statu_information:状态说明
  118. +Task_type get_task_type();//获取任务类型
  119. +Task_statu get_statu();//获取任务单状态
  120. +std::string get_statu_information();//获取状态说明
  121. -Task_type m_task_type;
  122. -Task_statu m_task_statu;//任务状态
  123. -std::string m_task_statu_information; //任务状态说明
  124. }
  125. Task_Base <|-- Plc_Task
  126. Plc_Communicator <-- Plc_Task
  127. Plc_Communicator <-- plc_message::plcMsg
  128. Plc_Communicator <-- plc_module::plc_connection_params
  129. Plc_Communicator <-- plc_module::Plc_msg
  130. Plc_Communicator <-- CLibmodbusWrapper
  131. @enduml