OpcRcw.Da.Package 4.0.3

OpcRcw.Da

OPC DA (Data Access) COM 互操作接口库。提供 OPC DA 1.0/2.0/3.0 规范的完整 Runtime Callable Wrapper (RCW) 实现,用于 .NET 应用程序与 COM-based OPC DA 服务器的数据访问。

功能特性

核心服务器接口

  • IOPCServer - OPC 服务器主接口,提供组管理、服务器状态查询等功能
  • IOPCServerPublicGroups - 公共组管理接口
  • OPCSERVERSTATE - 服务器状态枚举
  • OPCSERVERSTATUS - 服务器状态结构

组管理接口

  • IOPCGroupStateMgt - 组状态管理接口
  • IOPCGroupStateMgt2 - 组状态管理接口 v2.0
  • IOPCPublicGroupStateMgt - 公共组状态管理接口

数据项管理

  • IOPCItemMgt - 数据项管理接口,添加、删除、修改数据项
  • OPCITEMDEF - 数据项定义结构
  • OPCITEMATTRIBUTES - 数据项属性
  • OPCITEMRESULT - 数据项操作结果
  • OPCITEMSTATE - 数据项状态
  • OPCITEMVQT - 数据项值、质量、时间戳

同步数据访问

  • IOPCSyncIO - 同步 I/O 接口,支持同步读写
  • IOPCSyncIO2 - 同步 I/O 接口 v2.0
  • IOPCItemIO - 简化的项 I/O 接口

异步数据访问

  • IOPCAsyncIO - 异步 I/O 接口
  • IOPCAsyncIO2 - 异步 I/O 接口 v2.0
  • IOPCAsyncIO3 - 异步 I/O 接口 v3.0
  • IOPCDataCallback - 数据变化回调接口

地址空间浏览

  • IOPCBrowseServerAddressSpace - 服务器地址空间浏览接口
  • IOPCBrowse - 增强的地址空间浏览接口(OPC DA 3.0)
  • OPCBROWSETYPE - 浏览类型枚举
  • OPCBROWSEDIRECTION - 浏览方向枚举
  • OPCBROWSEFILTER - 浏览过滤器
  • OPCBROWSEELEMENT - 浏览元素结构
  • OPCNAMESPACETYPE - 命名空间类型

数据项属性

  • IOPCItemProperties - 数据项属性接口
  • OPCITEMPROPERTY - 数据项属性结构
  • OPCITEMPROPERTIES - 数据项属性集合
  • Properties - 标准属性 ID 定义

高级功能

  • IOPCItemDeadbandMgt - 死区管理接口
  • IOPCItemSamplingMgt - 采样管理接口

枚举器

  • IEnumOPCItemAttributes - 数据项属性枚举器
  • IEnumString - 字符串枚举器

常量和数据类型

  • OPCDATASOURCE - 数据源(缓存/设备)
  • OPCEUTYPE - 工程单位类型
  • OPCENUMSCOPE - 枚举范围
  • Qualities - 质量标志常量
  • Constants - OPC DA 常量定义
  • FILETIME - Windows 文件时间结构

服务器类别 GUID

  • CATID_OPCDAServer10 - OPC DA 1.0 服务器类别
  • CATID_OPCDAServer20 - OPC DA 2.0 服务器类别
  • CATID_OPCDAServer30 - OPC DA 3.0 服务器类别
  • CATID_XMLDAServer10 - XML DA 1.0 服务器类别

安装

通过 NuGet 包管理器

dotnet add package OpcRcw.Da

通过 Package Manager Console

Install-Package OpcRcw.Da

使用示例

连接 OPC DA 服务器

using OpcRcw.Da;
using OpcRcw.Comn;
using System;
using System.Runtime.InteropServices;

// 创建 OPC 服务器实例
Type serverType = Type.GetTypeFromProgID("Matrikon.OPC.Simulation.1");
object serverObj = Activator.CreateInstance(serverType);
IOPCServer opcServer = (IOPCServer)serverObj;

// 获取服务器状态
IntPtr pStatus = IntPtr.Zero;
opcServer.GetStatus(out pStatus);
OPCSERVERSTATUS status = (OPCSERVERSTATUS)Marshal.PtrToStructure(
    pStatus, 
    typeof(OPCSERVERSTATUS));

Console.WriteLine($"服务器状态: {status.dwServerState}");
Console.WriteLine($"当前时间: {status.ftCurrentTime}");

// 释放内存
Marshal.FreeCoTaskMem(pStatus);

创建组并添加数据项

// 创建组
object groupObj;
Guid iid = typeof(IOPCItemMgt).GUID;
int serverHandle;
int revisedUpdateRate;
opcServer.AddGroup(
    "Group1",                    // 组名
    1,                          // 活动状态
    1000,                       // 更新速率(毫秒)
    0,                          // 客户端句柄
    IntPtr.Zero,                // 时区
    IntPtr.Zero,                // 死区
    0,                          // LCID
    out serverHandle,
    out revisedUpdateRate,
    ref iid,
    out groupObj);

IOPCItemMgt itemMgt = (IOPCItemMgt)groupObj;

