QT c++ 测控系统 一套报警规则(上)

本文适用于pc based的测控系统的上位机,定义了一套报警规则。

 由5个部分组成:自定义4布尔类、在全局文件定义工位错误结构体和结构体变量,其它地方给此变量的当前值成员赋值,报警线程类、数据库保存类、弹框类。

1.自定义4布尔类

本类实现了上升沿和下降沿函数,得到信号的变化那1次。

(1)头文件(文件名:four_bl.h)

#ifndef FOUR_BL_H
#define FOUR_BL_H

//#include <QObject>

class Four_bl
{
    //Q_OBJECT
public:
    bool current_Value=false;//当前值
private:
    bool history_Value=false;//历史值
public:
    Four_bl();
    bool Is_raise_edge();//上升沿
    bool Is_fall_edge();//下降沿
    void Refresh_history_Value();
    bool Get_history_Value();
};

#endif // FOUR_BL_H

(2)cpp文件(文件名:four_bl.cpp)

#include "four_bl.h"

Four_bl::Four_bl() {}
bool Four_bl::Is_raise_edge()//上升沿
{
    return (current_Value && !history_Value);
}
bool Four_bl::Is_fall_edge()//下降沿
{
    return (!current_Value && history_Value);
}
void Four_bl::Refresh_history_Value()//刷新历史值
{
    history_Value=current_Value;
}
bool Four_bl::Get_history_Value()//得到历史值
{
    return history_Value;
}

2.在全局文件中

(1) 头文件中添加(文件名:global_def.h)

struct staion_error

     Four_bl motor_error;//马达故障
     Four_bl negative_limit;//负限位
     Four_bl positive_limit;//正限位
     //...有多少就定义多少
};

extern staion_error global_staion_error_array[3];//工位故障数组,你有多少个工位就写多少长度

(2) cpp文件(文件名:global_def.cpp)

staion_error global_staion_error_array[3];//与头文件中那个数组长度要一样

3.给此变量的当前值成员赋值

 for(int i=0;i<3;i++)
     {

    global_staion_error_array[i].motor_error.current_Value=  ;//补上右边
    global_staion_error_array[i].positive_limit.current_Value= ;//补上右边
    global_staion_error_array[i].negative_limit.current_Value= ;//补上右边

 }

4.报警线程类

(1)头文件(文件名:alarm_thread.h)

#ifndef ALARM_THREAD_H
#define ALARM_THREAD_H
#include <QObject>
#include <QThread>
#include <QDebug>
#include <QString>
//#include <QCoreApplication>
#include "global_def.h"
#include <QMutexLocker>
#include <datapoolpage.h>
class Alarm_Thread :  public QThread
{
    Q_OBJECT
private:
    bool    m_paused=true;  //暂停
    bool    m_stop=false;   //停止线程run()
    long    Seq=0;//序次
protected:
     void    run();      //线程的事件循环
public:

    void    Begin();    //开始
    void    Pause();    //暂停
    void    stopThread();   //结束线程run()
    explicit Alarm_Thread(QObject *parent = nullptr);

signals:
private slots:
    void ChangeState(QString cmd);
};

#endif // ALARM_THREAD_H

(2) cpp文件(文件名:alarm_thread.cpp)

#include "alarm_thread.h"

