打造智能工厂:基于嵌入式 C++、Qt/QML 和 MQTT 的车间设备远程监控系统(代码示例)

一、项目概述

项目目标和用途

本项目旨在开发一个车间设备远程监控系统,结合传感器和PLC,实现对车间内各类设备的实时状态监测。通过RS-485通信和MQTT协议进行数据传输,将设备状态数据上传至云端进行存储与分析。该系统将为工厂提供及时的设备状态信息,帮助管理人员快速响应设备故障,提高生产效率,减少停机时间。

项目解决的问题和价值

  • 实时监控:实现对车间设备的实时监控,及时获取设备状态和异常信息。

  • 数据分析:通过云端数据存储和分析,提供设备运行状态的历史记录和趋势分析。

  • 故障预警:实现设备异常检测和报警,帮助管理人员在故障发生之前采取措施。

  • 远程管理:支持远程查看和管理设备状态,降低人工巡检成本。

二、系统架构

系统设计

系统采用嵌入式系统(ARM Cortex)作为核心控制器,通过RS-485和Modbus RTU协议收集传感器数据和PLC状态。数据通过MQTT协议上传至云服务器进行存储和分析。用户可以通过Qt/QML或Web界面查看设备状态和分析结果。

组件选择

  • 单片机:ARM Cortex-M系列,具备良好的性能和低功耗特点。

  • 通信协议:RS-485用于现场设备数据采集,MQTT用于云端数据传输。

  • 传感器与模块:根据监控需求选择合适的传感器(如温度、湿度、振动等)和无线通信模块。

  • 开发工具:Qt/QML用于本地界面开发,Web技术栈用于远程监控界面开发。

系统架构图

RS-485/Modbus RTU MQTT 用户交互 设备传感器和PLC 嵌入式系统 云服务器 数据存储与分析 Web/Qt界面 管理人员

三、环境搭建

软件和硬件环境

  • 硬件:

    • ARM Cortex-M开发板

    • RS-485通信模块

    • 各类传感器(温度、湿度、振动等)

  • 软件:

    • 开发工具链:Keil MDK, STM32CubeMX

    • 编程语言:C/C++(嵌入式)、JavaScript/HTML/CSS(Web界面)

    • 数据库:MySQL或NoSQL数据库(如MongoDB)

    • 云平台:AWS或阿里云

环境安装和配置

  1. 开发工具链安装:

    • 下载并安装Keil MDK和STM32CubeMX。

    • 配置STM32CubeMX生成项目,并导入Keil进行编译和调试。

  2. MQTT客户端配置:

    • 使用Paho MQTT库,配置MQTT客户端连接至云服务器。

    • 设置主题(Topic)和QoS(服务质量)等级。

  3. Qt/QML环境:

    • 安装Qt Creator,设置开发环境。

    • 创建Qt Quick项目,设计用户界面。

配置示例

cpp 复制代码
// 示例:MQTT客户端初始化
MQTTClient client;
MQTTClient_create(&client, "tcp://broker.hivemq.com:1883", CLIENTID,
    MQTTCLIENT_PERSISTENCE_NONE, NULL);
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
int rc;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
    printf("Failed to connect, return code %d\n", rc);
    exit(EXIT_FAILURE);
}

四、代码实现

在代码实现阶段,我们将根据系统架构逐步实现数据采集、数据传输、数据处理和人机界面功能模块。以下是每个模块的详细实现过程,包括关键代码示例和相应的代码说明。

1. 数据采集模块

数据采集模块负责通过RS-485和Modbus RTU协议从传感器和PLC读取数据。我们将使用libmodbus库在嵌入式系统中实现这一功能。

示例代码
cpp 复制代码
#include <modbus.h>
#include <stdio.h>
#include <errno.h>

modbus_t *ctx;
uint16_t tab_reg[32];

// 初始化Modbus连接
void init_modbus() {
    // 创建新的Modbus RTU上下文
    ctx = modbus_new_rtu("/dev/ttyS0", 19200, 'N', 8, 1);
    if (ctx == NULL) {
        fprintf(stderr, "Unable to create the libmodbus context\n");
        return;
    }
    
    // 设置Modbus从设备地址
    modbus_set_slave(ctx, 1);
    
    // 连接Modbus
    if (modbus_connect(ctx) == -1) {
        fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
        modbus_free(ctx);
        return;
    }
}

