目录
一,总体介绍
二,需要的软件
三,需要的硬件
四,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