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

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

Thema: Eigener AMS/ADS Client

  1. #1
    Registriert seit
    24.04.2008
    Ort
    Lübeck
    Beiträge
    324
    Danke
    8
    Erhielt 64 Danke für 62 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hey Leute, da man beim Verwenden der angeboten ADS Dll's auf den installierten ADS Router angewiesen ist, versuche ich einen eigenen ADS Client zu schreiben. Nach der Beckhoff Doku soll das ja auch funktionieren. Wie in der ADS/AMS-Spezifikation angegeben soll das ganze als TCP-Telegramm versendet werden. Damit soll man z.B. auch unter Linux per ADS kommunizieren können, wo es ja nicht möglich ist den AMS Router zu installieren.

    Nur habe ich das Problem, dass wenn ich mir den AMS Header ansehe, ich eine AMS Net ID und einen AMS Port benötige, die mein PC ja nicht hat, denn es ist ja kein AMS Router installiert.

    Woher kriege ich eine AMSNetID und den AMS Port?
    Zitieren Zitieren Eigener AMS/ADS Client  

  2. #2
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Such mal hier nach meinem Nick und linux. Ich glaube Zotos hat hier mal ein Posting inkl. Linux-Libs veröffentlicht.

  3. #3
    Neals ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.04.2008
    Ort
    Lübeck
    Beiträge
    324
    Danke
    8
    Erhielt 64 Danke für 62 Beiträge

    Frage

    Dank Dr.FunFrock, jedoch war es nicht ganz das was ich gesucht habe.

    Schreibe an einem eigenen AdsClient, der über Sockets und wahlweise TCP/UDP funktioniert. Das ganze unter C# und dem Compact Framework, was ja leicht auch auf das normale Framework umkompiliert werden kann.

    Die Spezifikation die Beckhoff im InfoSys freigegeben hat, habe ich voll implementiert. Um jedoch Handles zu erstellen, an bestimmte Informationen vom Router, den Status des Systems und so zu gelangen, brauch ich mehr Informationen zum Protokoll.

    Habe mir schon den Reflector genommen und den Code von der Beckhoff Dll angesehen, jedoch greift die immer auf Funktionen vom instalieren AdsMessageRouter zu.

    Die normalen Funktionen wie Variablen aus der SPS holen und so funktionieren, VariablenInformationen auslesen und Handles erstellen klappt auch schon. Habe mir mühsam mit Wireshark die ganzen Telegramme auseinandergenommen und versucht nachzuvollziehen. Jedoch bin ich an einem Punk angekommen, an dem ich nicht weiter komme.

    Weiß vlcht jemand ne freie Implementierung die man sich ansehen kann und Informationen zum Protokoll herrausholen kann oder kenn jemand weiter Spezifikationen die ich nutzen könnte?

    Bin für jede Anregung dankbar!

    PS: Der Weg ist das Ziel
    Geändert von Neals (13.10.2008 um 19:55 Uhr)

  4. #4
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Wo hast du denn ein Problem, denn das ADS-Protokoll ist doch dokumentiert? Wo ist die Doku denn lückenhaft? Ansonsten hat Beckhoff auf der Supplement-CD ein Beispiel, wie man an die Symbole herankommt. Dort kann man alle Variablen und die Info per ADS aus dem Server holen.

    Übrigens ein Problem war, dass ich immer hatte und weswegen ich mir eine Bibliothek baute, dass nach einem Verbindungsabbruch, die App neu gestartet werden musste, bzw. die Verbindung neu aufgebaut werden musste. Ich habe das mit einer Klassenbibliothek erledigt, die dafür einen extra Thread hat. Allerdings werden die Variablen gepollt und das geht nicht per Notification. Ein Umbau wurde mir zu heftig, weil ich dann 2 Bibliotheken benötigte. Eine für den einmaligen Zugriff auf eine Variable und die andere für den Zugriff über Notifications. Vielleicht kannste das ja einbauen und auch veröffentlichen?

    Ich kann dir bei Bedarf auch den Code für den Thread zum Verbindungsaufbau schicken, weil der auf ein paar Eigenheiten von Twincat Rücksicht nimmt.

  5. #5
    Neals ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.04.2008
    Ort
    Lübeck
    Beiträge
    324
    Danke
    8
    Erhielt 64 Danke für 62 Beiträge

    Standard

    Das währe nett, wenn du mir den schickst...

    Wegen deinen Verbindungsabbrüchen, du meinst das die TCP Verbindung gekappt wird? Ansonsten ist Ads ja nicht Verbindungsorientiert, sondern eher so wie UDP aufgebaut. Man könnte ja auch einfach einen UDP Socket anlegen.

    Probleme habe ich zum Beispiel beim verwenden der Dienste.
    Ich möchte die Symbol Informationen auslesen. Dazu benutzte ich die IndexGroup SymbolInfoByName = 0xf007 und den ReadWrite Command. Da fängt es schon an, was soll ich versenden innerhalb der AdsDaten? Einfach nur einen String mit dem Namen der Variablen? Wenn ich den Response erhalte, wie sind die Daten darin angeordnet?
    Beispielsweise IndexGroup 4 bytes, IndexOffset 4 bytes, dann Typ 2 byte etc.

  6. #6
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Einen Verbindungsabbruch, kann man bekommen, wenn man ein Update der SPS macht oder einfach das Kabel fehlerhaft ist.

    Hier die Routine:
    Code:
      Private Sub ConnectStateMachine()
            While True
                Select Case Me.ADSConnectState
                    Case ADS2.ADSConnectState.ADSInitialize
                        SendConnectMsg("Initialize " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
                        Me.ADSConnectState = ADS2.ADSConnectState.ADSTryConnectToPLC
                        If Not RunThreads Then
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
                        End If
    
                    Case ADS2.ADSConnectState.ADSTryConnectToPLC
                        SendConnectMsg("Connecting " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
                        Try
                            Connect()
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSWaitOnRun
                        Catch ex As TwinCAT.Ads.AdsException
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSTryConnectToPLC
                        End Try
                        If (Not RunThreads) Then
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
                        End If
    
                    Case ADS2.ADSConnectState.ADSWaitOnRun
                        SendConnectMsg("Check for PLC-state RUN at " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
                        Try
                            If Me.ADSClient.ReadState().AdsState = TwinCAT.Ads.AdsState.Run Then
                                Me.ADSConnectState = ADS2.ADSConnectState.ADSCheckPLCProgram
                            End If
                        Catch ex As TwinCAT.Ads.AdsException
                            Disconnect()
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSTryConnectToPLC
                        End Try
                        If (Not RunThreads) Then
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
                        End If
    
                    Case ADS2.ADSConnectState.ADSCheckPLCProgram
                        SendConnectMsg("Check for PLC-program at " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
                        Try
                            Dim plc_version As New PLCVarString(Me, ".VERSION", 1)
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSConnectFields
                            plc_version.Dispose()
                        Catch ex As TwinCAT.Ads.AdsException
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSCheckPLCProgram
                        End Try
                        If (Not RunThreads) Then
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
                        End If
    
                    Case ADS2.ADSConnectState.ADSConnectFields
                        SendConnectMsg("Connecting PLC vars at " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
                        Try
                            Me.GetPLCVars()
                            Dim plc_version As New PLCVarString(Me, ".VERSION", 50)
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSConnectFields
                            plc_version.Dispose()
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSConnected
    
                        Catch ex As TwinCAT.Ads.AdsException
                            Me.DropPLCVars()
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSCheckPLCProgram
                        End Try
                        If (Not RunThreads) Then
                            Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
                        End If
    
                    Case ADS2.ADSConnectState.ADSConnected
                        SendConnectMsg("Connected at " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
                        SyncLock Me.lock
                            If Me.ADSConnectState = ADS2.ADSConnectState.ADSConnected Then
                                Try
                                    If Me.ADSClient.ReadState().AdsState <> TwinCAT.Ads.AdsState.Run Then
                                        Me.ADSConnectState = ADS2.ADSConnectState.ADSWaitOnRun
                                        Me.DropPLCVars()
                                    End If
                                Catch ex As TwinCAT.Ads.AdsException
                                    Me.ADSConnectState = ADS2.ADSConnectState.ADSCleanUp
                                End Try
                            End If
                            If (Not RunThreads) Then
                                Me.ADSConnectState = ADS2.ADSConnectState.ADSExit
                            End If
                        End SyncLock
    
                    Case ADS2.ADSConnectState.ADSCleanUp
                        SendConnectMsg("Clean up " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
                        Me.ADSCleanUp()
                        Me.ADSConnectState = ADS2.ADSConnectState.ADSTryConnectToPLC
    
                    Case ADS2.ADSConnectState.ADSExit
                        SendConnectMsg("Closed " + Me.ADSAdress.ToString + ":" + Me.ADSPort.ToString)
                        Me.ADSCleanUp()
                        Exit While
                End Select
                Thread.Sleep(timePLC)
            End While
        End Sub
    Wie gesagt, schau einfach mal auf der Supplement-CD nach. Da war ein .Net-Beispiel!

  7. #7
    Neals ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.04.2008
    Ort
    Lübeck
    Beiträge
    324
    Danke
    8
    Erhielt 64 Danke für 62 Beiträge

    Standard

    Danke dir, werde mal die CD durchwühlen, im InfoSystem findet man auch noch interessante Sachen, ADS bietet ja echt viele funktionen. In der Spezifikation sind ja nur die normalen Sachen dokumentiert.

    Für Änderungen der Handles beim Update (Online-Change) habe ich auch ne Lösung gefunden:
    http://infosys.beckhoff.com/index.ph...p_sample12.htm

  8. #8
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Berichte mal, wenn du weitergekommen bist.

  9. #9
    Neals ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    24.04.2008
    Ort
    Lübeck
    Beiträge
    324
    Danke
    8
    Erhielt 64 Danke für 62 Beiträge

    Standard

    Leider die letzten Tage wenig Zeit gehabt um weiter dran zu arbeiten, was mir aber sehr geholfen hat ist die Device-Dokumentation für die SPS.

  10. #10
    Registriert seit
    13.01.2007
    Beiträge
    304
    Danke
    35
    Erhielt 29 Danke für 25 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Neals Beitrag anzeigen
    Ich möchte die Symbol Informationen auslesen. Dazu benutzte ich die IndexGroup SymbolInfoByName = 0xf007 und den ReadWrite Command.
    Erfahrungsgemäß kann dies bei sehr vielen Variablen zum Teil etwas lange dauern. Dafür hast Da aber immer die aktuellen Informationen direkt vom System. Alternativ könntest Du auch das TPY File verwenden, dort steht eigentlich alles drinnen. Allerdings musst Du Dich dann um ev. geänderte Variablen Handles bei Änderungen kümmern. Solange sich zumindest der Variablenname nicht ändert, klappt das. Wir sind gerade daran, einen OPC Server für Beckhoff zu basteln. (ADS)

    Warum willst Du eigentlich auf den installierten ADS Router verzichten? So empfiehlt z.B. Beckhoff TwinCAT CP zu installieren, da dann die beste Funktionalität gewährleistet ist, und Du hast keinen Kopfweh.

    Viel Spaß noch!

Ähnliche Themen

  1. SINUMERIK 840D eigener Text-Editor
    Von bit_schubser im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 21.04.2010, 16:47
  2. WinCC 6.2 Server/Client Bedienung nur Client
    Von Jens Qualmann im Forum HMI
    Antworten: 2
    Letzter Beitrag: 22.08.2008, 19:06
  3. eigener Hilfetext in STEP7 Bibliothek
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 09.05.2007, 12:33
  4. Eigener Bereich Antriebstechnik
    Von Maxl im Forum Stammtisch
    Antworten: 8
    Letzter Beitrag: 17.02.2006, 01:55
  5. Erstellen eigener log. Bausteine
    Von Manticor im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 11.07.2004, 11:09

Lesezeichen

Berechtigungen

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