Cancel
Showing results for 
Search instead for 
Did you mean: 

Steuerung eines Flexiblen Produktionssystems

Creator
Creator

Guten Tag zusammen,

 

anbei eine aktuelle Version des Modells.

 

Meine Frage bezieht sich auf die Ausgangssteuerung der Einzelstationen. Und zwar möchte ich im Rahmen der Festlegung der nächsten Arbeitsstation (wo soll mein Werkstück als nächstes hin) eine Zeit als Entscheidungskriterium hinzufügen.

 

Diese Zeit soll aus drei Bestandteilen bestehen (Summe):

1. der Transportzeit zur nächsten Arbeitsstation

2. den "Bearbeitungszeiten" der auf dem Puffer befindlichen Produkte (vor der nächsten Arbeitsstation)

3. die Bearbeitungszeit des auf der nächsten Arbeitsstation befindlichen Produktes.

 

Ein kurzes Beispiel hierzu:

Befindet sich ein Produkt auf Arbeitsstation 1 und es kommen als nachfolgende Arbeitsstationen AS2 sowie AS3 in Frage, soll anhand der vorher beschriebenen Zeit entschieden werden, auf welche Arbeitsstation (bzw. auf welche Transportstrecke) umgelagert werden soll. Dabei soll immer in Richtung des Arbeitssystems mit der niedrigeren Gesamtbearbeitungszeit umgelagert werden, um eine möglichst gleichmäßige Auslastung der Arbeitsstationen zu erreichen .

 

Ich hoffe die Erklärung ist verständlich. Ich habe bereits einige Versuche unternommen, dies in meine Ausgangssteuerung zu implementieren, allerdings ohne Erfolg.

 

Daher bitte ich hier um Hilfe, ich bin für jeden Tipp dankbar.

 

Beste Grüße

 

Johann

4 REPLIES

Re: Steuerung eines Flexiblen Produktionssystems

Gears Esteemed Contributor Gears Esteemed Contributor
Gears Esteemed Contributor
was ist jetzt genau Ihre Frage?

Sie werden etwas SimTalk benötigen (siehe Hilfe) z.B.
- anzahlNF
- nf(index)
- AnzahlBEs

Transportzeiten und Bearbeitungszeiten werden Sie bestimmt irgendwo hinterlegt haben.

Erstellen Sie ein Beispiel mit allen Ihren Daten und Ihrem Versuch der Ausgangssteuerung, dann können wir Ihnen helfen.
Steffen Bangsow
freelance simulation specialist  
web: www.bangsow.eu
mail: steffen@bangsow.net

Re: Steuerung eines Flexiblen Produktionssystems

Creator
Creator

Anbei eine Modellversion bei der ich einen Versuch unternommen habe, die Ausgangssteuerung zur erstellen.

 

Ich möchte quasi eine Gesamtzeit aus der Transportzeit, der Bearbeitungszeit des Produktes im Folgearbeitssystem und den Bearbeitungszeiten der auf dem Folgepuffer befindlichen Produkte bilden und diese als Kriterium für die Ausgangssteuerung verwenden. Die Umlagerung soll zu dem Arbeitssystem erfolgen, in der zeitmäßig weniger Arbeit vorhanden ist, also eine Art belastungsorientierte Steuerung.

 

is

ap:integer; -- aktuelles Arbeitspaket
next_ap:string; -- nächstes Arbeitspaket
nextstationSmiley Surprisedbject;
poss_stationSmiley Surprisedbject;
anz_ap:integer;
i:integer;
transportSmiley Surprisedbject;
k:integer;
anztransport:integer;
vor:string;
nach:string;
auslastung_next_as:time;
transportzeit:time;
pufferbelegung:table;
pufferzeit:time;
produktSmiley Surprisedbject;
next_asSmiley Surprisedbject;
kapa_next_as:time;

do
@.ap:=@.ap+1;
ap:=@.ap;
next_ap:=.Modelle.Netzwerk.Arbeitsplan[1,@.Name][1,ap];


if next_ap ="" then                   -- falls keine Arbeitspakete mehr zu erledigen sind, umlagerung zur Senke
@.umlagern(.Modelle.Netzwerk.P99);

else

anz_ap:=.Modelle.Netzwerk.Konfiguration[2,next_ap]; -- Anzahl der Arbeitsstationen, welche dieses Arbeitspaket beherrschen
anztransport:=72; -- Anzahl aller vorhandenen Förderstrecken

for i:=1 to anz_ap loop
poss_station:=.Modelle.Netzwerk.Konfiguration[1,next_ap][2,i]; -- Bestimmung des Zielpuffers

for f:=1 to poss_station.AnzahlBEs loop -- Ermittlung der vorhandenen Arbeitszeit auf dem Zielpuffer (Summe der Bearbeitungszeiten der Produkte)
produkt:=poss_station.Inhaltsliste[1,f];
pufferzeit:=0;
pufferzeit:=pufferzeit+produkt.bz_next_ap;
next;

for k:=1 to anztransport loop -- Bestimmung der Förderstrecke

