[ESP32]如何透過Modbus和Serial port擷取工業數顯表頭資料?

[ESP32]ESP32 as Modbus Master and Receive Data from Gauge with Serial Port

對於既有老舊的工業或實驗設備機台,嵌入工業數顯表頭並顯示設備運作參數和數據,以讓巡檢人員或操作人員手抄記錄數據,是常見作法。然而,若可將既有設備機台的表頭更換為具備Modbus通訊功能的表頭,並連接便宜的單晶片開發板,使其自動即時顯示運作參數和紀錄數據,將可釋放巡檢和操作人力並避免手抄錯誤。甚至可進一步連結網路,讓既有老舊的設備機台升級為IIOT設備。

在建置上述系統前,先行利用Arduino IDE、一片ESP32單晶片開發板和一片RS485-TTL的USB轉接模塊來測試一個具有RS485接口數顯表頭,看是否可順利發出request和接收到相應數據。另外,在該Modbus RTU架構下,ESP32為Master,RS485接口數顯表頭為Slaver,由ESP32發出request,藉由表頭回傳相應數據。

a.首先得先解讀該RS485接口表頭的通訊協議

這是一款可顯示電流,電壓和溫度的數顯表頭,由下列協議內容可知,電壓為第3和第4字節的高低位元組合,電流為第5和第6字節的高低位元組合,溫度為第7和第8字節的高低位元組合。

b.Arduino程式碼

其中有一個部分需特別說明,因其回傳數據幀的起始位置會出現非預期位移狀態,為了確保數據的起始位置正確,利用原Modbus協議內的設備站號(01)和命令(03)作為判斷。換言之,以01 03開頭的數據才是正確的數據幀。

#include <Arduino.h>

void setup() {
  Serial.begin(115200); // for PC serial port to check data
  Serial2.begin(9600, SERIAL_8N1, 16, 17); // Serial2即是指定esp32的RX2(pin 16)和TX2(pin 17)接腳,Baud rate:9600
}

void loop() {
  // Modbus請求數據的協議語法 for RS485設備,一般需參考設備的modbus協議規格文件
  byte requestData[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x08, 0x44, 0x0C};

  // 發送請求到RS485設備
  Serial2.write(requestData, sizeof(requestData));

  // 印出發送請求數據在監看視窗中
  Serial.print("Sent request: ");
  for (int i = 0; i < sizeof(requestData); i++) {
    Serial.print(requestData[i], HEX);
    Serial.print(" ");
  }
  Serial.println();

  // 等待RS485回傳數據
  delay(100);

  //檢查從RS485回傳的數據,並尋找數據幀的起始(第一個和第二個)字節0x01 0x03,以避免數據幀位移狀態而錯誤
  while(true){  
    if (Serial2.available()) {
      byte startByte = Serial2.read();
      if (startByte == 1) {
        if (Serial2.available()) {
          byte secondByte = Serial2.read();
          if (secondByte == 3) {
            break; // 找到正确的起始位置
          }
        }
      }
    }
  }

  // 繼續讀取剩餘的數據幀
  byte receivedData[21];
  receivedData[0] = 1;
  receivedData[1] = 3;
  Serial2.readBytes(&receivedData[2], 19);

    // 印出接收的所有數據在監看視窗中,共21個字節
    Serial.print("Received response: ");
    for (int i = 0; i < 21; i++) {
      Serial.print(receivedData[i], HEX);
      Serial.print(" ");
    }
    Serial.println();

    // 解析回傳數據
    // 電壓:字節位置是 3 和 4
    uint16_t voltage = (receivedData[3] << 8) | receivedData[4]; //高位元字節左移8位並與低位元字節整併(該rs485設備的modbus協議)
    // 將 voltage 除以100,並將其顯示到小數點第二位
    float voltageFloat = voltage/100.0;
    Serial.print("電壓: ");
    Serial.print(voltageFloat,2);//將其顯示到小數點第二位
    Serial.print("V");
    Serial.println();
    // 電流:字節位置是 5 和 6
    uint16_t current = (receivedData[5] << 8) | receivedData[6]; //高位元字節左移8位並與低位元字節整併(該rs485設備的modbus協議)
    // 將 current 除以100,並將其顯示到小數點第三位
    float currentFloat = current/100.0;
    Serial.print("電流: ");
    Serial.print(currentFloat,3);//將其顯示到小數點第三位
    Serial.print("A");
    Serial.println();
    // 溫度:字節位置是 7 和 8
    uint16_t temperature = (receivedData[7] << 8) | receivedData[8]; //高位元字節左移8位並與低位元字節整併(該rs485設備的modbus協議)
    Serial.print("溫度: ");
    Serial.print(temperature);
    Serial.print("C");
    Serial.println();
  
  delay(1000); //一秒鐘讀取一次數據
}

