V20220625
V20220522
V20220508
V20220428
V20190712
V20190624

系统启动后,首先会弹出用户登录界面,从用户姓名的下拉框选择用户名,然后输入密码(默认用户名密码都是admin),单击登录按钮,密码正确则会进入到系统主界面,错误会弹出提示,错误超过三次自动关闭,需要重新打开软件。
在登录界面可以勾选是否记住密码,是否自动登录,如果勾选了记住密码,则下次启用软件会自动填入最后用户的密码,勾选了自动登录(以最后的用户信息作为当前登录用户)则启动后直接进入主界面。如果开启了自动登录,不会弹出登录界面,可以在系统设置中关闭自动登录和记住密码。

在主界面单击右上角的关闭按钮,会弹出用户退出界面,需要输入密码验证防止误关闭,会自动填入登录的用户名,密码输入正确才会退出软件。用户登录和退出都内置了超级密码a防止管理员忘记密码。


基本设置中有部分参数的切换会自动重启应用。
参数说明
工作模式

参数说明
其他说明
x1//数据库类型枚举2enum DbType {3 DbType_ODBC = 0, //odbc数据源4 DbType_Sqlite = 1, //sqlite数据库5 DbType_MySql = 2, //mysql数据库6 DbType_PostgreSQL = 3, //postgresql数据库7 DbType_SqlServer = 4, //sqlserver数据库8 DbType_Oracle = 5, //oracle数据库9 DbType_KingBase = 6, //人大金仓数据库10 DbType_Other = 255 //其他数据库11};12
13//自动切换默认数据库端口14void DbHelper::getDbDefaultInfo(const QString &dbType, QString &hostPort,15 QString &userName, QString &userPwd)16{17 if (dbType == "MYSQL") {18 hostPort = "3306";19 userName = "root";20 userPwd = "root";21 } else if (dbType == "SQLSERVER") {22 hostPort = "1433";23 userName = "sa";24 userPwd = "123456";25 } else if (dbType == "POSTGRESQL") {26 hostPort = "5432";27 userName = "postgres";28 userPwd = "123456";29 } else if (dbType == "ORACLE") {30 hostPort = "1521";31 userName = "system";32 userPwd = "123456";33 } else if (dbType == "KINGBASE") {34 hostPort = "54321";35 userName = "SYSTEM";36 userPwd = "123456";37 }38} 
参数说明

参数说明

网络转发的功能,是用来将本地的采集的所有设备的数据,通过UDP协议转发到指定的IP和端口,对方只要开启网络接收即可查看到设备的实时运行数据。网络转发和网络接收不能同时开启,本地负责采集的软件开启网络转发,远程需要查看数据的电脑开启网络接收,转发的端口和接收的端口必须保持一致,支持多个IP,中间用英文的分号 ; 隔开。单击同步数据的按钮会将本地的端口+设备+节点信息传送到接收端,不需要手动设置。这样就保证了本地的信息和远程的信息完全一致。远程的IP必须保证可达,比如ping的通。
参数说明

当探测器发生报警后,如果开启了短信告警,会将报警信息以短信的形式发送到预先设定的接收者的手机号码上,短信内容格式为:位号: AT400001 控制器: 控制器A 探测器: 探测器A 触发值: 70.8 PPM 类型: 浓度上限报警 时间: 2019-01-05 12:12:12。需要本地发短信的硬件支持。
参数说明

当探测器发生报警后,如果开启了邮件转发告警,会将报警信息以邮件的形式发送到预先设定的接收者的邮箱中,邮件内容格式为:位号: AT400001 控制器: 控制器A 探测器: 探测器A 触发值: 70.8 PPM 类型: 浓度上限报警 时间: 2019-01-05 12:12:12。后期会将警情统计的报表数据以excel表格的形式发送到接收者邮箱。如果发现邮箱登录失败等,请先在邮箱后台设置开启smtp和pop3。
参数说明

用来设置本地电脑的系统时间,为什么需要这个设置,因为软件很可能在嵌入式linux上运行,需要手动设置时间。

参数说明

参数说明

本系统支持串口接入和网络接入两种方式,对应的端口需要提前设置,后期可能还会新增mqtt等方式,选择不同的协议类型即可。
字段说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个端口信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

字段说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个控制器信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

字段说明
报警类型
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个探测器信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

在报警联动设置中,可以设置每个位号报警后,对应的继电器联动,支持探测器串口和新独立的串口(如果是和探测器并用的串口则不会重新打开串口,直接用原有的串口发数据联动,如果是新的串口则会重新打开串口),模块地址为继电器板子的地址,联动地址集合为需要联动报警的位,支持多个,多对多关系,一个探测器报警可以联动多个联动模块上的多个继电器地址,中间丨杠隔开。
字段说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个联动信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

参数说明
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个类型信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

用户管理是后面增加的一个模块,用于设置不同的用户不同的类型+权限,可以细分到每个模块的权限,勾选表示具有该权限,内置了7种权限选择,后期还可以在此基础上增加其他权限等。
单击添加按钮,会自动规则生成默认的信息,直接表格中修改即可,修改好以后单击保存按钮保存所有的信息。
如果要删除某个用户信息,需要先选中该行,然后单击删除按钮,删除后会自动保存。不允许删除内置的admin用户。
单击清空按钮会对整个表进行清空操作,清空后数据不能恢复,慎用。
单击导入按钮,可以选择之前导出的csv格式的文件导入数据。
单击导出按钮,将表格数据导出到csv格式的文件,用户可以打开文件编辑,然后再次导入,这样可以作为简易的备份机制使用,也可将繁琐的基础数据录入交给小姑娘去做。

