# ADS - Kommunikation zwischen Beckhoff und IPC



## Leto (28 November 2011)

Hallo zusammen,

wir wollen in einem Projekt mittels ADS Daten zwischen der Beckhoff Steuerung (CX5020) und einem IPC austauschen. Dabei gibt es 3 verschiedene Variablentypen die übertragen werden müssen:

1. Read Only
2. Write Only
3. Read and Write

Mir stellt sich jetzt die Frage, ob es da bereits fertige Kommunikations-Bausteine gibt, die man nur einfügen, die NetID etc. anpassen muss und fertig oder ob ich mir da selber etwas programmieren muss.

Schonmal Vielen Dank

Gruß


----------



## uncle_tom (28 November 2011)

Servus,

ich geh´jetzt mal davon aus, dass auf dem IPC ebenfalls Twincat läuft, und du quasi zwischen den beiden Soft-SPS´n Daten über ADS austauschen willst.

Da gibt es z.B. die Funktionen ADSREAD und ADSWRITE in der Bibliothek TcSystem.lib --> Link

Wenn du deine Variablen z.B. in den Merkerbereich adressierst, dann kannst du über die Indexgruppe 0x4020 und den Offset (Merkeradresse) relativ einfach mittels ADS darauf zugreifen.

Infos bzgl. ADS-Kommunikation (Indexgruppen, etc.) findest du hier --> Link


----------



## Leto (30 November 2011)

Moin,

erst mal Danke uncle_tom für die antwort. Die Bausteine ADS-Write und ADS-Read habe ich auch gefunden und die sind auch recht gut beschrieben.

Also zur Zeit ist es nicht geplant TwinCat auf dem IPC zu installieren. Die Visualisierung auf dem IPC ist beispielsweise in "C" programmiert und wir wollen über diese Visu Variablen in der Beckhoff abfragen oder auch abändern. 

Ist dies überhaupt möglich ohne ein TwinCat Programm auf dem IPC?


----------



## uncle_tom (30 November 2011)

> Ist dies überhaupt möglich ohne ein TwinCat Programm auf dem IPC?



Das ist möglich. Das ADS-Protokoll ist kein Geheimniss und vollständig dokumentiert --> Link

Einfacher geht es aber vermutlich, wenn du trotzdem Twincat auf dem IPC installierst, und die Kommunikation mit der Twincat.dll realisierst --> Link


----------



## Leto (30 November 2011)

Bei der möglichkeit ohne Twincat stellt sich mir jetzt jedoch die Frage, wie konfiguriere ich dann die Ams Net ID? Das mache ich ja gewöhnlich über Twincat.

Ok, habe gerade gesehen das diese CP version von TwinCat kostenlos ist. Dann ist es natürlich naheliegend diese auch zu verwenden.


----------



## Leto (30 November 2011)

Wie kann ich rausfinden, in welcher Bibliothek sich ein Baustein befindet? Ich such z.B. den "sizeof" und den "ADR" baustein, hab aber keine Ahnung in welcher Bibliothek diese enthalten sind. Gibt es dafür eine Übersicht oder etwas ähnliches um das rauszufinden?


----------



## Fx64 (30 November 2011)

Sizeof und ADR dürfte immer funktionieren.


----------



## uncle_tom (1 Dezember 2011)

> Bei der möglichkeit ohne Twincat stellt sich mir jetzt jedoch die Frage,  wie konfiguriere ich dann die Ams Net ID? Das mache ich ja gewöhnlich  über Twincat



Du vergibst dir selber eine Net-ID, diese verwendest du dann auch in deinen ADS-Telegrammen. Auf dem CX musst du dann einen Routeneintrag mit deiner Net-ID (IPC) hinterlegen.



> Wie kann ich rausfinden, in welcher Bibliothek sich ein Baustein  befindet? Ich such z.B. den "sizeof" und den "ADR" baustein, hab aber  keine Ahnung in welcher Bibliothek diese enthalten sind. Gibt es dafür  eine Übersicht oder etwas ähnliches um das rauszufinden?



Im Infosystem (oben bereits mehrfach verlinkt) findest du alle Infos.
Das Infosystem hat auch eine Suchfunktion, die darf man auch mal verwenden


----------



## Leto (2 Dezember 2011)

Moin,

also ich habe jetzt folgendes Programm für die PLC geschrieben, womit ich gerne eine Variable "iGeneralState" zu einem IPC schicken würde.




auf dem IPC soll nun ein kleines C Programm laufen, welches die Variable liest. Leider hatte ich bis jetzt keinen erfolg damit die Variable am IPC auszulesen.

Hier mein Quellcode für den IPC:


```
#include <iostream>#include <conio.h>
#include <windows.h>
#include "c:\programme\twincat\ads api\tcadsdll\include\tcadsdef.h"
#include "c:\programme\twincat\ads api\tcadsdll\include\tcadsapi.h"


using namespace std;


void main()
{


  long      nErr, nPort, nTemp;
  AmsAddr   Addr;
  PAmsAddr  pAddr = &Addr;
  WORD		iGeneralState, iSWVersion, iSWRevision, iSWHotfix;
  WORD		iActOpMode, iActImgMode, iSignalHornMode, iSignallingStateYellow;
  




  // Open communication port on the ADS router
  nPort = AdsPortOpen();
  nErr = AdsGetLocalAddress(pAddr);


  // Communication Config für Beckhoff CX-0CF180
  Addr.netId.b[0]=5;
  Addr.netId.b[1]=12;
  Addr.netId.b[2]=241; 
  Addr.netId.b[3]=128;
  Addr.netId.b[4]=1;
  Addr.netId.b[5]=1;


  if (nErr) cerr << "Error: AdsGetLocalAddress: " << nErr << '\n';
  pAddr->port = AMSPORT_R0_PLC_RTS1;


  
  // Read  and diplay values from Beckhoff CX-0CF180


  cout << "Read  and diplay values from Beckhoff CX-0CF180" << '\n';


  do
  {
	
    nErr = AdsSyncReadReq(&Addr, 0x4040, 0x045F, 0x2, &iGeneralState);
    if (nErr) cerr << "Error: AdsSyncReadReq: " << nErr << '\n';


	
	cout << '\n' << "PLC iGeneralState:   " << iGeneralState << '\n' ;
    cout.flush();




  }
  while (getch() == '\r');    // Read next value (Carriage return is delimitter) , stop reading otherwise


// Close the communication port
  nErr = AdsPortClose();
  if (nErr) cerr << "Error: AdsPortClose: " << nErr << '\n';
}
```

Hat jemand einen Verbesserungsvorschlag, damit die Kommunikation funkitoniert?

Gruß


----------



## Fx64 (2 Dezember 2011)

Kommen keine Fehlercodes zurück?


----------



## Leto (2 Dezember 2011)

leider nicht. Bekomm entweder willkürliche Zahlen zurück oder 0.


----------

