PROFINET zwischen IM151-8 PN/DP und S7-319 läuft nicht

Fossibaer

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich muss eine Profinetverbindung zwischen einer IM151-8 PN/DP CPU (6ES7151-8AB00-0AB0) und einer S7 319 PN aufbauen. Leider ausgerechnet im fernen China. Nach der Netzverbindung mittels Profinet lässt sich die IM151 (192.168.0.90) wunderbar an pingen und es lässt sich von PG auf die Steuerung zugreifen.
Auf beiden Steuerungen wurde ein Kommunikationskanal mit der jeweiligen Partnersteuerung eingerichtet. Nur nach der Aktivierung des Kanales auf beiden Steuerungen passiert genau NIX und es steht da „keine Verbindung“. Das es sich um ein Verbindungsproblem handeln muss kann ich auch an den PUT/GET Bausteinen erkennen welche beide den FehlerSTATUS 1 bringen, welcher Verbindungsprobleme aussagt anzeigen.


Schematischer Aufbau (ProfiNet Kabel ist Orginale und ohne Fehler verlegt wurden)



S7-319 (Hauptsteuerung)

IP 192.168.0.9
Locale Adresse für PUT/GET: 21
Adresse der PartnerCPU 192.168.0.90
Muss diese Konfiguration in CPU Übertragen werden oder reicht es wenn diese Aktiviert wird?



IM151-8 PN/DP CPU (Kernlager Steuerung)

IP: 192.168.0.90
Locale Adresse für Kommunikation: 1

Adresse der PartnerCPU: 192.168.0.9


Vielen Danke im Vorraus für eure Hilfe
Mirko
 
Kann es sein das die IM151 diese Funktion nicht bietet denn beim Übertragen der Hardware Konfig kommt ein Fehler der sich auf die Localenaddressen bezieht. Denn das Kernlager macht eine Chinesische Firma und hat eben auch die Cheini Version drauf.

Gruß

Mirko
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann es sein das die IM151 diese Funktion nicht bietet denn beim Übertragen der Hardware Konfig kommt ein Fehler der sich auf die Localenaddressen bezieht. Denn das Kernlager macht eine Chinesische Firma und hat eben auch die Cheini Version drauf.

Gruß

Mirko

Ich hab genau so eine Konfiguration (IM151-8, 315, 319) vor ein paar Wochen gehabt, das lief fast auf Anhieb völlig problemlos.
Die Chinesen müssen dabei gar nichts machen, nur du mußt dein Netz entsprechend konfigurieren und die PUT/GET-Bausteine (FB14/15 aus der Communication-Library) verwenden.
Dann kannst du Daten holen und in deren SPS ablegen. Solle sie das auch können, legen sie ebenfalls eine Verbindung an.
Du mußt eine unspezifizierte Verbindung vom Typ S7-Verbindung anlegen, dazu die IP des Gegenpunktes eingeben und die Verbindungs-ID für den FB merken.

@LargoD

Put und Get mit S7-Verbindung über PN funktioniert.
Nur wenn man reines TCP/IP z.Bsp. mit einem Cognex-Scanner realisieren will, muß man selbst aus dem Step7-Programm heraus, wie in deinen Links beschrieben, für den Verbindungsaufbau sorgen.
 
Zuletzt bearbeitet:
Also danke für eure Hilfe und jetzt kann ich erstmal wieder mit einpaar neuen Ideen an die Sachse ran. Zum Glück in gut einer 1h schon :). Werd mich später mal Melden ob es entlich läuft.

Dank und Gruß
Mirko
 
So wiedermal ein Tag vorbei und leider ohne jedliche Erkenntnisse.
Habe mal meine Konfiguration mit angehangen. Vielleicht hilft es weiter.



Konfiguration der Verbindung mit ProNet (das Rack is 0 und der Slot 2) hat aber auch nix gebracht.



