# Beckhoff: Variablen spiegel



## gloeru (17 August 2011)

Hallo Zusammen

Ich habe wiedermal eine etwas verrückte Idee. Vorneweg: Es geht nur um einen Versuch, bzw eine Demonstration, das wird nie in eine Anlage eingebaut 

Und zwar möchte ich von einer bestehenden CX5010 alle Eingänge über Netzwerk zu einer weiteren CX50x0 weiterkopieren. So dass ich an der zweiten Steuerung die gleichen Infos habe wie auf der ersten.

Ziel soll sein, dass ich mit der 2. Steuerung (die keine Ausgänge bedient) die Software zu erklären und damit "herumzuspielen" - während die erste Steuerung uberüht bleibt und normal läuft.

Ich habe da an Netzwerkvariablen gedacht. Gibt es eine möglichkeit, Strukturen zu verlinken? - denn es sind schon 15 Klemmen...

Gibt es eine Möglichkeit mit ADS, dass ich meine Eingangsstruktur versenden kann?

Ich danke für Antworten und hoffe auf kreative Lösungsansätze!


----------



## Voxe (17 August 2011)

Hallo Gloeru,

nur als Ansatz. Einen PC, zwischen die CX-en zu hängen. Das Eingangsabbild der 1. CX mit einer kleinen Software auf dem PC einzulesen und auf die andere Steuerung zu senden. Wobei, auf der zweiten CX, du diese in Merker oder Variablen schreibst.

Die Umsetzung des kleinen Programmes auf dem PC, stelle ich mir nicht schwer vor. Es wäre allerdings nicht variabel, wenn sich die Menge der IO's verändert. Aber, es könnte ein Ansatz sein.

Gruß, Voxe


----------



## gloeru (17 August 2011)

Danke Voxe, diese Idee hatte ich auch schon, aber ich bin für einen Teil vorerst fündig geworden. Ich lese einfach mit einem ADSREAD den Eingangbereich der Eingänge von System 1 ein und wurste diese auf das Eingangsbild von System 2, läuft prima...

Nun suche ich noch eine Lösung für alle globalen und persistenen Variablen, welche keinen fixen Speicherplatz zugewiesen haben.


----------



## mac203 (18 August 2011)

Hallo zusammen!

ADSREAD/ADSWRITE ist azyklisch. Sollte aber für diese Applikation keine Rolle spielen. Dennoch kann ein Handshake und eine Timingüberprüfung sinnvoll sein.

Einfacher und mit weniger Programmieraufwand realisiert man das, und das ist auch eine alltagstaugliche und probate Methode, mit Netzwerkvariablen, wie Du schon schreibst.
Entweder über die bestehende direkte Verbindung via Realtime Ethernet Netzwerkvariablen oder aber über EtherCAT Netzwerkvariablen.

Gruß,
Mac203


----------



## gloeru (18 August 2011)

Performance spilt wirklich keine Rolle, ist ja nur "Spielerei"...

Kennst du eine Möglichkeit, wie ich etwa 150 Variablen diverser Typen rasch und einfach als Netzwerkvariablen eingeben kann??


----------



## mac203 (18 August 2011)

Nun, das Einfachste ist bei so etwas immer eine Datenaustauschstruktur anzulegen. Ansonsten ist wirklich händische Eingabe gefragt.

Vermutlich handelt es sich um nicht-lockierte Variablen oder?
Es gibt da ne Menge Tricks, mit denen man auch an diese Variablen bzw. Adressen kommt; fraglich nur, ob man es soweit treiben möchte...


----------



## Voxe (18 August 2011)

Hallo gloeru,

das Eingangsabbild der 1. Steuerung einlesen stelle ich mir als machbar vor. Aber sage mal, wie hast du das, auf das Eingangsabbild der 2. Steuerung bekommen.  Dein sogenanntes wursten interessiert mich.

Aber zu deiner Frage mit den unterschiedlichen Typen, nur ein Ansatz. Was hällst du davon, diese unterschiedlichen Typen zusammen zufassen. Quasi in etwas, in das alles passt. Und dieser Typ wird dann versendet und wieder auseinandergenommen. Eigentlich, bestehen alle Daten nur aus Nullen und Einsen. Ja, ich weiss, das bedeutet arbeit.

Gruß, Voxe


----------



## gloeru (18 August 2011)

Was sind Datenaustauschstrukturen? - irgendwie kommt mir das bekannt vor, habe das auch schon mal gesehen... Hättest du mir irgend einen Tipp wie ich anfangen könnte, bzw einen Link ins Infosys.

Jaja das wursteln  - ich schreibe einfach gang am Anfang des SPS-Zyklus (am Anfang des MAIN-Programmes) direkt auf die Adressen der Eingänge. Dies geschieht mit einem Pointer auf die Startadresse:


