首页 > 其他分享 >软件设计开发笔记5:QT开发三参数温室气体数据记录软件

软件设计开发笔记5:QT开发三参数温室气体数据记录软件

时间:2023-11-15 14:07:44浏览次数:37  
标签:flagAM false QT 软件设计 分析仪 开发 ui QString 数据

  最近有一个为三参数温室气体分析仪及其多通道换向阀箱编写数据记录和控制的需求。所以在这一篇中我们就来分析一下如何使用QT实现这一需求。

1、需求分析

  虽然说传递过来的需求只有“实现一个三参数温室气体分析仪及其多通道换向阀箱的数据记录和控制”这样一句话,但所有人都清楚实际需求并非表达的那么简单。所以,我们首先还是来分析一下实现这样一个软件的具体需求。
  一方面,这个软件需要获取三参数温室气体分析仪的数据并将其记录下来。那么我们就需要知道究竟需要哪些数据?这些数据需要记录成什么样的格式?这些数据是否需要处理?这些数据是否需要展现?这些数据如果展现需要以什么样的形式展现?这些问题其实都包含在需求当中,只是没有直接表达出来,或者说提出需求的人他也不知道该怎么表达出来。但是我们必须考虑这些问题。
  另一方面,这个软件需要获取多通道换向阀箱的数据并对其进行控制。同样存在上述的哪些问题需要解决。此外对于多通道切换阀的控制也要考虑具体的方式。是采用自动控制方式还是手动控制方式。如果手动控制那还要考虑具体怎么操作。如果采用自动控制方式具体的运行逻辑有什么要求。这些问题其实也是需要开率并实现的。
  至于其它如稳定性和可靠性等方面的要求基本就得按工业标准来考虑,再次不做具体讨论了。

2、设计与实现

  根据上面的分析我们来考虑如何设计这一软件。我们考虑需要获取分析仪和阀箱的数据,但从物理角度来说这是2个独立的设备,所以我们通过独立的模块来实现它。数据记录下来后,他们可能还需要对数据进行查看,所以我们在增加一个数据查询的模块。

  从外观实现上来说,我们也是在主体框架下采用3个操作页面来对应上述的3个模块。这3个界面分别为:“实时数据”、“数据查询”和“阀箱交互”,具体如下图:

软件设计开发笔记5:QT开发三参数温室气体数据记录软件_数据获取

  上述的界面能够满足数据显示、查询接操作。但对于与两台设备通讯我们还需要配置串口的相关参数,所以我们增加一个参数配置界面,具体如下所示:

软件设计开发笔记5:QT开发三参数温室气体数据记录软件_数据_02

  完成界面设计后,我们考虑功能的实现。首先是分析仪数据的获取,分析仪是RS232接口,通讯协议为厂商自定义。所以我们只需要按照厂商的协议解析数据包就可以实现数据的获取。关键是数据报文不能保证每一帧都是完整无误的,所以我们解析式需要做一些条件判断。场上的具体协议不方便发布,这里给出主要代码:

void AnalyserForm::DataParsing()
{
    QString context;

    if(rxDatas.indexOf(0x23)>=0)
    {
        rxDatas.remove(0,rxDatas.indexOf(0x23));
    }
    else
    {
        qDebug()<<rxDatas.size();
        qDebug()<<rxDatas;
        rxDatas.clear();
        return;
    }

    if((rxDatas.indexOf(0x0D)<0)||(rxDatas.indexOf(0x0A)<0))
    {
        return;
    }

    if((rxDatas.indexOf(0x0D)<433)||(rxDatas.indexOf(0x0A)<434))
    {
        rxDatas.remove(0,rxDatas.indexOf(0x0A));
        return;
    }

    QByteArrayList list=rxDatas.split(';');

    datetime=list[6].trimmed().mid(14,-1);
    co_d_ppb=DataConversion(list[7].trimmed());
    co2_d_ppm=DataConversion(list[8].trimmed());
    ch4_d_ppm=DataConversion(list[9].trimmed());
    co_ppb=DataConversion(list[10].trimmed());
    co2_ppm=DataConversion(list[11].trimmed());
    ch4_ppm=DataConversion(list[12].trimmed());
    h2o_pct=DataConversion(list[13].trimmed());
    temp_cav=DataConversion(list[14].trimmed());
    pres_cav=DataConversion(list[15].trimmed());
    temp_box=DataConversion(list[16].trimmed());

    amValues[0]=co_ppb;
    amValues[1]=co_d_ppb;
    amValues[2]=co2_ppm;
    amValues[3]=co2_d_ppm;
    amValues[4]=ch4_ppm;
    amValues[5]=ch4_d_ppm;
    amValues[6]=h2o_pct;

    ui->lineEditCO->setText(QString::number(co_ppb));
    ui->lineEditCOD->setText(QString::number(co_d_ppb));
    ui->lineEditCC->setText(QString::number(co2_ppm));
    ui->lineEditCCD->setText(QString::number(co2_d_ppm));
    ui->lineEditCH->setText(QString::number(ch4_ppm));
    ui->lineEditCHD->setText(QString::number(ch4_d_ppm));
    ui->lineEditHO->setText(QString::number(h2o_pct));

    if(rxDatas.indexOf(0x23,434)>0)
    {
        rxDatas.remove(0,rxDatas.indexOf(0x23,434));
    }
    else
    {
        rxDatas.clear();
    }
}

  在分析仪的数据展示中,我们实际上还是用了曲线的显示,所以我们需要更新数据显示,就是在数据到来时,我们更新曲线图。具体如下:

