opc da

22 阅读4分钟

核心组件

经典OPC-OPC中国

opcda.idl 可用来生成 COM,明确里面的方法及类

MIDL 编译 - Win32 apps | Microsoft Learn

向 COM 公开 .NET Core 组件 - .NET | Microsoft Learn

tlb 生成 idl

oleview *.tlb

image.png

IDL GEN C

  1. c gen

依赖 midl.exe、cl.exe、windows sdk

/out 输出的文件夹无法自动创建,需手动创建

gen:
	midl /I "D:\Windows Kits\10\Include\10.0.22621.0\um" /I "D:\Windows Kits\10\Include\10.0.22621.0\shared" /out output_dir include/opcda.idl
	
tdl:
	midl /I "D:\Windows Kits\10\Include\10.0.22621.0\um" /I "D:\Windows Kits\10\Include\10.0.22621.0\shared" include/opcda.idl /tlb opcda.tlb 	
	
vscmd:
	tlbimp opcda.tlb /out:opcda_csharp.dll /machine:x86

IDL GEN C#

  1. c# gen

idl 生成 tlb

tlb 生成 dll

vscmd 使用 Developer Command Prompt for VS 2022

tdl:
	midl /I "D:\Windows Kits\10\Include\10.0.22621.0\um" /I "D:\Windows Kits\10\Include\10.0.22621.0\shared" include/opcda.idl /tlb opcda.tlb 	
	
vscmd:
	tlbimp opcda.tlb /out:opcda_csharp.dll /machine:x86

tlb文件编译成C#可以直接调用的DLL-CSDN博客

高版本的核心组件,兼容连接opcda服务

是的,完全可以! 这正是OPC基金会维护向后兼容性的设计目标。

详细说明:

核心兼容性原则

"高版本OPC Core Components客户端 → 低版本OPC DA服务器" 是官方支持的场景

具体兼容性矩阵

客户端组件版本可连接的服务器版本兼容性
3.0.xDA 3.0 服务器✅ 完全兼容
3.0.xDA 2.05a 服务器✅ 完全兼容
3.0.xDA 2.0 服务器✅ 完全兼容
3.0.xDA 1.0a 服务器✅ 完全兼容
2.0xDA 1.0a 服务器✅ 完全兼容

为什么能够兼容:

1. 协议层兼容

  • OPC DA规范在设计时就考虑了向后兼容
  • 新版本客户端会自动降级使用服务器支持的协议功能
  • 通信基于相同的COM/DCOM基础

2. 接口继承

  • DA 3.0接口继承自DA 2.0
  • DA 2.0接口继承自DA 1.0
  • 客户端通过QueryInterface检测服务器能力

3. 实际工作方式

// 伪代码示例:客户端如何兼容低版本服务器
HRESULT ConnectToServer(LPCOLESTR progID)
{
    // 1. 创建OPC Server对象
    CoCreateInstance(CLSID_OPCServer, ...);
    
    // 2. 尝试获取最新接口
    hr = pServer->QueryInterface(IID_IOPCServer3, ...);
    
    if (FAILED(hr)) // 如果服务器不支持3.0接口
    {
        // 3. 回退到2.0接口
        hr = pServer->QueryInterface(IID_IOPCServer2, ...);
        
        if (FAILED(hr)) // 如果还不支持2.0
        {
            // 4. 回退到1.0接口
            hr = pServer->QueryInterface(IID_IOPCServer, ...);
        }
    }
    
    // 5. 根据实际获得的接口调整功能使用
    return hr;
}

实际开发中的注意事项:

1. 功能降级处理

// 开发时需要检查功能可用性
if (serverSupportsV3)
{
    // 使用DA 3.0增强功能:增强浏览、属性访问等
    UseAdvancedBrowsing();
}
else if (serverSupportsV2)
{
    // 使用DA 2.0标准功能
    UseStandardBrowsing();
}
else
{
    // 仅使用DA 1.0基础功能
    UseBasicFunctionality();
}

2. 必须处理的限制

功能限制

  • DA 3.0 → DA 1.0服务器
    • 只能使用基本IOPCItemMgt接口
    • 没有浏览接口(需硬编码Item ID)
    • 没有服务器状态详细信息
    • 没有批处理操作

数据类型限制

  • 某些DA 3.0新增的数据类型在低版本可能不支持
  • 需要做类型转换或降级

3. 推荐开发实践

版本检测代码示例

// 检测服务器版本
OPCSERVERSTATUS status;
pServer->GetStatus(&status);

// 检查版本信息
if (status.wMajorVersion == 3)
{
    // 支持DA 3.0所有功能
}
else if (status.wMajorVersion == 2)
{
    // 限制某些高级功能
    DisableAdvancedFeatures();
}
else if (status.wMajorVersion == 1)
{
    // 使用最基础的功能集
    UseMinimalFeatureSet();
}

优雅降级策略

  1. 浏览功能

    • 优先尝试IOPCBrowse3(DA 3.0)
    • 失败则尝试IOPCBrowse2(DA 2.05a)
    • 最后使用IOPCBrowse(DA 2.0)
  2. 数据访问

    • 优先使用同步/异步读取
    • 低版本服务器可能不支持订阅

4. 连接配置要点

DCOM设置

# 即使服务器版本低,也需要正确的DCOM配置
dcomcnfg
# 确保:
# 1. OPCEnum服务运行
# 2. 权限设置正确
# 3. 防火墙允许通信

网络设置

# 添加防火墙规则(如果需要)
New-NetFirewallRule -DisplayName "OPC DA" `
                    -Direction Inbound `
                    -Protocol TCP `
                    -LocalPort 135,1024-65535 `
                    -Action Allow

测试验证方法:

1. 使用官方工具测试

# OPC基金会提供的测试工具
# 1. OPC Compliance Test (验证兼容性)
# 2. OPC Quick Client (测试连接)

2. 连接测试步骤

1. 安装高版本Core Components (3.0+)
2. 注册所有DLL(如前所述)
3. 启动低版本OPC DA服务器(如KEPServerEX 5.x)
4. 使用高版本客户端连接测试

3. 常见低版本服务器测试

  • KEPServerEX 5.x (DA 3.0)
  • Matrikon OPC Server 3.x (DA 2.05a)
  • RSLinx Classic (DA 2.0)
  • SIEMENS SIMATIC NET (混合版本)

如果遇到连接问题:

排查清单

  1. ✅ DCOM配置是否正确
  2. ✅ 用户权限是否足够
  3. ✅ 防火墙是否允许
  4. ✅ OPCEnum服务是否运行
  5. ✅ 服务器ProgID是否正确

调试工具

# 1. OPCEnum浏览器
OpcEnum.exe

# 2. DCOM配置检查
dcomcnfg /launchapplication:{YourServerCLSID}

# 3. 网络连接测试
telnet server_ip 135

总结:

使用高版本OPC Core Components (3.0+) 开发的客户端完全可以连接低版本OPC DA服务器,这是官方设计支持的标准场景。开发时只需注意:

  1. 功能检测和降级处理
  2. 优雅的错误处理
  3. 适当的用户提示

这是OPC DA技术的核心优势之一,确保了企业系统的长期兼容性和投资保护。