Untitled
unknown
plain_text
3 years ago
21 kB
7
Indexable
import simpy
import random
import matplotlib.pyplot as plt
#tempi di riordino
t_raw_1= random.normalvariate(5*8,0.5)
t_raw_2 = random.normalvariate(5*8,0.5)
t_cc_1 = random.normalvariate(random.randint(16, 32),1)
t_cc_2 = random.normalvariate(random.randint(16, 32),1)
t_sep = random.normalvariate(random.randint(16, 32),0.3)
t_cases = random.normalvariate(4*8,0.5)
t_electrolyte_tank = random.normalvariate(8,0.5)
#unità prodotte per ciclo
n_raw_1= 10
n_raw_2 = 10
n_cc_1 = 150
n_cc_2 = 150
n_sep = 50
n_cases = 500
n_electrolyte_tank = 4
#critical stock
raw_1_critical_stock = (t_raw_1*n_raw_1)*2
raw_2_critical_stock = (t_raw_2*n_raw_2)*2
cc_1_critical_stock = (t_cc_1*n_cc_1)*2
cc_2_critical_stock = (t_cc_2*n_cc_2)*2
sep_critical_stock = (t_sep*n_sep)*2
cases_critical_stock = (t_cases*n_cases)*2
electrolyte_tank_critical_stock = (t_electrolyte_tank*n_electrolyte_tank)*2
#quantità di riordino
r_raw_1= raw_1_critical_stock*10
r_raw_2= raw_2_critical_stock*10
r_cc_1= cc_1_critical_stock*10
r_cc_2= cc_2_critical_stock*10
r_sep= sep_critical_stock*10
r_cases= cases_critical_stock*10
r_electrolyte_tank= electrolyte_tank_critical_stock*10
#tempo di ricarica in risorsa formation machine
ch_m=3
ch_dev=0.3
charge_time = random.gauss(ch_m, ch_dev)
#distribuzione probabilità scarti
mean_g = 1
dev_g = 0.01
quality_std = dev_g*2
#liste controlli debug
raw_1_level=[]
raw_2_level=[]
tank_1_level=[]
tank_2_level=[]
cc_1_level=[]
cc_2_level=[]
roll_1_level=[]
roll_2_level=[]
sep_level=[]
jelly_level=[]
cases_level=[]
open_cells_level=[]
electrolyte_tank_level=[]
final_cells_level=[]
dispatch_level=[]
counter = []
reject_level = []
control=[]
#----------------------------------PROCESSI -----------------------------------
def ink (env, gigafactory, line): #INK MIXING PROCESS, prende dai raw, processa e immette nel serbatoio di ink
if line == 1:
while True:
yield gigafactory.raw_1.get(n_raw_1)
raw_1_level.append(gigafactory.raw_1.level)
yield env.timeout(3)
yield gigafactory.tank_1.put(5)
tank_1_level.append(gigafactory.tank_1.level)
else:
while True:
yield gigafactory.raw_2.get(n_raw_2)
raw_2_level.append(gigafactory.raw_2.level)
yield env.timeout(3)
yield gigafactory.tank_2.put(5)
tank_2_level.append(gigafactory.tank_2.level)
def roll_prep (env, gigafactory, line): #prende dal serbatoio di ink e dal cc, processa e immette nel roll intermedio
if line == 1:
while True:
yield gigafactory.tank_1.get(1)
tank_1_level.append(gigafactory.tank_1.level)
yield gigafactory.cc_1.get(n_cc_1)
cc_1_level.append(gigafactory.cc_1.level)
yield env.timeout(2)
yield gigafactory.roll_1.put(150)
roll_1_level.append(gigafactory.roll_1.level)
else:
while True:
yield gigafactory.tank_2.get(1)
tank_2_level.append(gigafactory.tank_2.level)
yield gigafactory.cc_2.get(n_cc_2)
cc_2_level.append(gigafactory.cc_2.level)
yield env.timeout(2)
yield gigafactory.roll_2.put(150)
roll_2_level.append(gigafactory.roll_2.level)
def jelly_prep (env, gigafactory): #prende dai roll intermedi e dal separatore, unisce e put in jelly
while True:
yield gigafactory.roll_1.get(50)
roll_1_level.append(gigafactory.roll_1.level)
yield gigafactory.roll_2.get(50)
roll_2_level.append(gigafactory.roll_2.level)
yield gigafactory.sep.get(n_sep)
sep_level.append(gigafactory.sep.level)
yield env.timeout(5)
yield gigafactory.jelly.put(200)
jelly_level.append(gigafactory.jelly.level)
def open_cells_prep (env, gigafactory): #prende dai jelly e dai case, unisce e put in cells
while True:
yield gigafactory.jelly.get(500)
jelly_level.append(gigafactory.jelly.level)
yield gigafactory.cases.get(n_cases)
cases_level.append(gigafactory.cases.level)
yield env.timeout(1)
yield gigafactory.open_cells.put(500)
open_cells_level.append(gigafactory.open_cells.level)
def final_cells_prep (env, gigafactory): #prende dalle celle non finite open e dal serbatoio elettrolita, unisce e put in cells finale
while True:
yield gigafactory.open_cells.get(400)
open_cells_level.append(gigafactory.open_cells.level)
yield gigafactory.electrolyte_tank.get(n_electrolyte_tank)
electrolyte_tank_level.append(gigafactory.electrolyte_tank.level)
yield env.timeout(1)
yield gigafactory.final_cells.put(400)
final_cells_level.append(gigafactory.final_cells.level)
def formation_charger(env, gigafactory, formation_machine_res, charge_time): # genera i processi di ricarica delle celle in formation machine
while True:
if gigafactory.final_cells.level>10:
for i in range(gigafactory.final_cells.level):
env.process(formation_machine(env, gigafactory, formation_machine_res, charge_time))
#print(formation_machine_res.count)
yield gigafactory.final_cells.get(gigafactory.final_cells.level)
final_cells_level.append(gigafactory.final_cells.level)
else:
yield env.timeout(1)
def formation_machine (env, gigafactory, formation_machine_res, charge_time): #ritira dalle celle pronte e le mette in carica nel formation machine
with formation_machine_res.request() as req:
yield req
yield env.timeout(charge_time)
yield gigafactory.dispatch.put(1)
counter.append(formation_machine_res.count)
dispatch_level.append(gigafactory.dispatch.level)
def quality_check (env, gigafactory):
while True:
yield env.timeout(0.05)
x=random.gauss(mean_g, dev_g)
control.append(x)
if (x<(mean_g-quality_std)) or (x>(mean_g+quality_std)):
yield gigafactory.dispatch.get(1)
yield gigafactory.reject.put(1)
reject_level.append(gigafactory.reject.level)
class Gigafactory:
def __init__(self,
env,
#materie prime
raw_capacity,
init_raw,
#ink tank
tank_capacity,
init_tank,
#current collectors
cc_capacity,
init_cc,
#roll intermedio magzzino
roll_capacity,
init_roll,
#separatore
sep_capacity,
init_sep,
#jelly roll
jelly_capacity,
init_jelly,
#cases
cases_capacity,
init_cases,
#magazzino celle non completate
open_cells_capacity,
init_open_cells,
#electrolyte tank
electrolyte_capacity,
init_electrolyte,
#magazzino celle complete
final_cells_capacity,
init_final_cells,
#formed cells
formed_cells_capacity,
init_formed_cells,
#dispatch
dispatch_capacity,
init_dispatch,
#scarti
reject_capacity,
init_reject
):
self.env = env
#container delle materie prime per ink, con capacità e init uguali
self.raw_1 = simpy.Container(env, capacity=raw_capacity, init=init_raw)
self.raw_2 = simpy.Container(env, capacity=raw_capacity, init=init_raw)
self.raw_control_1 = env.process(self.raw_stock_control(env, 1)) #controllo per riordino materie prime linea 1
self.raw_control_2 = env.process(self.raw_stock_control(env, 2)) #controllo per riordino materie prime linea 2
#serbatoi di ink
self.tank_1 = simpy.Container(env, capacity=tank_capacity, init=init_tank)
self.tank_2 = simpy.Container(env, capacity=tank_capacity, init=init_tank)
#current collectors magazzino
self.cc_1 = simpy.Container(env, capacity=cc_capacity, init=init_cc)
self.cc_2 = simpy.Container(env, capacity=cc_capacity, init=init_cc)
self.cc_control_1 = env.process(self.cc_stock_control(env, 1)) #controllo per riordino collettori linea 1
self.cc_control_2 = env.process(self.cc_stock_control(env, 2)) #controllo per riordino collettori linea 2
#roll intermedio magzzino
self.roll_1 = simpy.Container(env, capacity=roll_capacity, init=init_roll)
self.roll_2 = simpy.Container(env, capacity=roll_capacity, init=init_roll)
# --------------------------------------------------------------------------------
#separatore magazzino
self.sep = simpy.Container(env, capacity=sep_capacity, init=init_sep)
self.sep_control = env.process(self.sep_stock_control(env)) #controllo per riordino separatore
#jelly rolls magazzino
self.jelly = simpy.Container(env, capacity=jelly_capacity, init=init_jelly)
#cases magazzino
self.cases = simpy.Container(env, capacity=cases_capacity, init=init_cases)
self.cases_control = env.process(self.cases_stock_control(env)) #controllo per riordino cases
# ...............................................................................
#magazzino celle aperte
self.open_cells = simpy.Container(env, capacity=open_cells_capacity, init=init_open_cells)
#electrolyte tank
self.electrolyte_tank = simpy.Container(env, capacity=electrolyte_capacity, init=init_electrolyte)
self.electrolyte_control = env.process(self.electrolyte_stock_control(env)) #controllo per riordino cases
#magazzino celle finite
self.final_cells = simpy.Container(env, capacity=final_cells_capacity, init=init_final_cells)
# --------------------------------------------------------------------------------
#formed cells container
self.formed_cells = simpy.Container(env, capacity=formed_cells_capacity, init=init_formed_cells)
# -----------------------------------------------------------------------------------
#dispatch
self.dispatch = simpy.Container(env, capacity=dispatch_capacity, init=init_dispatch)
#scarti
self.reject = simpy.Container(env, capacity=reject_capacity, init=init_reject)
#----------------------------------FINE CONTAINER ---------------------------------
#----------------------------------INIZIO CONTROLLI FORNITORI -----------------------------------
def raw_stock_control (self, env, line):
yield env.timeout(0)
if line == 1:
while True:
if self.raw_1.level <= raw_1_critical_stock:
print("Riordino materie prime linea 1")
yield env.timeout(1)
yield self.raw_1.put(r_raw_1)
print("Nuovo livello materie prime linea 1: %d" %self.raw_1.level)
yield env.timeout(t_raw_1)
else:
yield env.timeout(1)
else:
while True:
if self.raw_2.level <= raw_2_critical_stock:
print("Riordino materie prime linea 2")
yield env.timeout(1)
yield self.raw_2.put(r_raw_2)
print("Nuovo livello materie prime linea 2: %d" %self.raw_2.level)
yield env.timeout(t_raw_2)
else:
yield env.timeout(1)
# ---------------------------------------------------------------------------------------------------------------------
def cc_stock_control (self, env, line):
yield env.timeout(0)
if line == 1:
while True:
if self.cc_1.level <= cc_1_critical_stock:
print("Riordino collettore linea 1")
yield env.timeout(1)
yield self.cc_1.put(r_cc_1)
print("Nuovo livello collettore linea 1: %d" %self.cc_1.level)
yield env.timeout(t_cc_1)
else:
yield env.timeout(1)
else:
while True:
if self.cc_2.level <= cc_2_critical_stock:
print("Riordino collettore linea 2")
yield env.timeout(1)
yield self.cc_2.put(r_cc_2)
print("Nuovo livello collettore linea 2: %d" %self.cc_2.level)
yield env.timeout(t_cc_2)
else:
yield env.timeout(1)
#-------------------------------------------------------------------------------------------------------------------
def sep_stock_control (self, env):
yield env.timeout(0)
while True:
if self.sep.level <= sep_critical_stock:
print("Riordino separatore")
yield env.timeout(1)
yield self.sep.put(r_sep)
print("Nuovo livello separatore: %d" %self.sep.level)
yield env.timeout(t_sep)
else:
yield env.timeout(1)
#-------------------------------------------------------------------------------------------------------------------
def cases_stock_control (self, env):
yield env.timeout(0)
while True:
if self.cases.level <= cases_critical_stock:
print("Riordino cases")
yield env.timeout(1)
yield self.sep.put(r_cases)
print("Nuovo livello cases: %d" %self.cases.level)
yield env.timeout(t_cases)
else:
yield env.timeout(1)
#-------------------------------------------------------------------------------------------------------------------
def electrolyte_stock_control (self, env):
yield env.timeout(0)
while True:
if self.electrolyte_tank.level <= electrolyte_tank_critical_stock:
print("Riordino Elettrolita")
yield env.timeout(1)
yield self.electrolyte_tank.put(r_electrolyte_tank)
print("Nuovo livello elettrolita: %d" %self.electrolyte_tank.level)
yield env.timeout(t_electrolyte_tank)
else:
yield env.timeout(1)
#-------------------------------------------------------------------------------------------------------------------
env = simpy.Environment()
formation_machine_res = simpy.Resource(env, capacity = 25)
gigafactory = Gigafactory(
env,
#materie prime
raw_capacity= r_raw_1*1.5,
init_raw= r_raw_1*0.5,
#ink tank
tank_capacity= 50,
init_tank= 0,
#current collectors
cc_capacity= r_cc_1*1.5,
init_cc= r_cc_1*0.5,
#roll intermedio magzzino
roll_capacity=500,
init_roll=0,
#separatore
sep_capacity= r_sep*1.5,
init_sep= r_sep*0.5,
#jelly roll
jelly_capacity=10000,
init_jelly=0,
#cases
cases_capacity= r_cases*1.5,
init_cases= r_cases*0.5,
#magazzino celle
open_cells_capacity=10000,
init_open_cells=0,
#electrolyte tank
electrolyte_capacity= r_electrolyte_tank*1.5,
init_electrolyte= r_electrolyte_tank*0.5,
#magazzino celle complete
final_cells_capacity=10000,
init_final_cells= 0,
#formed cells
formed_cells_capacity=10000,
init_formed_cells=0,
#dispatch
dispatch_capacity=500000,
init_dispatch=0,
#scarti
reject_capacity=500000,
init_reject=0
)
print("----------------------LIVELLI INIZIALI--------------------------")
print("Livello raw materials 1")
print(gigafactory.raw_1.level)
print("Livello raw materials 2")
print(gigafactory.raw_2.level)
print("Litri di ink 1")
print(gigafactory.tank_1.level)
print("Litri di ink 2")
print(gigafactory.tank_2.level)
print("Metri di current collector 1")
print(gigafactory.cc_1.level)
print("Metri di current collector 2")
print(gigafactory.cc_2.level)
print("Metri di roll 1")
print(gigafactory.roll_1.level)
print("Metri di roll 2")
print(gigafactory.roll_2.level)
print("Metri di separatore")
print(gigafactory.sep.level)
print("Numero di jelly rolls")
print(gigafactory.jelly.level)
print("Numero di cases")
print(gigafactory.cases.level)
print("Celle non complete")
print(gigafactory.open_cells.level)
print("Livello elettrolita")
print(gigafactory.electrolyte_tank.level)
print("Celle pronte per formation machine")
print(gigafactory.final_cells.level)
print("Celle prodotte")
print(gigafactory.dispatch.level)
print("Celle scartate")
print(gigafactory.reject.level)
#-------------------------------SIMULAZIONE---------------------------------
#linea 1
ink_mixing_process_1 = env.process(ink(env, gigafactory,1))
roll_prep_1 = env.process(roll_prep(env, gigafactory,1))
#linea 2
ink_mixing_process_2 = env.process(ink(env, gigafactory,2))
roll_prep_2 = env.process(roll_prep(env, gigafactory,2))
#jelly
jelly_prep = env.process(jelly_prep(env, gigafactory))
#cella aperta
open_cells_prep = env.process(open_cells_prep(env, gigafactory))
#cella finita
final_cells_prep = env.process(final_cells_prep(env, gigafactory))
#formation
formation = env.process(formation_charger(env, gigafactory, formation_machine_res, charge_time))
#quality
quality = env.process(quality_check (env, gigafactory))
t_sim=5*8*4*12
env.run(until=t_sim)
kpi_throughput = gigafactory.dispatch.level/t_sim
print("----------------------LIVELLI FINALI--------------------------")
print("Livello raw materials 1")
print(gigafactory.raw_1.level)
print("Livello raw materials 2")
print(gigafactory.raw_2.level)
print("Litri di ink 1")
print(gigafactory.tank_1.level)
print("Litri di ink 2")
print(gigafactory.tank_2.level)
print("Metri di current collector 1")
print(gigafactory.cc_1.level)
print("Metri di current collector 2")
print(gigafactory.cc_2.level)
print("Metri di roll 1")
print(gigafactory.roll_1.level)
print("Metri di roll 2")
print(gigafactory.roll_2.level)
print("Metri di separatore")
print(gigafactory.sep.level)
print("Numero di jelly rolls")
print(gigafactory.jelly.level)
print("Numero di cases")
print(gigafactory.cases.level)
print("Celle non complete")
print(gigafactory.open_cells.level)
print("Livello elettrolita")
print(gigafactory.electrolyte_tank.level)
print("Celle pronte per formation machine")
print(gigafactory.final_cells.level)
print("Celle prodotte")
print(gigafactory.dispatch.level)
print("Celle scartate")
print(gigafactory.reject.level)
fig, ax = plt.subplots()
# plot the data and customize
#ax.plot(raw_1_level, label = "raw 1")
#ax.plot(raw_2_level, label = "raw 2")
#ax.plot(tank_1_level, label = "tank 1")
#ax.plot(tank_2_level, label = "tank 2")
#ax.plot(cc_1_level, label = "cc 1")
#ax.plot(cc_2_level, label = "cc 2")
#ax.plot(roll_1_level, label = "roll 1")
#ax.plot(roll_2_level, label = "roll 2")
#ax.plot(sep_level, label = "sep")
#ax.plot(jelly_level, label = "jelly")
#ax.plot(cases_level, label = "cases")
#ax.plot(open_cells_level, label = "open cells")
#ax.plot(electrolyte_tank_level, label = "electrolyte")
#ax.plot(final_cells_level, label = "celle pre-formation")
ax.plot(dispatch_level, label = "celle prodotte")
#ax.plot(counter, label = "counter")
#ax.plot(reject_level, label = "reject")
plt.legend(ncol=1, loc="upper right")
# save and show the plot
fig.savefig('raw1_plot.png')
plt.show()
print("KPI")
print(kpi_throughput)Editor is loading...