# Frage zu CP-342-5 (DP_Send und DP_Receive)



## diabolo150973 (29 Oktober 2008)

Guten Morgen,

ich spiele gerade mit meinem alten CP_342-5 rum und habe mal eine Frage zu den FCs 1 und 2.

Kann mir jemand verraten, was diese Parameter bedeuten und ob man die irgendwie auswerten kann:

Beim FC1 (DP_Send):

Status (da wird ein WORD ausgegeben. Was macht man damit, und wie?)


```
CALL  "DP_SEND"
       CPLADDR:=W#16#100
       SEND   :=P#A 0.0 BYTE 7
       DONE   :=M56.1
       ERROR  :=M56.0
       STATUS :=MW56
      NOP   0
```
Beim FC2 (DP_Receive)

Status (wie beim FC1)
DP_Status (hier ist es ein Byte... weiß ich auch nicht)


```
CALL  "DP_RECV"
       CPLADDR :=W#16#100
       RECV    :=P#E 0.0 BYTE 9
       NDR     :=M56.0
       ERROR   :=M56.0
       STATUS  :=MW56
       DPSTATUS:=MB56
      NOP   0
```
 Ich habe erstmal irgendetwas rangeschrieben, damit er arbeiten kann. 

Kann man aus den Werten ersehen, ob ein Slave ausgefallen ist, und wenn ja, welcher? Oder sind da alle möglichen Fehler-, bzw. Statusmeldungen drin? 
Die Onlinehilfe sagt mir leider gar nichts... und bei Google habe ich bis jetzt auch noch nichts brauchbares gefunden.

Da ich in diesem Bereich (wie in vielen anderen auch) nicht sehr bewandert bin, möchte ich Euch bitten, so zu antworten, dass auch meine Mutter (Finanzbeamte) das verstehen würde...

Vielen Dank im Voraus!!!

Gruß,

dia


----------



## HaDi (29 Oktober 2008)

Wenn du in der Hilfe zum FC1/FC2 bist kannst du ganz oben den Link "siehe auch" anklicken, dann kommst du zu den Erklärungen die du, so wie ich es verstanden habe, suchst.

Grüße von HaDi


----------



## Ralle (29 Oktober 2008)

Geh mal mit dem Cursor auf den Baustein und drücke F1 (in der Library geht das auf jeden Fall). Dann unten bei den links "Anzeigen des Bausteins DP_Send" bzw "Anzeigen des BAusteins DP_RECV", Da stehen die Codes.


----------



## diabolo150973 (29 Oktober 2008)

Vielen Dank, Ihr beiden!!!

Sowas blödes... Vielleicht sollte man sich erstmal mit der Software vertraut machen, bevor man damit arbeitet will!

Wir haben damals in der Schule auch nur mit CPs gearbeitet und dort hat uns das niemand erzählt. Wahrscheinlich wusste unser Lehrer das selber auch nicht. Die Werte, die ich da rangeschrieben habe, sind sogar von fertigen "Schulausdrucken" übernommen. Wenn man dann gefragt hat, was der Quatsch soll alles gleich wieder zu überschreiben, kam als Antwort:

Hier ist das so. Die Werte werdet ihr eh nie brauchen...

Bis dann und DANKE nochmal,

dia


----------



## vtrbender (29 Oktober 2008)

Hi diabolo,

