Showing results for 
Search instead for 
Do you mean 
Reply
Solved! Go to solution

Pick and Place Pull Control Problem

Hello,

 

I'm having trouble with a pick and place robot. It is supposed to move shells from two separate cooling lines, rotate each one on a turnplate(LR_7), and move them to the Shell_Expander. If the Shell Expander is occupied then the robot moves the shells to a buffer until the Shell Expander is available. If the buffer is full then the robot waits until it can pull out a shell and place it on the Shell Expander.

 

The problem I am having is when the entire line gets backed up causing the cooling lines get backed up to the source, the robot will place one shell on the turnplate and will not wait until the shell is finished on the turnplate to pick up another shell off the other line. Since the second shell is also destined for the turnplate, which is occupied, this causes the robot to get stuck.

 

I'm not exactly sure why this only happens when the cooling lines get backed up, but I would assume that it has something to do with the blocklist in the pull control as the first shell that gets stuck on the turnplate has a newer MU number than the next shell.

 

Here is the pull control for the pick and place robot:

var blockList:table
?.fwBlockList(blocklist)

If .Models.Frame.Buffer.Full = true
	for var y := 1 to blocklist.yDim
		if blocklist[1,y].~.full = true
			?.unblock(blockList[1,y])
		end
	next
elseif .Models.Frame.LR_7.Occupied = true
	for var y := 1 to blocklist.yDim
		if blocklist[1,y].~.full = true
			?.unblock(blockList[1,y])
		end
	next
else
	?.unblock(blockList[1,1])
end

 

Also, here is the target control for clarity:

if ?.empty
	return
end

if @.LastStation = "Source"
	if .Models.Frame.LR_7.occupied = false
		?.setDestination(LR_7)
		@.LastStation := "LR_7"
	end
elseif @.LastStation = "LR_7"
	if .Models.Frame.Shell_Expander.occupied = true 
		?.setDestination(Buffer)
		@.LastStation := "Buffer"
	elseif .Models.Frame.Buffer.occupied = true
		?.SetDestination(Buffer)
		@.LastStation := "Buffer"
	else
		?.SetDestination(Shell_Expander)
		@.LastStation := "Shell_Expander"
	end
elseif  @.LastStation = "Buffer"
	.Models.Frame.Buffer.ExitLocked := true
	?.SetDestination(Shell_Expander)
	 @.LastStation := "Shell_Expander"
end

 

I did not write this control besides a slight modification and I don't have any experience with pull controls so I'm not exactly sure of how they work. It's probably something small that I'm missing.

 

Thanks!

5 REPLIES

Re: Pick and Place Pull Control Problem

can you make a little example with your settings? Or can you post your model?


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


Re: Pick and Place Pull Control Problem

The original model is quite complex so I reduced it down to just the problem area:

Solution
Solution
Accepted by topic author kg21em
‎10-05-2016 11:52 AM

Re: Pick and Place Pull Control Problem

[ Edited ]

I have changed the structure of your pull control.

To get more information about the pull control, look in the halp --> pullCtrl

 

I have splitted your code in several decision blocks. You need to check the location (~) of the MUs in the loops, to move the right one. For moving from the turntable to the buffer, you need to check, if the buffer is not full.

 

This works:

 

-- @,?: the object the control was called for
var blockList:table
?.fwBlockList(blocklist)

if LR_7.empty then
	for var y := 1 to blocklist.yDim
		if blocklist[1,y].~ = Cooling1 or 
			blocklist[1,y].~ = Cooling2 then
			?.unblock(blockList[1,y])
			return
		end
	next
	
end

if .Models.Reynosa.Line_4.LR_7.Occupied = true and buffer.full=false
	for var y := 1 to blocklist.yDim
		if blocklist[1,y].~ = LR_7
			?.unblock(blockList[1,y])
			return
		end
	next
end

If .Models.Reynosa.Line_4.Buffer.Full = true
	for var y := 1 to blocklist.yDim
		if blocklist[1,y].~ = buffer
			?.unblock(blockList[1,y])
			return
		end
	next
	return --do not continue here
end



--fifo
?.unblock(blockList[1,1])

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


Re: Pick and Place Pull Control Problem

It works great now! Thank you very much for the explanation!

Re: Pick and Place Pull Control Problem

I think that I now better understand how the pull control works. I ran into another problem that caused the robot to get stuck again if the sources are constantly producing shells. I added more to the second decision block to remedy this. It now works when the sources are both constantly producing shells or producing shells at an interval.

var blockList:table
?.fwBlockList(blocklist)

if LR_7.empty then
	for var y := 1 to blocklist.yDim
		if blocklist[1,y].~ = Cooling1 or 
			blocklist[1,y].~ = Cooling2 then
			?.unblock(blockList[1,y])
			return
		end
	next
	
end

if .Models.Reynosa.Line_4.LR_7.Occupied = true and buffer.full=false
	for var y := 1 to blocklist.yDim
		if blocklist[1,y].~ = LR_7
			?.unblock(blockList[1,y])
			return
		end
	next
	for var y := 1 to blocklist.yDim
		if blocklist[1,y].~ = buffer
			?.unblock(blockList[1,y])
			return
		end
	next
	return
end

If .Models.Reynosa.Line_4.Buffer.Full = true
	for var y := 1 to blocklist.yDim
		if blocklist[1,y].~ = buffer
			?.unblock(blockList[1,y])
			return
		end
	next
	return --do not continue here
end



--fifo
?.unblock(blockList[1,1])