发送离散数据
标准设备 0xFF00
非标准设备 0x0001 / 0x0100
创建
QModbusClient *modbusDevice = new QModbusRtuSerialClient(this);
modbusDevice->setNumberOfRetries(1);//设置超时后只读取去一次
//设置ModBus
bool getData::configModBus(QString port)
{
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, port);
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600); //波特率:9600
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8); //数据位:8位
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop); //停止位:1位
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
return modbusDevice->connectDevice();
}
//--------------读取离散数据 功能码(2) modbus地址01
// 创建读取请求(离散输入)
int slaveAddress = 1; // 从站地址 0x01
int startAddress = 513; // 起始地址 0x0201 (513)
int numInputs = 16; // 读取数量 0x0008 (8)
QModbusDataUnit request(QModbusDataUnit::DiscreteInputs, startAddress, numInputs);
// 发送请求
if (QModbusReply *reply = modbusDevice->sendReadRequest(request, slaveAddress)) {
if (!reply->isFinished()) {
// 处理响应
connect(reply, &QModbusReply::finished, this, [this, reply]() {
QList<bool> DODataInitDO = getDOData();
bool state;
if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result();
// 打印读取结果
for (int i = 0; i < unit.valueCount(); ++i) {
state = unit.value(i) ? true : false;
qDebug()<<state ;
}
} else if (reply->error() == QModbusDevice::ProtocolError) {
qDebug() << "读取离散数据 Modbus异常码: 0x" << reply->rawResult().exceptionCode();
} else {
qDebug() << "读取离散数据 modbus地址01 错误:" << reply->errorString();
sendDigitalDOTimer->stop();
}
reply->deleteLater();
});
} else {
delete reply; // 立即删除
}
} else {
qDebug() << "发送请求失败 modbus地址01):" << modbusDevice->errorString();
}
}
//----------------------------------------------------------
//--------------发送离散数据 功能码(5) modbus地址02
int slaveAddress = 2; // 从机地址
uint coilAddress = 256 + index.toInt(); // 线圈地址(对应设备地址 00005)
QModbusRequest request(QModbusRequest::WriteSingleCoil);
QByteArray data;
QDataStream stream(&data, QIODevice::WriteOnly);
stream.setByteOrder(QDataStream::BigEndian);
quint16 modbusAddress = coilAddress;
// 尝试不同值格式
quint16 value;
value = valuex.toInt() ? 0x0001 : 0x0000; // 某些设备变体
stream << modbusAddress << value;
request.setData(data);
// 发送请求
QModbusReply *reply = modbusDevice->sendRawRequest(request, slaveAddress);
// 处理响应
connect(reply, &QModbusReply::finished, this, [this, reply]() {
if (reply->error() == QModbusDevice::NoError) {
qDebug() << " Write successful!";
} else {
auto exceptionCode = reply->rawResult().exceptionCode();
if(exceptionCode != 255) {
qDebug() << "Modbus Exception:" << exceptionCode;
}else {
setDoComState(1);
QTimer::singleShot(100,this,[=] {
setDoComState(0);
}); //收到数据闪一下
}
}
reply->deleteLater();
});
//----------------------------------------------------------
//--------------接收数据 功能码(3) modbus地址03
// 创建读取请求
const int slaveAddress = 3; // 从站地址
const int startAddress = 768 + index; // 起始地址 (0x0301)
const int numRegisters = 1; // 读取数量
QModbusDataUnit request(QModbusDataUnit::HoldingRegisters, startAddress, numRegisters);
// 发送请求
if (QModbusReply *reply = modbusDevice->sendReadRequest(request, slaveAddress)) {
if (!reply->isFinished()) {
connect(reply, &QModbusReply::finished, this, [=]() {
QList<QString> AODataTemp = getAOData();
QString valueStr;
if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result();
// qDebug()<<("AO 数据 读取成功!");
valueStr = QString("%1").arg(unit.value(0));
qDebug()<<valueStr;
} else if (reply->error() == QModbusDevice::ProtocolError) {
quint8 exCode = reply->rawResult().exceptionCode();
qDebug()<<(QString("Modbus异常: 0x%1").arg(exCode, 2, 16, QLatin1Char('0')));
// 显示异常信息
switch (exCode) {
case 0x01: qDebug()<<("异常: 不支持的功能码"); break;
case 0x02: qDebug()<<("异常: 无效的寄存器地址"); break;
case 0x03: qDebug()<<("异常: 无效的数据值"); break;
case 0x04: qDebug()<<("异常: 从站设备故障"); break;
default: qDebug()<<("未知异常");
}
} else {
qDebug()<<("读取错误: " + reply->errorString());
}
reply->deleteLater();
});
} else {
delete reply;
}
} else {
qDebug()<<("发送请求失败: " + modbusDevice->errorString());
}
//----------------------------------------------------------
//--------------发送数据 功能码(6) modbus地址03
int slaveAddress = 4;
int registerAddress = 768 + index.toInt();
int valuec = valuex.toInt();
quint16 sendData = 0;
// 创建写入请求
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters , registerAddress, 1);
writeUnit.setValue(0,sendData);
// 发送请求
if (QModbusReply *reply = modbusDevice->sendWriteRequest(writeUnit, slaveAddress)) {
if (!reply->isFinished()) {
connect(reply, &QModbusReply::finished, this, [=]() {
if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result();
qDebug()<<("写入成功!");
// 显示写入的寄存器信息
QString msg = QString("写入寄存器 %1 值: %2 (0x%3)")
.arg(unit.startAddress())
.arg(unit.value(0))
.arg(unit.value(0), 4, 16, QLatin1Char('0'));
qDebug()<<(msg);
} else if (reply->error() == QModbusDevice::ProtocolError) {
quint8 exCode = reply->rawResult().exceptionCode();
qDebug()<<(QString("Modbus异常: 0x%1").arg(exCode, 2, 16, QLatin1Char('0')));
// 显示异常信息
switch (exCode) {
case 0x01: qDebug()<<("异常: 不支持的功能码"); break;
case 0x02: qDebug()<<("异常: 无效的寄存器地址"); break;
case 0x03: qDebug()<<("异常: 无效的数据值"); break;
case 0x04: qDebug()<<("异常: 从站设备故障"); break;
default: qDebug()<<("未知异常");
}
} else {
qDebug()<<("写入错误: " + reply->errorString());
}
reply->deleteLater();
});
} else {
delete reply;
}
} else {
qDebug()<<("发送请求失败: " + modbusDevice->errorString());
}
//----------------------------------------------------------