我有一个FactoryTalk服务器,上面有一些节点,我需要监控几个属性值。
我创建了一个客户端,成功读写数据,但无法让订阅工作起来。
以下是订阅配置:
我的监控项目:
我给它们分配了通知处理程序(这里需要协议对象实例,所以我进行了调整):
然后我添加事件处理程序:
我将项目添加到订阅并创建它:
我已经通过控制台检查了一遍,订阅已经被服务器创建并分配了一个ID。我也检查了所有的监视项,CreateMonitoredItems服务调用成功,并且它们也被分配了客户端句柄,NodeId正确解析,没有错误的StatusCode。
我通过一个名为UaExpert的第三方客户端应用程序对属性进行了更改。
然而,我无法触发通知事件处理程序。
我做错了什么吗? 有人能给出如何解决/调试这个问题的建议吗?
我创建了一个客户端,成功读写数据,但无法让订阅工作起来。
以下是订阅配置:
subscription = new Subscription(session.DefaultSubscription)
{
DisplayName = "Test subscription",
PublishingEnabled = true,
PublishingInterval = 500,
LifetimeCount = 0,
};
我的监控项目:
monitoredItems = nodeAttrs
.Select(nodeId => new MonitoredItem(subscription.DefaultItem)
{
StartNodeId = nodeId,
AttributeId = Attributes.Value,
QueueSize = 1,
SamplingInterval = 500,
MonitoringMode = MonitoringMode.Reporting,
})
.ToList();
我给它们分配了通知处理程序(这里需要协议对象实例,所以我进行了调整):
MonitoredItemNotificationEventHandler monitoredItemEventHandler = (monitoredItem, e) => AttributeNotification(monitoredItem, e, protocol);
然后我添加事件处理程序:
foreach (var monitoredItem in monitoredItems)
{
monitoredItem.Notification += monitoredItemEventHandler;
}
我将项目添加到订阅并创建它:
subscription.AddItems(monitoredItems);
session.AddSubscription(subscription);
subscription.Create();
我已经通过控制台检查了一遍,订阅已经被服务器创建并分配了一个ID。我也检查了所有的监视项,CreateMonitoredItems服务调用成功,并且它们也被分配了客户端句柄,NodeId正确解析,没有错误的StatusCode。
我通过一个名为UaExpert的第三方客户端应用程序对属性进行了更改。
然而,我无法触发通知事件处理程序。
我做错了什么吗? 有人能给出如何解决/调试这个问题的建议吗?
monitoredItem.Notification += MyItemChangedHandler;
- Victor PiepermonitoredItem.Notification += MyItemChangedHandler;
- undefinedmonitoredItem.Notification += MyItemChangedHandler;
|public static void MyItemChangedHandler(MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs eventArgs) { MonitoredItemNotification? notification = eventArgs.NotificationValue as MonitoredItemNotification; Console.WriteLine("Node: {0} Value: {1}", monitoredItem.StartNodeId, notification.Value.WrappedValue.ToString()); }
- Victor PiepermonitoredItem.Notification += MyItemChangedHandler;
|public static void MyItemChangedHandler(MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs eventArgs) { MonitoredItemNotification? notification = eventArgs.NotificationValue as MonitoredItemNotification; Console.WriteLine("Node: {0} Value: {1}", monitoredItem.StartNodeId, notification.Value.WrappedValue.ToString()); }
- undefined