综合平台编程器项目的远程存储
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

69 wiersze
2.2 KiB

  1. #pragma once
  2. #include "services/plc_discovery_gateway.h"
  3. #include <QModbusDevice>
  4. #include <QObject>
  5. #include <QPointer>
  6. #include <cstddef>
  7. #include <cstdint>
  8. #include <functional>
  9. #include <memory>
  10. #include <vector>
  11. class QModbusReply;
  12. class QModbusRtuSerialMaster;
  13. // 使用独立 Qt Modbus RTU 主站逐项探测串口参数,不污染正式 PLC 连接状态
  14. class PlcDiscoveryService final : public QObject, public PlcDiscoveryGateway
  15. {
  16. public:
  17. explicit PlcDiscoveryService(QObject *parent = nullptr);
  18. ~PlcDiscoveryService() override;
  19. PlcCommunicationResult startDiscovery(
  20. const PlcSerialConfiguration &preferred) override;
  21. void cancelDiscovery() override;
  22. bool isDiscovering() const override;
  23. void setCallbacks(
  24. std::function<void(const PlcDiscoveryProgress &)> progress_changed,
  25. std::function<void(const PlcDiscoveryOutcome &)> discovery_finished) override;
  26. private:
  27. enum class Phase
  28. {
  29. Idle,
  30. Connecting,
  31. Probing,
  32. Disconnecting
  33. };
  34. // 尝试当前候选参数并等待串口异步打开
  35. void tryCurrentCandidate();
  36. // 串口打开后发送只读 D0 探测请求
  37. void sendProbe();
  38. // 处理当前 D0 探测结果
  39. void handleProbeFinished(QModbusReply *reply, std::uint64_t attempt_generation);
  40. // 释放当前串口,释放完成后进入下一个候选或报告结果
  41. void disconnectCurrent(bool found);
  42. // 当前串口完全释放后完成状态迁移
  43. void continueAfterDisconnect();
  44. // 报告最终结果并清理搜索状态
  45. void finishDiscovery(const PlcDiscoveryOutcome &outcome);
  46. // 处理 Qt Modbus 主站连接状态变化
  47. void handleDeviceStateChanged(QModbusDevice::State state);
  48. std::unique_ptr<QModbusRtuSerialMaster> master_;
  49. std::vector<PlcSerialConfiguration> candidates_;
  50. std::size_t current_candidate_ = 0;
  51. QPointer<QModbusReply> pending_reply_;
  52. Phase phase_ = Phase::Idle;
  53. bool discovering_ = false;
  54. bool cancel_requested_ = false;
  55. bool found_pending_ = false;
  56. std::uint64_t attempt_generation_ = 0;
  57. std::function<void(const PlcDiscoveryProgress &)> progress_changed_callback_;
  58. std::function<void(const PlcDiscoveryOutcome &)> discovery_finished_callback_;
  59. };