半导体设备系列(2) 半导体设备与工厂控制仿真器Demo编写

news2024/11/25 20:45:44

可以用CS架构编写这两个仿真器,将设备写成服务器,接收来自工厂控制程序的命令。后续加上半导体设备通信协议。

  • 半导体设备服务器

1)工程文件

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    deviceserver.cpp \
    main.cpp \
    deviceservergui.cpp

HEADERS += \
    deviceserver.h \
    deviceservergui.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

2)DeviceServer类:

#ifndef DEVICESERVER_H
#define DEVICESERVER_H

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>

class DeviceServer : public QObject
{
    Q_OBJECT

public:
    explicit DeviceServer(QObject *parent = nullptr);
    void startServer(quint16 port);

signals:
    void dataReceived(const QString &data);
    void statusChanged(const QString &status);

private slots:
    void newConnection();
    void readClientData();
    void clientDisconnected();

private:
    QTcpServer *tcpServer;
    QTcpSocket *clientSocket;
};

#endif // DEVICESERVER_H
#include "DeviceServer.h"
#include <QDebug>

DeviceServer::DeviceServer(QObject *parent) : QObject(parent), tcpServer(new QTcpServer(this)), clientSocket(nullptr)
{
    connect(tcpServer, &QTcpServer::newConnection, this, &DeviceServer::newConnection);
}

void DeviceServer::startServer(quint16 port)
{
    if (!tcpServer->listen(QHostAddress::Any, port)) {
        emit statusChanged("Failed to start server: " + tcpServer->errorString());
        return;
    }
    emit statusChanged("Server started on port " + QString::number(port));
}

void DeviceServer::newConnection()
{
    if (clientSocket) {
        clientSocket->deleteLater();
    }
    clientSocket = tcpServer->nextPendingConnection();
    connect(clientSocket, &QTcpSocket::readyRead, this, &DeviceServer::readClientData);
    connect(clientSocket, &QTcpSocket::disconnected, this, &DeviceServer::clientDisconnected);
    emit statusChanged("New client connected");
}

void DeviceServer::readClientData()
{
    QByteArray data = clientSocket->readAll();
    emit dataReceived(data);
    clientSocket->write("Acknowledged");
}

void DeviceServer::clientDisconnected()
{
    emit statusChanged("Client disconnected");
    clientSocket->deleteLater();
    clientSocket = nullptr;
}

3)DeviceServerGUI类

#ifndef DEVICESERVERGUI_H
#define DEVICESERVERGUI_H

#include <QWidget>
#include <QTextEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include "DeviceServer.h"

class DeviceServerGUI : public QWidget
{
    Q_OBJECT

public:
    explicit DeviceServerGUI(QWidget *parent = nullptr);

private slots:
    void startServer();
    void handleDataReceived(const QString &data);
    void handleStatusChanged(const QString &status);

private:
    DeviceServer *deviceServer;
    QTextEdit *logTextEdit;
    QPushButton *startButton;
};

#endif // DEVICESERVERGUI_H
#include "DeviceServerGUI.h"
#include <QDebug>

DeviceServerGUI::DeviceServerGUI(QWidget *parent)
    : QWidget(parent), deviceServer(new DeviceServer(this))
{
    QVBoxLayout *layout = new QVBoxLayout(this);

    logTextEdit = new QTextEdit(this);
    logTextEdit->setReadOnly(true);
    layout->addWidget(logTextEdit);

    startButton = new QPushButton("Start Server", this);
    layout->addWidget(startButton);

    setLayout(layout);

    connect(startButton, &QPushButton::clicked, this, &DeviceServerGUI::startServer);
    connect(deviceServer, &DeviceServer::dataReceived, this, &DeviceServerGUI::handleDataReceived);
    connect(deviceServer, &DeviceServer::statusChanged, this, &DeviceServerGUI::handleStatusChanged);
}

void DeviceServerGUI::startServer()
{
    deviceServer->startServer(1234); // Start server on port 1234
}

void DeviceServerGUI::handleDataReceived(const QString &data)
{
    logTextEdit->append("Received data: " + data);
}

void DeviceServerGUI::handleStatusChanged(const QString &status)
{
    logTextEdit->append(status);
}

4)主程序

#include <QApplication>
#include "DeviceServerGUI.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    DeviceServerGUI serverGui;
    serverGui.show();

    return a.exec();
}
  • 工厂控制客户端

1)工程文件

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    factoryclient.cpp \
    main.cpp \
    factoryclientgui.cpp

HEADERS += \
    factoryclient.h \
    factoryclientgui.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

