#1 6. Dezember 2011 Delphi/Pascal: Rätsel für schlaue Köpfe Hallo Leute, das folgende Programm soll die Produktionszahlen einer Fertigungslinie berechnen. Mein Problem ist, das Maschine 3 immer mehr Teile produziert (bzw. laut Berechnung produziert) als möglich ist. Denn damit Maschine 3 ein Teil produziert, müssen Maschine 1 und 2 jeweils ein Teil gebaut haben, welche in Maschine 3 zusammen gefügt werden. Maschine 3 kann also max. so viel produzieren, wie M1 bzw. M2 (die Maschine mit der geringeren Produktion halt). Hab eine Abfrage eingebaut, die Abfragen soll, ob M1 und M2 ein Teil an M3 übergeben haben und erst wenn beide Teile da sind soll die Bearbeitungszeit berechnet werden und nach Ablauf dieser Zeit soll halt das Array Teile[3] um eins erhöht werden. Zwischen den Maschinen gibt es keine Lagerplätze, d.h. nur wenn M3 nicht arbeitet kann M1 (bzw. M2) ein Teil weitergeben und selbst dann wieder anfangen zu arbeiten. Noch zur Erläuterung des Codes: die Variable k gibt zufällig bedingte Bearbeitungszeitschwankungen an tb ist die Grundbearbeitungszeit Bearbeitungsstatus gibt an, ob in der aktuellen Maschine gerade ein Teil produziert wird oder ob ein Teil in der Maschine liegt und auf die Folgemaschine wartet TeileM3 gibt an, ob ein teil der vorrangegangenen Maschine eingelagert ist. Code: procedure Bearbeitung(); var Form1: TForm1; Bearbeitungsstatus: array[1..3] of boolean; Bearbeitungszeit: array[1..3] of integer; Teile: array[1..3] of integer; TeileM3: array[1..2] of boolean; implementation {$R *.dfm} procedure Bearbeitung(); var maschine,tb,Zeit,Zufallszahl:integer; k:extended; begin tb:=0; Bearbeitungsstatus[1] := false; Bearbeitungsstatus[2] := false; Bearbeitungsstatus[3] := false; Teile[1]:= 0; Teile[2]:= 0; Teile[3]:= 0; TeileM3[1]:= false; TeileM3[2]:= false; Bearbeitungszeit[1]:=0; Bearbeitungszeit[2]:=0; Bearbeitungszeit[3]:=0; for Zeit := 1 to 61200 do begin for maschine := 1 to 2 do begin if maschine = 1 then tb:=100; if maschine = 2 then tb:=120; if Bearbeitungsstatus[maschine] = false then begin Bearbeitungsstatus[maschine] := true; k:=(Random(6)+1)/20; Zufallszahl:=Round(Random(99)+1); if (Zufallszahl >= 1) and (Zufallszahl <= 50) then Bearbeitungszeit[maschine]:=Zeit+tb; if (Zufallszahl > 50) and (Zufallszahl <= 65) then Bearbeitungszeit[maschine]:=Zeit+Round((1+k)*tb); if (Zufallszahl > 65) and (Zufallszahl <= 80) then Bearbeitungszeit[maschine]:=Zeit+Round((1-k)*tb); if (Zufallszahl > 80) and (Zufallszahl <= 90) then Bearbeitungszeit[maschine]:=Zeit+Round((1+2*k)*tb); if (Zufallszahl > 90) and (Zufallszahl <= 100) then Bearbeitungszeit[maschine]:=Zeit+Round((1-2*k)*tb); end; if Zeit = Bearbeitungszeit[maschine] then begin Teile[maschine]:=Teile[maschine]+1; Bearbeitungsstatus[maschine]:=false; end; if Bearbeitungsstatus[3] = false AND Bearbeitungsstatus[1] = false AND TeileM3[1] = false then begin TeileM3[1]:= true; end; if Bearbeitungsstatus[3] = false AND Bearbeitungsstatus[2] = false AND TeileM3[2] = false then begin TeileM3[2]:=true; end; if TeileM3[1] = true AND TeileM3[2] = true and Bearbeitungsstatus[3] = false then begin Bearbeitungsstatus[3] := true; k:=(Random(6)+1)/20; Zufallszahl:=Round(Random(99)+1); if (Zufallszahl >= 1) and (Zufallszahl <= 50) then Bearbeitungszeit[3]:=Zeit+100; if (Zufallszahl > 50) and (Zufallszahl <= 65) then Bearbeitungszeit[3]:=Zeit+Round((1+k)*100); if (Zufallszahl > 65) and (Zufallszahl <= 80) then Bearbeitungszeit[3]:=Zeit+Round((1-k)*100); if (Zufallszahl > 80) and (Zufallszahl <= 90) then Bearbeitungszeit[3]:=Zeit+Round((1+2*k)*100); if (Zufallszahl > 90) and (Zufallszahl <= 100) then Bearbeitungszeit[3]:=Zeit+Round((1-2*k)*100); end; if Zeit = Bearbeitungszeit[3] then begin Bearbeitungsstatus[3] := false; TeileM3[1]:=false; TeileM3[2]:=false; Teile[3]:=Teile[3]+1; end; end; end; Form1.LM1Anzeige.caption:=IntToStr(Teile[1]); Form1.LM2Anzeige.caption:=IntToStr(Teile[2]); Form1.LM3Anzeige.caption:=IntToStr(Teile[3]); end; Hoffe mir kann jemand helfen, ist echt ein wichtiges Projekt für die Uni und finde einfach den Fehler nicht... + Multi-Zitat Zitieren
#2 6. Dezember 2011 AW: Delphi/Pascal: Rätsel für schlaue Köpfe Dein Fehler müsste hier liegen: Code: if Bearbeitungsstatus[3] = false AND Bearbeitungsstatus[1] = false AND TeileM3[1] = false then begin TeileM3[1]:=true; end; if Bearbeitungsstatus[3] = false AND Bearbeitungsstatus[2] = false AND TeileM3[2] = false then begin TeileM3[2]:=true; end; Du willst dort abfragen, ob für Maschine 3 ein Teil aus Maschine 1 bzw. 2 zur Verfügung steht. Wenn du es so machst, wird aber nicht unterschieden, ob die Maschine stillsteht, weil schon ein Teil produziert wurde oder weil noch nicht mit der Produktion begonnen wurde, da Bearbeitungsstatus in beiden Fällen auf false steht. Ich würde da eher abfragen, ob Teile[maschine] > 0 ist. Dürfte nicht falsch werden, wenn du's einfach noch als zusätzliche Bedingung einfügst. Wenn ich das richtig sehe, brauchst du dann aber den Bearbeitungsstatus gar nicht mehr abfragen. + Multi-Zitat Zitieren
#3 14. Dezember 2011 AW: Delphi/Pascal: Rätsel für schlaue Köpfe Soweit ich weiß, muss man in VB AND Verknüpfungen einklammern, sonst funktionieren sie nicht (richtig). + Multi-Zitat Zitieren