```
IW50_Einganswort            AT  %IW50:       ARRAY[1..23] OF WORD;
    IW500_Einganswort           AT  %IW500:      ARRAY[1..100] OF BYTE;
```
Wie du siehst bin ich faul geworden und schreibe für die analogen Eingänge 100 Bytes aufsmal  - Du kannsts auch sonst direkt auf adressierten Speicherbereich schreiben, diesen sogar doppelt Adressieren. (z.B: IX10.0, IX10.1 und IB10) 
-> Aber nochmals für alle, das ist nur zum Spielen und nicht für Produktiv-Systeme gedacht!!


----------



## mac203 (19 August 2011)

> irgend einen Tipp wie ich anfangen könnte, bzw einen Link ins Infosys


Das InformationSystem stellt diesbezüglich keine Informationen bereit, da es sich ja schon eher um Applikationsleistung handelt.

Wenn das Deine beiden "Datenaustauschstrukturen" sind

```
IW50_Einganswort            AT  %IW50:       ARRAY[1..23] OF WORD;     
IW500_Einganswort           AT  %IW500:      ARRAY[1..100] OF BYTE;
```
dann hast Du doch alles was Du brauchst!

Nach Einfügend des SPS Programms in die SPS Konfiguration stehen Dir genaus diese Variablen auch zum Anlegen im Bereich der Netzwerkvaraiblen zur Verfügung.


----------



## cas (19 August 2011)

Hallo,
ich misch mich mal mit ein, ist vieleicht für andere auch interessant.

Wie bekomme ich per ADS die Struktur aus der Variablen herraus gelesen 

und

Kann man irgend wie erkennen, ob die Variable Preristent usw ist ?

MfG CAS


----------



## mac203 (19 August 2011)

Hallo CAS,

was meinst Du mit


> Wie bekomme ich per ADS die Struktur aus der Variablen herraus gelesen


 ???

Bei einem Zugriff per ADS gebe ich ja u.a. die Zieladresse (AmsNetId), den Port (AmsPort) und die Menge an Daten und das Ziel in das die gelesenen Daten geschrieben werden sollen an.
Folgendes Codebeispiel liest an der Adrese "NETID" auf einem enfernten System vom ersten Laufzeitsystem "PORT" Daten einer MB-Adressierten Variable der Adresee 100 (Variable AT%MB100: MyDataStructure) aus und schreibt diese in die lokale Variable myData:


```
PROGRAM MAIN
VAR
    Read1: ADSREAD;
    myData: MyDataStructure;
    bRead: BOOL;
END_VAR
```


```
Read1(
    NETID:='10.15.13.5.1.1' ,
    PORT:=801 ,
    IDXGRP:=16#4020 ,
    IDXOFFS:=100 ,
    LEN:=SIZEOF(myData) ,
    DESTADDR:=ADR(myData) ,
    READ:=bRead ,
    TMOUT:=DEFAULT_ADS_TIMEOUT ,
    BUSY=> ,
    ERR=> , 
    ERRID=> );
```



> Kann man irgend wie erkennen, ob die Variable Preristent usw ist ?


Du meinst, ob Sie auf der Gegenseite, dem Kommunikationspartner, in einer persistenten Klasse abgelegt sind?
Mh, müsste ich mal schauen....

Gruß,
Mac203


----------



## cas (19 August 2011)

dumm gelaufen...

ich meine vom PC her mittels ADSOCX.

Tut mir leid..

MfG CAS


----------



## Voxe (19 August 2011)

Hallo Gloeru,

ich hoffe, ich haue die Begriffe nicht durcheinander. Man kann in TwinCAT eine Datenstruktur anlegen. Da kannste alles mögliche an Variablen reinpacken. Wenn du dies auf die 2. Steuerung bekommst, haste es.

Mit dem Daten-Dingbums kann man Funktionsbausteine füttern, da bin ich mir sicher.  Nur das Übertragen könnte ich nicht. 

Gruß, Voxe


----------



## mac203 (22 August 2011)

Meinst Du das "alte" OCX oder nutzt Du eine neue .NET Sprache?

Es gibt die Möglichkeit per ADS ein sog. SUMUP Kommando auszulösen. Hierbei wird ein ganzer Satz an Variablen gelesen. Vielleicht auch eine Alternative.  Verwendet wird hierbei eine spezielle IDXGRP (0xF080 read /0xF081 write).


----------



## gloeru (22 August 2011)

mac203 schrieb:


> dann hast Du doch alles was Du brauchst!
> 
> Nach Einfügend des SPS Programms in die SPS Konfiguration stehen Dir genaus diese Variablen auch zum Anlegen im Bereich der Netzwerkvaraiblen zur Verfügung.


Genau so ists, ich danke dir vielmals! Ich habe knallhart 600 Byte Daten drangehängt und es läuft einfach, toll 

Jedoch möchte ich auch noch die globalen und persistenten Variablen mitkopieren, welche ich nicht einzeln adressiert habe (und auch nicht möchte ) - Kennt Ihr da noch ein Trick, ohne alles zu adressieren...


----------