ausführlich Informationen zur Kommunikation per CP gibt es auch im entsprechenden Programmierhandbuch: C79000-G8900-C229-01
Gibt es als PDF auf der Siemens-Seite (http://support.automation.siemens.com und Suche benutzen). Ab Kapitel 4.2 findest du alles zu DP_SEND und DP_RECV (inkl. Condition Codes).

Viele Grüße,
Manuel


----------



## Dumbledore (29 Oktober 2008)

vtrbender schrieb:


> C79000-G8900-C229-01 Gibt es als PDF auf der Siemens-Seite (http://support.automation.siemens.com und Suche benutzen). Ab Kapitel 4.2 findest du alles zu DP_SEND und DP_RECV (inkl. Condition Codes).


ich hänge mich an die Originalfrage mal dran, ich habe vielleicht auch ein Verständnisproblem.

Die Parameter von FC1 und FC2 haben als Adresse nur die Baugruppenadresse (Parameter CPLADDR). Ich kann bei FC1 und FC2 also keinen einzelnen Slave adressieren. Wie geht das nun vor sich, wenn ich mehrere Slaves an meinem CP342-5-Master angeschlossen habe? Rufe ich FC1 und FC2 pro Master nur einmal im Zyklus auf und gebe als Datenbereich (Any-Pointer) den gesamten Eingangs- bzw- Ausgangs-Bereich aller Slaves an? Was geschieht mit evtl. Adresslücken zwischen den Slaves?

Ich hoffe, ich habe mich verständlich ausgedrückt. Das genannte Handbuch geht auf diese Situation nicht ein - oder ich habe es nicht gefunden / verstanden  ... 

Gruss Michael aka Dumbledore


----------



## MSB (29 Oktober 2008)

@Dumbledore


> Wie geht das nun vor sich, wenn ich mehrere Slaves an meinem CP342-5-Master angeschlossen habe?


Du liest den Adressbereich aus, auf welche und wie viele Slaves dieser sich verteilt ist egal.



> Rufe ich FC1 und FC2 pro Master nur einmal im Zyklus auf und gebe als Datenbereich (Any-Pointer) den gesamten Eingangs- bzw- Ausgangs-Bereich aller Slaves an?


Letzten Endes ja.



> Was geschieht mit evtl. Adresslücken zwischen den Slaves?


Diese werden als Lücke in den angegebenen Any Bereich transferiert.
Du hast z.B. 1 Slave mit E-Byte 200, dann überträgst du halt 200 Leerbytes, und dein Any-Pointer muss mindestens 201 Byte lang sein.

Mfg
Manuel


----------



## Dumbledore (29 Oktober 2008)

MSB schrieb:


> Du liest den Adressbereich aus, auf welche und wie viele Slaves dieser sich verteilt ist egal.


ok so weit so gut, so hatte ich mir das auch gedacht.

Was ich nur jetzt nicht verstehe ist das Diagramm im o.g. Siemens-Handbuch auf Seite 138 Absatz 4.2.2.2. Dort sind mehrere "Nutzdaten" (A,B,C) genannt, die während eines DP_SEND-Zyklus auch nicht verändert werden dürfen (sagt Siemens).

Konkret hatte ich das eigentlich so vor, dass für DP_SEND und DP_RECV jeweils ein DB benutzt wird, der dann in einem einzigen Aufruf von FC1 bzw. FC2 referenziert wird. Es wird also in jedem OB1-Zyklus DP_SEND (für alle Slaves) aufgerufen, während die eigentliche Programmlogik ihre Daten über die beiden DBs ausliest bzw. ausgibt (so als wären es Eingänge und Ausgänge). Das ganze ist ähnlich einem PAE/PAA das man selber verwaltet.


```
ORGANIZATION_BLOCK "Cycle Execution"
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1
 
VAR_TEMP
  OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ; //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ; //Reserved for system
  OB1_RESERVED_2 : BYTE ; //Reserved for system
  OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =receive data from MCC via profibus CP342-5
//address details in DB11 see hardware config
      CALL "DP_RECV" (
           CPLADDR                  := W#16#100,
           RECV                     := P#DB11.DBX0.0 BYTE 108,
           NDR                      := M    205.2,
           ERROR                    := M    205.3,
           STATUS                   := MW   202,
           DPSTATUS                 := MB   204);
      NOP   0; 
NETWORK
TITLE =main program
NETWORK
TITLE =send data to MCC via profibus CP342-5
//address details in DB10 see hardware config
      CALL "DP_SEND" (
           CPLADDR                  := W#16#100,
           SEND                     := P#DB10.DBX0.0 BYTE 108,
           DONE                     := M    205.0,
           ERROR                    := M    205.1,
           STATUS                   := MW   200);
      NOP   0; 
END_ORGANIZATION_BLOCK
```
 
Oder muss ich zumindest das Schreiben in den DB für DP_SEND sperren während DP_SEND aktiv ist?

Gruss Michael aka Dumbledore


----------



## Dumbledore (30 Oktober 2008)

[INGRID]

kann bitte jemand das von mir oben genannte Codestück mit DP_SEND und DP_RECV bestätigen, ist das so korrekt?

danke im voraus 

Mike aka Dumbledore

[/INGRID]


----------



## HaDi (30 Oktober 2008)

Also, ich habe mir mal verschiedene Projekte von verschiedenen Anlagen angesehen und die haben das alle so gemacht. Am Anfang des OB1 wird gelesen und am Ende wird geschrieben.
Für mein Verständnis arbeiten FC1/FC2 wie ein Blockmove, nur halt über den Rückwandbus vom/zum CP. 
Zur Fehlerauswertung von FC1/FC2 werden ERROR und STATUS ausgewertet, der NDR(FC2) bzw. DONE(FC1) werden nicht weiter benutzt.
Die eigentliche Busdiagnose wird dann mit FC3 gemacht.

Grüße von HaDi


----------

