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