写点什么

esp8266 读取 modbus 类型数据在 Grafana 展示

作者:jupiter
  • 2023-02-28
    广东
  • 本文字数:1676 字

    阅读完需:约 5 分钟

esp8266 读取 modbus 类型数据在 Grafana 展示

esp8266 做为 master,通过 usb 转 ttl 接口线,以 RTU 通信方式,获取 slave 模拟软件的寄存器数据。然后经过 clientSDK 或者 PromClient 将数据写入后端。

1 modbus 环境准备

1.1 esp8266 启动 modbus 链接串口

本次 modbus 采用 RTU 通信,底层硬件依赖串口进行通信。esp8266 的默认硬件串口,使用 RX0,TX0,用于日志调试。当再开启软串口 SoftwareSerial 时,RX2 和 TX 2 分别对应 D7,D8。

如下代码:

Serialsoft.begin(9600,SWSERIAL_8N1,D7,D8);   //启动softserial
复制代码

在 setup 阶段,RX2 和 TX2 和 RX0/TX0 会有干扰。

一个现象就是,烧录程序的时候,TX2 外接的指示灯会闪,且最后会烧录失败,最终报错“ESP32/8266 timed out waiting for packet header”。

规避方法就是:在 loop 预留足够的延时,再启动 SoftwareSerial 。因为烧录程序已经不再占用默认串口,所以启动 SoftwareSerial 不再受干扰。

1.2 借助 arduino 制作一个 usb 转 ttl 工具

因为作者刚开始没有可用的 usb 转 ttl 工具,身边只有 1 个 arduino uno 板子。可以参考(https://www.electronics-lab.com/three-ways-make-arduino-works-usbttl-converter/),快速 DIY 一个 usb 转 ttl 的工具。视频中展示的是购买的 usb 转 ttl 工具。

1.3 安装 modbusslave 模拟软件

下载破解的测试软件,作为 modbus 的模拟设备。设置为 03 模式,工作模式,如下图所示:  

2 读取 modbus 数据

2.1 准备 master 设备

esp8266 作为 modbus 的 master 设备启动后,

1)使用 SoftwareSerial 先绑定 slave 设备串口


Serialsoft.begin(9600,SWSERIAL_8N1,D7,D8); //启动softserialnode.begin(slaveid, Serialsoft); // 链接slaveid=1的串口
复制代码

2)再读取 slave 设备寄存器的值,

result =  node.readHoldingRegisters(0x0000,2);    //读取寄存器地址0的数据,长度为2delay(1000); //读取延时if (result != node.ku8MBSuccess){    Serial.println(result);} else {    Serial.println("ok");    int respo1 = node.getResponseBuffer(0);    Serial.println(respo1);         int respo2 = node.getResponseBuffer(1);    Serial.println(respo2); }
复制代码

2.2 准备 slave 设备

电脑模拟软件 Modbus Slave 模拟 slave 设备的数据接入



3 将数据发送到 cortex/mimir

3.1  方式 1 使用 http/https client 发送数据

配置文件 config.h 配置 token 等信息,

#define WIFI_SSID     "xxx"#define WIFI_PASSWORD "xxx"// For more information on where to get these values see: https://github.com/telemetrytower/play-with-tower/tree/master/iot-demo/esp8266-modbus-demo#define Backend "https://xxx/easyapi/v1/push"#define USER "esp8266"#define Backendtoken "xxxx"  #define OrgId "xxxx"  
复制代码



void sendserver(String data) { Serial.println("sendserver,data:"); Serial.println(data); String url = GC_URL; //String data = "pst=temperature"; hc.begin(httpsclient,url); hc.addHeader("Content-Type", "application/json"); hc.addHeader("Host", "xxx"); hc.addHeader("Content-Length",String(data.length())); hc.addHeader("Auth",Backendtoken));
复制代码

3.2 方式 2  使用 mqtt 发送数据

参考https://github.com/grafanafans/club/tree/master/iot-demos/clientSDK 章节配置 mqtt 接入参数


mqtt_broker: "tcp://mqtt.xxx:1883"mqtt_username: "mqtt"mqtt_passwd: "xxxx"mqtt_topic: "/home/id/sensordata"
复制代码

3.3 方式 3 使用 grafana 提供的 Promclient 工具

grafana 源码在这里 https://github.com/grafana/prometheus-arduino

注意,此工具适合 esp32 等内存丰富的开发板,在 esp8266 及以下开发板运行会崩溃,并报如下错误:

14:41:34.578 -> --------------- CUT HERE FOR EXCEPTION DECODER --------------14:41:34.644 -> Exception (3):14:41:34.676 -> epc1=0x4000df1b epc2=0x00000000 epc3=0x00000000 excvaddr=0x4023ec1d depc=0x00000000
复制代码

4 效果图

相关 demo 在 https://github.com/grafanafans/club/tree/master/iot-demos/esp8266-modbus-demo

视频及更多文章请关注我们公众号【Grafana 爱好者】

发布于: 刚刚阅读数: 4
用户头像

jupiter

关注

还未添加个人签名 2022-01-14 加入

还未添加个人简介

评论

发布
暂无评论
esp8266 读取 modbus 类型数据在 Grafana 展示_IoT_jupiter_InfoQ写作社区