# AGLink -> S7 1500 Zugriff auf Variablen



## Jochen Kühner (4 April 2017)

Hallo,
hat den jemand schon mal versucht mit AGLink auf eine 1500er SPS zuzugreifen, die Texistierenden Tags auszulesen, und dann von ausgewählten Tags werte zu lesen? Ich hab mir gerade das neuste AGLink (5.2) Demo geladen, finde aber in der API Beschreibung nichts passendes. Lt. Deltalogic soll das aber funktionieren.


----------



## LowLevelMahn (5 April 2017)

nach dem Konnekt mit S7 TCP/IP TIA kannst du mit den Funktionen dein Tag lesen

AGL_Symbolic_LoadAGLinkSymbolsFromPLC
AGL_Symbolic_FreeHandle
AGL_Symbolic_CreateAccessByPath
AGL_Symbolic_ReadMixEx

damit sollte es gehen


----------



## Jochen Kühner (5 April 2017)

Gibts da vlt. iwo ein kurzes Beispiel?


----------



## Jochen Kühner (5 April 2017)

Hätte da noch ein paar weitere Fragen:


Muß man das Tool von AGLink verwenden um die Verbindung zu Konfigurieren, oder kann Ich die Konfig auch komplett per Code übergeben?


----------



## Jochen Kühner (5 April 2017)

Jochen Kühner schrieb:


> Hätte da noch ein paar weitere Fragen:
> 
> 
> Muß man das Tool von AGLink verwenden um die Verbindung zu Konfigurieren, oder kann Ich die Konfig auch komplett per Code übergeben?



Habsgefunden:


```
[COLOR=green][FONT=Consolas]//Optional: if you do not want to use AGLink40_Config.exe to set the connection parameters[/FONT][/COLOR]     [COLOR=green]//you can set the IP Address of the PLC directly in code:[/COLOR]
     [COLOR=green]/*AGL4.S7tcpipTia m_tiaParas = new AGL4.S7tcpipTia();
     AGL4.S7tcpipTia1 connSettingsPlc2 = m_tiaParas.Conn[paras.PlcNr]; //we are using connection for PlcNr 2 (for TCP/IP connection this could be any number between 0..15)
     connSettingsPlc2.Address = "192.168.1.153";
     connSettingsPlc2.ConnTypeEx = AGL4.ConnTypeEx.eCT_HMI;
     connSettingsPlc2.PLCClassEx = AGL4.PLC_ClassEx.ePLCEx_AUTO_TIA; //Autodetect PLC type
     connSettingsPlc2.PlcNr = (ushort)paras.PlcNr; [/COLOR][COLOR=green][FONT=Consolas]     connSettingsPlc2.TimeOut = 30000; //Timeout in milliseconds[/FONT][/COLOR]
```


----------



## LowLevelMahn (5 April 2017)

ich dachte deine Lib kann auch schon TIA laden und mit 1500 kommunizieren oder ist das noch nicht fertig


----------



## Jochen Kühner (5 April 2017)

;-) - die kann TIA laden, aber nur mit Openness. Am direkten File support hab Ich mich probiert, aber hab nicht wirklich Zeit dafür, und das scheint ein größeres unterfangen!

Und 1500er gehen nur mit absoluten Adressen. Und Ich will direkt die Symbole von der PLC lesen. (Wir brauchen das an einer anlagen in den nächsten 2 Monaten)

hab auch mit dem OPCUA Serve rrumprobiert, aber die Performance ist ja wirklich grottig... Hoffe das es mit AGLink besser ist!


----------



## Jochen Kühner (5 April 2017)

Nochmal, gibts ne Beispiel App?


----------



## Rainer Hönle (5 April 2017)

Klar gibt es Beispiele. Wenn DU alles installiert hast, dann einfach über "Start / DELTALOGIC / ACCON-AGLink_V5 / Beispiele" den Ordenr mit den Beispielen öffnen und Deine gewünschte Programmiersprachen auswählen. Wenn Dir noch ein Beispiel fehlt, dann einfach Info an mich.


----------



## Jochen Kühner (5 April 2017)

