Skip to content

基于 .NET 开发的 Modbus TCP PLC 数据采集系统,支持通过配置文件灵活定义采集规则,适用于多种 .NET 平台(.NET Standard 2.0, .NET Standard 2.1)。系统支持多设备同时采集实时数据,具备高效通讯、模块化设计、数据存储和错误处理等功能,适合工业自动化场景。

License

Notifications You must be signed in to change notification settings

dkq08/DataAcquisition

 
 

Repository files navigation

PLC 数据采集系统

📌 项目概述

本项目旨在通过动态收集来自 PLC(可编程逻辑控制器)的数据,为用户提供实时监控和分析工业设备运行状态的能力。支持多种 PLC 类型、实时数据采集、消息队列、高效数据存储等功能,适用于工业自动化过程中的监控与控制、设备性能分析及故障诊断。


🚀 核心功能

  • 高效通讯:基于 Modbus TCP 协议,实现稳定的高效通讯
  • 消息队列:支持数据缓存至 RabbitMQ、Kafka 或 本地消息队列,用于高并发数据采集
  • 数据存储:支持存储至本地 SQLite 数据库或云存储
  • 日志记录:支持自定义日志记录方式,便于问题排查与系统监控
  • 多 PLC 数据采集:支持从多个 PLC 周期性地采集实时数据
  • 错误处理:支持断线重连与超时重试,确保系统稳定运行
  • 频率控制:可配置采集频率,支持毫秒级控制
  • 动态配置:通过配置定义采集表、列名、频率,支持自定义数据点和采集方式
  • 多平台支持:兼容 .NET Standard 2.0 和 2.1
  • 操作系统:支持 Windows、Linux、macOS

🛠️ 安装与使用

1️⃣ 克隆仓库

git clone https://github.com/liuweichaox/DataAcquisition.git

2️⃣ 配置文件

Configs 文件夹中,每个表对应一个独立的 JSON 文件,您可以根据需要修改配置。配置文件定义了 PLC 信息、寄存器地址、数据类型等内容。

配置文件定义

  • IsEnabled: 是否启用该配置。
  • Code: 采集器代码,用于标识不同的采集器。
  • Host: PLC IP 地址。
  • Port: PLC 端口。
  • DriverType: PLC 驱动类型,支持 MelsecA1ENetMelsecA1EAsciiNetInovanceTcpNet
  • HeartbeatMonitorRegister: 心跳监控寄存器地址。
  • HeartbeatPollingInterval: 心跳监控间隔(毫秒)。
  • StorageType: 数据存储类型,支持 SQLiteMySQLPostgreSQLSQLServer
  • ConnectionString: 数据库连接字符串。
  • Modules: 采集模块配置。
    • ChamberCode: 采集通道代码,用于标识不同的采集通道。
    • Trigger: 触发配置。
      • Mode: 触发模式,支持: Always:无条件触发、ValueIncrease:数值增加时触发、ValueDecrease:数值减少触发、RisingEdge:上升沿触发(表示从 0 变成 1 时采集)、FallingEdge:下降沿触发(表示从 1 变成 0 时采集)
      • Register: 触发寄存器地址。
      • DataType: 触发寄存器数据类型。
    • BatchReadRegister: 批量读取寄存器地址。
    • BatchReadLength: 批量读取寄存器长度。
    • TableName: 数据库表名。
    • DataPoints: 数据点配置。
      • ColumnName: 数据库列名。
      • Index: 寄存器索引。
      • StringByteLength: 字符串字节长度。
      • Encoding: 字符串编码,支持 UTF8GB2312GBKASCII
      • DataType: 寄存器数据类型。
      • EvalExpression: 数据转换表达式,支持简单的数学表达式,例如 value / 1000.0

示例配置 (Configs/M01_Metrics.json):

