Demo runbook¶
Flusso ordine → fabbrica (LIVE)¶
Nel twin viewer, toggle LIVE (o deep-link ?mode=live): la scena e i KPI seguono
l'orchestratore di impianto in tempo reale. Dal pannello Nuovo ordine si invia un
ordine (settore + quantità): i pezzi attraversano le stazioni del modello DES e la
stazione pressa è eseguita dalla cella PLC reale (completamento = ciclo vero,
CycleCount). Lo SCADA mostra lo stesso flusso nella vista Impianto (ordini, WIP,
occupazione/code per stazione, via OPC UA Plant/* su :4842 interno).
Architettura: ordine (POST /api/order) → orchestratore (clock = SimTime cella) →
SSE /api/stream (viewer 3D) + OPC UA Plant (FUXA). Un solo pomello di velocità:
SIM_SPEED sul servizio cell (8 min-sim/s: ciclo pressa ~6 s, ordine ~2 min).
Gli ordini sono in memoria: un riavvio dell'orchestratore li azzera (v1).
Ciclo di vita impianto e transitori¶
La cella parte fredda (25 °C): fase STARTUP = riscaldo stampo ~60 min-sim a piena
potenza fino a 135 °C, poi produzione. Arresto ordinato (bottone Arresta nel viewer o
POST /api/plant/stop): drain dei pezzi in lavorazione → la cella completa il ciclo in corso
(mai interrompere una cura) → SHUTDOWN (riscaldatori off, raffreddamento a 60 °C) → STOPPED.
Code e ordini restano congelati e riprendono con Avvia (/api/plant/start, stazioni online
scaglionate). I transitori sono visibili nel trend temperatura e nel picco di potenza.
Cruscotto energia¶
Pannello ENERGIA nel viewer (potenza istantanea, kWh cumulati, sparkline, top consumatori)
e valori/trend su FUXA. Due nature: la cella ha potenza fisica per fase (costanti nel
contratto OPC UA: base 6 kW, riscaldo 90, mantenimento 20, corse 30, tenuta cura 8); le altre
stazioni hanno targhe dichiarative busy/idle in digital_twin/plant/energy_model.json —
tutte ASSUNZIONI di ordine di grandezza, da tarare su dati reali.
Twin viewer nel browser¶
twin.carbopresscorporation.com (basic-auth, stessa credenziale dello SCADA) — replay operativo
DES → scena USD in Three.js: timeline 0–849 min (1 min sim = 1 s a 1×), pressa PCM animata col
profilo del PLC di cella, carrelli sui viaggi reali dei pezzi, barre di utilizzo per stazione
dagli episodi di servizio. Deep-link a un istante: ?t=150.
Ciclo di iterazione rapido (modifica al modello → viewer aggiornato, senza render):
bash digital_twin/web/refresh.sh # rigenera replay USD + dati viewer
bash digital_twin/web/refresh.sh --serve # + anteprima locale su :8901
bash digital_twin/web/refresh.sh --deploy # + pubblica su twin.carbopresscorporation.com
Cella pressa live (SCADA)¶
scada.carbopresscorporation.com — la cella virtuale gira h24: cicli di pressatura con cura.
Telemetria via OPC UA: fasi PLC, temperatura stampo, finecorsa, contatori.
La simulazione guasti è disattivata (AUTOFAULT_EVERY=0, default); per riattivarla nella
demo di resilienza impostare AUTOFAULT_EVERY=8 nell'ambiente del servizio cell.
Il collaudo PLC con fault injection resta in CI (run_demo.py): è validazione, non demo.
La home è il Sinottico impianto: schema del flusso produttivo con scatole stazione live
(semaforo occupato, coda, kW), cella PCM reale evidenziata con fase PLC, e navigazione scura
in-vista ([Sinottico]·[Cella]·[Impianto] — la sidebar FUXA è nascosta, navigation.mode=void;
per ripristinarla in caso di problemi coi bottoni: rimettere "fix" in fuxa_synoptic.py).
Le altre viste: "PressCell" (semafori di stato + valori di processo + trend) e "Plant", generate
programmaticamente: per rigenerarlo/modificarlo, editare infra/demo/fuxa_synoptic.py e
rieseguirlo sul server (python3 /opt/carbopress/demo/fuxa_synoptic.py). Idempotente:
sostituisce solo la vista, preserva device e tag. Per sinottici più ricchi usare l'editor
FUXA (matita in basso a destra) — le modifiche fatte a mano NON vengono toccate finché
non si riesegue lo script.
Collaudo locale del PLC¶
nix-shell -p 'python3.withPackages(ps:[ps.asyncua])' \
--run 'python3 digital_twin/plc/run_demo.py --bake-usd'
# 2 cicli buoni → fault injection → ALARM → reset → 3° ciclo. Exit code = esito.
Gemello di processo (KPI in <1 s)¶
python3 digital_twin/scenarios/run_demo.py # scenario dimostrativo, solo KPI tecnici
Render da Python (CPU, senza GPU)¶
nix-shell -p openusd --run \
'python3 digital_twin/usd/render_usd.py digital_twin/usd/factory_plant.usda \
--camera /Plant/Render/Cam_walk -f 150 -w 960 -o /tmp/frame.png'
Materiale di presentazione¶
- Deck tecnico:
presentations/demo_twin_beamer.pdf+ video walkthrough 35 s (digital_twin/renders/).