Kommunikation: S5 (CP524) <-> S7 (CP341)

win98

Level-2
Beiträge
109
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Nachdem ich erfolgreich meine S5 zum Laufen bekommen habe, hänge ich an der Kommunikation mit der S7

Verbindung:
Auf der CP524 hab ich ein TTY-Modul Stecken und benutze zur S7 folgendes Kabel:
Screenshot: Kabelbelegung

Entnommen habe ich die Belegung aus dem CP341 Handbuch.

S5 Konfig:
Auf der S5 Seite habe ich aufs EPROM des CP524 die ".525" Datei gebrannt. Eingestellt ist RK mit Prozedur 3964R.
Screenshot: Step5 Einstellungen
Außerdem ist ein SEND Auftrag auf die Auftragsnummer 1 programmiert.
Die DIP Schalter für die Koppelmerker sind alle auf TRUE und die DIP Schalter für die Schnittstellennummer sind alle auf FALSE.
In meinem Programm habe ich meine SEND und RECEIVE Bausteine wie folgt beschaltet:
Code:
Netzwerk 4
    :SPA FB 244
NAME: SEND
SSNR:  KY 0,0
A-NR:  KY 0,1
ANZW:  MW200
QTYP:  KC DB
DBNR:  KY 0,203
QANF:  KF +1
QLAE:  KF +10
PAFE:  MB 200
    : ***

S7 Konfig:
Im Step7 habe ich ähnliche Einstellungen vorgenommen:
Screenshot: Step7 Einstellungen

Verwendet habe ich das Beispielprogramm, welches auf der CD mitgeliefert wurde, um die Kommunikation zu testen:
Code:
Netzwerk 1: Empfangen

EMPFANGEN:
      L     256                         //LADDR
      T     "SEND WORK DB".P_SND_RK_WORK_LADDR
 
      L     204                         //DB_NO
      T     "SEND WORK DB".P_SND_RK_WORK_DB_NO
 
      L     0                           //DBB_NO
      T     "SEND WORK DB".P_SND_RK_WORK_DBB_NO
 
      L     56
      T     "SEND WORK DB".P_SND_RK_WORK_LEN    //LEN
 
// ------------------------
// SEND with Instance-DB
// ------------------------
 
      CALL  "P_SND_RK" , "SEND IDB"
       SF      :='S'
       REQ     :="SEND WORK DB".P_SND_RK_REQ
       R       :="SEND WORK DB".P_SND_RK_R
       LADDR   :="SEND WORK DB".P_SND_RK_WORK_LADDR
       DB_NO   :="SEND WORK DB".P_SND_RK_WORK_DB_NO
       DBB_NO  :="SEND WORK DB".P_SND_RK_WORK_DBB_NO
       LEN     :="SEND WORK DB".P_SND_RK_WORK_LEN
       R_CPU_NO:=1
       R_TYP   :='D'
       R_NO    :=204
       R_OFFSET:=0
       R_CF_BYT:=255
       R_CF_BIT:=
       DONE    :="SEND WORK DB".P_SND_RK_DONE
       ERROR   :="SEND WORK DB".P_SND_RK_ERROR
       STATUS  :="SEND WORK DB".P_SND_RK_WORK_STATUS
 
// ------------------------
// Generate edge P_SND_RK_REQ
// ------------------------
      UN    "SEND WORK DB".P_SND_RK_REQ //P_SND_RK_REQ
      S     "SEND WORK DB".P_SND_RK_REQ //set P_SND_RK_REQ
 
      O     "SEND WORK DB".P_SND_RK_DONE    //P_SND_RK_DONE
      O     "SEND WORK DB".P_SND_RK_ERROR    //P_SND_RK_ERROR
      R     "SEND WORK DB".P_SND_RK_REQ //P_SND_RK_REQ
 
 
// -------------------------------
// Check "Complete without error"
// -------------------------------
      UN    "SEND WORK DB".P_SND_RK_DONE    //check P_SND_RK_DONE
      SPB   CHER                        //if P_SND_RK_DONE equals 0, jump to CHER
//and check P_SND_RK_ERROR
 
// -------------------------------
// "Complete without error"
//  P_SND_RK_DONE = 1
// -------------------------------
      L     "SEND WORK DB".P_SND_RK_COUNTER_OK    //"Complete without Error"
      +     1                           //increment counter
      T     "SEND WORK DB".P_SND_RK_COUNTER_OK
 
 
      NOP   0
      NOP   0                           //further user functions
      NOP   0
 
      BE    
 
