HL.MCP.Service.DevelopOPC 2.0.9

HL.MCP.Service.DevelopOPC

MCP 框架的 OPC DA (OLE for Process Control Data Access) 服务实现,用于工业自动化和 PLC 通信。

功能特性

  • OPC DA 服务器连接
  • 数据项组管理
  • 实时数据监控
  • 数据变化事件通知
  • MCP 服务框架集成
  • 状态分发机制
  • 可配置的更新频率

安装

dotnet add package HL.MCP.Service.DevelopOPC

OPC DA 简介

OPC DA (OLE for Process Control Data Access) 是工业自动化领域广泛使用的通信标准,用于:

  • PLC 数据读写
  • SCADA 系统集成
  • 实时过程数据采集
  • 工业设备互联互通

使用方法

配置文件

创建 OPC 配置文件(XML 格式):

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
  <!-- OPC 服务器配置 -->
  <OPCServer ConnectionString="opcda://localhost/OPC.SimulationServer" />
  
  <!-- OPC 数据组配置 -->
  <OPCGroup 
    GroupName="DataGroup1" 
    GroupString="Group1" 
    UpdateRate="1000" />
  
  <!-- OPC 数据项配置 -->
  <OPCItem 
    ItemName="Temperature" 
    OPCItemName="Random.Real8" 
    ClientHandler="1" 
    ItemType="Double" 
    IsActive="true" />
    
  <OPCItem 
    ItemName="Pressure" 
    OPCItemName="Random.Int4" 
    ClientHandler="2" 
    ItemType="Int32" 
    IsActive="true" />
</Configuration>

服务初始化

using HL.MCP.Service.DevelopOPC;

var opcService = new OPCService();
opcService.Initialize("opc-config.xml");
opcService.Start();

数据变化处理

服务会自动监控配置的 OPC 数据项,当数据变化时通过 MCP 框架分发状态:

// 数据变化会自动触发状态分发
// 通过 MCP 框架的 DispatchState 方法传递

写入数据

// 写入单个数据项
opcService.Write("Temperature", 25.5);

// 写入数组数据
int[] values = { 1, 2, 3, 4, 5 };
opcService.Write("ArrayItem", values);

配置说明

OPCServer 节点

  • ConnectionString: OPC 服务器连接字符串
    • 格式: opcda://主机名/服务器程序ID
    • 示例: opcda://localhost/Kepware.KEPServerEX.V6

OPCGroup 节点

  • GroupName: 数据组名称(唯一标识)
  • GroupString: 数据组字符串(描述信息)
  • UpdateRate: 更新频率(毫秒)
    • 建议值: 100-5000ms
    • 值越小,数据更新越频繁,但系统负载越高

OPCItem 节点

  • ItemName: 数据项名称(MCP 框架使用)
  • OPCItemName: OPC 服务器中的实际项名称
  • ClientHandler: 客户端句柄(唯一标识符)
  • ItemType: 数据类型
    • 支持: Boolean, Int32, Double, String 等
  • IsActive: 是否激活监控(true/false)

架构说明

OPCService 继承自 MCP 框架的 AbstractService

  • Initialize: 连接 OPC 服务器并配置数据组和数据项
  • Start: 启动服务(自动监控已激活)
  • Stop: 停止服务
  • Release: 释放 OPC 连接资源
  • Write: 写入数据到 OPC 服务器(用于调试)

应用场景

生产线监控

public class ProductionMonitor
{
    private OPCService opcService;
    
    public void Initialize()
    {
        opcService = new OPCService();
        opcService.Initialize("production-plc.xml");
        opcService.Start();
        
        // 数据变化会自动通过 MCP 框架处理
    }
}

多 PLC 数据采集

<!-- 配置多个数据项监控多台 PLC -->
<Configuration>
  <OPCServer ConnectionString="opcda://192.168.1.100/RSLinx" />
  <OPCGroup GroupName="PLCGroup" GroupString="AllPLCs" UpdateRate="500" />
  
  <!-- PLC 1 数据 -->
  <OPCItem ItemName="PLC1_Speed" OPCItemName="[PLC1]N7:0" ClientHandler="1" ItemType="Int32" IsActive="true" />
  <OPCItem ItemName="PLC1_Temp" OPCItemName="[PLC1]F8:0" ClientHandler="2" ItemType="Double" IsActive="true" />
  
  <!-- PLC 2 数据 -->
  <OPCItem ItemName="PLC2_Speed" OPCItemName="[PLC2]N7:0" ClientHandler="3" ItemType="Int32" IsActive="true" />
  <OPCItem ItemName="PLC2_Temp" OPCItemName="[PLC2]F8:0" ClientHandler="4" ItemType="Double" IsActive="true" />
