Beckhoff ADS-Protokoll

drfunfrock

Level-1
Beiträge
934
Reaktionspunkte
72
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hatte einmal über Probleme mit dem ADS-Protokoll berichtet, nämlich dass in der Soft-SPS TwinCAT Ressourcen nicht wieder freigegeben werden, wenn die Verbindung unerwartet gekappt wird. Mittlerweile glaube ich die Ursache erkannt zu haben. Ich habe auf Variable über den Namen zugegriffen:

- Handle für Verbindung zur SPS holen
- Hole ein Handle für jede Variable über das SPS-Handle und den Namen (String) der Variable.
- Lese Variablen zyklisch

Geht etwas schief muss man zuerst alle Variablen-Handle freigeben und dann die Verbindung, um dann alles neu wieder zu initialisieren.

Ich möchte nun aber alle Variablen per direkter Adressierung erreichen, auch die, die nicht einem IO-Modul zugeordnet sind. Hat jemand eine Idee wie man die Adressen herausbekommt? Die IO-Variablen, die über den Systemmanager importiert werden, deren Adr. kann direkt im Sysmanager nachgelesen werden.

Doc Funfrock
 
Um die Adressen zu wissen, habe ich für Variablen, die ich in der Kommunikation benötige, absolute Adressierung verwendet:
VAR xyz WORD AT %M0020;
VAR feld ARRAY [0..200] of REAL AT %M100;
u.s.w.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zottel schrieb:
Um die Adressen zu wissen, habe ich für Variablen, die ich in der Kommunikation benötige, absolute Adressierung verwendet:
VAR xyz WORD AT %M0020;
VAR feld ARRAY [0..200] of REAL AT %M100;
u.s.w.

Ja ja, ich habe noch viel zu lernen. Es geht so einfach...
Halt doch nicht, ich habe diverse Variablen in verschiedenen Funktionsblöcken (40 Stationen) zu lesen und hier die Adressen zu verteilen ist nicht so einfach, ohne hier das Programm unwartbar zu machen. Na ja, eigentlich ist es wartbar, aber ich hasse solche dafür anzufertigenden Dokus, die dann genau verzeichnet haben, wo welche Variable angelegt wurde.

Doc Funfrock
 
Ich verwende zur Kommunikation auch den Merkerbereich.

Somit auch den einfachen ADS Datenaustausch ohne Variablenname und CallBack...
Die Variablen verwalte ich in einer Excel Liste. Da kann man schön die Definition zusammenbauen und erspart sich das Mitdenken mit den Nummer AT %Mxyz und sehr viel Tiparbeit.
Da die Mxyz Nummer gerechnet wird, lässt sich auch einfach was einschieben oder rauswerfen.

kurt
 
Ich mittlerweile herausgefunden, dass man die Symbole mit allen Infos (Variablenname, Gruppe, Offset) in jedem Fall mit .Net einfach lesen kann. Damit sollte es auch möglich sein, eine Bibliothek unter Linux zu basteln, die zu jeder Variablen ein entsprechendes Symbol sucht und dann die Adresse entnimmt. Das gibt noch ein bischen Arbeit, aber das Problem ist prinzipiell gelöst. Schneller Hack:

Code:
   ' Anmerkung: Me.txt ist eine Listbox
    Me.SymbolInfoColl = Me.SymLoader.GetSymbols(True)

    For Each sym As TcAdsSymbolInfo In Me.SymbolInfoColl
            Me.txt.Items.Add(sym.Name + " " + sym.IndexGroup.ToString+                    " "+sym.IndexOffset.ToString+" "+sym.Datatype.ToString)
        Next
    End Sub

Doc Funfrock
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kurt schrieb:
Ich verwende zur Kommunikation auch den Merkerbereich.

Somit auch den einfachen ADS Datenaustausch ohne Variablenname und CallBack...
Die Variablen verwalte ich in einer Excel Liste. Da kann man schön die Definition zusammenbauen und erspart sich das Mitdenken mit den Nummer AT %Mxyz und sehr viel Tiparbeit.
Da die Mxyz Nummer gerechnet wird, lässt sich auch einfach was einschieben oder rauswerfen.

kurt

All diese Hilfmittel finde ich nicht akzeptabel. Ich bin hier in diesem Punkt etwas sehr eigen. Meinen Kode möchte ich - aus meiner Sicht - so sauber wie möglich halten. denn der umfasst einige tausend Zeilen und ich will keine Abhängigkeiten der Funktionsblöcke untereinander haben. Die Kommunikation über globale Variable soll, so weit wie möglich minimiert werden. Zustände und Nachrichten liegen so weit möglich immer in einem Funktionsblock.

Weiter unten habe ich da evtl eine Lösung des Problems.
 
Zurück
Oben