目录

一,总体介绍

二,需要的软件

三,需要的硬件

四,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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