2)FactoryClient类

#ifndef FACTORYCLIENT_H
#define FACTORYCLIENT_H

#include <QObject>
#include <QTcpSocket>

class FactoryClient : public QObject
{
    Q_OBJECT

public:
    explicit FactoryClient(QObject *parent = nullptr);
    void connectToServer(const QString &host, quint16 port);
    void sendCommand(const QByteArray &command);

signals:
    void responseReceived(const QString &response);
    void statusChanged(const QString &status);

private slots:
    void readServerResponse();

private:
    QTcpSocket *tcpSocket;
};

#endif // FACTORYCLIENT_H
#include "FactoryClient.h"
#include <QDebug>

FactoryClient::FactoryClient(QObject *parent) : QObject(parent), tcpSocket(new QTcpSocket(this))
{
    connect(tcpSocket, &QTcpSocket::readyRead, this, &FactoryClient::readServerResponse);
}

void FactoryClient::connectToServer(const QString &host, quint16 port)
{
    tcpSocket->connectToHost(host, port);
    if (!tcpSocket->waitForConnected(3000)) {
        emit statusChanged("Failed to connect to server: " + tcpSocket->errorString());
    } else {
        emit statusChanged("Connected to server");
    }
}

void FactoryClient::sendCommand(const QByteArray &command)
{
    if (tcpSocket->state() == QTcpSocket::ConnectedState) {
        tcpSocket->write(command);
        tcpSocket->flush();
    } else {
        emit statusChanged("Not connected to server");
    }
}

void FactoryClient::readServerResponse()
{
    QByteArray response = tcpSocket->readAll();
    emit responseReceived(response);
}

3)Factory ClientGUI类

#ifndef FACTORYCLIENTGUI_H
#define FACTORYCLIENTGUI_H

#include <QWidget>
#include <QTextEdit>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include "FactoryClient.h"

class FactoryClientGUI : public QWidget
{
    Q_OBJECT

public:
    explicit FactoryClientGUI(QWidget *parent = nullptr);

private slots:
    void connectToServer();
    void sendCommand();
    void handleResponseReceived(const QString &response);
    void handleStatusChanged(const QString &status);

private:
    FactoryClient *factoryClient;
    QLineEdit *hostLineEdit;
    QLineEdit *portLineEdit;
    QLineEdit *commandLineEdit;
    QTextEdit *logTextEdit;
    QPushButton *connectButton;
    QPushButton *sendButton;
};

#endif // FACTORYCLIENTGUI_H
#include "FactoryClientGUI.h"
#include <QDebug>

FactoryClientGUI::FactoryClientGUI(QWidget *parent)
    : QWidget(parent), factoryClient(new FactoryClient(this))
{
    QVBoxLayout *mainLayout = new QVBoxLayout(this);

    QHBoxLayout *connectLayout = new QHBoxLayout();
    hostLineEdit = new QLineEdit(this);
    hostLineEdit->setPlaceholderText("Host");
    connectLayout->addWidget(hostLineEdit);
    portLineEdit = new QLineEdit(this);
    portLineEdit->setPlaceholderText("Port");
    connectLayout->addWidget(portLineEdit);
    connectButton = new QPushButton("Connect", this);
    connectLayout->addWidget(connectButton);
    mainLayout->addLayout(connectLayout);

    QHBoxLayout *commandLayout = new QHBoxLayout();
    commandLineEdit = new QLineEdit(this);
    commandLineEdit->setPlaceholderText("Command");
    commandLayout->addWidget(commandLineEdit);
    sendButton = new QPushButton("Send Command", this);
    commandLayout->addWidget(sendButton);
    mainLayout->addLayout(commandLayout);

    logTextEdit = new QTextEdit(this);
    logTextEdit->setReadOnly(true);
    mainLayout->addWidget(logTextEdit);

    setLayout(mainLayout);

    connect(connectButton, &QPushButton::clicked, this, &FactoryClientGUI::connectToServer);
    connect(sendButton, &QPushButton::clicked, this, &FactoryClientGUI::sendCommand);
    connect(factoryClient, &FactoryClient::responseReceived, this, &FactoryClientGUI::handleResponseReceived);
    connect(factoryClient, &FactoryClient::statusChanged, this, &FactoryClientGUI::handleStatusChanged);
}

void FactoryClientGUI::connectToServer()
{
    QString host = hostLineEdit->text();
    quint16 port = portLineEdit->text().toUShort();
    factoryClient->connectToServer(host, port);
}

