EventHandler OPC UA - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь передать сервер клиенту, используя opc ua, он работает нормально, пока я не хочу, чтобы моя программа возвращала значения. Я использую функцию OnNotification:

public void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e)
{
   // Debug.Log("Entre aqui");

    foreach (var value in item.DequeueValues())
    {
       // Debug.Log("Entre aqui otra vez");
        //Console.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, value.SourceTimestamp, value.StatusCode);
        Debug.Log("{0}: {1}, {2}, {3}" + item.DisplayName + value.Value + value.SourceTimestamp + value.StatusCode);
        //rotZ = float.Parse(value.Value.ToString());
        //J1.Rotate(0, 0, rotZ);
    }
}

Здесь я создаю отслеживаемый элемент и добавляю к функции MonitoredItem EventHandler, но я не понимаю, почему событие i.Notification никогда не происходит, поэтому оно никогда не запускает функцию OnNotification. Должен ли я вызвать событие произойти? Что я делаю не так?

        var filter = new EventFilter();


        var triggeringItemId = new MonitoredItem(subscription.DefaultItem)
        {
            NodeClass = NodeClass.Object,
            StartNodeId = ObjectIds.Server,
            AttributeId = Attributes.EventNotifier,
            MonitoringMode = MonitoringMode.Reporting,
            SamplingInterval = -1,
            QueueSize = 100,
            CacheQueueSize = 100,
            Filter = filter 
        };
        // Log("Step 5 - Add a list of items you wish to monitor to the subscription.");
        var list = new List<MonitoredItem> {
            triggeringItemId,
            /*
            monitoredItem,
            monitoredItem2
            */
        };

        list.ForEach(i => i.Notification += OnNotification);

        Debug.Log(list);

        subscription.AddItems(list);

        // Log("Step 6 - Add the subscription to the session.");
        session.AddSubscription(subscription);
        subscription.Create();

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Попробуйте добавить несколько предложений Select в EventFilter. Следующий список соответствует базовому типу события. Типы AlarmCondition предоставляют гораздо больше полей.

var filter = new EventFilter ();

filter.AddSelectClause (ObjectTypes.BaseEventType, Opc.Ua.BrowseNames.EventId); filter.AddSelectClause (ObjectTypes.BaseEventType, Opc.Ua.BrowseNames.EventType); filter.AddSelectClause (ObjectTypes.BaseEventType, Opc.Ua.BrowseNames.SourceNode); filter.AddSelectClause (ObjectTypes.BaseEventType, Opc.Ua.BrowseNames.SourceName); filter.AddSelectClause (ObjectTypes.BaseEventType, Opc.Ua.BrowseNames.Time); filter.AddSelectClause (ObjectTypes.BaseEventType, Opc.Ua.BrowseNames.ReceiveTime); filter.AddSelectClause (ObjectTypes.BaseEventType, Opc.Ua.BrowseNames.LocalTime); filter.AddSelectClause (ObjectTypes.BaseEventType, Opc.Ua.BrowseNames.Message); filter.AddSelectClause (ObjectTypes.BaseEventType, Opc.Ua.BrowseNames.Severity);

0 голосов
/ 04 мая 2018

В этом порядке у меня работает:

session.AddSubscription(subscription);
subscription.Create();

затем я создаю MonitoredItems, а затем добавляю их в подписку и последний пропущенный шаг:

subscription.ApplyChanges();
...