0 BEGIN PGM 8295_DE MM 1 ;NC-Programm zum Auswerten einer Tabelle. Das NC-Programm 2 ;liest die Werte aus der Tabelle aus und speichert die 3 ;drei niedrigsten Werte in QR-Parametern. 4 ;! Wichtig ! Die Steuerung filtert nach Zahlenwerten, dass heisst 5 ;ein Wert der mehrfach in der Tabelle enthalten ist, wird nur ein 6 ;Mal gespeichert. Damit enthalten die QR-Parameter die drei niedrigsten 7 ;Zahlenwerte der Tabelle. 8 ; 9 ;Am Programmanfang definieren Sie die Anzahl der auszulesenden 10 ;Zeilen und die Spaltennamen die ausgewertet werden. 11 ;Anschliesssend definieren Sie noch die Parameter in denen die 12 ;drei niedrigsten Werte gespeichert werden. 13 ;Danach kopiert die Steuerung die Auszuwertende Tabelle, um das 14 ;Original nicht zu veraendern. 15 ;Dann filtert die Steuerung in einer Schleife zunaechst den niedrigsten 16 ;Wert aus der Tabelle, dann den zweitniedrigsten und danach den 17 ;drittniedrigsten. Die Werte speichert die Steuerung in den von 18 ;Ihnen defeinierten Parametern. Danach loescht die Steuerung die 19 ;Kopie der Tabelle und beendet das NC-Programm. 20 ; 21 ; 22 ;Eingabe 23 QL30 = +5 ;Anzahl der Zeilen in der Tabelle 24 QS1401 = "Spalte_1" ;Bezeichnung der ersten Spalte 25 QS1402 = "Spalte_2" ;Bezeichnung der zweiten Spalte 26 QS1403 = "Spalte_3" ;Bezeichnung der dritten Spalte 27 ;Definition der Ergebnisparameter 28 FN 0: QR1 SET UNDEFINED ;Niedrigster ermittelter Wert 29 FN 0: QR2 SET UNDEFINED ;Zweitniedrigster ermittelter Wert 30 FN 0: QR3 SET UNDEFINED ;Drittniedrigster ermittelter Wert 31 ; Eingabe Ende 32 ; 33 ;Originaltabelle kopieren 34 FUNCTION FILE COPY "8295_Value.TAB" TO "Copied_Table.TAB" 35 ; 36 ;Tabelle oeffnen 37 FN 26: TABOPEN Copied_Table.tab 38 ; 39 ;Lesen des ersten Werts 40 QS1420 = "Wert_1" 41 LBL "Wert_mit_naechstem_Rang" 42 QS1400 = QS1401 ;Spalte fuer den Start 43 QL10 = -1 ;Startwert fuer erste Zeile 44 LBL "Lese_naechste_Zeile" 45 QL10 = QL10 + +1 46 FN 9: IF QL10 EQU QL30 GOTO LBL "Naechste_Spalte_1" ;Letzte Spaltenzeile erreicht 47 LBL "Weiter_mit_naechster_Spalte_1" 48 FN 28: TABREAD QL20 = QL10 / QS1400 49 FN 9: IF QL20 IS UNDEFINED GOTO LBL "Lese_naechste_Zeile" ;Wenn kein Wert definiert ist, ist die Zeile irrelevant 50 QL5 = QL20 ;Wert uebernehmen 51 ; 52 ;Naechste Zeile in der Spalte lesen 53 LBL "Lese_weitere_Zeile" 54 QL10 = QL10 + +1 55 FN 9: IF QL10 EQU QL30 GOTO LBL "Naechste_Spalte_2" ;Pruefen ob letzte Zeile erreicht ist 56 LBL "Weiter_mit_naechster_Spalte_2" 57 FN 28: TABREAD QL20 = QL10 / QS1400 58 FN 9: IF QL20 IS UNDEFINED GOTO LBL "Lese_weitere_Zeile" ;Wenn kein Wert definiert ist, ist die Zeile irrelevant 59 FN 11: IF QL20 GT QL5 GOTO LBL "Lese_weitere_Zeile" ;Wenn die Zahl groesser ist, als die bisherige ist Sie irrelevant 60 QL5 = QL20 61 FN 9: IF +0 EQU +0 GOTO LBL "Lese_weitere_Zeile" 62 LBL "Ende_Hauptprogramm" 63 ; 64 ;Werte in Zielparameter uebertragen 65 FN 9: IF QS1420 EQU "Wert_1" GOTO LBL "Wert_1" ;Erster Durchlauf fuer Erstniedrigsten Wert 66 FN 9: IF QS1420 EQU "Wert_2" GOTO LBL "Wert_2" ;Zweiter Durchlauf fuer Zweitniedrigsten Wert 67 FN 9: IF QS1420 EQU "Wert_3" GOTO LBL "Wert_3" ;Dritter Durchlauf fuer Drittniedrigsten Wert 68 ; 69 LBL "Wert_1" 70 QR1 = QL5 ;Niedrigsten Wert uebernehmen 71 CALL LBL "Set_undefined" 72 QS1420 = "Wert_2" 73 FN 9: IF +0 EQU +0 GOTO LBL "Wert_mit_naechstem_Rang" 74 ; 75 LBL "Wert_2" 76 QR2 = QL5 ;Zweitniedrigsten Wert uebernehmen 77 CALL LBL "Set_undefined" 78 QS1420 = "Wert_3" 79 FN 9: IF +0 EQU +0 GOTO LBL "Wert_mit_naechstem_Rang" 80 ; 81 LBL "Wert_3" 82 QR3 = QL5 ;Drittniedrigsten Wert uebernehmen 83 ; 84 ;Kopie der Tabelle loeschen 85 FUNCTION FILE DELETE "Copied_Table.tab" 86 ; 87 M30 88 ; 89 ; Unterprogramme um die kleinsten Werte aus der Tabelle zu loeschen 90 LBL "Set_undefined" 91 ;Erste Spalte 92 QL50 = -1 ;Zeile fuer Start 93 QL50 = QL50 + +1 ;Zeile weiterzaehlen 94 LBL "Undefined_loop_1" 95 FN 28: TABREAD QL35 = QL50 / QS1401 ;Wert lesen 96 FN 10: IF QL35 NE QL5 GOTO LBL "Undefined_jump_1" ;Pruefen, ob der Wert der niedrigste ist 97 FN 0: QL40 SET UNDEFINED 98 FN 27: TABWRITE QL50 / QS1401 = QL40 ;Feld auf undefiniert setzen 99 LBL "Undefined_jump_1" 100 QL50 = QL50 + +1 ;Zeile weiterzaehlen 101 FN 12: IF QL50 LT QL30 GOTO LBL "Undefined_loop_1" ;Sprung, wenn letzte Zeile noch nicht erreicht ist 102 ; 103 ; Zweite Spalte 104 QL50 = -1 ;Zeile fuer Start 105 QL50 = QL50 + +1 ;Zeile weiterzaehlen 106 LBL "Undefined_loop_2" 107 FN 28: TABREAD QL35 = QL50 / QS1402 ;Wert auslesen 108 FN 10: IF QL35 NE QL5 GOTO LBL "Undefined_jump_2" ;Pruefen, ob der Wert der niedrigste ist 109 FN 0: QL40 SET UNDEFINED 110 FN 27: TABWRITE QL50 / QS1402 = QL40 ;Feld auf undefiniert setzen 111 LBL "Undefined_jump_2" 112 QL50 = QL50 + +1 ;Zeile weiterzaehlen 113 FN 12: IF QL50 LT QL30 GOTO LBL "Undefined_loop_2" ;Sprung, wenn letzte Zeile noch nicht erreicht ist 114 ; 115 ; Dritte Spalte 116 QL50 = -1 ;Zeile fuer Start 117 QL50 = QL50 + +1 ;Zeile weiterzaehlen 118 LBL "Undefined_loop_3" 119 FN 28: TABREAD QL35 = QL50 / QS1403 ;Wert auslesen 120 FN 10: IF QL35 NE QL5 GOTO LBL "Undefined_jump_3" ;Pruefen, ob der Wert der niedrigste ist 121 FN 0: QL40 SET UNDEFINED 122 FN 27: TABWRITE QL50 / QS1403 = QL40 ;Feld auf undefiniert setzen 123 LBL "Undefined_jump_3" 124 QL50 = QL50 + +1 ;Zeile weiterzaehlen 125 FN 12: IF QL50 LT QL30 GOTO LBL "Undefined_loop_3" ;Sprung, wenn letzte Zeile noch nicht erreicht ist 126 LBL 0 127 ; 128 ; Unterprogramme um die Spalten weiter zu takten 129 LBL "Naechste_Spalte_1" 130 FN 9: IF QS1400 EQU QS1401 GOTO LBL "Weiter_mit_QS1402_1" ;Pruefen, ob Spalte 1 aktiv ist 131 FN 9: IF QS1400 EQU QS1402 GOTO LBL "Weiter_mit_QS1403_1" ;Pruefen, ob Spalte 2 aktiv ist 132 FN 9: IF +0 EQU +0 GOTO LBL "Ende_Hauptprogramm" ;Ruecksprung 133 ; 134 LBL "Weiter_mit_QS1402_1" 135 QL10 = +0 ;Zeile zuruecksetzen 136 QS1400 = QS1402 ;Spalte 2 zum Auslesen aktiv setzen 137 FN 9: IF +0 EQU +0 GOTO LBL "Ende_Unterprogramm_1" ;Ruecksprung 138 ; 139 LBL "Weiter_mit_QS1403_1" 140 QL10 = +0 ;Zeile zuruecksetzen 141 QS1400 = QS1403 ;Spalte 3 zum Auslesen aktiv setzen 142 FN 9: IF +0 EQU +0 GOTO LBL "Ende_Unterprogramm_1" ;Ruecksprung 143 ; 144 LBL "Ende_Unterprogramm_1" 145 FN 9: IF +0 EQU +0 GOTO LBL "Weiter_mit_naechster_Spalte_1" ;Ruecksprung 146 ; 147 LBL "Naechste_Spalte_2" 148 FN 9: IF QS1400 EQU QS1401 GOTO LBL "Weiter_mit_QS1402_2" ;Pruefen, ob Spalte 1 aktiv 149 FN 9: IF QS1400 EQU QS1402 GOTO LBL "Weiter_mit_QS1403_2" ;Pruefen, ob Spalte 2 aktiv 150 FN 9: IF +0 EQU +0 GOTO LBL "Ende_Hauptprogramm" ;Ruecksprung 151 ; 152 LBL "Weiter_mit_QS1402_2" 153 QL10 = +0 ;Zeile zuruecksetzen 154 QS1400 = QS1402 ;Spalte 2 zum Auslesen aktiv setzen 155 FN 9: IF +0 EQU +0 GOTO LBL "Ende_Unterprogramm_2" ;Ruecksprung 156 ; 157 LBL "Weiter_mit_QS1403_2" 158 QL10 = +0 ;Zeile zuruecksetzen 159 QS1400 = QS1403 ;Spalte 3 zum Auslesen aktiv setzen 160 FN 9: IF +0 EQU +0 GOTO LBL "Ende_Unterprogramm_2" ;Ruecksprung 161 ; 162 LBL "Ende_Unterprogramm_2" 163 FN 9: IF +0 EQU +0 GOTO LBL "Weiter_mit_naechster_Spalte_2" ;Ruecksprung 164 END PGM 8295_DE MM