一.前言 记录清理功能,在数据量很小的情况下,用不上,如果数据量大了的话,长年累月存储的,那就显得极其重要了,好比视频监控中的NVR存储的视频一样,一般来说存储个60天,那超过60天怎办呢,擦除早期的数据用来存储最近的数据即可.在这个气体安全管理系统中,数据量长年累月也是很大的,一般来说一个节点默认每分钟存储一个数据,如果100个节点(这个应该是保守的数量,据说应用的好多个现场有500个左右的节点,至于如何突破的modbus255个节点的限制,后面的文章会单独讲解),一天下来就是1006024=…
一.前言 数据导出一般指导出到excel表格,可能有部分用户还需要导出到pdf,因为pdf基本上不可编辑,防止用户重新编辑导出的数据,excel可能绝大部分用过电脑的人都知道,广为流行,主要就是微软的office软件和金山的wps软件,所以只要涉及到导出数据的软件,基本上默认都是导出到excel,以便领导或者其他非软件专业人士打开看数据,或者二次分析数据,Qt中没有数据导出到excel相关的类,有一些第三方开源的比如qtxlsx.libxls等,很多初学者首先选择的是用qaxobject来调用e…
自从把Qt样式表葵花宝典这个pdf文件看完以后,将所有的qss内容都轮了一遍,还写了个皮肤生成器工具,https://blog.csdn.net/feiyangqingyun/article/details/56875924自从爱上了Qt的样式,基本上任何界面,用qss+qpainter都能搞定.自从把qpainter全部研究了一遍以后,写了个自定义控件大全,https://blog.csdn.net/feiyangqingyun/article/details/53443488以前没有写过顶部…
一.前言 作为一个管理系统,数据库肯定是不可或缺的,Qt内置的sqlite数据库已经是够用的,而且本人亲测数据量能支持亿级别,而不是像网上很多人说的千万级别,我模拟过一亿多条数据,依然能够很好的查询,而且还是在一张表哦,不过单文件好大,2G多,性能上相对于几百万条,肯定要差,但是这种亿级别的情况还是很少的啦,也是建议存储到千万级别就可以的,超过的就做自动清理早期数据. 为了兼容性和拓展性,本系统除了支持默认的sqlite数据库以外,还支持mysql数据库,至于sql server数据库,Post…
一.前言 整体框架包括两个部分,一部分是UI界面框架,比如一级二级导航菜单按钮整体布局等,一部分是项目框架,上一篇文章说的是项目框架,这一篇文章来说界面框架,Qt做界面非常快速和高效,尤其是提供了可视化的界面设计,所见即所得,和大部分的开发环境类似,比如宇宙第一的VS,古老的VB,当年超级牛逼的dephi等,都是提供了可视化的所见即所得界面设计器,拖拖控件搞定,然后再去写对应的事件代码,最后编译打包发布. Qt基本上是超大型一站式GUI超市框架,你要的各种控件都有,比如按钮.标签.文本框.下拉框…
一.前言 说到项目框架,也叫代码框架,其实是非常重要的,随着编程经验的增加,相信每个程序员都会有一个自己的习惯的项目框架,这个东西跟建房子一样,先把架子搭好,然后挨个往里边填充内容,据说牛逼的架构师都是负责搭建好框架,然后安排手下的人负责编写具体的业务逻辑代码,最多再写点核心算法,一般来说至少要5年以上工作经验的牛人才有这个实力.框架搭建得好,有事半功倍的效果,搭建框架的时候就已经在考虑后期的拓展了. 我一般写Qt项目的框架,都喜欢用pri文件进行管理,pri是个好东西,其实就是个文本文件,专门…
一.前言 Qt的跨平台特性是非常厉害的,本来作为C++来说,跨平台的特性比JAVA还要好,只不过学习难度更大,所以大家更理解的跨平台是JAVA,Qt的跨平台特性是我见过的所有开发环境和语言中最厉害的,据说现在还能跑在部分MCU单片机上,本来Qt的发家起步就是在linux系统上,嵌入式linux上应用比较多,只不过最近十年来,由于安卓的迅猛发展,逐步被蚕食了一些市场,还剩一些跑安卓卡爆了的配置很低的硬件上,这些场景非Qt莫属了,完全能够胜任,个人跑过最低配置的是128MB内存256MB存储的硬件,…
一.前言 组态设计是应一个客户要求新增加进去的,设计理念就是在提供一个组态设计的初级功能,比如读取自定义控件动态库,加载所有的控件放到控件栏(有点类似qtcreator的控件栏)用户拖曳对应的控件到画布上,自动生成控件,控件可以直接在画布上拉伸大小和拖动调整位置,设置一些控件本身的属性,比如各种颜色,同时还提供用户属性设置功能,用户可以自定义很多属性绑定在这个控件上,一般来说一个控件会定义一些Q_PROPERTY的东西来讲属性暴露出来进行设置,但是毕竟是有限的,大部分的时候用户希望的是除了这些自…
一.前言 位置调整功能,以前是直接写在设备按钮这个自定义控件类中,核心就是安装事件过滤器,识别鼠标按下.鼠标移动.鼠标松开,这三个event,做出相应的处理即可,后面发现这个功能其实很多自定义控件或者widget都会使用到,需要在一个容器中拖动指定的控件,索性单独提取出来一个类专门干这个事情,后面发出开源代码. 位置调整也叫设备拖动,一般是要在设计阶段时候,运行阶段是禁用的,不然在运行阶段让操作员不小心拖动了位置,导致乱七八糟的,也不好看,所以一般的处理是要么放到系统设置中独立的位置调整模块,要…
一.前言 地图管理的主要功能是将系统中的地图文件做添加和删除,支持常见的jpg.png.bmp等格式图片,图片分辨率建议小于1080P,最好是和目标客户端电脑分辨率一致,这样在拉伸缩放的时候会比较清晰.图片建议使用鸟瞰图,有3D立体感,类似于那些卖房子售楼部的3D模型,不懂的人还以为是什么高级的技术呢,其实就是一张图片.在做很多需要地图模块的系统的过程中,总结出了几个经验,如下: 第一个是如何快速的加载图片,记得以前有个Qt大神jason写过类似的文章,看过之后才发现,原来和我的做法完全一致,核…
一.前言 类型设置这个功能模块大大拓展了整个系统的灵活性,将整个系统中所有用到的控制器型号.探测器数量.探测器型号.气体种类.气体符号都存储到数据库表中,用户在类型设置中可以自由添加删除和修改,这样后期如果增加了某个控制器.探测器等,自己添加进去即可,在控制器管理.探测器管理中对应字段的下拉框选择即可,最开始系统设计的时候没有考虑这么多,后面用户那边不断增加不同类型的设备,导致代码改来改去,极其不灵活,而且在改代码的过程中很可能不小心动到了其他代码,导致隐含的BUG出现,第二次设计的时候,类型的…
一.前言 报警联动功能不是一个常规的功能,一般是给客户定制的功能,比如探测器采集到的数据报警了,不仅本地要播放报警声音,存储报警记录,发送报警短信和邮件,还需要触发警号面板灯进行报警,而警号面板指示灯也是modbus协议485通信的,需要软件这边在指定的通信端口上发送数据点亮警号灯,而这个通信端口既可以是原来的设备所使用的端口,也可以是独立的端口,所以在做的报警联动信息表的时候,应该考虑到这个因素,报警联动信息表要存储串口号.波特率.模块地址.联动地址集合. 在绝大部分的报警联动应用场景中,可能…
一.前言 探测器在整个系统中是最核心的关键的硬件,终端节点硬件,安装有探测芯片装置,负责探测前端对应气体浓度,并记录值,等待控制器轮训数据回复,控制器信息表也是字段最多的,要存储位号.控制器名称.探测器名称.寄存器地址.型号.气体种类.气体符号.上限值.下限值.最大值.消零.量程.状态.声音.地图.存储.小数点.报警延时.报警类型.X坐标.Y坐标. 各个字段的含义如下: 编 号:节点的编号,从1开始. 位 号:探测器的位置编号,用于唯一标识一个探测器. 控 制 器:对应挂载的主设备名称. 探 测…
一.前言 控制器管理,主要就是对控制器进行添加删除和修改,其中包括编号.端口名称.控制器名称.控制器地址.控制器型号.探测器数量这几个字段,端口名称表示当前控制器所属哪个端口,一个系统中可以有好多个端口,一个端口可以对应多个控制器,一个控制器可以接多个探测器.探测器数量这个参数主要是方便下发数据的时候,提前知道要取多少个探测器的数据,组成对应的数据包下发下去,可以规避一下无效的数据,比如下面是16个探测器,就没有必要去取255个探测器的数据,取到了也没有意义,毕竟其余的全部是0,而且还增加了总线…
一.前言 所有设备的信息配置,主要就三大点:端口管理.控制器管理.探测器管理,整个硬件系统的架构是有多个不同的通信端口(主要是串口和网络),每个通信端口下面挂着多个控制器(每个控制器都有唯一的地址,从1-255),每个控制器下面挂着多个探测器(每个探测器都有唯一的地址,从1-255),这样整个系统最多能够接入的设备数量可以到255*255=65535个,而大部分的modbus系统都是255个,这样就很巧妙的突破了255个的数量限制,一个控制器下面的多个探测器数据,统一由控制器管理和上报,而上位机…
一.前言 邮件转发功能和短信告警功能基本一致,都是在判断报警后触发,可能稍微不同的是,邮件转发需要依赖互联网,而且能够发送的数据量很大,没有短信60个汉字的局限(当然短信也可以拆分多条发送,但是费钱,尽量信息控制在一条内尽可能还该最多的信息内容,在用户可以理解短信内容的情况下),邮件转发也是封装了一个类SendEmailThread,和短信转发对等,都使用的线程来发送,在本系统中,组织邮件内容的时候,特意将报警信息以表格的形式发送出去,这样接收到的报警邮件更新直观清晰,至于发送报警的间隔可调,0…
一.前言 短信告警这个模块在很多项目中都用上了,比如之前做过的安防系统,温湿度报警系统等,主要的流程就是收到数据判断属于某种报警后,组织短信字符串内容,发送到指定的多个手机号码上面,使用的是短信猫硬件设备,其实就是个短信模块,没有使用网络的发送短信的api,毕竟大部分的软件应用场景都不能要求连通外网,安全考虑,所以必须采用本地的硬件来实现发送短信.这个短信猫设备在8年前开始用过,当时用的C#去写了个纯协议解析短信的收发,后面用Qt重新写了个.特意写了个类SendMsgThread封装了所有的操作…
一.前言 在编写这个项目的过程中,有个得到客户夸赞的小功能就是,设备按钮双击,在离线的时候是双击重连设备,在线的时候是双击弹出具体详情界面,回控设备,参数设置等.在modbus设备通信过程中,设定了超时次数,如果该节点的设备连着(记住是连着,如果是第一次没回,第二次没回,第三次回了,要重置计数变量,而不是总计3次)超过3次(可设定)没有收到返回的数据,则认为是离线,下次轮询的时候自动跳过该设备,这样可以大大加快轮训速度,在很多设备的时候,难免会遇到部分线路不通了,这样系统自动过滤掉该部分设备,实…
一.前言 在各种软件系统中,数据打印也是常用的功能之一,一般来说会对查询的数据结果导出到excel,还会对查询的数据结果直接打印,在Qt中提供了打印机类QPrinter,在printsupport组件中,可以将文本内容传入QTextDocument,然后调用QTextDocument的print方法来打印数据,QTextDocument支持html格式的文本,这样拓展性就很大了,我们所知道的表格边框颜色等,都是可以用html的语法来表示,不过貌似支持的html内容不是很多,只是部分,样式也是支持…
一.前言 数据查询模块在整个系统中难度最低,由于Qt对数据库操作的封装堪称完美,所以各种查询都是手到擒来,不费吹灰之力.Qt中内置了sqlite数据库,你可以在数据库插件目录sqldrivers发现qsqlite.dll文件比较大,大概800KB左右,而qsqlmysql.dll才70KB,按道理mysql肯定比sqlite要大才对,后面查阅资料发现越来Qt源码中已经包含了sqlite的源码,编译的时候直接内置进去了.这样就大大方便用户使用sqlite数据库了,不像mysql等其他数据库还需要带…
一.前言 曲线监控模块用的很少,主要就是用来观察某个设备的实时采集的数据和历史采集的数据,可以回放数据,在右侧可以选择对应的通信端口和控制器,然后选择指定的探测器进行观察,从选择的时候开始计时,每个数据都对应一个数据点,至于采集间隔,这个在端口管理中设定的,一般来说都是1秒钟采集一次. 显示曲线图表控件,个人强烈推荐开源的qcustomplot或者qwt,Qt5.7以后集成了qchart模块也有曲线控件,个人觉得用法还是不够友好,而且很多人反映大数据量基本上歇菜,只能做一些小数据量的展示,我看过…
一.前言 地图监控主要是提供一个地图(可以是平面的也可以是立体彩色的,一般建议鸟瞰图,有3D感),然后设备在对应的地图上,可以切换地图来查看对应区域的设备,一般来说一个区域会有一个地图文件,设备在地图上实时显示当前采集到的值,还会有对应的单位,如果发生报警,对应的地图自动切换到最前面显示,设备点闪烁,发出报警声音,双击对应的设备点还可以回控设备比如进行参数设置等. 类似的功能需求在很多系统中会用到,比如安防.环境监测.温湿度监控等,这里提个小经验就是,以前实现这个功能,都是先将设备点自定义控件放…
一.前言 本项目对设备的监控有四种视图模式,可以任意切换,数据监控.地图监控.设备监控.曲线监控,其中数据监控是最常用的,所以在主界面导航中也排在第一位,综合观察分析了很多气体安全或者组态监控软件,大部分用户习惯都是有个表格一行行显示对应设备的实时数据和状态等,加上一些特殊的颜色标识,这样显得更直观,有时候还会分门别类展示. Qt提供了表格控件QTableWidget,可以直接以行列的形式展示数据,使用接口和方法也是非常友好,直接new一个QTableWidgetItem然后指定行列位置setI…
一.前言 通信协议解析是整个系统的核心灵魂,绝大部分人做软硬件通信开发,第一步估计就是写demo将协议解析好,然后再慢慢写整个界面和操作流程等,在工业控制领域,modbus协议应用还是非常广泛的,这个系统用的也是modbus协议,采用此协议可以方便的用一些第三方的组态软件接入,兼容性更强,modbus只是个协议规约标准,至于使用串口还是网络还是其他,都由厂家自行具体实现,一般正常来说,使用modbus协议的系统支持255个设备在同一个网络上进行通信,而且大部分都会采用485半双工的机制,挨个轮询…
一.前言 从这篇开始逐个写具体的功能模块,用户模块主要有四个方面,用户登录.用户退出.用户管理.权限控制.这里都按照简单的常规做法来做,比如用户登录界面,就将用户名提供下拉框选择,然后输入密码,密码框密文显示,单击登录按钮以后校验密码是否正确,超过三次错误则关闭界面,需要重新打开进行登录,一般还会在登录界面加入记住密码和自动登录两个选项,这两个选项有些人会觉得功能类似,其实含义不一样的,自动登录的话,是自动填入选择的用户名的密码,然后自动执行登录动作,而记住密码仅仅是自动填入最后一次的用户的密码…
一.前言 模拟工具在一些涉及到硬件通信的程序中特别有用,也特别需要,回顾这十年来做过的项目,95%的项目都是软硬件交互的,貌似软硬件结合的项目更有生命力一些,纯软件的或者纯硬件的,并没有那么好控制,如果是软硬件结合的,就算硬件不挣钱,还可以通过控制软件部分和服务来挣钱,而如果软件免费的话,那就必须买硬件,必须跑在这个硬件上才能最好的发挥软件效果,这样软件免费靠硬件挣钱的例子,也不少,这些年接触过形形色色几十家公司,都是类似的情况,软硬结合加上服务,这三者搭配的产品,生命力最强,可以走的更远. 回…
一.前言 设备调试核心就是将整个系统中的所有打印数据统一显示到一个模块上,一般都会将硬件通信的收发数据和对应的解析信号发出来或者qdebug出来,这个在调试阶段非常有用,可以具体追踪问题出在哪,哪个数据解析不对直接定位过去,这个模块直接留出界面进行打印查看等,可以在各种现场捕捉异常情况,让现场工程师将调试的数据保存好发给开发人员即可,帮助分析问题,因为很多时候是家里公司测试的好好的,到了现场各种千奇百怪的情况都会出现的,开发人员不可能一天到晚在各种现场跑来跑去,太浪费精力了,不如直接做好对应的设…
一.前言 云端同步功能是为了后期的拓展做准备的,他的目的就是将本地的数据库中的记录,比如实时采集到的数据以及存储的运行记录等,同步到云端数据库上,默认采用阿里云的mysql数据库,阿里云速度还是挺快的,本人买过低配和高配的阿里云服务器,高配的真是碉堡了,上面的处理速度比我本地电脑都快很多,在远程连接的桌面中,使用起来不要太爽,缺点就是费钱,我买的是按照使用时间来收费的,还是挺好的,要用的时候服务器开一下,用完了或者不用的时候关掉. 至于云端同步功能特意封装了一个通用的类DbTcpClientTh…
一.前言 在本系统中网络转发是个什么功能含义呢,其实就是将本地采集设备的所有数据打包发送到指定的网络地址,默认采用UDP的形式,无连接开销小,我也是看到很多的组态软件有这个功能,其实现有的很多的气体探测公司.环境监测公司等,都在大量的使用组态软件来做一个简单的系统提供给客户使用.这个网络转发用处很大,比如可以转发到多个网络中的客户端,层层级联,一般来说都是设备采集端作为发送端,而另外的客户端作为接收端,消除了设备采集只能独占在一个客户端上的局限,层层转发出去,多个地方可以看到实时的数据. 网络转…
一.前言 设备监控模块是地图监控模块的延伸,只不过是将设备做成一个个的独立的面板显示,类似于屏幕一样,展示的信息会更多一些,比如设备的名称型号等,有多少个设备就有多少个这样的设备面板,这个主要是针对不同的用户爱好,有些用户希望看到的是表格,可以一个屏幕看到很多设备的数据,有些用户希望看到的是地图,更有立体感,有些用户希望看到的是设备面板,拉动滚动条或者切换设备数切换对应的子设备. 设备面板是一个自定义控件,其实就是个widget,然后里边放了一些label和布局,任何widget都可以作为一个自…