Cancel
Showing results for 
Search instead for 
Did you mean: 

Creating MUs with Source Method on Palette in the appropriate amount

Valued Contributor
Valued Contributor

Hello Community,

I am running into problems creating the exact amount of necessary units per skid.

I thought I set up an adjustable amount of MUs as a global variable to decide how many are created;
but apparently, I have mistakes in my source method creating the MU´s.
As a beginner, I would be very happy for any hint.
It might very well be that my exit strategy on the following machines
is just simply blocking the delivery of the new palettes because "blocking" is checked.
I am currently still working on the later stages.
The strange thing about this is, that the first palette works perfectly;
but the second palette is over-loaded; if I set a LOT (batch) value of 10;
the second palette will still have 20 units packed on it.
If possible, i want to move the packed palettes instantly before they get crammed with too
many or different units.

thank you very much for your feedback

5 REPLIES 5
Highlighted

Re: Creating MUs with Source Method on Palette in the appropriate amount

Creator
Creator

It will become a quiete time consuming to dig for the bug in your model this way.

 

What you can do is debug your methods by setting a break point ( debug )  at the beginning

 

of your method code and then step through. If you still have no luck , post the model.

 

 

The last last screen shot is highlighting a bug "unbekannter Bezeichner..."

 

Check the triggering mu (@) for the userdefined attribute "Teiletyp"  as doesn't seem to exist.

 

 

Re: Creating MUs with Source Method on Palette in the appropriate amount

Valued Contributor
Valued Contributor

Thank you very much for your response, simulator1;