Alarm_Thread::Alarm_Thread(QObject *parent)
   : QThread{parent}
{}
void Alarm_Thread::run()      //线程的事件循环
{  // qDebug()<<"void Alarm_Thread::run() ";
    while(!m_stop)      //循环主体
    {
        //QElapsedTimer time_m;
        //time_m.start();
         QThread::msleep(2000);
        if (!m_paused)
        {
            //qDebug()<<"void Alarm_Thread::run()-while loop-- ";
            //return;

            for(int i=0;i<3;i++)
            {
            if(global_staion_error_array[i].motor_error.Is_raise_edge())//如果是上升沿
            {
                 //DataPoolPage::insert_alarm(i+1,"",1);//插入报警信息到数据库的

            }
            if(global_staion_error_array[i].motor_error.Is_fall_edge())
            {   QString st_name_array[]={"","工位1","工位2","工位3"};
                //DataPoolPage::update_alarm(st_name_array[i+1],1);//更新数据库的
                qDebug()<<"--------------------------------";
                qDebug()<<st_name_array[i+1];
            }
            global_staion_error_array[i].motor_error.Refresh_history_Value();

            //这行要在上升沿处理和下降沿处理以后
            //----------------------------------------------------------------------
            if(global_staion_error_array[i].negative_limit.Is_raise_edge())
            {
                //DataPoolPage::insert_alarm(i+1,"",2);//插入数据库的

            }
            if(global_staion_error_array[i].negative_limit.Is_fall_edge())
            {   QString st_name_array[]={"","工位1","工位2","工位3"};
                //DataPoolPage::update_alarm(st_name_array[i+1],2);//更新数据库的

            }
            global_staion_error_array[i].negative_limit.Refresh_history_Value();
            //------------------------------------------------------------------------
            if(global_staion_error_array[i].positive_limit.Is_raise_edge())
            {
                //DataPoolPage::insert_alarm(i+1,"",3);//插入数据库的

            }
            if(global_staion_error_array[i].positive_limit.Is_fall_edge())
            {   QString st_name_array[]={"","工位1","工位2","工位3"};
               // DataPoolPage::update_alarm(st_name_array[i+1],3);//更新数据库的

            }
            global_staion_error_array[i].positive_limit.Refresh_history_Value();

            if(global_staion_error_array[i].no_on_error.Is_raise_edge())
            {
                //DataPoolPage::insert_alarm(i+1,"",4);//插入数据库的

            }
           //..继续添加你的

        }
        else
        {
            //qDebug()<<"void Alarm_Thread::run()-while loop--pause ";
             QThread::msleep(800);
        }
        QThread::msleep(2000);
    }
}
void Alarm_Thread::Begin()    //开始
{
    m_paused=false;
}
void Alarm_Thread::Pause()    //暂停
{
    m_paused=true;
}
void Alarm_Thread::stopThread()   //结束线程run()
{
    m_stop=true;
}
void Alarm_Thread::ChangeState(QString cmd)
{
    if(cmd=="begin")
    {
        Begin();
    }
    else if(cmd=="pause")
    {
        Pause();
    }
}

5.数据库和写入数据库的类

5.1建立数据库和表

5.2 写入数据库的类

(1)头文件(文件名:datapoolpage.h)

#ifndef DATAPOOLPAGE_H
#define DATAPOOLPAGE_H

#include <QWidget>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QElapsedTimer>
#include <QDateTime>
#include <iostream>
#include <QMutexLocker>
#include "global_def.h"
namespace Ui {
class DataPoolPage;
}

class DataPoolPage : public QWidget
{
    Q_OBJECT

public:
    explicit DataPoolPage(QWidget *parent = nullptr);
    ~DataPoolPage();
    //QSqlDatabase database;
    void static insert_alarm(QString st,QString info1,QString info2,QDateTime dt,QString status_,int num);
    void static insert_alarm(int st_num,QString info2,int num);
    void static update_alarm(QString st,int num);
 
private slots:
 

private:
    Ui::DataPoolPage *ui;
    int seq=1;
};

#endif // DATAPOOLPAGE_H
 

(2)cpp文件(文件名:datapoolpage.cpp)

#include "datapoolpage.h"
#include "ui_datapoolpage.h"

DataPoolPage::DataPoolPage(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::DataPoolPage)
{
    ui->setupUi(this);
    //db = QSqlDatabase::addDatabase("QMYSQL");

}

DataPoolPage::~DataPoolPage()
{
    delete ui;
}

void DataPoolPage::insert_alarm(QString st,QString info1,QString info2,QDateTime dt,QString status_,int num)
{    qDebug()<<"-insert_alarm2-----"<<st;
    //qDebug()<<QSqlDatabase::drivers();
    //QMutexLocker locker(&g_mutx_db);
    if(QSqlDatabase::contains("MySQLConnection1"))
        QSqlDatabase::removeDatabase("MySQLConnection1");
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "MySQLConnection1");
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setDatabaseName("deviceinfodb");//你自己的数据库名称
    db.setUserName("root");
    db.setPassword("123456");
    if (!db.open()) {
        qDebug()<<"不能连接"<<"connect to mysql error"<<db.lastError().text();
        db.close();
        return ;
    }
    else
    {
        qDebug()<<"数据库连接成功";
    }
    QDateTime now = QDateTime::currentDateTime();
    QSqlQuery query(db);

    query.prepare("INSERT INTO current_alarms (workstation, description, description2,start_time, status,code) VALUES (:value0,:value1, :value2, :value3, :value4, :value5)");
    query.bindValue(":value0",st );
    query.bindValue(":value1", info1);
    query.bindValue(":value2", info2);
    query.bindValue(":value3", dt);
    query.bindValue(":value4", status_);
    query.bindValue(":value5", num);
 //query.bindValue(":value4", "active");
    if (!query.exec())

    {
        qDebug() << "Failed to insert data. Error: " << query.lastError().text();
        db.close();
        return  ;
    }
    qDebug() << "Data inserted successfully";
    db.close();
}
void DataPoolPage::update_alarm(QString st,int num)
{
  //UPDATE `deviceinfodb`.`current_alarms` SET  `status` = 'active', `resolved_time` = now() , `code` = 00000000001 WHERE `code`=1 and `status`='active' ;
    qDebug()<<"void DataPoolPage::update_alarm(QString st,int num)";
    //qDebug()<<QSqlDatabase::drivers();
     //return;
     QMutexLocker locker(&g_mutx_db);
     //QSqlDatabase db= QSqlDatabase::addDatabase("QMYSQL");
    //QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "MySQLConnection");
     if(QSqlDatabase::contains("MySQLConnection2"))
         QSqlDatabase::removeDatabase("MySQLConnection2");
     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "MySQLConnection2");

    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setDatabaseName("deviceinfodb");//你自己的数据库名称
    db.setUserName("root");
    db.setPassword("123456");

    if (!db.open()) {
        qDebug()<<"不能连接"<<"connect to mysql error"<<db.lastError().text();
        db.close();
        return ;
    }
    else
    {
        qDebug()<<"数据库连接成功";
    }
    QDateTime now = QDateTime::currentDateTime();
    QSqlQuery query(db);

    query.prepare("UPDATE current_alarms SET  status = 'resolved', resolved_time = now()  WHERE workstation =:value0 and code=:value1 and status='active' ");
    query.bindValue(":value0",st );
    query.bindValue(":value1",num );


    //query.bindValue(":value4", "active");
    if (!query.exec())

    {
        qDebug() << "Failed to insert data. Error: " << query.lastError().text();
        db.close();
        return  ;
    }
    qDebug() << "Data update successfully";
    db.close();
}

