Sistemas_Integrados_Fabricacion_Pr4

Sistemas_Integrados_Fabricacion_Pr4 preview image

1 collaborator

Default-person Manuel Alcazar (Author)

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by everyone
Model was written in NetLogo 5.3.1 • Viewed 155 times • Downloaded 12 times • Run 0 times
Download the 'Sistemas_Integrados_Fabricacion_Pr4' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


Info tab cannot be displayed because of an encoding error

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

;; Indice de funciones
; setup - Inicializa
; create-path - Crea la ruta
; create-workers - Crea las personas
; create-AGVs - Crea los Auto Guided Vehicles
; move-AGVs - Mueve tanto las personas como los vehiculos
; go - realiza todas las tareas que hay que realizar en un ciclo



;; Creamos los subgrupos de turtles: people y trucks
breed [ people person ]
breed [ trucks truck ]
; Los trucks tendran como propiedades las tres siguientes, que seran de cada truck, aunque sean iguales
trucks-own
[
  time-load
  time-unload
  velocity
  ]
; Idem con las personas
people-own
[
  velocity
  ]
; Indicamos que variables seran globales. No hay que indicar las de los sliders de la otra pestaña, aunque tambien lo son.
; Las variables globales no hay que inicializarlas con el comando 'let'
globals
[  cycletime lasttick delivery-rate ncycles ]

;; Funcion setup

to setup
  clear-all   ; Borramos
  reset-ticks ; Reiniciamos ticks
  ask patches [set pcolor white ] ; Ponemos el fondo de color blanco
  create-path ; Llamamos a las siguientes tres funciones
  create-workers
  create-AGVs
  set lasttick 0 ; lasttick sera una variable que indica en que segundo termino el ultimo ciclo
end 

to create-path
    let xbor [-20 35] ; x min , xmax
    let ybor [-20 20] ; y min , ymax
    let x0 mean xbor  ; x media
    let y0 mean ybor  ; y media
    let xl (max xbor -  min xbor ) / 2 ; semirango de x
    let yl (max ybor -  min ybor ) / 2 ; semirango de y
  ask patches ; Para cada punto de la pantalla, pintamos las lineas con su color
  [
    if (abs( pxcor - x0 ) < xl and abs( pycor - y0 ) = yl) ; Horizontales
    [ set pcolor yellow]
    if (abs( pycor - y0 ) < yl and abs( pxcor - x0 ) = xl) ; Verticales
    [ set pcolor yellow]
    if (abs( pycor - y0 ) = yl and abs( pxcor - x0 ) = xl) ; Esquinas
    [ set pcolor black ]
    if ((pxcor = 0) and (pycor = -20)) ; Punto de carga
    [ set pcolor blue ]
    if ((pxcor = 0) and (pycor = 20)) ; Punto de descarga
    [ set pcolor red ]
   ]
end 

to create-AGVs
  create-trucks 1 [   ; Creamos un camion
    set color green   ; De color verde
    set heading 90    ; Mirando hacia la derecha
    setxy 0 -20       ; Colocado en (0 , -20)
    set shape "truck" ; Con forma de camion
    set size 3        ; Y de tamaño 3. Ojo con esto, pues parece que el camion choca, pero su tamaño real es 1
    set velocity velocidad / 60 ;
    ; set velocity velocidad / 60  + (( random 10 ) - 5) / 100 ; Esta linea esta comentada porque solo se descomenta para el apartado 5
  ]
end 

to create-workers
  create-people numpeople [      ; Creamos las personas
    set color red                ; Color rojo
    setxy random 100 random 100  ; Las colocamos aleatoriamente
    set heading random 360       ; Mirando aleatoriamente
    set shape "person"           ; Con forma de personas
    set size 3                   ; Y de tamaño tres
    set velocity ((random 100) / 50 + 0.05) ; Ojo con esta linea. Todas las personas deben moverse, pues si alguna al crearse se crea en la ruta y no se mueve, no evoluciona el ciclo
  ]
end 

