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 服务器
解决方案:
- 检查 OPC 服务器是否运行
- 验证连接字符串格式正确
- 确认网络连接正常(远程服务器)
- 检查 DCOM 配置(Windows)
- 验证用户权限
数据项无法读取
问题: 配置的数据项读取失败
解决方案:
- 检查
OPCItemName是否正确 - 验证数据项在 OPC 服务器中存在
- 确认数据类型匹配
- 检查 PLC 通信状态
数据更新不及时
问题: 数据变化延迟较大
解决方案:
- 减小
UpdateRate值 - 检查网络延迟
- 优化数据项数量
- 检查服务器性能
DCOM 配置问题
问题: 远程 OPC 连接失败
解决方案:
- 配置 DCOM 权限
- 开启远程激活权限
- 配置防火墙规则
- 使用 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 服务
技术支持
如需更多信息或技术支持,请参考:
- OPC Foundation: https://opcfoundation.org
- HL Framework 文档
No packages depend on HL.MCP.Service.DevelopOPC.
.NET Framework 4.6.2
- HL.OPC (>= 2.0.9)
| Version | Downloads | Last updated |
|---|---|---|
| 2.0.9 | 1 | 08/19/2026 |