Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: Twincat 3 Ads Notification Handler Event Handler - Ereignisgesteuertes Lesen

  1. #1
    Registriert seit
    29.08.2014
    Beiträge
    20
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Unglücklich


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    in dem InfoSystem von Beckhoff existiert ein Beispiel über das ereignisgesteuerte Lesen von Beckhoff Variablen.
    http://infosys.beckhoff.com/index.ph...3.htm&id=15632

    Quellcode heruntergeladen ausprobiert. Super!! Es läuft.
    Nun habe ich versucht diesen Quellcode auf eine Consolen Application mit C# aufzusetzen.
    Ohne Erfolg Das Programm läuft durch, aber es springt nicht in die Event Methoden.

    Hat jemand damit schon Erfahrungen gesammelt?

    Danke und Grüße
    Neuling2014

    PS: Hier ist der richtige Link
    http://infosys.beckhoff.com/index.ph...3.htm&id=15632
    Falsch kopiert
    Geändert von Neuling2014 (08.09.2014 um 11:04 Uhr)
    Zitieren Zitieren Twincat 3 Ads Notification Handler Event Handler - Ereignisgesteuertes Lesen  

  2. #2
    Registriert seit
    15.08.2011
    Beiträge
    383
    Danke
    2
    Erhielt 73 Danke für 71 Beiträge

    Standard

    Hallo!

    Die Methoden aus der TcAdsDll.dll haben eigentlich nichts mit der Oberfläche bzw. der Umgebung zu tun.
    Ob Konsole oder Windows Form....sollte da keinen Unterschied machen.

  3. #3
    Neuling2014 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.08.2014
    Beiträge
    20
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo mac203,

    das dachte ich auch, aber es muß irgendeinen Unterschied geben.
    Denn das Konsolen Projekt läuft nicht in die Notification Methods rein.
    Hast du eine Idee wieso ?

    Grüße

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

    Hallo,
    sieht dein Script denn genauso aus wie in dem verlinkten Beispiel ?
    Hast du im Form_Load-Script den Eventhandler zugewiesen ?
    Ansonsten poste das doch mal bitte dein Script ...

    Gruß
    Larry

  5. #5
    Neuling2014 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.08.2014
    Beiträge
    20
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Larry,

    das Projekt besteht aktuell nur aus der Program.cs.
    Die wie folgt aussieht:

    Code:
    namespace ConsoleTest
    {
        class Program
        {
    
            private TcAdsClient _tcClient = null;
            private AdsStream _adsStream = null;
            private BinaryReader _binRead = null;
            private int _notificationHandle = 0;
    
    
            static void Main (string[] args)
            {
                Load();
            }
    
           
            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());
            }
    
            //private void _exitButton_Click(object sender, EventArgs e)
            //{
            //    this.Close();
            //}
    
            //private void Close ()
            //{
            //    try
            //    {
                    
            //        if(_notificationHandle != null) _tcClient.DeleteDeviceNotification(_notificationHandle);
            //        _tcClient.Dispose();
            //    }
            //    catch(AdsErrorException ex)
            //    {
            //        MessageBox.Show(ex.Message);
            //    }
            //}
        }
    }

  6. #6
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Du musst dein Programm am laufen halten. Entweder mit einer Schleife (while (!Abbruchbedingung) {}) oder mit einem Console.ReadKey() oder Console.ReadLine() am Ende.
    Obwohl ich mir bei den letzten beiden nicht sicher bin, ob die nicht andere Events blocken während sie auf die Tasten warten. Versuch macht Kluch!

  7. #7
    Neuling2014 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.08.2014
    Beiträge
    20
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hmm, beide Varianten funktionieren nicht while und ReadKey()

    Code:
    namespace TestNotification
    {
        class Program
        {
            static void Main (string[] args)
            {
    
                Twincat test = new Twincat();
                test.Load();
                DateTime now = DateTime.Now;
                DateTime future = now.AddMinutes(1);
    
                while (now < future)
                {
                    now = DateTime.Now;
                }
            }
        }
    
        public class Twincat
        {
            private TcAdsClient _tcClient = null;
            private AdsStream _adsStream = null;
            private BinaryReader _binRead = null;
            private int _notificationHandle = 0;
           
            public 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());
            }
    
            //private void _exitButton_Click(object sender, EventArgs e)
            //{
            //    this.Close();
            //}
    
            //private void Close ()
            //{
            //    try
            //    {
                    
            //        if(_notificationHandle != null) _tcClient.DeleteDeviceNotification(_notificationHandle);
            //        _tcClient.Dispose();
            //    }
            //    catch(AdsErrorException ex)
            //    {
            //        MessageBox.Show(ex.Message);
            //    }
            //}
        }
    }

  8. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

    @MasterOhh:
    Die Form selbst hält schon alles offen. Solange du die nicht schliesst und disposed passiert dem Prozess selbst erstmal nichts.

    @TE:
    In der OnNotification-Methode lasst doch mal das IF weg und führe den Code darin absolut aus - eventuell auch mal einen Breakpoint setzen um zu sehen ob die Methode aufgerufen wird und von wem (Sender).
    Also etwa so :
    Code:
          void OnAdsNotification(object sender, AdsNotificationEventArgs e)
            {
                    AdsState plcState = (AdsState)_binRead.ReadInt16(); /* state was written to the stream */
                    Console.WriteLine(plcState.ToString());
               }
    Gruß
    Larry

  9. #9
    Neuling2014 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    29.08.2014
    Beiträge
    20
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Larry,

    habe auch schon einen Breakpoint gesetzt, aber das Consolen Programm springt überhaupt nicht in die Methode ...

  10. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Für mich ist das hier auch ein wenig Rätselraten.
    Was ist mir dem hier :
    Code:
                   _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);
    In dem Beispiel wird dort der Datentyp übergeben und bei dir NULL - hast du das mal versucht ?

Ähnliche Themen

  1. ADS Notification C# und EventHandler delegate
    Von Lexang im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 13.03.2014, 19:28
  2. Antworten: 6
    Letzter Beitrag: 06.01.2013, 14:49
  3. VB.Net Beckhoff ADS Notification Bool & Int
    Von L.T. im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 26.04.2010, 19:54
  4. Antworten: 8
    Letzter Beitrag: 25.08.2008, 11:34

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •