opc da客户端在c#中必须通过com互操作实现,需引用opc类型库、配置dcom权限并严格匹配进程位数;读写数据须经iopcgroupstatemgt和iopcitemmgt创建组与项,.net framework 4.8为最稳运行时。

OPC DA 客户端在 C# 中必须用 COM 互操作,不是 NuGet 包能直接解决的
OPC DA 是基于 DCOM 的老旧协议,C# 没有原生支持,也不能靠 System.Data 或现代 HTTP 客户端搞定。你得走 COM 互操作路线,核心是引用 OPC Core Components Redistributables 提供的类型库(如 OPCServer.dll),再用 tlbimp.exe 生成互操作程序集,或直接在 VS 里“添加引用 → COM → OPC DA Specification”。
- 别试图用
HttpClient或WebClient去连 OPC DA —— 它压根不走 HTTP - 不要在 .NET Core/.NET 5+ 项目里直接引用旧版 OPC DA COM 组件:默认不支持 DCOM 激活,会抛
System.Runtime.InteropServices.COMException: 拒绝访问 - Win10/Win11 上需手动启用 DCOM 配置:运行
dcomcnfg→ “组件服务 → 计算机 → 我的电脑 → 属性 → 默认属性”,勾选“在此计算机上启用分布式 COM”
连接时最常见的 0x80040201 和 0x80070005 错误怎么解
这两个错误码高频出现:0x80040201 表示 OPC 服务器未注册或 CLSID 找不到;0x80070005 是权限失败,本质是 DCOM 权限没配对。它们和你的代码写得是否漂亮关系不大,主要卡在环境侧。
-
0x80040201:确认目标机器已安装对应 OPC 服务器(如 Kepware KEPServerEX、Matrikon OPC Server),且是 32 位还是 64 位——C# 进程位数必须严格匹配服务器位数(AnyCPU项目在 x64 系统上默认跑 x64,但很多老 OPC 服务只有 x86 版) -
0x80070005:右键 DCOM 配置里的 OPC 服务器 → “属性 → 安全”,把“启动和激活权限”、“访问权限”、“配置权限”三项都设为“自定义 → 编辑 → 添加当前用户并勾选允许” - 如果 OPC 服务器装在远程机器上,还要额外配“启动权限”里的“远程启动”和防火墙放行 135 端口(DCOM 端口映射入口)
读写数据必须用 IOPCGroupStateMgt + IOPCItemMgt,不能只靠 IOPCServer
只调用 ConnectServer 成功不代表能读数据——那只是连上了 OPC 服务器容器。真正读写发生在组(Group)和项(Item)层级,漏掉组管理或项添加,Read 返回的永远是空数组或 E_FAIL。
- 必须先用
IOPCServer.AddGroup创建组,再用返回的IOPCGroupStateMgt设置更新速率(比如 1000ms)、活性(IsActive = true) - 再通过该组的
IOPCItemMgt.AddItems注册具体数据点,注意szItemID必须和 OPC 服务器里配置的路径完全一致(大小写敏感,常见如Channel1.Device1.Tag1或\MyPLCTag1) - 读数据用
IOPCAsyncIO2.Read(推荐异步)或IOPCSyncIO2.Read(阻塞),但后者在 UI 线程调用易卡死,别在 WinForms 的Button.Click里直接用
.NET Framework 4.8 是目前最稳的运行时,别强上 .NET 6+ 直连 OPC DA
虽然微软提供了 Microsoft.Windows.Compatibility 包来桥接部分 COM 功能,但它不解决 DCOM 跨网络激活、安全上下文继承、STA 线程模型等底层问题。实测在 .NET 6+ 中即使引用了互操作程序集,CoCreateInstance 仍大概率失败或回调不触发。
- 生产环境建议锁定
net48,用 Windows Forms 或 Console App 启动,主线程设为 STA([STAThread]) - 若必须用新框架,只能走“桥接进程”方案:另起一个 net48 的宿主进程负责 OPC 通信,通过命名管道或 gRPC 与主应用交换数据
- OPC UA 已是替代方向,但如果你对接的是老 SCADA/DCS(如早期 Siemens WinCC、AB RSLinx Classic、Emerson DeltaV),它们只提供 OPC DA 接口,换协议不现实
真正麻烦的从来不是写几行 Read 调用,而是让 Windows 放行那个几十年前设计的 DCOM 对话——它对用户权限、UAC、防火墙、位数匹配、甚至系统区域设置都敏感。调通一台设备后,换另一台 PLC 厂家的 OPC 服务器,大概率要重配一遍 DCOM 安全策略。











