Skip to content

DataAcquisition 是一个基于 .NET 构建的工业级 PLC 数据采集系统。系统采用 WAL-first(写前日志)架构确保数据零丢失,支持 Edge-Central 分布式架构实现多车间集中管理。提供多 PLC 并行采集、条件触发采集、批量读取优化等高级功能,支持配置热更新和实时监控,开箱即用,运维友好。

License

Notifications You must be signed in to change notification settings

liuweichaox/DataAcquisition

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🛰️ DataAcquisition - 工业级 PLC 数据采集系统

.NET License: MIT Platform Build Status Version PRs Welcome

English: README.en.md

📋 目录

📖 项目简介

DataAcquisition 是一个基于 .NET 构建的工业级 PLC 数据采集系统。系统采用 WAL-first(写前日志)架构确保数据零丢失,支持 Edge-Central 分布式架构实现多车间集中管理。提供多 PLC 并行采集、条件触发采集、批量读取优化等高级功能,支持配置热更新和实时监控,开箱即用,运维友好。

技术栈:

  • 运行时:.NET 10.0
  • 数据存储:InfluxDB 2.x(时序数据库)+ Parquet(本地 WAL)
  • 监控:Prometheus 指标 + Vue3 可视化界面
  • 架构:Edge-Central 分布式架构

🎯 核心特性

特性 说明
🔒 数据安全 WAL-first 架构,所有数据先写入本地 Parquet 文件,确保零丢失
🔀 多协议支持 支持 Mitsubishi(三菱)、Inovance(汇川)、BeckhoffAds(倍福)等 PLC 协议
高性能采集 多 PLC 并行采集,批量读取优化,减少网络往返
🎯 智能采集 支持条件触发采集(边沿触发、值变化触发)和持续采集两种模式
🔄 配置热更新 JSON 配置文件 + 文件系统监控,修改配置无需重启服务
📊 实时监控 Prometheus 指标暴露,Vue3 可视化界面,实时展示系统状态
💾 双存储策略 InfluxDB 时序数据库 + Parquet 本地持久化(WAL)
🔁 自动容错 网络异常自动重连,数据写入失败自动重试,保证数据完整性

🏗️ 系统架构

分布式架构概览

系统采用 Edge-Central(边缘-中心)分布式架构,支持多车间、多节点的集中式管理和监控:

                    ┌─────────────────────────────────────────┐
                    │           Central Web (Vue3)            │
                    │            可视化界面 / 监控面板           │
                    └───────────────────┬─────────────────────┘
                                        │ HTTP/API
                    ┌───────────────────▼─────────────────────┐
                    │         Central API                     │
                    │  • 边缘节点注册/心跳管理                   │
                    │  • 遥测数据接入                           │
                    │  • 查询与管理接口                         │
                    │  • Prometheus 指标聚合                   │
                    └───────┬─────────────────────┬───────────┘
                            │                     │
              ┌─────────────┘                     └───────────┐
              │                                               │
    ┌─────────▼─────────┐                          ┌──────────▼────────┐
    │   Edge Agent #1   │                          │   Edge Agent #N   │
    │      (Node 1)     │                          │      (Node N)     │
    └─────────┬─────────┘                          └─────────┬─────────┘
              │                                              │
              └──────────────────────────────────────────────┘

Edge Agent 内部架构

每个 Edge Agent 采用分层架构设计,各层职责清晰,确保数据零丢失:

┌────────────────────────────┐        ┌──────────────────────────┐
│        PLC Device          │──────▶ │  Heartbeat Monitor Layer │
└────────────────────────────┘        └──────────────────────────┘
                 │
                 ▼
┌────────────────────────────┐
│   Data Acquisition Layer   │
└────────────────────────────┘
                 │
                 ▼
┌────────────────────────────┐
│    Queue Service Layer     │
└────────────────────────────┘
                 │
                 ▼
┌────────────────────────────┐
│          Storage Layer     │
└────────────────────────────┘
                 │
                 ▼
┌────────────────────────────┐        ┌──────────────────────────────┐
│      WAL Persistence       │──────▶ │ Time-Series Database Storage │
└────────────────────────────┘        └──────────────────────────────┘
                 │                                 │
                 ▼                                 │  Write Failed
