is AnzZeilen : integer; SummeBeabZ : time; Enddatum : datetime; LSKRO : time; aktZeit : datetime; Planstarttermin : datetime; Werkstatt : object; Werkstattnext : object; modusLSKRO, SortiererSperre : boolean; verzug : time; PlanEndeakt : datetime; Betriebsmodusalt : string; berechneBestand: time; do if ?.AusStBug then Betriebsmodusalt := Sortierer.Betriebsmodus; --Sortierer.Betriebsmodus := "undefiniert"; aktZeit := .Schleicher.SchleicherMUC.Ereignisverwalter.Datum + .Schleicher.SchleicherMUC.Ereignisverwalter.Zeit; -- Jeden Auftrag in Sortierer überprüfen und Status (normal/gesperrt/ROT/ROTgesperrt) setzen MethodebStatus; -- Sortierer blockieren bzw entblockieren MethodeblockSort; -- -- Bestand Warteschlangenkonten ausrechnen berechneBestand := 0; for local i := 1 to ListeWarteschlange.Ydim loop berechneBestand := berechneBestand + ListeWarteschlange["Rüstzeit",i] + ListeWarteschlange["Bearbeitungszeit",i]; next; BestandWarteschlange := berechneBestand; berechneBestand := 0; for local i := 1 to ListeWarteschlangeROT.Ydim loop if (aktZeit-ListeWarteschlangeROT["Planstarttermin",i]) < 0 then print "FEHLER"; end; berechneBestand := berechneBestand + (aktZeit-ListeWarteschlangeROT["Planstarttermin",i]); next; BestandWarteschlangeROT := berechneBestand; --- ----------------------------------------------------- -- Betriebmodus setzen: rückstand/engpass/normalLSKRO/normalXWINQ --- ----------------------------------------------------- -- Prüfen, ob sich roter Auftrag in Sortierer befindet -> Betriebsmodus "rückstand" for local i := 1 to Sortierer.AnzahlBEs loop if Sortierer.BE(i).Status = "ROT" OR Sortierer.BE(i).Status = "ROTgesperrt" then Sortierer.Betriebsmodus := "rückstand"; -- Ist Grenzwert für Kapazitätsmaßnahmen überschritten? if BestandWarteschlangeROT > BGWarteschlangeROT then print to_str(.Schleicher.SchleicherMUC.Ereignisverwalter.Datum + .Schleicher.SchleicherMUC.Ereignisverwalter.Zeit) + " " + current.name + " " + self.name + " KAPAZITÄTSERWEITERUNGSMAßNAHMEN NÖTIG"; end; end; next; -- Ist Grenzwert Warteschlangenkonto überschritten? -> Betriebsmodus "engpass" oder "normalX" -- dabei müssen beide Warteschlangenbestände aufaddiert werden! if (BestandWarteschlangeROT + BestandWarteschlange) > BGWarteschlange AND Sortierer.Betriebsmodus /= "rückstand" then Sortierer.Betriebsmodus := "engpass"; elseif Sortierer.Betriebsmodus /= "rückstand" then -- LSKRO oder XWINQ? modusLSKRO := false; for local i := 1 to Sortierer.AnzahlBEs loop SummeBeabZ := 0; -- alle verbleibenden Bearbeitungs- und Rüstzeiten addieren for local j := Sortierer.BE(i).Fertigungsstufeakt to Sortierer.BE(i).Arbeitsfolgen.YDim loop SummeBeabZ := SummeBeabZ + Sortierer.BE(i).Arbeitsfolgen["Bearbeitungszeit",j] + Sortierer.BE(i).Arbeitsfolgen["Rüstzeit",j]; next; -- geplantes Auftragsende: Planstarttermin letzte Arbeitsfolge + Bearbeitungszeit + Rüstzeit Enddatum := Sortierer.BE(i).Arbeitsfolgen["Planstarttermin",Sortierer.BE(i).Arbeitsfolgen.YDim] + Sortierer.BE(i).Arbeitsfolgen["Bearbeitungszeit",Sortierer.BE(i).Arbeitsfolgen.YDim] + Sortierer.BE(i).Arbeitsfolgen["Rüstzeit",Sortierer.BE(i).Arbeitsfolgen.YDim]; -- LSKRO ausrechnen: restliche Schlupfzeit / Anzahl der verbleibenden Aufträge if Sortierer.BE(i).Fertigungsstufeakt < Sortierer.BE(i).Arbeitsfolgen.YDim then LSKRO := (Enddatum - SummeBeabZ - aktZeit) / (Sortierer.BE(i).Arbeitsfolgen.YDim - Sortierer.BE(i).Fertigungsstufeakt); if LSKRO < GrenzwertLSKRO then modusLSKRO := true; end; end; next; if modusLSKRO = true then Sortierer.Betriebsmodus := "normalLSKRO"; else Sortierer.Betriebsmodus := "normalXWINQ"; end; end; if Betriebsmodusalt /= Sortierer.Betriebsmodus then print to_str(.Schleicher.SchleicherMUC.Ereignisverwalter.Datum + .Schleicher.SchleicherMUC.Ereignisverwalter.Zeit) + " " + self.name + " " + current.name + " Betriebsmodus geändert: " + Betriebsmodusalt + " -> " + Sortierer.Betriebsmodus; end; -- Sortieren starten, da es sonst den ersten Auftrag vergisst Sortierer.Sortieren; -- Stempel AVG Ende @.Arbeitsfolgen[5,@.Fertigungsstufeakt] := .Schleicher.SchleicherMUC.Ereignisverwalter.Datum + .Schleicher.SchleicherMUC.Ereignisverwalter.Zeit; if @.Fertigungsstufeakt < @.Arbeitsfolgen.Ydim then -- Fertigungstatus auf nächste Arbeitsfolge setzen @.Fertigungsstufeakt := @.Fertigungsstufeakt + 1; if @.Umlagern(.Schleicher.SchleicherMUC.Transport) = false then print to_str(.Schleicher.SchleicherMUC.Ereignisverwalter.Datum + .Schleicher.SchleicherMUC.Ereignisverwalter.Zeit) + " " + self.name + " FEHLER: Konnte Auftrag " + to_str(@.startnr) + " nicht auf Transportpuffer umlagern!"; end; else -- Auftrag ist Fertig -> einlagern -- Fertigungstatus auf nächste Arbeitsfolge setzen --print to_str(.Schleicher.SchleicherMUC.Ereignisverwalter.Zeit + .Schleicher.SchleicherMUC.Ereignisverwalter.Datum) + " " + current.name + " " + "Auftrag " + to_str(@.startnr) + " (" + @.ID_Fertigung + ") " +" fertig gestellt (" + to_str(@.Fertigungsstufeakt) + " AFOS) und dem Versand übergeben!"; @.Fertigungsstufeakt := 9999; if @.Umlagern(.Schleicher.SchleicherMUC.Lager) = false then print to_str(.Schleicher.SchleicherMUC.Ereignisverwalter.Datum + .Schleicher.SchleicherMUC.Ereignisverwalter.Zeit) + " " + self.name + " FEHLER: Konnte Auftrag " + to_str(@.startnr) + " nicht umlagern nach LAger umlagern!"; end; end; end; end;