CP342-5 DP_SEND und DP_RECV.

Beiträge
8.337
Reaktionspunkte
1.903
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.

Ich musste ein fremder helfen mit seiner S7 program mit CP342-5. Er verstand nicht warum es nicht funzte. Kein Wunder, in seiner programm gab es kein code die den CP342-5 ansprichte. Zum schluss hat es geklappt. Es war das erste mal das ich ein CP342-5 verwenden musste. Es gab 2 sachen wobei ich nicht ganz klar war.

1. Bei DP_SEND und DP_RECV, kann das sein das man immer von byte 0 starten muss ?
Wenn z.b. nur 4 bytes an eine slave verbunden ist, und die adressen sind IB100-IB103, muss man 104 bytes übertragen, nicht nur die 4 relevante bytes.

2. Bei DP_RECV, und obengennanten beispiel mit IB100-IB103, was passiert mist IB0-IB99 ? Werden sie von DP_RECV überschrieben - gelöscht eigentlich ?
Ich habe ein DB als empfangspuffer verwendet, aber ich wundere was wäre passiert wenn ich das prozessimage direckt adressiert habe.

Danke.
 
Hallo!

Du musst ja bei den Datenbereichen einen ANY - Pointer anlegen.
Bei einem ANY Pointer steht ja die Startadresse und die Länge des Datenbereiches drinn.

zb: DB1.DBB100 Byte 10
Mit diesem Pointer sprichst du ab dem Byte 100 im DB1 einen Bereich von 10 Bytes an also von Byte 100 bis 109!

Am einfachsten ist wenn du ein Struct in deinem DB anlegst zb mit dem Namen Eingang dann kannst du Symbolisch adressieren indem du "Dein_DB".Eingang an den FC anschreibst. Bei dieser Variante brauchst du dich um die genaue Adresse nicht mehr kümmern.

godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Bei DP_SEND und DP_RECV, kann das sein das man immer von byte 0 starten muss ?
Wenn z.b. nur 4 bytes an eine slave verbunden ist, und die adressen sind IB100-IB103, muss man 104 bytes übertragen, nicht nur die 4 relevante bytes.
.
Der Empfangspuffer muss immer die höchste projektierte E/A-Adresse eines DP-Slaves + 1 sein. Wenn du also die Eingangsbytes 100-103 auslesen/schreiben willst, dann musst du deinen Empfangs/Sendepuffer immer 104 Bytes lang machen.
Es wird immer der E/A-Adressraum beginnend ab der Adresse 0 plus die angegebene Länge am Pointer aktualisiert.


2. Bei DP_RECV, und obengennanten beispiel mit IB100-IB103, was passiert mist IB0-IB99 ? Werden sie von DP_RECV überschrieben - gelöscht eigentlich ?
Ich habe ein DB als empfangspuffer verwendet, aber ich wundere was wäre passiert wenn ich das prozessimage direckt adressiert habe.
Bei DP-RECV liest du, in deinem Fall, 104 Eingangsbytes beginnend ab Byte 0 ein und überschreibst dann deinen eingestellten Datenbereich (hier ein DB). Man sollte als Empfangsbereich immer einen DB einstellen.
 
Hallo godi.

Ja ich verwende ein ANY pointer und ein "puffer-DB" wie du vorschlägst.
Aber wenn ich nur 4 bytes einlesen mit DP_RECV, denn sind die daten verschoben.
Nur wenn ich ein leeres datenbereich einfügen das die IB0-IB99 entspricht, und damit insgesammt 104 bytes einlesen, denn funzt es.

edit:
Also, wie du schreibst wird das nicht funktionieren. Oder bin ich falsch ?
zb: DB1.DBB100 Byte 10
Mit diesem Pointer sprichst du ab dem Byte 100 im DB1 einen Bereich von 10 Bytes an also von Byte 100 bis 109!
Um IB100-IB109 mit DB_RECV zu lesen, muss es DB1.DBB0 Byte 110 heissen, oder ?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo godi.

Ja ich verwende ein ANY pointer und ein "puffer-DB" wie du vorschlägst.
Aber wenn ich nur 4 bytes einlesen mit DP_RECV, denn sind die daten verschoben.
Nur wenn ich ein leeres datenbereich einfügen das die IB0-IB99 entspricht, und damit insgesammt 104 bytes einlesen, denn funzt es.

edit:
Also, wie du schreibst wird das nicht funktionieren. Oder bin ich falsch ?

Um IB100-IB109 mit DB_RECV zu lesen, muss es DB1.DBB0 Byte 110 heissen, oder ?

Nein!

Wenn du von Byte 100 bis 109 lesen willst dann P#DB1.DBX100.0 BYTE 10

Sorry! Habe gerade gesehen dass ich mich vorher beim Pointer verschrieben habe.

godi
 
Nein!

Wenn du von Byte 100 bis 109 lesen willst dann P#DB1.DBX100.0 BYTE 10

Sorry! Habe gerade gesehen dass ich mich vorher beim Pointer verschrieben habe.

godi
@godi
lese dir mal folgende FAQ von Siemens durch und überdenke dann mal deine Antwort:rolleyes:
Beitrags-Id: 18208090
Vor allem diesen Abschnitt:
5. Datenaustausch zwischen CPU, CP und E/A-Bereich der DP Slaves
da steht unter anderem dies hier
Allgemein gilt:
Die höchste projektierte E/A-Adresse eines DP-Slaves + 1 ergibt die Länge des Datenbereiches, welcher am Parameter "SEND" bzw. "RECV" über den Pointer anzugeben ist.
Und er will ja Eingangsbyte 100 - 109 einlesen und dann muss am Eingang RECV z.B. P#DB1.DBX100.0 BYTE 110 stehen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@godi
lese dir mal folgende FAQ von Siemens durch und überdenke dann mal deine Antwort:rolleyes:
Beitrags-Id: 18208090
Vor allem diesen Abschnitt:
5. Datenaustausch zwischen CPU, CP und E/A-Bereich der DP Slaves
da steht unter anderem dies hier
Und er will ja Eingangsbyte 100 - 109 einlesen und dann muss am Eingang RECV z.B. P#DB1.DBX100.0 BYTE 110 stehen.

OK!

Ich ziehe meine Antworten zurück!

Ich habe bis jetzt nur den CP342-5 als Slave verbaut und da legt man den AnyPointer so an wie ich es geschrieben habe.
Naja gut zu wissen das es beim Masterbetrieb mit I/O's anders ist!

godi
 
Zurück
Oben