我正在使用Qt5和QModbusTcpClient类编写一个Modbus客户端程序。在这里,我使用的代码打开一个连接并读取一些内容:
QModbusClient *_modbus;
bool ModbusMaster::open(QString host, int port)
{
// Disconnect and delete any existing instance
if (_modbus)
{
_modbus->disconnectDevice();
delete _modbus;
}
// Create and open the new connection
_modbus = new QModbusTcpClient(this);
_modbus->setConnectionParameter(QModbusDevice::NetworkPortParameter, port);
_modbus->setConnectionParameter(QModbusDevice::NetworkAddressParameter, host);
_modbus->setTimeout(250);
_modbus->setNumberOfRetries(1);
return _modbus->connectDevice();
}
bool ModbusMaster::read(QModbusDataUnit::RegisterType type, int startAddress, quint16 count)
{
if (!_modbus) return false;
if (_modbus->state() != QModbusDevice::ConnectedState) return false;
QModbusDataUnit req(type, startAddress, count);
if (auto *reply = _modbus->sendReadRequest(req, _id))
{
if (!reply->isFinished()) connect(reply, &QModbusReply::finished, this, &ModbusMaster::readReady);
else delete reply;
return true;
}
return false;
}
void ModbusMaster::readReady()
{
auto reply = qobject_cast<QModbusReply *>(sender());
if (!reply) return;
reply->deleteLater();
if (reply->error() == QModbusDevice::NoError)
{
// do something
}
else if (reply->error() == QModbusDevice::ProtocolError)
{
qDebug() << QString("Read response error: %1 (Mobus exception: 0x%2)").
arg(reply->errorString()).
arg(reply->rawResult().exceptionCode(), -1, 16);
} else {
qDebug() << QString("Read response error: %1 (code: 0x%2)").
arg(reply->errorString()).
arg(reply->error(), -1, 16);
}
}有时,当我从远程设备读取某些内容时,设备会返回异常0x5。阅读Modbus官方文件,在第48页我读到:
与编程命令结合使用。服务器已经接受并正在处理请求,但这需要很长时间才能完成。返回此响应以防止客户端发生超时错误。客户端可以下一次发出Program消息,以确定处理是否完成。
大胆是我的
我找不到这个"Poll程序完整消息“的描述,似乎我必须使用它来处理0x5异常。
我找错了吗?还有其他方法来处理这个异常吗?
发布于 2018-11-22 12:44:57
这取决于您正在使用的设备的类型。您只需遵循逻辑,在设备手册中描述了这个特殊的例外情况。
一般来说,没有特别的“程序完成”事件。这意味着,它是为0x5编写的--“与编程命令结合使用”。因此,您只需从设备中轮询(读取)一些标志,这意味着设备中导致此异常的内部进程已经完成。
举个例子,我在继电保护装置上遇到了这样的例外,它是在写扰动记录的过程中发出的。我只需要在一段时间内检查一下记录就绪情况。
https://stackoverflow.com/questions/53120597
复制相似问题