void AnalyserForm::UpdateCurveShow()
{
    bool flagAM[8]={false,false,false,false,false,false,false,false};
    QString amName[8]={"CO","CO_d","CO2","CO2_d","CH4","CH4_d","H2O","unkown"};

    if(delayNum>0)
    {
        delayNum--;
        return;
    }

    flagAM[3]=true;
    ChartHelper::ChartDisplay(amChart1,amLineSeries1,amValues,flagAM,amName);
    ui->graphicsViewCC->setChart(amChart1);

    flagAM[3]=false;
    flagAM[5]=true;
    ChartHelper::ChartDisplay(amChart2,amLineSeries2,amValues,flagAM,amName);
    ui->graphicsViewCH->setChart(amChart2);

    flagAM[1]=true;
    flagAM[5]=false;
    ChartHelper::ChartDisplay(amChart3,amLineSeries3,amValues,flagAM,amName);
    ui->graphicsViewCO->setChart(amChart3);

    flagAM[1]=false;
    flagAM[6]=true;
    ChartHelper::ChartDisplay(amChart4,amLineSeries4,amValues,flagAM,amName);
    ui->graphicsViewHO->setChart(amChart4);
}

  同时,由于存在历史数据查询的需求,所以我们还需要向数据库中写入实时数据。

  阀箱的控制及数据获取也是一样的,厂商定义有专用的通讯协议只需要按照协议发送和解析报文就可以。不过有一个自定义逻辑过程的需求,就是定义一个逻辑序列,这个序列可以设定指定的通道及持续时间,软件根据这个逻辑序列自动执行。

软件设计开发笔记5:QT开发三参数温室气体数据记录软件_数据获取_03

  我们使用一个计时器来计算持续的时间,每当计时到则判断是否进入下一步,陆续进入下一步则启动下一步,同时间计时器的时间跨度修改为该步骤需要持续的时长。

void ValveBoxForm::CycleSendData()
{
    if(!ui->checkBoxEnable->isChecked())
    {
        if(currentChannel==0)
        {
            ReadCurrentPosition();
        }

        ui->lineEditCurrentStep->setText(QString::number(0));

        return;
    }

    for (int i=0;i<72;i++)
    {
        stepIndex=stepIndex>=72?0:stepIndex;

        if(((0<preChannel[stepIndex])&&(preChannel[stepIndex]<9))&&((0<preTime[stepIndex])&&(preTime[stepIndex]<1666)))
        {
            WriteSerialData(stepIndex);
            ui->lineEditCurrentStep->setText(QString::number(stepIndex+1));
            break;
        }

        stepIndex++;
    }

    stepIndex++;

    ReadCurrentPosition();
}

  上述逻辑中最多可以执行72步的预设过程。每次从头开始执行直至最后,然后再循环执行。

3、测试与改进

  软件的实现并不复杂,我们都只需要实现厂商定义的通讯协议就可以实现操作和数据获取。接下来我们测试一下这个软件。我们需要先配置好通讯的参数,然后点击“分析仪连接”和“阀箱连接”按钮,如果串口成功打开则会显示蓝色的“分析仪已连接”和“阀箱已连接”。

  接收到的分析仪数据解析后会显示到数据框和数据曲线。这里我们连接分析仪一段时间后其结果如下:

软件设计开发笔记5:QT开发三参数温室气体数据记录软件_数据获取_04

  界面从上到下是二氧化碳的曲线和数值、甲烷的曲线和数值、一氧化碳的曲线和数字值以及水含量的曲线和数值。可以看出软件实现了获取分析仪数据的需求,并且运行良好。

  运行一段时间后我们就可以查看历史数据,选择起始时间和结束时间,然后点击“数据查询”按钮即可检索历史数据,结果如下所示:

软件设计开发笔记5:QT开发三参数温室气体数据记录软件_数据获取_05

  数据查询的时间跨度限定在一个小时以内,如果设置的时间超过1小时则只会显示从起始时间开始的1小时的数据,余下的数据不会显示在数据表中。

  阀箱在建立连接后,软件会获取阀箱的数据,并显示在界面当中。我们在“目标通道”输入框中输入1~8的任意数字,然后点击“手动切换”按钮可实现阀门通道切换。如我们在目标通道”输入框中输入1,然后点击“手动切换”按钮将阀门切换到通道1,具体如下图显示:

软件设计开发笔记5:QT开发三参数温室气体数据记录软件_数据_06

  上图的表格中显示的是预置的运行逻辑,用于自动状态时操作。选中“自动循环”复选框会启动自动操作,按照表格中设定的逻辑运行。我们在这里选中“自动循环”复选框,软件次序按照表中的排序进行。

