# Offenes ADS Protokoll



## s.murauer (15 September 2011)

Hallo,

ich bin auf der Suche nach einer offenen ADS Protokoll - Implementation, wo ich mir diverse Kommandos zu sehen erhoffe.

Konkret möchte ich eigentlich wissen, wie der Befehl lautet eine Ads Route in die Routingtabelle einer SPS aufzunehmen.

Beispiel: TwinCat System Manager -> Add Route -> Ok -> Schickt Befehl zu der Steuerung, dass diese den RoutingEintrag bei der eigenen Tabelle einträgt.

Genau das will ich nachbauen: Ich schicke (vereinfacht gesagt) mithilfe eines C#-Programmes einen (Ads-)Befehl mit den Daten der Route zur Steuerung und diese trägt dann die Route ein.

Irgendwelche Ideen?


----------



## mac203 (15 September 2011)

Hallo,

am besten, Du nutzt den Ads Monitor, um zu schauen, was genau passiert, wenn Du eine Route hinzufügst etc.

Hier der Link zum Download.
Es handelt sich hierbei allerdings um ein Unsupportet Utility!

Gruß,
Mac203


----------



## s.murauer (15 September 2011)

Ganz gute Programme, nur kann ich leider beim AdsViewer nur bereits bestehende Routes überwachen :icon_sad:


----------



## witkatz (15 September 2011)

In der TcUtilities.lib gibt es Bausteine FB_AddRouteEntry und FB_RemoveRouteEntry. Die Library ist zur Zeit nicht geschützt, sie lässt sich mit TwinCAT öffnen. Du kannst in der Implementierung der Bausteine nachschauen, wie die Zugriffe auszusehen haben und versuchen das in C# nachzuprogrammieren.

Gruß,
witkatz


----------



## mac203 (15 September 2011)

Das funktioniert alles mit dem TwinCAT Ams Logger
Der TwinCAT Ams ADS Viewer ist doch nur zum Anzeigen, einer mit dem Logger aufgezeichneten Datei gedacht.


----------



## s.murauer (15 September 2011)

mac203 schrieb:


> Das funktioniert alles mit dem TwinCAT Ams Logger
> Der TwinCAT Ams ADS Viewer ist doch nur zum Anzeigen, einer mit dem Logger aufgezeichneten Datei gedacht.



also bei mir produziert der Wireshark-Tracking Files


----------



## mac203 (15 September 2011)

Wieso Wireshark?


----------



## s.murauer (15 September 2011)

hab ich mich auch gefragt, aber wenn ich die logdatei aufmache öffnet sich wireshark und zeigt die Aufzeichnungen. (leider eben nicht "entschlüsselt" wie im "AdsAmsViewer"). 
Zum verrückt werden...


----------



## mac203 (15 September 2011)

Warum startest Du dann nicht einfach den Viewer, verbindest Dich auf Port 1 (AmsRouter), und schaust, was passiert, wenn eine Route hinzugefügt wird?


----------



## witkatz (16 September 2011)

Hallo s.murauer
bevor mein Vorschlag, in die Implementierung der entsprechenden Bausteine hineinzuschauen gänzlich übersehen wird, frage ich lieber noch mal nach. Hast du dir das angeschaut? Da steht im Prinzip alles drin was du brauchst, IndexGroup und IndexOffset der entspr. Dienste sowie die erforderlichen Datenstrukturen. 

Gruß,
witkatz


----------



## mac203 (16 September 2011)

Im Prinzip hast Du Recht, witkatz, es ist geschickt gemacht.....
Es wird auf den Port 10000 (Ring 3) geschrieben.

```
fbAdsWrite(    NETID        := sNetID,
                        PORT        := AMSPORT_R3_SYSSERV,
                        IDXGRP        := SYSTEMSERVICE_ADDREMOTE,
                        IDXOFFS    := 0,
                        LEN        := SIZEOF( dataEntry.head ) + dataEntry.head.cbAddress + dataEntry.head.cbName,
                        SRCADDR    := ADR( dataEntry ),
                        WRITE        := TRUE,
                        TMOUT        := tTimeout );
```
Nur die Gruppe mit 801 wundert mich etwas....

Geschickt wird dann einfach:


