Storage Rack Data Log

RossT93

Member
Join Date
Jan 2020
Location
England
Posts
5
Hi all,

New to the forum and first time posting, so be gentle please...

I'm currently creating a virtual factory on Factory I/O, using RSLogix 5000 to control it. I am trying to sort the storage rack code before moving on to add conveyors and sorting stations etc...

Currently I have a stacker crane moving pallets into storage racks, filling the location and returning to the home position to retrieve the next pallet, as it arrives.

I'm using a PEC and counter to keep track of the incoming pallets and then filling up the storage spaces 1 by 1 (Not ideal, I know).

My question is, how do I track what storage locations are already full and then use that information to determine where to put the next pallet?

A stacker crane on the other side of the rack will unload the pallets from the filled locations, hopefully using FIFO, but I need to track the storage unit data first of all.

Thanks in advance,

RossT93.
 
We need a bit more information, for example, are you storing codes or just location full/empty. if codes are they ASCII or decimal. if it's just full/empty then you could use a simple bit arrays as storing ASCII takes a lot of memory.
Also, how do you determine what location is emptied first, etc?. are the racks in-line or is it a matrix i.e. 10x3 so many questions.
 
Hi Parky,

Thanks for the quick response.

I only need to store location full/empty data.

There are 54 storage locations, 9 columns and 6 rows. These locations can be filled in any order, but are currently filling from 1-54, as pallets arrive at the incoming conveyor.

Currently, I am using EQUAL instructions for the X and Z Axis encoder positions of the pallet loader to determine if the loader has been to a specific location. If it has been to a location, I am moving a 1 into an array of INT data types [55] long.

So when X and Z encoder values match with location 1, the array Storage_Unit_1.Rack_Full[1] is set to 1. This would continue as the storage rack fills up.

However, this is due to me using the counter of the incoming pallets to set a pointer position to go to. I would rather the number of incoming pallets did not matter and the array of INT as mentioned above was evaluated to find a 0, and the loader moves to that available location.

Hope this makes things a little clearer,

Cheers.
 
I suppose there is a number of ways you could do it i.e. col/row matrix or simpler, iterate through the single dimension array in a for/next loop or equivalent point to first register and indirectly address it, increment the pointer counter test for 1 or 0 to find first free location. I do not have RSL installed at the moment so could not give you any code but I will try to do a simple one in Mitsubishi. I suppose that the increment could be done one every scan as it should not require fast computing time to determine location.
for example:
Pallet ready for collection bit
Set pointer to 1
point indirectly to the first location
check if 0
If 0 store location number for transfer exit check.
else increment pointer counter and loop back (could be every scan rather than loop back).
Note: it is a good idea to have limits check on the pointer to ensure you do not go over.
 
Hi Parky,

I'm not sure I follow what you mean, exactly.

How do I check if a value within the array is equal to 0?

What do you mean by loop back?

Maybe some sample code would help.

Thanks for the advice.
 
Here is a couple of quick and dirty ways of checking for next location
It will find the next location based on order of free slots from 1-54
Again have not got RSL but gives you an idea note second one is probably best

For Next loop for array.png Checking Next Free location for array.png
 
a multi dimensional array is he way to handle it
Pos no. , full / empty, horz position. vert position
you could add whatever other information you want maybe item number
laser position sensor to position the carrier
it's been done many times
 
Thanks Parky for the advice using the Mitsu code.

Gary S,

I have created a UDT for the axis position, which holds both the X and Z positional values for each space on the storage racks.

So the UDT has 2 REAL values in it-

Storage_Unit_Position[1]
- Storage_Unit_Position[1].Z_Axis_Position (REAL)
- Storage_Unit_Position[1].X_Axis_Position (REAL)

When the pallet enters the conveyor, the PEC counts up the value and MOV to the pointer position.

I am then moving Storage_Unit_Position[Pointer] to the outputs for the Z and X axis motors.

So I should add another element into the UDT array for empty/full?

Even so, I'm still not understanding how to use that information to determine what empty position to load the pallets into (as this value will become the new pointer value from above).

Thanks,

RossT93.
 
do a file search to find the first open position
don't forget to reset the full field when the remove a pallet
some places use a product code I a field then you can just search for the product you want and retrieve it.
 
Yes you could use a function to find the first "1" in the array, As I said I do not have RSL installed & for the life of me remember some of the functions, Mitsubishi also has a similar function but as it will not explain how it works and is totally different. the code below is the same as find first in FBD it works by setting a pointer to 1, then it indirectly points to the first register in the array, if it is "0" then sets the location word to 1 i.e. location 1 is the first location that is free, it then sets the pointer to point at the end of the array so when incremented on the next scan the comparison sets the pointer back to the start of the array. if no location is found to be free then it increments the pointer to the next location and on the next scan, it checks the next location and so on. as soon as you have reset a location when a pallet is removed this becomes available.
You could do this by jumps back (similar to for/next) to do it all in one scan but if you are happy using the built-in functions to find first free slot in the array it makes sense. If you decide to use a multidimensional array then it could become a little tricky, and see no point as you would have to prioritize what column, if this was 1-9 & row 1-6 then it's the same thing as 1-54
Forgot to add: "Location_Number" is where the first location is so in this example locations 1-5 are all "1" i.e. full 6 is the next location that is free. if this is filled then the logic will iterate through the array to find the next one that is free.

Checking Next Free location for array.png
 
Last edited:

Similar Topics

I have a few questions about Studio5000. 1. Why is my RA folder so big? its well over 100 GB. 2. How do you delete versions or extra files...
Replies
3
Views
273
I'm working on an application and have hit a bit of a snag. I need to find an industrial touchscreen display that can: - Tolerate down to -40C...
Replies
7
Views
755
I noticed that ME Terminal Info gives you lots of good info about the panelview except one VERY important one, that is how much available flash...
Replies
0
Views
572
Hello All, We have a customer where we are trying to help diagnose and fix hydraulic leaks. Because of the operator of the machines, we cannot be...
Replies
13
Views
4,421
Hey guys how would you approach the spreadsheet screen part? I searched and everyone points out that using parameters to display this information...
Replies
0
Views
750
Back
Top Bottom