单击打印按钮可以将表格中的内容打印出来,打印前会弹出打印预览界面,可以自行做边距的调整等,可以查看等待打印的内容,翻页切换。

单击导出按钮可以将表格中的内容导出到excel表格,独创的excel导出数据算法,极速导出,支持任意系统,无依赖。

假设设置了用户没有系统设置和删除记录的权限,则关闭系统的时候会弹出错误信息提示当前用户没有权限。

在地图管理中,可以导入和删除地图。

位置调整中,可以拖动探测器到正确的位置,右侧单击地图切换可以看到对应的该地图对应的探测器,全部位置调整好之后,单击右下角保存按钮即可,会立即应用。

组态设计模块中提供的是简单的示例,演示如何加载自定义控件动态库、将控件拖曳到背景地图上,配置好对应控件的属性,可定义用户属性,可导出控件的配置信息到xml文件,并支持导入xml文件自动加载上次保存的控件配置信息。目前是一个简单的组态雏形,等后期架构好如何应用再重写整个模块。
本系统默认不包括里面控件的源码,提供动态库的形式使用,如果还想学习自定义控件大全的源码(目前共202个控件卖700元),需要额外单独购买。

可以自行选择通讯端口+设备名称进行数据的过滤,可查看所有的通信数据。不同收发数据不同颜色,还可以指定关键字过滤数据,每个收发数据都有对应的中文解释。能够很方便的对运行中的系统查看设备数据,规避是下位机还是上位机问题扯皮的事情。

设备监控界面主要包括4个模块,分别是数据监控、设备面板、地图监控、曲线监控,设备的实时数据可以同时反应到四个模块上面,相当于以4种不同的表现形式展现采集到的数据。
模式说明

本页面会是使用频率最高的页面,默认就是停留在本页面实时查看所有探测器的数据。左侧为警情信息栏,分别显示时间、位号、报警值。如果有探测器报警,则消息自动追加到最前面。 表格依次显示序号、位号、控制器名称、控制器型号、探测器名称、探测器型号、气体种类、浓度值、气体符号。
面板说明




本页面以地图的形式显示所有探测器,右侧单击对应地图可以手动切换地图,当探测器报警后会自动切换到当前地图,探测器图标红色闪烁,探测器图标实时显示当前的浓度值。双击探测器按钮图标,会跳转到该探测器的详细信息界面,在该界面上后期可以按照实际用户需求定制回控操作。
在本页面可以查看某个探测器的实时曲线,第一步先选择通信端口,第二步选择控制器,第三步选择探测器,然后就可以在左侧看到实时曲线,颜色可以在系统设置中设置。单击打印按钮会将当前曲线以截图的形式打印出来。勾选暂停显示记录数据复选框会暂停显示当前的数据。


在本页面,可以指定日期范围查询报警记录,还可以查询单个的控制器或者探测器的报警记录。也可以手动输入探测器的位号进行查询,下拉选择探测器后会自动填入位号。还可以选择报警类型(浓度上限报警、浓度下限报警)查询对应的类型,也可以输入报警值进行精准查询。
如果数据超过一页,会自动分页处理,单击右侧的上一页、下一页、第一页、末一页进行翻页查看,所有查询的数据可以导出到excel表格,也可以直接打印。单击删除按钮会弹出时间范围选择框,选择该时间段后确定,会删除该时间段的所有记录。
双击对应的报警记录可以打开警情确认对话框,重新填写确认意见,鼠标右键弹出删除记录菜单,可以删除当前选中的记录,支持多选,例如按住Ctrl键选择多个记录。



在本页面,可以指定日期范围查询运行记录,还可以查询单个的控制器或者探测器的运行记录。也可以手动输入探测器的位号进行查询,下拉选择探测器后会自动填入位号。
如果数据超过一页,会自动分页处理,单击右侧的上一页、下一页、第一页、末一页进行翻页查看,所有查询的数据可以导出到excel表格,也可以直接打印。单击删除按钮会弹出时间范围选择框,选择该时间段后确定,会删除该时间段的所有记录。



所有的用户操作都会记录到系统数据库,包括清空报警记录、删除记录、清空报警信息等操作。可以在本界面选择时间段范围查询,也可以选择日志类型(用户操作、设备上报)进行查询。
如果数据超过一页,会自动分页处理,单击右侧的上一页、下一页、第一页、末一页进行翻页查看,所有查询的数据可以导出到excel表格,也可以直接打印。单击删除按钮会弹出时间范围选择框,选择该时间段后确定,会删除该时间段的所有记录。









