当我使用 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表示的。
我想知道这个问题是什么原因造成的以及如何解决。
根据评论,OP 试图发送包含 1024 字节的数据包。
Modbus 规范规定了每个数据包的格式(但使用术语 PDU;协议数据单元)并指出:
MODBUS PDU 的大小受到从第一个继承的大小约束的限制 串行线路网络上的 MODBUS 实施(最大 RS485 ADU = 256 字节)。因此减小数据包大小可能会有所帮助。 验证尺寸:...
TCP MODBUS ADU = 253 字节 + MBAP(7 字节)= 260 字节
因此,发送前执行的唯一检查是有效性检查,请参阅 QModbusPdu::isValid。点击链接:
如果消息代码在十进制 1 到 255 范围内并且 PDU 的复合大小(功能代码 + 数据)不超过 253 字节,则 PDU 被视为有效。