to go
  let n count trucks ; n es una variable local que indica el numero de camiones
  move-AGVs          ; Ejecutamos un movimiento
  if n != count trucks  ; Si n ya no es el numero de camiones, es porque alguno ha muerto (ha terminado un ciclo). Entonces, realizamos lo que sigue
  [
    set cycletime ( ticks - lasttick ) ; Recalculamos el tiempo de ciclo como el tiempo actual menos el tiempo que termino el ciclo anterior
    set lasttick ticks                 ; Asignamos el nuevo tiempo a lasttick
    set ncycles ncycles + 1            ; Aumentamos en 1 el numero de ciclos realizados
    ; set delivery-rate (  cycletime ^ -1 * 60 ) ; Esta forma de calcular el delivery rate seria la instantanea
    set delivery-rate ncycles / ticks * 60       ; Esta forma de calcular el delivery rate seria la media acumulada
    ;; A continuacion, pintamos las graficas
    ; set-current-plot selecciona la figura en la que queremos pintar. Es equivalente a figure(i)
    ; set-plot-y-range selecciona el rango de y, va de 0 a aproximadamente dos veces el delivery-rate, redondeado para que no este continuamente fluctuando
    ; plotxt pinta lo que le digas. Primer argumento x, segundo y
    set-current-plot "Average-Delivery-Rate" set-plot-y-range 0 ceiling ( delivery-rate / 50 ) * 100 plotxy ncycles ( delivery-rate * 60  )          ; Mostramos por la grafica, en paquetes / hora
    set-current-plot "Instant-Delivery-Rate" set-plot-y-range 0 ceiling ( delivery-rate / 50 ) * 100 plotxy ncycles ( cycletime ^ -1 * 3600 )        ; Mostramos por la grafica, en paquetes / hora
    if ncycles = 1 ; Si es la primera vez, calculamos el tiempo empleado, que sera el correspondiente a 1 AGV, y mostramos por el terminal de instrucciones. Esta es la respuesta al apartado a, creo
    [
      print (word "Datos: v = " velocidad " m/min ; load-time = " load-time " m  unload-time = " unload-time " m" )
      print (word "Tiempo de ciclo 1 AGV = " cycletime " s")
      ]
    create-AGVs ; Recordemos, estamos en el if, que se entra si hemos matado un camion. Por tanto, creamos otro, que se crea en la posicion de carga.
  ]

  if count trucks < nAGVs ; Si todavia no tenemos en pista el numero maximo de camiones ... (esto solo ocurre al principio, en el regimen transitorio. Luego esto no ocurre)
  [
   let free true ; Definimos la variable free y le asignamos el valor true
   ask trucks[ ; Si algun camion se encuentra sobre una casilla azul, que recordemos, es la casilla de carga
   if pcolor = blue [ set free false ]  ; Entonces no podemos sacar un camion al path, puesto que la casilla esta ocupada. No haremos nada, y volveremos a entrar en el ciclo en el proximo tick
   ]

   if free = true [ create-AGVs ] ; Si por el contrario, la casilla de carga esta vacia, generamos un nuevo camion
  ]
    tick
end 

to move-AGVs
  let tl load-time    ; trabajamos con variables locales
  let tu unload-time

  set tl ( tl * 60 )  ; pasamos de min -> s
  set tu ( tu * 60 )


  ask people
  [
    if-else any? trucks-on patch-ahead 1 [ left 90 ][ left random 20 right random 20] ; Le preguntamos a las personas: ¿Hay un camion delante tuya?, si lo hay, gira 90º a la izquierda, si no, gira ligeramente
    fd velocity    ; En cualquier caso, avanza la velocidad que tengas asiganada
  ]

  ask trucks
  [
    ;; Load and unload stations

    if pcolor = blue       ; Si estamos en la zona de carga
    [ if (time-load > tl) ; time-load empieza en cero, mientras que tl es un parametro que es dato de entrada. No entrara en el bucle hasta que haya pasado un tiempo tl
      [fd velocity                ; avanzamos la distancia recorrida en un segundo, que es por definicion, v (m/s)
        set time-load 0    ; Cuando hayamos entrado en el bucle, reiniciamos el contador del tiempo que lleva en la estacion de carga
        ]
      set time-load time-load + 1 ] ; Si no hemos entrado en el bucle anterior, es que el tiempo que lleva en la estacion es < tl, por tanto, aumentamos en 1 time-load

    if pcolor = red ; Si estamos en la zona de descarga, idem caso anterior pero con time-unload , tu
    [ if (time-unload > tu) ;
      [fd velocity ;
        set time-unload 0]
      set time-unload time-unload + 1 ]


    if  [ pcolor ] of patch-ahead ceiling ( 1 ) = blue    ; Si estamos a punto de volver a la zona de carga, matamos al camion
    [ die ]

    ;; Driving the AGV
    if (([pcolor] of patch-here != blue) and ([pcolor] of patch-here != red)) ; Si no estamos en las zona de carga o descarga
    [
      if (not any? turtles-on patch-ahead ceiling velocity ) [ fd velocity ]  ; Si no hay ni camiones ni personas (turtles = trucks + people) en la distancia que vamos a avanzar. Se podria usar neighbor en vez de patch-ahead, pero daria fallo
      if [pycor] of patch-here  = -20 [
       if [pxcor] of patch-here = 35 [ set heading 0 ]   ; southeast
       if [pxcor] of patch-here = -20 [ set heading 90 ] ; southwest
      ]
      if [pycor] of patch-here  = 20 [
       if [pxcor] of patch-here = 35 [ set heading -90 ]  ; northeast
       if [pxcor] of patch-here = -20 [ set heading 180 ] ; northwest
      ]
    ]
    ; Esto no se puede hacer porque a veces se queda colgado si por casualidad para en la esquina, o la velocidad es muy lenta y para avanzar una casilla tarda mas de 2 ticks
;       [pcolor] of patch-here = black ; Si estamos en la esquina
;      [ left 90 ] ; Giramos 90º antihorario

  ]
end 

There is only one version of this model, created over 7 years ago by Manuel Alcazar.

Attached files

File Type Description Last updated
Sistemas_Integrados_Fabricacion_Pr4.png preview Preview for 'Sistemas_Integrados_Fabricacion_Pr4' over 7 years ago, by Manuel Alcazar Download

This model does not have any ancestors.

This model does not have any descendants.