// 定义数据项
OPCITEMDEF[] itemDefs = new OPCITEMDEF[1];
itemDefs[0] = new OPCITEMDEF
{
    szItemID = "Random.Int4",
    szAccessPath = "",
    bActive = 1,
    hClient = 1,
    dwBlobSize = 0,
    pBlob = IntPtr.Zero,
    vtRequestedDataType = 3  // VT_I4
};

// 添加数据项
IntPtr pResults;
IntPtr pErrors;
itemMgt.AddItems(1, itemDefs, out pResults, out pErrors);

// 处理结果...

同步读取数据

IOPCSyncIO syncIO = (IOPCSyncIO)groupObj;

int[] serverHandles = new int[] { 1 };
IntPtr pValues;
IntPtr pErrors;

// 从设备读取
syncIO.Read(
    OPCDATASOURCE.OPC_DS_DEVICE,
    1,
    serverHandles,
    out pValues,
    out pErrors);

// 处理读取的数据
OPCITEMSTATE itemState = (OPCITEMSTATE)Marshal.PtrToStructure(
    pValues,
    typeof(OPCITEMSTATE));

Console.WriteLine($"值: {itemState.vDataValue}");
Console.WriteLine($"质量: {itemState.wQuality}");
Console.WriteLine($"时间戳: {itemState.ftTimeStamp}");

// 释放内存
Marshal.FreeCoTaskMem(pValues);
Marshal.FreeCoTaskMem(pErrors);

异步读取(订阅数据变化)

// 实现回调接口
public class DataCallback : IOPCDataCallback
{
    public void OnDataChange(
        int dwTransid,
        int hGroup,
        int hrMasterquality,
        int hrMastererror,
        int dwCount,
        int[] phClientItems,
        object[] pvValues,
        short[] pwQualities,
        FILETIME[] pftTimeStamps,
        int[] pErrors)
    {
        for (int i = 0; i < dwCount; i++)
        {
            Console.WriteLine($"项 {phClientItems[i]}: {pvValues[i]}");
        }
    }
    
    // 实现其他接口方法...
}

// 注册回调
IConnectionPointContainer cpc = (IConnectionPointContainer)groupObj;
IConnectionPoint cp;
Guid iidCallback = typeof(IOPCDataCallback).GUID;
cpc.FindConnectionPoint(ref iidCallback, out cp);

DataCallback callback = new DataCallback();
int cookie;
cp.Advise(callback, out cookie);

浏览服务器地址空间

IOPCBrowseServerAddressSpace browse = (IOPCBrowseServerAddressSpace)opcServer;

// 切换到根节点
browse.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_TO, "");

// 获取分支
IEnumString enumString;
browse.BrowseOPCItemIDs(
    OPCBROWSETYPE.OPC_BRANCH,
    "",
    0,
    0,
    out enumString);

// 枚举分支
string[] branches = new string[100];
int fetched;
enumString.Next(100, branches, out fetched);

for (int i = 0; i < fetched; i++)
{
    Console.WriteLine($"分支: {branches[i]}");
}

Marshal.ReleaseComObject(enumString);

系统要求

  • .NET Framework 2.0 或更高版本
  • Windows 操作系统(因为 OPC DA 基于 COM/DCOM)
  • 已安装的 OPC DA 服务器

注意事项

  1. COM 内存管理

    • 使用 Marshal.FreeCoTaskMem 释放非托管内存
    • 使用 Marshal.ReleaseComObject 释放 COM 对象
    • 注意避免内存泄漏
  2. 线程模型

    • OPC DA 服务器通常使用 STA 线程模型
    • 回调函数在 OPC 服务器的线程上下文中执行
  3. 错误处理

    • 检查 HRESULT 返回值
    • 使用 pErrors 数组检查每个操作的错误
  4. 质量代码

    • 使用 Qualities 类中的常量解析质量代码
    • 质量代码包含:质量、子状态、限制信息
  5. 数据类型

    • 使用 VARIANT 类型(对应 .NET 的 object
    • 注意类型转换和验证

OPC DA 版本支持

  • OPC DA 1.0 - 基本的同步读写功能
  • OPC DA 2.0 - 添加异步 I/O、组管理
  • OPC DA 3.0 - 增强的浏览、XML-DA 支持

相关项目

  • OpcRcw.Comn - OPC COM 通用接口库(依赖项)
  • HL.OPC - HL 框架的高级 OPC 封装
  • HL.AdsOPC - Beckhoff ADS OPC 实现
  • HL.S7OPC - Siemens S7 OPC 实现
  • HL.ModbusOPC - Modbus OPC 实现

技术规范

本库实现了 OPC Foundation 的以下规范:

  • OPC Data Access Specification 1.0
  • OPC Data Access Specification 2.05a
  • OPC Data Access Specification 3.0
  • 完全符合 OPC Foundation 标准

许可证

MIT License

Copyright © 2015 贵州慧联科技有限公司

技术支持

如有问题或建议,请联系技术支持团队或访问项目仓库。

Showing the top 20 packages that depend on OpcRcw.Da.Package.

Packages Downloads
HL.OPC
通用 OPC DA 客户端组件,支持标准 OPC DA 2.0 协议。提供服务器连接、组管理、数据读写、变化订阅等功能。
0

初始版本发布

This package has no dependencies.

Version Downloads Last updated
4.0.3 0 08/19/2026