4、开发总结

  这一篇中,我们设计了一个可以实现三参数温室气体分析仪数据获取和阀箱操作及数据获取的软件。该软件涉及到串口通讯、文件操作、数据库操作、曲线显示及定时器操作等主要功能。
  我们在开发之后对软件进行的实际应用,功能上基本以及实现了用户提出的所有需求,但性能上还是可以提高的。比如对异常数据的处理,对曲线显示的处理等还是可以进一步细化的。

欢迎关注:

软件设计开发笔记5:QT开发三参数温室气体数据记录软件_数据获取_07

如果您希望更方便且及时的阅读相关文章,也可以扫描上方二维码关注我的微信公众号【木南创智




标签:flagAM,false,QT,软件设计,分析仪,开发,ui,QString,数据
From: https://blog.51cto.com/u_520887/8389992

相关文章

  • android开发Flutter Text自动换行实现
    flutter自动换行处理flutter自动换行有几种场景:column中,row中在Column中的Text不用任何处理,能够自动换行。在Row中的Text需要用Expanded包裹。因为文字是水平方向排放的,和Row的计算规则冲突,需要使用Expanded包裹,表示剩下的给Text,Text自然知道自身宽度,才能实现自动换行。Row(cro......
  • 在表格开发中,如何选择适合自己的处理工具?
    引言GcExcel和EasyExcel都是卓越的高性能Excel处理库。GcExcel是由葡萄城公司开发,可用于Java和.Net平台;而EasyExcel是阿里巴巴开发的基于Java的开源Excel处理库。在本文中,我们将对GcExcel和EasyExcel进行比较,帮助读者在实际场景中做出明智选择。EasyExcel与GcExcel的区别每个产品......
  • QT环境变量
    exportQT_DIR=/userdata/bin/qtlibexportQT_QPA_PLATFORM=eglfsexportQT_QPA_EGLFS_INTEGRATION=eglfs_kmsexportQT_QPA_EGLFS_KMS_PLANE_INDEX=1exportQT_QPA_EGLFS_ALWAYS_SET_MODE=1exportQT_QPA_EGLFS_NO_LIBINPUT=1exportQT_LOGGING_RULES='qt.qpa.*=false&#......
  • 苹果iOS系统有几种开发者账号,分别有什么区别,我们该如何选择
    我们常见的开发者账号就是三种:个人开发者账号、公司开发者账号和企业开发者账号之外,当然除了这三种还有另外的如教育机构开发者账号和政府机构开发者账号,通过今天的这篇文章可以更清晰的了解并选择自己的需求。在移动开发领域中,苹果已经发展成最强大的平台之一,苹果为了支持开发者构......
  • 信用卡额度生成器在线使用,用户输入信息自动绘图,e4a开发的APP代码
    e4a本身的标签是支持透明的,所以要实现这个效果那就再简单不过了,但是提前你需要找好一个模版,这个也是网上我找的一个图,提前用工具消除了带水印带信息的部分,然后把干净的图片载入到assets资源库里面,然后在导入到生成窗口的图片框里面,图片上面加了e4a的透明标签,然后针对安卓分辨率做......
  • 本地MQTT协议消息服务远程连接教程介绍
    Mosquitto是一个开源的消息代理,它实现了MQTT协议版本3.1和3.1.1。它可以在不同的平台上运行,包括Windows、Linux、macOS等。mosquitto可以用于物联网、传感器、移动应用程序等场景,提供了一种轻量级的、可靠的、基于发布/订阅模式的消息传递机制。MQTT协议远程访问的好处在于它可以......
  • 贷款额度生成器,支持信用卡APP版,虚拟截图E4a开发,仅提供源码
    闲着无聊用易安卓开发了一个额度生成器,原理非常简单,就网上找了一个模版,加了几个编辑框,用PS消除了原有的信息内容,在上面加了一些标签,实现用户输入确定按钮后改变图片上的标签内容,下面是框架图:框架界面图:  生成框架图:  代码:【e4a】:==================================......
  • Qt 如何配置CLion标准控制台输出?
    CMake相关问题:即CMakeLists.txt文件中,在add_executable添加了WIN32。即当使用了WIN32标识后,就去掉了控制台,那么自然就没有信息打印出来了。#forexampleadd_executable(${PROJECT_NAME}WIN32${_SRC_FILES}${_PLATFORM_SRC_FILES}${_UI_FILES}${_RES_FIL......
  • 国产企业级低代码开发哪个最好?这一款超好用
        低代码开发平台(Low-codeDevelopmentPlatform)正在迅速崛起,成为未来软件技术发展的主导趋势。通过使用低代码开发平台,企业能够显著提高开发效率,降低对专业开发人员的依赖,并实现更快速的软件交付和使用。这种新型的开发方式为非技术人员提供了便捷的可视化工具,让他们也......
  • HDMI输入SIL9293C配套NR-9 2AR-18的国产GOWIN开发板
     ......