using Opc.Ua;
using Opc.Ua.Client;
using OpcUaHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using TeamAAS_VP.Enums;
using TeamAAS_VP.Interfaces;
using TeamAAS_VP.Models;
namespace TeamAAS_VP.Core.PLCs
{
///
/// OPC UA 节点订阅模式。
///
public enum OpcUaSubscriptionMode
{
///
/// 使用 OPC UA 原生订阅机制,由服务端主动推送节点变更。
///
Native,
///
/// 使用客户端轮询方式定时读取节点值,并在检测到变化时触发通知。
///
CustomPolling
}
///
/// OPC UA 订阅配置选项,用于控制订阅模式、轮询间隔以及首次扫描通知行为。
///
public class OpcUaSubscriptionOptions
{
///
/// 获取或设置订阅模式。
/// 默认为 。
///
public OpcUaSubscriptionMode Mode { get; set; } = OpcUaSubscriptionMode.Native;
///
/// 获取或设置轮询间隔,单位为毫秒。
/// 仅在 为 时生效。
/// 默认值为 50。
///
public int PollingInterval { get; set; } = 50;
///
/// 获取或设置首次扫描时是否立即通知当前值。
/// 仅在自定义轮询订阅模式下生效。
///
public bool NotifyOnFirstScan { get; set; }
}
public class OpcUaClientPLC : IPlc
{
private readonly object _pollingSubscriptionLock = new object();
private readonly Dictionary _pollingSubscriptions = new Dictionary();
public Guid Id{ get; private set; }
public CommunicationType CommunicationType { get; private set; }
public string EndpointUrl { get; private set; }
public int Index { get; set; }
public string Name { get; private set; }
public OpcUaClient OpcUaClient { get; private set; }
public bool IsConnected { get { return OpcUaClient.Connected; } }
///
/// 节点头
///
public string NodeHeader { get; private set; }
///
/// 获取或设置默认的节点订阅模式。
/// 在未显式传入订阅选项时,`SubscribeNodes` 将使用该模式决定采用 OPC UA 原生订阅还是客户端轮询订阅。
/// 默认值为 。
///
//public OpcUaSubscriptionMode DefaultSubscriptionMode { get; set; } = OpcUaSubscriptionMode.CustomPolling;
public OpcUaSubscriptionMode DefaultSubscriptionMode { get; set; } = OpcUaSubscriptionMode.Native;
///
/// 获取或设置默认的订阅轮询间隔,单位为毫秒。
/// 仅当默认订阅模式或实际订阅选项使用自定义轮询时生效。
/// 默认值为 `100`。
///
public int DefaultSubscriptionPollingInterval { get; set; } = 50;
///
/// 获取或设置在默认轮询订阅模式下,首次扫描节点时是否立即触发一次数据变更通知。
///
public bool DefaultNotifyOnFirstScan { get; set; }
///
/// PLC 连接状态变化事件。
/// 当 OPC UA 客户端完成连接、开始重连或重连完成时触发,第二个参数表示当前连接状态。
///
public event Action