Warm tip: This article is reproduced from serverfault.com, please click

c++-如何在 QTModbusTcpServer 中处理 QTModbusTcpClient 请求

(c++ - How to handle QTModbusTcpClient request in QTModbusTcpServer)

发布于 2021-02-04 20:20:42

我正在尝试使用 QT 库创建 Modbus TCP 服务器。我有问题,因为我找不到方法来为来自 Modbus 客户端的请求创建正确的响应。

据我了解,在启动应用程序后,服务器一直在侦听传入的消息,但我在文档中找不到正确的函数来处理消息(以及如何获取有关新请求的信息,这是一个信号?)

我检查了示例应用程序 QT ModbusServer,但没有找到解决方案。

有我的代码:

#include <QCoreApplication>
#include <QModbusTcpServer>
#include <QDebug>

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

    QModbusTcpServer* modbusDevice;
    modbusDevice = new QModbusTcpServer();

    modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "127.0.0.1");
    modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, 502);

    QModbusDataUnitMap reg;
    reg.insert(QModbusDataUnit::Coils, { QModbusDataUnit::Coils, 0, 10 });
    reg.insert(QModbusDataUnit::DiscreteInputs, { QModbusDataUnit::DiscreteInputs, 0, 10 });
    reg.insert(QModbusDataUnit::InputRegisters, { QModbusDataUnit::InputRegisters, 0, 10 });
    reg.insert(QModbusDataUnit::HoldingRegisters, { QModbusDataUnit::HoldingRegisters, 0, 10 });
    modbusDevice->setMap(reg);

    if(!modbusDevice->setMap(reg))
    {
        qDebug() << "setMap error";
    }

    modbusDevice->connectDevice();
    
    return a.exec();
}

我的目标是使用新的寄存器值从客户端读取消息并在我的应用程序中更改该值。

作为客户,我使用 QT 的 Modbus TCP 示例应用程序。

Questioner
niko95
Viewed
0
Jack Lilhammers 2021-02-05 06:55:27

modbusDevice->setServerAddress(1)调用前必须设置服务器地址,connectDevice()
参数为服务器实例。每个 IP 地址最多可以有 255 个实例

modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "127.0.0.1");
modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, 502);
modbusDevice->setServerAddress(1);

然后你必须连接到QModbusServer::dataWritten,当客户端修改表中的对象时,它由服务器发出。
就像是

QObject::connect(modbusDevice, &QModbusServer::dataWritten,
    [&] (QModbusDataUnit::RegisterType table, int address, int size)
    {
        qDebug() << "onDataWritten: table: " << table 
                 << " | " << "address: " << address 
                 << " | " << "size: " << size 
                 << endl;
    }
);