当前位置:   article > 正文

用C++QT实现一个modbus rtu通讯程序框架_qt modbusrtu

qt modbusrtu

下面是一个简单的Modbus RTU通讯程序框架的示例,使用C++和QT来实现:

  1. #include <QCoreApplication>
  2. #include <QSerialPort>
  3. #include <QModbusDataUnit>
  4. #include <QModbusRtuSerialMaster>
  5. int main(int argc, char *argv[])
  6. {
  7. QCoreApplication a(argc, argv);
  8. // 创建串口对象
  9. QSerialPort serial;
  10. serial.setPortName("COM1"); // 设置串口名称
  11. serial.setBaudRate(QSerialPort::Baud9600); // 设置波特率
  12. serial.setDataBits(QSerialPort::Data8); // 设置数据位
  13. serial.setParity(QSerialPort::NoParity); // 设置校验位
  14. serial.setStopBits(QSerialPort::OneStop); // 设置停止位
  15. // 打开串口
  16. if (!serial.open(QIODevice::ReadWrite))
  17. {
  18. qDebug() << "Failed to open serial port!";
  19. return 1;
  20. }
  21. // 创建Modbus RTU主站对象
  22. QModbusRtuSerialMaster modbusMaster;
  23. modbusMaster.setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM1"); // 设置串口名称
  24. modbusMaster.setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600); // 设置波特率
  25. modbusMaster.setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8); // 设置数据位
  26. modbusMaster.setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity); // 设置校验位
  27. modbusMaster.setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop); // 设置停止位
  28. // 设置Modbus设备地址
  29. modbusMaster.setServerAddress(1);
  30. // 连接Modbus RTU设备
  31. if (!modbusMaster.connectDevice())
  32. {
  33. qDebug() << "Failed to connect to Modbus device!";
  34. return 1;
  35. }
  36. // 创建Modbus数据单元
  37. QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 10); // 读取保持寄存器0~9的数据
  38. // 读取Modbus数据
  39. if (auto *reply = modbusMaster.sendReadRequest(readUnit, 1))
  40. {
  41. // 等待读取完成
  42. if (!reply->isFinished())
  43. {
  44. QEventLoop loop;
  45. QObject::connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
  46. loop.exec();
  47. }
  48. // 检查读取结果
  49. if (reply->error() == QModbusDevice::NoError)
  50. {
  51. // 处理读取到的数据
  52. const auto values = reply->result().values();
  53. for (int i = 0; i < values.size(); ++i)
  54. {
  55. qDebug() << "Register" << i << "=" << values.at(i);
  56. }
  57. }
  58. else
  59. {
  60. qDebug() << "Read error:" << reply->errorString();
  61. }
  62. // 释放Modbus回复对象
  63. reply->deleteLater();
  64. }
  65. else
  66. {
  67. qDebug() << "Failed to send Modbus read request!";
  68. }
  69. // 关闭Modbus连接
  70. modbusMaster.disconnectDevice();
  71. // 关闭串口
  72. serial.close();
  73. return a.exec();
  74. }

具体的数据处理将根据需求进行扩展和实现,如写入数据和处理异常等。另外,需要根据实际情况设置正确的串口参数和设备地址,并确保与Modbus设备的正确连接。在编译和运行程序之前,还需要在项目的.pro文件中添加QT+=serialport以启用QtSerialPort模块。

下面是一个写入Modbus寄存器的示例:

  1. // 创建Modbus数据单元
  2. QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 0, 1); // 写入保持寄存器0
  3. // 设置写入数据
  4. QVector<quint16> data;
  5. data.append(123); // 写入的数据
  6. writeUnit.setValues(data);
  7. // 写入Modbus数据
  8. if (auto *reply = modbusMaster.sendWriteRequest(writeUnit, 1))
  9. {
  10. // 等待写入完成
  11. if (!reply->isFinished())
  12. {
  13. QEventLoop loop;
  14. QObject::connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
  15. loop.exec();
  16. }
  17. // 检查写入结果
  18. if (reply->error() == QModbusDevice::NoError)
  19. {
  20. qDebug() << "Write request completed successfully!";
  21. }
  22. else
  23. {
  24. qDebug() << "Write error:" << reply->errorString();
  25. }
  26. // 释放Modbus回复对象
  27. reply->deleteLater();
  28. }
  29. else
  30. {
  31. qDebug() << "Failed to send Modbus write request!";
  32. }

 本文转自:Modbus笔记_modbus 66 03开头-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/559248
推荐阅读
相关标签
  

闽ICP备14008679号