ADS - Kommunikation zwischen Beckhoff und IPC

Leto

Level-1
Beiträge
53
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
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ß
 
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



 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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




 
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.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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 ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

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

ADS Com.JPG

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:

Code:
#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ß
 
Zurück
Oben