| 地址 | 功能码 | 寄存器地址 | 寄存器个数 | CRC校验 |
|---|---|---|---|---|
| 01 | 03 | 00 00 | 00 04 | 44 09 |
| 地址 | 功能码 | 长度 | 数据位1 | 数据位2 | 数据位3 | 数据位4 | CRC校验 |
|---|---|---|---|---|---|---|---|
| 01 | 03 | 08 | 00 00 | 00 00 | 00 00 | 00 00 | 95 D7 |
| 设备型号 | 长度 | 说明 |
|---|---|---|
| FC1003-1 | 01 | |
| FC1003-8 | 08 | |
| FC1003-16 | 08 08 | 相当与两台FC1003-8,设备地址不同。 |
| FC1003显示板 | 40 | 长度根据所接设备数量不同需要调整,最大为64个。 |
| FC1003底板 | 04 | |
| FT2104P | 01 | |
| SAMS-4128 | 08 |
提示说明
示例数据1
示例数据2
示例数据3
| 发送 | 返回 | 说明 |
|---|---|---|
| 01 03 00 00 00 01 84 0A | 01 03 02 00 00 B8 44 | 读取设备状态 |
| 01 06 00 00 00 01 48 0A | 01 06 00 00 00 01 48 0A | 打开继电器1 |
| 01 06 00 00 00 03 C9 CB | 01 06 00 00 00 03 C9 CB | 打开继电器1、2 |
| 01 06 00 00 00 07 C8 08 | 01 06 00 00 00 07 C8 08 | 打开继电器1、2、3 |
| 01 06 00 00 00 06 09 C8 | 01 06 00 00 00 06 09 C8 | 关闭继电器1 |
| 01 06 00 00 00 04 88 09 | 01 06 00 00 00 04 88 09 | 关闭继电器1、2 |
| 01 06 00 00 00 00 89 CA | 01 06 00 00 00 00 89 CA | 关闭继电器1、2、3 |











本系统采用模块化的设备,有用到第三方开源类库比如串口通信qextserialport,全部放在3rd下面,有用到很多自己封装完善的通用类库比如数据导入导出组件,全部放在core下面,设备通信和辅助处理全部放在class下面,所有界面全部放在ui下面,相当于一个个小的组件合起来,最终形成了整个监控系统的完整代码。
| 名称 | 说明 |
|---|---|
| 3rd | 一些第三方开源的类库,比如串口通信qextserialport。 |
| class | 存放系统初始化、样式控制、自定义控件、设备通信等。 |
| core | 本人一直持续更新完善的通用的类库,比如数据导入导出组件。 |
| ui | 所有的界面都分门别类放在这里。 |

这里放的全部是第三方开源的轮子,感谢开源、感谢github、gitee等开源社区。具体代码不做过多说明,网上会有很多介绍和使用说明。
| 名称 | 说明 |
|---|---|
| 3rd_qcustomplot | 第三方精美图表控件qcustomplot,Qt自带的qchart功能有限而且不支持大量数据。 |
| 3rd_qextserialport | 第三方串口通信qextserialport,这个类比较稳定可靠,经过了几十个项目持续数十年运行的考验,不用Qt自带的串口类。 |
| 3rd_qtpropertybrowser | 第三方属性控件,指定控件自动读取对应的属性形成属性栏。 |
| 3rd_smtpclient | 第三方发送邮件组件,走底层socket协议发送邮件。 |

这里放的都是一些系统初始化、设备通信相关的类。
| 名称 | 说明 |
|---|---|
| api | 存放数据库表映射成对应的全局队列数据、数据库查询类,告警短信转发及告警邮件转发类。 |
| app | 全局配置参数管理类、全局变量类、全局事件转发器,通用函数等。 |
| device | 设备通信管理,比如设备采集处理、数据库采集、报警联动等。 |
| usercontrol | 当前系统的用到的自定义控件全部放在这里,项目通用的自定义控件放在core_control中。 |
| 名称 | 说明 |
|---|---|
| dbdata | 将数据库表映射到全局变量数据队列,比如将端口信息表portinfo转成QStringList存放一行行数据,这样在程序中运算比较速度极快,直接内存比较,不用每次都去读取数据库。 |
| dbquery | 所有的数据库查询插入更新等操作都在这里,比如查询探测器信息表、控制器信息表、插入日志记录等。 |
| sendserver | 通用的发送短信和邮件管理类,因为发送的内容是一致的所有统一一个类来管理,调用同一个函数就行。 |