Yes, I have to go step by step.
I cleaned up my source method. 
looking at the printed output in the console it seems its still doing a lot of idling cycles when creating MU`s.

My model is for researching and simulating the effects of different production batch sizes on the production line's key values. For that reason, I set a global variable for the batch size (Losgröße), which can be adjusted by executing the method "set Batch size" (LosgrößeSetzen). Then, my Init method calls upon starting the experiment my "Create MU" method in the source (BEsErzeugen in Eingang).

Now, I can see that the process is running, looking at the output prints; but it does loop tremendously more often than it actually puts out new palettes (THM0) with parts in it. I get hundreds of loops while actually only 2 palettes are sent out.

So my thought was to insert a check if there is an empty palette in the source before looping the production of MUs to prevent idle cycles. I was wondering if I should use inspect/then or if/then.
I was looking into line 42 for that...

My creation method currently consists of 4 levels of loops.
1) looping the number of loops of batches to match the total number of parts to be produced (cycles, k)
2) the loop for producing all the 8 components of the finished product (j)
3) the loop for creating all the units of one batch (with a check if 1 or more palettes are needed, there might be a syntax error)
4) the loop for the particular palette (in most scenarios one batch will exceed the capacity of 1 palette)

So my problem is to negate the idle cycling in unit production.frage1.PNGSource Method Creating MU's
This time I attached the model for you, I hope I was able to trim the code and get the question to the point ;-)
thank you very much!

Re: Creating MUs with Source Method on Palette in the appropriate amount

Gears Esteemed Contributor Gears Esteemed Contributor
Gears Esteemed Contributor

I dont have version 11, but I think, I can help you

 

- first: let the source create the containers

- call the method only once as exit control in the source (not init, not entrance control of the source)

- you need to wait for the next container, if you release one

So there are only two changes in your code:

 

is
	BElieferzeit:time; 			--1 .LO.N.Groblayout.Eingang.Liefertabelle
	BE:object; 					--2 .LO.N.Groblayout.Eingang.Liefertabelle
	BEanzahl:integer;			--3 .LO.N.Groblayout.Eingang.Liefertabelle
	BEname:string;				--4 .LO.N.Groblayout.Eingang.Liefertabelle
	ZuPacken:integer;			--Einheiten die noch auf die selbe Palette sollen
	Losgröße:integer;			--dient dem Abgleich mit der Losgröße
	Verbleibend:integer;		--dient der Berechnung verbleibender Einheiten für die bearbeitete Palette
	MaxTeileProTHM0:integer;	--Maximum der auf eine Palette passenden Einheiten
	NächsteStation:object;
	i:integer;			--index für hochzählen der Teile pro Palette bis Losgröße		
	j:integer;			--index für Springen zwischen den Los-Teiletypen
	k:integer;			--index für Anzahl der Durchläufe	
	l:integer;			--index für Anzahl der bereits gefüllten Paletten falls die Losgröße größer ist
	Gesamtzahl:integer;
	Durchläufe:integer;
	
do	
	ZuPacken:=.LO.N.Groblayout.Losgröße;
	Losgröße:=.LO.N.Groblayout.Losgröße;
	Durchläufe:=.LO.N.Groblayout.Durchläufe;
		k:=0;
	--Durchlaufschleife für alle Lose bis Gesamtzahl
		while k < Durchläufe loop 
			j:=1;	
		--Durchlaufschleife für je 8 Teiletypen pro Los
			while j < 8 loop
				BElieferzeit:=self.~.liefertabelle[1,j];		
				BE:=self.~.liefertabelle[2,j];				
				BEanzahl:=self.~.liefertabelle[3,j]; 			
				BEname:=self.~.liefertabelle[4,j];			
				l:=0;								--Zählindex für vollgepackte Paletten
				MaxTeileProTHM0:=BE.TeileProTHM0;
				Verbleibend:=.LO.N.Groblayout.Losgröße;
			--Durchlaufschleife für eine Palette (bis Palette voll oder Los abgearbeitet)
				while Verbleibend > 0 loop
					i:=0;							--Zählindex gepackte Einheiten
					--.LO.FHM.THM0.erzeugen(Eingang); --Palette bereitstellen macht die Quelle
					if MaxTeileProTHM0 <= Verbleibend then
							ZuPacken := MaxTeileProTHM0;
						Else ZuPacken := Verbleibend;
					end; --hier Abfrage einfügen "if THM0.leer then" um "leerlauf" zu verhindern?
						
						while i < ZuPacken loop 	
							BE.erzeugen(self.~.inhalt); --Teile erzeugen
							i := i + 1;
							print "ZuPacken sind hier ", to_Str(ZuPacken);
						end;
						--end;
					NächsteStation:=@.inhalt.Arbeitsschritte[1,2];
					@.umlagern(NächsteStation);	--volle Palette umlagern
					waituntil ?.belegt prio 1;
					
					l:=l+1; 
					print "l ist jetzt !!! ", to_Str(l);
					Verbleibend:=Losgröße-(l*ZuPacken); 
					print "Verbleibend nach diesem Packen ist ", to_Str(Verbleibend);
				end; --Für nächste Palette (l) aufzählen, zurückspringen
				print "In Liefertabelle abgearbeitete Zeile (Erzeugen) ist ", to_Str(j);		
				j := j + 1;
			end; --Für nächsten Teiletyp (j) hochzählen, zurückspringen 
		k:=k+1; 
		print "Es wurden so viele Teile Produziert:", to_Str(k), " mal Losgröße ", to_Str(Losgröße); 
	end; --Für nächstes Los (k) zurückspringen
	--ende
end;
Steffen Bangsow
freelance simulation specialist  
web: www.bangsow.eu
mail: steffen@bangsow.net

Re: Creating MUs with Source Method on Palette in the appropriate amount

Gears Esteemed Contributor Gears Esteemed Contributor
Gears Esteemed Contributor

I dont have version 11, but I think, I can help you

 

- first: let the source create the containers

- call the method only once as exit control in the source (not init, not entrance control of the source)

- you need to wait for the next container, if you release one

So there are only two changes in your code:

 

is
	BElieferzeit:time; 			--1 .LO.N.Groblayout.Eingang.Liefertabelle
	BE:object; 					--2 .LO.N.Groblayout.Eingang.Liefertabelle
	BEanzahl:integer;			--3 .LO.N.Groblayout.Eingang.Liefertabelle
	BEname:string;				--4 .LO.N.Groblayout.Eingang.Liefertabelle
	ZuPacken:integer;			--Einheiten die noch auf die selbe Palette sollen
	Losgröße:integer;			--dient dem Abgleich mit der Losgröße
	Verbleibend:integer;		--dient der Berechnung verbleibender Einheiten für die bearbeitete Palette
	MaxTeileProTHM0:integer;	--Maximum der auf eine Palette passenden Einheiten
	NächsteStation:object;
	i:integer;			--index für hochzählen der Teile pro Palette bis Losgröße		
	j:integer;			--index für Springen zwischen den Los-Teiletypen
	k:integer;			--index für Anzahl der Durchläufe	
	l:integer;			--index für Anzahl der bereits gefüllten Paletten falls die Losgröße größer ist
	Gesamtzahl:integer;
	Durchläufe:integer;
	
do	
	ZuPacken:=.LO.N.Groblayout.Losgröße;
	Losgröße:=.LO.N.Groblayout.Losgröße;
	Durchläufe:=.LO.N.Groblayout.Durchläufe;
		k:=0;
	--Durchlaufschleife für alle Lose bis Gesamtzahl
		while k < Durchläufe loop 
			j:=1;	
		--Durchlaufschleife für je 8 Teiletypen pro Los
			while j < 8 loop
				BElieferzeit:=self.~.liefertabelle[1,j];		
				BE:=self.~.liefertabelle[2,j];				
				BEanzahl:=self.~.liefertabelle[3,j]; 			
				BEname:=self.~.liefertabelle[4,j];			
				l:=0;								--Zählindex für vollgepackte Paletten
				MaxTeileProTHM0:=BE.TeileProTHM0;
				Verbleibend:=.LO.N.Groblayout.Losgröße;
			--Durchlaufschleife für eine Palette (bis Palette voll oder Los abgearbeitet)
				while Verbleibend > 0 loop
					i:=0;							--Zählindex gepackte Einheiten
					--.LO.FHM.THM0.erzeugen(Eingang); --Palette bereitstellen macht die Quelle
					if MaxTeileProTHM0 <= Verbleibend then
							ZuPacken := MaxTeileProTHM0;
						Else ZuPacken := Verbleibend;
					end; --hier Abfrage einfügen "if THM0.leer then" um "leerlauf" zu verhindern?
						
						while i < ZuPacken loop 	
							BE.erzeugen(self.~.inhalt); --Teile erzeugen
							i := i + 1;
							print "ZuPacken sind hier ", to_Str(ZuPacken);
						end;
						--end;
					NächsteStation:=@.inhalt.Arbeitsschritte[1,2];
					@.umlagern(NächsteStation);	--volle Palette umlagern
					waituntil ?.belegt prio 1;
					
					l:=l+1; 
					print "l ist jetzt !!! ", to_Str(l);
					Verbleibend:=Losgröße-(l*ZuPacken); 
					print "Verbleibend nach diesem Packen ist ", to_Str(Verbleibend);
				end; --Für nächste Palette (l) aufzählen, zurückspringen
				print "In Liefertabelle abgearbeitete Zeile (Erzeugen) ist ", to_Str(j);		
				j := j + 1;
			end; --Für nächsten Teiletyp (j) hochzählen, zurückspringen 
		k:=k+1; 
		print "Es wurden so viele Teile Produziert:", to_Str(k), " mal Losgröße ", to_Str(Losgröße); 
	end; --Für nächstes Los (k) zurückspringen
	--ende
end;

 

Steffen Bangsow
freelance simulation specialist  
web: www.bangsow.eu
mail: steffen@bangsow.net

Re: Creating MUs with Source Method on Palette in the appropriate amount

Valued Contributor
Valued Contributor

Hello, and thank you very much, Mr. B.
the book "Plant Simulation und SimTalk - Praxishandbuch" is the best I saw so far.

Everything works now as planned and I can proceed with the next steps;
thank you very much.