FUNCTION_BLOCK FB100
TITLE = 'Kommunikation Rexroth'
VERSION : '0.1'
VAR_INPUT
Per_Handshake : INT ; //1. Peripherie-Adresse Handshake mit Servo
Freigabe : BOOL ; //Freigabe Servo-Achse
Quit_Stoerung : BOOL ; //Quittierung Störung
Referenz_Fahrt : BOOL ; //Fahr-Ablauf "Referenz-Fahrt"
Steu_Funkt_Tippen_vor : BOOL ; //Fahren "Tippen vor"
Steu_Funkt_Tippen_zur : BOOL ; //Fahren "Tippen zurück"
Steu_Funkt_Geschw_Tippen : REAL ; //Geschwindigkeit Tipp-Betrieb
Fahr_Da_Setzen : BOOL ;//Fahrdaten übernehmen
Fahr_Da_Start_in_Pos : BOOL ; //Fahre auf Position [Fahrdaten]
Fahr_Da_Ziel_Pos : REAL ; //- Fahrauftrag : Ziel-Position
Fahr_Da_Geschw : REAL ; //- Fahrauftrag : Geschwindigkeit
Fahr_Da_Drehm : REAL ; //- Fahrauftrag : Drehmoment
END_VAR
VAR_OUTPUT
OUT_Servo_bereit : BOOL ; //Servo-Achse bereit
OUT_Servo_DiagnoseFehler : BOOL ; //Servo-Achse Diagnose-Fehler
OUT_Servo_Referenz_OK : BOOL ; //Servo-Achse in Referenz
OUT_Servo_Arbeitsbereich : BOOL ; //Servo-Achse im Arbeitsbereich
OUT_Set_Daten_OK : BOOL ; //neue Fahr-Daten eingetragen
OUT_Fahren_Ready : BOOL ; //Fahr-Programm beendet
OUT_Ist_Position : REAL ; //akt. Position Servo-Achse
END_VAR
VAR
Servo_Read_Daten : STRUCT
Status_Regler : STRUCT //P-0-4078
Ist_Betriebsart_1 : BOOL ; //00=Hauptbetriebsart / 01 - 11 = Nebenbetriebsarten
Ist_Betriebsart_2 : BOOL ;
Sollwert_Quit : BOOL ; //1=Fahrbefehl ist übernommen
Meldung_Zustand_1 : BOOL ;
Meldung_Zustand_2 : BOOL ;
Meldung_Zustand_3 : BOOL ;
betriebsbereit_1 : BOOL ;
betriebsbereit_2 : BOOL ;
Betriebsmodus_Quit_1 : BOOL ; //10=Betriebs-Modus
Betriebsmodus_Quit_2 : BOOL ;
Referenz_OK : BOOL ;
Stillstand_Achse : BOOL ;
Sollwert_erreicht : BOOL ;
Kommando_Aenderung : BOOL ;
Betriebsmodus_Fehler : BOOL ;
Status_Sollwert : BOOL ; //0=Antrieb folgt Vorgabe / 1=nicht
END_STRUCT ;
Fahrbereichs_Endschalter : STRUCT //P-0-0222
x10 : BOOL ;
x11 : BOOL ;
x12 : BOOL ;
x13 : BOOL ;
x14 : BOOL ;
x15 : BOOL ;
x16 : BOOL ;
x17 : BOOL ;
Endschalter_1 : BOOL ;
Endschalter_2 : BOOL ;
x02 : BOOL ;
x03 : BOOL ;
x04 : BOOL ;
x05 : BOOL ;
x06 : BOOL ;
x07 : BOOL ;
END_STRUCT ;
dummi : WORD ; //S-0-0000
Ist_Position : DINT ; //S-0-0386
Drehmoment : INT ; //S-0-0084
[B][COLOR=#ff0000]Diagnose_Nr : DWord ;[/COLOR][/B] //S-0-0390
END_STRUCT ;
Servo_Write_Daten : STRUCT
Steuern_Regler : STRUCT //P-0-4077
Betriebsart_1 : BOOL ; //00=Hauptbetriebsart / 01 - 11 = Nebenbetriebsarten
Betriebsart_2 : BOOL ;
Res_1 : BOOL ;
Res_2 : BOOL ;
IPos_Sync : BOOL ;
Antrieb_Halt : BOOL ;
Antriebs_Freigabe : BOOL ;
Regler_Freigabe : BOOL ;
Sollwert_Uebernahme : BOOL ; //Toggle
Betriebsmodus : BOOL ;
Referenzfahrt : BOOL ;
Positioniermodus : BOOL ; //0=absolut / 1=relativ
Satzwechsel_Modus : BOOL ; //0=letzte Pos. muss abgeschlossen sein / 1=egal
Reset_Fehler : BOOL ;
Tippen_Pos : BOOL ;
Tippen_Neg : BOOL ;
END_STRUCT ;
Signal_Steuerwort : STRUCT //S-0-0145
x10 : BOOL ;
x11 : BOOL ;
x12 : BOOL ;
x13 : BOOL ;
x14 : BOOL ;
x15 : BOOL ;
x16 : BOOL ;
x17 : BOOL ;
Fahren_auf_Festanschlag : BOOL ; //S-0-0149
Antrieb_referenzieren : BOOL ; //S-0-0148
Referenzbezug_loeschen : BOOL ; //S-0-0191
x03 : BOOL ;
x04 : BOOL ;
x05 : BOOL ;
x06 : BOOL ;
x07 : BOOL ;
END_STRUCT ;
dummi : WORD ; //S-0-0000
Ziel_Position : DINT ; //S-0-0282 - 4 NK-Stellen
Fahr_Geschwindigkeit : DINT ; //S-0-0259 - 4 NK-Stellen
LR_Kraft_Grenzwert : INT := 500; //S-0-0092 - 0 NK-Stellen
END_STRUCT ;
Faktor_Anpassung : STRUCT
Position : REAL := 1.000000e+004;
Geschwindigkeit : REAL := 1.000000e+003;
Drehmoment : REAL := 1.000000e+000;
END_STRUCT ;
END_VAR
VAR_TEMP
Word_Per_Handshake : WORD ;
R_Fehler : INT ;
W_Fehler : INT ;
END_VAR
// Kopplung an Servo Regler - Auslesen
Word_Per_Handshake:=INT_TO_WORD(Per_Handshake);
DPRD_DAT(LADDR:=Word_Per_Handshake,RET_VAL:=R_Fehler,RECORD:=Servo_Read_Daten)
// Ziel Positionen setzen
[U][B]IF Fahr_Da_Setzen AND NOT OUT_Set_Daten_OK THEN[/B]
[B]Servo_Write_Daten.Ziel_Position:=[COLOR=#ff0000]REAL_to_DINT[/COLOR](Signal_Steuerwort.Ziel_Position*Faktor_Anpassung.Position);[/B][/U]
Servo_Write_Daten.Fahr_Geschwindigkeit:=[COLOR=#ff0000][B][U]REAL_to_DINT[/U][/B][/COLOR](Faktor_Anpassung.Geschwindigkeit*Faktor_Anpassung.Geschwindigkeit);
[U][B] Servo_Write_Daten.LR_Kraft_Grenzwert:=[COLOR=#ff0000][B][U]REAL_to_INT[/U][/B][/COLOR]((INT_TO_REAL(Servo_Read_Daten.Drehmoment))*Faktor_Anpassung.Drehmoment);[/B][/U]
OUT_Set_Daten_OK:=true;
[U][B]END_IF;[/B][/U]
// Servo_Achse bereit
OUT_Servo_bereit:=Servo_Read_Daten.Status_Regler.betriebsbereit_1 AND
Servo_Read_Daten.Status_Regler.betriebsbereit_2 AND NOT
Servo_Read_Daten.Status_Regler.Betriebsmodus_Fehler;
// Servo-Achse in Referenz
OUT_Servo_Referenz_OK:=Servo_Read_Daten.Status_Regler.Referenz_OK;
OUT_Fahren_Ready:=Fahr_Da_Start_in_Pos AND
Servo_Write_Daten.Steuern_Regler.Sollwert_Uebernahme AND
Servo_Read_Daten.Status_Regler.Sollwert_Quit AND
Servo_Read_Daten.Status_Regler.Sollwert_erreicht AND
Servo_Read_Daten.Status_Regler.Stillstand_Achse;
// Fehlerdiagnose
[U][B]IF Servo_Read_Daten.Diagnose_Nr<>DW#16#A0160 AND
Servo_Read_Daten.Diagnose_Nr<>DW#16#A0161 AND Servo_Read_Daten.Diagnose_Nr<>DW#16#A0012 AND[/B][B] Servo_Read_Daten.Diagnose_Nr<>DW#16#A1300 AND Servo_Read_Daten.Diagnose_Nr<>DW#16#A8260 THEN[/B][/U]
OUT_Servo_DiagnoseFehler:=true;
END_IF;
// Ist Position
OUT_Ist_Position:=(DINT_TO_REAL(Servo_Read_Daten.Ist_Position))/Faktor_Anpassung.Position;
// Steuerfunktionen
Servo_Write_Daten.Steuern_Regler.Antrieb_Halt:=Freigabe AND NOT Quit_Stoerung;
Servo_Write_Daten.Steuern_Regler.Antriebs_Freigabe:=Freigabe AND NOT Quit_Stoerung;
Servo_Write_Daten.Steuern_Regler.Regler_Freigabe:=Freigabe AND NOT Quit_Stoerung;
// Störung quittieren
Servo_Write_Daten.Steuern_Regler.Reset_Fehler:=Quit_Stoerung;
// Referenzfahrt
Servo_Write_Daten.Signal_Steuerwort.Antrieb_referenzieren:=Referenz_Fahrt AND Freigabe;
// Sollwertübernahme
Servo_Write_Daten.Steuern_Regler.Sollwert_Uebernahme:=Fahr_Da_Start_in_Pos AND Freigabe;
// Anstatt VKE auf Null???
Servo_Write_Daten.Steuern_Regler.Positioniermodus:=0;
Servo_Write_Daten.Steuern_Regler.Satzwechsel_Modus:=0;
// Tippen vorwärts
Servo_Write_Daten.Steuern_Regler.Tippen_Pos:=Steu_Funkt_Tippen_vor AND NOT Steu_Funkt_Tippen_zur;
// Tippen zurück
Servo_Write_Daten.Steuern_Regler.Tippen_Neg:=Steu_Funkt_Tippen_zur AND NOT Steu_Funkt_Tippen_vor;
IF Servo_Write_Daten.Steuern_Regler.Tippen_Pos OR
Servo_Write_Daten.Steuern_Regler.Tippen_Neg THEN
Faktor_Anpassung.Geschwindigkeit:=ROUND(Steu_Funkt_Geschw_Tippen*Faktor_Anpassung.Geschwindigkeit);
[U] [B] Servo_Write_Daten.LR_Kraft_Grenzwert:=[COLOR=#ff0000][B][U]REAL_to_INT[/U][/B][/COLOR]((DINT_TO_REAL(100))*Faktor_Anpassung.Drehmoment);[/B][/U]
ELSE
Servo_Write_Daten.Fahr_Geschwindigkeit:=0;
Servo_Write_Daten.LR_Kraft_Grenzwert:=0;
END_IF;
// Kopplung an Servo-Regler - Rückschreiben
Servo_Write_Daten.LR_Kraft_Grenzwert:= 1200;
DPWR_DAT(LADDR:=Word_Per_Handshake,RECORD:=Servo_Write_Daten,RET_VAL:=W_Fehler)
[U][B]END_FUNCTION_BLOCK[/B][/U]