老规矩,直接上代码。工业现场搞OPC通讯,最烦人的就是DCOM配置,但有时候老设备还得用OPC DA。先来个DA的硬核写法
最后说句大实话:能用OPC UA就别碰DA了,跨平台不香吗?遇到国产设备不支持UA的,建议采购时把技术支持拉过来现场联调(别问我怎么知道的)。的路径格式,不同OPC服务器写法可能抽风,建议用Kepware自带的诊断工具先测标签路径。这代码跑起来之前,记得在控制面板里配DCOM权限(别问我怎么配,问就是重启大法)。的100ms延迟比循环单点读快10倍不止。C# opc ua/da通信源代码示例,应用
·
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程序。

遇到连接超时别慌,工业现场常见问题检查清单:
- 防火墙是否放行4840端口(UA)或135端口(DA)
- 目标服务器是否允许匿名登录
- PLC标签地址大小写敏感问题
- 网络风暴导致丢包(交换机接错线这种事我见多了)
实用技巧:批量读取时用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的,建议采购时把技术支持拉过来现场联调(别问我怎么知道的)。





更多推荐
所有评论(0)