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

How to handle QTModbusTcpClient request in QTModbusTcpServer

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

I'm trying to create Modbus TCP server with QT libraries. I have problem, because I can't find a way, to create correct response for request from Modbus Client.

As I understand it, after starting the application, the server listens for incoming messages all the time, but I can't find in documentation correct function to handle message (and how I will get information about new request, it is a signal?)

I checked in the sample application QT ModbusServer, but did not find a solution.

There is my code:

#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();
}

My goal is to read message from client with new register value and change that value in my application.

As a client, I am using the Modbus TCP sample application from QT.

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

You must set the server address with modbusDevice->setServerAddress(1) before calling connectDevice()
The parameter is the server instance. You can have at most 255 instances per IP address

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

Then you must connect to QModbusServer::dataWritten, which is emitted by the server when the client modifies an object in the tables.
Something like

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