如何用UAExpert导出OPC UA告警为CSV及开发C# CNC告警邮件客户端
解决方案
一、通过UAExpert导出告警到本地文件
UAExpert自带事件导出功能,具体操作步骤:
- 打开UAExpert并连接到Sinumerik ONE的OPC UA服务器,切换到Event View面板
- 在事件列表中,选中需要导出的告警条目(按
Ctrl+A可全选所有告警) - 右键点击选中的条目,选择
Export选项 - 在弹出的窗口中,选择桌面作为保存路径,导出格式推荐CSV(便于C#程序读取),点击
Save完成导出
注意:UAExpert仅支持手动导出,若需要定时自动获取告警,这种方式局限性较大,更推荐直接开发专属OPC UA客户端。
二、开发C#专属OPC UA客户端读取告警
这是更高效、自动化的方案,借助OPC Foundation官方的.NET库实现:
1. 安装依赖包
在Visual Studio中,通过NuGet安装以下包:
Install-Package Opc.Ua.Core Install-Package Opc.Ua.Client
2. 核心实现步骤
- 建立服务器连接:配置服务器端点(Sinumerik ONE的OPC UA地址一般为
opc.tcp://<CNC_IP>:4840),根据服务器配置处理安全认证(默认可能允许匿名访问,若有认证需添加用户名密码) - 订阅事件节点:Sinumerik ONE的告警事件通常位于特定地址空间节点下(可通过UAExpert浏览找到准确节点,例如
ns=2;s=Machine/Events/Alarms) - 处理事件回调:当服务器推送告警事件时,在回调方法中解析告警信息(如代码、描述、触发时间),直接用于邮件发送
3. 简化代码示例
using Opc.Ua; using Opc.Ua.Client; using System.Threading.Tasks; // 初始化OPC UA客户端 var client = new Session(); var endpoint = new EndpointDescription("opc.tcp://[CNC_IP]:4840"); var config = new ConfiguredEndpoint(null, endpoint, EndpointConfiguration.Create()); // 建立连接(匿名访问示例,有认证需修改) await client.CreateSessionAsync(config, false, "C# Alarm Client", 60000, null, null); // 创建事件订阅 var subscription = new Subscription(client.DefaultSubscription) { PublishingInterval = 1000, // 每秒轮询一次 Enabled = true }; client.AddSubscription(subscription); // 添加告警事件监控项(替换为实际节点ID) var alarmNodeId = new NodeId("ns=2;s=Machine/Events/Alarms"); var eventFilter = new EventFilter(null, new SimpleAttributeOperand[] { new SimpleAttributeOperand { TypeDefinitionId = ObjectTypeIds.BaseEventType, BrowsePath = new[] { BrowseNames.Message } }, new SimpleAttributeOperand { TypeDefinitionId = ObjectTypeIds.BaseEventType, BrowsePath = new[] { BrowseNames.Time } }, new SimpleAttributeOperand { TypeDefinitionId = ObjectTypeIds.BaseEventType, BrowsePath = new[] { BrowseNames.Severity } } }); var monitorItem = new MonitoredItem(subscription.DefaultItem) { StartNodeId = alarmNodeId, AttributeId = Attributes.EventNotifier, MonitoringMode = MonitoringMode.Reporting, Parameter = eventFilter }; monitorItem.Notification += OnAlarmReceived; subscription.AddItem(monitorItem); // 激活订阅 await subscription.ApplyChangesAsync(); // 告警事件回调方法 void OnAlarmReceived(object sender, MonitoredItemNotificationEventArgs e) { foreach (var notification in e.Notifications) { if (notification is EventNotificationList eventList) { foreach (var fieldList in eventList.Events) { // 解析告警信息 var alarmMsg = fieldList.Fields[0].Value as string; var alarmTime = fieldList.Fields[1].Value as DateTime?; var alarmSeverity = fieldList.Fields[2].Value as ushort?; // 调用邮件发送逻辑 SendAlarmEmail(alarmMsg, alarmTime, alarmSeverity); } } } } // 邮件发送方法(需自行实现SMTP逻辑) void SendAlarmEmail(string msg, DateTime? time, ushort? severity) { // 示例:使用System.Net.Mail发送邮件 // var smtpClient = new SmtpClient("smtp.example.com"); // // 配置发件人、收件人、邮件内容等 }
注意:请替换代码中的
[CNC_IP]和告警节点ID为实际值;若服务器启用安全策略,需在连接时配置对应的安全模式和证书。
内容的提问来源于stack exchange,提问作者Rishi Verma
相关产品推荐
相关产品推荐

