基于QT开发的使用OPC

您所在的位置:网站首页 西门子opc 基于QT开发的使用OPC

基于QT开发的使用OPC

2024-02-13 01:14| 来源: 网络整理| 查看: 265

目录

一,总体介绍

二,需要的软件

三,需要的硬件

四,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 int main(int argc, char *argv[]) { QApplication a(argc, argv); OpcUaClientByQT w; w.show(); return a.exec(); }

2.主界面代码

#pragma once #include #include "ui_OpcUaClientByQT.h" #include "wavechart.h" #include #include #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 #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 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 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 #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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3