QT MODBUSRTU 一主多从 示例
时间: 2023-10-30 09:06:15 浏览: 53
以下是一个QT MODBUSRTU 一主多从的示例,其中包含一个主站和两个从站的通信。
主站代码:
```c++
#include <QCoreApplication>
#include <QModbusRtuSerialMaster>
#include <QSerialPort>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSerialPort serialPort;
serialPort.setPortName("COM1");
serialPort.setBaudRate(QSerialPort::Baud9600);
serialPort.setDataBits(QSerialPort::Data8);
serialPort.setStopBits(QSerialPort::OneStop);
serialPort.setParity(QSerialPort::NoParity);
if (!serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "Failed to open serial port:" << serialPort.errorString();
return 1;
}
QModbusRtuSerialMaster modbusMaster(&serialPort);
modbusMaster.setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM1");
modbusMaster.setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
modbusMaster.setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600);
modbusMaster.setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
modbusMaster.setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
modbusMaster.setTimeout(1000);
modbusMaster.setNumberOfRetries(3);
if (!modbusMaster.connectDevice()) {
qDebug() << "Failed to connect to the Modbus device:" << modbusMaster.errorString();
return 1;
}
quint16 slave1Address = 1;
quint16 slave2Address = 2;
QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 10);
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 0, 10);
if (auto *reply = modbusMaster.sendReadRequest(readUnit, slave1Address)) {
if (!reply->isFinished()) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 5000);
}
if (reply->error() == QModbusDevice::NoError) {
readUnit = reply->result();
for (uint i = 0; i < readUnit.valueCount(); ++i) {
qDebug() << "Slave 1 register" << i << "=" << readUnit.value(i);
}
} else {
qDebug() << "Modbus error:" << reply->errorString();
}
delete reply;
}
writeUnit.setValue(0, 100);
writeUnit.setValue(1, 200);
writeUnit.setValue(2, 300);
if (auto *reply = modbusMaster.sendWriteRequest(writeUnit, slave2Address)) {
if (!reply->isFinished()) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 5000);
}
if (reply->error() == QModbusDevice::NoError) {
qDebug() << "Write to slave 2 successful";
} else {
qDebug() << "Modbus error:" << reply->errorString();
}
delete reply;
}
modbusMaster.disconnectDevice();
serialPort.close();
return 0;
}
```
从站1代码:
```c++
#include <QCoreApplication>
#include <QModbusRtuSerialSlave>
#include <QSerialPort>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSerialPort serialPort;
serialPort.setPortName("COM1");
serialPort.setBaudRate(QSerialPort::Baud9600);
serialPort.setDataBits(QSerialPort::Data8);
serialPort.setStopBits(QSerialPort::OneStop);
serialPort.setParity(QSerialPort::NoParity);
if (!serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "Failed to open serial port:" << serialPort.errorString();
return 1;
}
QModbusRtuSerialSlave modbusSlave(&serialPort);
modbusSlave.setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM1");
modbusSlave.setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
modbusSlave.setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600);
modbusSlave.setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
modbusSlave.setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
modbusSlave.setServerAddress(1);
modbusSlave.setTimeout(1000);
if (!modbusSlave.connectDevice()) {
qDebug() << "Failed to connect to the Modbus device:" << modbusSlave.errorString();
return 1;
}
modbusSlave.setData(QModbusDataUnit::HoldingRegisters, 0, QVector<quint16>{ 100, 200, 300 });
return a.exec();
}
```
从站2代码:
```c++
#include <QCoreApplication>
#include <QModbusRtuSerialSlave>
#include <QSerialPort>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSerialPort serialPort;
serialPort.setPortName("COM1");
serialPort.setBaudRate(QSerialPort::Baud9600);
serialPort.setDataBits(QSerialPort::Data8);
serialPort.setStopBits(QSerialPort::OneStop);
serialPort.setParity(QSerialPort::NoParity);
if (!serialPort.open(QIODevice::ReadWrite)) {
qDebug() << "Failed to open serial port:" << serialPort.errorString();
return 1;
}
QModbusRtuSerialSlave modbusSlave(&serialPort);
modbusSlave.setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM1");
modbusSlave.setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
modbusSlave.setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600);
modbusSlave.setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
modbusSlave.setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
modbusSlave.setServerAddress(2);
modbusSlave.setTimeout(1000);
if (!modbusSlave.connectDevice()) {
qDebug() << "Failed to connect to the Modbus device:" << modbusSlave.errorString();
return 1;
}
return a.exec();
}
```
在这个示例中,主站通过串口与从站1和从站2通信。主站首先从从站1读取保持寄存器中的前10个值,并打印到控制台。然后,主站将3个值写入从站2的保持寄存器中,并在写入成功后打印消息。从站1和从站2分别设置了自己的地址,并初始化了3个保持寄存器。