Vai al contenuto

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/).