</Configuration>

SCADA 系统集成

public class SCADAIntegration
{
    private OPCService opcService;
    
    public void ConnectToSCADA()
    {
        opcService = new OPCService();
        opcService.Initialize("scada-config.xml");
        opcService.Start();
        
        // 通过 MCP 框架的状态分发
        // 将 OPC 数据传递给业务逻辑
    }
    
    public void WriteSetpoint(string itemName, double value)
    {
        opcService.Write(itemName, value);
    }
}

数据类型支持

基本类型

  • Boolean (bool)
  • Byte (byte)
  • Int16 (short)
  • Int32 (int)
  • Int64 (long)
  • Float (float)
  • Double (double)
  • String (string)

数组类型

支持上述所有基本类型的数组形式。

依赖项

  • HL.MCP - MCP 框架核心
  • HL.OPC - OPC DA 通信库
  • .NET Framework 4.6.1 或更高版本

常见 OPC 服务器

模拟服务器(开发测试)

  • Matrikon OPC Simulation Server
  • Kepware OPC Server (Demo)
  • OPC Foundation Sample Server

商用服务器

  • Kepware KEPServerEX
  • Matrikon OPC Server
  • Rockwell RSLinx
  • Siemens SIMATIC NET

PLC 厂商 OPC 服务器

  • Siemens: SIMATIC NET OPC Server
  • Allen-Bradley: RSLinx Classic/Gateway
  • Schneider: OFS (OPC Factory Server)
  • Mitsubishi: MX OPC Server DA/UA

最佳实践

1. 更新频率优化

<!-- 根据数据重要性设置不同更新频率 -->
<!-- 关键数据:100-500ms -->
<OPCGroup GroupName="Critical" UpdateRate="100" />

<!-- 一般数据:1000-2000ms -->
<OPCGroup GroupName="Normal" UpdateRate="1000" />

<!-- 状态数据:3000-5000ms -->
<OPCGroup GroupName="Status" UpdateRate="3000" />

2. 异常处理

try
{
    opcService.Initialize("config.xml");
    opcService.Start();
}
catch (Exception ex)
{
    Logger.Error($"OPC 服务初始化失败: {ex.Message}");
    // 实现重连机制
}

3. 资源管理

public class OPCManager : IDisposable
{
    private OPCService opcService;
    
    public void Dispose()
    {
        opcService?.Release();
    }
}

4. 性能优化

  • 合理设置更新频率,避免过于频繁
  • 只激活需要监控的数据项 (IsActive="true")
  • 将相关数据项分组到同一个 Group
  • 避免在数据变化事件中执行耗时操作

故障排查

OPC 服务器连接失败

问题: 无法连接到 OPC 服务器

解决方案:

  1. 检查 OPC 服务器是否运行
  2. 验证连接字符串格式正确
  3. 确认网络连接正常(远程服务器)
  4. 检查 DCOM 配置(Windows)
  5. 验证用户权限

数据项无法读取

问题: 配置的数据项读取失败

解决方案:

  1. 检查 OPCItemName 是否正确
  2. 验证数据项在 OPC 服务器中存在
  3. 确认数据类型匹配
  4. 检查 PLC 通信状态

数据更新不及时

问题: 数据变化延迟较大

解决方案:

  1. 减小 UpdateRate
  2. 检查网络延迟
  3. 优化数据项数量
  4. 检查服务器性能

DCOM 配置问题

问题: 远程 OPC 连接失败

解决方案:

  1. 配置 DCOM 权限
  2. 开启远程激活权限
  3. 配置防火墙规则
  4. 使用 OPC Tunnel 工具

调试功能

Write 方法提供调试输出:

// 写入数据时会输出调试信息
opcService.Write("Temperature", 25.5);
// 输出: Temperature = 25.5

// 数组数据
int[] values = { 1, 2, 3 };
opcService.Write("Values", values);
// 输出: Values = [1][2][3]

许可证

MIT License

相关库

  • HL.OPC: OPC DA 基础通信库
  • HL.MCP: 制造控制平台框架
  • HL.MCP.Service.AB: Allen-Bradley PLC 服务
  • HL.MCP.Service.Siemens: Siemens PLC 服务

技术支持

如需更多信息或技术支持,请参考:

No packages depend on HL.MCP.Service.DevelopOPC.

.NET Framework 4.6.2

Version Downloads Last updated
2.0.9 0 08/19/2026