├── ModbusTcpClient ├── ModbusTcpClient.cpp ├── ModbusTcpClient.h ├── ModbusTcpClient.pro ├── ModbusTcpClient.pro.user ├── ModbusTcpClient.ui └── main.cpp ├── ModbusTcpServer ├── ModbusTcpServer.cpp ├── ModbusTcpServer.h ├── ModbusTcpServer.pro ├── ModbusTcpServer.pro.user ├── ModbusTcpServer.ui └── main.cpp └── README.md /ModbusTcpClient/ModbusTcpClient.cpp: -------------------------------------------------------------------------------- 1 | #include "ModbusTcpClient.h" 2 | #include "ui_ModbusTcpClient.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | ModbusTcpClient::ModbusTcpClient(QWidget *parent) : 10 | QMainWindow(parent), 11 | ui(new Ui::ModbusTcpClient),m_holdingRegisters(20) 12 | { 13 | ui->setupUi(this); 14 | 15 | 16 | if (modbusDevice) { 17 | modbusDevice->disconnectDevice(); 18 | delete modbusDevice; 19 | modbusDevice = nullptr; 20 | } 21 | modbusDevice = new QModbusTcpClient(this);//QModbusTcpClient用于TCP通信中的client 22 | if (ui->lineEdit->text().isEmpty()) 23 | ui->lineEdit->setText(QLatin1Literal("127.0.0.1:502")); 24 | connect(modbusDevice, &QModbusClient::errorOccurred, [this](QModbusDevice::Error) { 25 | statusBar()->showMessage(modbusDevice->errorString(), 5000); 26 | }); 27 | connect(modbusDevice, &QModbusClient::stateChanged, 28 | this, &ModbusTcpClient::onStateChanged);//连接状态发生改变时改变connect按钮上的显示文字(connect or discennect) 29 | 30 | 31 | // QByteArray text = QByteArray::fromHex("517420697320677265617421"); 32 | // text.data(); // returns "Qt is great!" 33 | // qDebug()<disconnectDevice(); 41 | delete modbusDevice; 42 | delete ui; 43 | } 44 | 45 | void ModbusTcpClient::on_sendButton_clicked() 46 | { 47 | if (!modbusDevice)//如果设备没有被创建就返回 48 | return; 49 | 50 | QString strDis; 51 | QString str1 = ui->textEdit->toPlainText(); 52 | qDebug()<clearMessage();//清除状态栏显示的信息 58 | QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters,0,10);//发送的数据信息(数据类型 ,起始地址,个数) 59 | // QModbusDataUnit::RegisterType table = writeUnit.registerType();//得到寄存器类型传给table 60 | for (uint i = 0; i < writeUnit.valueCount(); i++) { 61 | int j = 2*i; 62 | QString st = str3.mid (j,2); 63 | bool ok; 64 | int hex =st.toInt(&ok,16); 65 | qDebug()<sendWriteRequest(writeUnit, 1);//发送数据 1是server address 69 | if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, 1)) { 70 | if (!reply->isFinished()) { //reply Returns true when the reply has finished or was aborted. 71 | connect(reply, &QModbusReply::finished, this, [this, reply]() { 72 | if (reply->error() == QModbusDevice::ProtocolError) { 73 | statusBar()->showMessage(tr("Write response error: %1 (Mobus exception: 0x%2)") 74 | .arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16), 75 | 5000); 76 | } else if (reply->error() != QModbusDevice::NoError) { 77 | statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)"). 78 | arg(reply->errorString()).arg(reply->error(), -1, 16), 5000); 79 | } 80 | reply->deleteLater(); 81 | }); 82 | } else { 83 | // broadcast replies return immediately 84 | reply->deleteLater(); 85 | } 86 | } else { 87 | statusBar()->showMessage(tr("Write error: ") + modbusDevice->errorString(), 5000); 88 | } 89 | } 90 | 91 | void ModbusTcpClient::on_connectButton_clicked() 92 | { 93 | if (!modbusDevice) 94 | return; 95 | statusBar()->clearMessage(); 96 | 97 | if (modbusDevice->state() != QModbusDevice::ConnectedState) {//如果处在非连接状态,进行连接 98 | const QUrl url = QUrl::fromUserInput(ui->lineEdit->text());//获取IP和端口号 99 | modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, url.port()); 100 | modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, url.host()); 101 | 102 | modbusDevice->setTimeout(1000);//连接超时1S 103 | modbusDevice->setNumberOfRetries(3);//连接失败重试三次连接 104 | if (!modbusDevice->connectDevice()) { 105 | statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000); 106 | } 107 | }else{//处在连接状态进行断开连接的操作 108 | modbusDevice->disconnectDevice(); 109 | } 110 | } 111 | 112 | void ModbusTcpClient::onStateChanged(int state)//更新connect按钮的显示状态 113 | { 114 | 115 | if (state == QModbusDevice::UnconnectedState) 116 | ui->connectButton->setText(tr("Connect")); 117 | else if (state == QModbusDevice::ConnectedState) 118 | ui->connectButton->setText(tr("Disconnect")); 119 | } 120 | 121 | void ModbusTcpClient::on_readButton_clicked() 122 | { 123 | if (!modbusDevice) 124 | return; 125 | statusBar()->clearMessage(); 126 | QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters,0,10); 127 | if (auto *reply = modbusDevice->sendReadRequest(readUnit, 1)) { 128 | if (!reply->isFinished()) 129 | connect(reply, &QModbusReply::finished, this, &ModbusTcpClient::readReady); 130 | else 131 | delete reply; // broadcast replies return immediately 132 | } else { 133 | statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000); 134 | } 135 | } 136 | 137 | void ModbusTcpClient::readReady()//在这里读的数据 138 | { 139 | auto reply = qobject_cast(sender());//QModbusReply这个类存储了来自client的数据,sender()返回发送信号的对象的指针 140 | if (!reply) 141 | return; 142 | //数据从QModbusReply这个类的resuil方法中获取,也就是本程序中的reply->result() 143 | if (reply->error() == QModbusDevice::NoError) { 144 | const QModbusDataUnit unit = reply->result(); 145 | for (uint i = 0; i < unit.valueCount(); i++) { 146 | const QString entry = tr("Address: %1, Value: %2").arg(unit.startAddress()) 147 | .arg(QString::number(unit.value(i), 148 | unit.registerType() <= QModbusDataUnit::Coils ? 10 : 16)); 149 | // ui->readValue->addItem(entry);//把数据放在QListWidget中 150 | ui->textEdit_2->append(entry); 151 | } 152 | } else if (reply->error() == QModbusDevice::ProtocolError) { 153 | statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)"). 154 | arg(reply->errorString()). 155 | arg(reply->rawResult().exceptionCode(), -1, 16), 5000); 156 | } else { 157 | statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)"). 158 | arg(reply->errorString()). 159 | arg(reply->error(), -1, 16), 5000); 160 | } 161 | 162 | reply->deleteLater(); 163 | } 164 | -------------------------------------------------------------------------------- /ModbusTcpClient/ModbusTcpClient.h: -------------------------------------------------------------------------------- 1 | #ifndef ModbusTcpClient_H 2 | #define ModbusTcpClient_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | namespace Ui { 9 | class ModbusTcpClient; 10 | } 11 | 12 | class ModbusTcpClient : public QMainWindow 13 | { 14 | Q_OBJECT 15 | 16 | public: 17 | explicit ModbusTcpClient(QWidget *parent = 0); 18 | // QStringList list; 19 | ~ModbusTcpClient(); 20 | 21 | private slots: 22 | void on_sendButton_clicked(); 23 | 24 | void on_connectButton_clicked(); 25 | void onStateChanged(int state); 26 | 27 | void on_readButton_clicked(); 28 | void readReady(); 29 | private: 30 | Ui::ModbusTcpClient *ui; 31 | QModbusClient *modbusDevice;//QModbusClient被QModbusRtuSerialMaster和QModbusTcpClient继成 32 | QVector m_holdingRegisters; 33 | 34 | }; 35 | 36 | #endif // ModbusTcpClient_H 37 | -------------------------------------------------------------------------------- /ModbusTcpClient/ModbusTcpClient.pro: -------------------------------------------------------------------------------- 1 | #------------------------------------------------- 2 | # 3 | # Project created by QtCreator 2016-08-03T11:38:23 4 | # 5 | #------------------------------------------------- 6 | 7 | QT += core gui serialbus serialport 8 | 9 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 10 | 11 | TARGET = modbusMaster 12 | TEMPLATE = app 13 | 14 | 15 | SOURCES += main.cpp \ 16 | ModbusTcpClient.cpp 17 | 18 | HEADERS += \ 19 | ModbusTcpClient.h 20 | 21 | FORMS += \ 22 | ModbusTcpClient.ui 23 | -------------------------------------------------------------------------------- /ModbusTcpClient/ModbusTcpClient.pro.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | EnvironmentId 7 | {5ffcdffc-9e6e-44b7-9b2a-5e7c26a8ee61} 8 | 9 | 10 | ProjectExplorer.Project.ActiveTarget 11 | 0 12 | 13 | 14 | ProjectExplorer.Project.EditorSettings 15 | 16 | true 17 | false 18 | true 19 | 20 | Cpp 21 | 22 | CppGlobal 23 | 24 | 25 | 26 | QmlJS 27 | 28 | QmlJSGlobal 29 | 30 | 31 | 2 32 | UTF-8 33 | false 34 | 4 35 | false 36 | 80 37 | true 38 | true 39 | 1 40 | true 41 | false 42 | 0 43 | true 44 | true 45 | 0 46 | 8 47 | true 48 | 1 49 | true 50 | true 51 | true 52 | false 53 | 54 | 55 | 56 | ProjectExplorer.Project.PluginSettings 57 | 58 | 59 | 60 | ProjectExplorer.Project.Target.0 61 | 62 | Desktop Qt 5.6.1 GCC 64bit 63 | Desktop Qt 5.6.1 GCC 64bit 64 | qt.56.gcc_64_kit 65 | 0 66 | 0 67 | 0 68 | 69 | /home/maowendi/mao/Project/Qt/Qt_TCP_Modbus/build-ModbusTcpClient-Desktop_Qt_5_6_1_GCC_64bit-Debug 70 | 71 | 72 | true 73 | qmake 74 | 75 | QtProjectManager.QMakeBuildStep 76 | true 77 | 78 | false 79 | false 80 | false 81 | 82 | 83 | true 84 | Make 85 | 86 | Qt4ProjectManager.MakeStep 87 | 88 | -w 89 | -r 90 | 91 | false 92 | 93 | 94 | 95 | 2 96 | Build 97 | 98 | ProjectExplorer.BuildSteps.Build 99 | 100 | 101 | 102 | true 103 | Make 104 | 105 | Qt4ProjectManager.MakeStep 106 | 107 | -w 108 | -r 109 | 110 | true 111 | clean 112 | 113 | 114 | 1 115 | Clean 116 | 117 | ProjectExplorer.BuildSteps.Clean 118 | 119 | 2 120 | false 121 | 122 | Debug 123 | 124 | Qt4ProjectManager.Qt4BuildConfiguration 125 | 2 126 | true 127 | 128 | 129 | /home/maowendi/mao/Project/Qt/Qt_TCP_Modbus/build-ModbusTcpClient-Desktop_Qt_5_6_1_GCC_64bit-Release 130 | 131 | 132 | true 133 | qmake 134 | 135 | QtProjectManager.QMakeBuildStep 136 | false 137 | 138 | false 139 | false 140 | false 141 | 142 | 143 | true 144 | Make 145 | 146 | Qt4ProjectManager.MakeStep 147 | 148 | -w 149 | -r 150 | 151 | false 152 | 153 | 154 | 155 | 2 156 | Build 157 | 158 | ProjectExplorer.BuildSteps.Build 159 | 160 | 161 | 162 | true 163 | Make 164 | 165 | Qt4ProjectManager.MakeStep 166 | 167 | -w 168 | -r 169 | 170 | true 171 | clean 172 | 173 | 174 | 1 175 | Clean 176 | 177 | ProjectExplorer.BuildSteps.Clean 178 | 179 | 2 180 | false 181 | 182 | Release 183 | 184 | Qt4ProjectManager.Qt4BuildConfiguration 185 | 0 186 | true 187 | 188 | 189 | /home/maowendi/mao/Project/Qt/Qt_TCP_Modbus/build-ModbusTcpClient-Desktop_Qt_5_6_1_GCC_64bit-Profile 190 | 191 | 192 | true 193 | qmake 194 | 195 | QtProjectManager.QMakeBuildStep 196 | true 197 | 198 | false 199 | true 200 | false 201 | 202 | 203 | true 204 | Make 205 | 206 | Qt4ProjectManager.MakeStep 207 | 208 | -w 209 | -r 210 | 211 | false 212 | 213 | 214 | 215 | 2 216 | Build 217 | 218 | ProjectExplorer.BuildSteps.Build 219 | 220 | 221 | 222 | true 223 | Make 224 | 225 | Qt4ProjectManager.MakeStep 226 | 227 | -w 228 | -r 229 | 230 | true 231 | clean 232 | 233 | 234 | 1 235 | Clean 236 | 237 | ProjectExplorer.BuildSteps.Clean 238 | 239 | 2 240 | false 241 | 242 | Profile 243 | 244 | Qt4ProjectManager.Qt4BuildConfiguration 245 | 0 246 | true 247 | 248 | 3 249 | 250 | 251 | 0 252 | Deploy 253 | 254 | ProjectExplorer.BuildSteps.Deploy 255 | 256 | 1 257 | Deploy locally 258 | 259 | ProjectExplorer.DefaultDeployConfiguration 260 | 261 | 1 262 | 263 | 264 | false 265 | false 266 | 1000 267 | 268 | true 269 | 270 | false 271 | false 272 | false 273 | false 274 | true 275 | 0.01 276 | 10 277 | true 278 | 1 279 | 25 280 | 281 | 1 282 | true 283 | false 284 | true 285 | valgrind 286 | 287 | 0 288 | 1 289 | 2 290 | 3 291 | 4 292 | 5 293 | 6 294 | 7 295 | 8 296 | 9 297 | 10 298 | 11 299 | 12 300 | 13 301 | 14 302 | 303 | 2 304 | 305 | ModbusTcpClient 306 | 307 | Qt4ProjectManager.Qt4RunConfiguration:/home/maowendi/mao/Project/Qt/Qt_TCP_Modbus/ModbusTcpClient/ModbusTcpClient.pro 308 | true 309 | 310 | ModbusTcpClient.pro 311 | false 312 | 313 | /home/maowendi/mao/Project/Qt/Qt_TCP_Modbus/build-ModbusTcpClient-Desktop_Qt_5_6_1_GCC_64bit-Debug 314 | 3768 315 | false 316 | true 317 | false 318 | false 319 | true 320 | 321 | 1 322 | 323 | 324 | 325 | ProjectExplorer.Project.TargetCount 326 | 1 327 | 328 | 329 | ProjectExplorer.Project.Updater.FileVersion 330 | 18 331 | 332 | 333 | Version 334 | 18 335 | 336 | 337 | -------------------------------------------------------------------------------- /ModbusTcpClient/ModbusTcpClient.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | ModbusTcpClient 4 | 5 | 6 | 7 | 0 8 | 0 9 | 597 10 | 457 11 | 12 | 13 | 14 | ModbusTcpClient 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | IP端口号: 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | connect 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 写入数据: 47 | 48 | 49 | 50 | 51 | 52 | 53 | Qt::Vertical 54 | 55 | 56 | 57 | 20 58 | 40 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 清空 76 | 77 | 78 | 79 | 80 | 81 | 82 | Qt::Horizontal 83 | 84 | 85 | 86 | 298 87 | 20 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | Send 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 读取数据: 109 | 110 | 111 | 112 | 113 | 114 | 115 | Qt::Vertical 116 | 117 | 118 | 119 | 20 120 | 48 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 清空 138 | 139 | 140 | 141 | 142 | 143 | 144 | Qt::Horizontal 145 | 146 | 147 | 148 | 298 149 | 20 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | Read 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 0 169 | 0 170 | 597 171 | 25 172 | 173 | 174 | 175 | 176 | 177 | TopToolBarArea 178 | 179 | 180 | false 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | -------------------------------------------------------------------------------- /ModbusTcpClient/main.cpp: -------------------------------------------------------------------------------- 1 | #include "ModbusTcpClient.h" 2 | #include 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | QApplication a(argc, argv); 7 | ModbusTcpClient w; 8 | w.show(); 9 | 10 | return a.exec(); 11 | } 12 | -------------------------------------------------------------------------------- /ModbusTcpServer/ModbusTcpServer.cpp: -------------------------------------------------------------------------------- 1 | #include "ModbusTcpServer.h" 2 | #include "ui_ModbusTcpServer.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | ModbusTcpServer::ModbusTcpServer(QWidget *parent) : 10 | QMainWindow(parent), 11 | ui(new Ui::ModbusTcpServer) 12 | { 13 | ui->setupUi(this); 14 | 15 | modbusDevice = new QModbusTcpServer(this); 16 | if (ui->lineEdit->text().isEmpty()) 17 | ui->lineEdit->setText(QLatin1Literal("127.0.0.1:502")); 18 | 19 | QModbusDataUnitMap reg; 20 | reg.insert(QModbusDataUnit::Coils, { QModbusDataUnit::Coils, 0, 10 });// 21 | reg.insert(QModbusDataUnit::DiscreteInputs, { QModbusDataUnit::DiscreteInputs, 0, 10 }); 22 | reg.insert(QModbusDataUnit::InputRegisters, { QModbusDataUnit::InputRegisters, 0, 10 }); 23 | reg.insert(QModbusDataUnit::HoldingRegisters, { QModbusDataUnit::HoldingRegisters, 0, 10 }); 24 | 25 | modbusDevice->setMap(reg);//把reg设置给了全局的m_modbusDataUnitMap 26 | connect(modbusDevice, &QModbusServer::stateChanged, 27 | this, &ModbusTcpServer::onStateChanged);//连接状态发生改变时改变connect按钮上的显示文字(connect or discennect) 28 | 29 | 30 | connect(modbusDevice, &QModbusServer::dataWritten, 31 | this, &ModbusTcpServer::updateWidgets);//modbus客户端向服务器写入数据时dataWritten信号被触发 32 | connect(modbusDevice, &QModbusServer::errorOccurred, 33 | this, &ModbusTcpServer::handleDeviceError); 34 | 35 | } 36 | 37 | ModbusTcpServer::~ModbusTcpServer() 38 | { 39 | delete ui; 40 | if (modbusDevice) 41 | modbusDevice->disconnectDevice();//清除 42 | delete modbusDevice; 43 | } 44 | 45 | void ModbusTcpServer::on_connectButton_clicked() 46 | { 47 | if (!modbusDevice) 48 | return; 49 | statusBar()->clearMessage(); 50 | 51 | QString comPortName = ui->lineEdit->text(); 52 | if (modbusDevice->state() != QModbusDevice::ConnectedState) {//如果处在非连接状态,进行连接 53 | //进行TCP连接 54 | const QUrl url = QUrl::fromUserInput(ui->lineEdit->text()); 55 | modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, url.port()); 56 | modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, url.host()); 57 | modbusDevice->setServerAddress(1); 58 | if (!modbusDevice->connectDevice()) { 59 | statusBar()->showMessage(tr("Connect failed: ") + modbusDevice->errorString(), 5000); 60 | } 61 | }else{//处在连接状态进行断开连接的操作 62 | modbusDevice->disconnectDevice(); 63 | } 64 | } 65 | 66 | void ModbusTcpServer::onStateChanged(int state)//判断联连状态是否改变,如改变则更改连接按钮上的文字 67 | { 68 | 69 | if (state == QModbusDevice::UnconnectedState) 70 | ui->connectButton->setText(tr("Connect")); 71 | else if (state == QModbusDevice::ConnectedState) 72 | ui->connectButton->setText(tr("Disconnect")); 73 | } 74 | 75 | void ModbusTcpServer::updateWidgets(QModbusDataUnit::RegisterType table, int address, int size) 76 | { 77 | for (int i = 0; i < size; ++i) { 78 | quint16 value; 79 | 80 | switch (table) { 81 | case QModbusDataUnit::Coils: 82 | modbusDevice->data(QModbusDataUnit::Coils, address + i, &value); 83 | qDebug()<data(QModbusDataUnit::HoldingRegisters, address + i, &value);//得到数据后做出显示 87 | qDebug()<textEdit->append(s); 95 | } 96 | } 97 | 98 | void ModbusTcpServer::handleDeviceError(QModbusDevice::Error newError)//错误提示 99 | { 100 | if (newError == QModbusDevice::NoError || !modbusDevice) 101 | return; 102 | 103 | statusBar()->showMessage(modbusDevice->errorString(), 5000); 104 | } 105 | 106 | void ModbusTcpServer::on_clearButton_clicked()//清除texiedit上的文本 107 | { 108 | ui->textEdit->clear(); 109 | } 110 | 111 | void ModbusTcpServer::on_writeButton_clicked() 112 | { 113 | QString str = ui->textEdit_2->toPlainText(); 114 | QString str2 = str.replace(" ",""); 115 | 116 | for(int i = 0 ;i < 10;i++) 117 | { 118 | int j = 2*i; 119 | QString str1 = str2.mid(j,2); 120 | bool ok; 121 | quint16 hex = str1.toInt(&ok,16); 122 | qDebug("%d",hex); 123 | ok = modbusDevice->setData(QModbusDataUnit::HoldingRegisters, i, hex); 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /ModbusTcpServer/ModbusTcpServer.h: -------------------------------------------------------------------------------- 1 | #ifndef ModbusTcpServer_H 2 | #define ModbusTcpServer_H 3 | 4 | #include 5 | #include 6 | #include 7 | namespace Ui { 8 | class ModbusTcpServer; 9 | } 10 | 11 | class ModbusTcpServer : public QMainWindow 12 | { 13 | Q_OBJECT 14 | 15 | public: 16 | explicit ModbusTcpServer(QWidget *parent = 0); 17 | ~ModbusTcpServer(); 18 | 19 | private slots: 20 | void on_connectButton_clicked(); 21 | 22 | void onStateChanged(int state); 23 | void updateWidgets(QModbusDataUnit::RegisterType table, int address, int size); 24 | 25 | void on_clearButton_clicked(); 26 | void handleDeviceError(QModbusDevice::Error newError); 27 | void on_writeButton_clicked(); 28 | 29 | private: 30 | Ui::ModbusTcpServer *ui; 31 | QModbusServer *modbusDevice;//QModbusClient被QModbusRtuSerialMaster和QModbusTcpClient继成 32 | }; 33 | 34 | #endif // ModbusTcpServer_H 35 | -------------------------------------------------------------------------------- /ModbusTcpServer/ModbusTcpServer.pro: -------------------------------------------------------------------------------- 1 | #------------------------------------------------- 2 | # 3 | # Project created by QtCreator 2016-08-05T11:15:00 4 | # 5 | #------------------------------------------------- 6 | 7 | QT += core gui serialbus serialport 8 | 9 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 10 | 11 | TARGET = ModbusTcpServer 12 | TEMPLATE = app 13 | 14 | 15 | SOURCES += main.cpp \ 16 | ModbusTcpServer.cpp 17 | 18 | HEADERS += \ 19 | ModbusTcpServer.h 20 | 21 | FORMS += \ 22 | ModbusTcpServer.ui 23 | -------------------------------------------------------------------------------- /ModbusTcpServer/ModbusTcpServer.pro.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | EnvironmentId 7 | {5ffcdffc-9e6e-44b7-9b2a-5e7c26a8ee61} 8 | 9 | 10 | ProjectExplorer.Project.ActiveTarget 11 | 0 12 | 13 | 14 | ProjectExplorer.Project.EditorSettings 15 | 16 | true 17 | false 18 | true 19 | 20 | Cpp 21 | 22 | CppGlobal 23 | 24 | 25 | 26 | QmlJS 27 | 28 | QmlJSGlobal 29 | 30 | 31 | 2 32 | UTF-8 33 | false 34 | 4 35 | false 36 | 80 37 | true 38 | true 39 | 1 40 | true 41 | false 42 | 0 43 | true 44 | true 45 | 0 46 | 8 47 | true 48 | 1 49 | true 50 | true 51 | true 52 | false 53 | 54 | 55 | 56 | ProjectExplorer.Project.PluginSettings 57 | 58 | 59 | 60 | ProjectExplorer.Project.Target.0 61 | 62 | Desktop Qt 5.6.1 GCC 64bit 63 | Desktop Qt 5.6.1 GCC 64bit 64 | qt.56.gcc_64_kit 65 | 0 66 | 0 67 | 0 68 | 69 | /home/maowendi/mao/Project/Qt/Qt_TCP_Modbus/build-ModbusTcpServer-Desktop_Qt_5_6_1_GCC_64bit-Debug 70 | 71 | 72 | true 73 | qmake 74 | 75 | QtProjectManager.QMakeBuildStep 76 | true 77 | 78 | false 79 | false 80 | false 81 | 82 | 83 | true 84 | Make 85 | 86 | Qt4ProjectManager.MakeStep 87 | 88 | -w 89 | -r 90 | 91 | false 92 | 93 | 94 | 95 | 2 96 | Build 97 | 98 | ProjectExplorer.BuildSteps.Build 99 | 100 | 101 | 102 | true 103 | Make 104 | 105 | Qt4ProjectManager.MakeStep 106 | 107 | -w 108 | -r 109 | 110 | true 111 | clean 112 | 113 | 114 | 1 115 | Clean 116 | 117 | ProjectExplorer.BuildSteps.Clean 118 | 119 | 2 120 | false 121 | 122 | Debug 123 | 124 | Qt4ProjectManager.Qt4BuildConfiguration 125 | 2 126 | true 127 | 128 | 129 | /home/maowendi/mao/Project/Qt/Qt_TCP_Modbus/build-ModbusTcpServer-Desktop_Qt_5_6_1_GCC_64bit-Release 130 | 131 | 132 | true 133 | qmake 134 | 135 | QtProjectManager.QMakeBuildStep 136 | false 137 | 138 | false 139 | false 140 | false 141 | 142 | 143 | true 144 | Make 145 | 146 | Qt4ProjectManager.MakeStep 147 | 148 | -w 149 | -r 150 | 151 | false 152 | 153 | 154 | 155 | 2 156 | Build 157 | 158 | ProjectExplorer.BuildSteps.Build 159 | 160 | 161 | 162 | true 163 | Make 164 | 165 | Qt4ProjectManager.MakeStep 166 | 167 | -w 168 | -r 169 | 170 | true 171 | clean 172 | 173 | 174 | 1 175 | Clean 176 | 177 | ProjectExplorer.BuildSteps.Clean 178 | 179 | 2 180 | false 181 | 182 | Release 183 | 184 | Qt4ProjectManager.Qt4BuildConfiguration 185 | 0 186 | true 187 | 188 | 189 | /home/maowendi/mao/Project/Qt/Qt_TCP_Modbus/build-ModbusTcpServer-Desktop_Qt_5_6_1_GCC_64bit-Profile 190 | 191 | 192 | true 193 | qmake 194 | 195 | QtProjectManager.QMakeBuildStep 196 | true 197 | 198 | false 199 | true 200 | false 201 | 202 | 203 | true 204 | Make 205 | 206 | Qt4ProjectManager.MakeStep 207 | 208 | -w 209 | -r 210 | 211 | false 212 | 213 | 214 | 215 | 2 216 | Build 217 | 218 | ProjectExplorer.BuildSteps.Build 219 | 220 | 221 | 222 | true 223 | Make 224 | 225 | Qt4ProjectManager.MakeStep 226 | 227 | -w 228 | -r 229 | 230 | true 231 | clean 232 | 233 | 234 | 1 235 | Clean 236 | 237 | ProjectExplorer.BuildSteps.Clean 238 | 239 | 2 240 | false 241 | 242 | Profile 243 | 244 | Qt4ProjectManager.Qt4BuildConfiguration 245 | 0 246 | true 247 | 248 | 3 249 | 250 | 251 | 0 252 | Deploy 253 | 254 | ProjectExplorer.BuildSteps.Deploy 255 | 256 | 1 257 | Deploy locally 258 | 259 | ProjectExplorer.DefaultDeployConfiguration 260 | 261 | 1 262 | 263 | 264 | false 265 | false 266 | 1000 267 | 268 | true 269 | 270 | false 271 | false 272 | false 273 | false 274 | true 275 | 0.01 276 | 10 277 | true 278 | 1 279 | 25 280 | 281 | 1 282 | true 283 | false 284 | true 285 | valgrind 286 | 287 | 0 288 | 1 289 | 2 290 | 3 291 | 4 292 | 5 293 | 6 294 | 7 295 | 8 296 | 9 297 | 10 298 | 11 299 | 12 300 | 13 301 | 14 302 | 303 | 2 304 | 305 | ModbusTcpServer 306 | 307 | Qt4ProjectManager.Qt4RunConfiguration:/home/maowendi/mao/Project/Qt/Qt_TCP_Modbus/ModbusTcpServer/ModbusTcpServer.pro 308 | true 309 | 310 | ModbusTcpServer.pro 311 | false 312 | 313 | /home/maowendi/mao/Project/Qt/Qt_TCP_Modbus/build-ModbusTcpServer-Desktop_Qt_5_6_1_GCC_64bit-Debug 314 | 3768 315 | false 316 | true 317 | false 318 | false 319 | true 320 | 321 | 1 322 | 323 | 324 | 325 | ProjectExplorer.Project.TargetCount 326 | 1 327 | 328 | 329 | ProjectExplorer.Project.Updater.FileVersion 330 | 18 331 | 332 | 333 | Version 334 | 18 335 | 336 | 337 | -------------------------------------------------------------------------------- /ModbusTcpServer/ModbusTcpServer.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | ModbusTcpServer 4 | 5 | 6 | 7 | 0 8 | 0 9 | 608 10 | 499 11 | 12 | 13 | 14 | ModbusTcpServer 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | IP端口号: 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | connect 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 接收数据: 51 | 52 | 53 | 54 | 55 | 56 | 57 | Qt::Vertical 58 | 59 | 60 | 61 | 20 62 | 108 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | Qt::Horizontal 80 | 81 | 82 | 83 | 458 84 | 20 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 清除 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 写入数据: 106 | 107 | 108 | 109 | 110 | 111 | 112 | Qt::Vertical 113 | 114 | 115 | 116 | 20 117 | 88 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 写入数据 135 | 136 | 137 | 138 | 139 | 140 | 141 | Qt::Horizontal 142 | 143 | 144 | 145 | 348 146 | 20 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 清除 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 0 166 | 0 167 | 608 168 | 25 169 | 170 | 171 | 172 | 173 | 174 | TopToolBarArea 175 | 176 | 177 | false 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | -------------------------------------------------------------------------------- /ModbusTcpServer/main.cpp: -------------------------------------------------------------------------------- 1 | #include "ModbusTcpServer.h" 2 | #include 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | QApplication a(argc, argv); 7 | ModbusTcpServer w; 8 | w.show(); 9 | 10 | return a.exec(); 11 | } 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Qt_TCP_modbus 2 | Qt5.6.1 tcp modbus code 3 | 4 | 5 | it is me! 6 | 7 | tag: 8 | the modbus tcp server and client code are changed from the modbus serial code. 9 | --------------------------------------------------------------------------------