You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
1.5 KiB

  1. #ifndef MODBUSMANAGER_H
  2. #define MODBUSMANAGER_H
  3. #include <QObject>
  4. #include <QModbusRtuSerialMaster>
  5. #include <QSerialPort>
  6. #include <QTimer>
  7. #include <QMap>
  8. #include "registermanager.h"
  9. class ModbusManager : public QObject
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit ModbusManager(RegisterManager* regManager, QObject *parent = nullptr);
  14. ~ModbusManager();
  15. // 串口连接管理
  16. bool connectToDevice(const QString& portName,
  17. QSerialPort::BaudRate baudRate = QSerialPort::Baud9600,
  18. QSerialPort::DataBits dataBits = QSerialPort::Data8,
  19. QSerialPort::Parity parity = QSerialPort::NoParity,
  20. QSerialPort::StopBits stopBits = QSerialPort::OneStop);
  21. void disconnectDevice();
  22. // 仿真控制
  23. void startSimulation(int interval = 500); // 毫秒
  24. void stopSimulation();
  25. // 寄存器读写
  26. void writeRegister(const QString& registerId, quint16 value);
  27. // 设置从站地址
  28. void setSlaveAddress(int address) { slaveAddress = address; }
  29. signals:
  30. void connectionStatusChanged(bool connected);
  31. void errorOccurred(const QString& error);
  32. private slots:
  33. void readRegisters();
  34. void processModbusReply();
  35. private:
  36. QModbusRtuSerialMaster *modbusDevice;
  37. RegisterManager* registerManager;
  38. QTimer* pollTimer;
  39. int slaveAddress = 1; // 默认从站地址
  40. QMap<QModbusReply*, QString> pendingRequests;
  41. void readRegisterGroup(QModbusDataUnit::RegisterType type, int startAddr, int count);
  42. };
  43. #endif // MODBUSMANAGER_H