|
|
@@ -28,6 +28,32 @@ QModbusDataUnit::RegisterType registerType(RegisterArea area) |
|
|
? QModbusDataUnit::Coils : QModbusDataUnit::HoldingRegisters; |
|
|
? QModbusDataUnit::Coils : QModbusDataUnit::HoldingRegisters; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QString modbusErrorText(QModbusDevice::Error error) |
|
|
|
|
|
{ |
|
|
|
|
|
switch (error) |
|
|
|
|
|
{ |
|
|
|
|
|
case QModbusDevice::ReadError: |
|
|
|
|
|
return QStringLiteral("读取 PLC 数据失败"); |
|
|
|
|
|
case QModbusDevice::WriteError: |
|
|
|
|
|
return QStringLiteral("写入 PLC 数据失败"); |
|
|
|
|
|
case QModbusDevice::ConnectionError: |
|
|
|
|
|
return QStringLiteral("PLC 串口连接失败"); |
|
|
|
|
|
case QModbusDevice::ConfigurationError: |
|
|
|
|
|
return QStringLiteral("PLC 串口参数配置错误"); |
|
|
|
|
|
case QModbusDevice::TimeoutError: |
|
|
|
|
|
return QStringLiteral("PLC 通信超时,请检查站号、串口参数和 RS-485 接线"); |
|
|
|
|
|
case QModbusDevice::ProtocolError: |
|
|
|
|
|
return QStringLiteral("PLC 返回了无效或异常的 Modbus 响应"); |
|
|
|
|
|
case QModbusDevice::ReplyAbortedError: |
|
|
|
|
|
return QStringLiteral("PLC 通信请求已取消"); |
|
|
|
|
|
case QModbusDevice::UnknownError: |
|
|
|
|
|
return QStringLiteral("PLC 通信发生未知错误"); |
|
|
|
|
|
case QModbusDevice::NoError: |
|
|
|
|
|
default: |
|
|
|
|
|
return QStringLiteral("PLC 通信失败"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} // namespace |
|
|
} // namespace |
|
|
|
|
|
|
|
|
PlcCommunicationService::PlcCommunicationService( |
|
|
PlcCommunicationService::PlcCommunicationService( |
|
|
@@ -73,7 +99,7 @@ PlcCommunicationService::PlcCommunicationService( |
|
|
{ |
|
|
{ |
|
|
if (error != QModbusDevice::NoError) |
|
|
if (error != QModbusDevice::NoError) |
|
|
{ |
|
|
{ |
|
|
setError(master_->errorString()); |
|
|
|
|
|
|
|
|
setError(modbusErrorText(error)); |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
} |
|
|
} |
|
|
@@ -86,13 +112,14 @@ PlcCommunicationResult PlcCommunicationService::connectDevice( |
|
|
if (QString::fromStdString(configuration.portName).trimmed().isEmpty() |
|
|
if (QString::fromStdString(configuration.portName).trimmed().isEmpty() |
|
|
|| configuration.serverAddress < 1 || configuration.serverAddress > 247) |
|
|
|| configuration.serverAddress < 1 || configuration.serverAddress > 247) |
|
|
{ |
|
|
{ |
|
|
return {false, "serial port and Modbus server address are required"}; |
|
|
|
|
|
|
|
|
return {false, "必须填写串口端口,并将 PLC 站号设置为 1~247"}; |
|
|
} |
|
|
} |
|
|
if (master_->state() != QModbusDevice::UnconnectedState) |
|
|
if (master_->state() != QModbusDevice::UnconnectedState) |
|
|
{ |
|
|
{ |
|
|
return {false, "PLC connection is already active"}; |
|
|
|
|
|
|
|
|
return {false, "PLC 连接已经启动,请先断开当前连接"}; |
|
|
} |
|
|
} |
|
|
configuration_ = configuration; |
|
|
configuration_ = configuration; |
|
|
|
|
|
last_error_.clear(); |
|
|
master_->setConnectionParameter( |
|
|
master_->setConnectionParameter( |
|
|
QModbusDevice::SerialPortNameParameter, |
|
|
QModbusDevice::SerialPortNameParameter, |
|
|
QString::fromStdString(configuration.portName)); |
|
|
QString::fromStdString(configuration.portName)); |
|
|
@@ -117,12 +144,12 @@ PlcCommunicationResult PlcCommunicationService::connectDevice( |
|
|
initial_read_changed_callback_(false); |
|
|
initial_read_changed_callback_(false); |
|
|
} |
|
|
} |
|
|
rebuildPollBlocks(); |
|
|
rebuildPollBlocks(); |
|
|
|
|
|
setState(PlcConnectionState::Connecting); |
|
|
if (!master_->connectDevice()) |
|
|
if (!master_->connectDevice()) |
|
|
{ |
|
|
{ |
|
|
setError(master_->errorString()); |
|
|
|
|
|
|
|
|
setError(modbusErrorText(master_->error())); |
|
|
return {false, last_error_}; |
|
|
return {false, last_error_}; |
|
|
} |
|
|
} |
|
|
setState(PlcConnectionState::Connecting); |
|
|
|
|
|
return {true, {}}; |
|
|
return {true, {}}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@@ -240,7 +267,7 @@ void PlcCommunicationService::pollNextBlock() |
|
|
QModbusReply *reply = master_->sendReadRequest(request, configuration_.serverAddress); |
|
|
QModbusReply *reply = master_->sendReadRequest(request, configuration_.serverAddress); |
|
|
if (reply == nullptr) |
|
|
if (reply == nullptr) |
|
|
{ |
|
|
{ |
|
|
setError(master_->errorString()); |
|
|
|
|
|
|
|
|
setError(modbusErrorText(master_->error())); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
pending_reply_ = reply; |
|
|
pending_reply_ = reply; |
|
|
@@ -284,7 +311,7 @@ void PlcCommunicationService::handleReadFinished(QModbusReply *reply, PollBlock |
|
|
} |
|
|
} |
|
|
if (reply->error() != QModbusDevice::NoError) |
|
|
if (reply->error() != QModbusDevice::NoError) |
|
|
{ |
|
|
{ |
|
|
setError(reply->errorString()); |
|
|
|
|
|
|
|
|
setError(modbusErrorText(reply->error())); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
const QModbusDataUnit result = reply->result(); |
|
|
const QModbusDataUnit result = reply->result(); |
|
|
@@ -320,7 +347,7 @@ RegisterWriteResult PlcCommunicationService::sendBitWrite( |
|
|
QModbusReply *reply = master_->sendWriteRequest(unit, configuration_.serverAddress); |
|
|
QModbusReply *reply = master_->sendWriteRequest(unit, configuration_.serverAddress); |
|
|
if (reply == nullptr) |
|
|
if (reply == nullptr) |
|
|
{ |
|
|
{ |
|
|
setError(master_->errorString()); |
|
|
|
|
|
|
|
|
setError(modbusErrorText(master_->error())); |
|
|
return {false, RegisterError::WriteRejected}; |
|
|
return {false, RegisterError::WriteRejected}; |
|
|
} |
|
|
} |
|
|
connect(reply, &QModbusReply::finished, |
|
|
connect(reply, &QModbusReply::finished, |
|
|
@@ -329,7 +356,7 @@ RegisterWriteResult PlcCommunicationService::sendBitWrite( |
|
|
{ |
|
|
{ |
|
|
if (reply->error() != QModbusDevice::NoError) |
|
|
if (reply->error() != QModbusDevice::NoError) |
|
|
{ |
|
|
{ |
|
|
setError(reply->errorString()); |
|
|
|
|
|
|
|
|
setError(modbusErrorText(reply->error())); |
|
|
} |
|
|
} |
|
|
reply->deleteLater(); |
|
|
reply->deleteLater(); |
|
|
}); |
|
|
}); |
|
|
@@ -348,7 +375,7 @@ RegisterWriteResult PlcCommunicationService::sendWordWrite( |
|
|
QModbusReply *reply = master_->sendWriteRequest(unit, configuration_.serverAddress); |
|
|
QModbusReply *reply = master_->sendWriteRequest(unit, configuration_.serverAddress); |
|
|
if (reply == nullptr) |
|
|
if (reply == nullptr) |
|
|
{ |
|
|
{ |
|
|
setError(master_->errorString()); |
|
|
|
|
|
|
|
|
setError(modbusErrorText(master_->error())); |
|
|
return {false, RegisterError::WriteRejected}; |
|
|
return {false, RegisterError::WriteRejected}; |
|
|
} |
|
|
} |
|
|
connect(reply, &QModbusReply::finished, |
|
|
connect(reply, &QModbusReply::finished, |
|
|
@@ -357,7 +384,7 @@ RegisterWriteResult PlcCommunicationService::sendWordWrite( |
|
|
{ |
|
|
{ |
|
|
if (reply->error() != QModbusDevice::NoError) |
|
|
if (reply->error() != QModbusDevice::NoError) |
|
|
{ |
|
|
{ |
|
|
setError(reply->errorString()); |
|
|
|
|
|
|
|
|
setError(modbusErrorText(reply->error())); |
|
|
} |
|
|
} |
|
|
reply->deleteLater(); |
|
|
reply->deleteLater(); |
|
|
}); |
|
|
}); |
|
|
|