| 名称 | 说明 |
|---|---|
| appconfig | 配置参数类,整个系统的配置参数存放在ini文件中,跨平台,所有参数都对应一个变量,读取配置参数的时候将值赋值给变量,写入的时候将变量值写入到配置文件。 |
| appdata | 全局变量类,系统中无可避免需要一些全局变量方便处理,都放在此类,比如版本号、当前用户信息、地图宽度高度、左侧右侧顶部底部宽高等。 |
| appevent | 全局事件转发类,系统越复杂信号需要传递的层级越多,所以需要一个全局事件转发类,用来中转这些事件,这样永远只需要两层就可以收到信号进行处理,而且整个系统看起来干净整洁,不会说一个信号传递到了N个地方乱七八糟,建议需要跨层级传递的信号都放在这里中转。比如软件退出信号,可能多个界面需要收到退出信号进行保存和其他处理,如果从关闭界面发出信号传递给需要的界面,那不知道要中间层层传递多少次,有了这个全局事件转发类,你只需要将事件传给appevent,需要接收事件的地方关联这个信号就行,appevent为全局单例类,整个系统唯一。 通用的一些信号有软件退出、全局样式改变、主窗体变化(0-最小化 1-最大化 2-恢复 3-关闭 4-移动 5-尺寸变化)等。 |
| appinit | 程序初始化类,在main函数中,会先执行这个初始化的类,比如初始化皮肤、字体、数据库、样式等操作,这些都是要优先在窗体加载前执行的,执行完毕以后再打开窗体主界面。 |
| appstyle | 全局样式管理类,整个系统的样式全部放在这里,一般加载流程是先读取样式表文件,然后将本系统独特的样式(比如开关按钮、视频监控、云台仪表盘)内容追加到后面,最后统一设置全局样式,在main函数中加载,和appinit类一样放在最前面执行。 |
| 名称 | 说明 |
|---|---|
| alarmlink | 报警联动处理类,探测器报警后,根据联动设置中设置的规则,将发送联动指令到总线上的设备。 |
| dbreceive | 数据库采集类,通过数据库采集的方式来读取设备的状态和值,系统默认是设备采集,通过485总线modbus协议等去轮询设备的状态,为了拓展兼容性,还有一种场景是用户自己有自己的采集和算法,然后将结果存储到了数据库表中,需要用UI界面将数据库中的值展现出来。 |
| deviceclient | 设备采集类,本系统的核心,所有的通信解析都在此类中,因为数据内容格式一致,所以串口和网络通信收发都放在一起,这样解析起来完全一致。 |
| devicedata | 获取采集发送指令类,为了应对不同的场景,针对不同的工作模式,会有发送不同的采集指令。 |
| devicehelper | 整个系统设备管理辅助类,比如插入窗口消息、加载设备列表、加载图片地图、加载设备按钮等。 |
| devicemap | 设备图片地图管理类,相当于一次性加载所有图片到内存,当要切换或者显示的时候,直接从内存取出来设置即可,速度极快,瞬间相应,纯粹是为了加快相应速度以及可能在图片上进行绘制增加的功能,比从文件系统读取图片文件显示快N倍。 |
| deviceserver | 设备通信服务类,对应上面的deviceclient类,这里面负责从数据库查询有多少个端口和设备,实例化对应的client,关联信号进行统一的处理,同时还包括定时器处理记录的存储,定时器处理报警等。 |
| udpreceive | 数据转发UDP接收端,接收到转发的数据以后解析并反映到界面上。 |
| udpsend | 数据转发UDP发送端,负责将采集到的数据转发出去。 |
| 名称 | 说明 |
|---|---|
| gaugecar | 汽车仪表盘,用来指示气体的值。 |
| gaugespeed | 速度仪表盘,用来指示气体的值。 |
| selectwidget | 描点跟随窗体控件,用在属性设计过程中拖曳控件,然后拉伸拖动。 |

这里放的全部是个人一直持续更新完善的独创的轮子,所有的项目都公用这些轮子,用到哪个就包含哪个进来,更新只需要更新轮子代码就行。
| 名称 | 说明 |
|---|---|
| core_common | 通用函数,包括通用秘钥、通用导航、通用样式、声音播放、日志记录、运行时间记录等。 |
| core_control | 通用自定义控件,很多系统经常用到的控件全部放在这里,比如开关按钮、设备容器、设备按钮、颜色下拉框等。 |
| core_customplot | 继承自qcustomplot类的自定义图表组件,同时兼容各种qcustomplot版本,这样就可以在任意的Qt版本使用图表控件。 |
| core_dataout | 数据导入导出到xls/pdf和打印类库,极速、跨平台、无依赖。 |
| core_db | 数据库通用类库比如数据库线程管理、数据清理、数据采集等。 |
| core_form | 通用的窗体相关的组件,包括用户登录、用户退出、用户管理、权限管理、数据库管理,同时还包括封装的项目上直接用的导入导出、打印等。 |
| core_qui | 通用的辅助类,包括自定义对话框,全局辅助函数,图形字体等。 |
| core_send | 多线程短信发送和邮件发送类,功能类似所有放在一起。 |

| 名称 | 说明 |
|---|---|
| base64helper | 图片及文字和base64编码之间转换的类。 |
| commonkey | 通用秘钥管理类,指定校验秘钥文件,可设置运行时间、设备数量等限制,支持根据硬件指纹特征生成机器码文件等。 |
| commonnav | 通用菜单导航管理类,用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到,所以封装成一个专门管理这个的类。 |
| commonstyle | 通用样式管理类,比如Qt自带类窗体样式、自定义控件样式、分页导航样式、导航按钮样式、开关按钮样式等。相当于将多个项目常用的自定义样式封装一起做成通用。 |
| framelesswidget2 | 无边框窗体拉伸类,边框四周八个方位都可以自由拉伸,可设置是否允许拖动和拉伸。 |
| playwav | 声音文件播放类,通用Qt456,自动识别当前Qt版本使用对应的类,Qt4采用QSound,Qt5以上采用QSoundEffect,嵌入式采用对应的命令行aplay、mpv来播放。 |
| savelog | 日志钩子类,将系统中所有的打印信息转为日志存储或者输出到网络等,可以开启用来打印输出日志信息。 |
| saveruntime | 保存运行时间类,用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久,方便分析问题。 |

