Tomar artículos de racks y almacenar en cola

santiago_t2
Not applicable
1 View
8 Replies
Message 1 of 9

Tomar artículos de racks y almacenar en cola

santiago_t2
Not applicable

[ FlexSim 21.2.4 ]

Saludos. Estoy realizando una simulación en el cual se debe tomar algunos productos de los racks para luego almacenarlos en diferentes colas, estos productos tienen etiquetas las cuales quiero almacenar según su correspondiente etiqueta. Estoy utilizando operarios para que transporten los productos, pero ellos solo los toman de forma aleatoria y no según su etiqueta. Para el desarrollo de este proceso estoy utlizando la herramienta process Flow.

productos.png

Espero puedan ayudarme. Gracias!

Accepted solutions (1)
2 Views
8 Replies
Replies (8)
Message 2 of 9

moehlmann_fe
New Member
New Member
Accepted solution

You can use the "Query/Object/Array" field to define conditions that the item has to fulfill in order to be pulled. The query supports two basic SQL commands: "WHERE" and "ORDER BY"

"WHERE" defines a condition, for example a certain label value.

"ORDER BY" orders the eligible list entries by a certain value.

To use these, the list should contain a "field" with the value you want to use in your query. The default "ItemList" has four fields: The "Type" label, the "age" (how long the item has been on the list), the "distance" (physical distance between "puller" and the item) and "queueSize" (how many items are inside the items storage object/location).

1635845221775.png

You can add more fields via the green plus-symbol at the top of the list properties.

These field values can then be compared to static values or, for example, label values on the "puller". The puller is the object that tries to pull an entry from the list. By default, this will be the token when using the "Pull from List" activity.

"WHERE Type = 1" would only pull items with the type label value of 1 from the list.

"WHERE Type = puller.Type" would only pull items whose type is equal to the token's type label value.

The attached model demonstrates this. Each token in the process flow represents a queue and will only pull items whose type is equal to the "Type" label on the respective queue. They are also ordered by "age" in descending order, meaning the item that has been on the list the longest gets pulled first.

ListQuery.fsm

Relevent section of the manual:

https://docs.flexsim.com/en/21.2/ConnectingFlows/Lists/WorkingWithLists/WorkingWithLists.html#querie...


Google Translate:

Puede utilizar el campo "Consulta / Objeto / Matriz" para definir las condiciones que el elemento debe cumplir para ser extraído. La consulta admite dos comandos SQL básicos: "WHERE" y "ORDER BY"

"WHERE" define una condición, por ejemplo, un determinado valor de etiqueta.

"ORDER BY" ordena las entradas de la lista elegibles por un valor determinado.

Para usarlos, la lista debe contener un "field" con el valor que desea usar en su consulta. El "ItemList" predeterminado tiene cuatro campos: la etiqueta "Type", la "age" (cuánto tiempo ha estado el elemento en la lista), la "distance" (distancia física entre "puller" y el elemento) y "queueSize" (cuántos elementos hay dentro del objeto / ubicación de almacenamiento de elementos).

Puede agregar más campos mediante el símbolo más verde en la parte superior de las propiedades de la lista.

Estos valores de campo se pueden comparar con valores estáticos o, por ejemplo, con valores de etiqueta en el "puller". El "puller" es el objeto que intenta extraer una entrada de la lista. De forma predeterminada, este será el token cuando se utilice la actividad "Pull from List".

"WHERE Type = 1" solo extraería elementos con el valor de etiqueta de tipo de 1 de la lista.

"WHERE Type = puller.Type" solo extraería elementos cuyo tipo sea igual al valor de la etiqueta de tipo del token.

El modelo adjunto demuestra esto. Cada token en el flujo de proceso representa una cola y solo extraerá elementos cuyo tipo sea igual a la etiqueta "Tipo" en la cola respectiva. También están ordenados por "edad" en orden descendente, lo que significa que el elemento que ha estado en la lista por más tiempo se extrae primero.

0 Likes
Message 3 of 9

santiago_t2
Not applicable

Saludos, @Felix Möhlmann

En el caso de querer almacenar cajas, pero este almacenaje se debe basar en una tabla la cual contiene el tiempo, la cantidad y etiquetas: "type" y ''queue''. ¿Como puedo hacer para que los operarios tomen las cajas segun el tipo y lo almacenen en su cola destino tal como lo indica la tabla ?

Estoy usando la herramienta processflow y generando la tabla en (schedule souce)

box.pnglabals.png

model

Item_and_labals.fsm

Muchas gracias!

0 Likes
Message 4 of 9

moehlmann_fe
New Member
New Member

Since the type label on the token determines the type of the item, you use that in the query ("WHERE Type = puller.Type", as the "puller" is the token).

You can use the queue label to reference the correct queue in the "Unload" activity. Either by name with

Model.find("Queue" + string.fromNum(token.Queue))
// Model.find() returns a reference to the object with the given name
// To get the correct name I add the number from the label onto the word "Queue"

or by using the label value the rank in their respective group

Group("Queue")[token.Queue]
// "Queue" is the name of the group containing the queues

I reduced the arrival times in the example model, so the function can be observed earlier.

item-and-labals_2.fsm


Google Translate:

Dado que la etiqueta de tipo en el token determina el tipo de artículo, lo usa en la consulta ("WHERE Type = puller.Type", ya que el "puller" es el token).

