Hallo Simulator,
erstmal ganz herzlichen Dank für Deine Antwort!
ich arbeite mit der Version 7.0 (Studentenversion). Ich versuche, die Prioritätsregeln nach Jackson zu programmieren. Vorgabe ist, dass 4 verschiedene Auftragstypen existieren, die auf zwei Maschinen bearbeitet werden, also:
Typ 1: erst auf Maschine 1 dann auf Maschine 2
Typ 2: erst auf Maschine 2 dann auf Maschine 1
Typ 3: nur auf Maschine 1
Typ 4: nur auf Maschine 2
Meine Vorgehensweise ist wie folgt:
In der Ausgangssteuerung der Quelle (Quelle_Ausgang) werden die Typen 1-4 zufällig erzeugt und eine zufällige Bearbeitungszeit zugewiesen. Das funktioniert. Weiterhin werden die Typen in Quelle_Ausgang entsprechenden Tabellen zugewiesen. Die Typen 1 und 3 werden zuerst auf Maschine 1 bearbeitet, daher Zuweisung in Tabelle J12_aj_kleiner_bj bzw. J12_aj_größer_bj. Zuweisung zu J12_aj_kleiner_bj erfolgt, wenn die Bearbeitungszeit auf Maschine 1 kleiner der Bearbeitungszeit auf Maschine 2 ist. Trifft das nicht zu, wird J12_aj_größer_bj zugewiesen. Analoges gilt für die Typ 2 und 4, sowie für die Tabellen J21_*** Das funktioniert auch. Anschließend werden die Typen auf den Sortierer der entsprechenden Maschine umgelagert (eine Maschine besteht aus einem Sortierer und einer Einzelstation).
Bei Eintritt in den Sortierer werden die Tabellen J12_aj_kleiner_bj, J21_aj_kleiner_bj aufsteigend und J12_aj_größer_bj, J21_aj_größer_bj absteigend sortiert. Das stellt sicher, dass entweder das Objekt mit der größten bzw. kleinsten Bearbeitungszeit in Zeile 1 steht.
Jetzt kommt die Ausgangssteuerung des Sortierers (Sortierer_Ausgang). Das ist die, die mir Probleme bereitet. Hier soll überprüft werden, welcher Auftrag die höchste Priorität hat und dieser soll dann auf die nachfolgende Einzelstation umgelagert werden. Das kann das aufrufende BE sein, muss aber nicht. Am besten ist, ich schreibe mal den Quellcode für den Sortierer1 nachfolgend auf:
is
Objekt: object;
do
if J12_aj_kleiner_bj[2,1] /= 0 then
repeat
J12_aj_kleiner_bj[1,1].umlagern;
Objekt:= J12_aj_kleiner_bj[1,1];
until myES1.inhalt = Objekt;
J12_aj_kleiner_bj.entferneZeile(1);
elseif J12_aj_größer_bj[2,1] /= 0 then
repeat
J12_aj_größer_bj[1,1].umlagern;
Objekt:= J12_aj_größer_bj[1,1];
until myES1.inhalt = Objekt;
J12_aj_größer_bj.entferneZeile(1);
else
repeat
Warteschlange21[1,1].umlagern;
Objekt:= Warteschlange21[1,1];
until myES1.inhalt = Objekt;
Warteschlange21.entferneZeile(1);
end;
end;
Das Problem ist, wie Du gesagt hast, dass wenn einmal die repeat-Schleife betreten ist, diese auch nicht mehr verlassen wird, wenn die nachfolgende Einzelstation belegt ist. Hier habe ich die Beobachtung gemacht, dass das BE, das auf der nachfolgenden Einzelstation sitzt, die Ausgangssteuerung der Einzelstation überhaupt nicht mehr aufruft. Ich weiß jetzt nicht, ob Du den Quellcode für diese Ausgangssteuerung (ES_Ausgang) auch gerne sehen möchtest?!
Mit der repeat-Schleife möchte ich vermeiden, dass die Tabellenzeile vor der tatsächlichen Umlagerung auf die Einzelstation gelöscht wird.
Ich hoffe, ich habe mein Problem einigermaßen verständlich dargestellt. Auf jeden Fall möchte ich mich nochmal für Dein Interesse und Deine Mithilfe bedanken!
Viele Grüße
first_edition
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP