嵌入式 文章

上位机开发入门:概念、技术栈,以及与 MES / ERP / WMS 的关系
嵌入式
2024-05-12 • 0k

上位机开发入门:概念、技术栈,以及与 MES / ERP / WMS 的关系

在工业自动化和智能制造项目中,“上位机"并不是孤立存在的。它既直接连接设备,也会和 MES、ERP、WMS 等系统发生数据交互。下面这篇博客会把上位机开发讲清楚,并把它们的关系压缩到核心部分。 什么是上位机开发? 上位机开发,通常指为电脑、工控机或服务器编写软件,用来和 PLC、单片机、传感器、仪表、机器人等下位机设备通信。 它的典型能力包括: 数据采集:读取设备状态、工艺参数、传感器数据。 设备控制:下发启停、参数调整、配方切换等指令。 状态监控:用界面展示产线、设备、工序运行情况。 报警记录:记录故障、异常、停机原因。 报表与追溯:生成产量、工时、质量、能耗等报表。 可以把它理解为:上位机更贴近设备和现场,负责"看得见、控得住、采得准”。 上位机开发的常见技术栈 模块 常用方案 作用 语言/框架 C# + WinForms/WPF/.NET、C++ + Qt、Python + PyQt/PySide C# 在国内工业上位机中较常见;Qt 跨平台性能好;Python 适合原型和数据分析。 通信协议 Modbus、OPC UA、TCP/IP、串口 RS232/485、CAN、MQTT 与 PLC、仪表、传感器、机器人等设备交换数据。 数据处理 实时曲线、报警、日志、报表 处理高频数据、断线重连、异常恢复。 数据存储 SQLite、MySQL、SQL Server、InfluxDB 配置数据用关系型数据库,传感器时序数据可用时序数据库。 软件架构 多线程/异步、MVVM、分层架构 保证界面不卡顿、通信稳定、后期易维护。 一句话选型: Windows 工业项目:优先 C#/.NET。 跨平台或高性能场景:选 C++/Qt。 快速验证、算法分析:选 Python。 MES / ERP / WMS 是什么? 系统 定位 一句话理解 ERP 企业经营管理层 管订单、计划、采购、财务、库存账务。 MES 车间执行层 管工单、工序、报工、质量、生产进度。 WMS 仓储作业层 管入库、出库、库位、批次、库存流转。 上位机 设备控制与监控层 连接 PLC/传感器,做实时采集、界面监控和设备控制。 简单比喻:

上位机 工业自动化 MES
阅读更多
点亮arduino uno r3板载 / 外接led灯
嵌入式
2021-08-25 • 0k

点亮arduino uno r3板载 / 外接led灯

1、准备工作与开发板选择 2、选择端口 3、代码: // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN (13) as an output. pinMode(LED_BUILTIN, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } 4、代码上传与验证 点击上传按钮,等待编译完成后,Arduino开发板上的板载LED灯将开始按程序设定的1秒间隔闪烁。这是最基础的Arduino入门实验,验证了开发环境配置正确且开发板工作正常。

arduino LED控制 Arduino入门
阅读更多
使用NTP协议获取时间(连接wifi) - Arduino开发ESP8266(NodeMcu)学习记录
嵌入式
2021-02-01 • 0k

使用NTP协议获取时间(连接wifi) - Arduino开发ESP8266(NodeMcu)学习记录

