Qt工业物联网

Qt中的Modbus通信指南:QModbusClient与QModbusServer类解析 (qq.com)

cpp 复制代码
#include <QCoreApplication>
#include <QModbusTcpServer>
#include <QUrl>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QModbusTcpServer modbusServer;
    // 初始化数据模型,这里我们只设置了一个保持寄存器
    QModbusDataUnitMap dataModel;
    dataModel.insert(QModbusDataUnit::HoldingRegisters, { QModbusDataUnit::HoldingRegisters, 0, 10 });
    modbusServer.setDataMap(dataModel);

    const QUrl url = QUrl::fromUserInput("127.0.0.1:502");
    modbusServer.setConnectionParameter(QModbusDevice::NetworkPortParameter, url.port());
    modbusServer.setConnectionParameter(QModbusDevice::NetworkAddressParameter, url.host());

    if (!modbusServer.listen()) {
        qFatal("Unable to start the Modbus server: %s", qPrintable(modbusServer.errorString()));
    }

    return app.exec();
}
cpp 复制代码
#include <QCoreApplication>
#include <QModbusTcpClient>
#include <QModbusReply>

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QModbusTcpClient modbusClient;
    modbusClient.setConnectionParameter(QModbusDevice::NetworkPortParameter, 502);
    modbusClient.setConnectionParameter(QModbusDevice::NetworkAddressParameter, "127.0.0.1");

    if (!modbusClient.connectDevice()) {
        qFatal("Unable to connect to the Modbus server.");
    }

    // 构建一个写请求
    QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 0, 1);
    writeUnit.setValue(0, 42); // 写入值 42 到地址 0

    if (auto *reply = modbusClient.sendWriteRequest(writeUnit, 1)) { // 1 是服务器地址
        if (!reply->isFinished()) {
            QObject::connect(reply, &QModbusReply::finished, [&]() {
                if (reply->error() == QModbusDevice::NoError) {
                    qDebug("Write success.");

                    // 构建一个读请求
                    QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 1);
                    if (auto *readReply = modbusClient.sendReadRequest(readUnit, 1)) {
                        if (!readReply->isFinished()) {
                            QObject::connect(readReply, &QModbusReply::finished, [readReply]() {
                                if (readReply->error() == QModbusDevice::NoError) {
                                    const QModbusDataUnit unit = readReply->result();
                                    qDebug("Read success: %d", unit.value(0));
                                } else {
                                    qWarning("Read error: %s", qPrintable(readReply->errorString()));
                                }
                                readReply->deleteLater();
                            });
                        } else {
                            delete readReply; // broadcast reply returns immediately
                        }
                    }
                } else {
                    qWarning("Write error: %s", qPrintable(reply->errorString()));
                }
                reply->deleteLater();
            });
        } else {
            delete reply; // broadcast reply returns immediately
        }
    }

    return app.exec();
}
相关推荐
jkyy20141 小时前
汽车×大健康融合:智慧健康监测座舱成车企新赛道核心布局
大数据·人工智能·物联网·汽车·健康医疗
zy135380675732 小时前
12V输入5V/2A输出升降压芯片AH4002
科技·单片机·物联网·fpga开发·硬件工程·智能电视
绿蕉2 小时前
蜂窝物联网:医疗设备的“全球生命线“,让健康监护无处不在
物联网
华普微HOPERF2 小时前
数字隔离器,如何拉满工业网关的电气安全性能与抗干扰能力?
物联网·安全·数字隔离器
创思通信3 小时前
STM32L151RCT6 BC20 采集温湿度DHT11 采集GPS定位 和ADC发送到最新版本ONENET物联网开放平台
stm32·嵌入式硬件·物联网
MINGNUO明诺3 小时前
科技赋能洁净生活 北京龙威物业引入智能清洁设备升级服务品质
物联网
兆龙电子单片机设计4 小时前
【STM32项目开源】STM32单片机充电桩安全监测系统
stm32·单片机·物联网·开源·毕业设计
TDengine (老段)19 小时前
TDengine Python 连接器进阶指南
大数据·数据库·python·物联网·时序数据库·tdengine·涛思数据
没有故事的Zhang同学1 天前
03-📝物联网组网 | 蓝牙通信: 经典蓝牙与低功耗Ble通信、iBeacon技术
物联网
御控工业物联网1 天前
御控远程监控智慧运维系统
运维·物联网·边缘计算·数据采集·远程监控·mqtt协议·工业智能网关