应用说明:

本上位机程序是我在做锂电池产线项目的时候开发的,用于采集设备数据以及实现设备自动控制,下位机采用基恩士PLC,超声波机采用上海一家的超声波焊接机,实现电芯极耳的自动焊接,上位在设备焊接过程中记录焊接数据,同时监控设备异常。

主要功能有:@1.设备监控;@2.PLC TCP/IP通讯;@3超声波焊接机通讯;@4扫码枪通讯;@5.用户登录方可有操作权限;@6数据采集;@7PLC控制;@8数据持久化等


1.其主界面见下图:



2.参数设置界面如下:



3.IO界面见下图:



4.手动操作界面如下所示:



5.MES对接界面:

由于程序文件较大,所以这里只给出一些示例程序:

1.主程序如下:

`#include "messystem.h"

include "appinit.h"

include

include

include

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))

if _MSC_VER

QTextCodec *codec = QTextCodec::codecForName("gbk");

else

QTextCodec *codec = QTextCodec::codecForName("utf-8");

endif

QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);

else

QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(codec);

endif

//加载样式表
QFile file(":/qss/psblack.css");
if (file.open(QFile::ReadOnly)) {
QString qss = QLatin1String(file.readAll());
QString paletteColor = qss.mid(20, 7);
qApp->setPalette(QPalette(QColor(paletteColor)));
qApp->setStyleSheet(qss);
file.close();
} a.setFont(QFont("Microsoft Yahei", 9));
AppInit::Instance()->start(); UIDemo01 w;
w.show(); return a.exec();

}`

2.扫码枪程序

codereader.h文件

`#ifndef CODEREADER_H

define CODEREADER_H

include

include

include

class CodeReader : public QObject

{

Q_OBJECT

public:

explicit CodeReader(QObject *parent = 0);

~CodeReader();

void connectCodeReader(const QString &host,const QString port);
void disconnectCodeReader(); void SendCmd(const QString cmd); QString readCode(); bool getStstus() const;
void setStstus(bool value); int getLength() const;
void setLength(int value); QString getCmd() const;
void setCmd(const QString &value); QString getCodedata() const;
void setCodedata(const QString &value);

signals:

void receivedData();

void SendLog(QString str);

public slots:

void doConnectClient();

void doDisconnectClient();

void doClientStateChange(QAbstractSocket::SocketState ss);

void doClientReadReady();

void doClientSocketError(QAbstractSocket::SocketError e);

private:

QTcpSocket * client;//扫码枪连接

bool ststus;//扫码枪连接状态

QString cmd;//扫码枪触发指令

int length;//条码长度

QString codedata;//条码

void Init();//初始化扫码枪

};

endif // CODEREADER_H`

codereader.cpp文件

