解决方案:Qt编写物联网管理平台48-特色功能设计

优采云 发布时间: 2022-11-30 23:27

  解决方案:Qt编写物联网管理平台48-特色功能设计

  一、简介

  物联网管理平台在实际现场应用过程中,遇到了大大小小的几十个改进需求点。这些需求点都是实际用户提出来的。从整体上提高整个系统的完整性,甚至有些需求是骗人的,比如硬件设备精度不够,会短时间围绕某个值上下波动,但是客户端采集数据后,如果这个值恰好在报警值附近的波动不能称为报警,因为也有可能是干扰引起的。这不是严格意义上的警报。只有当报警值持续超过报警值时,才算真正报警。因此,需要设计报警延时参数。,

  存储周期很好理解,就是多久存储一次这个设备的记录值,有些设备很重要,可以把存储周期设置小一些,比如5s存储一个值,有些是不重要,可以设置一个大的one值,这样可以因地制宜,节省大量的存储空间。报警类型也是一个很好的参数规则。对于我们来说,通常的规则是大于上限的值是多报,低于下限的值是少报,比如温度。对于某些气体,如果该值高于最小值,则为漏报,如果高于最大值,则为高报,这意味着必须低于最小值才能是正常的。有毒气体一般属于此类。在一些特定的环境中,要求气体的浓度超过最大值是正常的。例如,氧气需要超过最大值才算正常。最大值和最小值之间的中间值是低报,小于最小值是高报,因为氧气太少是最紧急的事件。

  字段说明

  Number:节点的编号,从1开始。 Tag:探测器的位置编号,用于唯一标识一个探测器。Controller:对应要挂载的主设备的名称。Detector:探测器的名称,方便记忆,可以填写地理位置。地址:探头对应控制器上的编号索引。型号:探测器的型号,从下拉框中选择。气体类型:检测器采集的气体类型。气体型号:检测器对应采集气体的型号。上限值:报警的上限值。下限值:报警的下限值 最大值:最大报警值,超过该值则显示为该值。零抑制:最小警告值,如果小于这个值,会显示0,大于这个值就显示真实值。量程:假设量程为0.25,则实际个数=模拟值/4000x量程模拟值即为采集值。状态:默认开启,未连接探测器时可选择关闭。声音:报警后对应的声音文件。map:探针所在的map文件。存储:探测器记录的存储周期,以分钟为单位。即记录在本地存储的频率。小数点:计算解析数据的数据位对应的小数位数。告警延时:告警后,延时多长时间进行处理,以过滤数据抖动偏差引起的误报。默认值为 0。 报警类型:HH LL HL。X坐标:探测器在地图上的X坐标。Y 坐标:探头在地图上所处的Y 坐标。2. 功能特点 2.1 软件模块 设备监控模块,包括数据监控(表格形式展示)、设备面板(面板形式展示)、地图监控(地图形式展示)、曲线监控(曲线形式展示)。

  数据查询模块,包括报警记录、运行记录、操作记录。系统设置模块,包括基本设置、端口管理、控制器管理、探测器管理、报警联动、类型设置等。 其他设置模块,包括用户管理、地图管理、位置调整、组态设计、设备调试等。 2.2 基本功能设备数据采集,支持串口、网络,串口可设置串口号、波特率,网络可设置IP地址、通讯端口。每个端口都支持采集周期时间,默认为一台设备1秒。支持设置通讯超时次数,默认3次。支持重新读取离线设备的最大重连时间。控制器信息,可以添加控制器名称,选择控制器地址,控制器型号,并设置控制器下的探测器数量。探测器信息,可添加位数、探测器型号、气体类型、气体符号、高报值、低报值、缓冲值、清零值、启用或禁用、报警声音、背景图、存储期限、小数点数值转换数、报警延迟时间、报警类型(HH、LL、HL)等。类型管理可以配置控制器型号、探测器型号、气体类型、气体符号等。地图支持导入和删除,所有探测器的位置在地图可以自由拖动和保存。端口信息、控制器信息、探测器信息、型号信息、用户信息等,均支持导入、导出、导出excel、打印。操作记录、报警记录、操作记录均支持多条件组合查询,

  操作记录、告警记录、操作记录可以删除指定时间范围内的数据。系统设置可以选择对应表保存的最大记录数,自动清除前期数据,留出足够的空间存放重要数据。报警短信转发支持多个接收手机号码,发送间隔可设置,如即时发送或每6小时发送一次所有报警短信。如果短信内容过长,会自动拆分多条短信。报警邮件转发,支持多个接收邮箱,可设置发送时间间隔,如立即发送或每6小时发送一次所有报警信息,并支持发送附件。设置中文标题、英文标题、标识路径、版权等。的软件。开关机可设置开机运行、报警音、自动登录、记住密码等。报警音播放次数可设置,界面风格提供18套皮肤文件选项。用户管理,包括用户权限配置,不同的用户可以有不同的模块权限。用户登录和用户退出,可以记住密码并自动登录,三种以上错误提示并关闭程序。设备面板监控、地图监控、表格数据监控、曲线数据监控四种监控模式自由切换。四种模式实时显示采集数据,报警闪烁等。报警继电器联动,一个位号可以跨串口链接多个模块和继电器号,支持多对多。2. 3 特点 通讯协议支持modbus_com、modbus_tcp_rtu,以及后来扩展的mqtt等协议。数据源除了真正的硬件设备采集外,还可以通过数据库采集数据源,这样用户就可以安排java程序员等其他程序员把前端采集的数据放到数据库中,系统可以直接从数据库中采集

  数据库获取方式可作为通用系统使用,更适合多人、多系统协作。智能跳过超时设备,加快在线设备的采集

