C# opc ua/da通信源代码示例,应用简单直接可使用。 工业上位机必备代码,不含界面,不含界面,不含界面,重要的事说三遍
先上OPC DA的硬核代码,这玩意儿用Com组件得劲。注意引用Interop.OPCAutomation.dll,别问在哪找,nuget有时候不太靠谱:
using OPCAutomation; public class OpcDaClient { private OPCServer _server; private OPCGroups _groups; public void Connect(string serverName) { _server = new OPCServer(); _server.Connect(serverName); // 比如"Matrikon.OPC.Simulation" _groups = _server.OPCGroups; _groups.DefaultGroupIsActive = true; } public object ReadTag(string tagName) { OPCGroup group = _groups.Add("Group1"); OPCItem item = group.OPCItems.AddItem(tagName, 0); return item.Value; } }这段代码核心就三个动作:连服务器、建组、读标签。注意那个AddItem的第二个参数是客户端句柄,自己管理好别重复。现场遇到DCOM权限问题别慌,要么改注册表要么上管理员权限。
C# opc ua/da通信源代码示例,应用简单直接可使用。 工业上位机必备代码,不含界面,不含界面,不含界面,重要的事说三遍
转战OPC UA,上OPCFoundation的官方库才是正道。Nuget搜UnifiedAutomation.Sdk就行:
using UnifiedAutomation.UaClient; public class OpcUaClient { private Session _session; public void Connect(string endpointUrl) { var settings = new ApplicationInstance(); settings.ApplicationType = ApplicationType.Client; _session = new Session(); _session.Connect(endpointUrl, SecurityMode.None); // 测试环境先关安全 } public object ReadNode(string nodeId) { ReadValueId nodeToRead = new ReadValueId() { NodeId = new NodeId(nodeId), AttributeId = Attributes.Value }; DataValue value = _session.Read(new List<ReadValueId> { nodeToRead }); return value.Value; } }这里的NodeId写法要注意,比如"ns=2;s=Simulation.Float32"。遇到证书问题就上CertificateValidator.OverrideValidation = true,生产环境别这么干。
两种协议实战要点:
- DA用同步轮询,UA建议用订阅机制
- 异常处理必须加Session.Reconnect()和自动恢复
- 性能关键处用OPCGroup.IsActive控制数据流
测试代码往控制台一怼就能跑,实测过三菱PLC和Kepware的OPC服务。数据变化回调记得在DA里用DataChange事件,UA用MonitoredItem的Notification。代码仓库里备着个OpcWrapper类,封装重连和错误码转换才是王道。