c.建置簡易系統

若要進一步讓使用人員容易操作,則可利用前端(html 和 Javascript)和後端(PHP 和 SQL)建置一個具備基本UI、即時顯示資料和儲存於資料庫的網頁系統,如下影片。

[ESP32]Make ESP32 as Modbus RTU Master and Receive Data from Gauge with Wifi

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

个人笔记:分布式大数据技术原理(一)Hadoop 框架

Apache Hadoop 软件库是一个框架&#xff0c;它允许使用简单的编程模型&#xff0c;实现跨计算机集群的大型数据集的分布式处理。它最初的设计目的是为了检测和处理应用程序层的故障&#xff0c;从单个机器扩展到数千台机器&#xff08;这些机器可以是廉价的&#xff09;&#…

环形缓冲区优点及实现

环形缓冲区优点及实现 目录 环形缓冲区优点及实现一、环形缓冲区概念二、环形缓冲区优点1、一个有缺陷的数据读写示例2、使用环形缓冲区解决数据读写缺陷 三、环形缓冲区实现代码 一、环形缓冲区概念 环形缓冲区是一种特殊的缓冲区&#xff0c;其读指针和写指针都指向同一个缓…

MySQL之视图索引执行计划

目录 一.视图 二.执行计划 2.1.什么是执行计划 2.2.执行计划的作用 三.使用外连接、内连接和子查询进行举例 四.思维导图 好啦今天就到这里了哦&#xff01;&#xff01;&#xff01;希望能帮到你哦&#xff01;&#xff01;&#xff01; 一.视图 含义 &#xff1a;在数…

【BIAI】lecture 3 - GD BP CNN Hands-on

GD & BP & CNN & Hands-on 专业术语 gradient descent (GD) 梯度下降 back propagation (BP) 向传播 Convolutional Neural Network (CNN) 卷积神经网络 forward propagation 前向传播 biologically symmetry 生物对称性 synaptic 突触 axon 轴突 课程大纲 The go…

webgl调试之排查内存泄漏

内存泄漏自然而然是要看内存是不是涨了 然后我们如何确认泄露了呢&#xff0c;我们需要把代码梳理清楚&#xff0c;知道哪个时机&#xff0c;在delete&#xff0c;在create&#xff0c;那么这个时候&#xff0c;按道理&#xff0c;delete了n个对象&#xff0c;create了N个对象&…

Redis 键中冒号的用途是什么?可以使匹配查询更快吗?

Redis 键中冒号的用途是什么在Redis中&#xff0c;冒号&#xff08;:&#xff09;用作键的分隔符&#xff0c;它的主要作用是创建层次结构和命名空间。通过在键中使用冒号&#xff0c;可以将键分为多个部分&#xff0c;从而更好地组织和管理数据。 以下是冒号在Redis键中的用途…

2024苹果Mac电脑免费文件数据恢复软件EasyRecovery

EasyRecovery是一个操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变&#xff01;EasyRecovery是一个操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上…

MySQL第四战:视图以及常见面试题(上)

目录 目录&#xff1a; 一.视图 1.介绍什么是视图 2.视图的语法 语法讲解 实例操作 二.MySQL面试题 1.SQL脚本 2.面试题实战 三.思维导图 目录&#xff1a; 随着数字化时代的飞速发展&#xff0c;数据库技术&#xff0c;特别是MySQL&#xff0c;已经成为IT领域中不可…

短网址的新玩法,短到只剩域名

短网址大家应该都不陌生了&#xff0c;一句话就可以解释清楚&#xff0c;把一串很长的网址缩短到只有几个字符依然可以正常访问&#xff0c;缩短之后会更加简洁美观。 那大家见过的短网址一般长啥样呢&#xff0c;比如t.cn/xxxxx、dwz.cn/xxxxx、c1ns.cn/xxxxx。这些短网址都有…

