《C#上位机开发从门外到门内》3-2::Modbus数据采集系统
文章目录
- **1. 项目概述**
- **1.1 项目背景**
- **1.2 项目目标**
- **1.3 技术栈**
- **2. 系统架构设计**
- **2.1 系统架构图**
- **2.2 模块功能**
- **3. 数据采集模块实现**
- **3.1 Modbus协议简介**
- **3.2 数据采集流程**
- **3.3 代码实现**
- **4. 数据存储模块实现**
- **4.1 数据库设计**
- **4.2 数据存储流程**
- **4.3 代码实现**
- **MySQL版本**
- **InfluxDB版本**
- **5. 数据可视化模块实现**
- **5.1 可视化工具选择**
- **5.2 可视化实现**
- **ECharts示例**
- **Grafana示例**
- **6. 系统部署与测试**
- **6.1 部署环境**
- **6.2 测试流程**
- **7. 总结**

1. 项目概述
1.1 项目背景
Modbus是一种广泛应用于工业自动化领域的通信协议,支持多种设备之间的数据传输。本项目旨在通过Modbus协议采集传感器数据,并将采集到的数据进行存储和可视化,以实现对工业设备的实时监控和数据分析。
1.2 项目目标
- 通过Modbus协议采集传感器数据。
- 将采集到的数据存储到数据库中。
- 实现数据的可视化展示,支持实时监控和历史数据分析。
1.3 技术栈
- 通信协议:Modbus RTU/TCP
- 编程语言:Python(用于数据采集和存储)
- 数据库:MySQL/InfluxDB(用于数据存储)
- 可视化工具:ECharts/Grafana(用于数据可视化)
- 硬件设备:Modbus传感器、RS485通信模块、工业网关等。
2. 系统架构设计
2.1 系统架构图
+-------------------+ +-------------------+ +-------------------+
| | | | | |
| Modbus传感器 |<----->| 数据采集模块 |<----->| 数据存储模块 |
| (温度、压力等) | | (Python脚本) | | (MySQL/InfluxDB) |
| | | | | |
+-------------------+ +-------------------+ +-------------------+
| |
| |
v v
+-------------------+ +-------------------+
| | | |
| 数据可视化模块 |<----->| 用户界面 |
| (ECharts/Grafana)| | (Web/移动端) |
| | | |
+-------------------+ +-------------------+
2.2 模块功能
-
数据采集模块:
- 通过Modbus协议与传感器通信,采集温度、压力、流量等数据。
- 支持Modbus RTU(RS485)和Modbus TCP两种通信方式。
- 实现数据的解析和格式化。
-
数据存储模块:
- 将采集到的数据存储到MySQL或InfluxDB中。
- 支持实时数据写入和历史数据查询。
-
数据可视化模块:
- 使用ECharts或Grafana实现数据的可视化展示。
- 支持实时数据监控和历史数据分析。
-
用户界面:
- 提供Web或移动端界面,方便用户查看数据和分析结果。
3. 数据采集模块实现
3.1 Modbus协议简介
Modbus协议是一种主从式通信协议,支持以下功能码:
- 0x01:读取线圈状态
- 0x03:读取保持寄存器
- 0x04:读取输入寄存器
- 0x06:写入单个保持寄存器
3.2 数据采集流程
-
初始化通信参数:
- 设置Modbus通信参数(波特率、数据位、停止位等)。
- 配置传感器地址和寄存器地址。
-
读取传感器数据:
- 使用Modbus功能码读取传感器数据。
- 解析返回的数据包,提取有效数据。
-
数据格式化:
- 将原始数据转换为实际物理量(如温度、压力等)。
- 添加时间戳和数据标签。
3.3 代码实现
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
# 初始化Modbus客户端
client = ModbusClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600, timeout=1)
# 连接传感器
if client.connect():
print("Connected to sensor")
# 读取保持寄存器(功能码0x03)
response = client.read_holding_registers(address=0, count=2, unit=1)
if not response.isError():
# 解析数据
raw_value = response.registers[0]
temperature = raw_value / 10.0 # 假设数据需要除以10
print(f"Temperature: {temperature}°C")
else:
print("Error reading data")
# 关闭连接
client.close()
else:
print("Failed to connect to sensor")
4. 数据存储模块实现
4.1 数据库设计
-
MySQL表结构:
CREATE TABLE sensor_data ( id INT AUTO_INCREMENT PRIMARY KEY, sensor_id VARCHAR(50) NOT NULL, value FLOAT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP );
-
InfluxDB数据结构:
- Measurement:
sensor_data
- Tags:
sensor_id
- Fields:
value
- Timestamp:自动生成
- Measurement:
4.2 数据存储流程
-
连接数据库:
- 使用Python的MySQL或InfluxDB客户端库连接数据库。
-
写入数据:
- 将采集到的数据插入到数据库中。
4.3 代码实现
MySQL版本
import mysql.connector
# 连接MySQL数据库
db = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="sensor_db"
)
# 插入数据
cursor = db.cursor()
sql = "INSERT INTO sensor_data (sensor_id, value) VALUES (%s, %s)"
values = ("sensor_1", 25.3)
cursor.execute(sql, values)
db.commit()
print("Data inserted")
InfluxDB版本
from influxdb import InfluxDBClient
# 连接InfluxDB
client = InfluxDBClient(host='localhost', port=8086, database='sensor_db')
# 写入数据
json_body = [
{
"measurement": "sensor_data",
"tags": {
"sensor_id": "sensor_1"
},
"fields": {
"value": 25.3
}
}
]
client.write_points(json_body)
print("Data written to InfluxDB")
5. 数据可视化模块实现
5.1 可视化工具选择
-
ECharts:
- 适用于Web端实时数据展示。
- 支持折线图、柱状图、仪表盘等多种图表类型。
-
Grafana:
- 适用于历史数据分析和监控。
- 支持多种数据源(如InfluxDB、MySQL)。
5.2 可视化实现
ECharts示例
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.2/dist/echarts.min.js"></script>
</head>
<body>
<div id="chart" style="width: 600px; height: 400px;"></div>
<script>
var chartDom = document.getElementById('chart');
var myChart = echarts.init(chartDom);
var option = {
xAxis: {
type: 'time'
},
yAxis: {
type: 'value'
},
series: [{
data: [],
type: 'line'
}]
};
myChart.setOption(option);
// 模拟实时数据更新
setInterval(function () {
var now = new Date();
var value = Math.random() * 100;
option.series[0].data.push([now, value]);
myChart.setOption(option);
}, 1000);
</script>
</body>
</html>
Grafana示例
- 配置InfluxDB数据源。
- 创建仪表盘,添加折线图面板。
- 设置查询语句:
SELECT "value" FROM "sensor_data" WHERE "sensor_id" = 'sensor_1'
6. 系统部署与测试
6.1 部署环境
- 硬件:工业网关、Modbus传感器、RS485通信模块。
- 软件:Python 3.8、MySQL/InfluxDB、ECharts/Grafana。
6.2 测试流程
- 数据采集测试:
- 验证传感器数据是否正确采集。
- 数据存储测试:
- 验证数据是否成功写入数据库。
- 可视化测试:
- 验证数据是否实时展示在图表中。
7. 总结
本项目通过Modbus协议实现了传感器数据的采集、存储和可视化,为工业设备的实时监控和数据分析提供了完整的解决方案。通过模块化设计和灵活的技术选型,系统具有良好的扩展性和可维护性,能够满足不同场景的需求。