@@ -0,0 +1,54 @@ | |||||
#include "communicationhistory.h" | |||||
bool SaveDate(QWidget *parent, QTextEdit *edit) | |||||
{ | |||||
QString fileName = QFileDialog::getSaveFileName( | |||||
parent, | |||||
"保存文本", | |||||
QDir::homePath() + "/note.txt", | |||||
"文本文件 (*.txt);;所有文件 (*)"); | |||||
if (fileName.isEmpty()) | |||||
return false; | |||||
QFile file(fileName); | |||||
if (!file.open(QIODevice::Append | QIODevice::Text)) | |||||
{ | |||||
QMessageBox::warning(parent, "错误", "无法打开文件"); | |||||
return false; | |||||
} | |||||
if (file.size() > 0) | |||||
file.write("\n"); | |||||
QTextStream out(&file); | |||||
out.setCodec("UTF-8"); | |||||
out << edit->toPlainText(); | |||||
file.close(); | |||||
return true; | |||||
} | |||||
bool ReadDate(QWidget *parent, QTextEdit *edit) | |||||
{ | |||||
QString fileName = QFileDialog::getOpenFileName( | |||||
parent, | |||||
"打开文本", | |||||
QDir::homePath(), | |||||
"文本文件 (*.txt);;所有文件 (*)"); | |||||
if (fileName.isEmpty()) | |||||
return false; | |||||
QFile file(fileName); | |||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) | |||||
{ | |||||
QMessageBox::warning(parent, "错误", "无法读取文件"); | |||||
return false; | |||||
} | |||||
QTextStream in(&file); | |||||
in.setCodec("UTF-8"); | |||||
edit->setPlainText(in.readAll()); | |||||
file.close(); | |||||
return true; | |||||
} |
@@ -0,0 +1,17 @@ | |||||
#ifndef COMMUNICATIONHISTORY_H | |||||
#define COMMUNICATIONHISTORY_H | |||||
#pragma once | |||||
#include <QString> | |||||
#include <QFileDialog> | |||||
#include <QMessageBox> | |||||
#include <QFile> | |||||
#include <QTextStream> | |||||
#include <QDir> | |||||
#include <QTextEdit> | |||||
bool SaveDate(QWidget *parent, QTextEdit *edit); | |||||
bool ReadDate(QWidget *parent, QTextEdit *edit); | |||||
#endif // COMMUNICATIONHISTORY_H |
@@ -1,9 +1,10 @@ | |||||
#ifndef CRC_H | #ifndef CRC_H | ||||
#define CRC_H | #define CRC_H | ||||
#endif // CRC_H | |||||
#include <QByteArray> | #include <QByteArray> | ||||
#include <QtGlobal> | #include <QtGlobal> | ||||
quint16 CalculateCrc(const QByteArray &data); | quint16 CalculateCrc(const QByteArray &data); | ||||
bool CrcCheck(const QByteArray &data); | bool CrcCheck(const QByteArray &data); | ||||
#endif // CRC_H |
@@ -16,10 +16,12 @@ TEMPLATE = app | |||||
SOURCES += main.cpp\ | SOURCES += main.cpp\ | ||||
widget.cpp \ | widget.cpp \ | ||||
crc.cpp \ | crc.cpp \ | ||||
mymodbus.cpp | |||||
mymodbus.cpp \ | |||||
communicationhistory.cpp | |||||
HEADERS += widget.h \ | HEADERS += widget.h \ | ||||
crc.h \ | crc.h \ | ||||
mymodbus.h | |||||
mymodbus.h \ | |||||
communicationhistory.h | |||||
FORMS += widget.ui | FORMS += widget.ui |
@@ -1,6 +1,6 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||
<!DOCTYPE QtCreatorProject> | <!DOCTYPE QtCreatorProject> | ||||
<!-- Written by QtCreator 4.0.3, 2025-07-26T17:06:45. --> | |||||
<!-- Written by QtCreator 4.0.3, 2025-07-28T10:59:33. --> | |||||
<qtcreator> | <qtcreator> | ||||
<data> | <data> | ||||
<variable>EnvironmentId</variable> | <variable>EnvironmentId</variable> | ||||
@@ -7,25 +7,25 @@ MyModbus::MyModbus() | |||||
void MyModbus::Set(quint16 stationAddress, quint16 functionCode, quint16 startAdress, quint16 length) | void MyModbus::Set(quint16 stationAddress, quint16 functionCode, quint16 startAdress, quint16 length) | ||||
{ | { | ||||
this->stationAddress = stationAddress; | |||||
this->functionCode = functionCode; | |||||
this->startAdress = startAdress; | |||||
this->length = length; | |||||
this->stationAddress_ = stationAddress; | |||||
this->functionCode_ = functionCode; | |||||
this->startAdress_ = startAdress; | |||||
this->length_ = length; | |||||
} | } | ||||
void MyModbus::ReadColiAndReg() | |||||
void MyModbus::ReadCoilAndReg() | |||||
{ | { | ||||
sendCommand.clear(); | |||||
sendCommand.append(stationAddress%256); | |||||
sendCommand.append(functionCode%256); | |||||
sendCommand.append(startAdress/256); | |||||
sendCommand.append(startAdress%256); | |||||
sendCommand.append(length/256); | |||||
sendCommand.append(length%256); | |||||
quint16 temp = CalculateCrc(sendCommand); | |||||
sendCommand.append(temp%256); | |||||
sendCommand.append(temp/256); | |||||
sendCommand_.clear(); | |||||
sendCommand_.append(stationAddress_%256); | |||||
sendCommand_.append(functionCode_%256); | |||||
sendCommand_.append(startAdress_/256); | |||||
sendCommand_.append(startAdress_%256); | |||||
sendCommand_.append(length_/256); | |||||
sendCommand_.append(length_%256); | |||||
quint16 temp = CalculateCrc(sendCommand_); | |||||
sendCommand_.append(temp%256); | |||||
sendCommand_.append(temp/256); | |||||
} | } | ||||
void MyModbus::WriteCoil(QVector<bool> &coils) | void MyModbus::WriteCoil(QVector<bool> &coils) | ||||
@@ -33,14 +33,14 @@ void MyModbus::WriteCoil(QVector<bool> &coils) | |||||
quint16 coilCount = coils.size(); | quint16 coilCount = coils.size(); | ||||
int byteCount = (coilCount + 7) / 8; | int byteCount = (coilCount + 7) / 8; | ||||
sendCommand.clear(); | |||||
sendCommand.append(stationAddress%256); | |||||
sendCommand.append(0x0f); | |||||
sendCommand.append(startAdress/256); | |||||
sendCommand.append(startAdress%256); | |||||
sendCommand.append(length/256); | |||||
sendCommand.append(length%256); | |||||
sendCommand.append(byteCount); | |||||
sendCommand_.clear(); | |||||
sendCommand_.append(stationAddress_%256); | |||||
sendCommand_.append(0x0f); | |||||
sendCommand_.append(startAdress_/256); | |||||
sendCommand_.append(startAdress_%256); | |||||
sendCommand_.append(length_/256); | |||||
sendCommand_.append(length_%256); | |||||
sendCommand_.append(byteCount); | |||||
for (int i = 0; i < byteCount; ++i) | for (int i = 0; i < byteCount; ++i) | ||||
{ | { | ||||
quint8 byte = 0; | quint8 byte = 0; | ||||
@@ -50,55 +50,55 @@ void MyModbus::WriteCoil(QVector<bool> &coils) | |||||
if (bitIndex < coils.size() && coils[bitIndex]) | if (bitIndex < coils.size() && coils[bitIndex]) | ||||
byte |= (1 << j); | byte |= (1 << j); | ||||
} | } | ||||
sendCommand.append(static_cast<char>(byte)); | |||||
sendCommand_.append(static_cast<char>(byte)); | |||||
} | } | ||||
quint16 temp = CalculateCrc(sendCommand); //计算crc | |||||
sendCommand.append(temp%256); //加入计算的crc值 | |||||
sendCommand.append(temp/256); | |||||
quint16 temp = CalculateCrc(sendCommand_); //计算crc | |||||
sendCommand_.append(temp%256); //加入计算的crc值 | |||||
sendCommand_.append(temp/256); | |||||
} | } | ||||
void MyModbus::WriteRegister(QVector<quint16> &values) | void MyModbus::WriteRegister(QVector<quint16> &values) | ||||
{ | { | ||||
sendCommand.clear(); | |||||
sendCommand.append(stationAddress%256); | |||||
sendCommand.append(0x10); | |||||
sendCommand.append(startAdress/256); | |||||
sendCommand.append(startAdress%256); | |||||
sendCommand.append(length/256); | |||||
sendCommand.append(length%256); | |||||
sendCommand.append(static_cast<char>(values.size() * 2)); | |||||
sendCommand_.clear(); | |||||
sendCommand_.append(stationAddress_%256); | |||||
sendCommand_.append(0x10); | |||||
sendCommand_.append(startAdress_/256); | |||||
sendCommand_.append(startAdress_%256); | |||||
sendCommand_.append(length_/256); | |||||
sendCommand_.append(length_%256); | |||||
sendCommand_.append(static_cast<char>(values.size() * 2)); | |||||
for (quint16 v : values) | for (quint16 v : values) | ||||
{ | { | ||||
sendCommand.append(static_cast<char>((v >> 8) & 0xFF)); | |||||
sendCommand.append(static_cast<char>(v & 0xFF)); | |||||
sendCommand_.append(static_cast<char>((v >> 8) & 0xFF)); | |||||
sendCommand_.append(static_cast<char>(v & 0xFF)); | |||||
} | } | ||||
quint16 temp = CalculateCrc(sendCommand); //计算crc | |||||
sendCommand.append(temp%256); //加入计算的crc值 | |||||
sendCommand.append(temp/256); | |||||
quint16 temp = CalculateCrc(sendCommand_); //计算crc | |||||
sendCommand_.append(temp%256); //加入计算的crc值 | |||||
sendCommand_.append(temp/256); | |||||
} | } | ||||
QByteArray MyModbus::SendCommand() | QByteArray MyModbus::SendCommand() | ||||
{ | { | ||||
return sendCommand; | |||||
return sendCommand_; | |||||
} | } | ||||
QByteArray MyModbus::Receive(const QByteArray &revMessage) | QByteArray MyModbus::Receive(const QByteArray &revMessage) | ||||
{ | { | ||||
receive.clear(); | |||||
receive_.clear(); | |||||
if (CrcCheck(revMessage)) | if (CrcCheck(revMessage)) | ||||
{ | { | ||||
this->receive = revMessage; | |||||
this->receive_ = revMessage; | |||||
} | } | ||||
return receive; | |||||
return receive_; | |||||
} | } | ||||
int MyModbus::ErrorCheck() | int MyModbus::ErrorCheck() | ||||
{ | { | ||||
if ((receive.at(1) & 0x80) == 0x80) | |||||
if ((receive_.at(1) & 0x80) == 0x80) | |||||
{ | { | ||||
// MODBUS异常响应结构:地址 | 功能码+0x80 | 异常码 | CRC | // MODBUS异常响应结构:地址 | 功能码+0x80 | 异常码 | CRC | ||||
quint8 exCode = receive.at(2); | |||||
quint8 exCode = receive_.at(2); | |||||
return exCode; | return exCode; | ||||
} | } | ||||
else | else | ||||
@@ -109,18 +109,18 @@ int MyModbus::ErrorCheck() | |||||
QVector<bool> MyModbus::AnalReadCoil() | QVector<bool> MyModbus::AnalReadCoil() | ||||
{ | { | ||||
quint8 byteCount = static_cast<quint8>(receive[2]); | |||||
quint8 byteCount = static_cast<quint8>(receive_[2]); | |||||
QVector<bool> coil; | QVector<bool> coil; | ||||
for (int byteIndex = 0; byteIndex < byteCount; byteIndex++) | for (int byteIndex = 0; byteIndex < byteCount; byteIndex++) | ||||
{ | { | ||||
quint8 byteValue = static_cast<quint8>(receive[3 + byteIndex]); | |||||
quint8 byteValue = static_cast<quint8>(receive_[3 + byteIndex]); | |||||
// 解析每个字节的8个位 | // 解析每个字节的8个位 | ||||
for (int bitIndex = 0; bitIndex < 8; bitIndex++) | for (int bitIndex = 0; bitIndex < 8; bitIndex++) | ||||
{ | { | ||||
int coilIndex = byteIndex * 8 + bitIndex; | int coilIndex = byteIndex * 8 + bitIndex; | ||||
if (coilIndex < length) | |||||
if (coilIndex < length_) | |||||
{ | { | ||||
bool state = byteValue & (1 << bitIndex); | bool state = byteValue & (1 << bitIndex); | ||||
coil.append(state); | coil.append(state); | ||||
@@ -132,8 +132,8 @@ QVector<bool> MyModbus::AnalReadCoil() | |||||
QVector<quint16> MyModbus::AnalReadReg() | QVector<quint16> MyModbus::AnalReadReg() | ||||
{ | { | ||||
int byteCount = receive.at(2); | |||||
QByteArray data = receive.mid(3, byteCount); | |||||
int byteCount = receive_.at(2); | |||||
QByteArray data = receive_.mid(3, byteCount); | |||||
QVector<quint16> registers; | QVector<quint16> registers; | ||||
for (int i = 0; i < data.size(); i += 2) | for (int i = 0; i < data.size(); i += 2) | ||||
@@ -9,17 +9,17 @@ | |||||
class MyModbus | class MyModbus | ||||
{ | { | ||||
private: | private: | ||||
quint16 stationAddress; | |||||
quint16 functionCode; | |||||
quint16 startAdress; | |||||
quint16 length; | |||||
QByteArray sendCommand; | |||||
QByteArray receive; | |||||
quint16 stationAddress_; | |||||
quint16 functionCode_; | |||||
quint16 startAdress_; | |||||
quint16 length_; | |||||
QByteArray sendCommand_; | |||||
QByteArray receive_; | |||||
public: | public: | ||||
MyModbus(); | MyModbus(); | ||||
void Set(quint16 stationAddress,quint16 functionCode,quint16 startAdress,quint16 length); | |||||
void ReadColiAndReg(); | |||||
void Set(quint16 stationAddress_,quint16 functionCode_,quint16 startAdress_,quint16 length_); | |||||
void ReadCoilAndReg(); | |||||
void WriteCoil(QVector<bool> &coils); | void WriteCoil(QVector<bool> &coils); | ||||
void WriteRegister(QVector<quint16> &values); | void WriteRegister(QVector<quint16> &values); | ||||
QByteArray SendCommand(); | QByteArray SendCommand(); | ||||
@@ -8,10 +8,9 @@ | |||||
#include <QVector> | #include <QVector> | ||||
#include <QMessageBox> | #include <QMessageBox> | ||||
#include <synchapi.h> | #include <synchapi.h> | ||||
#include <QFile> | |||||
#include <QFileDialog> | |||||
#include "crc.h" | #include "crc.h" | ||||
#include "mymodbus.h" | #include "mymodbus.h" | ||||
#include "communicationhistory.h" | |||||
Widget::Widget(QWidget *parent) : | Widget::Widget(QWidget *parent) : | ||||
QWidget(parent), | QWidget(parent), | ||||
@@ -30,18 +29,14 @@ Widget::Widget(QWidget *parent) : | |||||
ui->textEdit_2->append("通信超时,重新发送中"); | ui->textEdit_2->append("通信超时,重新发送中"); | ||||
serialPort->write(modbus->SendCommand()); | serialPort->write(modbus->SendCommand()); | ||||
Sleep(1000); | |||||
timer.isActive(); | |||||
timer.start(1000); | |||||
comCount ++; | comCount ++; | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
QMessageBox::warning(this, "提示", "等待响应超时,请检查设备状态。"); | |||||
ui->btn_read->setEnabled(1); | |||||
ui->pushWrite->setEnabled(1); | |||||
timer.stop(); | |||||
QMessageBox::warning(this, "提示", "等待响应超时,请检查设备状态。"); | |||||
ui->btn_read->setEnabled(1); | |||||
ui->pushWrite->setEnabled(1); | |||||
timer.stop(); | |||||
} | } | ||||
}); | }); | ||||
@@ -61,6 +56,7 @@ Widget::Widget(QWidget *parent) : | |||||
Widget::~Widget() | Widget::~Widget() | ||||
{ | { | ||||
delete modbus; | |||||
delete ui; | delete ui; | ||||
} | } | ||||
@@ -69,13 +65,13 @@ void Widget::on_btnConnect_clicked() | |||||
{ | { | ||||
if (ui->btnConnect->text() == "连接") | if (ui->btnConnect->text() == "连接") | ||||
{ | { | ||||
//配置串口号 | |||||
//配置串口号 | |||||
serialPort->setPortName(ui->comboBox_serialNum->currentText()); | serialPort->setPortName(ui->comboBox_serialNum->currentText()); | ||||
//配置波特率 | |||||
//配置波特率 | |||||
serialPort->setBaudRate(ui->comboBox_baudRate->currentText().toInt()); | serialPort->setBaudRate(ui->comboBox_baudRate->currentText().toInt()); | ||||
//配置数据位 | |||||
//配置数据位 | |||||
serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_dataBit->currentText().toInt())); | serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_dataBit->currentText().toInt())); | ||||
//配置校验位 | |||||
//配置校验位 | |||||
switch (ui->comboBox_xiaoyan->currentIndex()) | switch (ui->comboBox_xiaoyan->currentIndex()) | ||||
{ | { | ||||
case 0: | case 0: | ||||
@@ -87,12 +83,11 @@ void Widget::on_btnConnect_clicked() | |||||
case 2: | case 2: | ||||
serialPort->setParity(QSerialPort::EvenParity); | serialPort->setParity(QSerialPort::EvenParity); | ||||
} | } | ||||
//配置停止位 | |||||
//配置停止位 | |||||
serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_stopBit->currentText().toInt())); | serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_stopBit->currentText().toInt())); | ||||
//打开串口 | |||||
//打开串口 | |||||
if (serialPort->open(QIODevice::ReadWrite)) | if (serialPort->open(QIODevice::ReadWrite)) | ||||
{ | { | ||||
qDebug() << "Serial open success"; | |||||
ui->textEdit_2->append("串口连接成功"); | ui->textEdit_2->append("串口连接成功"); | ||||
ui->btnConnect->setText("断开"); | ui->btnConnect->setText("断开"); | ||||
ui->btn_read->setEnabled(1); | ui->btn_read->setEnabled(1); | ||||
@@ -100,13 +95,11 @@ void Widget::on_btnConnect_clicked() | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
qDebug() << "error"; | |||||
QMessageBox::warning(this, "提示", "串口连接失败,请检查串口参数配置"); | QMessageBox::warning(this, "提示", "串口连接失败,请检查串口参数配置"); | ||||
} | } | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
delete modbus; | |||||
serialPort->close(); | serialPort->close(); | ||||
ui->btn_read->setEnabled(0); | ui->btn_read->setEnabled(0); | ||||
ui->pushWrite->setEnabled(0); | ui->pushWrite->setEnabled(0); | ||||
@@ -124,44 +117,42 @@ void Widget::on_pushWrite_clicked() | |||||
{ | { | ||||
case 2: //写多个线圈 | case 2: //写多个线圈 | ||||
{ | { | ||||
QString sendData = ui->lineEdit->text().trimmed(); | |||||
if (sendData.isEmpty()) | |||||
{ | |||||
QMessageBox::warning(this, "提示", "请至少输入一个数据,缺少的数据默认为0"); | |||||
return; | |||||
} | |||||
for (QChar ch : sendData) { | |||||
if (ch != '0' && ch != '1') { | |||||
QMessageBox::warning(this, "提示", "只允许输入 0 或 1!"); | |||||
QString sendData = ui->lineEdit->text().trimmed(); | |||||
if (sendData.isEmpty()) | |||||
{ | |||||
QMessageBox::warning(this, "提示", "请至少输入一个数据,缺少的数据默认为0"); | |||||
return; | return; | ||||
} | } | ||||
} | |||||
for (QChar ch : sendData) { | |||||
if (ch != '0' && ch != '1') { | |||||
QMessageBox::warning(this, "提示", "只允许输入 0 或 1!"); | |||||
return; | |||||
} | |||||
} | |||||
QVector<bool> coils; | |||||
for (QChar ch : sendData) | |||||
{ | |||||
coils.append(ch == '1'); | |||||
} | |||||
QVector<bool> coils; | |||||
for (QChar ch : sendData) | |||||
{ | |||||
coils.append(ch == '1'); | |||||
} | |||||
quint16 stationAddress = ui->comboBox_stationAddress->currentText().toInt(); | |||||
quint16 functionCode = 0x0f; | |||||
quint16 stratAddress = ui->lineEdit_stratAddress->text().toInt(); | |||||
quint16 length = ui->lineEdit_length->text().toInt(); | |||||
quint16 stationAddress = ui->comboBox_stationAddress->currentText().toInt(); | |||||
quint16 functionCode = 0x0f; | |||||
quint16 stratAddress = ui->lineEdit_stratAddress->text().toInt(); | |||||
quint16 length = ui->lineEdit_length->text().toInt(); | |||||
modbus->Set(stationAddress,functionCode,stratAddress,length); | |||||
modbus->WriteCoil(coils); | |||||
modbus->Set(stationAddress,functionCode,stratAddress,length); | |||||
modbus->WriteCoil(coils); | |||||
ui->textEdit_2->append("发送报文"+modbus->SendCommand().toHex().toUpper()); | |||||
serialPort->write(modbus->SendCommand()); | |||||
ui->btn_read->setEnabled(0); | |||||
ui->pushWrite->setEnabled(0); | |||||
ui->textEdit_2->append("发送报文"+modbus->SendCommand().toHex().toUpper()); | |||||
serialPort->write(modbus->SendCommand()); | |||||
ui->btn_read->setEnabled(0); | |||||
ui->pushWrite->setEnabled(0); | |||||
comCount = 0; | |||||
Sleep(100); | |||||
timer.isActive(); | |||||
timer.start(1000); // 1 s 后触发超时 | |||||
comCount = 0; | |||||
timer.start(1000); // 1 s 后触发超时 | |||||
break; | |||||
break; | |||||
} | } | ||||
case 3: | case 3: | ||||
@@ -188,7 +179,7 @@ void Widget::on_pushWrite_clicked() | |||||
} | } | ||||
quint16 stationAddress = ui->comboBox_stationAddress->currentText().toInt(); | quint16 stationAddress = ui->comboBox_stationAddress->currentText().toInt(); | ||||
quint16 functionCode = 0x0f; | |||||
quint16 functionCode = 0x10; | |||||
quint16 stratAddress = ui->lineEdit_stratAddress->text().toInt(); | quint16 stratAddress = ui->lineEdit_stratAddress->text().toInt(); | ||||
quint16 length = ui->lineEdit_length->text().toInt(); | quint16 length = ui->lineEdit_length->text().toInt(); | ||||
@@ -201,11 +192,8 @@ void Widget::on_pushWrite_clicked() | |||||
ui->pushWrite->setEnabled(0); | ui->pushWrite->setEnabled(0); | ||||
comCount = 0; | comCount = 0; | ||||
Sleep(100); | |||||
timer.isActive(); | |||||
timer.start(1000); // 1 s 后触发超时 | timer.start(1000); // 1 s 后触发超时 | ||||
qDebug() << "SenOk" <<sendData; | |||||
break; | break; | ||||
} | } | ||||
default: | default: | ||||
@@ -234,10 +222,8 @@ void Widget::on_SerialData_ReadyToRead() | |||||
return; | return; | ||||
} | } | ||||
QString hexData = revMessage.toHex().toUpper(); | QString hexData = revMessage.toHex().toUpper(); | ||||
qDebug() << hexData; | |||||
ui->textEdit_2->append("接收报文"+hexData); | ui->textEdit_2->append("接收报文"+hexData); | ||||
qDebug() << "接收成功"; | |||||
int exCode = modbus->ErrorCheck(); | int exCode = modbus->ErrorCheck(); | ||||
if (exCode) | if (exCode) | ||||
{ | { | ||||
@@ -278,13 +264,14 @@ void Widget::on_SerialData_ReadyToRead() | |||||
//解析读寄存器的返回报文 | //解析读寄存器的返回报文 | ||||
case 1: | case 1: | ||||
{ | { | ||||
QVector<quint16> registers = modbus->AnalReadReg(); | |||||
QVector<quint16> registers = modbus->AnalReadReg(); | |||||
ui->textEdit->append("寄存器的值:"); | |||||
for (int i = 0; i < registers.size(); i++) | |||||
{ | |||||
ui->textEdit->append("寄存器"+QString::number(i+1)+":"+QString::number(registers.at(i))); | |||||
} | |||||
ui->textEdit->append("寄存器的值:"); | |||||
for (int i = 0; i < registers.size(); i++) | |||||
{ | |||||
ui->textEdit->append("寄存器"+QString::number(i+1)+":"+QString::number(registers.at(i))); | |||||
} | |||||
break; | break; | ||||
} | } | ||||
@@ -305,7 +292,6 @@ void Widget::on_btn_read_clicked() | |||||
quint16 functionCode; | quint16 functionCode; | ||||
quint16 stratAddress = ui->lineEdit_stratAddress->text().toInt(); | quint16 stratAddress = ui->lineEdit_stratAddress->text().toInt(); | ||||
quint16 length = ui->lineEdit_length->text().toInt(); | quint16 length = ui->lineEdit_length->text().toInt(); | ||||
QByteArray SendCommand; | |||||
if (ui->comboBox_gongnengma->currentIndex() == 0) //读线圈 | if (ui->comboBox_gongnengma->currentIndex() == 0) //读线圈 | ||||
{ | { | ||||
@@ -317,7 +303,7 @@ void Widget::on_btn_read_clicked() | |||||
} | } | ||||
modbus->Set(stationAddress,functionCode,stratAddress,length); | modbus->Set(stationAddress,functionCode,stratAddress,length); | ||||
modbus->ReadColiAndReg(); | |||||
modbus->ReadCoilAndReg(); | |||||
serialPort->write(modbus->SendCommand()); //发送报文 | serialPort->write(modbus->SendCommand()); //发送报文 | ||||
ui->textEdit_2->append("发送报文"+modbus->SendCommand().toHex().toUpper()); | ui->textEdit_2->append("发送报文"+modbus->SendCommand().toHex().toUpper()); | ||||
@@ -325,64 +311,20 @@ void Widget::on_btn_read_clicked() | |||||
ui->pushWrite->setEnabled(0); | ui->pushWrite->setEnabled(0); | ||||
comCount = 0; | comCount = 0; | ||||
Sleep(100); | |||||
timer.isActive(); | |||||
timer.start(1000); // 1 s 后触发超时 | timer.start(1000); // 1 s 后触发超时 | ||||
} | } | ||||
void Widget::on_pushButton_clicked() | |||||
void Widget::on_btn_SaveDate_clicked() | |||||
{ | { | ||||
QString fileName = QFileDialog::getSaveFileName( | |||||
this, | |||||
"保存文本", | |||||
QDir::homePath() + "/note.txt", | |||||
"文本文件 (*.txt);;所有文件 (*.*)"); | |||||
if (fileName.isEmpty()) | |||||
return; | |||||
QFile file(fileName); | |||||
if (!file.open(QIODevice::Append | QIODevice::Text)) // | |||||
{ | |||||
QMessageBox::warning(this, "错误", "无法打开文件"); | |||||
return; | |||||
} | |||||
// 每次追加前换行 | |||||
if (file.size() > 0) // 文件非空 | |||||
file.write("\n"); // 先换行,再写内容 | |||||
QTextStream out(&file); | |||||
out.setCodec("UTF-8"); | |||||
out << ui->textEdit_2->toPlainText(); // 追加写入 | |||||
file.close(); | |||||
SaveDate(this,ui->textEdit_2); | |||||
} | } | ||||
void Widget::on_pushButton_2_clicked() | |||||
void Widget::on_btn_ReadDate_clicked() | |||||
{ | { | ||||
QString fileName = QFileDialog::getOpenFileName( | |||||
this, | |||||
"打开文本", | |||||
QDir::homePath(), | |||||
"文本文件 (*.txt);;所有文件 (*.*)"); | |||||
if (fileName.isEmpty()) | |||||
return; | |||||
QFile file(fileName); | |||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) | |||||
{ | |||||
QMessageBox::warning(this, "错误", "无法读取文件"); | |||||
return; | |||||
} | |||||
QTextStream in(&file); | |||||
in.setCodec("UTF-8"); | |||||
ui->textEdit_2->setPlainText(in.readAll()); | |||||
file.close(); | |||||
ReadDate(this,ui->textEdit_2); | |||||
} | } | ||||
void Widget::on_pushButton_3_clicked() | |||||
void Widget::on_btn_ClearDate_clicked() | |||||
{ | { | ||||
ui->textEdit_2->clear(); | ui->textEdit_2->clear(); | ||||
} | } | ||||
@@ -392,3 +334,8 @@ void Widget::onReadyRead() | |||||
recvBuffer.append(serialPort->readAll()); | recvBuffer.append(serialPort->readAll()); | ||||
recvTimer->start(50); // 50ms 内无新数据即认为接收完成 | recvTimer->start(50); // 50ms 内无新数据即认为接收完成 | ||||
} | } | ||||
void Widget::on_btn_ClearRead_clicked() | |||||
{ | |||||
ui->textEdit->clear(); | |||||
} |
@@ -27,14 +27,16 @@ private slots: | |||||
void on_btn_read_clicked(); | void on_btn_read_clicked(); | ||||
void on_pushButton_clicked(); | |||||
void on_btn_SaveDate_clicked(); | |||||
void on_pushButton_2_clicked(); | |||||
void on_btn_ReadDate_clicked(); | |||||
void on_pushButton_3_clicked(); | |||||
void on_btn_ClearDate_clicked(); | |||||
void onReadyRead(); | void onReadyRead(); | ||||
void on_btn_ClearRead_clicked(); | |||||
private: | private: | ||||
Ui::Widget *ui; | Ui::Widget *ui; | ||||
QSerialPort *serialPort; | QSerialPort *serialPort; | ||||
@@ -6,435 +6,474 @@ | |||||
<rect> | <rect> | ||||
<x>0</x> | <x>0</x> | ||||
<y>0</y> | <y>0</y> | ||||
<width>787</width> | |||||
<height>543</height> | |||||
<width>700</width> | |||||
<height>486</height> | |||||
</rect> | </rect> | ||||
</property> | </property> | ||||
<property name="windowTitle"> | <property name="windowTitle"> | ||||
<string>Widget</string> | <string>Widget</string> | ||||
</property> | </property> | ||||
<widget class="QLineEdit" name="lineEdit"> | |||||
<widget class="QGroupBox" name="groupBox"> | |||||
<property name="geometry"> | <property name="geometry"> | ||||
<rect> | <rect> | ||||
<x>340</x> | |||||
<y>430</y> | |||||
<width>301</width> | |||||
<height>31</height> | |||||
<x>30</x> | |||||
<y>240</y> | |||||
<width>181</width> | |||||
<height>231</height> | |||||
</rect> | </rect> | ||||
</property> | </property> | ||||
</widget> | |||||
<widget class="QPushButton" name="pushWrite"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>340</x> | |||||
<y>470</y> | |||||
<width>93</width> | |||||
<height>28</height> | |||||
</rect> | |||||
</property> | |||||
<property name="text"> | |||||
<string>写</string> | |||||
</property> | |||||
</widget> | |||||
<widget class="QTextEdit" name="textEdit"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>40</x> | |||||
<y>280</y> | |||||
<width>251</width> | |||||
<height>191</height> | |||||
</rect> | |||||
</property> | |||||
<property name="readOnly"> | |||||
<bool>true</bool> | |||||
</property> | |||||
</widget> | |||||
<widget class="QPushButton" name="btn_read"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>200</x> | |||||
<y>470</y> | |||||
<width>93</width> | |||||
<height>28</height> | |||||
</rect> | |||||
</property> | |||||
<property name="text"> | |||||
<string>读</string> | |||||
</property> | |||||
</widget> | |||||
<widget class="QLabel" name="label_13"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>340</x> | |||||
<y>330</y> | |||||
<width>311</width> | |||||
<height>101</height> | |||||
</rect> | |||||
</property> | |||||
<property name="text"> | |||||
<string>写线圈时,使用1、0代表线圈的开关状态, | |||||
从左到右依次输入每个线圈的开关; | |||||
写寄存器时要写入所有寄存器的16进制数值, | |||||
相邻寄存器的值之间用英文","分离。</string> | |||||
</property> | |||||
</widget> | |||||
<widget class="QLabel" name="label_4"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>40</x> | |||||
<y>10</y> | |||||
<width>72</width> | |||||
<height>15</height> | |||||
</rect> | |||||
</property> | |||||
<property name="text"> | |||||
<string>串口配置</string> | |||||
</property> | |||||
</widget> | |||||
<widget class="QLabel" name="label_5"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>40</x> | |||||
<y>100</y> | |||||
<width>72</width> | |||||
<height>15</height> | |||||
</rect> | |||||
</property> | |||||
<property name="text"> | |||||
<property name="title"> | |||||
<string>从站配置</string> | <string>从站配置</string> | ||||
</property> | </property> | ||||
</widget> | |||||
<widget class="QLabel" name="label_6"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>40</x> | |||||
<y>150</y> | |||||
<width>72</width> | |||||
<height>15</height> | |||||
</rect> | |||||
</property> | |||||
<property name="text"> | |||||
<string>状态通知</string> | |||||
</property> | |||||
</widget> | |||||
<widget class="QWidget" name=""> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>42</x> | |||||
<y>32</y> | |||||
<width>406</width> | |||||
<height>58</height> | |||||
</rect> | |||||
</property> | |||||
<layout class="QGridLayout" name="gridLayout_2"> | |||||
<item row="0" column="0"> | |||||
<widget class="QLabel" name="label"> | |||||
<property name="text"> | |||||
<string>串口</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
<item row="0" column="1" colspan="2"> | |||||
<widget class="QComboBox" name="comboBox_serialNum"/> | |||||
</item> | |||||
<item row="0" column="3" colspan="2"> | |||||
<widget class="QLabel" name="label_2"> | |||||
<property name="text"> | |||||
<string>波特率</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
<item row="0" column="5" colspan="2"> | |||||
<widget class="QComboBox" name="comboBox_baudRate"> | |||||
<item> | |||||
<widget class="QWidget" name=""> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>10</x> | |||||
<y>30</y> | |||||
<width>159</width> | |||||
<height>131</height> | |||||
</rect> | |||||
</property> | |||||
<layout class="QGridLayout" name="gridLayout_2"> | |||||
<item row="0" column="0"> | |||||
<widget class="QLabel" name="label_9"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>1200</string> | |||||
<string>站地址</string> | |||||
</property> | </property> | ||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>2400</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>4800</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>9600</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>19200</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
<item row="0" column="1"> | |||||
<widget class="QComboBox" name="comboBox_stationAddress"> | |||||
<item> | |||||
<property name="text"> | |||||
<string>1</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>2</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>3</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>4</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>5</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>6</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>7</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>8</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>9</string> | |||||
</property> | |||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item row="1" column="0"> | |||||
<widget class="QLabel" name="label_10"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>38400</string> | |||||
<string>操作</string> | |||||
</property> | </property> | ||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item row="0" column="7"> | |||||
<widget class="QLabel" name="label_3"> | |||||
<property name="text"> | |||||
<string>数据位</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
<item row="0" column="8"> | |||||
<widget class="QComboBox" name="comboBox_dataBit"> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
<item row="1" column="1"> | |||||
<widget class="QComboBox" name="comboBox_gongnengma"> | |||||
<item> | |||||
<property name="text"> | |||||
<string>读线圈</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>读寄存器</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>写线圈</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>写寄存器</string> | |||||
</property> | |||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item row="2" column="0"> | |||||
<widget class="QLabel" name="label_11"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>5</string> | |||||
<string>起始地址</string> | |||||
</property> | </property> | ||||
</item> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
<item row="2" column="1"> | |||||
<widget class="QLineEdit" name="lineEdit_stratAddress"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>6</string> | |||||
<string>256</string> | |||||
</property> | </property> | ||||
</item> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
<item row="3" column="0"> | |||||
<widget class="QLabel" name="label_12"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>7</string> | |||||
<string>长度</string> | |||||
</property> | </property> | ||||
</item> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
<item row="3" column="1"> | |||||
<widget class="QLineEdit" name="lineEdit_length"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>8</string> | |||||
<string>1</string> | |||||
</property> | </property> | ||||
</item> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
</layout> | |||||
</widget> | |||||
<widget class="QPushButton" name="btn_read"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>10</x> | |||||
<y>160</y> | |||||
<width>71</width> | |||||
<height>51</height> | |||||
</rect> | |||||
</property> | |||||
<property name="text"> | |||||
<string>读</string> | |||||
</property> | |||||
</widget> | |||||
<widget class="QPushButton" name="pushWrite"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>90</x> | |||||
<y>160</y> | |||||
<width>71</width> | |||||
<height>51</height> | |||||
</rect> | |||||
</property> | |||||
<property name="text"> | |||||
<string>写</string> | |||||
</property> | |||||
</widget> | |||||
</widget> | |||||
<widget class="QGroupBox" name="groupBox_2"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>30</x> | |||||
<y>19</y> | |||||
<width>181</width> | |||||
<height>211</height> | |||||
</rect> | |||||
</property> | |||||
<property name="title"> | |||||
<string>串口配置</string> | |||||
</property> | |||||
<widget class="QWidget" name=""> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>10</x> | |||||
<y>20</y> | |||||
<width>161</width> | |||||
<height>181</height> | |||||
</rect> | |||||
</property> | |||||
<layout class="QGridLayout" name="gridLayout"> | |||||
<item row="0" column="0"> | |||||
<widget class="QLabel" name="label"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>NONE</string> | |||||
<string>串口</string> | |||||
</property> | </property> | ||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item row="1" column="0" colspan="2"> | |||||
<widget class="QLabel" name="label_7"> | |||||
<property name="text"> | |||||
<string>校验位</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
<item row="1" column="2" colspan="2"> | |||||
<widget class="QComboBox" name="comboBox_xiaoyan"> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
<item row="0" column="1"> | |||||
<widget class="QComboBox" name="comboBox_serialNum"/> | |||||
</item> | |||||
<item row="1" column="0"> | |||||
<widget class="QLabel" name="label_2"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>无校验(N)</string> | |||||
<string>波特率</string> | |||||
</property> | </property> | ||||
</item> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
<item row="1" column="1"> | |||||
<widget class="QComboBox" name="comboBox_baudRate"> | |||||
<item> | |||||
<property name="text"> | |||||
<string>1200</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>2400</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>4800</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>9600</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>19200</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>38400</string> | |||||
</property> | |||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item row="2" column="0"> | |||||
<widget class="QLabel" name="label_3"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>奇校验(O)</string> | |||||
<string>数据位</string> | |||||
</property> | </property> | ||||
</item> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
<item row="2" column="1"> | |||||
<widget class="QComboBox" name="comboBox_dataBit"> | |||||
<item> | |||||
<property name="text"> | |||||
<string>5</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>6</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>7</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>8</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>NONE</string> | |||||
</property> | |||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item row="3" column="0"> | |||||
<widget class="QLabel" name="label_7"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>偶校验(E)</string> | |||||
<string>校验位</string> | |||||
</property> | </property> | ||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item row="1" column="4" colspan="2"> | |||||
<widget class="QLabel" name="label_8"> | |||||
<property name="text"> | |||||
<string>停止位</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
<item row="1" column="6"> | |||||
<widget class="QComboBox" name="comboBox_stopBit"> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
<item row="3" column="1"> | |||||
<widget class="QComboBox" name="comboBox_xiaoyan"> | |||||
<item> | |||||
<property name="text"> | |||||
<string>无校验(N)</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>奇校验(O)</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>偶校验(E)</string> | |||||
</property> | |||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item row="4" column="0"> | |||||
<widget class="QLabel" name="label_8"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>1</string> | |||||
<string>停止位</string> | |||||
</property> | </property> | ||||
</item> | |||||
<item> | |||||
</widget> | |||||
</item> | |||||
<item row="4" column="1"> | |||||
<widget class="QComboBox" name="comboBox_stopBit"> | |||||
<item> | |||||
<property name="text"> | |||||
<string>1</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>2</string> | |||||
</property> | |||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item row="5" column="0" colspan="2"> | |||||
<widget class="QPushButton" name="btnConnect"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>2</string> | |||||
<string>连接</string> | |||||
</property> | </property> | ||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item row="1" column="7" colspan="2"> | |||||
<widget class="QPushButton" name="btnConnect"> | |||||
<property name="text"> | |||||
<string>连接</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
</layout> | |||||
</widget> | |||||
</item> | |||||
</layout> | |||||
</widget> | |||||
</widget> | |||||
<widget class="QGroupBox" name="groupBox_3"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>240</x> | |||||
<y>20</y> | |||||
<width>211</width> | |||||
<height>271</height> | |||||
</rect> | |||||
</property> | |||||
<property name="title"> | |||||
<string>数据读取</string> | |||||
</property> | |||||
<widget class="QTextEdit" name="textEdit"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>10</x> | |||||
<y>20</y> | |||||
<width>191</width> | |||||
<height>241</height> | |||||
</rect> | |||||
</property> | |||||
<property name="readOnly"> | |||||
<bool>true</bool> | |||||
</property> | |||||
</widget> | |||||
</widget> | |||||
<widget class="QGroupBox" name="groupBox_4"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>470</x> | |||||
<y>20</y> | |||||
<width>221</width> | |||||
<height>271</height> | |||||
</rect> | |||||
</property> | |||||
<property name="title"> | |||||
<string>状态通知</string> | |||||
</property> | |||||
<widget class="QTextEdit" name="textEdit_2"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>10</x> | |||||
<y>20</y> | |||||
<width>201</width> | |||||
<height>241</height> | |||||
</rect> | |||||
</property> | |||||
<property name="readOnly"> | |||||
<bool>true</bool> | |||||
</property> | |||||
</widget> | |||||
</widget> | |||||
<widget class="QGroupBox" name="groupBox_5"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>240</x> | |||||
<y>340</y> | |||||
<width>341</width> | |||||
<height>131</height> | |||||
</rect> | |||||
</property> | |||||
<property name="title"> | |||||
<string>写入数据</string> | |||||
</property> | |||||
<widget class="QLabel" name="label_13"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>10</x> | |||||
<y>0</y> | |||||
<width>311</width> | |||||
<height>101</height> | |||||
</rect> | |||||
</property> | |||||
<property name="text"> | |||||
<string>写线圈时,使用1、0代表线圈的开关状态, | |||||
从左到右依次输入每个线圈的开关; | |||||
写寄存器时要写入所有寄存器的16进制数值, | |||||
相邻寄存器的值之间用英文","分离。</string> | |||||
</property> | |||||
</widget> | |||||
<widget class="QLineEdit" name="lineEdit"> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>10</x> | |||||
<y>90</y> | |||||
<width>301</width> | |||||
<height>31</height> | |||||
</rect> | |||||
</property> | |||||
</widget> | |||||
</widget> | </widget> | ||||
<widget class="QWidget" name=""> | <widget class="QWidget" name=""> | ||||
<property name="geometry"> | <property name="geometry"> | ||||
<rect> | <rect> | ||||
<x>41</x> | |||||
<y>116</y> | |||||
<width>687</width> | |||||
<height>23</height> | |||||
<x>240</x> | |||||
<y>300</y> | |||||
<width>451</width> | |||||
<height>30</height> | |||||
</rect> | </rect> | ||||
</property> | </property> | ||||
<layout class="QHBoxLayout" name="horizontalLayout"> | <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
<item> | <item> | ||||
<widget class="QLabel" name="label_9"> | |||||
<widget class="QPushButton" name="btn_ClearRead"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>站地址</string> | |||||
<string>清空读取信息</string> | |||||
</property> | </property> | ||||
</widget> | </widget> | ||||
</item> | </item> | ||||
<item> | <item> | ||||
<widget class="QComboBox" name="comboBox_stationAddress"> | |||||
<item> | |||||
<property name="text"> | |||||
<string>1</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>2</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>3</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>4</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>5</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>6</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>7</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>8</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>9</string> | |||||
</property> | |||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item> | |||||
<widget class="QLabel" name="label_10"> | |||||
<property name="text"> | |||||
<string>操作</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
<item> | |||||
<widget class="QComboBox" name="comboBox_gongnengma"> | |||||
<item> | |||||
<property name="text"> | |||||
<string>读线圈</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>读寄存器</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>写线圈</string> | |||||
</property> | |||||
</item> | |||||
<item> | |||||
<property name="text"> | |||||
<string>写寄存器</string> | |||||
</property> | |||||
</item> | |||||
</widget> | |||||
</item> | |||||
<item> | |||||
<widget class="QLabel" name="label_11"> | |||||
<widget class="QPushButton" name="btn_ClearDate"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>起始地址</string> | |||||
<string>清空收发信息</string> | |||||
</property> | </property> | ||||
</widget> | </widget> | ||||
</item> | </item> | ||||
<item> | <item> | ||||
<widget class="QLineEdit" name="lineEdit_stratAddress"> | |||||
<widget class="QPushButton" name="btn_ReadDate"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>256</string> | |||||
<string>读取历史收发信息</string> | |||||
</property> | </property> | ||||
</widget> | </widget> | ||||
</item> | </item> | ||||
<item> | <item> | ||||
<widget class="QLabel" name="label_12"> | |||||
<widget class="QPushButton" name="btn_SaveDate"> | |||||
<property name="text"> | <property name="text"> | ||||
<string>长度</string> | |||||
<string>保存收发信息</string> | |||||
</property> | </property> | ||||
</widget> | </widget> | ||||
</item> | </item> | ||||
<item> | |||||
<widget class="QLineEdit" name="lineEdit_length"> | |||||
<property name="text"> | |||||
<string>1</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
</layout> | |||||
</widget> | |||||
<widget class="QWidget" name=""> | |||||
<property name="geometry"> | |||||
<rect> | |||||
<x>41</x> | |||||
<y>164</y> | |||||
<width>691</width> | |||||
<height>91</height> | |||||
</rect> | |||||
</property> | |||||
<layout class="QHBoxLayout" name="horizontalLayout_2"> | |||||
<item> | |||||
<widget class="QTextEdit" name="textEdit_2"/> | |||||
</item> | |||||
<item> | |||||
<layout class="QVBoxLayout" name="verticalLayout"> | |||||
<item> | |||||
<widget class="QPushButton" name="pushButton_3"> | |||||
<property name="text"> | |||||
<string>清空收发信息</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
<item> | |||||
<widget class="QPushButton" name="pushButton"> | |||||
<property name="text"> | |||||
<string>保存收发信息</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
<item> | |||||
<widget class="QPushButton" name="pushButton_2"> | |||||
<property name="text"> | |||||
<string>读取历史收发信息</string> | |||||
</property> | |||||
</widget> | |||||
</item> | |||||
</layout> | |||||
</item> | |||||
</layout> | </layout> | ||||
</widget> | </widget> | ||||
</widget> | </widget> | ||||