Initialisierung der Übertragung (Netzwerk wurde schon getauscht DENN TEMP Variablen erst SCHREIBEN dann LESEN)



Grüße aus Jinan

Mirko
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie kommst du auf 21hex als ID? Wenn ich das vorhergehende Bild richtig interpretiere, ist die lokale ID 3hex.

Warum ist bei dir Put_Error im NW 2 True, in NW 1 aber False? Die Variablen sollten statische Variable, keine Temp sein!

Ich habe auch das Siemens-Beispiel genutzt, dieses aber ein wenig abgewandelt. Anbei einmal die Quelle (symbolisch), evtl. mußt du den Namen von FB15 (PutPN) anpassen. Sicher noch nicht der Weisheit letzter Schluß, aber mit der Zuweisung von Quelle und Ziel über einfache Int-Variablen und zumindest läuft das so problemlos.

Code:
FUNCTION_BLOCK "Put_Data"
TITLE =
VERSION : 1.0


VAR_INPUT
  bStart : BOOL ;	//Start Daten von Remote SPS holen
  bInit_COM : BOOL ;	//Initialisierung (Reset)
  wID : WORD ;	//Verbindungs-ID
  wAdr_DB : INT ;	//DB-Nummer der Remote-SPS
  wAdr_Byte : INT ;	//Anfangsadresse im DB der Remote-SPS
  wAdr_Len : INT ;	//Länge der Daten (in Byte) im DB der Remote-SPS
  wRD_DB : INT ;	//DB-Nummer Empfangsfach
  wRD_Byte : INT ;	//Anfangsadresse im Sendefach
  wRD_Len : INT ;	//Länge der Daten im Sendefach
END_VAR
VAR_OUTPUT
  Busy : BOOL ;	//Funktion arbeitet
  Error : BOOL ;	//Fehler
  State : WORD ;	//Fehlerstatus
END_VAR
VAR
  Statistic : STRUCT 	
   PUT_DONE : INT ;	
   PUT_ERROR : INT ;	
  END_STRUCT ;	
  PLC1_COM : STRUCT 	
   PUT_REQ : BOOL ;	
   PUT_BUSY : BOOL ;	
   PUT_DONE : BOOL ;	
   PUT_ERROR : BOOL ;	
   PUT_COM_START : BOOL ;	
   ID : WORD ;	
   PUT_STATUS : WORD ;	
   PUT_STAT_SAVE : WORD ;	
   Put_ERROR_Save : BOOL ;	
  END_STRUCT ;	
  Put : "PutPN";	
  BVal : BYTE ;	//NullByte für Fill
  HM_FP_Start : BOOL ;	//HM Positive Flanke Start
  FP_Start : BOOL ;	//Poitive Flanke Start
  RetVal : INT ;	//Return Value Fill
END_VAR
VAR_TEMP
  ADDR_Temp : ANY ;	//Zeiger auf Daten der Remote-SPS
  RD_Temp : ANY ;	//Zeiger auf Daten der Empfangs-SPS
  SAVE_VKE : BOOL ;	
  RETTAR1 : DWORD ;	
  RETTAR2 : DWORD ;	
END_VAR
BEGIN
NETWORK
TITLE =Sichere VKE im BIE

      SET   ; 
      SAVE  ; 
      =     #SAVE_VKE; 
NETWORK
TITLE =Adtressregister retten

      TAR1  #RETTAR1; 
      TAR2  #RETTAR2; 
NETWORK
TITLE =PUT request und Error löschen bei Initialisierung

      U     #bInit_COM; 
      R     #PLC1_COM.PUT_REQ; 
      R     #PLC1_COM.Put_ERROR_Save; 