`#include "codereader.h"

CodeReader::CodeReader(QObject *parent) : QObject(parent)

{

Init();

}

CodeReader::~CodeReader()

{

client->close();

delete client;

}

void CodeReader::connectCodeReader(const QString &host, const QString port)

{

if(host.isEmpty() || port.isEmpty())

{

QMessageBox::warning(qobject_cast<QDialog > (this->parent()),"error",tr("用户名和密码能不能为空"));

return;

}

client->connectToHost(host,port.toInt());

}

/
*

  • @brief CodeReader::disconnectCodeReader
  • 断开扫码枪的连接

    */

    void CodeReader::disconnectCodeReader()

    {

    client->disconnectFromHost();

    }

void CodeReader::SendCmd(const QString cmd)

{

QByteArray bacmd = cmd.toLocal8Bit();

client->write(bacmd);

}

bool CodeReader::getStstus() const

{

return ststus;

}

void CodeReader::setStstus(bool value)

{

ststus = value;

}

int CodeReader::getLength() const

{

return length;

}

void CodeReader::setLength(int value)

{

length = value;

}

QString CodeReader::getCmd() const

{

return cmd;

}

void CodeReader::setCmd(const QString &value)

{

cmd = value;

}

/**

  • @brief CodeReader::doConnectClient

  • 处理连接上槽函数

    /

    void CodeReader::doConnectClient()

    {

    setStstus(true);

    emit SendLog(tr("扫码枪已连接!"));

    }

    /
    *

  • @brief CodeReader::doDisconnectClient

  • 处理断开连接槽函数

    /

    void CodeReader::doDisconnectClient()

    {

    setStstus(false);

    emit SendLog(tr("扫码枪连接断开!"));

    }

    /
    *

  • @brief CodeReader::doClientStateChange

  • @param ss

  • 处理连接状态改变槽函数

    */

    void CodeReader::doClientStateChange(QAbstractSocket::SocketState ss)

    {

    if(ss==QAbstractSocket::QAbstractSocket::UnconnectedState)

    {

    setStstus(false);

    }

    else

    {

    setStstus(true);

    }

}

/**

  • @brief CodeReader::doClientReadReady

  • 处理接收数据槽函数

    */

    void CodeReader::doClientReadReady()

    {

    QByteArray badata = client->readAll();

    QString datacode = QString(badata);

    datacode = datacode.trimmed();

    if(datacode.length()>1)

    {

    //emit SendLog(tr("读取到数据"));

    setCodedata(datacode);

    //emit SendLog(datacode);

    emit receivedData();

    }

}

/**

  • @brief CodeReader::doClientSocketError
  • @param e
  • 处理socket错误槽函数

    */

    void CodeReader::doClientSocketError(QAbstractSocket::SocketError e)

    {

    emit SendLog(tr("扫码枪连接发生错误!"));

    // switch (e) {

    // case QAbstractSocket::ConnectionRefusedError:

    // QMessageBox::warning(qobject_cast<QDialog *> (this->parent()),"error","The connection was refused by the peer (or timed out)");

    // break;

    // case QAbstractSocket::RemoteHostClosedError:

    // QMessageBox::warning(qobject_cast<QDialog *> (this->parent()),"error","The remote host closed the connection");

    // break;

    // case QAbstractSocket::HostNotFoundError:

    // QMessageBox::warning(qobject_cast<QDialog *> (this->parent()),"error","The host address was not found.");

    // break;

    // case QAbstractSocket::SocketAccessError:

    // QMessageBox::warning(qobject_cast<QDialog *> (this->parent()),"error","The socket operation failed because the application lacked the required privileges");

    // break;

    // case QAbstractSocket::SocketTimeoutError:

    // QMessageBox::warning(qobject_cast<QDialog *> (this->parent()),"error","The socket operation timed out.");

    // break;

    // case QAbstractSocket::DatagramTooLargeError:

    // QMessageBox::warning(qobject_cast<QDialog *> (this->parent()),"error","The datagram was larger than the operating system's limit (which can be as low as 8192 bytes).");

    // break;

    // case QAbstractSocket::NetworkError:

    // QMessageBox::warning(qobject_cast<QDialog *> (this->parent()),"error","An error occurred with the network (e.g., the network cable was accidentally plugged out).");

    // break;

    // case QAbstractSocket::AddressInUseError:

    // QMessageBox::warning(qobject_cast<QDialog *> (this->parent()),"error","The address specified to QAbstractSocket::bind() is already in use and was set to be exclusive.");

    // break;

    // default:

    // QMessageBox::warning(qobject_cast<QDialog *> (this->parent()),"error","An unidentified error occurred.");

    // break;

    // }

    }

    QString CodeReader::getCodedata() const

    {

    return codedata;

    }

void CodeReader::setCodedata(const QString &value)

{

codedata = value;

}

/**

  • @brief CodeReader::Init
  • init codereader

    */

    void CodeReader::Init()

    {

    ststus = false;

    client = new QTcpSocket(this);

    connect(client,SIGNAL(connected()),this,SLOT(doConnectClient()));

    connect(client,SIGNAL(disconnected()),this,SLOT(doDisconnectClient()));

    connect(client,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(doClientStateChange(QAbstractSocket::SocketState)));

    connect(client,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(doClientSocketError(QAbstractSocket::SocketError)));

    connect(client,SIGNAL(readyRead()),this,SLOT(doClientReadReady()));

}`

3.工程目录如下:

由于代码量较大,这里就不一一列出来了,有需求源码的朋友可以加我微信:x241602.

