TIA Knoten im Gehirn - 6FX2001-5QN25

Draco Malfoy

Level-1
Beiträge
1.168
Reaktionspunkte
82
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Aus vorstehendem Anlass (Implementierung eines Absoluwetrgebers obiger Marke, also "vernünftig" sprich mit Datenstrukturen und eigenem FB) habe ich ganz akut folgende Fragen:
- 1. Gibt es die Datenstrukturen der Siemens Telegramme 81, 82, 83, 84, 860 zusammen mit der Symbolisierung irgendwo zum Download, oder muss man sich das ausschließlich selber zusammenschreiben ?
- 2. Wie soll man sich die Datenstruktur eines DINT / UDINT im Speicher genau vorstellen (Siemens fordert mich auf, in einem UDINT die Bits auseinanderzudröseln...) - sind dort die HIGH und LOW Bytes und auch die Reihenfolge der Bytes (1,2,3,4) ebenfalls vertauscht ? Was ist jetzt die korrekte Reihenfolge - 2,1,4,3 oder 4,3,2,1 ?? Vielleicht hat für mich jemand die Symbolisierung eines DINT aufgelöst in seine Bits als UDT übrig.

Danke im Voraus !!
 
Hallo Drago,

soweit ich weiß, sind diese Telegrammtypen standardisiert. Ohne Gewähr.

Code:
TYPE "UDT_3.16"
VERSION : 0.1

  STRUCT  
   STANDARD_TELEGRAMM_81 : STRUCT  
    OUT : STRUCT  //Daten vom Master zum Sensor
     STW2 : STRUCT  //Steuerwort vom Master
      BIT_0 : BOOL ; //0  - ungenutzt
      BIT_1 : BOOL ; //1  - ungenutzt
      BIT_2 : BOOL ; //2  - ungenutzt
      BIT_3 : BOOL ; //3  - ungenutzt
      BIT_4 : BOOL ; //4  - ungenutzt
      BIT_5 : BOOL ; //5  - ungenutzt
      BIT_6 : BOOL ; //6  - ungenutzt
      BIT_7 : BOOL ; //7  - ungenutzt
      BIT_8 : BOOL ; //8  - ungenutzt
      BIT_9 : BOOL ; //9  - ungenutzt
      BIT_10 : BOOL ; //10 - ungenutzt
      BIT_11 : BOOL ; //11 - ungenutzt
      WATCHDOG_12 : BOOL ; //12 - Masterlebenszeichen 2^0
      WATCHDOG_13 : BOOL ; //13 - Masterlebenszeichen 2^1
      WATCHDOG_14 : BOOL ; //14 - Masterlebenszeichen 2^2
      WATCHDOG_15 : BOOL ; //15 - Masterlebenszeichen 2^3
     END_STRUCT ; 
     G1_STW1 : STRUCT  //Steuerwort vom Master
      BIT_0 : BOOL ; //0  - ungenutzt
      BIT_1 : BOOL ; //1  - ungenutzt
      BIT_2 : BOOL ; //2  - ungenutzt
      BIT_3 : BOOL ; //3  - ungenutzt
      BIT_4 : BOOL ; //4  - ungenutzt
      BIT_5 : BOOL ; //5  - ungenutzt
      BIT_6 : BOOL ; //6  - ungenutzt
      BIT_7 : BOOL ; //7  - ungenutzt
      BIT_8 : BOOL ; //8  - ungenutzt
      BIT_9 : BOOL ; //9  - ungenutzt
      BIT_10 : BOOL ; //10 - ungenutzt
      HOME_POSITION_MODE : BOOL ; //11 - 0=setzt Preset auf absoluten Wert / 1=verschiebt akt. Pos. um Preset
      PRESET : BOOL ; //12 - führt mit pos. Flanke Preset aus
      ISTWERT_2 : BOOL ; //13 - Übetragung Istwert 2 anfordern
      PARKEN : BOOL ; //14 - es werden keine Fehlermeldungen des Gebers ausgegeben
      QUITT : BOOL ; //15 - Quittieren eines Geberfehlers
     END_STRUCT ; 
    END_STRUCT ; 
    IN : STRUCT  //Daten vom Sensor zum Master
     ZSW2 : STRUCT  //Zustandswort vom Sensor
      BIT_0 : BOOL ; //0  - ungenutzt
      BIT_1 : BOOL ; //1  - ungenutzt
      BIT_2 : BOOL ; //2  - ungenutzt
      BIT_3 : BOOL ; //3  - ungenutzt
      BIT_4 : BOOL ; //4  - ungenutzt
      BIT_5 : BOOL ; //5  - ungenutzt
      BIT_6 : BOOL ; //6  - ungenutzt
      BIT_7 : BOOL ; //7  - ungenutzt
      BIT_8 : BOOL ; //8  - ungenutzt
      BIT_9 : BOOL ; //9  - ungenutzt
      BIT_10 : BOOL ; //10 - ungenutzt
      BIT_11 : BOOL ; //11 - ungenutzt
      WATCHDOG_12 : BOOL ; //12 - Slavelebenszeichen 2^0
      WATCHDOG_13 : BOOL ; //13 - Slavelebenszeichen 2^1
      WATCHDOG_14 : BOOL ; //14 - Slavelebenszeichen 2^2
      WATCHDOG_15 : BOOL ; //15 - Slavelebenszeichen 2^3
     END_STRUCT ; 
     G1_ZSW1 : STRUCT  //Zustandswort vom Sensor
      BIT_0 : BOOL ; //0  - ungenutzt
      BIT_1 : BOOL ; //1  - ungenutzt
      BIT_2 : BOOL ; //2  - ungenutzt
      BIT_3 : BOOL ; //3  - ungenutzt
      BIT_4 : BOOL ; //4  - ungenutzt
      BIT_5 : BOOL ; //5  - ungenutzt
      BIT_6 : BOOL ; //6  - ungenutzt
      BIT_7 : BOOL ; //7  - ungenutzt
      BIT_8 : BOOL ; //8  - ungenutzt
      BIT_9 : BOOL ; //9  - ungenutzt
      BIT_10 : BOOL ; //10 - ungenutzt
      QUITT_AKTIV : BOOL ; //11 - Quittieren eines Geberfehlers in Bearbeitung
      PRESET_BESTAETIGT : BOOL ; //12 - Ausführung Preset bestätigt
      ISTWERT_2_BESTAETIGT : BOOL ; //13 - Übertragung Istwert 2 bestätigt (ist unabhängig von Bit 13 in G1_STW)
      PARKEN_BESTAETIGT : BOOL ; //14 - es werden keine Fehlermeldungen des Gebers ausgegeben
      FEHLER : BOOL ; //15 - Fehlercode in G1_XIST2
     END_STRUCT ; 
     G1_XIST1 : DWORD ; //Rohwert des Gebers
     G1_XIST2 : DWORD ; //Rohwert, Presetwert, Fehlercode
    END_STRUCT ; 
   END_STRUCT ; 
  END_STRUCT ; 