NETWORK
TITLE =Pointer auf Daten in der Remote-SPS bilden (Ziel)
//   
      LAR1  P##ADDR_Temp; //Anfangsadresse des ANY-Pointers in AR1 laden

      L     B#(16, 2); //Syntax-ID und Typ: Byte laden
      T     LW [AR1,P#0.0]; 
      L     #wAdr_Len; //Transferlaenge
      T     LW [AR1,P#2.0]; 
      L     #wAdr_DB; //Quelle-DB 
      T     LW [AR1,P#4.0]; 
      L     P#DBX 0.0; //Anfangs-DW im Quell-DB
      L     #wAdr_Byte; 
      SLD   3; 
      +D    ; 
      T     LD [AR1,P#6.0]; 
NETWORK
TITLE =Pointer auf Daten in der Sende-SPS bilden (Quelle)

      LAR1  P##RD_Temp; //Anfangsadresse des ANY-Pointers in AR1 laden

      L     B#(16, 2); //Syntax-ID und Typ: Byte laden
      T     LW [AR1,P#0.0]; 
      L     #wRD_Len; //Transferlaenge
      T     LW [AR1,P#2.0]; 
      L     #wRD_DB; //Quelle-DB 
      T     LW [AR1,P#4.0]; 
      L     P#DBX 0.0; //Anfangs-DW im Quell-DB
      L     #wRD_Byte; 
      SLD   3; 
      +D    ; 
      T     LD [AR1,P#6.0]; 
NETWORK
TITLE =Flanke zum Löschen der Daten im Sende-DB (nicht genutzt)

      U     #bStart; 
      FP    #HM_FP_Start; 
      =     #FP_Start; 
NETWORK
TITLE =Daten zu der Remote-SPS senden

      CALL #Put (
           REQ                      := #PLC1_COM.PUT_REQ,
           ID                       := #wID,
           DONE                     := #PLC1_COM.PUT_DONE,
           ERROR                    := #PLC1_COM.PUT_ERROR,
           STATUS                   := #PLC1_COM.PUT_STATUS,
           ADDR_1                   := #ADDR_Temp,//Ziel
           SD_1                     := #RD_Temp);//Quelle

NETWORK
TITLE =Busy bilden
//Start PUT function with the rising edge of the start input if the PUT function 
//is not BUSY.
//The REQ input parameter of the PUT function is triggered with a rising edge and 
//BUSY is set as long as the PUT function is not completed!
//
      U     #bStart; 
      S     #PLC1_COM.PUT_REQ; 
      U(    ; 
      O     #PLC1_COM.PUT_ERROR; 
      O     #PLC1_COM.PUT_DONE; 
      )     ; 
      R     #PLC1_COM.PUT_REQ; 
      NOP   0; 
NETWORK
TITLE =Stausinformationen im Errorfall speichern
//If ERROR occured then save STATUS!
//
      U     #PLC1_COM.PUT_ERROR; 
      SPBNB _001; 
      L     #PLC1_COM.PUT_STATUS; 
      T     #PLC1_COM.PUT_STAT_SAVE; 
_001: NOP   0; 
NETWORK
TITLE =Error Speichern

      U     #PLC1_COM.PUT_ERROR; 
      S     #PLC1_COM.Put_ERROR_Save; 
NETWORK
TITLE =Busy Kommunikation ausgeben

      U     #PLC1_COM.PUT_REQ; 
      =     #Busy; 
NETWORK
TITLE =Error ausgeben

      U     #PLC1_COM.Put_ERROR_Save; 
      =     #Error; 
NETWORK
TITLE =Status ausgeben

      L     #PLC1_COM.PUT_STATUS; 
      T     #State; 
      NOP   0; 
NETWORK
TITLE =Zurückübertragen der geretteten Adressregister

      LAR1  #RETTAR1; 
      LAR2  #RETTAR2; 
NETWORK
TITLE =

      U     #SAVE_VKE; 
      SAVE  ; 
      BE    ; 
END_FUNCTION_BLOCK
 
Hier noch, der Vollständigkeit halber, der etwas abgewandelte Get-Baustein, der enthält zusätzlich den SFC "Fill", um vor dem Empfang der Daten das Empfangsfach mit 0 zu überschreiben.
Das habe ich allerdings deaktiviert, da ich kontinuierlich Daten gelesen und ausgewertet habe und das Überschreiben mit 0 natürlich zu einem kurzen "Flackern" im Empfangsbuffer führte. In meinem Fall störte es, aber man kann das wieder aktivieren, je nach Bedarf.


Code:
FUNCTION_BLOCK "Get_Data"
TITLE =
VERSION : 1.0

VAR_INPUT
  bStart : BOOL ;	//Start Daten von Remote SPS holen
  bInit_COM : BOOL ;	//Initialisierung (Reset)
  wID : WORD ;	//Verbindungs-ID
  wAdr_DB : INT ;	//DB-Nummer der Remote-SPS
  wAdr_Byte : INT ;	//Anfangsadresse im DB der Remote-SPS
  wAdr_Len : INT ;	//Länge der Daten (in Byte) im DB der Remote-SPS
  wRD_DB : INT ;	//DB-Nummer Empfangsfach
  wRD_Byte : INT ;	//Anfangsadresse im Empfangsfach
  wRD_Len : INT ;	//Länge der Daten im Empfangsfach
END_VAR
VAR_OUTPUT
  Busy : BOOL ;	//Funktion arbeitet
  Error : BOOL ;	//Fehler
  State : WORD ;	//Fehlerstatus
END_VAR
VAR
  Statistic : STRUCT 	
   GET_NDR : INT ;	
   GET_ERROR : INT ;	
  END_STRUCT ;	
  PLC1_COM : STRUCT 	
   GET_REQ : BOOL ;	
   GET_BUSY : BOOL ;	
   GET_NDR : BOOL ;	
   GET_ERROR : BOOL ;	
   GET_COM_START : BOOL ;	//Pos flank
   ID : WORD ;	
   GET_STATUS : WORD ;	
   GET_STAT_SAVE : WORD ;	
   GET_ERROR_Save : BOOL ;	
  END_STRUCT ;	
  GET : "GetPN";	
  BVal : BYTE ;	//NullByte für Fill
  HM_FP_Start : BOOL ;	//HM Positive Flanke Start
  FP_Start : BOOL ;	//Poitive Flanke Start
  RetVal : INT ;	//Return Value Fill
END_VAR
VAR_TEMP
  ADDR_Temp : ANY ;	//Zeiger auf Daten der Remote-SPS
  RD_Temp : ANY ;	//Zeiger auf Daten der Empfangs-SPS
  SAVE_VKE : BOOL ;	
  RETTAR1 : DWORD ;	
  RETTAR2 : DWORD ;	
END_VAR
BEGIN
NETWORK
TITLE =Sichere VKE im BIE

      SET   ; 
      SAVE  ; 
      =     #SAVE_VKE; 
NETWORK
TITLE =Adtressregister retten

      TAR1  #RETTAR1; 
      TAR2  #RETTAR2; 
NETWORK
TITLE =GET request und Error löschen bei Initialisierung

      U     #bInit_COM; 
      R     #PLC1_COM.GET_REQ; 
      R     #PLC1_COM.GET_ERROR_Save; 
NETWORK
TITLE =Pointer auf Daten in der Remote-SPS bilden (Quelle)

      LAR1  P##ADDR_Temp; //Anfangsadresse des ANY-Pointers in AR1 laden

      L     B#(16, 2); //Syntax-ID und Typ: Byte laden
      T     W [AR1,P#0.0]; 
      L     #wAdr_Len; //Transferlaenge
      T     W [AR1,P#2.0]; 
      L     #wAdr_DB; //Quelle-DB 
      T     W [AR1,P#4.0]; 
      L     P#DBX 0.0; //Anfangs-DW im Quell-DB
      L     #wAdr_Byte; 
      SLD   3; 
      +D    ; 
      T     LD [AR1,P#6.0]; 
NETWORK
TITLE =Pointer auf Daten in der Empfangs-SPS bilden (Ziel)

      LAR1  P##RD_Temp; //Anfangsadresse des ANY-Pointers in AR1 laden

      L     B#(16, 2); //Syntax-ID und Typ: Byte laden
      T     W [AR1,P#0.0]; 
      L     #wRD_Len; //Transferlaenge
      T     W [AR1,P#2.0]; 
      L     #wRD_DB; //Quelle-DB 
      T     W [AR1,P#4.0]; 
      L     P#DBX 0.0; //Anfangs-DW im Quell-DB
      L     #wRD_Byte; 
      SLD   3; 
      +D    ; 
      T     LD [AR1,P#6.0]; 
NETWORK
TITLE =Flanke zum Löschen der Daten im Empfangs-DB bei Start

      U     #bStart; 
      FP    #HM_FP_Start; 
      =     #FP_Start; 
NETWORK
TITLE =Daten im Empfangs-DB löschen bei Start
//Fill deaktiviert, da das zum Flackern beim Empfang führt !!!
      U(    ; 
      U     #FP_Start; 
      UN    #FP_Start; 
      SPBNB _001; 
      L     B#16#0; 
      T     #BVal; 
      SET   ; 
      SAVE  ; 
      CLR   ; 
_001: U     BIE; 
      )     ; 
      SPBNB _002; 
      CALL "FILL" (
           BVAL                     := #BVal,
           RET_VAL                  := #RetVal,
           BLK                      := #RD_Temp);
_002: NOP   0; 
NETWORK
TITLE =Daten von der Remote-SPS holen

      CALL #GET (
           REQ                      := #PLC1_COM.GET_REQ,
           ID                       := #wID,
           NDR                      := #PLC1_COM.GET_NDR,
           ERROR                    := #PLC1_COM.GET_ERROR,
           STATUS                   := #PLC1_COM.GET_STATUS,
           ADDR_1                   := #ADDR_Temp,//Quelle
           RD_1                     := #RD_Temp);//Ziel

NETWORK
TITLE =Busy bilden
//Start GET function with the rising edge of the start input if the GET function 
//is not BUSY.
//The REQ input parameter of the GET function is triggered with a rising edge and 
//BUSY is set as long as the GET function is not completed!
//
      U     #bStart; 
      S     #PLC1_COM.GET_REQ; 
      U(    ; 
      O     #PLC1_COM.GET_ERROR; 
      O     #PLC1_COM.GET_NDR; 
      )     ; 
      R     #PLC1_COM.GET_REQ; 
      NOP   0; 
NETWORK
TITLE =Stausinformationen im Errorfall speichern
//If ERROR occured then save STATUS!
//
      U     #PLC1_COM.GET_ERROR; 
      SPBNB _003; 
      L     #PLC1_COM.GET_STATUS; 
      T     #PLC1_COM.GET_STAT_SAVE; 
_003: NOP   0; 
NETWORK
TITLE =Error Speichern

      U     #PLC1_COM.GET_ERROR; 
      S     #PLC1_COM.GET_ERROR_Save; 
NETWORK
TITLE =Busy Kommunikation ausgeben

      U     #PLC1_COM.GET_REQ; 
      =     #Busy; 
NETWORK
TITLE =Error ausgeben

      U     #PLC1_COM.GET_ERROR_Save; 
      =     #Error; 
NETWORK
TITLE =Status ausgeben

      L     #PLC1_COM.GET_STATUS; 
      T     #State; 
      NOP   0; 
NETWORK
TITLE =Zurückübertragen der geretteten Adressregister

      LAR1  #RETTAR1; 
      LAR2  #RETTAR2; 
NETWORK
TITLE =

      U     #SAVE_VKE; 
      SAVE  ; 
      BE    ; 
END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
Zurück
Oben