1

I would have to send Modbus request for specific data, my problem is that I have to use mobile communication, wifi, connect to a custom electronic card, which is right in Modbus RTU.

My working code connecting to the electronic board:

#include "connessione.h"
#include <QModbusTcpClient>
#include <QVariant>
#include <QModbusDataUnit>
#include <QDebug>

connessione::connessione(QObject *parent) : QObject(parent)
{
    qDebug() << "here debug " << "ok";

    clientX = new QModbusTcpClient();
    clientX->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "192.168.222.1");
    clientX->setConnectionParameter(QModbusDevice::NetworkPortParameter, 5555);

    if (clientX->connectDevice())
    {
        qDebug()  << "connected: " << clientX->state();
    }
    else
    {
        qDebug()  << "ERRORE" << clientX->errorString();
    }
}

void connessione::clickButton(){

    QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 1); // just read input register 40006
    //qDebug() << "readUnit" << readUnit.RegisterType;
    qDebug() << "readUnit" << clientX->state();


    if (auto *reply = clientX->sendReadRequest(readUnit, 255)) // client id 255
    {
        if (!reply->isFinished())
        {
            // connect the finished signal of the request to your read slot
            qDebug() << "connected" << reply->errorString();
            connect(reply, &QModbusReply::finished, this, &connessione::readReady);
        }
        else
        {
            qDebug() << "Errore" << reply->errorString();
            delete reply; // broadcast replies return immediately
        }
    }
    else
    {
        qDebug() << "Errore" << reply->errorString();
        // request error
    }
}

void connessione::readReady()
{
    QModbusReply *reply = qobject_cast<QModbusReply *>(sender());
    if (!reply)
        return;

    if (reply->error() == QModbusDevice::NoError)
    {
        const QModbusDataUnit unit = reply->result();
        int startAddress = unit.startAddress(); // the start address,
        int value = unit.value(0); // value of the start address + 0

        qDebug() << "NESSUN ERRORE" << reply->errorString();
    }
    else
    {
        qDebug() << "Errore readReady" << reply->errorString();
        // reply error
    }

    reply->deleteLater(); // delete the reply
}

log string TCP sent:

D/libmodbusMobile.so( 8042): (null):0 ((null)): qt.modbus: (TCP client) Sent TCP PDU: 0x0300000001 with tId: 2

this is right: 0x0300000001

But unfortunately, my electronic card, the integrated firmware I can not modify, is right with Modbus RTU, so I should change 0x0300000001 to 0x010300000001C1C2 where C1 and C2 are the checksums.

I believe that QModbusDataUnit generate buffer to send. So how to change it? Exist manual solution where I build the buffer?

how to change it and create custom send buffer like the example?

Thanks

Shihe Zhang
  • 2,641
  • 5
  • 36
  • 57
Mr. Developer
  • 3,295
  • 7
  • 43
  • 110
  • How do you make the client connect to your electronic card?I think you need a converter or Modbus gateway to transfer WIFI to the serial port (Modbus RTU usually go through it). – Shihe Zhang Feb 28 '18 at 08:05

0 Answers0