{
  "IsEnabled": true,
  "Code": "M01C123",
  "Host": "192.168.1.110",
  "Port": 4104,
  "DriverType": "MelsecA1EAsciiNet",
  "HeartbeatMonitorRegister": "D6061",
  "HeartbeatPollingInterval": 2000,
  "StorageType": "MySQL",
  "ConnectionString": "Server=127.0.0.1;Database=daq;Uid=root;Pwd=123456;Connect Timeout=30;SslMode=None;",
  "Modules": [
    {
      "ChamberCode": "M01C01",
      "Trigger": {
        "Mode": "Always",
        "Register": null,
        "DataType": null,
        "PollInterval": 0
      },
      "BatchReadRegister": "D6000",
      "BatchReadLength": 70,
      "TableName": "m01c01_sensor",
      "DataPoints": [
        {
          "ColumnName": "up_temp",
          "Index": 2,
          "StringByteLength": 0,
          "Encoding": null,
          "DataType": "short",
          "EvalExpression": ""
        },
        {
          "ColumnName": "down_temp",
          "Index": 4,
          "StringByteLength": 0,
          "Encoding": null,
          "DataType": "short",
          "EvalExpression": "value / 1000.0"
        }
      ]
    },
    {
      "ChamberCode": "M01C02",
      "Trigger": {
        "Mode": "RisingEdge",
        "Register": null,
        "DataType": null,
        "PollInterval": 0
      },
      "BatchReadRegister": "D6100",
      "BatchReadLength": 200,
      "TableName": "m01c02_sensor",
      "DataPoints": [
        {
          "ColumnName": "up_set_temp",
          "Index": 2,
          "StringByteLength": 0,
          "Encoding": null,
          "DataType": "short",
          "EvalExpression": ""
        },
        {
          "ColumnName": "down_set_temp",
          "Index": 4,
          "StringByteLength": 0,
          "Encoding": null,
          "DataType": "short",
          "EvalExpression": "value / 1000.0"
        }
      ]
    }
  ]
}

⚙️ 配置 DataAcquisitionService

Startup.cs 中配置 IDataAcquisitionService 实例,负责管理数据采集任务。

builder.Services.AddSingleton<IMessageService, MessageService>(); // 消息服务
builder.Services.AddSingleton<IPlcDriverFactory, PlcDriverFactory>(); // PLC 驱动工厂
builder.Services.AddSingleton<IDataStorageFactory, DataStorageFactory>(); // 数据存储工厂
builder.Services.AddSingleton<IQueueManagerFactory, QueueManagerFactory>(); // 消息队列工厂
builder.Services.AddSingleton<IDataAcquisitionService, DataAcquisitionService>(); // 数据采集服务
builder.Services.AddSingleton<IDataProcessingService, DataProcessingService>(); // 数据处理服务
builder.Services.AddSingleton<IDeviceConfigService, DeviceConfigService>(); // 设备配置服务

builder.Services.AddHostedService<DataAcquisitionHostedService>(); // 数据采集托管服务

📑 API 文档

获取 PLC 连接状态

  • GET /api/DataAcquisition/GetPlcConnectionStatus
  • 返回PLC 连接状态字典

🤝 贡献

如果您想为该项目贡献代码,欢迎提交 Pull Request!在提交之前,请确保代码通过了所有单元测试,并且没有引入任何破坏性变化。

📄 许可

本项目使用 MIT 许可证,详情请参阅 LICENSE 文件。


感谢您使用 PLC 数据采集系统!如有问题,欢迎提出 issue 或进行讨论。 🎉


About

基于 .NET 开发的 Modbus TCP PLC 数据采集系统,支持通过配置文件灵活定义采集规则,适用于多种 .NET 平台(.NET Standard 2.0, .NET Standard 2.1)。系统支持多设备同时采集实时数据,具备高效通讯、模块化设计、数据存储和错误处理等功能,适合工业自动化场景。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 90.4%
  • C# 7.6%
  • HTML 1.8%
  • CSS 0.2%