┌────────────────────────────┐                     │
│      Retry Worker          │◀────────────────────┘
└────────────────────────────┘

核心数据流

Edge Agent 内部流程

  1. 数据采集阶段:PLC 设备 → ChannelCollector(支持条件触发、批量读取优化)
  2. 数据聚合阶段LocalQueueService 按配置的 BatchSize 批量聚合数据
  3. 数据持久化阶段
    • Parquet WAL:立即写入本地 Parquet 文件(写前日志,确保零丢失)
    • InfluxDB:同步写入时序数据库(主存储)
  4. 容错处理阶段:写入成功后删除 WAL 文件;写入失败时保留 WAL 文件,由 RetryWorker 定期重试
  5. 数据上报阶段:可选地将数据上报到 Central API(用于集中式管理和监控)

Edge-Central 交互流程

  1. 节点注册阶段:Edge Agent 启动时自动向 Central API 注册节点信息(EdgeId、AgentBaseUrl、Hostname)
  2. 心跳上报阶段:周期性发送心跳信息(默认间隔 10 秒),包含队列积压量、错误信息等状态
  3. 遥测数据上报阶段:批量上报采集的时序数据到 Central API(可选功能)
  4. 监控查询阶段:Central Web 前端通过 Central API 查询各边缘节点的状态、指标和日志

📁 项目结构

DataAcquisition/
├── src/DataAcquisition.Application/     # 应用层 - 接口定义
│   ├── Abstractions/               # 核心接口抽象
│   └── PlcRuntime.cs              # PLC 运行时
├── src/DataAcquisition.Contracts/       # 契约层 - 对外 DTO/协议模型
├── src/DataAcquisition.Domain/         # 领域层 - 核心模型
│   └── Models/                     # 数据模型
├── src/DataAcquisition.Infrastructure/ # 基础设施层 - 实现
│   ├── Clients/                    # PLC 客户端实现
│   ├── DataAcquisitions/           # 数据采集服务
│   ├── DataStorages/               # 数据存储服务
│   └── Metrics/                    # 指标收集
├── src/DataAcquisition.Edge.Agent/ # Edge Agent - 车间侧采集后台 + 指标 + 本地 API
│   ├── Configs/                    # 设备配置文件
│   └── Controllers/                # 管理 API 控制器
├── src/DataAcquisition.Central.Api/ # Central API - 中心侧 API(边缘注册/心跳/数据接入、查询与管理)
├── src/DataAcquisition.Central.Web/ # Central Web - 纯前端(Vue CLI / Vue3),通过 /api 访问 Central API
├── src/DataAcquisition.Simulator/      # PLC 模拟器 - 用于测试
│   ├── Simulator.cs               # 模拟器核心逻辑
│   ├── Program.cs                 # 程序入口
│   └── README.md                  # 模拟器文档
└── DataAcquisition.sln             # 解决方案文件

🚀 快速开始

想要快速开始使用系统?请查看 快速开始指南,该指南提供了从零开始的完整步骤,包括:

  • 环境要求和安装步骤
  • InfluxDB 配置说明
  • 设备配置文件创建
  • 系统启动和验证
  • 使用 PLC 模拟器进行测试

提示: 如果你是第一次使用,建议按照 快速开始指南 的步骤操作。如果你已经熟悉系统,可以直接查看 配置说明API 使用示例

🧪 使用 PLC 模拟器进行测试

项目提供了独立的 PLC 模拟器(DataAcquisition.Simulator),可以模拟三菱 PLC 的行为,用于测试数据采集功能,无需真实的 PLC 设备。

启动模拟器

cd src/DataAcquisition.Simulator
dotnet run

模拟器特性

  • ✅ 模拟三菱 PLC(MelsecA1EServer)
  • ✅ 自动更新心跳寄存器(D100)
  • ✅ 模拟 7 个传感器指标(温度、压力、电流、电压、光栅位置、伺服速度、生产序号)
  • ✅ 支持条件采集测试(生产序号触发)
  • ✅ 交互式命令控制(set/get/info/exit)
  • ✅ 实时数据显示

快速测试流程

  1. 启动模拟器
