基于QT开发的使用OPC_UA与西门子1200,1500系列PLC通信的工业监控Demo

news2024/11/25 8:22:32

目录

一,总体介绍

二,需要的软件

三,需要的硬件

四,QT程序代码

五,西门子PLC代码



一,总体介绍

先看一下图1-1的QT运行界面图,界面中服务器地址就是OPC_UA服务器地址,整个项目作用,就是通过西门子1200和1500系列PLC连接压力传感器采集供水压力,然后PLC通过OPC_UA服务器将数据发送给QT做的上位机,上位机对压力数据进行采集,显示,曲线图展示,以及对高压和低压进行报警(红色显示告警,绿色显示运行),可以进行单词采集和连续采集,通过这个过程可以实现整个工业控制流程,PLC程序和上位机QT程序均通过实际测试。上位机注页面如下图1-1所):

二,需要的软件

1.QT开发软件:

如Qt Creator:qt-opensource-windows-x86-5.14.0,下载连接:http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.12/5.12.0/;下载5.9以上版本就行,最好32位,64位需要重新编译opc_ua库;

2.西门子博图软件,博图V15以上就行,下载地址可以自己找,或者附上作者的博图V15下载地址:https://pan.baidu.com/s/1v-otuaxp8sjNWUlZYTQU1A?pwd=2zt6 ;提取码:2zt6 。过期可以找博主要,博图V16,V17博主都有安装软件。

3.OPC_UA服务器软件,这个可以参考博主的博文下载和搭建,链接地址为:https://blog.csdn.net/xipengbozai/article/details/115080901

三,需要的硬件

1.计算机,也就是你的电脑就可以,配置的话稍微高点就行,现在台式机问题不大;

2.西门子1200或者西门子1500PLC,有条件的好办,没条件的可以使用模拟器,不过效果没实物好;

3.网线和一些下载线等;

4.传感器,这个数据可以通过PLC模拟,比较好办;

四,QT程序代码

A工程目录:

1.QT的mian代码

#include "OpcUaClientByQT.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    OpcUaClientByQT w;
    w.show();
    return a.exec();
}

2.主界面代码

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_OpcUaClientByQT.h"
#include "wavechart.h"
#include <QTimer>
#include <QTime>
#include "imagepilot.h"
extern "C"{
#include "open62541.h"
}
class OpcUaClientByQT : public QMainWindow
{
    Q_OBJECT

public:
    OpcUaClientByQT(QWidget *parent = Q_NULLPTR);

    void initallOPCUANode();
    void controlfunc(int num);
    void initTimer();

    void readcontrolinfo();


private:
    Ui::OpcUaClientByQTClass ui;
	WaveChart *m_WaveChart_Press;
	QTimer *m_Timer;
	ImagePilot *m_ImagePilot_Run;
	ImagePilot *m_ImagePilot_Alarm;
	bool m_bConnFlag;//连接成功标志
	void initForm();//初始化波形图


    UA_Client *client;
    QTimer *clienttimer;
    UA_Variant showValue[2];
    UA_NodeId showId[2];


    UA_Variant ctrlValue[2];
    UA_NodeId ctrlId[2];

    UA_Variant pressure;
    UA_NodeId pressureId;
    int  pressureValue;

    UA_Variant max;
    UA_NodeId maxId;

    UA_Variant min;
    UA_NodeId minId;

    \
    UA_Variant time;
    UA_NodeId timeId;


    int flag[2];
    UA_Boolean trueflag;
    UA_Boolean falseflag;

    QPushButton *ctrlbtn[2];

private slots:
	
	void addData();
	void on_btn_conn_clicked();
	void on_btn_close_clicked();
	void on_btn_Trigger_clicked();
	void on_btn_RUN_clicked();
	void on_btnClearData_clicked();
    void updateData();
};

3.曲线图代码

#ifndef WAVECHART_H
#define WAVECHART_H

/**
 * 1. 可设置间隔
 * 2. 可设置标题
 * 3. 可设置是否显示横线及坐标点
 * 4. 可设置背景色文字颜色
 * 5. 可设置范围值及x轴y轴步长
 * 6. 暂时不支持最小值小于0的数据
 */

#include <QWidget>

#ifdef quc
class Q_DECL_EXPORT WaveChart : public QWidget
#else
class WaveChart : public QWidget
#endif

