Qt Modbus通信(RTU模式)

相关Qt Class

  • QModbusRtuSerialSlave (服务器类)
  • QModbusServer
  • QModbusDevice
  • QModbusClient
  • QModbusRtuSerialMaster(客户端类)
  • QModbusRequest
  • QModbusResponse
  • QModbusReply
  • QModbusDataUnit

通信流程

创建QModbusRtuSerialMaster对象m_modbusDevice,并设置串口通信参数:

1  m_modbusDevice.setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::EvenParity);
2  m_modbusDevice.setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600);
3  m_modbusDevice.setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
4  m_modbusDevice.setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);

串口连接:

1 bool connectDevice()
2 {
3     //implement
4 }

连接成功后,发送请求:

1 QModbusResponse sendModbusRawRequest(const QModbusRequest &request) const
2 {
3     //implement
4 }

断开连接:

1 void disconnectDevice()
2 {
3     //implement
4 }

示例代码

tempCtrl.h

 1 #ifndef TEMPCTRL_H
 2 #define TEMPCTRL_H
 3 
 4 #include 
 5 
 6 class TempCtrl
 7 {
 8 private:
 9     TempCtrl();
10 
11 public:
12     ~TempCtrl();
13     static TempCtrl* instance();
14 
15 public:    
16     void connectDevice();
17     void disconnectDevice();
18     
19 private:
20     QModbusResponse sendModbusRawRequest(const QModbusRequest &request) const;
21 
22 private:
23     bool m_channelConnected;
24     int m_channelAddr;
25     mutable QModbusRtuSerialMaster m_modbusDevice;
26 };
27 #endif // TEMPCTRL_H

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

tempCtrl.cpp

  1 #include "TempCtrl.h"
  2 
  3 #include 
  4 #include 
  5 #include 
  6 
  7 #include 
  8 #include 
  9 #include 
 10 
 11 TempCtrl::TempCtrl()
 12     , m_channelConnected(false)
 13     , m_channelAddr(0)
 14     , m_modbusDevice()
 15 {
 16     m_modbusDevice.setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::EvenParity);
 17     m_modbusDevice.setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600);
 18     m_modbusDevice.setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
 19     m_modbusDevice.setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
 20 }
 21 
 22 TempCtrl::~TempCtrl()
 23 {
 24     disconnectDevice();
 25 }
 26 
 27 TempCtrl* TempCtrl::instance()
 28 {
 29     static TempCtrl* theInstance = new TempCtrl();
 30     return theInstance;
 31 }
 32 
 33 bool TempCtrl::connectDevice()
 34 {
 35     disconnectDevice(); 
 36     
 37     const auto serialPortInfos = QSerialPortInfo::availablePorts();
 38     if(!serialPortInfos.empty())
 39     {
 40         QModbusRequest echoTest(QModbusRequest::Diagnostics, quint16(0x0000), quint16(0x1234));
 41 
 42         bool comportFound(false);
 43         for (const QSerialPortInfo &serialPortInfo : serialPortInfos)
 44         {
 45             m_modbusDevice.setConnectionParameter(QModbusDevice::SerialPortNameParameter, serialPortInfo.portName());
 46 
 47             if(m_modbusDevice.connectDevice())
 48             {
 49                 auto curTimePt = std::chrono::steady_clock::now();
 50                 double duration = 0;
 51 
 52                 while(m_modbusDevice.state() != QModbusDevice::ConnectedState && duration < 2.0)
 53                 {
 54                     QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 20);
 55                     std::chrono::duration d = std::chrono::steady_clock::now()-curTimePt;
 56                     duration = d.count();
 57                 }
 58 
 59                 if(m_modbusDevice.state() == QModbusDevice::ConnectedState)
 60                 {
 61                     try
 62                     {
 63                         QModbusResponse reply = sendModbusRawRequest(echoTest); 
 64                         if(reply.isValid())
 65                         {
 66                             if(reply.data() == QByteArray::fromHex("00001234"))
 67                             {
 68                                 if(!comportFound)
 69                                 {
 70                                     comportFound = true;
 71                                 }
 72                              m_channelConnected = true;
 73                             }
 74                         }
 75                     }
 76                     catch(...)
 77                     {
 78                     }
 79                 }
 80 
 81                 if(comportFound)
 82                 {
 83                     break;
 84                 }
 85                 else
 86                 {
 87                     m_modbusDevice.disconnectDevice();
 88                 }
 89             }
 90         }
 91     }
 92 
 93     m_modbusDevice.setTimeout(500);
 94     m_modbusDevice.setNumberOfRetries(3);
 95     return m_channelConnected;
 96 }
 97 
 98 void TempCtrl::disconnectDevice()
 99 {
100     if(m_modbusDevice.state() != QModbusDevice::UnconnectedState)
101     {
102         m_modbusDevice.disconnectDevice();
103     }
104     m_channelConnected = false;
105 }
106 
107 QModbusResponse TempCtrl::sendModbusRawRequest(const QModbusRequest &request) const
108 {
109     QModbusReply* reply = m_modbusDevice.sendRawRequest(request, m_channelAddr);
110 
111     if(reply)
112     {
113         while(!reply->isFinished())
114         {
115             QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 20);
116         }
117 
118         reply->deleteLater();
119 
120         if(reply->error() == QModbusDevice::NoError)
121         {
122             auto response = reply->rawResult();
123             std::this_thread::sleep_for(std::chrono::milliseconds(5));
124             return response;
125         }
126         else if (reply->error() == QModbusDevice::ProtocolError)
127         {
128             QString error = "Protocol error: " + reply->errorString();
129             throw std::exception(error.toStdString().c_str());
130         }
131         else if (reply->error() == QModbusDevice::TimeoutError)
132         {
133             throw std::exception("Timeout error");
134         }
135         else
136         {
137             throw std::exception("Unknown error");
138         }
139     }
140     else
141     {
142         return QModbusResponse();
143     }
144 }

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
上位机是指控制系统中用来监视和控制下位机的计算机软件或硬件设备。Qt 是一种跨平台的应用程序开发框架,可用于开发各种图形用户界面(GUI)应用程序。Modbus-RTU 是一种串行通信协议,用于在自动化设备和控制系统间进行数据传输。官方表示该软件或协议是由官方推出或提供的。 上位机 Qt Modbus-RTU 官方一般指的是由官方提供支持和维护的上位机软件框架,用于通过 Qt 开发 Modbus-RTU 协议的应用程序。这意味着该软件具有官方认可和支持,并且在使用过程中可以借助官方文档和支持渠道获得帮助。 使用上位机 Qt Modbus-RTU 官方,可以方便地开发用于监控和控制 Modbus-RTU 设备的应用程序。通过 Qt 的跨平台性,开发的应用程序可以运行在不同的操作系统上,提高了应用程序的可移植性和兼容性。 Modbus-RTU 是一种广泛应用于工业自动化领域的串行通信协议,在工业控制系统中具有较好的兼容性和可靠性。通过上位机 Qt Modbus-RTU 官方,可以实现与 Modbus-RTU 设备的通讯和数据交换,包括读取设备的数据、设置设备的参数以及发送命令控制设备等。 总之,上位机 Qt Modbus-RTU 官方是一种用于开发 Modbus-RTU 设备监控和控制应用程序的软件框架,具有官方认可和支持。它方便开发人员进行应用程序的开发和维护,并且支持跨平台运行,提高了应用程序的可移植性和兼容性。同时,它可以与工业自动化领域中广泛应用的 Modbus-RTU 设备进行通讯和数据交换,提供了一种可靠的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值