void FactoryClientGUI::sendCommand()
{
    QByteArray command = commandLineEdit->text().toUtf8();
    factoryClient->sendCommand(command);
}

void FactoryClientGUI::handleResponseReceived(const QString &response)
{
    logTextEdit->append("Received response: " + response);
}

void FactoryClientGUI::handleStatusChanged(const QString &status)
{
    logTextEdit->append(status);
}

4)主程序

#include <QApplication>
#include "FactoryClientGUI.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    FactoryClientGUI clientGui;
    clientGui.show();

    return a.exec();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2124921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 操作系统下的convertquota命令介绍和使用案例

linux 操作系统下的convertquota命令介绍和使用案例 convertquota命令介绍 convertquota是Linux系统中用于转换旧格式的用户和组配额文件的命令。它可以将旧格式的quota.user和quota.group文件转换为新格式的aquota.user和aquota.group文件。新格式的配额文件支持32位的uid/g…

有关WSL和docker的介绍

目录标题 如何利用在windows上配置docker实现linux和windows容器修改WSL默认安装&#xff08;也就是linux子系统&#xff09;目录到其他盘 如何利用在windows上配置docker实现linux和windows容器 wsl的基本命令&#xff1a;参考网页 docker入门到实践&#xff1a;参考网页 官方…

深度学习基础--卷积网络

图像的三个特性指出了专门模型架构的必要性。 首先&#xff0c;图像是高维的&#xff0c;一个用于分类任务的典型图像含有 224224 RGB 值&#xff08;即&#xff0c;150528 个输入维度&#xff09;。在全连接网络中&#xff0c;隐藏层的规模通常超过输入大小&#xff0c;因此&a…

uniapp中使用uni.$emit和uni.$on在vue和nvue页面之间传值但是无法赋值的问题

背景&#xff1a;我们在vue页面和nvue页面之间进行传值可以使用uni.$emit和uni.$onsh事件监听实现&#xff0c;官网描述&#xff1a;uni-app官网 (dcloud.net.cn)https://uniapp.dcloud.net.cn/api/window/communication.html#emit 而且官网上也明确说明了&#xff1a; 一、问…

SLMi33x系列SLMi330HCG-DG具有主动保护功能 兼容光耦的单通道带保护功能的隔离驱动器

SLMi33x系列SLMi330HCG-DG优势和亮点&#xff1a;国内首款带DESAT保护功能并兼容光耦驱动的IGBT/SiC隔离驱动器&#xff0c;5kVrms隔离电压和高达10kV的隔离浪涌电压&#xff0c;CMTI超过100kV/us SLMi330HCG-DG内置快速去饱和(DESAT) 故障检测功能、米勒钳位功能、漏极开路故…

棋牌灯控箱计时计费管理系统软件网关端口设置方法 佳易王麻将馆计时收银会员管理系统操作教程

一、前言 棋牌灯控箱计时计费管理系统软件网关端口设置方法 佳易王麻将馆计时收银会员管理系统操作教程 1、佳易王计时计费软件可接配套的灯控器 2、计时开灯则打开对应的灯 3、结账后自动关灯。 二、软件程序功能图文 1、当前计费方式可以按单价或时间段 2、软件解压即可…

永成分歧式防爆器Y-FBQ型

永成分歧式防爆器Y-FBQ型 当努力成为生活的常态&#xff0c; 生活就时刻充满期待&#xff0c; 深知每份订单都是信任&#xff0c; 品质和专业是我晒单的底气。 用途 型号为Y-FBQ型&#xff0c;分歧式防爆器是安装在瓦斯抽放管路中的简易防爆装置。此款产品主要由进气管、出气…

HarmonyOS开发5.0【rcp网络请求】

一 概述 现在鸿蒙的网络还不成熟&#xff0c;所以咱们需要对网络请求框架二次封装&#xff0c;并且避免业务方直接引用到,预防当有比较新的成熟性价比高的框架的替换&#xff0c;这个过程肯定是不可避免的 1.1 第三方比如 [axios]的js库迁移过来的[httpclient]通过socket&am…

Linux s3c2440 开发板上的操作系统实现 ubuntu

使用s3c2440开发板 使用ubuntu 1.ubuntu中的tftp&#xff0c;和nfs Trivial File Transfer Protocol,简单文件 传输协议。 通过网络在客户端与服务器之间进行简单文件 传输。提供不复杂、开销不大的文件传输服务。 Network File System&#xff0c;网络文件系统。通过 网络…

OpenStack概论和部署