// -------------------------------
// Check "Complete with error"
// P_SND_RK_ERROR = 1
// -------------------------------
CHER: UN    "SEND WORK DB".P_SND_RK_ERROR    //check P_SND_RK_ERROR
      BEB                               //if no error occured, jump to end
 
// -------------------------------
// "Complete with error"
// -------------------------------
      L     "SEND WORK DB".P_SND_RK_COUNTER_ERR    //"Complete with error"
      +     1                           //increment counter
      T     "SEND WORK DB".P_SND_RK_COUNTER_ERR
 
      L     "SEND WORK DB".P_SND_RK_WORK_STATUS
      T     "SEND WORK DB".P_SND_RK_WORK_STATUS_SAV    //save STATUS
 
      NOP   0
      NOP   0                           //Error-Handling
      NOP   0
 
      BE    
 

 
 

Netzwerk 2: Senden
 
SENDEN: 
      L     256                         //LADDR
      T     "RCV WORK DB".P_RCV_RK_WORK_LADDR
 
      L     203                         //DB_NO
      T     "RCV WORK DB".P_RCV_RK_WORK_DB_NO
 
      L     0                           //DBB_NO
      T     "RCV WORK DB".P_RCV_RK_WORK_DBB_NO
 
// ------------------------
// Enable Receive Data
// ------------------------
      SET   
      =     "RCV WORK DB".P_RCV_RK_EN_R //P_RCV_RK with P_RCV_RK_EN_R=TRUE
 
// ------------------------
// P_RCV_RK with Instance-DB
// ------------------------
      CALL  "P_RCV_RK" , "RECV IDB"
       EN_R    :="RCV WORK DB".P_RCV_RK_EN_R
       R       :=
       LADDR   :="RCV WORK DB".P_RCV_RK_WORK_LADDR
       DB_NO   :="RCV WORK DB".P_RCV_RK_WORK_DB_NO
       DBB_NO  :="RCV WORK DB".P_RCV_RK_WORK_DBB_NO
       L_TYP   :=MB550
       L_NO    :=MW552
       L_OFFSET:=MW554
       L_CF_BYT:=MW556
       L_CF_BIT:=MW558
       NDR     :="RCV WORK DB".P_RCV_RK_NDR
       ERROR   :="RCV WORK DB".P_RCV_RK_ERROR
       LEN     :="RCV WORK DB".P_RCV_RK_WORK_LEN
       STATUS  :="RCV WORK DB".P_RCV_RK_WORK_STATUS
 
// -------------------------------
// Check P_RCV_RK_NDR (Receive without error)
// -------------------------------
      UN    "RCV WORK DB".P_RCV_RK_NDR  //check P_RCV_RK_NDR
      SPB   CHER                        //if P_RCV_RK_NDR equals FALSE, jump to CHER
//and check P_RCV_RK_ERROR
 
// -------------------------------
//  P_RCV_RK_NDR = 1 (Receive without error)
// -------------------------------
      L     "RCV WORK DB".P_RCV_RK_WORK_CNT_OK    //"Receive without error"
      +     1                           //increment counter
      T     "RCV WORK DB".P_RCV_RK_WORK_CNT_OK
 
      L     "RCV WORK DB".P_RCV_RK_WORK_LEN    //save RECEIVE-Length
      T     "RCV WORK DB".P_RCV_RK_WORK_SAVE_LEN
 
      BE    
 
// -------------------------------
// Check "Receive with error"
// -------------------------------
CHER: UN    "RCV WORK DB".P_RCV_RK_ERROR    //check P_RCV_RK_ERROR
      BEB                               //if no error occured, jump to end
 
// -------------------------------
// "Receive with error"
// -------------------------------
      L     "RCV WORK DB".P_RCV_RK_WORK_CNT_ERR    //Error
      +     1                           //increment counter
      T     "RCV WORK DB".P_RCV_RK_WORK_CNT_ERR
 
 
// ----------------------------
// Save "P_RCV_RK_STATUS"
// ---------------------------- 
      L     "RCV WORK DB".P_RCV_RK_WORK_STATUS
      T     "RCV WORK DB".P_RCV_RK_WORK_STATUS_SAV    //save P_RCV_RK_STATUS
      BE