| 名称 | 说明 |
|---|---|
| bottomwidget | 通用底部状态栏控件,可以设置软件名称、版本号、运行时间等。 |
| colorcombobox | 颜色下拉框控件,在系统设置中有。 |
| cpumemorylabel | CPU和内存使用情况标签控件,主界面右上角显示。 |
| customtitlebar | 停靠窗体自定义标题栏控件。 |
| devicebutton | 设备按钮控件,比如图片地图模块中用到,可设置不同的图标样式和状态等,双击发出信号进行相应处理比如弹出对应窗体等。 |
| lcddatetime | 软件右上角显示时间的控件。 |
| panelwidget | 面板容器控件,主界面子模块表格消息,就用到此控件,用于将一堆widget放到此容器进行管理,自动形成滚动条等。 |
| switchbutton | 开关按钮控件,在系统设置中存在大量该控件。 |
| xslider | 滑动条控件,在原有滑动条基础上增加了鼠标按下立即定位等。 |

| 名称 | 说明 |
|---|---|
| customplot | 自定义图表控件主类,使用的时候只要new这个类就行。 |
| customplotbarh | 自定义形状-横向柱状图。 |
| customplotbarv | 自定义形状-垂直柱状图。 |
| customplothead | 当前组件通用头文件。 |
| customplothelper | 当前组件通用辅助函数文件。 |
| customplotline | 自定义形状-平滑曲线图。 |
| customplottracer | 自定义图层绘制十字线,也叫游标,定位线。 |
| smoothcurve | 平滑曲线算法类,内置多种平滑算法,可以自行增加其他算法。 |

| 名称 | 说明 |
|---|---|
| datacreat | 通用数据报表内容创建类,比如生成表格格式的html内容,然后赋值给dataprint直接打印,里面举例了图文混排的报告内容,后期会不断增加其他模板,也可以自行增加其他模板数据。 |
| datacsv | 导入导出数据,csv格式,可设置分隔符。拓展名。过滤条件等。 |
| datahead | 当前组件通用头文件。 |
| datahelper | 辅助类,比如校验规则函数,通用数据导出+打印函数。 |
| dataprint | 数据打印到pdf及纸张,支持多线程。 |
| dataxls | 数据导出到xls类,支持多线程导出。 |

| 名称 | 说明 |
|---|---|
| dbcleanthread | 自动清理数据线程类。 |
| dbconnthread | 数据库通信管理线程类。 |
| dbdelegate | 自定义委托全家桶,包括复选框、下拉框、密码框、按钮等。 |
| dbhead | 当前组件通用头文件。 |
| dbhelper | 各种数据库应用函数封装,比如初始化数据库、执行sql语句等。 |
| dbhttpthread | 网络请求数据采集类。 |
| dbpage | 数据库通用翻页类。 |
| dbpagemodel | 数据库翻页类数据模型。 |
| navpage | 分页导航控件。 |

| 名称 | 说明 |
|---|---|
| formhelper | 封装的导入导出、导出数据到xls/pdf和打印数据、自动备份数据、保存最后打开的文件夹等。 |
| frmconfigdb | 通用数据库管理界面类,可选不同的数据库类型,填入用户信息,执行检测连接和初始化数据操作。 |
| frmconfiguser | 通用用户管理界面类,可添加、删除、修改用户信息,包括权限分配等,可导入导出打印用户信息。 |
| frmlogin | 通用用户登录界面类,包括自动登录和记住密码复选框,多次密码错误校验,记住当前用户信息等。三次错误关闭,下拉可选用户,内置超级密码。 |
| frmlogout | 通用用户退出界面类,三次错误关闭,下拉可选用户,内置超级密码。 |
| userhelper | 通用用户权限管理类,内置7种类型权限,对应权限名称可自定义,一般在用户切换对应界面或者单击了对应功能按钮的时候触发。 |

本组件涵盖的功能较多,所以采用了分层管理代码结构。
| 名称 | 说明 |
|---|---|
| iconhelper | 万能图形字体类,可传入多种图形字体文件,一个类通用所有图形字体。 |
| quiconfig | 存储当前组件的配置参数信息,比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。 |
| quihead | 当前组件通用头文件。 |
| quistyle | 当前组件通用样式设置管理类,可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里,统一管理。 |
| 名称 | 说明 |
|---|---|
| quiabout | 关于系统对话框,可传入软件标题、版本、版权、网址等信息。 |
| quidateselect | 自定义日期范围选择对话框。 |
| quiinputbox | 自定义输入框窗体,可指定不同的输入类型比如文本框、下拉框等。 |
| quimessagebox | 自定义信息消息框窗体,可设置关闭倒计时,不同的类型比如信息框、询问框、错误框等。 |
| quisplash | 自定义弹出提示信息,提示完自动消息关闭。 |
| quitipbox | 自定义右下角信息对话框,可设置对齐方式、关闭倒计时等。 |
| quiwidget | 自定义无边框窗体,可设置标题,各种图标等。 |
| 名称 | 说明 |
|---|---|
| quihelper | 项目通用辅助类,各种常用函数的封装,比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。 |
| quihelpercore | 获取当前桌面分辨率,设置编码、字体、翻译文件等。 |
| quihelperdata | 16进制、2进制、10进制互相转换,16进制字符串、字节数组互相转换,字节数组转int和short,CRC校验等。 |
| quihelperfile | 选择文件、保存文件、选择目录等对话框,复制文件、删除文件等。 |
| quihelperform | 设置无边框窗体、边框阴影,弹出信息框、错误框、询问框、日期选择框、关于对话框、中间提示框等。 |
| quihelperimage | 获取等比例缩放图片,通用设置logo图片,支持资源文件、本地图片、图形字体、svg自动变色等多种形式。 |
| quihelpernet | 获取本机IP地址集合,获取外网IP地址,判断IP、MAC等是否合法,下载网络文件,IP地址字符串与整型互相转换。 |
| quihelperother | 初始化数据库文件,设置系统时间、开机启动,设置图标到按钮,写入临时消息的文本文件等。 |
| 名称 | 说明 |
|---|---|
| sendemailthread | 多线程发送邮件类,支持附件,可设置多个抄送。 |
| sendmsgthread | 多线程收发短信类,支持长短信发送和多个收件人。 |