{
	Q_OBJECT
	Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
	Q_PROPERTY(double maxValue READ getMaxValue WRITE setMaxValue)
	Q_PROPERTY(double xStep READ getXStep WRITE setXStep)
	Q_PROPERTY(double yStep READ getYStep WRITE setYStep)

	Q_PROPERTY(double space READ getSpace WRITE setSpace)
	Q_PROPERTY(QString title READ getTitle WRITE setTitle)
    Q_PROPERTY(bool smooth READ getSmooth WRITE setSmooth)
	Q_PROPERTY(bool showHLine READ getShowHLine WRITE setShowHLine)
	Q_PROPERTY(bool showPoint READ getShowPoint WRITE setShowPoint)
	Q_PROPERTY(bool showPointBg READ getShowPointBg WRITE setShowPointBg)

	Q_PROPERTY(QColor bgColorStart READ getBgColorStart WRITE setBgColorStart)
	Q_PROPERTY(QColor bgColorEnd READ getBgColorEnd WRITE setBgColorEnd)
	Q_PROPERTY(QColor textColor READ getTextColor WRITE setTextColor)
	Q_PROPERTY(QColor pointColor READ getPointColor WRITE setPointColor)

public:
    explicit WaveChart(QWidget *parent = 0);

protected:
	void paintEvent(QPaintEvent *);
	void drawBg(QPainter *painter);
	void drawBox(QPainter *painter);
	void drawText(QPainter *painter);
	void drawTitle(QPainter *painter);
	void drawPoint(QPainter *painter);

private slots:
	void updateData();

private:
    QRectF pointRect;               //绘制数据区域
    QVector<double> listData;       //数据集合

    double minValue;                //最小值
    double maxValue;                //最大值
    double xStep;                   //x轴步长
    double yStep;                   //y轴步长

    double space;                   //间隔
    QString title;                  //标题
    bool smooth;                    //是否平滑
    bool showHLine;                 //是否显示横线
    bool showPoint;                 //是否显示坐标点
    bool showPointBg;               //是否显示坐标背景

    QColor bgColorStart;            //背景渐变开始颜色
    QColor bgColorEnd;              //背景渐变结束颜色
    QColor textColor;               //文字颜色
    QColor pointColor;              //坐标点颜色

public:
	double getMinValue()            const;
	double getMaxValue()            const;
	double getXStep()               const;
	double getYStep()               const;

	double getSpace()               const;
	QString getTitle()              const;
    bool getSmooth()                const;
    bool getShowHLine()             const;
	bool getShowPoint()             const;
	bool getShowPointBg()           const;

	QColor getBgColorStart()        const;
	QColor getBgColorEnd()          const;
	QColor getTextColor()           const;
	QColor getPointColor()          const;

	QSize sizeHint()                const;
	QSize minimumSizeHint()         const;

public Q_SLOTS:
	//添加和设置数据数据
	void addData(double data);
	void setData(QVector<double> data);
	void clearData();

	//设置范围值及步长
	void setMinValue(double minValue);
	void setMaxValue(double maxValue);
	void setXStep(double xStep);
	void setYStep(double yStep);

	//设置间隔
	void setSpace(double space);
	//设置标题
	void setTitle(const QString &title);
    //设置是否平滑曲线
    void setSmooth(bool smooth);
	//设置显示横线
	void setShowHLine(bool showHLine);
	//设置显示坐标点
	void setShowPoint(bool showPoint);
	//设置显示坐标背景
	void setShowPointBg(bool showPointBg);

	//设置颜色
	void setBgColorStart(const QColor &bgColorStart);
	void setBgColorEnd(const QColor &bgColorEnd);
	void setTextColor(const QColor &textColor);
	void setPointColor(const QColor &pointColor);
};

#endif // WAVECHART_H

4.指示灯代码

#ifndef IMAGEPILOT_H
#define IMAGEPILOT_H

/**
 * 1. 可设置五种颜色
 * 2. 可自定义指示灯图片
 */

#include <QWidget>

#ifdef quc
class Q_DECL_EXPORT ImagePilot : public QWidget
#else
class ImagePilot : public QWidget
#endif

{
	Q_OBJECT
    Q_ENUMS(PilotStyle)
    Q_PROPERTY(PilotStyle pilotStyle READ getPilotStyle WRITE setPilotStyle)

public:
	enum PilotStyle {
		PilotStyle_Blue = 0,        //蓝色风格
		PilotStyle_Gray = 1,        //灰色风格
		PilotStyle_Green = 2,       //绿色风格
		PilotStyle_Red = 3,         //红色风格
		PilotStyle_Yellow = 4       //黄色风格
	};

	explicit ImagePilot(QWidget *parent = 0);

protected:
	void paintEvent(QPaintEvent *event);

private:
	PilotStyle pilotStyle;
	QString imgFile;

public:
	PilotStyle getPilotStyle()      const;
	QString getImgFile()            const;
	QSize sizeHint()                const;
	QSize minimumSizeHint()         const;

public Q_SLOTS:
    void setPilotStyle(const PilotStyle &pilotStyle);
    void setImage(const QString &imgFile);
};

