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.
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;
}
);