//说明,弹框类,在下篇文章中描述
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492852.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

作业Day4: 链表函数封装 ; 思维导图

目录 作业&#xff1a;实现链表剩下的操作&#xff1a; 任意位置删除 按位置修改 按值查找返回地址 反转 销毁 运行结果 思维导图 作业&#xff1a;实现链表剩下的操作&#xff1a; 1>任意位置删除 2>按位置修改 3>按值查找返回地址 4>反转 5>销毁 任意…

WebSocket入门与结合redis

WebSocket是什么 WebSocket 是一种用于在客户端和服务器之间建立双向通信的协议&#xff0c;它能实现实时、持久的连接。与传统的 HTTP 请求响应模式不同&#xff0c;WebSocket 在建立连接后允许客户端和服务器之间相互发送消息&#xff0c;直到连接关闭。由于 WebSocket 具有…

WSL Ubuntu

文章目录 1. 概述1.1 什么是适用于 Linux 的 Windows 子系统1.2 什么是 WSL 21.3 WSL 2 中的新增功能1.4 比较 WSL 2 和 WSL 1 2. 参考资料3. 修改存储位置4. 网络访问 1. 概述 1.1 什么是适用于 Linux 的 Windows 子系统 适用于 Linux 的 Windows 子系统可让开发人员按原样运…

unity接入coze智能体

官网链接 coze智能体创建、设置 点击创建–选着智能体&#xff0c;随便起一个名字&#xff0c;就可以了 添加令牌 把随便起一个名字&#xff0c;设置时间&#xff0c;把所有选项都勾选上&#xff0c;一定要勾选所有团队空间&#xff0c;否则无法点击确定。 点击确定后&a…

基于51单片机的交通灯设计—夜间、紧急、复位、可调时间、四个数码管显示

基于51单片机的交通灯设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1、采用四方向数码管设计&#xff0c;更加符合真实的交通信号灯设计&#xff1b; 2、左侧按键从上到下依次为…

省略内容在句子中间

一、使用二分查找法 每次查找时&#xff0c;将查找范围分成两半&#xff0c;并判断目标值位于哪一半&#xff0c;从而逐步缩小查找范围。 循环查找 计算中间位置 mid Math.floor((low high) / 2)。比较目标值 target 和中间位置的元素 arr[mid]&#xff1a; 如果 target ar…

Python:动态粒子爱心

预览 代码结构概述 这段代码使用了 pygame 库来创建一个动态的图形窗口&#xff0c;绘制一个心形图案&#xff0c;并在其中显示闪烁的文本。代码主要分为以下几个部分&#xff1a; 初始化和设置心形曲线的计算粒子类的定义生成粒子文本设置主循环 1. 初始化和设置 import p…

