ADS-Kommunikation herstellen

In diesem Kapitel wird gezeigt, wie Sie einen CX7080 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:

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.
ADS-Kommunikation herstellen 1:
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.
ADS-Kommunikation herstellen 2:
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.
ADS-Kommunikation herstellen 3:
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 Baustein ADSWRITE 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 Ausgang BUSY des Bausteins auf FALSE geschaltet wird und erst danach den nächsten ADS-Baustein verwenden. Um den Zugriff zeitlich zu optimieren, können Sie auch einen ADSREADWRITE Baustein verwenden, der die Daten liest und gleichzeitig schreibt.