基于QT的全自动超声波焊接机上位机追溯系统(已经在设备上应用)的更多相关文章

  1. 【专题教程第8期】基于emWin模拟器的USB BULK上位机开发,仅需C即可,简单易实现

    说明:1.如果你会emWin话的,就可以轻松制作上位机.做些通信和控制类上位机,比使用C#之类的方便程度一点不差,而且你仅会C语言就可以.2.并且成功将emWin人性化,可以做些Windows系统上的 ...

  2. 【安富莱专题教程第6期】SEGGER的J-Scope波形上位机软件,RTT模式波形上传速度可狂飙到500KB/S左右

    说明:1.在实际项目中,很多时候,我们需要将传感器或者ADC的数值以波形的形式显示.通常的解决办法是用串口上位机,USB接口上位机或者MDK的逻辑分析仪功能,使用这三种方式都比较繁琐.本期专题为大家讲 ...

  3. (原创)使用C#开发高性能PLC上位机监控系统服务器应用程序

    PLC服务器监控系统的特点: 1·使用微软C#面向对象开发语言开发应用程序.2·使用了健壮性与性能良好的SUPER SOCKET服务器通信框架,实现自定义应用层通信协议,支持多台PC客户端访问服务器, ...

  4. (原创)如何搭建PLC+上位机监控系统达到成本的最小化?

    以西门子PLC举例; 西门子PLC有几个型号:S7-200SMART,S7-1200,S7-300,S7-400,S7-1500,价格从低到高. 1个项目中要求的IO数量:600点的DI+DO,若干个 ...

  5. 基于QT和OpenCV的人脸检測识别系统(1)

    人脸识别分为两大步骤 1.人脸检測 这个是首要实现的.你得实现人脸显示的时候把人脸框出来,当然算法非常多,另一些人眼检測鼻子检測什么的 主要用的是这个 const char *faceCascadeF ...

  6. 基于QT和OpenCV的人脸检測识别系统(2)

    紧接着上一篇博客的讲 第二步是识别部分 人脸识别 把上一阶段检測处理得到的人脸图像与数据库中的已知 人脸进行比对,判定人脸相应的人是谁(此处以白色文本显示). 人脸预处理 如今你已经得到一张人脸,你能 ...

  7. (原创)使用C#开发PLC上位机监控系统客户端应用程序

    PLC客户端监控系统的特点: 0.客户端系统软件可部署在 多个管理层的PC机上,或者需要部署在距离服务器较远区域的PC机上,通过网线连接到服务器端的交换机. 1应用范围: (1)所有客户端都只有监视功 ...

  8. Winform 快速开发框架,上位机开发,工控机程序开发,CS程序开发

    1.当客户让你做个CS程序时,当你手上一穷二白,所有都要重复造轮,你是不是很烦. 2.但如果有一个通用的,快速开发框架,就可以把你从这些基础的工作解救出来,你专注做业务就好了. 3.本人其中一个项目的 ...

  9. C#上位机开发(一)—— 了解上位机

    在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形.温度等).用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的: USB转串口 — ...

随机推荐

  1. P4755 Beautiful Pair (分治 + 主席树)

    题意:1e5的数组 计算有多少对 ai * aj <= max(ai ai+1...aj-1 aj) 题解:在处理这种涉及到区间极值的题时 好像是个套路分治 从级值中间分成两个区间 从区间短的那 ...

  2. POJ1113:Wall (凸包算法学习)

    题意: 给你一个由n个点构成的多边形城堡(看成二维),按顺序给你n个点,相邻两个点相连. 让你围着这个多边形城堡建一个围墙,城堡任意一点到围墙的距离要求大于等于L,让你求这个围墙的最小周长(看成二维平 ...

  3. CF1463-B. Find The Array

    题意: 给出一个由n个数组成的数组a,这个数组的元素和为S,要求你找出一个由n个数字组成数组b,这个数组满足: 数组中的每个数可以将他两边的数字整除或者被他两边的数字整除 数组b中每个位置的数字减去数 ...

  4. [视频] Docker 安装 nginx + rtmp

    目录 拉取镜像 创建并运行容器,映射出两个端口1935.80 将视频文件推流至rtmp服务器 使用ffplay播放rtmp流 拉取镜像 docker pull alfg/nginx-rtmp 创建并运 ...

  5. hive+postgres安装部署过程

    master节点安装元数据库,采用postgres:#useradd postgres#password postgressu - postgreswget https://ftp.postgresq ...

  6. 一道思维题 &&递归改循环

    思路: 比如5 2 12345--> 1245 从3开始,这时候5变成了1.剩下4512,对应1234.只需要找到现在n-1,k中的数对应原来的编号的映射. 比如1-->3 是1+2 mo ...

  7. R语言学习2:绘图

    本系列是一个新的系列,在此系列中,我将和大家共同学习R语言.由于我对R语言的了解也甚少,所以本系列更多以一个学习者的视角来完成. 参考教材:<R语言实战>第二版(Robert I.Kaba ...

  8. Google Developer Profile

    Google Developer Profile https://google.dev/u/me https://google.dev/u/109030792841960772125 Google D ...

  9. ECMAScript 2021 新特性

    ECMAScript 2021 新特性 refs https://codeburst.io/exciting-features-of-javascript-es2021-es12-1de8adf655 ...

  10. 微信小程序 HTTP API

    微信小程序 HTTP API promise API https://www.npmtrends.com/node-fetch-vs-got-vs-axios-vs-superagent node-f ...