Twincat 3 Ads Notification Handler Event Handler - Ereignisgesteuertes Lesen

Zuviel Werbung?
-> Hier kostenlos registrieren
Die TwincatADS Implementierung möchte ich in einem Project Class Library einbauen.
In der weder Consolenausgaben noch UI Elemente enthalten ist. Daher ist die Frage, wie man aus diesem Project Notifications abfangen kann von der Beckhoff....
 
Naja ... so richtig viel schlauer bin ich nun immer noch nicht.
In der Bibliothek selber kannst du es gar nicht anwenden (siehe Beitrag #14). Allerdings wird doch deine Bibliothek letztendlich wieder von einer Applikation benutzt - und damit hast du doch dann wieder deine Anbindung. Oder habe ich da jetzt etwas komplett falsch verstanden ?

Wie auch immer ... gib doch bitte mal ein konkretes Beispiel, was sich in der Lib befinden soll und wofür das wo eingesetzt werden soll ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, die Twincat ADS Implementierung muß in einer eigenen Library Project drin sein, weil dort alle Gerätetreiber implementiert werden.
So aktuell die Architektur.
Die Gerätetreiber haben auch eigene Unit Tests, die ebenfalls ohne UI getestet werden. (Daher die Frage, wie kann man das ohne UI testen.)

Die UI an sich entwickelt jemand anders, d.h. sie steht mir nicht zur Verfügung und daher kann und darf ich keine Element von der UI verwenden.
Die Implementierung von der Twincat ADS muß in sich abgeschlossen sein.

Ist das so verständlich?

Code:
public class Notification
    {

        private TcAdsClient _tcClient = null;
        private AdsStream _adsStream = null;
        private BinaryReader _binRead = null;
        private int _notificationHandle = 0;

        public Notification()
        {
            System.Threading.Tasks.Task task = System.Threading.Tasks.Task.Factory.StartNew(() => Load());
            task.Start();
        }

        private void Load()
        {
            try
            {
                _tcClient = new TcAdsClient();

                /* connect the client to the local PLC */
                _tcClient.Connect(851);

                _adsStream = new AdsStream(2);                /* stream storing the ADS state of the PLC */
                _binRead = new BinaryReader(_adsStream);    /* reader to read the state data */

                /* register callback to react on state changes of the local AMS router */
                _tcClient.AmsRouterNotification +=
                                        new AmsRouterNotificationEventHandler(AmsRouterNotificationCallback);


                _notificationHandle = _tcClient.AddDeviceNotification(
                                            (int)AdsReservedIndexGroups.DeviceData,    /* index group of the device state*/
                                            (int)AdsReservedIndexOffsets.DeviceDataAdsState, /*index offsset of the device state */
                                            _adsStream,    /* stream to store the state */
                                            AdsTransMode.OnChange,    /* transfer mode: transmit ste on change */
                                            0,    /* transmit changes immediately */
                                            0,
                                            null);

                /* register callback to react on state changes of the local PLC */
                _tcClient.AdsNotification += new AdsNotificationEventHandler(OnAdsNotification);
            }
            catch (AdsErrorException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        /* callback function called on state changes of the PLC */
        void OnAdsNotification(object sender, AdsNotificationEventArgs e)
        {
            if (e.NotificationHandle == _notificationHandle)
            {
                AdsState plcState = (AdsState)_binRead.ReadInt16(); /* state was written to the stream */
                Console.WriteLine(plcState.ToString());
            }
        }

        /* callback function called on state changes of the local AMS router */
        void AmsRouterNotificationCallback(object sender, AmsRouterNotificationEventArgs e)
        {
            Console.WriteLine(e.State.ToString());
        }
 
Ich würde mir ein Develop-Projekt erstellen, dass die DLL einbindet und sie so verwendet, wie sie der andere verwendet (oder wie du erwartest, dass er sie verwendet).
Sonst kannst du m.E. auch keinen Unit-Test machen ...
 
Doch doch ... meine Implementierung wird in einem großen Projekt eingebunden. Wobei die Twincat ADS Implementierung nur ein kleiner Teil des ganzen ist.
Dieser Teil kann aufgerufen und verwendet werden. Aber die Implementierung muß in sich abgeschlossen sein, d.h. incl. Notification Benachrichtigung.
D.h. nur innerhalb dieser Twincat-Klasse muß es möglich sein, den Status der Beckhoff abzufragen und falls Fehler auftreten, muß ich diese Weitergeben.
Es soll nichts von UI direkt aufgerufen werden. Dieser Programmcode läuft im Hintergrund. Unsichtbar für den Benutzer.
 
Das muss doch auch gar nicht.
Deine eigenen Events stehen natürlich ggf. auch nach Aussen zur Verfügung - aber deine Anbindungen bleiben doch in deiner Klasse und deine Eventhandler doch auch.
In dem Moment, wo du es instanzierst (also irgendwo in der Applikation verwendest) und initialisierst (und das könntest du auch noch an den Konstruktor packen), fängt es sofort an zu leben - solange die Applikation responsiv ist (also nicht durch irgendwelche Funktionen geblockt wird).
 
Zurück
Oben