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();
}
相关推荐
TDengine (老段)16 小时前
TDengine 一条 SQL 从客户端到执行完成的全链路
大数据·数据库·sql·物联网·时序数据库·tdengine·涛思数据
csg110718 小时前
MSP430F149驱动T8650北斗模块实现短报文通信实战
单片机·嵌入式硬件·物联网·自动化
会周易的程序员18 小时前
aiDgeScanner:工业设备扫描与管理的一体化利器——深度解析上位机与扫描端的无缝协作
c++·物联网·typescript·electron·vue·iot·aiot
AAAAA924019 小时前
电气火灾监控行业全景解析:从被动响应到主动智防
物联网·智慧城市·智慧消防
砍材农夫21 小时前
物联网 基于netty构建mqtt服务协议支持
java·物联网·struts·netty
TDengine (老段)21 小时前
TDengine 数据库创建与参数详解
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
高翔·权衡之境1 天前
主题7:缓存与队列——速度不匹配的通用解
开发语言·人工智能·物联网·缓存·信息与通信·信号处理
兴通物联科技1 天前
工业手持终端 PDA 键盘化设计与现场作业效率优化 —— 以 XT8001D 为例
大数据·物联网·计算机视觉·计算机外设·硬件架构
XTIOT6661 天前
工业数据采集设备选型 —— 实体键盘 PDA 的技术优势与场景适配(基于 XT8001D 实践)摘要
大数据·嵌入式硬件·物联网·计算机外设
三佛科技-134163842121 天前
LED化妆镜方案开发, LED化妆镜MCU主控芯片如何选择?(FT60F011、FT60F021、FT61FC4F、FT62FC33、FT32F103)
单片机·嵌入式硬件·物联网·智能家居·pcb工艺