界面说明
| 名称 | 说明 |
|---|---|
| frmconfig | 系统设置模块,包括基本设置、端口管理、控制器管理、探测器管理、联动设置、类型管理等。 |
| frmconfig2 | 其他设置模块,包括地图管理、用户管理、组态设计、设备调试等。 |
| frmdata | 日志查询模块,包括用户日志、运行日志、报警日志等。 |
| frmmain | 主界面模块,包括软件主界面、模拟调试工具等。 |
| frmother | 其他模块,包括封装的设备信息面板,设备回控等。 |
| frmview | 视图模块,包括数据监控、设备面板、地图监控、曲线监控等。 |

| 名称 | 说明 |
|---|---|
| frmconfig | 系统设置模块主界面,采用堆栈窗体形式,加载多个子界面比如控制器管理、探测器管理等。 |
| frmconfigdbnet | 远程数据库设置,用于将本地数据实时同步到远程服务器。 |
| frmconfigdevice | 控制器管理,可以增加、删除、修改、清空、导入、导出、打印控制器信息。 |
| frmconfiglink | 联动管理,可以增加、删除、修改、清空、导入、导出、打印联动信息。具体联动规则依据厂家约定。 |
| frmconfignode | 探测器管理,可以增加、删除、修改、清空、导入、导出、打印探测器信息。本系统设备的最终节点,可以设置非常详细的各种参数。 |
| frmconfigport | 端口管理,可以增加、删除、修改、清空、导入、导出、打印端口信息。可以下拉选择对应的通信协议模式。 |
| frmconfigsystem | 系统设置,包括基本设置、数据库设置、网络转发配置、日志设置、颜色配置、短信告警设置、邮件转发设置等。 |
| frmconfigtype | 类型设置,为了增强灵活性拓展性,系统中的控制器类型、探测器类型、气体种类、气体符号等信息都可以在这里自定义。 |

| 名称 | 说明 |
|---|---|
| frmconfig2 | 其他设置模块主界面,采用堆栈窗体形式,加载多个子界面比如用户管理、位置调整等。 |
| frmconfigdebug | 数据打印调试,所有的设备数据通信都可以在这里看到,可以选择针对某个控制器和探测器,也可以选择只看发送还是接收的数据,所有的数据都有对应的解析文字,方便理解。 |
| frmconfigmap | 地图管理,可以添加删除地图图片文件。 |
| frmconfigposition | 位置调整,可以对地图上的设备拖动调整到合适的位置。 |
| frmconfigscada | 自定义控件属性设计器,演示如何加载自定义控件然后拖曳,导入导出xml文件,自定义用户数据,组态的雏形,目前功能单一。 |

| 名称 | 说明 |
|---|---|
| frmdata | 日志查询模块主界面,采用堆栈窗体形式,加载多个子界面包括用户日志、运行日志、报警日志等。 |
| frmdataalarm | 报警日志,可以按照日期范围、报警类型等查询日志,查询后的日志可打印和导出,还可以删除指定日期范围的日志以及清空所有日志。 |
| frmdatanode | 运行日志,可以按照日期范围、控制器等查询日志,查询后的日志可打印和导出,还可以删除指定日期范围的日志以及清空所有日志。 |
| frmdatauser | 用户日志,可以按照日期范围、操作类型等查询日志,查询后的日志可打印和导出,还可以删除指定日期范围的日志以及清空所有日志。 |

| 名称 | 说明 |
|---|---|
| frmmain | 系统主界面,采用堆栈窗体,加载各个子模块。 |
| frmtool | 模拟调试工具,可选择设备采集模拟或者数据库模拟。 |
| frmtimecpu | 时间和CPU内存模块,一般放在系统的右上角。 |
| 名称 | 说明 |
|---|---|
| frmdevicecontrol | 设备回控模块,目前就显示具体的探测器信息,后期按照用户需求定制。 |
| frmdevicenode | 设备面板模块,同时包含了多种面板样式比如普通样式、仪表样式,可以在系统设置中动态切换并立即应用,每个探测器在设备监控界面中都占用这样一个面板,显示具体的信息,包括实时更新值。 |

