ADS-Kommunikation herstellen
In diesem Kapitel wird gezeigt, wie Sie einen CX7293 mit einem anderen CX70x0 oder einer beliebigen TwinCAT-Steuerung verbinden können. Das ADS-Protokoll bietet die einfachste Möglichkeit, zwei TwinCAT-Systeme miteinander zu verbinden. Mit dem ADS-Protokoll können Daten sowohl gelesen als auch geschrieben werden. Für gewöhnlich werden ADS-Bausteine für die Kommunikation verwendet, die in der Tc2_System-Bibiliothek enthalten sind. In dem folgenden Beispiel sollen Daten von einem Speicherbereich gelesen und geschrieben werden.
Um eine ADS-Verbindung einzurichten, wird zunächst eine ADS-Route erstellt. Die Kommunikation erfolgt dann über Ethernet und der Datenaustausch über das TCP/IP-Protokoll. Die ADS-Route ist dann die Schnittstelle zwischen der ADS- und TCP/IP-Verbindung. Durch die ADS-Route ist bekannt, welche AmsNetId welcher TCP/IP-Adresse zugewiesen ist. Dadurch wird in den ADS-Bausteinen nicht mehr die TCP/IP-Adresse, sondern nur noch die AmsNetId verwendet.
Voraussetzungen:
- Zwei CX70x0 Embedded-PCs.
- Beide CX70x0 sind im gleichen Netzwerk und über ADS erreichbar.
Gehen Sie wie folgt vor:
- 1. Starten Sie TwinCAT und verbinden Sie sich mit dem ersten CX70x0 (siehe: Mit CX70x0 verbinden).
- 2. Klicken Sie links in der Strukturansicht auf Routes, wählen Sie die Registerkarte Static Routes und klicken Sie auf die Schaltfläche Add.
- 3. Wählen Sie unter Remote Route die Option Static, damit die ADS-Route im Projekt bestehen bleibt und klicken Sie anschließend auf die Schaltfläche Broadcast Search.
- 4. Wählen Sie den zweiten CX70x0 als Ziel der ADS-Route aus. Die ADS-Route wird bei beiden Embedded-PCs eingetragen. Die AmsNetId des zweiten CX70x0 wird angezeigt und kann im Programm für ADS-Bausteine verwendet werden.
- 5. Verbinden Sie sich jetzt mit dem zweiten CX70x0, welcher als Ziel der ADS-Route festgelegt wurde und schreiben Sie ein kleines Programm. Definieren Sie ein Array und zählen Sie einen Wert des Arrays hoch.
VAR
MarksTest AT %MB0 : ARRAY[0..9] of INT;
END_VAR
Program:
MarksTest[0]:=MarksTest[0]+1;
- 6. Aktivieren Sie die Konfiguration und schalten Sie den CX70x0 in den Run-Modus.
- 7. Schreiben Sie für den ersten CX70x0 ein Programm, welches den hochgezählten Wert des Arrays ausliest.
VAR
ADSREAD : ADSREAD;
NetID : STRING:='5.81.38.23.1.1'; (* AMSNetId of the target*)
Value : INT; (* value of target MarksTest[0]*)
Error : INT;
NoError : INT;
END_VAR
Program:
ADSREAD(
NETID:=NetID ,
PORT:=851 , (* plc port of the target*)
IDXGRP:=16#4020 , (* Marks %MB*)
IDXOFFS:=0 , (* Marks offset in byte*)
LEN:=2 , (* length of data in byte*)
DESTADDR:=ADR(Value) , (* pointer to the data in which the value is to be stored *)
READ:=TRUE ,
TMOUT:= ,
BUSY=> ,
ERR=> ,
ERRID=> );
IF NOT ADSREAD.BUSY THEN
IF NOT ADSREAD.ERR THEN
NoError:=NoError+1;
ELSE
Error:=Error+1;
END_IF
ADSREAD(Read:=FALSE);
END_IF
- 8. Der hochgezählte Wert wird ausgelesen und an den ersten CX70x0 übermittelt.
- Sie sollten beim ersten CX70x0 sehen, wie der Wert der Variable
Value
hochgezählt wird. Analog dazu funktioniert das Schreiben der Daten. Daten können mit dem BausteinADSWRITE
geschrieben werden. Achten Sie darauf, dass Sie in diesem Beispielaufbau den Offset (IDXOFFSET
) auf 10 setzen, damit das Array [4…9] beschrieben wird. Beschränken Sie die Länge auf 10 Byte, da ein Array von 0…9 vom Typ INT angelegt wurde und damit der Speicher %MB0…MB19 (10 * 2 Byte) verwendet (Die Elemente 0...4 zum Lesen und die Elemente 5...9 zum Schreiben des Arrays).
Verwenden Sie einen ADS-Befehl nach dem anderen. Warten Sie, bis der ADS-Dienst fertig ist, also der AusgangBUSY
des Bausteins aufFALSE
geschaltet wird und erst danach den nächsten ADS-Baustein verwenden. Um den Zugriff zeitlich zu optimieren, können Sie auch einenADSREADWRITE
Baustein verwenden, der die Daten liest und gleichzeitig schreibt.