QTModbusTcpServer中如何处理QTModbusTcpClient请求

How to handle QTModbusTcpClient request in QTModbusTcpServer

我正在尝试使用 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 示例应用程序。

在调用connectDevice()
之前,您必须使用modbusDevice->setServerAddress(1)设置服务器地址 参数是服务器实例。每个 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;
    }
);