所需硬件 ESP8266 开发板(NodeMcu) x1 第三方库 ESP8266WiFi NTP介绍 网络时间协议,英文名称:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。NTP的目的是在无序的Internet环境中提供精确和健壮的时间服务。 ——【百度百科】 代码: /** 作者: Raikay (raikay.cn) 时间: 2021/01/30 说明: 通过NTP服务器获取网络时间(连接wifi) **/ #include <ESP8266WiFi.h> //wifi库 #include <time.h> //时间库 const char* ssid = "Ziroom211"; //wifi账号 const char* password = "40010022222"; //wifi密码 const char* NTP_SERVER = "ntp.aliyun.com"; //NTP服务器 #define TZ_INFO "UTC-8" //时区 void setup() { Serial.begin(115200); Serial.setDebugOutput(true); //将串口设为调试输出模式 WiFi.disconnect();//断开之前的连接 WiFi.mode(WIFI_STA); //设为STA模式 WiFi.begin(ssid, password);//连接wifi Serial.println("\nConnecting to WiFi"); //连接失败 while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(1000); } //设置时区、NTP服务器地址 configTime(TZ_INFO, NTP_SERVER); Serial.println("\nWaiting for time"); while (!time(nullptr)) { Serial.print("."); delay(1000); } Serial.println(""); } //循环 void loop() { time_t now = time(nullptr); //获取当前时间 时间戳 struct tm *p = localtime(&now); //转换为tm结构 //格式化输入 Serial.print(String(1900 + p->tm_year) + "年" + String(1 + p->tm_mon) + "月" + String(p->tm_mday) + "日"); Serial.println(" " + String(p->tm_hour) + ":" + String(p->tm_min) + ":" + String(p->tm_sec)); delay(1000); }

esp8266 Arduino NodeMcu
阅读更多
Arduino-Ide安装第三方库
嵌入式
2021-01-21 • 0k

Arduino-Ide安装第三方库

用温湿度传感器DHT11/DHT22库DHT为例 方法一 【项目】 –》 【加载库】 –》【管理库】 安装 弹出窗口后,搜索、安装即可 查看示例代码 安装之后, 【文件】 –》【示例】 ,就可以查看库带的示例代码,大多数库都有,这个示例代码是很好的教程。 方法二 直接下载库第三方库,下载的库放在库文件夹即可。通过 【文件】 –> 【首选项】 –> 【项目文件夹位置】 查看库文件夹位置

Arduino 库安装 第三方库
阅读更多
CP2102版和CH340版两种NodeMcu的区别和HW-628有什么不同
嵌入式
2021-01-21 • 0k

CP2102版和CH340版两种NodeMcu的区别和HW-628有什么不同

NodeMcu 常见的有两个版本,一般用通讯模块区分 CP2102版 : NodeMcu V1.0 ,作者是amica CH340版 : NodeMcu v3,作者是Lolin v3不是V1.0的升级版,可能是两个分支。 区别: 1、外观上v3比V1.0 大一些。 2、CP2102版 A0附近两个RSV引脚,在CH340版上是GND和VU(可以输出5v电压)。 3、usb供电时v1.0版vin引脚可以5V电压输出,v3版vin引脚没有5V输出,v3版5v电压输出在VU引脚上。 看网上有说ch340版在烧写时需按flash -> reset。我在操作的时候,没按也是可以烧写的,烧写后也正常工作。 新款 除了上面两款常见版本外,发现某宝上有一款“新款NodeMcu”挺多的,看上面标有 HW-628字样,暂且称他是HW-628。 有额外32M flash,价格很划算。 在引脚、外观尺寸上完全兼容NodeMcu V1.0 (CP2102)版,有人说信号弱一些,我简单测了一下,不影响使用。而且vin引脚也可以5v电压输出,也就是说,除了外观长的不一样,应该可以替代cp2012版NodeMcu。 下面是三款的合影: 引脚原理图: 注意事项 1、NodeMcu的IIC(I2C)管脚是GOIO04和GPIO05,就是上面丝印的D1和D2。

esp8266 NodeMcu CH340
阅读更多
DHT11温湿度传感器 - Arduino开发ESP8266(NodeMcu)学习记录
嵌入式
2021-01-18 • 0k

DHT11温湿度传感器 - Arduino开发ESP8266(NodeMcu)学习记录

