Die FOR/ENDFOR-Anweisung ist eine Funktion, die eine Schleife zwischen den FOR- und ENDFOR-Anweisungen eine angegebene Anzahl an Malen wiederholt.
FOR/ENDFOR-Anweisungen haben zwei ANWEISUNGEN: FOR-Anweisung und ENDFOR-Anweisung.
FOR-Anweisung - Start der FOR/ENDFOR-Schleife
ENDFOR-Anweisung - Ende der FOR/ENDFOR-Schleife
Anweisungen zwischen den FOR- und ENDFOR-Anweisungen werden wiederholt. Die Anzahl der Wiederholungen wird von den angegebenen Werten in der FOR-Anweisung bestimmt.
Die FOR-Anweisung hat folgende Form.
Für den Schleifenzähler wird ein Register verwendet. Konstante, Register und Argumentregister wird für den Anfangswert verwendet. Als Konstante kann eine Ganzzahl im Wertebereich -32767 bis 32767 angegeben werden. Konstante, Register und Argumentregister wird für den Zielwert verwendet. Als Konstante kann eine Ganzzahl im Wertebereich -32767 bis 32767 angegeben werden.
Wenn die FOR-Anweisung ausgeführt wird, wird der Schleifenzähler auf den Anfangswert gesetzt. Die folgende Bedingung muss erfüllt sein, damit die FOR/ENDFOR-Schleife ausgeführt wird.
Wenn TO angegeben wird, muss der Anfangswert <= Zielwert sein.
Wenn DOWNTO angegeben wird, muss der Anfangswert >= Zielwert sein.
Wenn diese Bedingung nicht erfüllt ist, springt der Cursor in die nächste Zeile der kombinierten ENDFOR-Anweisung und die FOR/ENDFOR-Schleife wird nicht ausgeführt. Die FOR-Anweisung wird nur einmal in der FOR/ENDFOR-Schleife ausgeführt.
Die ENDFOR-Schleife wird so lange ausgeführt, wie die folgende Bedingung erfüllt ist.
Wenn TO angegeben wird, muss der Wert des Schleifenzählers kleiner als der Zielwert sein.
Wenn DOWNTO angegeben wird, muss der Wert des Schleifenzählers größer als der Zielwert sein.
Wenn diese Bedingung erfüllt ist und TO angegeben wird, wird der Wert des Schleifenzählers um 1 erhöht. Wenn diese Bedingung erfüllt ist und DOWNTO angegeben wird, wird der Wert des Schleifenzählers verringert. Danach springt der Cursor in die nächste Zeile der kombinierten FOR-Anweisung. Wenn diese Bedingung nicht erfüllt ist, springt der Cursor in die nächste Zeile, und die FOR/ENDFOR-Schleife wird nicht wiederholt.
Wenn die FOR/ENDFOR-Schleife wiederholt ausgeführt wird, wird eine interne Verzögerung verwendet. Daher ist zur Wiederholung der FOR/ENDFOR-Schleife keine WAIT-Anweisung notwendig.
Die FOR/ENDFOR-Anweisung wird folgendermaßen geteacht.
Verfahren 7. Teachen der FOR/ENDFOR-Anweisung
In diesem Beispiel geben Sie Leerzeilen in Zeile 1 und 5 ein.
Bewegen Sie den Cursor in Zeile 1, und drücken Sie F1, [INST].
Wählen Sie "FOR/ENDFOR".
Wählen Sie "FOR". Die FOR/ENDFOR-Anweisung wird geteacht.
Der Cursor springt automatisch zum Index des Registers. Geben Sie den Indexwert ein. In diesem Beispiel geben Sie 1 ein.
Der Cursor springt automatisch zum Anfangswert-Teil. In diesem Beispiel wird "Constant" ausgewählt, und der Wert ist 1. Um das Register oder Argumentregister auszuwählen, drücken Sie F4, [CHOICE], und wählen Sie eines von beiden aus.
Der Cursor springt automatisch zum Teil TO/DOWNTO. In diesem Beispiel drücken Sie ENTER. Um DOWNTO zu wählen, drücken Sie F4, [WAHL], und wählen Sie DOWNTO.
Der Cursor springt automatisch zum Zielwert-Teil. In diesem Beispiel wählen Sie R[]. Geben Sie 2 für den Index des Registers ein.
Bewegen Sie den Cursor in Zeile 5, und drücken Sie F1, [INST].
Wählen Sie "FOR/ENDFOR".
Wählen Sie "ENDFOR". FOR/ENDFOR-Anweisung wird geteacht.
FOR- und ENDFOR-Anweisungen werden nach dem Teachen automatisch kombiniert. Die nächste FOR-Anweisung und ENDFOR-Anweisung werden kombiniert. Durch Teachen von weiteren FOR/ENDFOR-Anweisungen in einer FOR/ENDFOR-Schleife können geschachtelte Schleifen gebildet werden. Es können bis zu 10 Schachtelungen definiert werden. Werden jedoch mehr als 10 verschachtelte Schleifen geteacht, führt dies zu einem Alarm bei der Ausführung.
Die Anzahl der FOR-Anweisungen muss mit der Anzahl der ENDFOR-Anweisungen in einem Programm übereinstimmen. Wenn die Anzahl nicht gleich ist, wird bei der Ausführung ein Alarm ausgegeben. Alarme im Zusammenhang mit der FOR/ENDFOR-Anweisung werden in Abschnitt 9.5, "Alarme" erläutert. Im folgenden Beispiel wird beschrieben, wie FOR- und ENDFOR-Anweisungen miteinander kombiniert werden. Teachen Sie die FOR-Anweisung in Zeile 1. In diesem Fall sind die Nummer der FOR-Anweisung und die Nummer der ENDFOR-Anweisung nicht gleich. Bei der Ausführung des Programms tritt daher der Alarm "INTP-670 FOR verlangt ENDFOR in Zeile 1" auf.
Teachen Sie die ENDFOR-Anweisung in Zeile 6. Die FOR/ENDFOR-Schleife wird durch die FOR-Anweisung in Zeile 1 und die ENDFOR-Anweisung in Zeile 6 gebildet.
Teachen Sie die FOR-Anweisung in Zeile 3. In diesem Fall sind die Nummer der FOR-Anweisung und die Nummer der ENDFOR-Anweisung nicht gleich. Bei der Ausführung des Programms tritt daher der Alarm "INTP-670 FOR verlangt ENDFOR Zeile 1" auf.
Teachen Sie die ENDFOR-Anweisung in Zeile 8. Die nächste FOR-Anweisung und ENDFOR-Anweisung werden kombiniert. Daher wird die erste FOR/ENDFOR-Schleife durch die FOR-Anweisung in Zeile 3 und die ENDFOR-Anweisung in Zeile 6 gebildet und die zweite FOR/ENDFOR-Schleife durch die FOR-Anweisung in Zeile 1 und die ENDFOR-Anweisung in Zeile 8. In diesem Beispiel werden zwei verschachtelte Schleifen gebildet.
Die gleiche Registernummer darf nicht als Schleifenzähler in der gleichen verschachtelten Schleife verwendet werden. Dies kann zu unvorhergesehenem Verhalten führen.
Rückwärtsausführung von FOR/ENDFOR-Anweisungen ist unzulässig. Die Rückwärtsausführung von Anweisungen innerhalb einer FOR/ENDFOR-Schleife ist dagegen erlaubt. Im folgenden Beispiel tritt der Alarm "INTP-238 Rückwärtsausf. beendet" auf, wenn die Rückwärtsausführung von Zeile 1 oder 5 begonnen wird. Dagegen verläuft die Rückwärtsausführung normal, wenn diese von Zeile 2, 3, 4 oder 6 gestartet wird.
Die Beispiele für eine FOR/ENDFOR-Anweisung werden anhand des folgenden Programms erläutert.
Fall 1: R[2]=3 TO ist angegeben, und der Anfangswert ist kleiner als der Zielwert. Daher ist die Bedingung der FOR-Anweisung erfüllt. Wenn sich der Wert des Schleifenzählers von 1 auf 3 ändert, bleibt die Bedingung der ENDFOR-Anweisung erfüllt, und die FOR/ENDFOR-Schleife wird dreimal wiederholt.
Fall 2: R[2]=1 TO ist angegeben, und der Anfangswert ist gleich dem Zielwert. Daher ist die Bedingung der FOR-Anweisung erfüllt. Da der Wert des Schleifenzählers allerdings gleich dem Zielwert ist, ist die Bedingung der ENDFOR-Anweisung nicht erfüllt. Daher wird die FOR/ENDFOR-Schleife nur einmal ausgeführt.
Fall 3: R[2]=0 TO ist angegeben, und der Anfangswert ist größer als der Zielwert. Daher ist die Bedingung der FOR-Anweisung nicht erfüllt. Der Cursor springt in die nächste Zeile der kombinierten ENDFOR-Anweisung, also in Zeile 6, und die FOR/ENDFOR-Schleife wird nicht ausgeführt.
Andere Beispiele starten innerhalb der FOR/ENDFOR-Schleife: R[1]=0 Wenn das folgende Programm von Zeile 3 und R[1]=0 ausgeführt wird, ist die Bedingung der ENDFOR-Anweisung erfüllt. Daher wird die FOR/ENDFOR-Schleife 4-mal (0 bis 3) wiederholt.
Start innerhalb einer FOR/ENDFOR-Schleife: R[1]=5 Wenn das folgende Programm von Zeile 3 und R[1]=5 ausgeführt wird, ist die Bedingung der ENDFOR-Anweisung nicht erfüllt. Daher wird die FOR/ENDFOR-Schleife nicht wiederholt.
JMP/LBL-Anweisungen innerhalb der FOR/ENDFOR Schleife vorhanden: Im folgenden Programm sind JMP/LBL-Anweisungen innerhalb der FOR/ENDFOR-Schleife vorhanden. Der Cursor springt durch die JMP-Anweisung von Zeile 3 zu Zeile 7. Die FOR/ENDFOR-Schleife wird zwischen Zeile 1 und 4 nicht ausgeführt. Da Zeile 7 sich ebenfalls innerhalb der FOR/ENDFOR-Schleife befindet und die Bedingung der ENDFOR-Anweisung in Zeile 8 erfüllt ist, wird die FOR/ENDFOR-Schleife zwischen Zeile 5 und 8 wiederholt. Schließlich ist der Wert von R[1] gleich 1 und von R[2] gleich 2.
Bei Verwendung von JMP/LBL in einer FOR/ENDFOR-Schleife ist Vorsicht walten zu lassen. Achten Sie vor der Verwendung darauf, wie die Schleife funktioniert. Anderenfalls kann es zu schwerwiegenden Fehlern kommen.
Der Wert des Schleifenzählers wird innerhalb der FOR/ENDFOR-Schleife geändert: Der Schleifenzähler kann innerhalb der FOR/ENDFOR-Schleife geändert: werden. Im folgenden Beispiel wird R[1] auf 11 geändert, wenn DI[1]=ON. Da dieser Wert größer ist als der Zielwert, wird diese FOR/ENDFOR-Schleife beendet.
Bei Änderung des Schleifenzählerwerts in einer FOR/ENDFOR-Schleife ist Vorsicht walten zu lassen. Das Ändern des Schleifenzählerwerts innerhalb einer FOR/ENDFOR-Schleife kann zu einer anormalen Verhaltensweise und zu Endlosschleifen führen. Bitte seien Sie vorsichtig beim Ändern des Zielwerts innerhalb einer FOR/ENDFOR-Schleife, wenn damit ein Register oder Argument-Register bestimmt wird. Das Ändern des Werts innerhalb einer FOR/ENDFOR-Schleife kann zu einer anormalen Verhaltensweise führen.
Der Wert des Schleifenzählers wird innerhalb der FOR/ENDFOR-Schleife berechnet: Im folgenden Beispiel wird der FOR/ENDFOR-Schleifenzähler berechnet. Nach der Ausführung hat der Schleifenzähler den Wert 11. Der Schleifenzählerwert weicht vom Zielwert ab. Jedoch ist dieses Ergebnis richtig.
Dies ist folgendermaßen zu erklären: Zeile 1, R[1] ist 6 (Anfangswert). Zeile 5, R[1] ist 7. Zeile 6, R[1] ist 7 und dies erfüllt die ENDFOR-Bedingung. R[1] wird auf 8 inkrementiert. Zeile 5, R[1] ist 9. Zeile 6, R[1] ist 9 und dies erfüllt die ENDFOR-Bedingung. R[1] wird auf 10 inkrementiert. Zeile 5, R[1] ist 11. Zeile 6, R[1] ist 11 und dies erfüllt nicht die ENDFOR-Bedingung. Der Cursor springt zur nächsten Zeile. Dies bedeutet, dass der Benutzer den Schleifenzähler berechnen kann, jedoch darauf achten muss, dass der Schleifenzähler einen anderen Wert hat als der Zielwert.
In einigen Fällen führt das Berechnen des Schleifenzählers zu einem Alarm. Dieses Problem kann durch Verwendung von DIV kurz vor der FOR/ENDFOR-Anweisung oder Eingabe des gleichen Wertes im DATA-Bildschirm vermieden werden. Besonders bei Berechnung mit reellen Werten und Verwendung von Division sollte unbedingt DIV verwendet werden. R[1]=R[1] DIV 1
Alarme treten unter folgenden Bedingungen bei der FOR/ENDFOR-Funktion auf:
Ausführung, wenn die Anzahl der FOR-Anweisungen kleiner als die der ENDFOR-Anweisungen ist
Ausführung, wenn die Anzahl der ENDFOR-Anweisungen kleiner als die der FOR-Anweisungen ist
Ausführung bei mehr als 10 geschachtelten Schleifen
Als Startwert oder Zielwert in der FOR-Anweisung wird keine Ganzzahl verwendet
Als Schleifenzähler oder Zielwert in der ENDFOR-Anweisung wird keine Ganzzahl verwendet
Ausführung, wenn die Anzahl der FOR-Anweisungen kleiner als die der ENDFOR-Anweisungen ist
Ausführung des folgenden Programms: Da keine FOR-Anweisung für die ENDFOR-Anweisung in Zeile 5 vorhanden ist, tritt der Alarm "INTP-669 ENDFOR verlangt FOR Zeile 5" bei der Ausführung auf.
Ausführung, wenn die Anzahl der ENDFOR-Anweisungen kleiner als die der FOR-Anweisungen ist. Ausführung des folgenden Programms. Da keine ENDFOR-Anweisung für die FOR-Anweisung in Zeile 1 vorhanden ist, tritt der Alarm "INTP-670 ENDFOR verlangt FOR Zeile 1" bei der Ausführung auf.
Ausführung bei mehr als 10 geschachtelten Schleifen. Bei der Ausführung tritt "INTP-671 Zuviele FOR" auf.
Als Startwert oder Zielwert in der FOR/ENDFOR-Anweisung wird keine Ganzzahl verwendet
Als Schleifenzähler oder Zielwert in der ENDFOR-Anweisung wird keine Ganzzahl verwendet. Ausführung des folgenden Programms. Da der Wert des Registers für den Zielwert in der FOR-Anweisung in Zeile 2 keine ganze Zahl ist, tritt der Alarm "INTP-672 (Progr 2) Wert ist keine ganze Zahl" auf, wenn Zeile 2 ausgeführt wird. In anderen Fällen kann die Berechnung des Schleifenzählers, Startwerts oder Zielwerts den gleichen Alarm verursachen.
In einigen Fällen verursacht die Berechnung eines Registers, der als Schleifenzähler oder Zielwert verwendet wird, den obigen Alarm, obwohl das Ergebnis und der im DATEN-Bildschirm angezeigte Wert ganze Zahlen sind. Dieses Problem kann durch Verwendung von DIV kurz vor der FOR/ENDFOR-Anweisung oder Eingabe des gleichen Werts im DATEN-Bildschirm vermieden werden. Besonders bei Berechnung mit reellen Werten und Verwendung von Division sollte unbedingt DIV verwendet werden. R[1]=R[1] DIV 1