文章目錄
- **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 # 假設數據需要除以10print(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協議實現了傳感器數據的采集、存儲和可視化,為工業設備的實時監控和數據分析提供了完整的解決方案。通過模塊化設計和靈活的技術選型,系統具有良好的擴展性和可維護性,能夠滿足不同場景的需求。