Fehlerbeschreibung:
Auf der S5 ist die CPU erfolgreich auf RUN und der die Fehler LEDs des CP524 IF1 und IF2 leuchten nicht.
Der CP341 der S7 meldet auch keine Fehler.
So wie das Programm im Step7 ist, blinken die RxD und TxD LED am CP341. Ich kann auch im Step7 Daten im DB ändern und die werden im Step5 gleich richtig übernommen. Aber andersrum funktioniert das leider nicht. Ich empfange im Step7 nur "0". Status/Zustand ist aber OK und habe auch keine Fehlermeldung. Hab mal um das Empfangen aus der S5 zu testen das Senden im Step7 auskommentiert, dann leuchten die RxD und TxD LEDs auch nicht mehr


Hoff jemand hat eine Idee wie ich von der S5 Senden und in der S7 empfangen kann :(
 
auf der s5 seite sehe ich, dass du mw200 und mwerkerbyte200 verwendet hast. bitte probier es mal mit anderen, freien merkern (unter 200) aus
z.b. mw160 und mb162

momentan überlappen sich mw200 und mb200, zudem werden diese in den programmen oft als schmiermerker verwendet und können
dann zu undefiniertem verhalten führen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm, das hatte ich auch schon im Auge. Ich hab das S5 Programm von nem Freund bekommen, bei dem es einwandfrei läuft und ich hab jetzt auch dieselbe Hardware, deswegen bin ich davon ausgegangen, dass es so geht. Ich lösch grad das EPROM, werds in 10 Minuten mal probieren.

Im Step7 gibt's richtig Hilfreiche Fehlermeldungen vom CP, was mir bisher gut weitergeholfen hat. Im Step5 hab ich nur das Sinec NCM gefunden, womit ich den CP Testen und den Zustand abfragen kann. Jedoch konnte ich bis jetzt noch kein Kabel für eine PG740<->CP524 Verbindung finden. Oder kann ich das auch von der PG<->AG Verbindung aus?
 
auf der s5 seite sehe ich, dass du mw200 und mwerkerbyte200 verwendet hast. bitte probier es mal mit anderen, freien merkern (unter 200) aus
z.b. mw160 und mb162

momentan überlappen sich mw200 und mb200, zudem werden diese in den programmen oft als schmiermerker verwendet und können
dann zu undefiniertem verhalten führen

ANZW und PAFE sind nur Fehler/Statusmeldungen des SEND.
An welche MW/MB sie übergeben werden ist an sich egal.
Wenn sie ausgewertet werden sollen, sollten sie sich natürlich
nicht überschneiden, aber für die Funktion des SEND ist es nicht
wichtig.

@win98: Wird das Netzwerk 4 bei Dir durchlaufen?
Wenn ja, dann schreib doch mal, was der SEND beim ANZW und beim PAFE rausschmeisst
(Dafür wäre es sinnvoll am PAFE das MB202 einzutragen).

Grüße
Gebs
 
also das NW4 befindet sich im PB121 und der PB121 wird im OB1 aufgerufen, deswegen geh ich mal dasvon aus, dass er abgearbeitet wird. Ich kann aber nicht um PB121 die Diagnose aktivieren und online gehen. Hab jetzt den PAFE auf MB110 gelegt und ich bekomme bei " Status Variable" den Wert KH=71 angezeigt. Die Querverweisliste sagt auch aus dass MB110 nur einmal im PB121 verwendet wird

Handbuch:
Code:
71H Schnittstelle nicht vorhanden (QVZ des CP 525)
Prüfen Sie die Brüclceneinstellung für die Schnittstellemnnmier
des CP 525
die QVZ LED der CPU leuchtet nicht. Im Brückenschalter sind aber alle DIP's auf 0 und als SSNR hab ich 0,0 eingegeben
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Da wollte ich doch grad mal Fotos hochladen und siehe da, der Heilige Geist hast einen DIP Schalter verstellt.....
Bin mir sicher ich hatte alles auf 0 :D

Auf jeden Fall ist jetzt alles auf 0 :p

Jetzt blinkt die RxD LED häufiger aber irgendwie stimmt da noch was nicht... muss mal näher schaun was Step7 ausspuckt :p
 
Leider zu früh gefreut :(

Die RxD LED leuchtet zwar jetzt öfter (und wird auch weniger wenn ich den S5 Cp auf STOP schalte), aber ich bekomm keine sinnvolle Daten.

Mein DB203 indem ich die Daten erwarte ist überall 0. Aber in dem Beispielprogramm ist ein Counter drinn, der die empfangenen fehlerlosen Telegramme zählt. Der steigt immer.

Der PAFE meiner SEND Bausteins in der S5 ist jetzt auch 00.

Ich hab versucht die Ursache zu finden und bin auf was komisches gestoßen. In meinem SEND-Auftrag im EPROM ist als SEND-DB die 205 eingetragen.
An den SEND-Baustein hab ich aber die DB 203 eingetragen. Was hat es denn mit der DB Nummer im Auftrag auf sich?

Hoff jemand weiß, worans noch hängen könnte.
 
Zuletzt bearbeitet:
Sry für den vierten Post, aber ich kapier grad nichts.

ich habe jetzt meinen S7 Code wie folg abgeändert:
Code:
      L     256                         //LADDR
      T     "RCV WORK DB AKTIV".P_SND_RK_WORK_LADDR
 
      L     203                         //DB_NO
      T     "RCV WORK DB AKTIV".P_SND_RK_WORK_DB_NO
 
      L     0                           //DBB_NO
      T     "RCV WORK DB AKTIV".P_SND_RK_WORK_DBB_NO
 
      L     20
      T     "RCV WORK DB AKTIV".P_SND_RK_WORK_LEN    //LEN
 
// ------------------------
// SEND with Instance-DB
// ------------------------
 
      CALL  P_SND_RK , "RECV IDB AKTIV"
       SF      :='F'
       REQ     :="RCV WORK DB AKTIV".P_SND_RK_REQ
       R       :="RCV WORK DB AKTIV".P_SND_RK_R
       LADDR   :="RCV WORK DB AKTIV".P_SND_RK_WORK_LADDR
       DB_NO   :="RCV WORK DB AKTIV".P_SND_RK_WORK_DB_NO
       DBB_NO  :="RCV WORK DB AKTIV".P_SND_RK_WORK_DBB_NO
       LEN     :="RCV WORK DB AKTIV".P_SND_RK_WORK_LEN
       R_CPU_NO:=1
       R_TYP   :='D'
       R_NO    :=203
       R_OFFSET:=0
       R_CF_BYT:=255
       R_CF_BIT:=
       DONE    :="RCV WORK DB AKTIV".P_SND_RK_DONE
       ERROR   :="RCV WORK DB AKTIV".P_SND_RK_ERROR
       STATUS  :="RCV WORK DB AKTIV".P_SND_RK_WORK_STATUS
 
 
// ------------------------
// Generate edge P_SND_RK_REQ
// ------------------------
      UN    "RCV WORK DB AKTIV".P_SND_RK_REQ    //P_SND_RK_REQ
      S     "RCV WORK DB AKTIV".P_SND_RK_REQ    //set P_SND_RK_REQ
 
      O     "RCV WORK DB AKTIV".P_SND_RK_DONE    //P_SND_RK_DONE
      O     "RCV WORK DB AKTIV".P_SND_RK_ERROR    //P_SND_RK_ERROR
      R     "RCV WORK DB AKTIV".P_SND_RK_REQ    //P_SND_RK_REQ
 
 
// -------------------------------
// Check "Complete without error"
// -------------------------------
      UN    "RCV WORK DB AKTIV".P_SND_RK_DONE    //check P_SND_RK_DONE
      SPB   CHER                        //if P_SND_RK_DONE equals 0, jump to CHER
//and check P_SND_RK_ERROR
 
// -------------------------------
// "Complete without error"
//  P_SND_RK_DONE = 1
// -------------------------------
      L     "RCV WORK DB AKTIV".P_SND_RK_COUNTER_OK    //"Complete without Error"
      +     1                           //increment counter
      T     "RCV WORK DB AKTIV".P_SND_RK_COUNTER_OK
 
 
      NOP   0
      NOP   0                           //further user functions
      NOP   0
 
      BE    
 
// -------------------------------
// Check "Complete with error"
// P_SND_RK_ERROR = 1
// -------------------------------
CHER: UN    "RCV WORK DB AKTIV".P_SND_RK_ERROR    //check P_SND_RK_ERROR
      BEB                               //if no error occured, jump to end
 
// -------------------------------
// "Complete with error"
// -------------------------------
      L     "RCV WORK DB AKTIV".P_SND_RK_COUNTER_ERR    //"Complete with error"
      +     1                           //increment counter
      T     "RCV WORK DB AKTIV".P_SND_RK_COUNTER_ERR
 
      L     "RCV WORK DB AKTIV".P_SND_RK_WORK_STATUS
      T     "RCV WORK DB AKTIV".P_SND_RK_WORK_STATUS_SAV    //save STATUS
 
      NOP   0
      NOP   0                           //Error-Handling
      NOP   0
 
      BE

Den Baustein benutz ich aber nicht zum Senden, sondern zum Empfangen. D.h. ich empfange mit dem SEND Baustein Daten aus der DB203 von der S5. Hab das mal getestet und es funktioniert auch. Nur kann ichs mir nicht erklären.

Muss ich das so machen, wenn ich den CP der S7 als aktiven Partner haben möchte, damit er aktiv sendet und aktiv empfängt? Wie/Wo stell ich denn den aktiven Partner ein?

Es funktioniert zwar, aber ich kann's mir nicht so richtig erklären und weiß nicht, ob das so gut ist.

Für n Feedback wär ich dankbar :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo win98,

mit dem CP 524 hab'ich nicht oft gearbeitet und es ist schon länger her! ;)
Bei den CPs 143 bzw 1430 ist es so, dass man für Send und Receive entweder eine eigene Verbindung pro Auftrag braucht:
S5 SEND => S5 aktiv
S5 Receive => S7 aktiv
oder, wenn man eine Verbindung mit 2 Aufträgen einrichtet, muss man auf S5-Seite auf die Reihenfolge achten:
1. Auftrag SEND und 2.Auftrag Receive => S5 ist aktiv S7 passiv
1. Auftrag Receive und 2.Auftrag SEND => S5 ist passiv und S7 aktiv.

Wie gesagt, ich weiss nicht ob es beim CP524 genauso läuft. müsste mal das HB fragen.

Grüße
Gebs
 
Hallo,

win98 schrieb:
Muss ich das so machen, wenn ich den CP der S7 als aktiven Partner haben möchte, damit er aktiv sendet und aktiv empfängt?

Nein. Wenn die S7 der aktive Partner sein soll, darfst Du nicht auf beiden Seiten Send_Direkt/Receive-Direkt Aufträge absetzen. Außerdem muss auf Seiten der S5 jeder Aufruf eines Auftrags auch auf dem EPROM des CP524 programmiert sein. Zusätzlich muss für jede Schnittstelle zyklisch ein Send-All aufgerufen werden. Sehe Dir mal im Handbuch die Unterschiede zwischen SEND-ALL und SEND-DIREKT an.

Damit die S5 passiv arbeiten kann, reicht folgendes aus :

Code:
Netzwerk 4
    // Aufruf FB244 als SEND-ALL
    O   M 0.0
    ON M 0.0      <-------- VKE auf log "1" setzen, sonst wird der FB nur zufällig bearbeitet !!!
    :SPA FB 244
NAME: SEND
SSNR:  KY 0,0   <--------- Deine Schnittstellennummer, hier 0
A-NR:  KY 0,0   <--------- Auftragsnummer auf 0 setzen
ANZW:  MW100
QTYP:  KC NN
DBNR:  KY 0,0
QANF:  KF +0
QLAE:  KF +0
PAFE:  MB  98
    : ***

Und das gleiche für RECEIVE-ALL :

Code:
Netzwerk 5
    // Aufruf FB245 als RECEIVE-ALL
    O   M 0.0
    ON M 0.0     <-------- VKE auf log "1" setzen, sonst wird der FB nur zufällig bearbeitet !!!
    :SPA FB 245
NAME: RECEIVE
SSNR:  KY 0,0   <--------- Deine Schnittstellennummer, hier 0
A-NR:  KY 0,0   <--------- Auftragsnummer auf 0 setzen
ANZW:  MW102
QTYP:  KC NN
DBNR:  KY 0,0
QANF:  KF +0
QLAE:  KF +0
PAFE:  MB  99
    : ***

Somit brauchst Du nur 1x FB244 und FB245 zyklisch aufrufen (den SYNC im Anlauf nicht vergessen) und der Kuchen auf der S5 Seite ist gegessen.Ein SEND_DIREKT stößt also direkt einen auf dem EPROM des CP524 hinterlegten Auftrag an. Und das brauchst Du in diesem Falle nicht, da die S5 passiv sein soll. Und der SEND_ALL sorgt für den Transport der Daten zwischen S5-CPU und CP524, den brauchst Du in jedem Falle. Die Aufträge SEND-ALL und RECEIVE-ALL gibt es in der S7 nicht, diese Aufträge hat die S7 im Bauch, das passiert automatisch.

Die oben angegeben Codeschnipsel sind alles, was man beim passiven Betrieb des CP524 braucht. Und natürlich den SYNCH beim Anlauf der S5. Jetzt kannst Du mit dem CP341 mit WRITE Daten in die S5 schreiben und mit dem FETCH Daten aus der S5 holen (lesen). Un feddich ist, das kann so einfach sein ....

Gruß

Question_mark

Edit : Fehler im Netzwerk5 korrigiert !!!!
 
Zuletzt bearbeitet:
Zurück
Oben