END_TYPE

Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin. Vielen Dank für die schnelle Antwort. Bist Du Dir da sicher, daß kein Byte-Swapp erfolgen muss ??
Ich hatte es bisher in allen UDTs die zur Kommunikation mit externen Profibus Geräten gedacht sind, gesehen.
 
Vielen Dank im Voraus fürs Gucken.
... Wenn Du da auch ne elegante Lösung für nen Handshake-Zähler hättest, wäre das praktisch Gold wert ;-)
 
Würde sich ja anbieten, da direkt eine entsprechende Symbolisierung zu schreiben. Ich habe wie gesagt noch das Problem wie ich einen Handshake-Zähler vernünftig hinbekomme. Allerdings ist es im TIA und in SCL nochmals schwieriger wie klassisch, weil hier ja so gut wie gar keine verschiebungs-Operationen vernünftig gehen.

... ich weiß ehrlich gesagt überhaupt nicht, was ich mit diesen zahlreichen POKE_BLK, MOVE_BLK und MOVE_BLK VARIANT anfangen soll. Will ja bloß ein Paar Bits verschieben.

P.S: Schade daß es von Siemens keine fertigen UDTs gibt, so wie TLG111 im Beispielprojekt mit UDT3000 ... 3008
 
In meinem UDT sind die ersten beiden WORDs unter "OUT" strukturiert. Das sind Daten die du zu dem Geber schickst, also Ausgänge.
Das mit dem Handshake ist mir fremd. Ich habe damals einfach nur den Wert ausgelesen, Preset-Funktion, Fehlerauswertung, Lebensmerker, Quittierung.
 