Puede utilizar la etiqueta de la cola para hacer referencia a la cola correcta en la actividad "Unload". O por nombre con

Model.find("Queue" + string.fromNum(token.Queue))
// Model.find() devuelve una referencia al objeto con el nombre dado 
// Para obtener el nombre correcto, agrego el número de la etiqueta a la palabra "Queue"

o usando el valor de la etiqueta el rango en su grupo respectivo

Group("Queue")[token.Queue]
// "Queue" es el nombre del grupo que contiene las colas

Reduje los tiempos de llegada en el modelo de ejemplo, por lo que la función se puede observar antes.

0 Likes
Message 5 of 9

santiago_t2
Not applicable

Saludos, @Felix Möhlmann

En el ejemplo anterior se observa a cada operario cargar una caja a la vez, ¿Cómo puedo aumentar la cantidad de cajas que transporta cada operario ?

cajas.png

Eh intentado hacerlo aumentando su capacidad máxima tanto en el operario como en el processFlow pero no funciona.

Muchas gracias!

0 Likes
Message 6 of 9

moehlmann_fe
New Member
New Member

To load more than one item, you first need to pull multiple entries from to list.

1636010685669.png

Instead of a single reference, the label you assign the pulled values to will be an array of all pulled items. To load and unload them one by one, you can use a "Run Sub Flow" activity. The quantity should be set to the length of the array, and the option "Run Tokens One at a Time" should be active. At the bottom of the activity properties, you have to assign one entry from the array to the sub flow token, that should be loaded.

1636010882955.png

You can either batch multiple tokens together or only create one token per Type/Section combination. This token should hold the information how many items should be picked in total.

1636011680595.png

Each time items are pulled from the list, that label is decremented by the respective amount. If it is not zero after the items were unloaded, the token can then loop back around to pull more items.

In the attached example the operators can load a maximum of three items. "Math.min(token.Quantity, 3)" means the token will either pull items up to the required quantity, or 3, whichever is smaller.

item-and-labals-3.fsm

Google Translate:

Para cargar más de un elemento, primero debe extraer varias entradas de la lista.

En lugar de una única referencia, la etiqueta a la que asigne los valores extraídos será una matriz de todos los elementos extraídos. Para cargarlos y descargarlos uno por uno, puede utilizar una actividad "Ejecutar subflujo". La cantidad debe establecerse según la longitud de la matriz y la opción "Run Tokens One at a Time" debe estar activa. En la parte inferior de las propiedades de la actividad, debe asignar una entrada de la matriz al token de subflujo, que debe cargarse.

Puede agrupar varios tokens juntos o solo crear un token por combinación de tipo/sección. Este token debe contener la información de cuántos artículos deben seleccionarse en total.

Cada vez que se extraen artículos de la lista, esa etiqueta se reduce en la cantidad respectiva. Si no es cero después de que se descargaron los elementos, el token puede retroceder para extraer más elementos.

En el ejemplo adjunto, los operadores pueden cargar un máximo de tres elementos. "Math.max(token.Quantity, 3)" significa que el token aumentará los artículos hasta la cantidad requerida, o 3, lo que sea menor.

0 Likes
Message 7 of 9

santiago_t2
Not applicable

Saludos, @Felix Möhlmann

Para finalizar la simulación;

En el ejemplo anterior se visualiza a los operarios hacer turnos para almacenar las cajas, es decir no trabajan juntos al mismo tiempo completando la misma actividad.

1.png

2.png

como ejemplo eh modificado la cantidad de productos, pero al tratar que ambos operarios cumplan una misma actividad, lo que hacen es duplican la cantidad de cajas

item-and-labals-3.1fsm.fsm

¿Como podría hacer para que los operarios trabajen juntos completando la misma actividad sin duplicar la cantidad de cajas?

Muchas gracias!

0 Likes
Message 8 of 9

moehlmann_fe
New Member
New Member

For this I'd suggest to go back to creating one token per item.

1636107788154.png

Then use a "Batch" activity to combine N tokens together into one, where N is the number of items an operator can carry at a time. As the quantity will not always be a multiple of that capacity, use the "Max Wait Timer" option to release the last token with only partial quantity.

To group the tokens by the combination of Type and Queue I create a label "TypeQueue" that combines those two numbers into one. This is then used in the "GroupBy" field of the batch activity.

1636108096031.png1636108368919.png

As each token will now only represent as many items as an operator can carry, the decide activity and loop back to the start are not needed anymore.

item-and-labals-4.fsm

Obligatory Translation from Google:

Para esto, sugiero volver a crear un token por artículo.

Luego, use una actividad de "Batch" para combinar N tokens en uno, donde N es la cantidad de elementos que un operador puede transportar a la vez. Como la cantidad no siempre será un múltiplo de esa capacidad, use la opción "Use Max Wait Timer" para liberar la última ficha con solo una cantidad parcial.

Para agrupar los tokens por la combinación de Tipo y Cola, creo una etiqueta "TypeQueue" que combina esos dos números en uno. A continuación, se utiliza en el campo "GroupBy" de la actividad del lote.

Como cada token ahora solo representará tantos elementos como pueda llevar un operador, la actividad de decisión y el bucle de regreso al inicio ya no son necesarios.

0 Likes
Message 9 of 9

santiago_t2
Not applicable
Muchas gracias!
0 Likes

Type a product name