```
TYPE ST_AmsRouteEntry :
STRUCT
    sName             : STRING(MAX_ROUTE_NAME_LEN);    (* String containing route name *)
    sNetID             : T_AmsNetId;                            (* TwinCAT network address (ams net id) *)
    sAddress        : STRING(MAX_ROUTE_ADDR_LEN);    (* String containing route network Ipv4 address or host name. *)
    eTransport        : E_RouteTransportType;        (* Route transport type *)
    tTimeout         : TIME;                            (* Route timeout *)
    dwFlags         : DWORD;                        (* Additional flags *)
END_STRUCT
END_TYPE
```
Ich würde sagen, im Prinzip relativ einfach zu Bildern.

@s.murauer
Warum nutzt Du für sowas nicht das Automatio Interface?


----------



## s.murauer (16 September 2011)

hallo nochmal, sry für die verspätete Antwort!

Zum Anfang einmal der Grund für die ganze Aktion:

Ich hab ein C# Programm für mein Win_CE geschrieben, bei welchem ich mit dem TcAdsClient auf eine Steuerung zugreifen will und bestimmte Variablen dabei auslesen möchte.

Das ganze muss dynamisch funktionieren, d.h der kann beliebige Routen über das Programm zu Steuerungen erstellen.

Die Seite am Win_CE hab ich schon (schreibe einfach über das Programm die Registry-Einträge für die Routen zur Steuerung).

Jetzt brauch ich eben noch die Seite der Steuerung, d.h wenn der Benutzer eine Route zu einer Steuerung einträgt, muss ich gleichzeitig einen Befehl zu der Steuerung schicken, dass diese die Route bei sich ebenfalls einträgt (sonst keine Kommunikation).

Im Prinzip hab ich alles fertig, nur fehlt mir die dynamische Routenerstellung auf der Steuerung.

Zu den Lösungsvorschlägen:

Danke erstmal ^^

@Bausteinen:
D. h ich könnte versuchen einen Tcp Socket mit der Ip Adesse der Steuerung und Port 10000 (Ring 3) zu erstellen und zu verbinden.

Vorrausgesetzt das funktioniert muss ich mir noch einen Ams Header basteln und in den Ams Daten Teil dann irgendwie den RouteEntry mitschicken?


----------



## mac203 (16 September 2011)

Hm, ich hätte das jetzt mit einem klassischen WriteAny gemacht und schlicht die IDXGRP, IDXOFFS, Len, VAR(=Struktur) übertragen.
Ich habe allerdings gerade gesehen, dass mit dem Compact Framework unter CE nicht funzt:
http://infosys.beckhoff.com/content/1031/tcsample_net/html/twincat.ads.sample07.htm?id=10810

Alternativ könntest Du einen Stream definieieren und diesen mit dem BinaryWriter verschicken:
http://infosys.beckhoff.com/content/1031/tcsample_net/html/twincat.ads.sample02.htm?id=10805

Wozu das Ads-Protokoll nachbilden, wenn Du doch die TcAdsDll einsetzen kannst?
Meines Erachten nach, eine unnötige Arbeit.

Gruß,
Mac203


----------



## s.murauer (16 September 2011)

Das Problem ist ja das ich diese Funktionen nicht nutzen kann.

Ich will ja die Route eintragen damit ich mir zu der Steuerung verbinden und TcAdsClient verwenden kann.

Weil wenn ich die Route nur auf meinem Win-Ce hab kann ADS keine Verbindung herstellen.


----------



## mac203 (16 September 2011)

Okay, Denkfehler von mir.
Solange du kein Connect hast, geht's ja nicht....

In diesem Fall wiederrum gebe ich Dir Recht: Vermutlich muss Du dann eine Socketverbindung aufmachen und das ADS-Protokoll nachbilden.
Dort würde ich dann ein ADS-Write  als Command-Id reinlegen und abschicken.

Aber mal ganz ehrlich: Steht dieser Aufwand in Relation?


----------



## s.murauer (16 September 2011)

nachdem das die Anforderung ist muss ich es wohl oder übel nachbilden ^^

Wird wieder eine Byte-Gewusle ohne Ende. (S7 Kommunikation auch schon nachgebildet ^^)

Falls doch noch jemand eine Idee hat, oder schon ein Kommando nachgebildet hat, bitte melden ^^

Danke!


----------



## arj3090 (17 September 2011)

Inside this driver is a function named RegisterToRemote

http://sourceforge.net/projects/twincatads/

I think it is what you are looking for.


----------



## s.murauer (19 September 2011)

Thank you very much arj3090!!

Exactly what i am looking for


----------