OK. AWs verstanden. Wegen Handshake steht in der Betriebsanleitung folgendes (Seite 25):
Hinweis
Wenn der MC-ENCODER einen Fehler im Lebenszeichen der Steuerung erkennt, stoppt er
die Übertragung des Lebenszeichens an die Steuerung. Das bedeutet, dass ein fehlendes
Lebenszeichen (=0) vom MC-ENCODER an die Steuerung auch die Folge eines Fehlers im
Lebenszeichen der Steuerung an den MC-ENCODER. sein kann.
Ich weiß nicht, ob der Sensor wegen fehlendem Zählwert auch sonst nocht irgendwelche Fehler melden wird ?
Bei Dir hat er das nicht getan, sagste ? Was meinst Du dann mit Lebensmerker ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Im Statuswort "G1_XIST2" werden Fehler gemeldet. Ob diese Fehlercodierung auch standardisiert ist, weiß ich nicht. Ich hatte damals Geräte von Leine & Linde.

Code:
//*** Sensorgruppenfehler
      L     "DB_ENCODER_1".TELEGRAMM_81.STANDARD_TELEGRAMM_81.IN.G1_XIST2
      L     W#16#1
      ==I   
      =     #FEHLER_ALLGEMEIN

//*** Der Befehl wird nicht unterstützt
      TAK   
      L     W#16#F01
      ==I   
      =     #FEHLER_BEFEHL

//*** Master-Lebenszeichenfehler
      TAK   
      L     W#16#F02
      ==I   
      =     #FEHLER_MLS

//*** Synchronisationsfehler
      TAK   
      L     W#16#F04
      ==I   
      =     #FEHLER_SYSNCHRONISATION

//*** Slave-Lebenszeichenfehler
      U     #TAKTSYNCHRON
      =     #TEMP
      CALL  #WATCHDOG
       WATCHDOG         :="DB_ENCODER_1".TELEGRAMM_81.STANDARD_TELEGRAMM_81.IN.ZSW2.WATCHDOG_15
       FREIGABE         :=#TEMP
       UEBERWACHUNGSZEIT:=T#1S
       TIME_OVER        :=#FEHLER_SLS

//*** Fehler quittieren
      U     #QUITT
      =     "DB_ENCODER_1".TELEGRAMM_81.STANDARD_TELEGRAMM_81.OUT.G1_STW1.QUITT


"#TAKTSYNCHRON" ist bei mir ein Bausteineingang, der auf false gesetzt ist. Frage mich jetzt nicht warum. Ich glaube, das hatte ich nur bei der Inbetriebnahme genutzt.
Es gibt jeweils vier Bit als Watchdog, die zusammen einen Zähler von 0..15 darstellen. Wenn ich mich recht entsinne, bekommt man einen laufenden Zähler zurück,
wenn man auch einen Zählerwert hinschickt.

Code:
      L     2#0
      U     #TAKTSYNCHRON
      SPBN  M002
      L     DB10.DBB    1
      SRW   4
      L     15
      MOD   
      +     1
      SLW   4
M002: T     DB10.DBB    1
 