初始MySQL

一、数据库 1.什么是数据库 数据库&#xff08; Database,简称DB &#xff09;&#xff1a;长期存放在计算机内&#xff0c;有组织、可共享的大量数据的集合&#xff0c;是一个数据“仓库” 2.数据库的作用 可以结构化存储大量的数据&#xff0c;方便检索和访问保持数据信息…

JVM工作原理与实战(八):类加载器的分类

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类加载器介绍 二、类加载器的分类 1.Java代码实现的类加载器 2.Java虚拟机底层源码实现的类加载器 3.默认的类加载器层次&#xff08;JDK8及之前的版本&#xff09; 总结 前言…

迅为RK3588开发板使用 FFMpeg 进行推流

Debian/Ubuntu 系统使用以下命令安装 FFMpeg &#xff0c;如下图所示&#xff1a; apt-get install ffmpeg 使用 ifconfig 查看开发板 ip 为 192.168.1.245 如下图所示&#xff1a; 使用 FFMpeg 推流一个 mp4 视频进行测试&#xff0c;作者将测试视频 test.mp4 放在了根目录下…

学习笔记——C++运算符之赋值运算符

上次我们说到C的运算符共有四种&#xff0c;分别是算术运算符&#xff0c;赋值运算符&#xff0c;比较运算符和逻辑运算符 &#xff0c;下面介绍赋值运算符&#xff0c;赋值运算符主要的种类及作用如下表所示。 #include<bits/stdc.h> using namespace std; int main(){…

求两个数之间的最小公约数

目录 前言 方法&#xff1a;求两个数之间的最小公约数 1.欧几里得算法 2.枚举法 3.公共因子积 4.更相减损术 5.Stein算法 解题&#xff1a;在链表中插入最大公约数 总结 前言 今天刷每日一题&#xff1a;2807. 在链表中插入最大公约数 - 力扣&#xff08;LeetCode&#xff09;…

jenkins安装报错:No such plugin: cloudbees-folder

jenkins安装报错&#xff1a;No such plugin: cloudbees-folder 原因是缺少cloudbees-folder.hpi插件 解决&#xff1a; 一&#xff0c;重新启动 http://xxx:8800/restart 二&#xff0c;跳到重启界面时&#xff0c;点击系统设置 三&#xff0c;找到安装插件&#xff0c;然…

Python基础-07(for循环、range()函数)

文章目录 前言一、for循环1.for循环结构2.参数 end&#xff08;使其输出时变为横向&#xff09; 二、range()函数1.range(常数)2.range(起始值&#xff0c;结束值)3.range(起始值&#xff0c;结束值&#xff0c;步长)4.例子 总结 前言 此章介绍循环结构中最常用的循环&#xf…

Go (一) 基础部分5 -- 单元测试,协程(goroutine),管道(channel)

一、单元测试 Go自带一个轻量级的"测试框架testing"和自带的"go test"命令来实现单元测试和性能测试。 1.确保每个函数时可运行&#xff0c;并且运行结果是正确的。 2.确保写出来的代码性能是好的。 3.单元测试能及时的发现程序设计或实现的逻辑错误&#…

mysql基础-数据操作之增删改

目录 1.新增数据 1.1单条数据新增 1.2多条数据新增 1.3查询数据新增 2.更新 2.1单值更新 2.2多值更新 2.3批量更新 2.3.1 批量-单条件更新 2.3.2批量-多条件更新 2.4 插入或更新 2.5 联表更新 3.删除 本次分享一下数据库的DML操作语言。 操作表的数据结构&#xf…

Spark回归分析与特征工程

回归分析是统计学和机器学习中的一个重要分支&#xff0c;用于建立因变量与自变量之间的关系模型。在大数据领域&#xff0c;Apache Spark为回归分析提供了强大的工具和库&#xff0c;以处理大规模数据集。本文将深入探讨如何使用Spark进行回归分析以及如何进行特征工程&#x…

使用qtquick调用python程序,pytorch

一. 内容简介 使用qtquick调用python程序 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3pytorch 安装pytorch(http://t.csdnimg.cn/GVP23) 2.4QT 5.14.1 新版QT6.4,&#xff0c;6.5在线安装经常失败&#xff0c;而5.9版本又无法编译64位程序&#xf…