| 名称 | 说明 |
|---|---|
| frmview | 系统视图主界面,采用堆栈窗体,加载各个子模块。 |
| frmviewdata | 数据监控,表格形式展示每个设备的各项数据和单位,报警不同颜色显示,具体颜色可以在系统设置中设置。 |
| frmviewdevice | 设备监控,每个探测器都对应一个设备面板,超出则滚动条显示。 |
| frmviewmap | 地图监控,设备在图片地图上,报警后红色闪烁,可以双击弹出探测器的详细信息,同时在设备按钮上显示对应的采集到的值。 |
| frmviewplot | 曲线监控,可以指定某个探测器设备查看实时曲线,还可以看该设备的历史记录曲线。 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| PortID | 编号 | INTEGER | 主键自增 | |
| PortName | 端口名称 | VARCHAR | 30 | 不为空 |
| PortType | 协议类型 | VARCHAR | 15 | 不为空 |
| ComName | 串口号 | VARCHAR | 10 | |
| BaudRate | 波特率 | INTEGER | 6 | |
| TcpIP | 网络地址 | VARCHAR | 16 | |
| TcpPort | 网络端口 | INTEGER | 6 | |
| ReadInterval | 采集周期 | INTEGER | 4 | 不为空 |
| ReadTimeout | 通讯超时次数 | INTEGER | 4 | 不为空 |
| ReadMaxtime | 超时重连时间 | INTEGER | 4 | 不为空 |
| PortMark | 备注 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| DeviceID | 编号 | INTEGER | 主键自增 | |
| PortName | 端口名称 | VARCHAR | 30 | 不为空 |
| DeviceName | 控制器名称 | VARCHAR | 30 | 不为空 |
| DeviceAddr | 控制器地址 | INTEGER | 3 | 不为空 |
| DeviceType | 控制器类型 | VARCHAR | 20 | 不为空 |
| NodeNumber | 探测器数量 | INTEGER | 3 | 不为空 |
| DeviceMark | 备注 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| NodeID | 编号 | INTEGER | 主键自增 | |
| positionID | 位置编号 | VARCHAR | 20 | 不为空 |
| DeviceName | 控制器名称 | VARCHAR | 30 | 不为空 |
| NodeName | 探测器名称 | VARCHAR | 30 | 不为空 |
| NodeAddr | 探测器地址 | INTEGER | 3 | 不为空 |
| NodeType | 探测器类型 | VARCHAR | 20 | 不为空 |
| NodeClass | 气体种类 | VARCHAR | 20 | 不为空 |
| NodeSign | 单位符号 | VARCHAR | 20 | 不为空 |
| NodeUpper | 上限值 | VARCHAR | 10 | 不为空 |
| NodeLimit | 下限值 | VARCHAR | 10 | 不为空 |
| NodeMax | 最大值 | VARCHAR | 10 | 不为空 |
| NodeMin | 清零值 | VARCHAR | 10 | 不为空 |
| NodeRange | 缓冲值 | VARCHAR | 10 | 不为空 |
| NodeEnable | 启用禁用 | VARCHAR | 2 | 不为空 |
| NodeSound | 报警声音 | VARCHAR | 10 | 不为空 |
| NodeImage | 背景图片 | VARCHAR | 10 | 不为空 |
| SaveInterval | 存储周期 | INTEGER | 3 | 不为空 |
| DotCount | 小数点位数 | INTEGER | 1 | 不为空 |
| AlarmDelay | 报警延时 | INTEGER | 3 | 不为空 |
| AlarmType | 报警类型 | VARCHAR | 2 | 不为空 |
| NodeX | X坐标 | INTEGER | 4 | 不为空 |
| NodeY | Y坐标 | INTEGER | 4 | 不为空 |
| NodeMark | 备注 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| PositionID | 位置编号 | VARCHAR | 20 | 主键自增 |
| ComName | 串口名 | VARCHAR | 10 | 不为空 |
| BaudRate | 波特率 | INTEGER | 5 | 不为空 |
| ModelAddr | 模块地址 | INTEGER | 3 | 不为空 |
| LinkAddr | 联动地址集合 | VARCHAR | 20 | 不为空 |
| LinkEnable | 启用禁用 | VARCHAR | 2 | 不为空 |
| LinkMark | 备注 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| TypeID | 编号 | INTEGER | 主键自增 | |
| DeviceType | 控制器类型 | VARCHAR | 20 | |
| NodeNumber | 探测器数量 | INTEGER | 5 | |
| NodeType | 探测器类型 | VARCHAR | 20 | |
| NodeClass | 气体种类 | VARCHAR | 20 | |
| NodeSign | 气体符号 | VARCHAR | 20 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| PositionID | 位置编号 | VARCHAR | 20 | |
| NodeValue | 节点数据 | VARCHAR | 10 | 不为空 |
| NodeStatus | 节点状态 | INTEGER | 2 | 不为空 |
| SaveTime | 记录时间 | VARCHAR | 19 | 不为空 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| UserName | 用户名称 | VARCHAR | 20 | 不为空 |
| UserPwd | 用户密码 | VARCHAR | 10 | 不为空 |
| UserType | 用户类型 | VARCHAR | 10 | 不为空 |
| Permission1 | 用户权限1 | VARCHAR | 20 | |
| Permission2 | 用户权限2 | VARCHAR | 20 | |
| Permission3 | 用户权限3 | VARCHAR | 20 | |
| Permission4 | 用户权限4 | VARCHAR | 20 | |
| Permission5 | 用户权限5 | VARCHAR | 20 | |
| Permission6 | 用户权限6 | VARCHAR | 20 | |
| Permission7 | 用户权限7 | VARCHAR | 20 | |
| UserMark | 备注 | VARCHAR | 50 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| LogID | 编号 | INTEGER | 主键自增 | |
| TriggerTime | 触发时间 | VARCHAR | 19 | |
| UserName | 用户名称 | VARCHAR | 20 | |
| UserType | 用户类型 | VARCHAR | 10 | |
| LogType | 事件类型 | VARCHAR | 20 | |
| LogContent | 事件内容 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| LogID | 编号 | INTEGER | 主键自增 | |
| PositionID | 位置编号 | VARCHAR | 20 | |
| DeviceName | 控制器名称 | VARCHAR | 30 | |
| NodeName | 探测器名称 | VARCHAR | 30 | |
| NodeValue | 当前值 | VARCHAR | 10 | |
| NodeSign | 单位符号 | VARCHAR | 10 | |
| SaveTime | 保存时间 | VARCHAR | 19 | |
| LogMark | 备注 | VARCHAR | 255 |
| 字段名 | 中文名 | 类型 | 长度 | 说明 |
|---|---|---|---|---|
| LogID | 编号 | INTEGER | 主键自增 | |
| PositionID | 位置编号 | VARCHAR | 20 | |
| DeviceName | 控制器名称 | VARCHAR | 30 | |
| NodeName | 探测器名称 | VARCHAR | 30 | |
| NodeValue | 当前值 | VARCHAR | 10 | |
| NodeSign | 单位符号 | VARCHAR | 10 | |
| Content | 报警内容 | VARCHAR | 20 | |
| StartTime | 开始时间 | VARCHAR | 19 | |
| EndTime | 结束时间 | VARCHAR | 19 | |
| ConfirmUser | 确认用户 | VARCHAR | 20 | |
| ConfirmTime | 确认时间 | VARCHAR | 19 | |
| ConfirmContent | 确认意见 | VARCHAR | 255 |

