基本信息
源码名称:modelbus协议rtu&tcp
源码大小:2.16M
文件格式:.zip
开发语言:C/C++
更新时间:2018-12-04
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 5 元×
微信扫码支付:5 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#include <QtDebug> #include <QCoreApplication> #include <QDesktopServices> #include <QUrl> #include <QTranslator> #include <QMessageBox> #include <QFileDialog> #include "QsLog.h" #include "mainwindow.h" #include "ui_mainwindow.h" #include "eutils.h" MainWindow *mainWin; MainWindow::MainWindow(QWidget *parent, ModbusAdapter *adapter, ModbusCommSettings *settings) : QMainWindow(parent), m_modbus(adapter), m_modbusCommSettings(settings), ui(new Ui::MainWindow) { //setup UI ui->setupUi(this); ui->sbNoOfRegs->setEnabled(true); ui->actionRead_Write->setEnabled(false); ui->actionScan->setEnabled(false); ui->sbStartAddress->setMinimum(m_modbusCommSettings->baseAddr().toInt()); ui->cmbBase->setCurrentIndex(m_modbusCommSettings->base()); ui->cmbFunctionCode->setCurrentIndex(m_modbusCommSettings->functionCode()); ui->cmbModbusMode->setCurrentIndex(m_modbusCommSettings->modbusMode()); ui->sbSlaveID->setValue(m_modbusCommSettings->slaveID()); ui->spInterval->setValue(m_modbusCommSettings->scanRate()); ui->sbStartAddress->setValue(m_modbusCommSettings->startAddr()); ui->sbNoOfRegs->setValue(m_modbusCommSettings->noOfRegs()); //UI - dialogs m_dlgAbout = new About(); connect(ui->actionAbout,SIGNAL(triggered()),m_dlgAbout,SLOT(show())); m_dlgModbusRTU = new SettingsModbusRTU(this,m_modbusCommSettings); connect(ui->actionSerial_RTU,SIGNAL(triggered()),this,SLOT(showSettingsModbusRTU())); m_dlgModbusTCP = new SettingsModbusTCP(this,m_modbusCommSettings); connect(ui->actionTCP,SIGNAL(triggered()),this,SLOT(showSettingsModbusTCP())); m_dlgSettings = new Settings(this,m_modbusCommSettings); connect(ui->actionSettings,SIGNAL(triggered()),this,SLOT(showSettings())); m_busMonitor = new BusMonitor(this, m_modbus->rawModel); connect(ui->actionBus_Monitor,SIGNAL(triggered()),this,SLOT(showBusMonitor())); //UI - connections connect(ui->cmbModbusMode,SIGNAL(currentIndexChanged(int)),this,SLOT(changedModbusMode(int))); connect(ui->cmbFunctionCode,SIGNAL(currentIndexChanged(int)),this,SLOT(changedFunctionCode(int))); connect(ui->cmbBase,SIGNAL(currentIndexChanged(int)),this,SLOT(changedBase(int))); connect(ui->cmbStartAddrBase,SIGNAL(currentIndexChanged(int)),this,SLOT(changedStartAddrBase(int))); connect(ui->sbSlaveID,SIGNAL(valueChanged(int)),this,SLOT(changedSlaveID(int))); connect(ui->sbNoOfRegs,SIGNAL(valueChanged(int)),this,SLOT(changedNoOfRegs(int))); connect(ui->sbStartAddress,SIGNAL(valueChanged(int)),this,SLOT(changedStartAddress(int))); connect(ui->spInterval,SIGNAL(valueChanged(int)),this,SLOT(changedScanRate(int))); connect(ui->actionClear,SIGNAL(triggered()),this,SLOT(clearItems())); connect(ui->actionRead_Write,SIGNAL(triggered()),this,SLOT(request())); connect(ui->actionScan,SIGNAL(toggled(bool)),this,SLOT(scan(bool))); connect(ui->actionConnect,SIGNAL(toggled(bool)),this,SLOT(changedConnect(bool))); connect(ui->actionReset_Counters,SIGNAL(triggered()),this,SIGNAL(resetCounters())); connect(ui->actionOpenLogFile,SIGNAL(triggered()),this,SLOT(openLogFile())); connect(ui->actionModbus_Manual,SIGNAL(triggered()),this,SLOT(openModbusManual())); connect(ui->actionEnglish_en_US,SIGNAL(triggered()),this,SLOT(changeLanguage())); connect(ui->actionSimplified_Chinese_zh_CN,SIGNAL(triggered()),this,SLOT(changeLanguage())); connect(ui->actionTraditional_Chinese_zh_TW,SIGNAL(triggered()),this,SLOT(changeLanguage())); connect(ui->actionLoad_Session,SIGNAL(triggered(bool)),this,SLOT(loadSession())); connect(ui->actionSave_Session,SIGNAL(triggered(bool)),this,SLOT(saveSession())); //UI - status m_statusInd = new QLabel; m_statusInd->setFixedSize( 16, 16 ); m_statusText = new QLabel; m_baseAddr = new QLabel(tr("Base Addr : ") "0"); m_statusPackets = new QLabel(tr("Packets : ") "0"); m_statusPackets->setStyleSheet("QLabel {color:blue;}"); m_statusErrors = new QLabel(tr("Errors : ") "0"); m_statusErrors->setStyleSheet("QLabel {color:red;}"); ui->statusBar->addWidget(m_statusInd); ui->statusBar->addWidget(m_statusText, 10); ui->statusBar->addWidget(m_baseAddr, 10); ui->statusBar->addWidget(m_statusPackets, 10); ui->statusBar->addWidget(m_statusErrors, 10); m_statusInd->setPixmap(QPixmap(":/img/ballorange-16.png")); //Setup Toolbar ui->mainToolBar->addAction(ui->actionLoad_Session); ui->mainToolBar->addAction(ui->actionSave_Session); ui->mainToolBar->addAction(ui->actionConnect); ui->mainToolBar->addAction(ui->actionRead_Write); ui->mainToolBar->addAction(ui->actionScan); ui->mainToolBar->addAction(ui->actionClear); ui->mainToolBar->addAction(ui->actionReset_Counters); ui->mainToolBar->addSeparator(); ui->mainToolBar->addAction(ui->actionOpenLogFile); ui->mainToolBar->addAction(ui->actionBus_Monitor); ui->mainToolBar->addSeparator(); ui->mainToolBar->addAction(ui->actionSerial_RTU); ui->mainToolBar->addAction(ui->actionTCP); ui->mainToolBar->addAction(ui->actionSettings); ui->mainToolBar->addSeparator(); ui->mainToolBar->addAction(ui->actionModbus_Manual); ui->mainToolBar->addAction(ui->actionAbout); ui->mainToolBar->addAction(ui->actionExit); //Init models ui->tblRegisters->setItemDelegate(m_modbus->regModel->itemDelegate()); ui->tblRegisters->setModel(m_modbus->regModel->model); changedBase(m_modbusCommSettings->base()); m_modbus->regModel->setStartAddrBase(10); clearItems();//init model ui //Update UI updateStatusBar(); refreshView(); //Logging level QsLogging::Logger::instance().setLoggingLevel((QsLogging::Level)m_modbusCommSettings->loggingLevel()); QLOG_INFO()<< "Start Program" ; } MainWindow::~MainWindow() { if (m_modbus) m_modbus->modbusDisConnect(); delete ui; QLOG_INFO()<< "Stop Program" ; } void MainWindow::showSettingsModbusRTU() { //Show RTU Settings Dialog if (m_dlgModbusRTU->exec()==QDialog::Accepted) { QLOG_TRACE()<< "RTU settings changes accepted "; updateStatusBar(); m_modbusCommSettings->saveSettings(); } else QLOG_WARN()<< "RTU settings changes rejected "; } void MainWindow::showSettingsModbusTCP() { //Show TCP Settings Dialog if (m_dlgModbusTCP->exec()==QDialog::Accepted) { QLOG_TRACE()<< "TCP settings changes accepted "; updateStatusBar(); m_modbusCommSettings->saveSettings(); } else QLOG_WARN()<< "TCP settings changes rejected "; } void MainWindow::showSettings() { //Show General Settings Dialog if (m_dlgSettings->exec()==QDialog::Accepted) { QLOG_TRACE()<< "Settings changes accepted "; m_modbus->rawModel->setMaxNoOfLines(m_modbusCommSettings->maxNoOfLines().toInt()); m_modbus->setTimeOut(m_modbusCommSettings->timeOut().toInt()); m_modbusCommSettings->saveSettings(); } else QLOG_WARN()<< "Settings changes rejected "; updateStatusBar(); } void MainWindow::showBusMonitor() { //Show Bus Monitor m_modbus->rawModel->setMaxNoOfLines(m_modbusCommSettings->maxNoOfLines().toInt()); m_busMonitor->move(this->x() this->width() 20, this->y()); m_busMonitor->show(); } void MainWindow::changedModbusMode(int currIndex) { //Change lblSlave text : Slave Addr, Unit ID QLOG_TRACE()<< "Modbus Mode changed. Index = " << currIndex; m_modbusCommSettings->setModbusMode(currIndex); m_modbusCommSettings->saveSettings(); if (currIndex == 0) { //RTU ui->lblSlave->setText("Slave Addr"); } else { //TCP ui->lblSlave->setText("Unit ID"); } updateStatusBar(); } void MainWindow::changedFunctionCode(int currIndex) { //Enable-Disable number of coils or registers QLOG_TRACE()<< "Function Code changed. Index = " << currIndex; m_modbusCommSettings->setFunctionCode(currIndex); m_modbusCommSettings->saveSettings(); const int functionCode = EUtils::ModbusFunctionCode(currIndex); QString String_number_of_coils(tr("Number of Coils")); QString String_number_of_inputs(tr("Number of Inputs")); QString String_number_of_registers(tr("Number of Registers")); switch(functionCode)//Label = Read Request, Write Request { case MODBUS_FC_READ_COILS: m_modbus->regModel->setIs16Bit(false); ui->sbNoOfRegs->setEnabled(true); ui->lblNoOfCoils->setText(String_number_of_coils); break; case MODBUS_FC_READ_DISCRETE_INPUTS: m_modbus->regModel->setIs16Bit(false); ui->sbNoOfRegs->setEnabled(true); ui->lblNoOfCoils->setText(String_number_of_inputs); break; case MODBUS_FC_READ_HOLDING_REGISTERS: m_modbus->regModel->setIs16Bit(true); ui->sbNoOfRegs->setEnabled(true); ui->lblNoOfCoils->setText(String_number_of_registers); break; case MODBUS_FC_READ_INPUT_REGISTERS: m_modbus->regModel->setIs16Bit(true); ui->sbNoOfRegs->setEnabled(true); ui->lblNoOfCoils->setText(String_number_of_registers); break; case MODBUS_FC_WRITE_SINGLE_COIL: m_modbus->regModel->setIs16Bit(false); ui->sbNoOfRegs->setValue(1); ui->sbNoOfRegs->setEnabled(false); ui->lblNoOfCoils->setText(String_number_of_coils); break; case MODBUS_FC_WRITE_MULTIPLE_COILS: m_modbus->regModel->setIs16Bit(false); if (ui->sbNoOfRegs->value() < 2) ui->sbNoOfRegs->setValue(2); ui->sbNoOfRegs->setEnabled(true); ui->lblNoOfCoils->setText(String_number_of_coils); break; case MODBUS_FC_WRITE_SINGLE_REGISTER: m_modbus->regModel->setIs16Bit(true); ui->sbNoOfRegs->setValue(1); ui->sbNoOfRegs->setEnabled(false); ui->lblNoOfCoils->setText(String_number_of_registers); break; case MODBUS_FC_WRITE_MULTIPLE_REGISTERS: m_modbus->regModel->setIs16Bit(true); if (ui->sbNoOfRegs->value() < 2) ui->sbNoOfRegs->setValue(2); ui->sbNoOfRegs->setEnabled(true); ui->lblNoOfCoils->setText(String_number_of_registers); break; default: m_modbus->regModel->setIs16Bit(false); ui->sbNoOfRegs->setValue(1); ui->sbNoOfRegs->setEnabled(true); ui->lblNoOfCoils->setText(String_number_of_coils); break; } m_modbus->setNumOfRegs(ui->sbNoOfRegs->value()); addItems(); } void MainWindow::changedBase(int currIndex) { //Change Base QLOG_TRACE()<< "Base changed. Index = " << currIndex; m_modbusCommSettings->setBase(currIndex); m_modbusCommSettings->saveSettings(); switch(currIndex) { case 0: m_modbus->regModel->setBase(EUtils::Bin); break; case 1: m_modbus->regModel->setBase(EUtils::UInt); break; case 2: m_modbus->regModel->setBase(EUtils::Hex); break; default: m_modbus->regModel->setBase(EUtils::UInt); break; } } void MainWindow::changedScanRate(int value) { //Enable-Disable Time Interval QLOG_TRACE()<< "ScanRate changed. Value = " << value; m_modbusCommSettings->setScanRate(value); m_modbusCommSettings->saveSettings(); m_modbus->setScanRate(value); } void MainWindow::changedConnect(bool value) { //Connect - Disconnect if (value) { //Connected modbusConnect(true); QLOG_INFO()<< "Connected "; } else { //Disconnected modbusConnect(false); QLOG_INFO()<< "Disconnected "; } m_modbus->resetCounters(); refreshView(); } void MainWindow::changedSlaveID(int value) { //Slave ID QLOG_TRACE()<< "Slave ID Changed. Value = " << value; m_modbusCommSettings->setSlaveID(value); m_modbusCommSettings->saveSettings(); } void MainWindow::openLogFile() { //Open log file QString arg; QLOG_TRACE()<< "Open log file"; arg = "file:///" QCoreApplication::applicationDirPath() "/QModMaster.log"; QDesktopServices::openUrl(QUrl(arg)); } void MainWindow::openModbusManual() { //Open Modbus Manual QString arg; QLOG_TRACE()<< "Open Modbus Manual"; arg = "file:///" QCoreApplication::applicationDirPath() "/ManModbus/index.html"; QDesktopServices::openUrl(QUrl(arg)); } void MainWindow::changedStartAddrBase(int currIndex) { //Change Base QLOG_TRACE()<< "Start Addr Base changed. Index = " << currIndex; switch(currIndex) { case 0: ui->sbStartAddress->setDisplayIntegerBase(10); m_modbus->regModel->setStartAddrBase(10); break; case 1: ui->sbStartAddress->setDisplayIntegerBase(16); m_modbus->regModel->setStartAddrBase(16); break; default: ui->sbStartAddress->setDisplayIntegerBase(10); m_modbus->regModel->setStartAddrBase(10); break; } } void MainWindow::changedStartAddress(int value) { //Start Address changed QLOG_TRACE()<< "Start Address changed. Value = " << value; m_modbusCommSettings->setStartAddr(value); m_modbusCommSettings->saveSettings(); m_modbus->setStartAddr(value); addItems(); } void MainWindow::changedNoOfRegs(int value) { //No of regs changed QLOG_TRACE()<< "No Of Regs changed. Value = " << value; m_modbusCommSettings->setNoOfRegs(value); m_modbusCommSettings->saveSettings(); m_modbus->setNumOfRegs(value); addItems(); } void MainWindow::updateStatusBar() { //Update status bar QString msg; if(ui->cmbModbusMode->currentIndex() == 0) { //RTU msg = "RTU : "; msg = m_modbusCommSettings->serialPortName() " | "; msg = m_modbusCommSettings->baud() ","; msg = m_modbusCommSettings->dataBits() ","; msg = m_modbusCommSettings->stopBits() ","; msg = m_modbusCommSettings->parity(); } else { msg = "TCP : "; msg = m_modbusCommSettings->slaveIP() ":"; msg = m_modbusCommSettings->TCPPort(); } m_statusText->clear(); m_statusText->setText(msg); //Connection is valid if (m_modbus->isConnected()) { m_statusInd->setPixmap(QPixmap(":/icons/bullet-green-16.png")); } else { m_statusInd->setPixmap(QPixmap(":/icons/bullet-red-16.png")); } //basr Address m_baseAddr->setText("Base Addr : " m_modbusCommSettings->baseAddr()); } void MainWindow::addItems() { //add items m_modbus->setSlave(ui->sbSlaveID->value()); m_modbus->setFunctionCode(EUtils::ModbusFunctionCode(ui->cmbFunctionCode->currentIndex())); m_modbus->setStartAddr(ui->sbStartAddress->value()); m_modbus->setNumOfRegs(ui->sbNoOfRegs->value()); QLOG_INFO()<< "Add Items. Function Code = " << QString::number(EUtils::ModbusFunctionCode(ui->cmbFunctionCode->currentIndex()),16); m_modbus->addItems(); } void MainWindow::clearItems() { //Clear items from registers model QLOG_TRACE()<< "clearItems" ; m_modbus->regModel->clear(); addItems(); } void MainWindow::request() { //Request items from modbus adapter and add raw data to raw data model int rowCount = m_modbus->regModel->model->rowCount(); int baseAddr; QLOG_TRACE()<< "Request transaction. No or registers = " << rowCount; if (rowCount == 0) { mainWin->showUpInfoBar(tr("Request failed\nAdd items to Registers Table."), InfoBar::Error); QLOG_WARN()<< "Request failed. No items in registers table "; return; } else { mainWin->hideInfoBar(); } //get base address baseAddr = m_modbusCommSettings->baseAddr().toInt(); m_modbus->setSlave(ui->sbSlaveID->value()); m_modbus->setFunctionCode(EUtils::ModbusFunctionCode(ui->cmbFunctionCode->currentIndex())); m_modbus->setStartAddr(ui->sbStartAddress->value() baseAddr); m_modbus->setNumOfRegs(ui->sbNoOfRegs->value()); //Modbus data m_modbus->modbusTransaction(); } void MainWindow::scan(bool value) { //Request items from modbus adapter and add raw data to raw data model int rowCount = m_modbus->regModel->model->rowCount(); int baseAddr; if (value && rowCount == 0) { mainWin->showUpInfoBar(tr("Request failed\nAdd items to Registers Table."), InfoBar::Error); QLOG_WARN()<< "Request failed. No items in registers table "; ui->actionScan->setChecked(false); return; } else { mainWin->hideInfoBar(); } //get base address baseAddr = m_modbusCommSettings->baseAddr().toInt(); m_modbus->setSlave(ui->sbSlaveID->value()); m_modbus->setFunctionCode(EUtils::ModbusFunctionCode(ui->cmbFunctionCode->currentIndex())); m_modbus->setStartAddr(ui->sbStartAddress->value() baseAddr); m_modbus->setNumOfRegs(ui->sbNoOfRegs->value()); //Start-Stop poll timer QLOG_TRACE()<< "Scan time = " << value; if (value){ if (ui->spInterval->value() < m_modbusCommSettings->timeOut().toInt() * 1000 * 2){ mainWin->showUpInfoBar(tr("Scan rate should be at least 2 * Timeout."), InfoBar::Error); QLOG_ERROR()<< "Scan rate error. should be at least 2 * Timeout "; } else { m_modbus->setScanRate(ui->spInterval->value()); m_modbus->startPollTimer(); } } else m_modbus->stopPollTimer(); //Update UI ui->cmbBase->setEnabled(!value); ui->cmbFunctionCode->setEnabled(!value); ui->sbSlaveID->setEnabled(!value); ui->sbStartAddress->setEnabled(!value); ui->spInterval->setEnabled(!value); ui->cmbStartAddrBase->setEnabled(!value); if (!value) changedFunctionCode(ui->cmbFunctionCode->currentIndex()); else ui->sbNoOfRegs->setEnabled(false); } void MainWindow::modbusConnect(bool connect) { //Modbus connect - RTU/TCP QLOG_TRACE()<< "Modbus Connect. Value = " << connect; if (connect) { //RTU if (ui->cmbModbusMode->currentIndex() == EUtils::RTU) { m_modbus->setSlave(ui->sbSlaveID->value()); m_modbus->modbusConnectRTU(m_modbusCommSettings->serialPortName(), m_modbusCommSettings->baud().toInt(), EUtils::parity(m_modbusCommSettings->parity()), m_modbusCommSettings->dataBits().toInt(), m_modbusCommSettings->stopBits().toInt(), m_modbusCommSettings->RTS().toInt(), m_modbusCommSettings->timeOut().toInt() ); } else { //TCP m_modbus->modbusConnectTCP(m_modbusCommSettings->slaveIP(), m_modbusCommSettings->TCPPort().toInt(), m_modbusCommSettings->timeOut().toInt()); } } else { //Disconnect m_modbus->modbusDisConnect(); ui->actionScan->setChecked(false); } updateStatusBar(); //Update UI ui->actionLoad_Session->setEnabled(!m_modbus->isConnected()); ui->actionSave_Session->setEnabled(!m_modbus->isConnected()); ui->actionConnect->setChecked(m_modbus->isConnected()); ui->actionRead_Write->setEnabled(m_modbus->isConnected()); ui->actionScan->setEnabled(m_modbus->isConnected()); ui->cmbModbusMode->setEnabled(!m_modbus->isConnected()); } void MainWindow::refreshView() { QLOG_TRACE()<< "Packets sent / received = " << m_modbus->packets() << ", errors = " << m_modbus->errors(); ui->tblRegisters->resizeColumnsToContents(); m_statusPackets->setText(tr("Packets : ") QString("%1").arg(m_modbus->packets())); m_statusErrors->setText(tr("Errors : ") QString("%1").arg(m_modbus->errors())); } void MainWindow::loadSession() { QString fName; QLOG_TRACE()<< "load session"; fName = QFileDialog::getOpenFileName(this, "Load Session file", "", "Session Files (*.ses);;All Files (*.*)"); //check if (fName != ""){ m_modbusCommSettings->loadSession(fName); //Update UI ui->sbStartAddress->setMinimum(m_modbusCommSettings->baseAddr().toInt()); ui->cmbBase->setCurrentIndex(m_modbusCommSettings->base()); ui->cmbFunctionCode->setCurrentIndex(m_modbusCommSettings->functionCode()); ui->cmbModbusMode->setCurrentIndex(m_modbusCommSettings->modbusMode()); ui->sbSlaveID->setValue(m_modbusCommSettings->slaveID()); ui->spInterval->setValue(m_modbusCommSettings->scanRate()); ui->sbStartAddress->setValue(m_modbusCommSettings->startAddr()); ui->sbNoOfRegs->setValue(m_modbusCommSettings->noOfRegs()); updateStatusBar(); refreshView(); QMessageBox::information(this, "QModMaster", "Load session file : " fName); } else QMessageBox::information(this, "QModMaster", "Cancel operation Or no file selected"); } void MainWindow::saveSession() { QString fName; QLOG_TRACE()<< "save session"; fName = QFileDialog::getSaveFileName(this, "Save Session file", "", "Session Files (*.ses)"); //check if (fName != ""){ m_modbusCommSettings->saveSession(fName); QMessageBox::information(this, "QModMaster", "Save session file : " fName); } else QMessageBox::information(this, "QModMaster", "Cancel operation Or no file selected"); } void MainWindow::showUpInfoBar(QString message, InfoBar::InfoType type) { ui->infobar->show(message, type); } void MainWindow::hideInfoBar() { ui->infobar->hide(); } void MainWindow::changeEvent(QEvent* event) { if(event->type() == QEvent::LanguageChange) { ui->retranslateUi(this); } QMainWindow::changeEvent(event); } void MainWindow::changeLanguage() { extern QTranslator *Translator; QCoreApplication::removeTranslator(Translator); Translator->load(":/translations/" QCoreApplication::applicationName() sender()->objectName().right(6)); QCoreApplication::installTranslator(Translator); }