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
kserver paralleli (G/G/c): l'eventoEND_SERVICElibera 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).