所需硬件 ESP8266 开发板(NodeMcu) x1 DHT11温湿度传感器 x1 面包板 x1 杜邦线 若干 第三方库 DHT 可以直接安装 项目–>加载库–>管理库–> 搜索"DHT"安装 或者手动下载 下载地址:https://github.com/adafruit/DHT-sensor-library 线路图 实物图 代码 /** 作者: Raikay (raikay.cn) 时间: 2021/01/18 说明: ESP8266接收DHT11温湿度传感器数据 NodeMcu DHT11 3V3 - 正极 D5 - out GND - 负极 **/ #include <DHT.h> #define DHTPIN 14 //GPIO14 即NodeMcu D5 #define DHTTYPE DHT11 // 定义你DHT11 DHT dht(DHTPIN, DHTTYPE); //读取DHT的温度值 String readDHTTemperature() { float t = dht.readTemperature(); if (isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return "--"; } else { return String(t); } } //读取DHT的湿度值 String readDHTHumidity() { float h = dht.readHumidity(); if (isnan(h)) { Serial.println("Failed to read from DHT sensor!"); return "--"; } else { return String(h); } } void setup() { pinMode(DHTPIN, OUTPUT); digitalWrite(DHTPIN, HIGH); Serial.begin(9600); dht.begin(); } void loop() { //温度 temperature Serial.print("温度:"); Serial.println(readDHTTemperature().c_str()); //湿度 Humidity Serial.print("湿度:"); Serial.println(readDHTHumidity().c_str()); delay(1000); Serial.println("---------------"); } 串口显示

esp8266 Arduino NodeMcu
阅读更多
发射红外信号控制美的空调 - Arduino开发ESP8266(NodeMcu)学习记录
嵌入式
2021-01-17 • 0k

发射红外信号控制美的空调 - Arduino开发ESP8266(NodeMcu)学习记录

