SPS über ADS verbinden

onikos

Level-1
Beiträge
44
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Wir haben mehrere Beckhoff CX5010 und wollen Werte untereinander mit ADS austauschen.

Kann ich die Variablen einer SPS mit dem Namen ansprechen um diese zu lesen oder zu beschreiben?
Wir nutzen ST und ich finde nur Beispiele mit der genauen Angabe der Adresse.

unter dem link http://infosys.beckhoff.com/index.p...lc/html/TcAdsDevicePlc_IndexProcImage.htm&id=
steht "Hinweis: Vermeiden Sie direkte Adressierung (z.B %MW100) und überlassen dem Kompiler die Speicheradressierung (z.B %M*)."

Wie kann ich das beachten und trotzdem keine Variablennamen nutzen?

Eventuell stehe ich auf dem Schlauch aber ich brauche hier einen Denkanstoß!


Vielen Dank im Voraus!

Niko
 
Muss es denn über ADS sein?
Ihr könnt die Steuerungen auch über Realtime Ethernet miteinander kommunizieren lassen. Dazu müsst ihr dann im Systemmanager die Publisher und Subscriber einrichten....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist interessant. Danke für den Tipp.
Ich werde es mir privat näher anschauen. :)

Leider muss ich für meine Arbeit ADS nutzen.
Deshalb meine Frage zu den Variablen und vermeidung der direkten Adressierung.

Vielen Dank!!

Niko
 
Ich kann kein Beispiel für ST finden.

ADSRDWRT(
NETID:= ,
PORT:= ,
IDXGRP:= ,
IDXOFFS:= ,
WRITELEN:= ,
READLEN:= ,
SRCADDR:= ,
DESTADDR:= ,
WRTRD:= ,
TMOUT:= ,
BUSY=> ,
ERR=> ,
ERRID=> );

Bei SRCADDR wird ein Pointer zum Source Buffer erwartet. Kann dort einfach der Dateiname hin?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
es gibt kein Beispiel in ST für den symbolischen Zugriff per ADS von einer SPS heraus (CX, etc.).

Funktionieren tut das schon - man muß sich das aber etwas zurechtlegen bzw. ausprogrammieren.

Du müßtest dir per ADSRDWRT (ReadWrite) für jedes Symbol ein "Handle" holen --> Indexgruppe 0xF003.
Das "Handle" ist ein UINT32.
Mit einem gültigen "Handle" kannst du dann per ADSREAD, ADSWRITE und Indexgruppe 0xF005 quasi indirekt symbolisch zugreifen.

So ein "Handle" kann aber auch ungültig werden - das muß man dann natürlich auch abfangen, und evtl. ein neues Handle holen.
Jedes "Handle" belegt auf der Partnersteuerung Routerspeicher - evtl. Routerspeicher erhöhen.
Weiterhin sollte man angemeldete Handles bei einem Stop der Steuerung wieder abmelden (Indexgruppe 0xF006) - andernfalls wird der Routerspeicher der Partnerstation mit Handle-Leichen belegt - im schlimmsten Fall schmiert einem dann die Steuerung ab, wenn der Routerspeicher aufgebraucht ist.

Für den einfachen Datenaustausch auf SPS-Ebene zwischen 2 Steuerungen würde ich dir den adressierten Zugriff auf den Merkerbereich per Indexgruppe 0x4020 empfehlen - da kann man nicht viel falsch machen.
Richte dir für den Datenaustausch in der jeweiligen Steuerung globale Variablen ein, die händisch in den Merkerbereich adressiert sind (z.B. TestVariable AT%MW0 : WORD)
Du mußt dann natürlich aufpassen, dass sich diese Adressen nicht überlappen.
 
Hallo zusammen,

Ich bin immer noch heiß darauf, Variablen leicht mit Namen anzusprechen.

Ich habe PLC_ReadSymInfoByName gefunden, womit ich alle nötigen Informationen zusammen hätte.

Mein Problem jetzt ist nur wenn ich folgenden code habe
Code:
PLC_ReadSymInfoByName1(
	NETID:= 192.168.1.100.1.1, 
	PORT:= 851, 
	SYMNAME:= 'gvl.var_read_from', 
	START:= TRUE, 
	TMOUT:= T#5S, 
	BUSY=> , 
	ERR=> , 
	ERRID=> , 
	SYMINFO=>  syminfo);


ADSREAD(
	NETID:= '192.168.1.100.1.1', 
	PORT:= 851, 
	IDXGRP:= 16#4020, 
	IDXOFFS:= SYMINFO.idxOffset, 
	LEN:= sizeof(gvl.Var_read_from), 
	DESTADDR:= ADR(gvl.Var_copy), 
	READ:= TRUE, 
	TMOUT:= T#5S, 
	BUSY=> , 
	ERR=> , 
	ERRID=> );

Wenn ich jetzt anstatt SYMINFO.idxOffset eine 2 eingebe geht es.
Wenn ich es so lasse steht online eine 2 drin, es funktioniert aber trotzdem nicht.

Habe schon in alle möglichen Datantypen konvertiert.

Wenn ich es von einer Struktur kopiere geht es nicht.


Kann mir jemand helfen und sagen was mein Fehler ist? :)


Vielen Dank!!

Niko
 
PLC_ReadSymInfoByName1 benötigt mehrere Zyklen um die Daten zu holen. Du musst also erstmal abwarten bis der
Busy - Ausgang des Bausteins wieder false ist. Erst dann stehen in deiner syminfo Struktur die korrekten Daten drin.

In der Online Ansicht siehst du den Wert, weil der PLC_ReadSymInfoByName1 schon fertig ist wenn du drauf schaust.
Aber beim Aufruf von ADSREAD im selben Zyklus ist er es noch nicht, weswegen du im dann einen falschen Offset übergibtst.
 
Zurück
Oben