BEGIN PGM 25X_SLOT MM 
*############################
*# Hauptfunktion der Nutenzyklen
*# Nr.: 253 / 254
*# 25.11.2008 lb
*# letzte Korrektur: 29.09.2009 lb
*############################
; 
*############################
*# global belegte Parameter und Konstanten
*############################
; Q40                               aktive Zyklusnummer
; Q41                               Massfaktor Ebene
; Q42                               Massfaktor Werkzeugachse
; Q43                               Werkzeugradius * Messfaktor Ebene
; 
; Q50                               Anzahl Zustellungen
; Q51                               aktuelle Tiefe
; Q52                               Starthoehe
; Q53                               Zustellung
; Q54                               ; Ueberlappungsfaktor fr seitl Zustellung
; Q55                               ; Anfahrradius
Q56 = 3 / 4 ; Ueberlappungsfaktor fuer Ebenenzustellung
Q57 = 999 / 1000 ; Summand zur Berechnung der Zustellungsanzahl
; 
; Q60                               Sichere Hoehe absolut
; Q61                               Tiefe absolut
; Q62                               Schrupptiefe absolut
; Q63                               halbe Schruppbreite
; Q64                               halbe Schlichtbreite
; Q65                               Hoehe auf Sicherheitsabstand ueber Nut
; Q66                               Starthoehe fuer Schlichten
; Q69                               Bearbeitungssinn +1 / -1
; 
; Q70                               akt. Nut: Drehlage (Mittelpunktswinkel)
; Q73                               akt. Nut: Startwinkel
; Q74                               akt. Nut: Endwinkel
; Q79                               Nutenzaehler
; 
; Q80                               1. Nut: Drehlage (Mittelpunktswinkel)
; Q81                               1. Nut: TeilkreisMitte X
; Q82                               1. Nut: TeilkreisMitte Y
; Q83                               1. Nut: Startwinkel
; Q84                               1. Nut: Endwinkel
; Q85                               Teilkreisradius
; 
; Q90                               aktive Werkzeugachse 0 / 1 / 2
; Q95                               R - Werkzeug
; Q96                               R2 - Werkzeug
; Q97                               Spindeldrehrichtung M3==+1 M4==-1
; Q98                               LCUTS
; Q99                               ANGLE
; 
*############################
*# Strings deklarieren
*############################
DECLARE STRING QS0
DECLARE STRING QS1
DECLARE STRING QS2
*############################
*# aktive Zyklusnummer lesen
*############################
FN 18: SYSREAD Q40 = ID10 NR3 ; aktive Zyklusnummer
;Q40 = 253                              ; Zyklusnummer default nur fr TEST !
;426 = 0                                ; Strategie default nur fr TEST !
*############################
*# Keine Bearbeitung bei Tiefe == 0
*############################
FN 9: IF +Q201 EQU +0 GOTO LBL "END"
*############################
*# Lesen der Werkzeug- und Konfigdaten
*############################
FN 18: SYSREAD Q90 = ID20 NR3 ; aktive Werkzeugachse
FN 18: SYSREAD Q95 = ID950 NR2 ; R
FN 18: SYSREAD Q96 = ID950 NR3 ; R2
FN 18: SYSREAD Q98 = ID950 NR13 ; LCUTS
FN 18: SYSREAD Q99 = ID950 NR14 ; ANGLE
*############################
*# Massfaktor
*# korrigiere Werkzeugradius anhand Massfaktor
*# Prfe Massfaktoren in Ebene gleich
*############################
FN 10: IF +Q90 NE +0 GOTO LBL "SCALE_TOOLX"
FN 18: SYSREAD Q41 = ID210 NR4 IDX2
FN 18: SYSREAD Q42 = ID210 NR4 IDX1
FN 18: SYSREAD Q0 = ID210 NR4 IDX3
FN 9: IF +Q0 EQU +Q41 GOTO LBL "SCALE_TOOLX"
FN 14: ERROR= 1108
LBL "SCALE_TOOLX"
; 
FN 10: IF +Q90 NE +1 GOTO LBL "SCALE_TOOLY"
FN 18: SYSREAD Q41 = ID210 NR4 IDX1
FN 18: SYSREAD Q42 = ID210 NR4 IDX2
FN 18: SYSREAD Q0 = ID210 NR4 IDX3
FN 9: IF +Q0 EQU +Q41 GOTO LBL "SCALE_TOOLY"
 FN 14: ERROR= 1108
 LBL "SCALE_TOOLY"
 ; 
 FN 10: IF +Q90 NE +2 GOTO LBL "SCALE_TOOLZ"
 FN 18: SYSREAD Q41 = ID210 NR4 IDX1
 FN 18: SYSREAD Q42 = ID210 NR4 IDX3
 FN 18: SYSREAD Q0 = ID210 NR4 IDX2
 FN 9: IF +Q0 EQU +Q41 GOTO LBL "SCALE_TOOLZ"
 FN 14: ERROR= 1108
 LBL "SCALE_TOOLZ"
 Q43 = Q108 / Q41 ; korrigierter Werkzeugradius
 Q54 = ( ( Q95 - Q96 ) / Q95 ) * 7 / 8 ; berlappungsfaktor
 FN 11: IF +Q54 GT +0.03125 GOTO LBL "Faktor-Begrenzung"
 Q54 = 0.03125 ;entspricht 1/32
 LBL "Faktor-Begrenzung"
 Q55 = 17 / 8 / Q41 ; Faktor fr Anfahrradius
 *############################
 *# Fehlermeldungen ausgeben
 *############################
 CALL PGM 25x_SlotError
 *############################
 *# Bearbeitungssinn unter Beruecksichtigung
 *# der Spindeldrehrichtung und
 *# Spiegelung definieren
 *############################
 FN 18: SYSREAD Q9 = ID210 NR3 ; Spiegelung
 Q69 = Q97 * Q351 ; Bearbeitungssinn
 ; 
 FN 9: IF +Q9 EQU +0 GOTO LBL "MIRROR_DIR_INV"
 FN 9: IF +Q9 EQU +7 GOTO LBL "MIRROR_DIR_INV"
 ; 
 FN 10: IF +Q90 NE +0 GOTO LBL "MIRROR_TOOLX"
 FN 9: IF +Q9 EQU +1 GOTO LBL "MIRROR_DIR_INV"
 FN 9: IF +Q9 EQU +6 GOTO LBL "MIRROR_DIR_INV"
 Q69 = - Q69 ; negieren
 LBL "MIRROR_TOOLX"
 ; 
 FN 10: IF +Q90 NE +1 GOTO LBL "MIRROR_TOOLY"
 FN 9: IF +Q9 EQU +2 GOTO LBL "MIRROR_DIR_INV"
 FN 9: IF +Q9 EQU +5 GOTO LBL "MIRROR_DIR_INV"
 Q69 = - Q69 ; negieren
 LBL "MIRROR_TOOLY"
 ; 
 FN 10: IF +Q90 NE +2 GOTO LBL "MIRROR_TOOLZ"
 FN 9: IF +Q9 EQU +3 GOTO LBL "MIRROR_DIR_INV"
 FN 9: IF +Q9 EQU +4 GOTO LBL "MIRROR_DIR_INV"
 Q69 = - Q69 ; negieren
 LBL "MIRROR_TOOLZ"
 ; 
 LBL "MIRROR_DIR_INV"
 ; 
 *############################
 *# In Werkzeugachssystem transformieren
 *############################
 FN 17: SYSWRITE ID 212 =+3
 ; 
 *############################
 *# Kontur der ersten Nut berechnen
 *############################
 CALL PGM 25x_SlotPosition
 Q73 = Q83 ; init akt. Startwinkel
 ; 
 *############################
 *# globale Geometriedaten berechnen
 *############################
 Q200 = ABS ( Q200 ) ; Sicherheitsabstand
 Q204 = ABS ( Q204 ) ; 2.Sicherheitsabstand
 FN 11: IF +Q204 GT +Q200 GOTO LBL "SAFE_HIGHT"
 Q60 = Q203 - SGN ( Q201 ) * Q200 ; Sichere Hoehe
 FN 9: IF +0 EQU +0 GOTO LBL "SAFE_HIGHT_END"
 LBL "SAFE_HIGHT"
 Q60 = Q203 - SGN ( Q201 ) * Q204 ; Sichere Hoehe
 LBL "SAFE_HIGHT_END"
 Q61 = Q203 + Q201 ; Tiefe gesamt absolut
 Q62 = Q61 - SGN ( Q201 ) * Q369 ; Schrupptiefe absolut
 Q64 = Q219 / 2 ; halbe Schlichtbreite
 Q65 = Q203 - SGN ( Q201 ) * Q200 ; Position auf Sicherheitsabstand
 *############################
 *# Bearbeitung aller Nuten
 *############################
 Q79 = 0 ; init Nutenzaehler
 LBL "LOOP_SLOTS"
 ; 
 FN 10: IF +Q40 NE +254 GOTO LBL "ROT254" ; rotiere Runde Nuten
 CALL LBL "SLOT_ROT"
 LBL "ROT254"
 ; 
 *############################
 *# Vorpositionieren
 *############################
 FN 10: IF +Q367 NE +0 GOTO LBL "PREPOS_RETREAT"
 FN 10: IF +Q90 NE +0 GOTO LBL "TOOLAX_POS_X"
 FN 18: SYSREAD Q3 = ID270 NR1 IDX1 ; Werkzeugachse
 LBL "TOOLAX_POS_X"
 FN 10: IF +Q90 NE +1 GOTO LBL "TOOLAX_POS_Y"
 FN 18: SYSREAD Q3 = ID270 NR1 IDX2 ; Werkzeugachse
 LBL "TOOLAX_POS_Y"
 FN 10: IF +Q90 NE +2 GOTO LBL "TOOLAX_POS_Z"
 FN 18: SYSREAD Q3 = ID270 NR1 IDX3 ; Werkzeugachse
 LBL "TOOLAX_POS_Z"
 FN 11: IF +Q3 GT +Q60 GOTO LBL "PREPOS_RETREAT"
 L  Z+Q60 R0 FMAX
 LBL "PREPOS_RETREAT"
 CC  X+Q81  Y+Q82
 LP  PR+Q85  PA+Q73 R0 FMAX
 L  Z+Q65 R0 FMAX
 ;/********************************************
 * Schruppen
 ;*********************************************/
 FN 9: IF +Q215 EQU +2 GOTO LBL "ROUGH_END"
 ;/****************************************
 * Zustellung auf Tiefe begrenzen
 * wenn LCUTS definiert,
 * dann Zustellung begrenzen
 * ( keine LCUTS-Begrenzung bei Strategie 1)
 ;*****************************************/
 Q53 = Q202
 Q0 = ABS ( Q201 )
 FN 12: IF +Q53 LT +Q0 GOTO LBL "PLUNGE_DEPTH"
 Q53 = Q0
 LBL "PLUNGE_DEPTH"
 ; 
 FN 9: IF +Q98 EQU +0 GOTO LBL "PLUNGE_DEPTH_LIMIT"
 FN 12: IF +Q53 LT +Q98 GOTO LBL "PLUNGE_DEPTH_LIMIT"
 FN 9: IF +426 EQU +1 GOTO LBL "PLUNGE_DEPTH_LIMIT"
 Q53 = Q98
 LBL "PLUNGE_DEPTH_LIMIT"
 ;/****************************************
 * Schruppen ausfuehren
 ;*****************************************/
 QL0 = Q200 * - SGN ( Q201 ) ; Sicherheitsabstand vorzeichenbehaftet
 Q52 = Q203 - SGN ( Q201 ) * Q200 ; init Starthhe
 Q50 = 1 ; init Zaehler Zustellungen
 LBL "ROUGH_PLUNGE"
 Q51 = Q203 + SGN ( Q201 ) * Q50 * Q53 ; aktuelle Tiefe
 FN 12: IF +Q201 LT +0 GOTO LBL "ROUGTH_WORK_NEG"
 FN 12: IF +Q51 LT +Q62 GOTO LBL "ROUGH_DEPTH"
 Q51 = Q62 ; akt. Tiefe bei positiver Richtung begrenzen
 FN 9: IF +0 EQU +0 GOTO LBL "ROUGH_DEPTH"
 LBL "ROUGTH_WORK_NEG"
 FN 11: IF +Q51 GT +Q62 GOTO LBL "ROUGH_DEPTH"
 Q51 = Q62 ; akt. Tiefe bei negativer Richtung begrenzen
 LBL "ROUGH_DEPTH"
 CC  X+Q81  Y+Q82
 LP  PR+Q85  PA+Q73 R0 FMAX
 L  Z+Q52 R0 FQ206 ; Auf Sicherheit vor nchster Ebene
 CALL PGM 25x_SlotPlunge ; Tiefenzustellung
 CALL PGM 25x_SlotRough ; Ebene Schruppen
 L IZ+QL0 R0 FMAX
 Q50 = Q50 + 1 ; inkr Zaehler Zustellungen
 Q52 = Q51 - SGN ( Q201 ) * Q200 ; neue Starthhe
 FN 10: IF +Q51 NE +Q62 GOTO LBL "ROUGH_PLUNGE"
 LBL "ROUGH_END"
 L  Z+Q65 R0 FMAX ; Rckzug aus der Nut heraus
 ;/********************************************
 * Schlichten, nur wenn seitl. oder Tiefen-aufmass
 ;*********************************************/
 FN 9: IF +Q215 EQU +1 GOTO LBL "FINISH_END"
 Q0 = ABS Q368 + ABS Q369
 FN 9: IF +Q0 EQU +0 GOTO LBL "FINISH_END"
 ;/****************************************
 * Zustellung:
 * auf Tiefe begrenzen
 * wenn eingegeben auf LCUTS begrenzen
 * wenn kein seitl. Aufmass, dann auf Tiefe setzen
 ;*****************************************/
 Q53 = ABS ( Q201 )
 FN 9: IF +Q338 EQU +0 GOTO LBL "FINISH_PL_DEPTH"
 FN 9: IF +Q368 EQU +0 GOTO LBL "FINISH_PL_DEPTH_LCUTS"
 Q53 = Q338
 Q0 = ABS ( Q201 )
 FN 12: IF +Q53 LT +Q0 GOTO LBL "FINISH_PL_DEPTH"
 Q53 = ABS ( Q201 )
 LBL "FINISH_PL_DEPTH"
 FN 9: IF +Q98 EQU +0 GOTO LBL "FINISH_PL_DEPTH_LCUTS"
 FN 12: IF +Q53 LT +Q98 GOTO LBL "FINISH_PL_DEPTH_LCUTS"
 FN 9: IF +426 EQU +1 GOTO LBL "FINISH_PL_DEPTH_LCUTS"
 Q53 = Q98
 LBL "FINISH_PL_DEPTH_LCUTS"
 ;/****************************************
 * Schlichten ausfuehren
 ;*****************************************/
 QL0 = Q200 * - SGN ( Q201 ) ; Sicherheitsabstand vorzeichenbehaftet
 Q50 = 1 ; init Zaehler Zustellungen
 LBL "FINISH_LOOP"
 Q51 = Q203 + SGN ( Q201 ) * Q50 * Q53 ; aktuelle Tiefe
 FN 12: IF +Q201 LT +0 GOTO LBL "FINISH_WORK_NEG"
 FN 12: IF +Q51 LT +Q61 GOTO LBL "FINISH_DEPTH"
 Q51 = Q61 ; akt. Tiefe bei positiver Richtung begrenzen
 FN 9: IF +0 EQU +0 GOTO LBL "FINISH_DEPTH"
 LBL "FINISH_WORK_NEG"
 FN 11: IF +Q51 GT +Q61 GOTO LBL "FINISH_DEPTH"
 Q51 = Q61 ; akt. Tiefe bei negativer Richtung begrenzen
 LBL "FINISH_DEPTH"
 CC  X+Q81  Y+Q82
 LP  PR+Q85  PA+Q73 R0 FMAX
 CALL PGM 25x_SlotFinish
 L IZ+QL0 R0 FMAX
 Q50 = Q50 + 1 ; inkr Zaehler Zustellungen
 FN 10: IF +Q51 NE +Q61 GOTO LBL "FINISH_LOOP"
 L  Z+Q65 R0 FMAX ; Rueckzug Sicherheitsabstand
 LBL "FINISH_END"
 L  Z+Q60 R0 FMAX
 FN 10: IF +Q40 NE +254 GOTO LBL "JUMP_OVER_LOOP"
 Q79 = Q79 + 1 ; inkr. Nutenzaehler
 FN 12: IF +Q79 LT +Q377 GOTO LBL "LOOP_SLOTS"
 LBL "JUMP_OVER_LOOP"
 FN 10: IF +Q367 NE +0 GOTO LBL "END"
 L  X+Q81  Y+Q82 R0 FMAX
 FN 9: IF +0 EQU +0 GOTO LBL "END"
 *##############################
 *# Modul: Rotiere 1.Nut
 *# Beruecksichtige Nut-Nummer und Winkelschritt
 *##############################
 LBL "SLOT_ROT"
 Q70 = Q80 + ( Q79 * Q378 ) ; Drehlage
 Q73 = Q70 - ( Q248 / 2 ) ; Startwinkel
 Q74 = Q70 + ( Q248 / 2 ) ; Endwinkel
 LBL 0
 *##############################
 *# Ende
 *##############################
 LBL "END"
 END PGM 25X_SLOT MM 
