From ba1e158819aab5d788701c36039436743860bee6 Mon Sep 17 00:00:00 2001 From: zcy <290198252@qq.com> Date: Tue, 3 Oct 2023 23:48:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=B0=E5=BD=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- global.h | 18 +++++++++++------- readme.md | 20 ++++++++++++-------- sub.ui | 27 ++++++++++++++++++++++++++- subform.cpp | 37 +++++++++++++++---------------------- subform.h | 8 +------- 5 files changed, 65 insertions(+), 45 deletions(-) diff --git a/global.h b/global.h index 08be4e4..c8c55da 100644 --- a/global.h +++ b/global.h @@ -13,7 +13,8 @@ extern "C"{ typedef struct { int addr; - float val1; + uint16_t *val1; + uint16_t len; QString time; bool succ; }CapData; @@ -84,11 +85,9 @@ public: QThread::msleep(300); for(auto s = 0;s < itr->req.length();s++){ - QThread::msleep(1000); int ret = modbus_read_registers(mMod,itr->req[s].addr,itr->req[s].len,dat); - mMux.lock(); bool succ = true; @@ -96,24 +95,29 @@ public: if(ret < 0){ succ = false; } + uint16_t *val = new uint16_t[itr->req[s].len]; + + memcpy(val,dat,itr->req[s].len*2); mListData[itr->addr]->push_front(new CapData{ itr->req[s].addr, - float(float(dat[0])), + val, + itr->req[s].len, QDateTime::currentDateTime().toString("yyyy-mm-dd hh:MM:ss"), true }); }else{ + uint16_t *val = new uint16_t[itr->req[s].len]; + mListData[itr->addr] = new QList; mListData[itr->addr]->push_front(new CapData{ itr->req[s].addr, - float(float(dat[0])), + val, + itr->req[s].len, QDateTime::currentDateTime().toString("yyyy-mm-dd hh:MM:ss"), succ }); } - mMux.unlock(); - } modbus_close(mMod); } diff --git a/readme.md b/readme.md index d5eb604..05b2b96 100644 --- a/readme.md +++ b/readme.md @@ -1,23 +1,27 @@ + #### 又一个modbus调试工具 +最近混迹物联网企业,发现目前缺少一个简易可用的modbus调试工具,本软件旨在为开发者提供一个简单modbus测试工具。
+主打一个代码简单易修改。
特点: - 基于QT5 - 基于libmodbus - 完全开源,代码量少 - 三方库完全跨平台,linux/windows。 -#### 功能: -本软件旨在提供一个简单modbus测试工具。 +#### 已实现功能: +当前仅实现寄存器监控功能。
+后期根据心情和捐款情况可能会逐步增加todo项功能。
+ ##### 寄存器监控功能 - -1. -2. 返回值导出 -3. 绘图 +1. 返回值导出。 +2. 单个寄存器绘图。 +3. 消息报文记录。 [![image.png](https://www.testingcloud.club/sapi/api/image_download/203b900b-61fa-11ee-8ba6-525400797f57.png)](界面) #### todo -1. 主界面配置化,退出后可以保留 -2. \ No newline at end of file +1. 配置保存为json文件,不用每次都手动指定监控项。 +2. 协议上目前仅支持RTU,增加对modbus-tcp和modbus-ascii的支持。 \ No newline at end of file diff --git a/sub.ui b/sub.ui index 33c123e..406486f 100644 --- a/sub.ui +++ b/sub.ui @@ -97,7 +97,32 @@ - + + + + + 绘图: + + + + + + + 记录 + + + + + + + + + + + + + + diff --git a/subform.cpp b/subform.cpp index a66f895..795ac83 100644 --- a/subform.cpp +++ b/subform.cpp @@ -42,7 +42,15 @@ SubForm::SubForm(QString addr,int baurate,int device_addr) int ret = gAsyncData->TakeLast(device_addr,&z); if(ret == 0){ bool succ = z->succ; - mSeries1->append(sd,z->val1); + if(this->mLines.find(z->addr) != mLines.end()){ + mLines[z->addr]->append(mLines.count() + 1,z->val1[0]); + }else{ + mLines[z->addr] = new QLineSeries; + mChart->addSeries(mLines[z->addr]); // + mLines[z->addr]->attachAxis(mAxisX); // + mLines[z->addr]->attachAxis(mAxisY); + } +// mSeries1->append(sd,z->val1); pTime.append(QDateTime::currentDateTime().toString("yyyyMMdd-hh:mm:ss")); QStandardItem *found = nullptr; @@ -65,7 +73,7 @@ SubForm::SubForm(QString addr,int baurate,int device_addr) if(found == 0){ QStandardItem *item; if(succ) - item = new QStandardItem(QString("%1").arg(z->val1)); + item = new QStandardItem(QString("%1").arg(z->val1[0])); else item = new QStandardItem(QString("ʱ")); @@ -73,11 +81,14 @@ SubForm::SubForm(QString addr,int baurate,int device_addr) QStandardItem *item1 = new QStandardItem(QString("%1").arg(z->addr)); mModel->setItem(i, 0, item1); mModel->setItem(i, 2, new QStandardItem(QString("%1").arg(z->time))); + QPushButton *button = new QPushButton(this); + ui->tableView->setIndexWidget(mModel->index(i,3),button); + button->setText("ͼ"); }else{ mModel->item(found->row(),0)->setData(QString("%1").arg(z->addr),Qt::DisplayRole); if(succ) - mModel->item(found->row(),1)->setData(QString("%1").arg(z->val1),Qt::DisplayRole); + mModel->item(found->row(),1)->setData(QString("%1").arg(z->val1[0]),Qt::DisplayRole); else mModel->item(found->row(),1)->setData(QString("ʱ"),Qt::DisplayRole); mModel->item(found->row(),2)->setData(QString("%1").arg(z->time),Qt::DisplayRole); @@ -97,7 +108,7 @@ SubForm::SubForm(QString addr,int baurate,int device_addr) qDebug()<lineEdit_2->setText(addr); gAsyncData->AddConfig(this->mConfig); - + ui->tableView->setColumnWidth(2,230); } void SubForm::on_pushButton_clicked() { @@ -179,24 +190,6 @@ void SubForm::init_charts() Qt::SolidPattern)); mAxisY->setTitleText("temperature (°C)"); - mAxisY2->setMin(0); //YΧ - mAxisY2->setMax(100); - mAxisY2->setTickCount(11); - mAxisY2->setLabelFormat("%d"); - mAxisY2->setLinePenColor(QColor(Qt::yellow)); // - mAxisY2->setGridLineColor(QColor(Qt::yellow)); - mAxisY2->setGridLinePen(QPen(Qt::white,0.1,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin)); - mAxisY2->setGridLineVisible(true); - mAxisY2->setLinePen(QPen(Qt::yellow,1,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin)); - mAxisY2->setLabelsFont(QFont("",8,18,false)); - mAxisY2->setLabelsBrush(QBrush(QColor(Qt::white), - Qt::SolidPattern)); - mAxisY2->setLabelsColor(QColor(Qt::white)); - mAxisY2->setTitleFont(QFont("",13,20,false)); - mAxisY2->setTitleBrush(QBrush(QColor(Qt::white), - Qt::SolidPattern)); - mAxisY2->setTitleText("wet %"); - mChart->addAxis(mAxisX,Qt::AlignBottom); //λmChartеλ mChart->addAxis(mAxisY,Qt::AlignLeft); mChart->addAxis(mAxisY2,Qt::AlignRight); diff --git a/subform.h b/subform.h index a0c2dcd..267bf2c 100644 --- a/subform.h +++ b/subform.h @@ -22,7 +22,6 @@ QT_END_NAMESPACE using namespace QtCharts; - class SubForm :QWidget { Q_OBJECT @@ -46,12 +45,7 @@ private: int baurate; QLineSeries *mSeries1; - QLineSeries *mSeries2; - QLineSeries *mSeries3; - QLineSeries *mSeries4; - QLineSeries *mSeries5; - QLineSeries *mSeries6; - + QMap mLines; QVector pTime;