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 服务器
注意事项
COM 内存管理
- 使用
Marshal.FreeCoTaskMem释放非托管内存 - 使用
Marshal.ReleaseComObject释放 COM 对象 - 注意避免内存泄漏
- 使用
线程模型
- OPC DA 服务器通常使用 STA 线程模型
- 回调函数在 OPC 服务器的线程上下文中执行
错误处理
- 检查 HRESULT 返回值
- 使用
pErrors数组检查每个操作的错误
质量代码
- 使用
Qualities类中的常量解析质量代码 - 质量代码包含:质量、子状态、限制信息
- 使用
数据类型
- 使用 VARIANT 类型(对应 .NET 的
object) - 注意类型转换和验证
- 使用 VARIANT 类型(对应 .NET 的
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 |