您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

71 行
1.6 KiB

  1. #ifndef MODBUSSIMULATOR_H
  2. #define MODBUSSIMULATOR_H
  3. #include <QObject>
  4. #include <QModbusRtuSerialMaster>
  5. #include <QSet>
  6. #include <QMutex>
  7. #include <QThread>
  8. #include <atomic>
  9. class PollingWorker; // 前向声明
  10. class ModbusSimulator : public QObject
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit ModbusSimulator(QObject *parent = nullptr);
  15. ~ModbusSimulator();
  16. void startSimulation();
  17. void stopSimulation();
  18. bool isRunning() const;
  19. void setCoilAddresses(const QSet<int> &addresses);
  20. void writeCoil(int address, bool state);
  21. signals:
  22. void coilStatusRead(int address, bool state);
  23. void errorOccurred(const QString &message);
  24. private:
  25. QModbusRtuSerialMaster *m_modbusClient;
  26. QSet<int> m_coilAddresses;
  27. std::atomic<bool> m_running;
  28. QMutex m_mutex;
  29. QThread *m_workerThread;
  30. PollingWorker *m_worker;
  31. };
  32. // 轮询工作线程类
  33. class PollingWorker : public QObject
  34. {
  35. Q_OBJECT
  36. public:
  37. void stop() { m_stop = true; } // 新增公共接口
  38. explicit PollingWorker(QModbusRtuSerialMaster *client,
  39. QMutex *mutex,
  40. QSet<int> *addresses,
  41. std::atomic<bool> *runningFlag,
  42. QObject *parent = nullptr);
  43. public slots:
  44. void startPolling(int interval);
  45. signals:
  46. void coilReadResult(int address, bool state);
  47. void errorOccurred(const QString &message);
  48. private:
  49. void performCoilReading();
  50. QModbusRtuSerialMaster *m_modbusClient;
  51. QMutex *m_mutex;
  52. QSet<int> *m_coilAddresses;
  53. std::atomic<bool> *m_runningFlag;
  54. std::atomic<bool> m_stop;
  55. };
  56. #endif // MODBUSSIMULATOR_H