... für alle Standardtelegramme zu SINAMICS- Umrichtern, gibt es UDT`s im TIAP (im SINAMICS S gibt es dann auch die Geber- Telegramme):
http://support.automation.siemens.com/WW/view/de/82841762

Ich hätte schwören können, daß es das irgendwo gibt, und siehe - es gibt es. Vielen Dank für den Hinweis.
Die Symbolisierung ist allerdings ziemlich lustig - ich weiß nicht, ob es Geber gibt, die etwa eine Haltebremse mitbringen ??

Siehe Screenshot:SINAMICS_TIAP.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich poste mal meinen Baustein hierher. Gibt ja bestimmt mehr Leute, die womöglich diese Geber anbinden wollen.
Code:
FUNCTION_BLOCK "FB 2_ABSOLUTWERTGEBER"
TITLE = FB 8_6FX2001-5QN25
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : Malfoy
FAMILY : DRIVES
NAME : '0102'
VERSION : 0.1
//Baustein zur Kommunikation mit einem Profinet Absolutwert-Drehgeber 6FX2001-5QE25;
//Unterstützt: - Lageistwert, Istgeschwindigkeit, Skalierung des Lageistwertes;
//Ausgabe: Inkrements gemäß der Einstellung des Gebers in HW-Config;
   VAR_INPUT 
      G1_XIST_PRESET_A : DInt;   // Offset-Vorabwert zur Geberjustage (Geberoffset)
      SKALIERUNGSFAKTOR : DInt;   // INK pro Umdrehung
      QUIT_IMP : Bool;   // Anforderung, einen Sensorfehler zu quittieren / zurückzusetzen.
      HOMING : Bool;   // Preset (bzw. Verschiebung) wird gesetzt, wenn dieses Bit auf „1“ geändert wird (steigende Flanke). Standard-Preset-Wert (Verschiebung): 0
      DB_NR : DInt;   // Nummer des zugehörigen Instanzdatenbausteins
      LADDR : HW_IO;   // Hardware_ID
   END_VAR

   VAR_OUTPUT 
      G1_XIST1 : DInt;   // Aktueller Lageistwert des Absolutwertgebers
      NIST_B : DInt;   // Aktuelle Istgeschwindigkeit des Absolutwertgebers in %% von dem Sollwert
      "Steuerung angefordert" : Bool;   // Das Automatisierungssystem wird aufgefordert, die Steuerung zu übernehmen, die Daten sind gültig.
      "Quittierung läuft" : Bool;   // Wird gesetzt, während die angeforderte Fehlerquittierung verarbeitet wird. Handshake-Signal zu G1_STW Bit 15.
      "Geberjustage erfolgreich" : Bool;
      "Geber betriebsbereit" : Bool;   // Geber ist nach dem Start betriebsbereit und liefert einen gültigen Lageistwert
      Fehlercode : Int;   // Geberfehlerkodierung
      FEHLER_ALLGEMEIN : Bool;   // Sensorgruppenfehler
      FEHLER_BEFEHL : Bool;   // Der Befehl wird nicht unterstützt
      FEHLER_MLS : Bool;   // Master-Lebenszeichenfehler
      FEHLER_SYSNCHRONISATION : Bool;   // Synchronisationsfehler
      EHLER_SLS : Bool;   // Slave-Lebenszeichenfehler
   END_VAR

   VAR_IN_OUT 
      "BLOCK_DB" : DB_ANY;   // Zeiger auf den Ablageort der Lagedaten
   END_VAR

   VAR 
      G1_XIST1_INT : DInt;   // Sensor-Lageistwert 1
      G1_XIST2_INT : DInt;   // Sensor-Lageistwert 2
      G1_XIST3_INT : DInt;   // Sensor-Lageistwert 3
      G1_XIST_PRESET_A_INT : UDInt;   // Sensorlage Preset-Steuerwort 32 Bit
      NIST_A_INT : Int;   // Geschwindigkeitswert A
      NIST_B_INT : DInt;   // Geschwindigkeitswert B
      RET_VAL : Int;
      Lebenszeichenzähler { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Int;
      TELEGRAMM_81 : "TELEGRAMM_81";
      TELEGRAMM_82 : "TELEGRAMM_82";
      TELEGRAMM_83 : "TELEGRAMM_83";
      TELEGRAMM_84 : "TELEGRAMM_84";
      TELEGRAMM_860 : "TELEGRAMM_860";
      EINGANGS_PDZ : Array[1..2] of Word;
      AUSGANGS_PDZ : Array[1..7] of Word;
   END_VAR


BEGIN
    //Konsistente Daten eines DP-Normslaves lesen:
    #RET_VAL := DPRD_DAT(LADDR := #LADDR, RECORD=> #TELEGRAMM_82."Eingabedaten (PZD/Wort)");
    //Berechnung des Zählwertes für Lebenszeichenzähler
    IF #Lebenszeichenzähler < 15 THEN
        #Lebenszeichenzähler := #Lebenszeichenzähler + 1;
    ELSE
        #Lebenszeichenzähler := 1;
    END_IF;
    // Übertragung des Zählwertes in das Geber-Steuerwort
    POKE_BLK(area_src:= 16#84 ,
             dbNumber_src:= #DB_NR,
             byteOffset_src:= 56,
             area_dest:= 16#84,
             dbNumber_dest:= #DB_NR,
             byteOffset_dest:= 74,
             count:= 2);
    // Setzen der restlichen Bits im "Steuerwort des Gebers"
    #TELEGRAMM_82."Ausgabedaten (PZD/Wort)".G1_STW.G1_STW.Bit11 := false;
    #TELEGRAMM_82."Ausgabedaten (PZD/Wort)".G1_STW.G1_STW.Bit12 := #HOMING;
    #TELEGRAMM_82."Ausgabedaten (PZD/Wort)".G1_STW.G1_STW.Bit13 := true;
    #TELEGRAMM_82."Ausgabedaten (PZD/Wort)".G1_STW.G1_STW.Bit14 := false;
    #TELEGRAMM_82."Ausgabedaten (PZD/Wort)".G1_STW.G1_STW.Bit15 := #QUIT_IMP;
    // Setzen der restlichen Bits im "Steuerwort des Encoders"
    #TELEGRAMM_82."Ausgabedaten (PZD/Wort)".STW2_ENC.STW2_ENC.Bit10 := true;
    // Überprüfung der Fehlerzustände
    IF #TELEGRAMM_82."Eingabedaten (PZD/Wort)".G1_ZSW.G1_ZSW.Bit15 THEN
        #Fehlercode := UDINT_TO_INT(#TELEGRAMM_82."Eingabedaten (PZD/Wort)".G1_XIST2);
    ELSE
        #Fehlercode := 0;
    END_IF;
    // Auswertung der Fehlerzustände
    CASE UDINT_TO_INT(#TELEGRAMM_82."Eingabedaten (PZD/Wort)".G1_XIST2) OF
        16#1 :
            #FEHLER_ALLGEMEIN := true; //*** Sensorgruppenfehler      
        16#F01 :
            #FEHLER_BEFEHL := true;
        16#F02 :
            #FEHLER_MLS := true;
        16#F04 :
            #FEHLER_SYSNCHRONISATION := true;
    END_CASE;
    // Meldung "Betriebsbereit"
    IF #TELEGRAMM_82."Eingabedaten (PZD/Wort)".ZSW2_ENC.ZSW_ENC.Bit9 AND NOT #TELEGRAMM_82."Eingabedaten (PZD/Wort)".G1_ZSW.G1_ZSW.Bit15 THEN
        #"Geber betriebsbereit" := #TELEGRAMM_82."Eingabedaten (PZD/Wort)".ZSW2_ENC.ZSW_ENC.Bit9;
    ELSE
        #"Geber betriebsbereit" := false;
    END_IF;
    // Meldung "Geberjustage erfolgreich"
    #"Geberjustage erfolgreich" := #TELEGRAMM_82."Eingabedaten (PZD/Wort)".G1_ZSW.G1_ZSW.Bit12;
    // Meldung "Steuerung angefordert"
    #"Steuerung angefordert" := #TELEGRAMM_82."Eingabedaten (PZD/Wort)".ZSW2_ENC.ZSW_ENC.Bit9;
    // Übertragung des Istwertes
    #G1_XIST1 := UDINT_TO_DINT(#TELEGRAMM_82."Eingabedaten (PZD/Wort)".G1_XIST1);
    // Übertragung der Ist-Geschwindigkeit
    #NIST_B := SCALE_X(MIN := 0, VALUE := #TELEGRAMM_82."Eingabedaten (PZD/Wort)".NIST_A, MAX := 16#4000);
    // Konsistente Daten eines DP-Normslaves schreiben
    #RET_VAL := DPWR_DAT(LADDR := #LADDR, RECORD := #TELEGRAMM_82."Ausgabedaten (PZD/Wort)");
    
END_FUNCTION_BLOCK
 
Hallo Malfoy,

ich habe einen Siemens MC-Encoder 6FX2001-5WN25 und möchte den Geberistwert bekommen. Kann ich dafür Deinen Baustein benutzen? Dazu benötige ich den UDT "TELEGRAMM_82", oder? Wo bekomme ich diesen, ist der Standard in TIA? Eigentlich würde mir das Telegramm 81 reichen, ich brauche nur den Istwert. Oder reicht es "feste" Werte einzugeben, siehe FAQ von Siemens: https://support.industry.siemens.co...der-profinet-steuerbits-setzen?dti=0&lc=de-WW

Danke Vorab!


Viele Grüße
Buck412
 
Zurück
Oben