速度,尤其适用于设备数量较多的情况。对于智能跳过的超时设备,会在设置的重连时间自动采集一次,以检测设备是否再次上线。无论启用与否,每个检测器都是可控的。如果不启用,则不会被采集,也不会显示在界面上,相当于在运行阶段暂时关闭。探测器可以设置缓冲值和报警延迟时间。围绕该值波动产生的告警不算告警。只有持续处于报警值并超过报警延迟时间,才算真正报警。这样可以避免很多由波动引起的误报。报告。检测仪可设置存储周期,并根据设置的时间存储运行记录。存储周期可以根据重要程度设置的越短,设置的越高,不重要的设置的越长,可以节省大量的存储空间。,也保证了重要数据的及时存储。检测器可以设置为清除该值。一些高精度、高灵敏度的设备在出厂时可能默认值不为0,需要设置清零值来表示初始值。检测仪可设置小数点,用于控制计算出的真实数据的小数点显示,相当于除以10、100、1000,这样大部分探测器数据可以直接通过小数点设置来控制。需要特殊转换的值,很少可以在通信协议中约定。检测器警报有多种类型。有些设备高于某个值就报高,低于某个值就报低。高于最大值是正常的。

  这允许个案处理以涵盖各种警报类型。独创数据导入、导出、打印机制,跨平台不依赖任何组件,即时导出数据。导出excel的记录支持所有excel、wps等表格文件版本,不依赖excel等软件。可以自由设置高报表颜色、低报表颜色、普通颜色、默认值颜色等。支持云端数据同步,将本地采集的数据实时同步到云端。支持网络转发和网络接收,开启网络接收后,软件从udp接收数据进行分析。网络转发支持多目标IP,实现软件本地采集,数据自由传输至客户端,并且可以随时查看采集

到的数据。自动记住用户上次使用的界面等配置信息,重启后自动应用。报警自动切换到相应地图,探测器按钮闪烁,表格数据以相应颜色显示。双击探测器图标,会弹出对应探测器的详细信息,您可以根据需要自定义控制返回操作。支持各种数据库,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金仓等,本地设备采集的数据实时上传到云端,方便通过手机APP等其他方式提取或网络。自带设备模拟工具,支持不同机型的多台设备数据模拟,也有数据库数据模拟,可以在没有设备的情况下测试数据。标准modbus协议,各种控制器类型、探测器类型、类型、符号等都是定制的,非常灵活和强大,通讯协议示例数据非常齐全,通用于各种modbus协议系统,适合各种应用场景接入。

  同时集成了串口通讯、网络通讯、数据库通讯、数据导入导出打印、通讯协议解析、界面UI、全局换肤等诸多组件和知识点,非常适合初学者和高级用户。支持xp、win7、win10、win11、linux、mac、各种国产系统(UOS、致胜麒麟、银河麒麟等)、嵌入式linux等系统。注释齐全,项目结构清晰,超详尽的用户开发手册准确到每个代码文件的功能描述,版本不断迭代。3.体验地址 国内站: 国际站: 个人主页:知乎主页: 产品主页: 在线文档: 体验地址: 提取码:o05q 文件名:bin_iotsystem.zip。文章导航:4.效果图

  5.相关代码

  void DeviceServer::doReceiveValue(const QString &portName, quint8 addr, const QList &values)