#endif // IMAGEPILOT_H

5.连接部分代码

    //创建OPC_ua客户端
    client = UA_Client_new(UA_ClientConfig_default);
    UA_StatusCode retval = UA_Client_connect(client,url.toUtf8());
    //连接不成功的话
    if(retval != UA_STATUSCODE_GOOD)
    {
        UA_Client_delete(client);
        QMessageBox::information(this,"Error","连接失败,请确认服务器是否开启!");
    }
    else
    {
        m_bConnFlag = true;
        ui.groupBox_Contrl->setEnabled(true);//连接成功 控制区可以操作
        ui.btn_conn->setEnabled(false);//连接成功 连接按钮变灰
        QMessageBox::information(this, "提示", "连接成功", QMessageBox::Ok);
    }

6.整个qt软件完整代码下载地址:https://download.csdn.net/download/xipengbozai/87803908

五,西门子PLC代码

A工程目录:

1.压力部分数据块

 2.OPC变量定义

3.具体PLC配置和完整工程代码下载地址:https://download.csdn.net/download/xipengbozai/87803911

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图解LeetCode——19. 删除链表的倒数第 N 个结点

一、题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 二、示例 2.1> 示例 1&#xff1a; 【输入】head [1,2,3,4,5], n 2 【输出】[1,2,3,5] 2.2> 示例 2&#xff1a; 【输入】head [1], n 1 【输出】[] 2.3> 示例…

数值计算 - 误差的来源

误差的来源是多方面的&#xff0c;但主要来源为&#xff1a;过失误差&#xff0c;描述误差&#xff0c;观测误差&#xff0c;截断误差和舍入误差。 过失误差 过失误差是由设备故障和人为的错误所产生的误差&#xff0c;在由于每个人都有“权利”利用机器进行数值计算,所以在计算…

#include <archive.h>报错

#include <archive.h>报错 archive配置 Linux环境下&#xff0c;在C项目.cpp文件中存在如下语句&#xff0c;导致无法运行~ #include <archive.h> #include <archive_entry.h>由于C编译器默认不包含archive&#xff0c;所以我们需要自行配置。 Libarchiv…

Java 基础--interview经典(个人认为)题目

1&#xff09;多线程中 synchronized 锁升级的原理是什么&#xff1f; synchronized 锁升级原理&#xff1a;在锁对象的对象头里面有一个 threadid 字段&#xff0c;在第一次访问的时候 threadid 为空&#xff0c;jvm 让其持有偏向锁&#xff0c;并将 threadid 设置为其线程 i…

终の序章(一)

前言 写在我大三的最后一次省赛 &#xff0c;也是最后一次比赛 从半年前区域赛的大失利&#xff0c;导致我曾一度放弃算法竞赛和算法训练 新路历程 考虑到前几次的省赛&#xff0c;我们这次采取 稳 的一种方式&#xff0c;因为前几次省赛难度跨度较 大&#xff0c;对于大部…

【牛客网面试必刷TOP101】链表篇(二)

【牛客网面试必刷TOP101】链表篇&#xff08;二&#xff09; 前言刷题网站刷题&#xff01;BM4 合并两个排序的链表思路一&#xff1a;双指针思路二&#xff1a;递归&#xff08;扩展思路&#xff09; BM5 合并k个已排序的链表思路一&#xff1a;归并排序思想 BM6 判断链表中是…

内网渗透(七十九)之 CVE-2021-42287 权限提升漏洞

CVE-2021-42287 权限提升漏洞 漏洞背景 2021年11月9日,微软发布11月份安全补丁更新。在该安全补丁更新中,修复了两个域内权限提升漏洞CVE-2021-42287 、CVE-2021-42278。当时这两个漏洞的利用详情和POC并未公布,因此并未受到太多人关注。 一个月后,国外安全研究员公布了…

[CTF/网络安全] 攻防世界 ics-06 解题详析

[CTF/网络安全] 攻防世界 ics-06 解题详析 姿势&#xff08;Burp爆破&#xff09; 题目描述&#xff1a;云平台报表中心收集了设备管理基础服务的数据&#xff0c;但是数据被删除了&#xff0c;只有一处留下了入侵者的痕迹。 可知&#xff1a;报表中心含有部分数据 仅报表中心…