目录 1.1 云计算概述 1.1.1 什么是云计算 1.laaS 2.PaaS 3.Saas 1.1.2 0penStack 概述 1.OpenStack 起源 2.什么是 Openstack 3.OpenStack 优势 1.2 安装方式 1.2.1 在线安装 1.配置系统基本环境 2.为系统设置阿里的仓库 3&#xff1a;设置kvm源 4&#xff1a;设…

【HarmonyOS】头像圆形裁剪功能之手势放大缩小,平移,双击缩放控制(三)

【HarmonyOS】头像裁剪之手势放大缩小&#xff0c;平移&#xff0c;双击缩放控制&#xff08;三&#xff09; 一、DEMO效果图&#xff1a; 二、开发思路&#xff1a; 使用矩阵变换控制图片的放大缩小和平移形态。 通过监听点击手势TapGesture&#xff0c;缩放手势PinchGes…

安泰功率放大器在压电马达中的应用实例

压电马达是一种利用压电效应的装置&#xff0c;通过在压电陶瓷上施加电场&#xff0c;引发其形变从而产生机械振动。在这个领域&#xff0c;功率放大器的应用为提高效率、精准控制和创新性应用提供了可能。下面将深入介绍功率放大器在压电马达中的实际应用例子。 压电效应是指在…

三维数字图像相关法(3D-DIC)用于复合材料力学性能测试

三维数字图像相关法&#xff08;3D-DIC技术&#xff09;&#xff0c;通过将物体表面随机分布的斑点或伪随机分布的人工散斑场作为变形信息载体&#xff0c;是应用于计算机视觉技术的一种图像测量方法&#xff0c;是一种非接触的&#xff0c;用于全场三维坐标、位移、应变及运动…

微信双开及多开!

在工作中大家可能会在pc端用到一台机器打开多个微信&#xff0c;但是现在windows更新之后&#xff0c;双击就只能打开一个了&#xff0c;以下有两种方式可以微信双开甚至多开。 第一种就是很简单的&#xff1a; ps: taskkill /f /im wechat.exe 这一步的用途就是先清除你电脑…

北京链家星河湾店·鸿鹄向阳杯羽毛球赛成功举办

9月10日&#xff0c;为了提高社区居民身体素质&#xff0c;促进社区居民间友好交流&#xff0c;北京链家星河湾店联合鸿鹄向阳俱乐部于在四季体育馆联合举办了羽毛球大赛&#xff0c;星河湾的社区居民积极参加&#xff0c;分组合作&#xff0c;在比赛中表现出团结合作不服输的精…

AbMole总RNA提取试剂 (免氯仿) AbMole Easy Trizol (Tcm Free)

AbMole Easy Trizol (Tcm Free) 是传统Trizol 的免氯仿升级版&#xff0c;广泛适用于从各类动物组织、植物材料、培养细胞、细菌等样品中提取Total RNA和Small RNA。与传统 Trizol 提取方法相比&#xff0c;本产品不需要使用氯仿进行分层&#xff0c;操作更简单&#xff0c;且全…

视频倒放怎么制作?4种方法教你制作倒放视频

视频倒放怎么制作&#xff1f;视频倒放&#xff0c;作为一种独具匠心的编辑手法&#xff0c;为视频创作开辟了新的维度。它不仅让常规画面变得非比寻常&#xff0c;还能以逆向视角展现时间流逝的奇幻效果&#xff0c;极大地丰富了视频的表现力和趣味性&#xff0c;是扩充视频创…

降本、创新、合作,谁才是连接器行业破除内卷的关键词?

如果用一个字来评价2024年的汽车行业&#xff0c;那就是「卷」。 ▲中国汽车保有量不断提升 图/Pixabay 长安汽车董事长朱华荣说&#xff1a;“汽车行业的卷&#xff0c;让中国品牌达到了新高度。” 吉利董事长李书福说&#xff1a;“中国汽车工业内卷程度全球第一&#xff0c;…

C++运算符重载实现日期类

目录 运算符重载 日期类头文件time.h time.h 日期类成员函数文件time.cpp 1.GetMonthDay函数 2.构造函数Date::Date(int year, int month, int day) 3.赋值函数Date& operator(const Date& d) 4.Date& Date::operator(int day)函数实现日期加天数的功能 5.前置…

用编程思想解决问题

1.是什么 分解法&#xff1a;将复杂的问题分解为一个个小又容易的问题&#xff0c;再逐一解决 先常后变&#xff1a;先使用常量来解决问题后使用变量来代替常量&#xff0c;使代码变得更灵活 例题一&#xff1a; 请你使用Switch分支结构根据输入的分数来定成绩所在区间&…