Es fehlt ein Beispiel für den Symbolischen Zugriff auf die PLC ohne TIA Projekt. d.h. auslesen via AGL_Symbolic_LoadAGLinkSymbolsFromPLC
Ist auch nicht in der API Doku enthalten!


----------



## Jochen Kühner (5 April 2017)

Das Beispiel hab Ich nun gefunden -> Leider stürtzt das bei mir ab, Support anfrage hab ich schon gestellt.... Ich hoffe das ganze geht (wenns funzt), schneller als über den OPC UA


----------



## Rainer Hönle (6 April 2017)

Zwischenstand: Fehler ist gefixt und Jochen ist am testen


----------



## Jochen Kühner (6 April 2017)

Muß man auch mal erwähnen: spitzen support von Deltalogic. Projekt gestern eingeschickt, heute morgen gabs ein Bugfix...


----------



## Joline (6 September 2017)

Hallo,

sorry, dass ich den Thread nochmal ausgrabe, aber das passt thematisch dazu...

Ich versuche ebenfalls mit der AGLink Bibliothek symbolisch auf (Datenbaustein-)Variablen in der SPS zuzugreifen, ohne vorher das TIA-Projekt zu öffnen.

Dazu habe ich mir zunächst das Beispiel "AGL5 TIA CommunicationSample Interface Async C#" hergenommen. Dort wird das TIA-Projekt geöffnet und danach ein Wert aus der SPS ausgelesen. Das funktioniert auch und liefert den aktuellen Wert aus der SPS.

Dann habe ich den Aufruf 

```
AGL4.Symbolic_LoadTIAProjectSymbols(TxtProjectPath.Text, ref m_rootHandle);
```
durch

```
AGL4.Symbolic_LoadAGLinkSymbolsFromPLC(m_aglink.ConnNr, ref m_rootHandle);
```
ersetzt. m_aglink.ConnNr beinhaltet "0". Der Verbindungsaufbau ist auch erfolgreich. 

Später im Code wird

```
AGL4.Symbolic_CreateAccessByPath(m_rootHandle, TxtItem.Text, ref rws[0].AccessHandle, ref error_pos);
```
aufgerufen. TxtItem.Text hat in beiden Fällen den Wert  "PLC_1.Blocks.Clock.time". In der Original-(Offline)-Version ist der Aufruf der Funktion erfolgreich, in der modifizierten (Online-)Version liefert die Funktion den Fehler: "Symbolic_CreateAccessByPath: Pfad enthaelt unbekanntes Feld".

Muss im Falle des direkten Auslesens aus der SPS ein anderer Pfad angegeben werden? Oder wo liegt das Problem?


----------



## Rainer Hönle (6 September 2017)

Wen das Projekt von der SPS geladen wird, dann ist der PLC-Name immer "PLC" (nicht "PLC_1"). Dies einfach ändern, dann sollte es funktionieren.


----------



## Joline (6 September 2017)

Super! Das ging ja schnell. Ja, jetzt funktioniert es. Danke.


----------



## Joline (7 September 2017)

Hallo,

ich noch mal...

Gibt es auch eine Möglichkeit, PLCSim mit AGLink zu benutzen? Wenn ja, wie?
Ich habe es mit einem kleinen Hilfstool, welches eine Net-Schnittstelle zu PLCSim zur Verfügung stellt, versucht. Aber da bekomme ich beim Testen mittels AG-Config "Falscher Lesetyp"...


----------



## Rainer Hönle (7 September 2017)

Nur die PLCSims, die direkt über TCP/IP anzusprechen sind, die vom TIA Portal nicht.


----------



## Joline (13 September 2017)

Hallo,

noch eine kleine Frage. Ich versuche mittels VBA auf Werte aus der SPS zuzugreifen. Die ganze Abfolge von Funktionen begonnen bei AGL_Symbolic_LoadAGLinkSymbolsFromPLC über AGL_Symbolic_ReadMixEx bis hin zur Ermittlung von ValueType und SystemType funktioniert. In der SymbolicRW Struktur steht auch ein AccessHandle drin (sonst würde ja z.B. auch die ValueType Ermittlung nicht funktionieren). Wenn ich aber den Wert selbst auslesen will mit z.B.:

```
AGL_Symbolic_GetAccessBufferUInt16(SymbolicRW.AccessHandle, SymbolicRW.Buffer, SymbolicRW.BufferLen, ElementIndex, valueUINT16)
```
 dann bekomme ich einen Fehler: "Parameterfehler beim Funktionsaufruf". Was könnte falsch sein?

P.S. Inhalt der Werte:

```
SymbolicRW.AccessHandle = 505374960, SymbolicRW.Buffer = 0, SymbolicRW.BufferLen = 2, ElementIndex = 0, valueUINT16 = 0
Returnwert der Funktion = -1048575
```

Vielen Dank.


----------



## Rainer Hönle (13 September 2017)

Wie es aussieht, wurde der Buffer für die Daten nch allokiert und eingetragen.


----------



## Joline (13 September 2017)

In VBA muss man Variablen ja nicht extra allocieren. 
Aber ich habe es jetzt nach einigem Suchen und Probieren gefunden: für AGLink gibt es speziell AGL_malloc. 

Jetzt wird zwar ein Wert gelesen. Es ist aber nicht der, der in der Steuerung steht. Vor allem ist der Wert bei jedem Lesen anders. Grrr.
Beim langsamen Debuggen funktioniert es. Scheint also ein Zeitproblem zu sein. Aber es werden schon alle Funktionen nacheinander aufgerufen und auch erst, nachdem ein "positiver" return-Wert zurückkommt.
 Das Suchen und Probieren geht weiter...



P.S. Die API Referenz ist leider nicht sehr ausführlich. Die beschreibt nur die Definition und nicht die Verwendung. Und auch die interaktive Hilfe ist keine Hilfe, da an vielen Stellen einfach nicht mehr aktuell. Da fehlen Parameter... Auch die mitgelieferten Beispiele haben schon ein paar Jahre auf dem Buckel und taugen nicht wirklich als Referenz, wenn man neue Features wie symbolischen Zugriff nutzen will.  Da ist leider sehr viel Probieren notwendig. Und das kostet viel Zeit... 
Leider trübt diese schwache Dokumentation das sonst wirklich tolle Produkt.


----------



## Rainer Hönle (14 September 2017)

Für VBA gibt es die  ausführlichen TIA Beispiele: "AGL5 TIA Erste Schritte.xlsm" und  "AGL5_TIA_WriteVars.xlsm". Falls es damit nicht klappt, einfach den Code (das Projekt, docm bzw xlsm nur über download da bei uns sonst geblockt) an mich schicken. Wir schauen dann nach, woran es liegen kann.
Im API-Guide gibt es keinen Code für VBA nur für VB.net.
Falls in der Doku etwas fehlt, bitte genaue Info an mich senden, damit wir das korrigieren können.


----------



## Joline (14 September 2017)

Noch eine Frage:

Ich habe jetzt vor dem Aufruf von AGL_Symbolic_GetAccessBufferUInt16 testweise eine Wartezeit von 1 Sek. eingebaut. Damit kann der Wert aus der Steuerung recht zuverlässig gelesen werden. Ohne diese Wartezeit werden immer irgendwelche (falschen) Werte gelesen. Da scheint also irgendwas noch nicht "fertig" zu sein. Alle Aufrufe der vorhergehenden Funktionen passieren sequentiell und erst nach Prüfung der Return-Wertes. 

Wartezeit ist Mist. Deshalb, wie kann man prüfen, ob und wann mit AGL_Symbolic_GetAccessBufferUInt16 Werte gelesen werden können?


----------



## Rainer Hönle (14 September 2017)

Mit welcher Funktion und mit welchen Parametern werden die Daten von der STeuerung gelesen? Bei einem synchronen Lesen kann sofort nach Rückkehr aus der Lesefunktion auf den Puffer zugegriffen werden. Im Falle eines asynchronen Lesens muss das Ende der Lesefunktion abgewartet werden. Bitte mir einfach ein komplettes Codebeispiel schicken, in dem das Problem auftritt.


----------