C++内存管理/函数模板/类模板

一、C内存管理 C中内存基本形式与C语言类似&#xff0c;可以参考下图。 X64环境下总共大小为8G,X86环境下为4G。 1、内核空间&#xff1a;用户不能读写&#xff0c;但要占用一定空间。 2、栈区&#xff1a;以开辟、销毁栈帧形式运行&#xff0c;主要应用于局部变量和函数栈帧…

chatgpt赋能Python-python3_choice

Python3中的choice()函数&#xff1a;一种简单而有趣的随机选择方式 在Python3中&#xff0c;choice()函数是一个常见的随机模块。它允许我们从一个序列中随机选择一个元素。这在程序中经常用于生成一些需要随机展示的数据。本文将介绍Python3中的choice()函数&#xff0c;并探…

00.SpringCloud服务调用方式

服务调用方式 RPC和HTTP 无论是微服务还是SOA&#xff0c;都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢&#xff1f; 常见的远程调用方式有以下2种&#xff1a; RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&am…

合合信息亮相CCIG2023:多位大咖共话智能文档未来,文档图像内容安全还面临哪些技术难题?

近日&#xff0c;中国图象图形大会&#xff08;CCIG 2023&#xff09;&#xff08;简称“大会”&#xff09;在苏州圆满落幕。本届大会以“图象图形向未来”为主题&#xff0c;由中国科学技术协会指导&#xff0c;中国图象图形学学会主办&#xff0c;苏州科技大学承办&#xff…

干货 | 利用SPSS进行高级统计第一期(更新)

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 在之前的文章中&#xff0c;我们以此介绍了如何利用SPSS进行高级统计分析&#xff0c;内容包括&#xff1a; (1)描述性统计表格模板、卡方&T检验、相关&回归分析 (2)中介、多重中…

MD5_buuctf

概念 MD5信息摘要算法&#xff0c;一种被广泛使用的密码散列函数&#xff0c;可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确保信息传输完整一致。 MD5算法具有以下特点&#xff1a; 压缩性&#xff1a;任意…

一次失败的面试经历:我只想找个工作,你却看不起我?还用面试题羞辱我...

这段时间都说难找工作&#xff0c;没有面试机会。面对如此严峻的形式&#xff0c;很多软件测试人员都希望能拿一个满意的高薪offer&#xff0c;但是随着招聘职位的不断增多&#xff0c;面试的难度也随之加大&#xff0c;而面试官更是会择优录取 我最近为面试已经焦头烂额了&am…

循坏队列+OJ题之设计循环队列

生命不是要等待风暴过去&#xff0c;而是要学会在风暴中跳舞。 ——卡莉尔吉布朗目录 &#x1f33a;前言&#xff1a; &#x1f341;一.循环队列是什么&#xff1f; &#x1f34f;二.循环队列有什么作用&#xff1f; &#x1f340;三.OJ题之设计循环队列 1…

C++(3):字符串、向量和数组

命名空间的 using 声明 using namespace::name;1.每个名字都需要独立的 using 声明&#xff1b; 2.头文件不应包含 using 声明&#xff1a; 因为头文件的内容会拷贝到所有引用它的文件中去&#xff0c;如果头文件里有某个using声明&#xff0c;那么每个使用了该头文件的文件就…

Apache Kafka - 重识Kafka生产者

文章目录 概述Kafka 生产者Kafka 生产者工作原理如何使用 Kafka 生产者 生产者配置项&#xff08;核心&#xff09;导图总结 概述 Kafka 生产者是 Apache Kafka 中的一个重要组件&#xff0c;它负责将数据发送到 Kafka 集群中。在实时数据处理和流式处理应用程序中&#xff0c…

如何自建个人音乐播放器Navidrome

文章目录 1. 前言2. Navidrome网站搭建2.1 Navidrome下载和安装2.1.1 安装并添加ffmpeg2.1.2下载并配置Navidrome2.1.3 添加Navidrome到系统服务 2.2. Navidrome网页测试 3. 本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4. 公网访问测试5. 结语 转…

【总结】Nupmy1

Nupmy numpy的核心是名为ndarray的数据类型&#xff0c;它代表多维数组&#xff0c;封装了操作数据的运算和方法 1. 创建数组对象 1.1 方法1:array 通过array将list转换成数据对象 # 通过array将list转换成数据对象 array1np.array([1,2,3,4,5]) array1 # array([1, 2, 3,…