编辑
2025-11-30
C#
00

目录

OPC DA基本概念
OPC DA是什么?
关键组件
OpcClientSdk开发实践
开发环境准备
代码详解
连接OPC服务器
创建订阅组
定义和添加监控项目
基础例子
TsCDaItem参数:
数据变更事件处理
注意事项
结论

OPC(Open Platform Communications)是工业自动化领域标准的通信协议,其中OPC DA(Data Access)是最常用的通信标准之一。本文将深入探讨如何使用OpcClientSdk在C#中开发OPC DA客户端应用。

OPC DA基本概念

OPC DA是什么?

OPC DA是一种标准化的工业通信接口,允许不同设备和软件系统之间进行实时数据交换。它主要用于:

  • 从工业设备读取实时数据
  • 向设备写入控制数据
  • 监控数据变化

关键组件

  • Server(服务器):提供数据访问的工业设备或软件
  • Client(客户端):请求和处理数据的应用程序
  • Item(项目):可以读写的具体数据点

OpcClientSdk开发实践

开发环境准备

  • 安装OpcClientSdk
  • 添加必要的引用:OpcClientSdkOpcClientSdk.Da

代码详解

连接OPC服务器

C#
const string serverUrl = "opcda://localhost/Kepware.KEPServerEX.V6"; TsCDaServer myDaServer = new TsCDaServer(); myDaServer.Connect(serverUrl);

创建订阅组

C#
TsCDaSubscriptionState groupState = new TsCDaSubscriptionState { Name = "MyGroup" }; TsCDaSubscription group = (TsCDaSubscription)myDaServer.CreateSubscription(groupState);

定义和添加监控项目

C#
TsCDaItem[] items = new TsCDaItem[1]; items[0] = new TsCDaItem { ItemName = "Channel.Device.L1", ClientHandle = 100, Active = true };

基础例子

C#
using OpcClientSdk.Da; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AppOpcDa { internal class Program { static void Main(string[] args) { const string serverUrl = "opcda://localhost/Kepware.KEPServerEX.V6"; TsCDaServer myDaServer = new TsCDaServer(); myDaServer.Connect(serverUrl); if (myDaServer.IsConnected) { Console.WriteLine("Connected to OPC DA Server"); TsCDaSubscriptionState groupState = new TsCDaSubscriptionState { Name = "MyGroup" }; TsCDaSubscription group = (TsCDaSubscription)myDaServer.CreateSubscription(groupState); TsCDaItem[] items = new TsCDaItem[1]; TsCDaItemResult[] itemResults; items[0] = new TsCDaItem(); items[0].ItemName = "Channel.Device.L1"; // 指定要读取的 OPC 标签名称 items[0].ClientHandle = 100; // 客户端自定义句柄,用于标识这个数据项 items[0].MaxAgeSpecified = true; // 启用 MaxAge 设置 items[0].MaxAge = 0; // 从服务器直接读取实时数据 items[0].Active = true; // 设置数据项为活动状态 items[0].ActiveSpecified = true; // 启用 Active 设置 // 读取数据 TsCDaItemValueResult[] itemValues = myDaServer.Read(items); // 遍历并输出读取到的数据 for (int i = 0; i < itemValues.Length; i++) { // 检查是否成功读取 if (!itemValues[i].Result.IsError()) { Console.WriteLine($"Item: {items[i].ItemName}"); Console.WriteLine($"Value: {itemValues[i].Value}"); Console.WriteLine($"Quality: {itemValues[i].Quality}"); Console.WriteLine($"Timestamp: {itemValues[i].Timestamp}"); } else { Console.WriteLine($"Error reading item {items[i].ItemName}: {itemValues[i].Result}"); } } itemResults = group.AddItems(items); for (int i = 0; i < itemResults.GetLength(0); i++) { if (itemResults[i].Result.IsError()) { Console.WriteLine(String.Format(" Item {0} could not be added to the group", itemResults[i].ItemName)); } } } Console.ReadKey(); } } }

image.png

TsCDaItem参数:

  1. ItemName (标签名称)
    • 类型:字符串
    • 描述:指定要读取的 OPC 服务器中的具体数据点/标签
    • 示例:"SimulatedData.Ramp"
    • 作用:唯一标识 OPC 服务器中的数据项
  2. ClientHandle (客户端句柄)
    • 类型:整数
    • 描述:客户端自定义的唯一标识符
    • 用途:帮助客户端在读取和处理数据时识别和关联特定的数据项
    • 范围:由开发者自行定义
  3. MaxAgeSpecified (最大年龄是否指定)
    • 类型:布尔值
    • 描述:指示是否使用 MaxAge 参数
    • true:启用 MaxAge 设置
    • false:忽略 MaxAge 设置
  4. MaxAge (最大年龄)
    • 类型:整数(毫秒)
    • 描述:控制数据读取方式
    • 0:直接从服务器读取实时数据
    • >0:允许从缓存读取指定时间内的数据
    • 作用:平衡性能和数据实时性
  5. Active (活动状态)
    • 类型:布尔值
    • 描述:标记数据项是否处于活动状态
    • true:数据项活动,可以进行数据交换
    • false:数据项非活动,不进行数据交换
  6. ActiveSpecified (活动状态是否指定)
    • 类型:布尔值
    • 描述:指示是否使用 Active 参数
    • true:启用 Active 设置
    • false:忽略 Active 设置

数据变更事件处理

C#
group.DataChangedEvent += OnDataChangeEvent;
C#
public static void OnDataChangeEvent(object subscriptionHandle, object requestHandle, TsCDaItemValueResult[] values) { foreach (var value in values) { if (value.Result.IsSuccess()) { Console.WriteLine($"Value: {value.Value}"); Console.WriteLine($"Timestamp: {value.Timestamp}"); Console.WriteLine($"Quality: {value.Quality}"); } } }

image.png

注意事项

  • 确保OPC服务器正确配置
  • 处理网络延迟和通信中断
  • 遵守数据访问权限

结论

OpcClientSdk提供了强大且灵活的OPC DA客户端开发方案,使开发者能够轻松实现工业数据通信。通过合理使用SDK,可以构建高效、稳定的工业数据访问应用。


希望这篇文章对你理解OPC DA和OpcClientSdk的应用有所帮助!如有任何问题,欢迎随时询问。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!