Ereignisgesteuertes Lesen TwinCAT3 .NET C#

SiMa

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

in meiner C# Anwendung registriere ich mir über den TcAdsClient die AdsNotifications für mein Event.

Code:
this.tcClient.AdsNotification += (s, e) =>            
              {
                  this.OnAdsNotification(s, e);
                   
               };

Und über eine Hilfsfunktion registriere ich mir die Variablen für welche ich eine Notification erhalten möchte.
Code:
public void ActivateNotifications(string name, ushort iD)
      {
         try
         {            
            int varHandle = this.tcClient.AddDeviceNotification(
            name,
            this.deviceNotificationStream,
            AdsTransMode.OnChange,
            100,
            0,
            null);           
         }
         catch (AdsException ex)
         {
            PlcFaultDto plcException = new PlcFaultDto()
            {
               ErrorMessage = ex.Message,
               Description = "AdsException raised at PlcService.ActivateNotifications()"
            };
            this.RaiseException(plcException, nameof(this.ActivateNotifications));
         }
      }

Solange ich für 1-2 Variablen die Notification hinzufüge, läuft das auch alles ganz gut. Sobald das allerdings mehr werden, wird das Event
1. für die registrierten Notifications mehrmals gerufen oO
2. wenn ich in der SPS eine Variable ändere wird das Event für alle Variablen aktiviert und dann auch wieder mehrmals für alle...

Hat jemand eine Idee woran das liegen könnte?

Danke!
 
So, wie ich dich verstehe, willst du einen Eventhandler für alle SPS-Variablen machen ? Wenn ja, dann wäre das doch sowieso nicht sinnvoll, weil du am Ende doch auch nur das zugehörige Control refreshen möchtest ...
Welchen Typs sind deine Variablen ? Bei Wert-Variablen kann/wird es ggf. sowieso so sein, dass die ständig ihren Wert ändern und somit auch ständig Events auslösen.

Ich würde es so machen, dass du deine auf der Seite (Form ?) benötigten Variablen zyklisch (z.B. jede Sekunde) abfragst und mit ihrem Vorgängerwert vergleichst. Hat der sich geändert dann kannst du ggf. ein Event auslösen. Noch besser allerdings wäre es, wenn du den Vorgang an das Control, das die Variable anzeigen soll, koppelst und du somit alles Notwendige an Ort und Stelle beläßt und den Rest deiner Form damit gar nicht erst belastest. Damit brauchst du dann zwar spezielle Controls, hast aber auf der Form übersichtlicheren Code ... und ... funktioniert es im Control einmal funktioniert es immer ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja teils, teils...
Ich registriere immer nur die Variablen die ich in dieser einen View anzeigen möchte. Wenn ich die Ansicht dann wechsle lösche ich die nicht benötigten Notifications dann wieder.
Weiterhin muss der Bediener dann möglicherweise auf Zustandsänderungen von bestimmten Werten reagieren und ein Pollen auf Variablen ist nicht wirklich zeitgemäß und könnte zu verschiedensten Problemen führen (bsp. wird die Task welche die Variablen pollt nicht immer genau zu der Zeit ausgeführt wann sie soll, da eine höher priorisierte Task gerade läuft usw.)
 
... und ein Pollen auf Variablen ist nicht wirklich zeitgemäß und könnte zu verschiedensten Problemen führen (bsp. wird die Task welche die Variablen pollt nicht immer genau zu der Zeit ausgeführt wann sie soll, da eine höher priorisierte Task gerade läuft usw.)

Das mit dem "nicht zeitgemäß" mußt du mir näher erklären ...
Deine Notification werden auch nicht anders erzeugt, als von mir gerade beschrieben ... mit dem Unterschied, dass du darauf keinen Einfluß hast.
Vielleicht solltest du dich generell mal mit dem Erzeugen von Ereignissen unter .Net beschäftigen ... 8)

Was deine Tasks angeht so sei dir gesagt, dass Windows nach wie vor KEIN echtzeit-Betriebssystem ist. Auf Millisekunden genau wirst du es also nie bekommen.
Naja ... und wenn du von Benutzer reagieren schreibst : Benutzer reagieren üblicherweise eher im Sekundentakt oder größer ...

Wenn du die Aktualsierung deiner Controls sich selbst überläßt (oder von mir aus einem Item-Server, den du dir auch erst erstellen müßtest) dann wären auch immer nur die Controls in der Abfrage-Schleife, die auf der gerade aktiven Form sind ...

Gruß
Larry
 
Achja ... Nachsatz :
Die Notifications im Beispiel oben sind wahrscheinlich nicht richtig kalibriert (ich habe die genaue Syntax der Methode gerade nicht parat) und die kommen übrigens auch nicht "just in Time" ...
 
Zurück
Oben