{

//找到设备名称

QString deviceName = DbQuery::getDeviceName(portName, addr);

//找到当前索引位置的设备地址对应探测器的最小寄存器地址

//如果读取的起始寄存器地址是5则回来的数据位第一个是寄存器地址5的数据,后面连续

quint16 nodeMinAddr = DbQuery::getNodeMinAddr(portName, addr);

//根据不同的探测器对应的小数点,换算值

QList datas;

foreach (quint16 value, values) {

datas = datas.count()) {

continue;

}

<p>

" />

QString positionID = DbData::NodeInfo_PositionID.at(i);

float nodeMax = DbData::NodeInfo_NodeMax.at(i);

float nodeMin = DbData::NodeInfo_NodeMin.at(i);

float nodeRange = DbData::NodeInfo_NodeRange.at(i);

int dotCount = DbData::NodeInfo_DotCount.at(i);

//目前收到的值需要经过几层过滤计算才是真实的值

//第一层是小数点(默认0),比如收到的值是1000,如果小数点设定的1则真实的是100

//第二层是量程(默认0),比如收到998,如果设定的量程0.25则运算后 998/4000*0.25=0.062375

//第三层是最大值(默认1000),假设设定的最大值1000,如果收到的值>1000则取1000,因为某些设备损坏或者误报采集到的是一个很大的不准确的值

//第四层是清零值(默认0),假设设定的是50,则低于50都认为是0,因为某些设备损坏或者误报采集到的是一个很小的不准确的值

//根据设定的小数点来重新计算真实的值

float nodeValue = (float)values.at(startIndex);

if (dotCount > 0) {

nodeValue = nodeValue / qPow(10, dotCount);

}

//4218按照新的规则计算值 实际数=模拟量/4000*量程 模拟量就是采集的值

if (nodeRange > 0) {

nodeValue = (float)values.at(startIndex) / 4000 * nodeRange;

}

//如果收到的值大于最大值则取最大值作为当前的值

nodeValue = nodeValue > nodeMax ? nodeMax : nodeValue;

//如果设置了消零阀值,在未达到消零阀值时显示都是零,只有超过消零阀值才是显示真实值

if (nodeRange == 0) {

nodeValue = nodeValue < nodeMin ? 0 : nodeValue;

}

//精度过滤,避免精度过大显示太长

nodeValue = QString::number(nodeValue, &#39;f&#39;, AppConfig::Precision).toFloat();

//找到当前探测器处理探测器报警

//如果当前值小于最小值而且当前不处于下限报警则触发报警

//如果当前值大于最大值而且当前不处于上限报警则触发报警

//0-低报 1-低报恢复 2-高报 3-高报恢复

quint8 nodeStatus = 100;

  

" />

//根据设定的不同的报警类型处理,假定上限值100,下限值25

//HH表示超过25是低报,超过100是高报

//HL表示低于25是低报,超过100是高报

//LL表示低于25是高报,低于100是低报

QString alarmType = DbData::NodeInfo_AlarmType.at(i);

if (alarmType == "HH") {

doAlarmHH(nodeStatus, positionID, nodeValue, i);

} else if (alarmType == "HL") {

doAlarmHL(nodeStatus, positionID, nodeValue, i);

} else if (alarmType == "LL") {

doAlarmLL(nodeStatus, positionID, nodeValue, i);

}

//处理报警

//qDebug()

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线