vor:=.Modelle.Netzwerk.Transportbeziehungen[1,k];
nach:=.Modelle.Netzwerk.Transportbeziehungen[2,k];
transport:=.Modelle.Netzwerk.Transportbeziehungen[3,k];
transportzeit:=.Modelle.Netzwerk.Transportbeziehungen[4,k]; -- Transportzeit zwischen der Arbeitsstation und dem Zielpuffer
next_as:=.Modelle.Netzwerk.Transportbeziehungen[5,k]; -- Folgearbeitssystem hinter dem Zielpuffer
auslastung_next_as:=next_as.Bearbeitungszeit; -- Vorhandene Arbeitszeit auf diesem Arbeitssystem

if vor=?.Name and nach=poss_station.Name then
exitLoop
end;
next;

kapa_next_as:=0;
kapa_next_as:=auslastung_next_as+transportzeit+pufferzeit; -- Ermittlung der Gesamtzeit aus Transport, den Bearbeitungszeiten der Produkte auf dem Puffer und des Produktes, welches derzeit bearbeitet wird

if poss_station.voll=true then -- hier soll anhand der vorher ermittelten Zeiten das Nachfolgearbeitssystem ermittelt werden -- dabei soll die Umlagerung auf das Arbeitssystem mit der niedrigsten Gesamtzeit erfolgen, also eine Art belastungsorientierte Steuerung

next;
else
exitLoop
end;
next;


@.umlagern(transport);

end;
end;

 

Das ist der Quelltext der Ausgangssteuerung, der mit Sicherheit einige Fehler enthält.

Außerdem scheitere ich daran, wie genau ich letztendlich das "richtige" Arbeitssystem bzw. den richtigen Nachfolgepuffer auswähle.

 

Ich hoffe sehr, Sie können mir diesbezüglich weiterhelfen, bzw. mir ein paar Denkanstöße geben.

 

Beste Grüße

 

Johann

Re: Steuerung eines Flexiblen Produktionssystems

Creator
Creator

Ausgangssteuerungslogik.png

 

 

Folgende Darstellung zeigt die Logik, welche ich versuche abzubilden.

Anbei mein Versuch dies zu realisieren.

 

Beste Grüße

 

Johann

 

Re: Steuerung eines Flexiblen Produktionssystems

Creator
Creator

Ich habe meine Steuerungslogik noch etwas überarbeitet, allerdings funktioniert diese leider immer noch nicht. Ich weiß allerdings auch nicht, ob ich dem Ziel wirklich näher gekommen bin und was genau verkehrt ist.

 

Anbei eine aktualisierte Version meines Modells..

 

Hier mein aktuell verwendeter Steuerungscode:

 

is
    ap:integer;
    next_ap:string;                        
    nextstationSmiley Surprisedbject;
    poss_stationSmiley Surprisedbject;
    anz_ap:integer;
    i:integer;
    transportSmiley Surprisedbject;
    k:integer;
    f:integer
    anztransport:integer;
    vor:string;
    nach:string;
    auslastung_next_as:time;
    transportzeit:time;
    pufferbelegung:table;
    pufferzeit:time;
    produktSmiley Surprisedbject;
    next_asSmiley Surprisedbject;
    kapa_next_as:time;
    gesamt:time;
    wegSmiley Surprisedbject;

do
    @.ap:=@.ap+1;
    ap:=@.ap;
    next_ap:=.Modelle.Netzwerk.Arbeitsplan[1,@.Name][1,ap];
    gesamt:=0;
        
if next_ap ="" then                         
    @.umlagern(.Modelle.Netzwerk.P99);

else

    anz_ap:=.Modelle.Netzwerk.Konfiguration[2,next_ap];            
    anztransport:=72;                                            
    
    for i:=1 to anz_ap loop
        poss_station:=.Modelle.Netzwerk.Konfiguration[1,next_ap][2,i];            
        pufferzeit:=0;        
        for f:=1 to poss_station.AnzahlBEs loop                                    
            produkt:=poss_station.Inhaltsliste[1,f];
            pufferzeit:=pufferzeit+produkt.bz_next_ap;
        next;
        
        for k:=1 to anztransport loop                        
            
        vor:=.Modelle.Netzwerk.Transportbeziehungen[1,k];
        nach:=.Modelle.Netzwerk.Transportbeziehungen[2,k];
        
        if vor=?.Name and nach=poss_station.Name then
            
        transport:=.Modelle.Netzwerk.Transportbeziehungen[3,k];
        transportzeit:=.Modelle.Netzwerk.Transportbeziehungen[4,k];        
        next_as:=.Modelle.Netzwerk.Transportbeziehungen[5,k];            
        auslastung_next_as:=next_as.Bearbeitungszeit;                    
        
        exitLoop;
            
            end;
        
        next;
        
        kapa_next_as:=auslastung_next_as+transportzeit+pufferzeit;        
        
                
        if poss_station.voll=false and gesamt<kapa_next_as then                                    
            gesamt:=kapa_next_as;
            weg:=transport;                                                                
    
        end;
    
        next;

    @.umlagern(weg);
    
end;
end;

 

 

Beste Grüße

 

Johann