# ADS Kommunikation



## mailmir (15 August 2017)

Hoi,

unter TwinCat 2 gab es eine (inoffizielle) Lib für die ADS-Querkommunikation, die AdsComLib.lib Diese gibt es nun auch offiziell für TwinCat 3, aber unter einem anderen Namen. Kann mir da jemand weiterhelfen, wie ich diese finde?!?

DANKE


----------



## mailmir (17 August 2017)

Hoi,

ich bin selber erfolgreich in meiner Suche gewesen. Für alle die es interessiert, 

Die ADS-Blöcke sind in der TC2_DataExchange und heißen FB_ReadAdsSymByName  und FB_WriteAdsSymByName.
Die Handhabung ist echt easy. Diese beiden FB vereibfachen die Kommunikation zwischen SPS'en per ADS enorm.

Gruß Norbert


----------



## AntonEmil (23 Mai 2018)

Moin,

mein erster Beitrag hier, freut mich euch kennen zu lernen.

ich versuche im Moment von einer SPS auf einem CX Daten in einer anderen SPS auf einem anderen CX zu lesen oder auch zu schreiben. Im Prinzip ist mir dabei der Code auf der SPS völlig egal, ich will nur die Daten an den Terminals oder aber deren zugehörigen Variablen abgreifen.
Leider komme ich mit dem FB_ReadAdsSymByName nicht die abgefragten Daten sondern nur gelegentlich den Fehlercode 11004 (WSANO_DATA:

The requested name is valid and was found in the database, but it does not have the correct associated data being resolved for.
heraus.
Kann mir da wer helfen?
Noch vorweg, ich bin leider (noch) nicht so der Profi und eigentlich überwiegend Maschinenbauer aber will mich gerne weiterentwickeln, sollte mein Code nicht so elegant sein liegt das hoffentlich daran ;-)
Liebe Grüße
AntonEmil


```
fbReadAdsSymByName    : FB_ReadAdsSymByName;
bRead                                       : BOOL := TRUE;
nDestAddr                                 : DWORD;
timer1                                       : TON;
timer2                                       : TON;
NetId                                        : T_AmsNetId := '5.42.154.66.1.1'
```




```
timer1(PT := T#1000MS);               // die Timer dienen mehr der Übersichtlichkeit im Ablauf und sorgen lediglich in der CASE Anweisung dafür, dass die Variablen zyklisch eingelesen werden
timer2(PT := T#1000MS);
fbReadAdsSymByName(bRead := bRead, sNetID := GVL.NetId, sVarName := 'GVL.EL1008.Ch1', nDestAddr := ADR(nDestAddr), nLen := SIZEOF(nDestAddr), eComMode := eAdsComModeFastCom);


CASE i OF
    1:     bRead := TRUE;
        timer2.IN := FALSE;
        i := 10;
    2:     bRead := FALSE;
        timer1.IN := FALSE;
        i := 11;
    10:     timer1 (IN := TRUE);
            IF timer1.Q = TRUE THEN
                i := 2;
            END_IF
        
    11:        timer2 (IN := TRUE);
            IF timer2.Q = TRUE THEN
                i := 1;
            END_IF
END_CASE
```


----------



## AntonEmil (23 Mai 2018)

Also ich habe mein Problem selber finden können, er lag nicht im Code, sondern im Netzwerk, ich hatte eine die Verbindung zwischen den beiden falsch gesteckt, mich aber korrekt mit ihnen verbunden.
Dadurch konnte ich zwar mit den CPUs kommunizieren und alles sah prima aus, dass die beiden untereinander das aber nicht konnten, sah ich von außen nur am Error.
Nun stehe ich schon vor meinem nächsten Problem, damit melde ich mich vielleicht später nochmal, ich mach mich erstmal schlau.

Liebe Grüße

AntonEmil


----------



## mailmir (23 Mai 2018)

Hoi AntonEmil,

vielleicht hilft dir das. Ich kommuniziere hier über 2 Strukturen.
Beide SPS müssen natürlich eine Route zueinander haben.




Gruss Norbert


----------



## AntonEmil (24 Mai 2018)

Moin Norbert,

den Funktionsblock habe ich nun zum kaufen bekommen, vielen Dank für deine Hilfe.

Nun bin ich leider jedoch damit nicht an meinem Ziel angekommen, ich versuche hier nun mal mein Ziel zu beschreiben.