本系统专门配备了设备模拟工具,用来在没有外接真实设备的时候,模拟modbus协议数据,支持多个设备,支持串口和网络方式,可切换正常数据和报警数据,反应到主程序上。对应主程序中两种端口,一种是串口端口(这个可以用虚拟串口工具 Virtual Serial Port 虚拟一对串口用于测试),一种是网络端口(注意选择的监听主机地址和端口)。数据库模拟对应程序中的数据库采集运行模式,可以勾选自动模拟复选框。随机生成状态字段数据。

作为国际知名的modbus模拟仿真工具Modbus Slave,本系统也提供了对应的数据配置文件iotsystem.mbs,在db目录下,对应添加FC-1003-8控制器。两边的通信方式必须一致,比如软件上设置的串口则两边都是串口。具体Modbus Slave工具详细使用可以自行搜索,比如这篇文章 https://blog.csdn.net/xuw_xy/article/details/81166305 。

本系统支持邮件转发,前提是对应的邮箱账号需要开通 POP3/SMTP 等服务,按照图示开启即可,一般开启后会设置独立的管理密码,记得在系统设置那边的邮件转发,填写密码的时候要填的是独立管理密码,而不是邮箱号的密码,这个机制和任何第三方邮箱管理软件都一样。

本系统支持串口短信发送,需要发短信的硬件支持(俗称DXM),采用通用的标准的AT指令短信发送协议,支持任意厂家的串口短信设备。当设备报警后会自动组建报警短信发送给设定的收件人。支持中文短信发送和长短信发送,可以自行网上GM对应的硬件。

本系统除去第三方库(串口通信3rd_qextserialport、曲线图表3rd_qcustomplot、属性控件3rd_qtpropertybrowser、邮件发送3rd_smtpclient)的代码,总代码行数约4W行,纯代码行数约3W行。
本系统支持多种数据库,包括sqlite、mysql、sqlserver、postgresql、oracle、kingbase等,直接在系统设置中的数据库配置中切换即可,切换完数据库以后记得初始化数据库,否则数据库不存在。







在系统设置中设置好网络转发参数后,可以在接收的地方开启网络数据接收,这样只需要接收数据解析反应到界面就行,相当于数据源不是硬件设备而是网络转发过来的数据,不需要直接接硬件设备。
网络转发端,单击同步数据会把本地的端口信息、控制器信息、探测器信息发到远端。网络转发模块也可以作为无限级联使用,比如接收端还可以开启转发,继续转发给需要的地方,一个客户端上设置的转发也支持多个,用英文分号 ; 隔开,一对多关系,采用的无连接udp协议,几乎不占用系统资源。

云端数据库同步,相当于把本地采集到的数据实时存储到云端,至于这些记录到了云端后什么用途,一般会用来做web请求访问,或者app请求获取数据,具体应用看用户需求。
云端数据库也会存储到NodeData表中,意味着任意地方的客户端,都可以选择数据库采集模式,直接连接云端的数据库作为数据源。相当于可以无限级联。