springboot449教学资源共享平台(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统教学资源共享平台信息管理难度大&#xff0c;容错率低&am…

DataOps驱动数据集成创新:Apache DolphinScheduler SeaTunnel on Amazon Web Services

引言 在数字化转型的浪潮中&#xff0c;数据已成为企业最宝贵的资产之一。DataOps作为一种文化、流程和实践的集合&#xff0c;旨在提高数据管道的质量和效率&#xff0c;从而加速数据从源头到消费的过程。白鲸开源科技&#xff0c;作为DataOps领域的领先开源原生公司&#xf…

【大模型】GraphRAG技术原理

核心概念 GraphRAG 的核心在于用大模型构建知识图谱知识图谱聚类社区化RAG RAG就是输入&#xff08;问题知识&#xff09;到大模型 1-大模型自动从海量数据中构建知识图谱&#xff08;提取合并实体关系&#xff09; 2-聚类算法从知识图谱中聚类社区并生成社区摘要 3-输入问题…

揭秘区块链隐私黑科技:零知识证明如何改变未来

文章目录 1. 引言&#xff1a;什么是零知识证明&#xff1f;2. 零知识证明的核心概念与三大属性2.1 完备性&#xff08;Completeness&#xff09;2.2 可靠性&#xff08;Soundness&#xff09;2.3 零知识性&#xff08;Zero-Knowledge&#xff09; 3. 零知识证明的工作原理4. 零…

王佩丰24节Excel学习笔记——第十二讲:match + index

【以 Excel2010 系列学习&#xff0c;用 Office LTSC 专业增强版 2021 实践】 【本章小技巧】 vlookup与match&#xff0c;index 相结合使用match,index 结合&#xff0c;快速取得引用的值扩展功能&#xff0c;使用match/index函数&#xff0c;结合照相机工具获取照片 一、回顾…

探秘C语言:从诞生到广泛应用的编程世界

引言 在编程的广袤天地里&#xff0c;C 语言宛如一颗璀璨的恒星&#xff0c;持久而耀眼地散发着光芒。自诞生以来&#xff0c;它就以独特的魅力和强大的功能&#xff0c;深深扎根于软件开发的各个层面。无论是构建复杂的操作系统&#xff0c;还是操控微小的嵌入式设备&#xff…

【Python】pandas库---数据分析

大学毕业那年&#xff0c;你成了社会底层群众里&#xff0c;受教育程度最高的一批人。 前言 这是我自己学习Python的第四篇博客总结。后期我会继续把Python学习笔记开源至博客上。 上一期笔记有关Python的NumPy数据分析&#xff0c;没看过的同学可以去看看&#xff1a;【Pyt…

常见异构程序设计语言

目录 一、OpenMP 二、MPI 三、CUDA/HIP 四、OpenACC 五、Athread 六、OpenCL 七、oneAPI 20世纪80年代&#xff0c;异构计算技术就已经诞生了。异构就是CPU、DSP、GPU、ASIC、协处理器、FPGA等各种计算单元、使用不同的类型指令集、不同的体系架构的计算单元&#xff0c…

番外篇 Git 的原理与使用

PS&#xff1a;本篇是个长篇&#xff0c;但是阅读完&#xff0c;可以基本了解 Git 在实际开发中的绝大部分常用操作。 前言&#xff1a;什么是Git 我们在日常工作 / 学习时&#xff0c;对于某些文档 / 代码&#xff0c;可能会存在多个版本需要维护&#xff0c;但是随着版本的…

音频开发中常见的知识体系

在 Linux 系统中&#xff0c;/dev/snd 目录包含与声音设备相关的文件。每个文件代表系统中的一部分音频硬件或音频控制接口。以下是你列出的文件及其含义&#xff1a; 一.基本术语 样本长度(sample)&#xff1a;样本是记录音频数据最基本的单位&#xff0c;计算机对每个通道采…

我的工作会被AI替代吗?

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

‌HBase是什么,‌HBase介绍

‌官方网站&#xff1a;Apache HBase – Apache HBase Home HBase是一个分布式的、面向列的NoSQL数据库&#xff0c;主要用于存储和处理海量数据。‌它起源于Google的​​​​​​​BigTable论文&#xff0c;是Apache Hadoop项目的子项目。HBase设计用于高可靠性、高性能和可伸…

【C 语言指针篇】指针的灵动舞步与内存的神秘疆域:于 C 编程世界中领略指针艺术的奇幻华章

文章目录 【C 语言篇】指针的灵动舞步与内存的神秘疆域&#xff1a;于 C 编程世界中领略指针艺术的奇幻华章前言一 、指针的介绍与使用1. 指针的介绍1.1指针表示1.2指针变量1.3空指针 2. 使用指针2.1交换两个变量的值2.2计算输出最小值和最大值 二、野指针的介绍与使用1. 野指针…