C# opc ua/da通信源代码示例,应用简单直接可使用。 工业上位机必备代码

// 引用OpcRcw.Da.dll和OpcRcw.Comn.dll
var server = new Opc.Da.Server(new OpcCom.Factory(), new Opc.URL("opcda://192.168.1.10/KEPServer"));
try
{
    server.Connect();
    var items = new Opc.Da.Item[] { new Opc.Da.Item { ItemName = "Channel.Device.Tag" } };
    Opc.Da.ItemValueResult[] values = server.Read(
        new Opc.Da.ItemCollection(items), 
        new Opc.Da.ReadParameters(), 
        out Opc.IdentifiedResult[] errors);
    
    Console.WriteLine($"当前值: {values[0].Value}");  // 这里注意索引越界
}
catch (COMException ex)
{
    Console.WriteLine($"DCOM没配好是吧?错误码:{ex.ErrorCode}");  // 经典错误提示
}

这代码跑起来之前,记得在控制面板里配DCOM权限(别问我怎么配,问就是重启大法)。重点在Opc.Da.Item的路径格式,不同OPC服务器写法可能抽风,建议用Kepware自带的诊断工具先测标签路径。

C# opc ua/da通信源代码示例,应用简单直接可使用。 工业上位机必备代码

现在年轻人流行OPC UA了,上.NET Standard版的:

using Opc.Ua.Client;
var application = new ApplicationInstance { ApplicationName = "UA菜鸟客户端" };
var endpoint = CoreClientUtils.SelectEndpoint("opc.tcp://192.168.1.10:4840", useSecurity: false);
using var session = Session.Create(
    application.ApplicationConfiguration,
    new ConfiguredEndpoint(null, endpoint),
    false, "", 60000, null, null).GetAwaiter().GetResult();

var nodesToRead = new ReadValueIdCollection {
    new ReadValueId { NodeId = NodeId.Parse("ns=2;s=Machine/Status"), AttributeId = Attributes.Value }
};
session.Read(
    null, 0, TimestampsToReturn.Neither, 
    nodesToRead, 
    out DataValueCollection results, 
    out DiagnosticInfoCollection diagnostics);

Console.WriteLine($"UA读取结果: {results[0].Value}");  // 这里可能会NullReference

这段代码用了官方Opc.Ua.Client库(NuGet直接装)。注意useSecurity:false是偷懒写法,生产环境记得配证书。异步读取推荐用ReadAsync,否则容易卡界面——特别是WinForm程序。

遇到连接超时别慌,工业现场常见问题检查清单:

  1. 防火墙是否放行4840端口(UA)或135端口(DA)
  2. 目标服务器是否允许匿名登录
  3. PLC标签地址大小写敏感问题
  4. 网络风暴导致丢包(交换机接错线这种事我见多了)

实用技巧:批量读取时用Session.Read的100ms延迟比循环单点读快10倍不止。碰到顽固设备可以加个重试机制:

int retryCount = 0;
while(retryCount < 3)
{
    try {
        // 读写操作
        break;
    }
    catch(ServiceResultException ex) when (ex.StatusCode == StatusCodes.BadSessionClosed)
    {
        session.Reconnect();  // 断线重连神器
        retryCount++;
    }
}

最后说句大实话:能用OPC UA就别碰DA了,跨平台不香吗?遇到国产设备不支持UA的,建议采购时把技术支持拉过来现场联调(别问我怎么知道的)。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