// 读取传感器数据
void read_sensor_data() {
    // 读取寄存器0到10的数据
    int rc = modbus_read_registers(ctx, 0, 10, tab_reg);
    if (rc == -1) {
        fprintf(stderr, "Failed to read data: %s\n", modbus_strerror(errno));
    } else {
        // 处理读取的数据
        for (int i = 0; i < rc; i++) {
            printf("Register %d: %d\n", i, tab_reg[i]);
        }
    }
}

// 关闭Modbus连接
void close_modbus() {
    modbus_close(ctx);
    modbus_free(ctx);
}
代码说明
  • modbus_new_rtu:创建一个新的Modbus RTU上下文,指定串口设备、波特率、校验位、数据位和停止位。

  • modbus_set_slave:设置Modbus从设备地址。

  • modbus_connect:与Modbus设备建立连接。

  • modbus_read_registers:读取指定寄存器的数据。

  • modbus_closemodbus_free:关闭和释放Modbus连接。

2. 数据传输模块

数据传输模块负责将采集到的数据通过MQTT协议上传到云服务器。我们将使用Paho MQTT C客户端库实现这一功能。

示例代码
cpp 复制代码
#include <MQTTClient.h>
#include <string.h>
#include <stdio.h>

#define ADDRESS     "tcp://broker.hivemq.com:1883"
#define CLIENTID    "ExampleClientPub"
#define TOPIC       "factory/equipment"
#define QOS         1
#define TIMEOUT     10000L

MQTTClient client;

// 初始化MQTT客户端
void init_mqtt() {
    MQTTClient_create(&client, ADDRESS, CLIENTID,
                      MQTTCLIENT_PERSISTENCE_NONE, NULL);
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    int rc;

    // 连接到MQTT服务器
    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
}

// 发布数据消息
void publish_data(const char* payload) {
    MQTTClient_message pubmsg = MQTTClient_message_initializer;
    pubmsg.payload = (void*)payload;
    pubmsg.payloadlen = (int)strlen(payload);
    pubmsg.qos = QOS;
    pubmsg.retained = 0;
    MQTTClient_deliveryToken token;
    
    // 发布消息到指定主题
    MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
    MQTTClient_waitForCompletion(client, token, TIMEOUT);
    printf("Message with delivery token %d delivered\n", token);
}

// 断开MQTT客户端连接
void close_mqtt() {
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
}
代码说明
  • MQTTClient_create:创建MQTT客户端实例,指定服务器地址和客户端ID。

  • MQTTClient_connect:连接到MQTT服务器。

  • MQTTClient_publishMessage:将消息发布到指定的主题。

  • MQTTClient_waitForCompletion:等待消息传输完成。

  • MQTTClient_disconnectMQTTClient_destroy:断开与MQTT服务器的连接并销毁客户端实例。

3. 数据处理模块

数据处理模块负责对采集到的数据进行初步处理和异常检测。在嵌入式系统中,我们可以实现简单的异常检测算法,例如检测温度是否超出预设范围。

示例代码
cpp 复制代码
#include <stdio.h>

// 模拟的设备数据结构
typedef struct {
    int temperature;
    int humidity;
} DeviceData;

// 异常检测函数
void check_for_anomalies(DeviceData data) {
    // 设定温度和湿度的正常范围
    const int minTemp = 15;
    const int maxTemp = 30;
    const int minHumidity = 30;
    const int maxHumidity = 70;

    // 检查温度是否超出范围
    if (data.temperature < minTemp || data.temperature > maxTemp) {
        printf("Warning: Temperature anomaly detected! Temperature: %d\n", data.temperature);
    }

    // 检查湿度是否超出范围
    if (data.humidity < minHumidity || data.humidity > maxHumidity) {
        printf("Warning: Humidity anomaly detected! Humidity: %d\n", data.humidity);
    }
}

// 模拟数据处理流程
void processData() {
    // 示例数据
    DeviceData data = {28, 65};
    check_for_anomalies(data);
}
代码说明
  • DeviceData:定义一个结构体用于存储设备的温度和湿度数据。

  • check_for_anomalies:实现简单的异常检测逻辑,判断温度和湿度是否在正常范围内。

  • processData:模拟数据处理流程,通过调用异常检测函数进行数据处理。