所需硬件 ESP8266 开发板(NodeMcu) x1 红外信号发射管Led x1 按键开关 x2 面包板 x1 杜邦线 若干 第三方库 IRremoteESP8266 下载地址:https://github.com/crankyoldgit/IRremoteESP8266 线路图 红外发射管 长的是正极,短的是负极。 实物图 按D3按键关闭空调,按D4开启空调 代码 红外信号原数据是从美的空调遥控器接收的 /** 作者: Raikay (raikay.cn) 时间: 2021/01/17 说明: 红外发射管控制美的空调 NodeMcu 红外发射管 GND - 负极 D2 - 正极 **/ #include <Arduino.h> #include <IRremoteESP8266.h> #include <IRsend.h> const uint16_t kIrLed = 4; // NodeMcu D2 const uint16_t On1 = 0; // d3 const uint16_t On2 = 2; // d4 IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message. // 美的空调原数据 关闭空调 uint16_t rawData1[199] = {4500, 4404, 588, 1578, 590, 488, 590, 1578, 590, 1578, 590, 488, 588, 488, 590, 1578, 590, 488, 586, 490, 588, 1580, 588, 490, 588, 488, 588, 1578, 588, 1580, 586, 490, 588, 1578, 588, 490, 588, 1578, 588, 1578, 588, 1578, 588, 1580, 588, 490, 588, 1580, 588, 1580, 586, 1580, 588, 490, 588, 490, 588, 490, 586, 490, 586, 1580, 588, 490, 586, 490, 586, 1580, 588, 1580, 586, 1580, 586, 490, 588, 490, 588, 490, 586, 490, 586, 490, 588, 490, 586, 490, 586, 490, 586, 1580, 586, 1580, 586, 1580, 586, 1580, 586, 1580, 586, 5208, 4496, 4410, 586, 1580, 588, 490, 586, 1580, 588, 1578, 588, 490, 586, 490, 586, 1580, 588, 490, 586, 490, 586, 1580, 586, 490, 588, 490, 586, 1580, 586, 1580, 588, 490, 586, 1580, 586, 490, 588, 1580, 586, 1580, 586, 1580, 586, 1580, 588, 490, 586, 1580, 588, 1580, 586, 1580, 588, 490, 588, 490, 586, 490, 586, 490, 586, 1582, 584, 492, 586, 490, 586, 1582, 584, 1582, 586, 1580, 586, 490, 586, 490, 586, 490, 586, 490, 586, 490, 586, 492, 586, 490, 586, 490, 590, 1576, 586, 1580, 588, 1580, 586, 1580, 586, 1580, 586}; // COOLIX B27BE0 // 美的空调原数据 开启空调 29度 制热 uint16_t rawData2[199] = {4508, 4394, 600, 1568, 600, 478, 600, 1568, 600, 1568, 598, 480, 598, 478, 598, 1568, 600, 478, 598, 478, 598, 1568, 598, 478, 600, 478, 598, 1568, 598, 1568, 598, 478, 600, 1568, 598, 480, 598, 478, 598, 1568, 598, 1568, 598, 1568, 600, 1568, 600, 1566, 600, 1568, 598, 1568, 600, 1568, 600, 478, 600, 476, 600, 478, 598, 478, 600, 478, 600, 478, 600, 1568, 600, 478, 600, 1568, 600, 478, 600, 1568, 600, 1566, 600, 478, 598, 478, 600, 476, 600, 1568, 600, 478, 600, 1566, 600, 478, 600, 478, 600, 1566, 600, 1568, 600, 5194, 4508, 4398, 600, 1566, 604, 474, 600, 1566, 600, 1566, 600, 476, 600, 476, 600, 1566, 600, 476, 600, 476, 600, 1568, 600, 476, 600, 476, 602, 1566, 598, 1568, 600, 476, 600, 1566, 600, 476, 600, 476, 600, 1566, 600, 1566, 600, 1566, 602, 1566, 600, 1568, 600, 1566, 600, 1566, 600, 1566, 600, 476, 600, 476, 600, 476, 602, 476, 600, 478, 600, 476, 600, 1566, 600, 478, 600, 1568, 600, 476, 600, 1566, 600, 1566, 600, 478, 600, 478, 600, 478, 600, 1568, 600, 476, 600, 1568, 600, 476, 600, 476, 602, 1566, 600, 1568, 598}; // COOLIX B23FAC void setup() { irsend.begin(); #if ESP8266 Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY); #else Serial.begin(115200, SERIAL_8N1); #endif pinMode(On1, INPUT_PULLUP); pinMode(On2, INPUT_PULLUP); } void loop() { int buttonState1 = digitalRead(On1); int buttonState2 = digitalRead(On2); if (buttonState1 != HIGH) { irsend.sendRaw(rawData1, 199, 38); delay(5); irsend.sendRaw(rawData1, 199, 38); delay(5); irsend.sendRaw(rawData1, 199, 38); Serial.println("buttonState1:" + buttonState1); } if (buttonState2 != HIGH) { irsend.sendRaw(rawData2, 199, 38); delay(5); irsend.sendRaw(rawData2, 199, 38); delay(5); irsend.sendRaw(rawData2, 199, 38); Serial.println("buttonState2:" + buttonState2); } } 这里把信号发了三遍,是因为,发射一遍信号比较弱,必须角度找的非常准确,即使这样有的时候还接收不到,发射三遍时,可以在任意角度随意发射,空调都可以接收到信号,百发百中!~

esp8266 Arduino NodeMcu
阅读更多
接收红外信号VS1838B - Arduino开发ESP8266(NodeMcu)学习记录
嵌入式
2021-01-17 • 0k

接收红外信号VS1838B - Arduino开发ESP8266(NodeMcu)学习记录

