Vai al contenuto

Gli algoritmi

Gemello di processo — simulazione a eventi discreti

digital_twin/simulate_factory.py — stdlib-only, deterministico (un solo random.Random seminato; eventi ordinati per (time, seq)).

  • Stazioni = code FIFO con k server paralleli (G/G/c): l'evento END_SERVICE libera il server e tenta il dispatch del prossimo pezzo; i tempi di servizio sono normali clippate (max(gauss, min_clip)).
  • Routing statico per settore: la route è fissata all'arrivo (mix probabilistico automotive/aerospazio/difesa); le route differiscono solo alla cura (pressa PCM vs autoclave).
  • Quality gate a ogni fine servizio: switch probabilistico {good, rework, scrap}; il rework è un self-loop sulla stazione.
  • Arrivi: processo di Poisson gated (budget di rilascio + orizzonte); simulazione terminante (transiente), non steady-state.
  • KPI: throughput, utilizzo per stazione (busy/(k·finestra)), code e WIP tempo-mediati, collo di bottiglia = argmax utilizzo, resa, lead time; strato costi additivo (non tocca la dinamica).
  • Telemetria opt-in (inerte sui KPI): serie per-frame busy/queue, viaggi per pezzo, episodi di servizio (stazione, pezzo, t_inizio, t_fine) — è il ponte verso la scena.

Accoppiamento processo → scena (bake)

digital_twin/usd/generate_usd_plant.py esegue il DES alla generazione e cuoce gli esiti in timeSamples USD: occupazioni → ampiezza dei cicli dei robot; viaggi dei pezzi → carrelli (posizione+visibilità); settore → colore del carico. Nessuna co-simulazione runtime: il file è deterministico, riproducibile, versionabile.

Modalità replay (generate_replay_cell.py): mapping temporale esplicito 1 frame = 1 minuto simulato — ciò che vedi alla stessa ascissa temporale è ciò che il DES ha simulato — e attuazione di cella dal controllore: per ogni episodio di servizio il profilo del piano pressa è generato dalla semantica PLC (chiusura → cura → apertura, costanti dal contratto OPC UA). Il DES decide quando la cella lavora; la cella decide come si muove.

Livello di cella — PLC virtuale su OPC UA

digital_twin/plc/ — impianto = server OPC UA (fisica a tempo scalato, finecorsa, termica, vigilanza contratto), controllore = client con ciclo di scansione (ingressi → logica → uscite) e macchina a stati con interblocchi; i timer contano sul clock simulato (SimTime, principio del virtual-time-sync). Collaudo automatizzato con fault-injection (exit code = esito; gira anche in CI). NodeId stringa = path del contratto (ns=2;s=PressCell01/...).

Motori di pre-validazione pezzo

  • CLT (laminate_model.py): dalle 4 costanti di lamina → [Q] → [Q̄(θ)] → matrici A/B/D (momenti d'ordine 0/1/2 sulla quota) → moduli efficaci e modi flessionali (Whitney); B≠0 segnala l'accoppiamento membrana-flessione (svergolamento). Screening, non validazione.
  • Fattibilità AFP (afp_feasibility.py): rate di deposizione = v·banda·η; dal laminato (n° strati da grammatura e V_f) → tempo/pezzo → n° celle per il takt.
  • Knockdown di processo (schemas/process_knockdown.schema.json): moltiplicatori zonali (0,1] sulle proprietà matrice-dominate, con provenance (assunzione/letteratura/test).

Scena — generazione parametrica OpenUSD

La fabbrica si genera dai dati (layout, celle, schedule) in .usda testuale puro: gerarchia in stile ISA-95, asset macchina referenziati da libreria (STEP → tassellazione → USD, una tantum), animazione = timeSamples. Render via Hydra: path tracer RTX (video) o Embree CPU headless (still e verifiche, render_usd.py).