659浏览
查看: 659|回复: 0

[ESP8266/ESP32] Beetle ESP32 C6测评与工业组态软件连接采集数据

[复制链接]
本帖最后由 Anders项勇 于 2024-4-22 00:22 编辑

上篇测试了Beetle ESP32 C6的基本用法,此篇研究使用Beetle ESP32 C6迷你版通过组态软件来采集工业数据。Beetle ESP32 C6测评与工业组态软件连接采集数据图6Beetle ESP32 C6测评与工业组态软件连接采集数据图7
组态王是工业数据采集软件,广泛用于工业控制领域,可以通过plc、智能主板来控制工业设备及采集工业数据,但plc、智能主板价格都比较高,而且在工业现场各类设备的plc型号都不一样,或者有些设备就没有plc、智能主板,增加了数据采集标准化的难度,所以可以考虑利用Beetle ESP32 C6迷你版强大的网络功能及端口较多的特性做低成本的统一数据标准化采集,然后给到mes、erp等管理系统使用。有工业环境很多是220v或24v的,所以需要用到一些220v或24v的继电器做信号的转换,要注意电压以免烧坏。然后在车间布设工业wifi来和ESP32 C6通讯

实现的步骤如下:
1.在组态软件中新建一个设备,选择Modbus TCP作为通讯协议,设置ESP32的IP地址和端口号2。
Beetle ESP32 C6测评与工业组态软件连接采集数据图1
选择莫迪康modbus-tcp
Beetle ESP32 C6测评与工业组态软件连接采集数据图2
地址输入192.168.1.100:6600 5/50建立好设备。192.168.1.100是esp32-c6的ip,6600是端口号
Beetle ESP32 C6测评与工业组态软件连接采集数据图3Beetle ESP32 C6测评与工业组态软件连接采集数据图4
2.在组态王的图形界面中添加相应的控件,比如数字显示、曲线图等,用于展示从ESP32-C读取的数据,连接上面建立的设备。
Beetle ESP32 C6测评与工业组态软件连接采集数据图5
3.使用Arduino编写ESP32-c的代码,安装一个适用于ESP32的Modbus库ModbusTCP
使用Modbus TCP协议将需要传递的数据发送到组态王指定的寄存器地址中:
#include <ModbusTCP.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

WiFiClient client;
IPAddress loIP(192,168,1,100);
IPAddress snIP(255, 255, 255, 0);
IPAddress gwIP(192,168,1,1);
IPAddress mbTCP(192,168,1,101);
WiFiServer server(6600);            // 服务器,server



// 初始化保持寄存器,用于存储要传递给组态王的数据
uint16_t holdingRegisters[10];

void setup() {
  Serial.begin(115200); // 初始化串口通信

  // 设置保持寄存器的初始值
  for (int i = 0; i < 10; i++) {
    holdingRegisters = i * 10; // 示例数据
  }

  // 启动Modbus TCP服务器
  if (!server.begin()) {
    Serial.println("Failed to start Modbus TCP server");
  } else {
    Serial.println("Modbus TCP server started");
  }
}

void loop() {
  // 处理Modbus请求
  server.task();




  delay(10);
}

// Modbus回调函数,用于处理读取保持寄存器的请求
void readHoldingRegisters(uint16_t slaveId, uint16_t startAddress, uint16_t registerCount) {

  if (slaveId != 1) return;

  // 读取并发送保持寄存器的值
  for (uint16_t i = 0; i < registerCount; i++) {
    server.sendRegister(startAddress + i, holdingRegisters[startAddress + i]);
  }
}

// Modbus回调函数,用于处理写入保持寄存器的请求
void writeHoldingRegisters(uint16_t slaveId, uint16_t startAddress, uint16_t registerCount, uint16_t* values) {

  if (slaveId != 1) return;

  // 更新保持寄存器的值
  for (uint16_t i = 0; i < registerCount; i++) {
    holdingRegisters[startAddress + i] = values;
  }


}





SunApril-202404215195..png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail