上位机 订阅
上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机single chip microcomputer/slave computer/lower computer之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。简言之如此,实际情况千差万别,但万变不离其宗:上下位机都需要编程,都有专门的开发系统。在概念上,控制者和提供服务者是上位机,被控制者和被服务者是下位机,也可以理解为主机和从机的关系,但上位机和下位机是可以转换的。 展开全文
上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机single chip microcomputer/slave computer/lower computer之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。简言之如此,实际情况千差万别,但万变不离其宗:上下位机都需要编程,都有专门的开发系统。在概念上,控制者和提供服务者是上位机,被控制者和被服务者是下位机,也可以理解为主机和从机的关系,但上位机和下位机是可以转换的。
信息
对    象
控制者和提供服务者
定    义
可以直接发出操控命令的计算机
特    点
需要编程,都有专门的开发系统
中文名
上位机
外文名
master computer
上位机工作原理
两机如何通讯,一般取决于下位机,TCP/IP一般是支持的,但是下位机一般具有更可靠的独有通讯协议,购买下位机时,会带一大堆手册光盘,告诉你如何使用特有协议通讯,里面会举大量例子,一般对编程人员而言一看也就那么回事,使用一些新的API(API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节罢了,多语言支持功能模块,一般同时支持数种高级语言为上位机编程。通常上位机和下位机通讯可以采用不同的 通讯协议,可以有RS232的串口通讯或者采用RS485串行通讯。当用计算机和PLC通讯的时候,不但可以采用传统的D形式的串行通讯,还可以采用更适合工业控制的双线的PROFIBUS-DP通讯。采用封装好的程序开发工具就可以实现PLC和上位机的通讯,当然可以自己编写驱动类的接口协议控制上位机和下位机的通讯。通常工控机,工作站,触摸屏作为上位机,通信控制PLC,单片机等作为下位机,从而控制相关设备元件和驱动装置。
收起全文
精华内容
下载资源
问答
  • 上位机

    2010-11-25 13:56:00
     上位机是指人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机之类的。上位机发出的命令首先给下位机...
    展开全文
  • C#上位机开发(一)—— 了解上位机

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

    上百篇原创人工智能系列教程,从理论到实战,手把手带你掌握人工智能,点击☞这里☜进入传送门~

     

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

    • USB转串口 —— 上位机和下位机通过USB转串口连接线直接相连进行数据交互;
    • 串口转WIFI(ESP8266) ——  上位机和下位机基于TCP/IP协议通过WIFI传输数据;
    • 串口转蓝牙(HC-06)—— 不多用,暂不介绍;

      上位机软软件开发主要包括以下两种:

      1、Windows上位机(EXE可执行程序)

         在Windows上,最早用VB语言开发,后来由于C++的发展,采用MFC开发,近几年,微软发布了基于.NET框架的面向对象语言C#,更加稳定安全,再配合微软强大的VS进行开发,效率奇高;

        另外,如果想要在Linux上跨平台运行,可以选用Qt;如果想要更加丰富好看的数据显示界面,可以选用Labview开发;

      2、Android上位机(APP)

        在Android操作系统上,主要采用Java语言,使用WIFI或者蓝牙基于TCP/IP协议传输数据,利用Android Studio开发;

      在此,我们主要介绍如何通过VS + C#开发电脑上位机,其它上位机的开发暂且不论。

     

     注:VS下载与安装参考这篇较详细的博客

       https://blog.csdn.net/qq_36556893/article/details/79430133

     

    展开全文
  • 无线上位机

    2018-12-31 22:04:52
    无线芯片上位机测试
  • BootLoader上位机

    2020-12-19 10:26:04
    bootloader CAN在线刷写,上位机配套程序。VS/MFC编写,支持周立功CAN卡USBCAN-2E-U。
  • 指纹识别上位机,指纹识别模块上位机,R305F上位机程序,FPC1011F上位机
  • 恒温系统上位机恒温控制系统上位机.7z
  • matlab上位机

    2018-02-27 17:26:53
    51单片机 matlab上位机软件 用于51与电脑进行串口通讯
  • 用C#实现工控上位机

    千人学习 2020-09-25 17:30:20
    结合Github高星开源项目SharpSCADA讲解工控上位机开发,重视基础,突出实战,为广大工控从业者、编程爱好者提供一种新颖的解决方案,可以快速搭建强大易用可扩展的工控上位机,并在此开源项目基础上开发工业大数据和...
  • 上位机作为物联网与工业企业智能化的媒介,承担着非常重要的作用,上位机的应用是从事开发的工程师们,在工业企业中是一个非常重要的就业方向。课程资源分为三个部分,分别是.NET上位机基础实战课程,以及C#上位机...
  • 机器人上位机

    2018-09-10 01:58:05
    人形数字舵机机器人上位机程序。(16度)还有个40度的,有需要的请联系我。。。
  • 1. 上位机的作用 在嵌入式项目开发中,无论是单片机项目、嵌入式Linux项目、FPGA项目,上位机始终是一个很重要的部分,主要用于: 数据显示(波形、温度等) 用户控制(LED,继电器等) 文件传输(图像、音频等) 下...
  • QT5串口编程——编写简单的上位机

    万次阅读 多人点赞 2016-01-30 15:51:48
    最近在学习嵌入式,而上位机又是一个不可缺少的工具,于是就开始接触QT,学习编写上位机。刚开始的时候什么都不懂,发现《Qt 学习之路 2》有比较好的入门教程。学习了前面部分,对QT有了大概的了解后,就开始在网上...

    注:更新自2018年12月13日(我回看了一年多前写的这篇博客,觉得不是很好,故翻新了一遍。)

    最近在学习嵌入式,而上位机又是一个不可缺少的工具,于是就开始接触QT,学习编写上位机。刚开始的时候什么都不懂,发现《Qt 学习之路 2》有比较好的入门教程。学习了前面部分,对QT有了大概的了解后,就开始在网上寻找串口编程的方法。通过好几天的学习,终于写出了一个用于串口通信的上位机。下面开始介绍串口类的使用。

    首先,QT5是自带QSerialPort这个类的,使用时需要在pro文件里面添加一行:

    QT       += serialport

    然后直接引用头文件就可以了。

    #include <QSerialPort>        //提供访问串口的功能 
    #include <QSerialPortInfo>    //提供系统中存在的串口的信息

    在QT5中,串口通信是借助一个QSerialPort的对象来实现的,在设置QSerialPort对象对串口的名称、波特率、数据位、校验位、停止位等参数后,方能对串口进行读写。下面,我总结了一下借助QSerailPort对串口进行设置、打开、读、写和关闭的过程。


    一、设置和打开串口

    //创建串口对象
    QSerialPort serial;
    //设置串口名
    serial.setPortName("COM3");
    //设置波特率
    serial.setBaudRate(QSerialPort::Baud9600);
    //设置数据位数
    serial.setDataBits(QSerialPort::Data8);
    //设置奇偶校验
    serial.setParity(QSerialPort::NoParity); 
    //设置停止位
    serial.setStopBits(QSerialPort::OneStop);
    //设置流控制
    serial.setFlowControl(QSerialPort::NoFlowControl);
    //打开串口
    serial.open(QIODevice::ReadWrite);

    以上代码是QSerialPort对象的设置示例,作用是:

    • 设置串口名为 COM3 
    • 设置波特率为9600
    • 设置数据位为8位
    • 设置没有奇偶校验位
    • 设置停止位为1位
    • 设置没有流控制
    • 以可读写的方式打开串口

    设置完这些就能进行读写操作了。如果遇到不理解的地方,可以选择QT的类或函数,然后按F1查阅手册。举个例子,如果我们想查看QSerialPort的其它的属性,可以选择QSerialPort的类名成员函数,然后按F1。


    二、读取数据

    //从接收缓冲区中读取数据
    QByteArray buffer = serial.readAll();
    

    串口在收到数据后,会将数据存入接收缓冲区。此时,我们可以通过readAll()函数将接收缓冲区的数据读出来。当串口的接收缓冲区有数据时,QSerilaPort对象会发出一个readyRead()的信号。因此,我们可以编写一个槽函数来读数据,例如:

    //连接信号和槽
    QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);
    
    ……
    
    //编写的槽函数
    void MainWindow::serialPort_readyRead()
    {
        //从接收缓冲区中读取数据
        QByteArray buffer = serial.readAll();
        
        //处理数据
        //……
    }

    三、发送数据

    serial->write(data);

    使用write函数便可以把字节数组中的字节发送出去。

    四、关闭串口

    serial->close();

    串口不用时,可通过close()函数将其关闭。

     

    接下来是一个实例

    1、创建一个新的Widgets Appliaction工程

    2、使用QtCreator的ui文件来设计上位机的界面,设计如下:

    3、mainwindow.h文件内容如下:

    //mainwindow.h
    
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QSerialPort>
    #include <QSerialPortInfo>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots:
        void serialPort_readyRead();
    
        void on_searchButton_clicked();
    
        void on_openButton_clicked();
    
        void on_sendButton_clicked();
    
        void on_clearButton_clicked();
    
    private:
        Ui::MainWindow *ui;
        QSerialPort serial;
    };
    
    #endif // MAINWINDOW_H
    

    4、mainwindow.cpp文件内容如下:

    //mainwindow.cpp
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QMessageBox>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        //连接信号和槽
        QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);
    
        //发送按键失能
        ui->sendButton->setEnabled(false);
        //波特率默认选择下拉第三项:9600
        ui->baudrateBox->setCurrentIndex(3);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::serialPort_readyRead()
    {
        //从接收缓冲区中读取数据
        QByteArray buffer = serial.readAll();
        //从界面中读取以前收到的数据
        QString recv = ui->recvTextEdit->toPlainText();
        recv += QString(buffer);
        //清空以前的显示
        ui->recvTextEdit->clear();
        //重新显示
        ui->recvTextEdit->append(recv);
    }
    
    
    void MainWindow::on_searchButton_clicked()
    {
        ui->portNameBox->clear();
        //通过QSerialPortInfo查找可用串口
        foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
        {
            ui->portNameBox->addItem(info.portName());
        }
    }
    
    void MainWindow::on_openButton_clicked()
    {
        if(ui->openButton->text()==QString("打开串口"))
        {
            //设置串口名
            serial.setPortName(ui->portNameBox->currentText());
            //设置波特率
            serial.setBaudRate(ui->baudrateBox->currentText().toInt());
            //设置数据位数
            switch(ui->dataBitsBox->currentIndex())
            {
            case 8: serial.setDataBits(QSerialPort::Data8); break;
            default: break;
            }
            //设置奇偶校验
            switch(ui->ParityBox->currentIndex())
            {
            case 0: serial.setParity(QSerialPort::NoParity); break;
            default: break;
            }
            //设置停止位
            switch(ui->stopBitsBox->currentIndex())
            {
            case 1: serial.setStopBits(QSerialPort::OneStop); break;
            case 2: serial.setStopBits(QSerialPort::TwoStop); break;
            default: break;
            }
            //设置流控制
            serial.setFlowControl(QSerialPort::NoFlowControl);
    
            //打开串口
            if(!serial.open(QIODevice::ReadWrite))
            {
                QMessageBox::about(NULL, "提示", "无法打开串口!");
                return;
            }
    
            //下拉菜单控件失能
            ui->portNameBox->setEnabled(false);
            ui->baudrateBox->setEnabled(false);
            ui->dataBitsBox->setEnabled(false);
            ui->ParityBox->setEnabled(false);
            ui->stopBitsBox->setEnabled(false);
    
            ui->openButton->setText(QString("关闭串口"));
            //发送按键使能
            ui->sendButton->setEnabled(true);
        }
        else
        {
            //关闭串口
            serial.close();
    
            //下拉菜单控件使能
            ui->portNameBox->setEnabled(true);
            ui->baudrateBox->setEnabled(true);
            ui->dataBitsBox->setEnabled(true);
            ui->ParityBox->setEnabled(true);
            ui->stopBitsBox->setEnabled(true);
    
            ui->openButton->setText(QString("打开串口"));
            //发送按键失能
            ui->sendButton->setEnabled(false);
        }
    }
    
    void MainWindow::on_sendButton_clicked()
    {
        //获取界面上的数据并转换成utf8格式的字节流
        QByteArray data = ui->sendTextEdit->toPlainText().toUtf8();
        serial.write(data);
    }
    
    void MainWindow::on_clearButton_clicked()
    {
        ui->recvTextEdit->clear();
    }
    

    5、main.cpp文件内容如下:

    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    

    4、测试(将USB转TTL模块发送和接收引脚短接,自己发自己收)

     

    新的工程已经上传至:https://download.csdn.net/download/u014695839/10881180 (2018年12月27日更新)

    以前的工程在这里可以下载:http://download.csdn.net/detail/u014695839/9763670

    以上内容若有问题,大家务必提醒,我定会马上更正!

    希望能与大家多多交流。

    展开全文
  • 匿名上位机

    2018-03-04 11:33:45
    ◤2:高级收码:高级收码从基本收码升级而来,上位机收到数据后,若高级收码的开关是打开的,那么就会对接收到的数据进行解析,数据的格式由通信协议定义。分为固定格式和自定义格式两大部分。自定义格式是留给大家...
  • DALIMaster上位机

    2014-12-09 15:36:29
    DALIMaster上位机软件。编码测试通用
  • 英威腾上位机

    2012-05-24 16:27:16
    英威腾上位机
  • CH341上位机

    2018-03-22 16:47:39
    CH341上位机 delphi 源码 CH341上位机 delphi 源码
  • 上位机设计

    2015-06-08 21:00:45
    适合毕业设计,上位机软件设计,VB 节点数据接收和发送
  • 摄像头 上位机

    2014-07-17 10:14:12
    摄像头 上位机 C++编写 有源码 有 软件
  • LabVIEW上位机

    2014-06-10 13:22:40
    LabVIEW上位机,用以实时查看数据变化
  • 51单片机VB上位机控制数码管(含上位机程序下位机源码),通过上位机需要显示数码管的内容
  • xmodem上位机代码

    2016-03-16 11:16:46
    xmodem上位机
  • WIFI小车上位机

    2017-05-02 14:00:18
    WIFI小车上位机
  • 倍福与上位机

    2019-04-03 16:32:11
    c#编写上位机程序控制倍福plc一些步骤

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,011
精华内容 6,404
关键字:

上位机