[Code] Delphi/Pascal: Rätsel für schlaue Köpfe ;)

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von $$$moq, 6. Dezember 2011 .

  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...
     
  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.
     
  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).
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.