4. 人机界面模块

人机界面模块提供用户与系统的交互界面。我们可以使用Qt/QML来开发本地用户界面,或者使用Web技术开发远程监控界面。

Qt/QML 示例代码
js 复制代码
import QtQuick 2.12
import QtQuick.Controls 2.5

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: "设备监控系统"

    Column {
        anchors.centerIn: parent
        spacing: 20

        Text {
            id: temperatureText
            text: "温度: 28°C"
            font.pixelSize: 24
        }

        Text {
            id: humidityText
            text: "湿度: 65%"
            font.pixelSize: 24
        }

        Rectangle {
            width: 200
            height: 50
            color: "green"
            Text {
                anchors.centerIn: parent
                text: "正常运行"
                color: "white"
            }
        }
    }
}
代码说明
  • ApplicationWindow:创建应用程序窗口,设置窗口的大小和标题。

  • Column:布局容器,用于垂直排列子项。

  • Text:显示设备的温度和湿度信息。

  • Rectangle:显示设备的运行状态,通过颜色和文本表示设备是否正常运行。

5. 人机界面模块 (Web 示例)

如果需要开发Web端远程监控界面,可以使用HTML、CSS、JavaScript等技术。

HTML/JavaScript 示例代码
html 复制代码
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>设备监控系统</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            background-color: #f4f4f9;
        }
        .status {
            margin: 20px;
            padding: 10px;
            background-color: green;
            color: white;
            display: inline-block;
            font-size: 24px;
        }
    </style>
</head>
<body>
    <h1>设备监控系统</h1>
    <div id="temperature">温度: 28°C</div>
    <div id="humidity">湿度: 65%</div>
    <div class="status">正常运行</div>
    <script>
        // 模拟更新设备数据
        function updateData() {
        // 更新温度和湿度信息
            document.getElementById('temperature').textContent = '温度: 28°C';
            document.getElementById('humidity').textContent = '湿度: 65%';

            // 模拟设备状态更新
            var statusElement = document.querySelector('.status');
            statusElement.textContent = '正常运行';
            statusElement.style.backgroundColor = 'green';

            // 模拟异常情况
            if (Math.random() > 0.5) {
                statusElement.textContent = '异常检测';
                statusElement.style.backgroundColor = 'red';
            }
        }

        // 定时更新数据
        setInterval(updateData, 5000);
    </script>
</body>
</html>
代码说明
  • HTML结构:创建一个简单的网页布局,包括显示温度、湿度和设备状态的元素。

  • CSS样式:定义页面的基本样式和状态显示的样式,通过颜色变化来指示正常与异常状态。

  • JavaScript:模拟设备数据的更新和状态变化。updateData函数每5秒钟更新一次数据,并随机模拟设备状态的正常和异常。

五、项目总结

主要功能和实现过程

本项目成功实现了车间设备远程监控的基本功能,涵盖了数据采集、数据传输、数据处理和人机界面开发。通过RS-485和Modbus RTU协议,我们实现了可靠的现场数据采集;借助MQTT协议,数据能够高效地上传到云端进行存储和分析。用户界面采用Qt/QML和Web技术,提供了灵活的本地和远程监控选项。

项目价值

  • 提高效率:实时监测设备状态,有助于提前发现问题并减少停机时间。

  • 数据分析:通过云端数据分析,可以生成有价值的报告,帮助优化设备管理和维护策略。

  • 成本控制:减少人工巡检的频率和成本,同时通过异常预警降低设备故障带来的损失。

相关推荐
华清远见IT开放实验室1 小时前
【项目案例】物联网比较好的10+练手项目推荐,附项目文档/源码/视频
物联网·音视频
limingade2 小时前
手机实时提取SIM卡打电话的信令和声音-新的篇章(一、可行的方案探讨)
物联网·算法·智能手机·数据分析·信息与通信
迷迭所归处5 小时前
C++ —— 关于vector
开发语言·c++·算法
CV工程师小林5 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
white__ice6 小时前
2024.9.19
c++
天玑y6 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
锦亦之22336 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
姜太公钓鲸2336 小时前
c++ static(详解)
开发语言·c++
菜菜想进步6 小时前
内存管理(C++版)
c语言·开发语言·c++
Joker100857 小时前
C++初阶学习——探索STL奥秘——模拟实现list类
c++