cd src/DataAcquisition.Simulator
dotnet run
  1. 配置测试设备

    src/DataAcquisition.Edge.Agent/Configs/ 目录创建 TEST_PLC.json(参考 src/DataAcquisition.Simulator/README.md 中的完整配置示例)

  2. 启动采集系统

dotnet run --project src/DataAcquisition.Edge.Agent
dotnet run --project src/DataAcquisition.Central.Api

cd src/DataAcquisition.Central.Web
npm install
npm run serve
  1. 观察数据采集

详细说明请参考:src/DataAcquisition.Simulator/README.md

📚 文档导航

根据你的使用场景,选择合适的文档阅读路径:

新用户入门

如果你是第一次使用本系统,建议按以下顺序阅读:

  1. 快速开始指南 - 从零开始,快速上手系统

    • 环境要求和安装步骤
    • 系统配置和启动
    • 使用 PLC 模拟器测试
  2. 配置说明 - 了解如何配置系统

    • 设备配置文件详解
    • 应用配置说明
    • 配置示例和使用场景
  3. 常见问题 - 遇到问题时的参考

    • 常见问题解答
    • 故障排查指南
    • 配置验证方法

日常使用

如果你已经熟悉系统,需要日常使用和维护:

  • API 使用示例 - 查询数据和管理系统

    • 指标数据查询
    • PLC 连接状态查询
    • 日志查询和管理
  • 性能优化建议 - 优化系统性能

    • 采集参数调优
    • 存储优化策略
    • 系统资源优化

深入了解

如果你想深入了解系统架构和实现:

  • 核心模块文档 - 了解系统核心模块

    • PLC 客户端实现
    • 通道采集器
    • 数据存储服务
  • 数据处理流程 - 理解数据流转过程

    • 正常处理流程
    • 异常处理机制
    • 数据一致性保证
  • 设计理念 - 了解系统设计思想

    • WAL-first 架构
    • 模块化设计
    • 分布式架构

⚙️ 配置说明

详细的配置说明请参考:配置文档

快速参考

配置类型 位置 说明
设备配置 src/DataAcquisition.Edge.Agent/Configs/*.json 每个 PLC 设备对应一个 JSON 配置文件
Edge Agent 配置 src/DataAcquisition.Edge.Agent/appsettings.json 应用层配置(数据库、API 等)
配置热更新 自动检测 支持配置文件修改后自动热加载,无需重启服务

设备配置示例:

{
  "IsEnabled": true,
  "PlcCode": "PLC01",
  "Host": "192.168.1.100",
  "Port": 502,
  "Type": "Mitsubishi",
  "HeartbeatMonitorRegister": "D100",
  "HeartbeatPollingInterval": 5000,
  "Channels": [
    {
      "Measurement": "sensor",
      "ChannelCode": "PLC01C01",
      "EnableBatchRead": true,
      "BatchReadRegister": "D6000",
      "BatchReadLength": 10,
      "BatchSize": 10,
      "AcquisitionInterval": 100,
      "AcquisitionMode": "Always",
      "DataPoints": [
        {
          "FieldName": "temperature",
          "Register": "D6000",
          "Index": 0,
          "DataType": "short",
          "EvalExpression": "value / 100.0"
        }
      ]
    }
  ]
}

🤝 贡献指南

我们欢迎各种形式的贡献!请参考以下步骤:

  1. Fork 本项目
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 开启 Pull Request

开发环境设置

# 克隆项目
git clone https://github.com/liuweichaox/DataAcquisition.git

# 安装依赖
dotnet restore

# 运行测试
dotnet test

# 构建项目
dotnet build

代码规范

  • 遵循 .NET 编码规范
  • 使用有意义的命名
  • 添加必要的 XML 注释
  • 编写单元测试

📄 开源许可证

本项目采用 MIT 许可证 - 详见 LICENSE 文件。

🙏 致谢

感谢以下开源项目:


如有问题或建议,请提交 Issue 或通过 Pull Request 贡献代码!

About

DataAcquisition 是一个基于 .NET 构建的工业级 PLC 数据采集系统。系统采用 WAL-first(写前日志)架构确保数据零丢失,支持 Edge-Central 分布式架构实现多车间集中管理。提供多 PLC 并行采集、条件触发采集、批量读取优化等高级功能,支持配置热更新和实时监控,开箱即用,运维友好。

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages