Pick and Place Pull Control Problem

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.

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])

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])