基于QT的全自动超声波焊接机上位机追溯系统(已经在设备上应用)
应用说明:
本上位机程序是我在做锂电池产线项目的时候开发的,用于采集设备数据以及实现设备自动控制,下位机采用基恩士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的全自动超声波焊接机上位机追溯系统(已经在设备上应用)的更多相关文章
- 【专题教程第8期】基于emWin模拟器的USB BULK上位机开发,仅需C即可,简单易实现
说明:1.如果你会emWin话的,就可以轻松制作上位机.做些通信和控制类上位机,比使用C#之类的方便程度一点不差,而且你仅会C语言就可以.2.并且成功将emWin人性化,可以做些Windows系统上的 ...
- 【安富莱专题教程第6期】SEGGER的J-Scope波形上位机软件,RTT模式波形上传速度可狂飙到500KB/S左右
说明:1.在实际项目中,很多时候,我们需要将传感器或者ADC的数值以波形的形式显示.通常的解决办法是用串口上位机,USB接口上位机或者MDK的逻辑分析仪功能,使用这三种方式都比较繁琐.本期专题为大家讲 ...
- (原创)使用C#开发高性能PLC上位机监控系统服务器应用程序
PLC服务器监控系统的特点: 1·使用微软C#面向对象开发语言开发应用程序.2·使用了健壮性与性能良好的SUPER SOCKET服务器通信框架,实现自定义应用层通信协议,支持多台PC客户端访问服务器, ...
- (原创)如何搭建PLC+上位机监控系统达到成本的最小化?
以西门子PLC举例; 西门子PLC有几个型号:S7-200SMART,S7-1200,S7-300,S7-400,S7-1500,价格从低到高. 1个项目中要求的IO数量:600点的DI+DO,若干个 ...
- 基于QT和OpenCV的人脸检測识别系统(1)
人脸识别分为两大步骤 1.人脸检測 这个是首要实现的.你得实现人脸显示的时候把人脸框出来,当然算法非常多,另一些人眼检測鼻子检測什么的 主要用的是这个 const char *faceCascadeF ...
- 基于QT和OpenCV的人脸检測识别系统(2)
紧接着上一篇博客的讲 第二步是识别部分 人脸识别 把上一阶段检測处理得到的人脸图像与数据库中的已知 人脸进行比对,判定人脸相应的人是谁(此处以白色文本显示). 人脸预处理 如今你已经得到一张人脸,你能 ...
- (原创)使用C#开发PLC上位机监控系统客户端应用程序
PLC客户端监控系统的特点: 0.客户端系统软件可部署在 多个管理层的PC机上,或者需要部署在距离服务器较远区域的PC机上,通过网线连接到服务器端的交换机. 1应用范围: (1)所有客户端都只有监视功 ...
- Winform 快速开发框架,上位机开发,工控机程序开发,CS程序开发
1.当客户让你做个CS程序时,当你手上一穷二白,所有都要重复造轮,你是不是很烦. 2.但如果有一个通用的,快速开发框架,就可以把你从这些基础的工作解救出来,你专注做业务就好了. 3.本人其中一个项目的 ...
- C#上位机开发(一)—— 了解上位机
在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形.温度等).用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的: USB转串口 — ...
随机推荐
- NetCore控制台程序-使用HostService和HttpClient实现简单的定时爬虫
.NetCore承载系统 .NetCore的承载系统, 可以将长时间运行的服务承载于托管进程中, AspNetCore应用其实就是一个长时间运行的服务, 启动AspNetCore应用后, 它就会监听网 ...
- Codeforces Round #594 (Div. 2) D1 - The World Is Just a Programming Task (贪心)
思路:枚举换的位置i,j 然后我们要先判断改序列能否完全匹配 如果可以 那我们就需要把差值最大的位置换过来 然后直接判断就行
- POJ - 1226 Substrings (后缀数组)
传送门:POJ - 1226 这个题跟POJ - 3294 和POJ - 3450 都是一样的思路,一种题型. POJ - 3294的题解可以见:https://www.cnblogs.com/li ...
- 【noi 2.6_1808】最长公共子序列(DP)
题意:给2个字符串求其最大公共子序列的长度.解法:这个和一般的状态定义有点不一样,f[i][j]表示 str 前i位和 str2 前j的最大公共子序列的长度,而不是选 str 的第i位和 str2 的 ...
- Educational Codeforces Round 88 (Rated for Div. 2) B、New Theatre Square C、Mixing Water
题目链接:B.New Theatre Square 题意: 你要把所有"." 都变成"*",你可以有两个选择,第一种就是一次铺一个方块(1*1),第二种就是同一 ...
- Round Numbers POJ - 3252
题意: 如果你个数的二进制中1的个数要小于等于0的个数,那么这个数就符合题意.现在要你找出来区间[li,ri]这个区间内有多少这样的数 题解: 题意很明显了,是要用二进制,所以我们也把给的区间边界转化 ...
- Linux core dump使用
什么是 core dump? core dump是一个当进程意外终止时包含进程内存内容的文件.当程序崩溃的时候,core dump由kernel触发.core dump可以作为程序崩溃时的事后快照(p ...
- Kubernets二进制安装(14)之flannel之SNAT规则优化
flannel之SNAT规则优化的目的是由于在K8S中的容器内,访问不同宿主机中的容器的资源的时候,日志文件会记录为宿主机的IP地址,而不是记录为容器本身自己的IP地址,建议在不同的宿主机上的容器互访 ...
- leetcode5 最长回文字符串 动态规划 Manacher法
dp 注意没有声明S不空,处理一下 o(n^2) class Solution { public: string longestPalindrome(string s) { if (s.empty() ...
- ARM cache 工作方式
综述 现在的CPU的速度远远高于现代存储器的速度所以出现了cache.按和CPU距离分为L1级和L2级(SM)等.这里主要记录一下自己对cache的工作方式的学习理解. cache工作方式 cahe是 ...