QModbusRequest使用问题

问题描述 投票:0回答:1

当我使用 QModbusRequest 发送 mobus 数据时,我得到了一个奇怪的外观。

    if (file.open(QIODevice::ReadOnly))
    {
        int address = 0;
        while (!file.atEnd()) {
            QByteArray data = file.read(1024);
            if (data.length() > 0) {
                QByteArray combinedData;
                combinedData.append(static_cast<char>((address >> 8) & 0xFF));
                combinedData.append(static_cast<char>(address & 0xFF));
                combinedData.append(static_cast<char>((data.length() >> 8) & 0xFF));
                combinedData.append(static_cast<char>(data.length() & 0xFF));
                combinedData.append(data);
                if (data.length() < 1024) {
                    combinedData.append(QByteArray(1024 - data.length(), '\xFF'));
                }
                SelfDataTransmission(combinedData);//*************
                address += data.length();
            }
        }
        file.close();
    }

我想尝试打开一个.bin文件,读取其内容,然后发送内容。 所以我简单地创建了一个名为“SelfDataTransmission”的函数。

void tdialogperformance::SelfDataTransmission(QByteArray Data)
{
    QModbusReply *reply = nullptr;
    reply = PerForManceDevice->sendRawRequest(QModbusRequest(QModbusRequest::FunctionCode(0x0060), Data), Serveradds);
    if (reply)
        return;
}

但是我使用的时候总是报错。

Qt.modbus: (Client) Refused to send invalid request.
不能直接将数据代入
QModbusRequest (QModbusRequest :: Function Code (0x0060), Data)

但是当我提到例程时,它的作用是这样的。

void tdialogperformance::SelfDataTransmission(QString Data)
{
    QModbusReply *reply = nullptr;
    QByteArray pduData = QByteArray::fromHex(Data.toLatin1());
    reply = PerForManceDevice->sendRawRequest(QModbusRequest(QModbusRequest::FunctionCode(0x0060), pduData), Serveradds);
    if (reply)
        return;
}

并且这个函数是外部调用的

SelfDataTransmission("00402004084B01000000000000");
之后就可以正常发送内容了。我调试后发现QByteArray中的内容也是用Hex表示的。 我想知道这个问题是什么原因造成的以及如何解决。

c++ qt modbus
1个回答
0
投票

根据评论,OP 试图发送包含 1024 字节的数据包。

Modbus 规范规定了每个数据包的格式(但使用术语 PDU;协议数据单元)并指出:

MODBUS PDU 的大小受到从第一个继承的大小约束的限制 串行线路网络上的 MODBUS 实施(最大 RS485 ADU = 256 字节)。

...
TCP MODBUS ADU = 253 字节 + MBAP(7 字节)= 260 字节

因此减小数据包大小可能会有所帮助。

sendRawRequest

 验证尺寸:

因此,发送前执行的唯一检查是有效性检查,请参阅 QModbusPdu::isValid。

点击链接

isValid


如果消息代码在十进制 1 到 255 范围内并且 PDU 的复合大小(功能代码 + 数据)不超过 253 字节,则 PDU 被视为有效。

© www.soinside.com 2019 - 2024. All rights reserved.