所需硬件 VS1838B 红外接收头 ESP8266 开发板 (NodeMcu) 红外信号遥控器 杜邦线 x3 第三方库 IRremoteESP8266 下载地址:https://github.com/crankyoldgit/IRremoteESP8266 红外接收头图片 线路图 实物图 代码 /** 作者: Raikay (raikay.cn) 时间: 2021/01/17 说明: NodeMcu使用红外接收头接收红外信号 NodeMcu - VS1838B 3v3 - VCC GND - GND D5 - OUT **/ #include <Arduino.h> #include <IRrecv.h> #include <IRremoteESP8266.h> #include <IRac.h> //#include <IRtext.h> #include <IRutils.h> // 定义接收信号的引脚GPIO14,即NodeMcu的D5 const uint16_t kRecvPin = 14; // (接收引脚,接收信号大小,超时时间) IRrecv irrecv(kRecvPin, 1024, 50, true); // 存储结果 decode_results results; void setup() { Serial.begin(115200); #if DECODE_HASH // 过滤未知信号值 irrecv.setUnknownThreshold(12); #endif irrecv.setTolerance(kTolerance); // 启动接收器 irrecv.enableIRIn(); } void loop() { // 是否收到消息 if (irrecv.decode(&results)) { // 接收到的编码 Serial.print("输出编码:"); serialPrintUint64(results.value, HEX); Serial.println(); // 协议和编码 Serial.println("输出协议和编码:"); Serial.println(resultToHumanReadableBasic(&results)); yield(); // 说明 String description = IRAcUtils::resultAcToString(&results); Serial.println("输出说明:"); if (description.length()) { Serial.println("Mesg Desc.: " + description); } else { Serial.println("Mesg Desc.: 无"); } // 原数据 Serial.println("输出原数据:"); Serial.println(resultToSourceCode(&results)); Serial.println("------------------------分割线------------------------"); yield(); } } 使用的红外遥控器

esp8266 Arduino NodeMcu
阅读更多
控制继电器 - Arduino开发ESP8266(NodeMcu)学习记录
嵌入式
2021-01-16 • 0k

控制继电器 - Arduino开发ESP8266(NodeMcu)学习记录

示例代码: 通过D5引脚(GPIO14输出高低电平)控制继电器开合 /** 作者: Raikay (raikay.cn) 时间: 2021/01/16 说明: 控制继电器 NodeMcu - 继电器 VU - VCC D5 - OUT GND - GND **/ //定义引脚GPIO14,即Nodemcu D5引脚 int relay = 14; void setup() { //设置引脚输出 pinMode(relay, OUTPUT); } void loop() { //程序灯带1秒(1000毫秒) delay(1000); //设置高电平 digitalWrite(relay, LOW); delay(1000); //设置低电平 digitalWrite(relay, HIGH); } 继电器 线路图 继电器是5v供电,NodeMcu两个版本输出5v的引脚不同。 CP2102版 :Vin引脚输出5v CH340版:VU引脚输出5v 也可以单独5v电源供电。 下图是CH340版 实物图

esp8266 Arduino NodeMcu
阅读更多
串口调试 - Arduino开发ESP8266(NodeMcu)学习记录
嵌入式
2021-01-15 • 0k

串口调试 - Arduino开发ESP8266(NodeMcu)学习记录

示例代码: void setup() { //初始化串口设置 Serial.begin(9600); } void loop() { //获取程序开始运行的毫秒数 long time = millis(); //输出调试日志 Serial.println(time); } 选择开发板 选择端口 这个端口 一般可能是 3、5、6根据设备和电脑环境不同有所区别,可以到电脑的设备管理器查看一下 (我机器插了两个板子,所以是下面这种情况,一般只会是COM3或COM5一个) 上传代码 查看串口调试窗口 【工具】–> 【串口调试】 说一下这个9600波特率,和代码上的一致就可以一般是9600、115200 我也可能会用esp8266系列的其他开发板,其实所有esp8266的板子代码是通用(比如 Wemos D1 R1、Wemos D1 R3 Uno、D1 mini、Wifiduino、ESPduino、WiFinfo),只要对照一下引脚图稍微改动一下差异的引脚就可以。

esp8266 Arduino NodeMcu
阅读更多