Ich würde gerne auf die Terminals an einer CPU zugreifen, ohne vorher zu wissen, was genau angeschlossen ist, nur mit dem Wissen, welche klemmen dort sein könnten.
Dazu würde ich zunächst gerne mit den IO Funktionen https://infosys.beckhoff.com/index....tml/tcplc_overview.htm&id=2486096567174153639 nachsehen, was angeschlossen ist und dann bspw. mit den FB_ADSREAD und FB_ADSWRITE an den Kanälen Werte lesen und schreiben, ohne dabei auf die SPS selbst zuzugreifen.
Mein Problem dabei ist nun, dass ich nicht weiß, welche Adressierung ich wählen muss, um direkt auf die Klemme zuzugreifen.
Einerseits sehe ich eine andere AMSNetId für die I/O Unit, welche mit .2.1 endet anstatt mit .1.1 wie die SPS und weiterhin bin ich mir auch mit dem Port unschlüssig und habe viele verschiedene Möglichkeiten zur Auswahl, von denen bisher keiner funktionierte.

Da gibt es den 851, für das Prozessabbild der ersten SPS, der funktioniert um die Variablen auszulesen aber das ist ja nicht mein Ziel.
Als nächstes der Port 11, welcher in der I/O Sektion bei allen Kanälen aller Terminals unter ADS Info eingetragen ist.
Dann gibt es noch den Port 1000 und folgende, von denen jedes Terminal einen eigenen besitzt, welcher im laufenden Betrieb unter der AdsADDR gelistet ist und im Format 192.168.19.1.2.1:1000 zu finden ist.
Weiterhin finde ich unter dem Reiter SYSTEM -> Real-Time den I/O Idle Task, welcher den Port 340 besitzt.

Vielleicht habe ich auch bereits weitere Ports ausprobiert, welche mir inzwischen schon nicht mehr einfallen, nur den Richtigen habe ich leider noch nicht finden können.
Als ErrorCode bekam ich stets TargetPortNotFound oder UnknownAmsCommand.
Dies kann natürlich auch noch daran liegen, dass ich meine Index Group und Index Offset falsch gewählt habe, dort habe ich einerseits die Werte der einzelnen Kanäle aus der I/O Sektion unter ADS Info versucht, wo auch der Port 11 angegeben ist und gerade versuche ich mir mit folgender Tabelle weiter zu helfen: https://infosys.beckhoff.com/englis...c/html/tcadsdeviceplc_indexadsservice.htm&id=

So das war nun erstmal eine Menge Text von mir, ich hoffe ich konnte mein Problem verständlich beschreiben, mir ist es auf jeden Fall ein wenig bewusster geworden was ich hier tue 

Ich bin dankbar über jegliche Hilfe,

liebe Grüße

AntonEmil


----------



## Guga (24 Mai 2018)

Möglich ist es das zu realisieren was du willst - allerdings mit Aufwand.

Frage bzw Unterstellung vorab: Du redest von EtherCAT-Klemmen?

Wenn ja: du kannst auf dem EtherCAT-Master, auf dem Knoten Image das ADS-Interface incl Symbole einschalten. Der Port ist eigentlich immer fix (0x6D04 für das erste Image..)
Die AMS-NetID des Masters ist aber projektabhängig...
Wenn es viele Daten sind dann gibt es auch mehr Images und das Spiel wiederholt sich.

Es ist jetzt per ADS möglich (nicht über die Bausteine oben) die Symbole auszulesen (Letztendlich das was z.B. in einem Scope bzw. TC3 - Measurement Projekt der Targetbrowser auch macht.) um dann in einem zweiten Schritt die Werte zu lesen/schreiben...
Das Ganze ist aber nicht einfach da es nicht mit einem einzelnen Befehl getan ist sondern eine Sequenz beinhaltet... (Kommando 0xF00C....).

 Alternativ kannst du natürlich auch den über CoE den Master direkt abfragen was für Klemmen konfiguriert sind bzw. was für Namen da sind (aber auch hier brauchst du dann den aktiven ADS-Server auf dem Master). Die Beschreibung  zur Abfrage der CoE-Daten im Master findest du hier "https://infosys.beckhoff.de/content/1031/tcsystemmanager/reference/ethercat/html/ethercat_ads.htm?id=3164976953497645142".

Guga


----------



## AntonEmil (29 Mai 2018)

So guten Morgen, zurück zum Thema.

Also erstmal richtig vermutet, ich verwende EtherCAT Klemmen, damit hast du mir da ein paar interessante Stichworte gegeben, mit denen ich nun erstmal mein Glück versuchen will.

Dass es nicht einfach wird, habe ich mir zum Glück bereits vor einiger Zeit abgeschminkt aber ich denke wenn ich hier vielleicht noch ein zwei Fragen stelle wurschtel ich mich da schon durch 

Vielen Dank und liebe Grüße

Anton Emil


----------

