La modellazione della capacità produttiva di una fabbrica di semiconduttori prevede il mantenimento dei valori di produttività (in termini di parti all'ora [PPH]) per migliaia di ricette di processo. I dati di elaborazione vengono memorizzati per ogni ciclo, fornendo un ricco pool di dati storici che possono essere utilizzati per determinare i valori di PPH. Nella modellazione della capacità, le inefficienze che degradano la capacità sono isolate dalla produttività, pertanto il PPH modellato dovrebbe rappresentare le massime prestazioni in condizioni di funzionamento continuo. Questi requisiti complicano il processo di analisi dei dati storici e gli esperti di processo devono prestare particolare attenzione all'identificazione dei cicli non stazionari che dovrebbero essere esclusi dall'analisi.
Utilizzando JSL, è stato creato uno strumento interattivo per facilitare l'analisi dei dati storici di throughput, al fine di valutare, selezionare e documentare i PPH in base alla ricetta da utilizzare nella modellazione della capacità. Lo script crea un'applicazione dashboard completamente interattiva e autonoma che utilizza piattaforme JSL e controlli personalizzati per facilitare l'esplorazione delle fonti di variazione e l'isolamento delle esecuzioni in stato stazionario. La selezione dei valori PPH viene effettuata e documentata direttamente nella dashboard e, infine, un riepilogo dei valori e delle distribuzioni selezionati può essere esportato in PowerPoint per un report di analisi completo.
Questa presentazione include una dimostrazione dello strumento dashboard e illustra alcune parti dello script.
Ciao, mi chiamo Michelle Terwilliger. Sono un ingegnere industriale presso la sede di Texas Instruments a South Portland, nel Maine. Oggi parlerò di uno strumento interattivo per esplorare i dati storici di throughput, realizzato tramite scripting in JSL.
Prima di parlare del mio script, vorrei condividere qualche informazione sulla modellazione della capacità produttiva in fabbrica, giusto per dare un'idea di come utilizziamo JMP per realizzarla. Iniziamo con le informazioni relative al set di strumenti per cui vogliamo modellare la capacità, inclusi il throughput per ricetta e le ore totali di utilizzo del set di strumenti per quel set di strumenti.
Applichiamo quindi un profilo di avvio che stiamo valutando di eseguire in fabbrica, troviamo i nostri passaggi per ricetta e li aggreghiamo tramite la produttività per ricetta per ottenere le ore di produzione necessarie per elaborare quel materiale.
Prendiamo quindi le inefficienze che prevediamo per il set di utensili e le usiamo per scalare le ore totali del set di utensili, ottenendo così le ore di produzione effettive pianificate. Il rapporto tra questi due valori ci fornisce la percentuale di carico. Questo ci dice se possiamo eseguire il profilo pianificato o se dobbiamo aggiungere o rimuovere wafer.
In questa presentazione parlerò di produttività per ricetta. Si tratta di un parametro che misuriamo in parti all'ora PPH. Lo sentirete ripetere più volte. I valori di produttività vengono memorizzati per quasi tutte le ricette che abbiamo in fabbrica. Si tratta di migliaia di ricette singole. Come potete immaginare, si tratta di un bel po' di dati da memorizzare, gestire e aggiornare nel tempo.
Vorrei anche sottolineare che le inefficienze sono completamente isolate da tale throughput. Quando pensiamo ai valori di throughput per il modello, vogliamo cercare di catturare valori che rappresentino le massime prestazioni possibili che quella ricetta può mantenere, in modo da modellarla senza inefficienze.
Quando pensiamo alla selezione dei valori per il modello, ci sono alcune condizioni che vogliamo tenere a mente. Vogliamo le massime prestazioni possibili, senza inefficienze. Vogliamo rappresentare condizioni di stato stazionario in funzionamento continuo. Ricordiamo che le inefficienze sono rappresentate altrove nel modello, quindi non le ignoriamo.
Ora, questo è molto difficile o impossibile da replicare in un ambiente di produzione. Invece di provare a eseguire test che riproducano questo scenario, utilizziamo i dati di produzione storici per cercare di capire quali potrebbero essere i valori se dovessimo eseguire test in questo scenario. È qui che entra in gioco JMP.
Utilizziamo JMP per visualizzare ed esplorare le fonti di variazione. Lo utilizziamo per escludere esecuzioni con inefficienze note, isolare le esecuzioni rappresentative di condizioni stazionarie e quindi documentare tali risultati.
Man mano che ci avviciniamo a un set di dati da analizzare, avremo a disposizione un campione di misurazioni della produttività per una determinata ricetta e possiamo supporre che, al suo interno, ci saranno perdite derivanti da diverse fonti, come differenze negli utensili o tra le ricette. L'influenza di un'analisi precedente può avere un impatto significativo sull'analisi successiva. Tempi di caricamento, numero di camere utilizzate, ecc.
Considerato ciò, dovremmo anche avere misurazioni che indichino che tali perdite si avvicinino allo zero. Se ciò accade, dovrebbe tradursi in un limite superiore alla produttività osservata, quando tutte le perdite sono il più vicino possibile allo zero. A quanto pare è proprio così. Osserviamo davvero un plateau significativo nei nostri dati in corrispondenza di un limite superiore. Questo è ciò che stiamo osservando per ottenere le migliori prestazioni possibili che desideriamo per la modellazione.
Esiste un processo per selezionare il PPH. Inizieremo isolando le esecuzioni in stato stazionario, tenendo presente che alcune esecuzioni potrebbero sembrare più veloci, ma si verificano in situazioni che non possono essere mantenute su più esecuzioni, quindi non sono in stato stazionario.
Vogliamo quindi rimuovere le esecuzioni che presentano fonti identificabili di perdite di throughput, quindi elementi come quelli che vediamo qui sopra. Vogliamo selezionare un valore PPH per il modello in base al limite superiore osservato. Tendiamo a usare il 98° percentile come suggerimento, ma ovviamente c'è un margine di manovra.
Ripetiamo quindi questa operazione per tutte le ricette ed esportiamo un report dei risultati. Passiamo ora a una demo. Questa è una tabella di esempio che esporteremmo per i dati di esecuzione di un set di strumenti. Vedrete che ogni riga rappresenta un'esecuzione di diverse ricette con diversi strumenti. Abbiamo alcune misurazioni PPH effettuate con un paio di metodologie diverse. Più avanti, ho inserito alcuni di quei fattori che influenzano la variabilità.
Eseguirò il mio strumento PPH e inizieremo con questo selettore di colonne. Userò Takt PPH per questo set di strumenti e le mie fonti di variazione sono raggruppate qui. Esamineremo lo strumento, il numero totale di wafer, il numero di camere e le specifiche delle ricette precedenti.
Eseguo questo. Questa è la vista principale della nostra dashboard. Qui sopra abbiamo alcuni controlli globali. Questo pannello contiene le distribuzioni di ogni specifica di ricetta e, sotto ciascuna, vedrete alcuni controlli personalizzati che si applicano direttamente alla specifica di ricetta soprastante. Qui sotto ho una tabella riassuntiva che contiene informazioni per ogni ricetta, che verrà aggiornata man mano che effettuiamo una revisione.
Questo pannello è per l'analisi. Al momento è piuttosto vuoto, ma vedrai che si riempirà man mano che inizieremo a cliccare su alcune di queste opzioni. Ho dei grafici temporali per ogni ricetta e, infine, dei filtri dati qui. Inizieremo con questa prima ricetta.
La prima cosa che farò sarà filtrare. Noterete che lo screening del predittore è cambiato quando l'ho fatto. Ora possiamo vedere che per questa ricetta, il fattore più importante che contribuisce alla variabilità è questo strumento. Clicco su questo e poi su "Grafico di variabilità", e posso colorare in base alla selezione.
Ora possiamo vedere, all'interno di questo set di dati, come varia a seconda dello strumento. Quello che noto qui è che praticamente ogni strumento è in grado di raggiungere quel limite superiore che abbiamo notato. Mi sentirei abbastanza a mio agio nel collocare il valore PPH del mio modello a questo limite.
Vorrei sottolineare che in questo esempio ho una riga qui per il modello PPH. Questo sarebbe il valore precedente che stavamo modellando per questo set di strumenti. In questo caso, stiamo sottostimando di gran lunga la capacità di questo strumento. Stiamo dicendo che può funzionare a 35,1, ma in realtà è in grado di farlo a 37,48.
C'è un'enorme lacuna nella nostra comprensione della capacità di produzione quando questa non è impostata correttamente. È importante trovare il valore corretto in modo da poter modellare davvero la capacità corretta per la produzione.
Quando penso di selezionare questo valore, un'altra opzione che ho, se ci sono alcuni punti che sembrano volantini che vuoi rimuovere dai dati, è un pulsante chiamato "trim", che rimuoverà l'1% dei dati in alto e in basso.
Possiamo selezionare il modello PPH o questo PPH consigliato al 98%, oppure abbiamo la possibilità di inserire un valore personalizzato, che puoi digitare e spostare verso l'alto o verso il basso usando questi pulsanti. Una volta trovato il valore desiderato, puoi selezionarlo qui sotto, cliccarci sopra e poi premere Seleziona. Noterai che verrà inserito nella tabella di riepilogo. Se lo desideri, puoi anche aggiungere delle note, che verranno inserite qui.
Ora passerò a una specifica di ricetta un po' più complessa per mostrare cosa significa davvero analizzare dati come questi. Inizierò filtrando. Vedrete che questo pannello è stato aggiornato. Ora, il nostro principale fattore che contribuisce alla variabilità in questo set di dati sono le specifiche di ricetta precedenti. Cosa era in esecuzione prima che caricassi questo lotto di wafer?
Osserverò il grafico di variabilità e lo colorerò. Per me, questo si distingue parecchio. È più veloce quando viene eseguito dopo la ricetta B. Noteremo che stiamo effettivamente esaminando la ricetta B. Questa soddisfa la condizione di stato stazionario. Stiamo eseguendo la stessa ricetta una dopo l'altra. Questo è il modo più efficiente per eseguire questa ricetta. Questo è ciò che vogliamo catturare nel modello.
In realtà, selezionerò il resto e userò questo pulsante per nasconderli ed escluderli, in modo da poter eliminare quella fonte di variazione nota e identificata. Ora, esaminare il nostro strumento di screening predittivo è, ancora una volta, il fattore che contribuisce maggiormente.
Darò un'occhiata. Mi sembra che la maggior parte degli strumenti sia in grado di raggiungere quel valore elevato. Mi sentirei abbastanza a mio agio, ancora una volta, selezionando questo valore consigliato del 98%. Noto che lo strumento 6 ha una coda piuttosto significativa rispetto agli altri. È un aspetto di cui potrei prendere nota in modo da poter parlare con un ingegnere di processori e vedere se c'è qualcosa che vogliono controllare su quello strumento. Inserirò questa nota e selezionerò il mio valore del 98%.
Ora, supponiamo che tu stia eseguendo questa revisione e desideri rivedere una revisione precedente, già completata o non completata, e desideri importare un riepilogo parzialmente completato. Possiamo fare clic su questo pulsante e importare una tabella di riepilogo, che sarebbe una versione salvata di questa tabella, che verrà ripopolata con tutti i valori precedenti, oltre ad aggiornare tutti i valori selezionati nella distribuzione. Puoi semplicemente ripristinare una revisione che avevi eseguito in precedenza.
Infine, una volta terminato e pronti per esportare i risultati, questo pulsante creerà una presentazione PowerPoint con una tabella di tutti i valori selezionati, le note, la loro provenienza e le miniature di ogni specifica della ricetta. È possibile utilizzarle in un'altra importazione e importare la tabella direttamente nel modello.
Tornando alla mia presentazione. Invece di passare in rassegna l'intero script di questo strumento, che è piuttosto lungo, mi concentrerò su tre caratteristiche distinte che ritengo siano davvero un elemento unificante e rendano tutto possibile.
Il primo è che, quando si lavora con elementi di visualizzazione creati utilizzando una variabile "by", può essere complicato interagire con elementi specifici all'interno del gruppo. Questo sarebbe il mio elenco di distribuzioni per ricetta. Come faccio a selezionare quella con cui voglio interagire?
La mia soluzione è quella di assegnarle un nome quando creo la distribuzione, ottenendo così un elenco di riferimenti al singolo elemento visualizzato. Posso usare questo metodo con un ciclo o fare riferimento direttamente a questi tramite indice.
Il secondo aspetto è la gestione dei dati. Ci sono molti valori diversi associati alle specifiche delle ricette o a diversi aspetti all'interno di questo report che devono essere gestiti e trasmessi tra gli elementi di visualizzazione e altre posizioni. La soluzione a questo problema è un altro elenco di indici per nome di ricetta che rimanda direttamente all'elenco di indici che avevamo qui sopra e utilizza array associativi per memorizzare i dati per nome.
Il terzo aspetto riguarda gli elementi interattivi: devono identificare con quale componente della distribuzione si desidera che interagiscano quando si clicca su di essi o quando si interagisce con essi. Devono essere collegati alle specifiche della ricetta. Quando vengono creati in un ciclo, non mantengono il valore di indice con cui sono stati creati.
La soluzione è dare loro la possibilità di autoidentificare il loro contesto memorizzando un riferimento all'elemento padre e quindi utilizzando il comando X path per estrarre il valore dell'indice in cui risiedono. Vi mostrerò alcuni esempi di tutte queste cose per aiutarvi a chiarire un po' di più il concetto.
Ecco le mie distribuzioni create con una variabile "by", "By recipe spec", e vedrete che l'ho chiamata dist_right_here. Questa contiene effettivamente un elenco di tutti gli elementi della distribuzione che compongono questa visualizzazione. Ho anche memorizzato i nomi delle mie ricette in un elenco che rimanda direttamente a questi.
Puoi eseguire un ciclo. Io eseguirò un ciclo su questo elenco di distribuzioni e farò cose come popolare i dati in base alle specifiche della ricetta. Qui ho un array associativo e lo sto popolando utilizzando la quarta colonna della mia tabella di dati di riepilogo.
Questo mi fornisce i miei quantili, e puoi vedere che ogni singolo nome di ricetta punta a un valore. Puoi anche interagire con gli elementi del grafico all'interno dello stesso ciclo. Qui sto apportando alcune modifiche all'accesso e, in questo caso, sto aggiungendo una linea di riferimento.
Per fare questo, utilizzo una convenzione di denominazione annidata. Il mio elenco di ricette memorizza il nome, che viene annidato all'interno dell'array associativo. Questo fa riferimento al nome e fornisce il valore. Questa tecnica annidata è davvero fondamentale per poter passare le cose avanti e indietro tra tutti i diversi luoghi che necessitano di accedere a quel valore.
Poi, per quanto riguarda gli elementi interattivi, questi vengono creati all'interno dello stesso ciclo di cui abbiamo appena parlato. Vengono aggiunti come elementi fratelli a ciascuno dei singoli elementi di distribuzione, a cui faccio riferimento qui con un indice.
Ecco un esempio per il pulsante Seleziona. C'è molto codice da scrivere qui, ma inizia con questo controllo del percorso di visualizzazione che riporta alla casella di distribuzione. Ho un riferimento memorizzato al contenitore padre che contiene la distribuzione al momento della sua creazione, in modo che questa funzione possa tornare indietro e restituire un testo contenente un numero che sarà lo stesso numero di indice in cui si trova quell'elemento di visualizzazione.
Quando si fa clic sul pulsante Seleziona, il sistema verifica la posizione e fornisce un indice che mappa la ricetta e dice: "Ok, voglio selezionarla per la ricetta A". Quindi la ricetta, che si tratti dell'indice o del nome, può essere passata ad altre funzioni al suo interno. È possibile interagire con righe specifiche nella tabella di riepilogo tramite il nome della ricetta. È possibile modificare gli elementi visualizzati. È possibile accedere ai valori dei dati. Qualsiasi operazione necessaria con il nome della ricetta può essere eseguita in altre funzioni una volta identificato a cosa serve il nome quando si fa clic su di esso.
In realtà ho un'altra demo che sto per analizzare. Si tratta di un esempio più breve e compatto, realizzato utilizzando dati di esempio JMP solo per mostrare un esempio più semplice che fa alcune delle stesse cose che ho nello script più grande. Voglio sottolineare che è molto più semplice di quanto sembri. Sono solo 73 righe di codice, se si toglie la spaziatura nei commenti. Lo spiegherò passo dopo passo.
Inizierò eseguendo lo script. Si apriranno i dati campione sui prezzi al consumo. Abbiamo una tabella riassuntiva che mostra ciascuno dei nostri articoli, il prezzo medio e un prezzo selezionato, e sotto ogni distribuzione, solo un piccolo elemento interattivo.
Puoi impostare come valore predefinito il valore medio e spostarlo verso l'alto o verso il basso, oppure puoi selezionare un valore e poi il prezzo, che verrà popolato qui. Solo un piccolo esempio per mostrare una cosa simile a quella che ho fatto nello script più grande.
Analizziamo questo script passo dopo passo. Iniziamo dalle basi. Ho le dichiarazioni che rappresentano la mia lista di articoli, i miei array associativi per il prezzo medio, un prezzo temporaneo, che è un segnaposto per tenere traccia del contenuto di questo valore. Poi il mio prezzo selezionato, che viene utilizzato per acquisire il valore che hai scelto da qui e inserirlo nella tabella di riepilogo.
Inizio creando la tabella riepilogativa e modificando un po' la formattazione, aggiungendo una nuova colonna. Poi creo una finestra di visualizzazione e, all'interno di questa casella H-Splitter, ho un riferimento alla tabella riepilogativa che abbiamo appena creato, e ora creo le mie distribuzioni proprio lì. Noterete, ancora una volta, questo riferimento padre alla casella di scorrimento che contiene le distribuzioni menzionate in un riferimento qui. Questo è tutto ciò che è stato utilizzato per creare la finestra di visualizzazione che state vedendo.
Ora, subito dopo, creerò il mio elenco di articoli, che verrà mappato sui singoli elementi visualizzati all'interno di questo elenco di distribuzioni. Ora eseguirò il mio ciclo, che è lo stesso di cui abbiamo parlato in precedenza. Inizierò popolando il prezzo medio, che proviene direttamente dalla tabella di riepilogo, e poi il prezzo temporaneo sarà lo stesso.
Ora modificherò i formati di accesso per ciascuno e aggiungerò linee di riferimento a quel valore medio usando la tecnica annidata di cui abbiamo parlato. Ora aggiungerò come elemento gemello a ciascuna delle distribuzioni. Ho un po' di contenitori qui solo per la spaziatura, e poi la mia casella di modifica dei numeri, che è la casella vera e propria in cui è possibile digitare e spostare.
Quando si interagisce con questo, eseguirà la funzione al suo interno. La prima cosa che fa è controllarne il percorso. L'ho impostato per mostrare i valori presenti. Se ne scegliamo uno e iniziamo a modificarlo, come potete vedere nel log qui sotto, verrà restituito il percorso X. Estrarrà l'indice e ne assegnerà il nome.
Man mano che ne creiamo di diverse, puoi vedere che ti vengono assegnati nomi diversi in base a ciò su cui clicchi. Dopodiché, devi solo accedere alla casella di accesso per interagire con essa. Stiamo rimuovendo tutte le vecchie linee di riferimento solo per assicurarci di non duplicare la linea di riferimento ogni volta che lo facciamo, aggiungendo quelle che potrebbero essere state rimosse nel caso in cui qualche linea si sovrapponesse, sarebbe stata sovrapposta a quella precedente. Ecco cosa succede qui.
Quindi il prezzo temporaneo verrà aggiornato in base al nome dell'articolo con il valore presente nella casella numerica. Quindi aggiungeremo una riga di riferimento specifica per il valore selezionato. Questo è il codice per il pulsante Seleziona. Proprio come per la casella numerica, stiamo controllando il percorso per estrarre il nome dell'articolo e l'indice.
Rimuoveremo tutte le righe di accesso selezionate in precedenza, aggiungendo quelle eventualmente eliminate, e aggiorneremo il prezzo selezionato con il prezzo temporaneo che abbiamo appena creato interagendo con la casella in precedenza. Quindi aggiorneremo la tabella riepilogativa con il prezzo appena selezionato e creeremo una linea verde in grassetto per indicare che quello era il valore selezionato.
Questo è tutto. Spero che non sia sembrato troppo complicato. Credo che la maggior parte del lavoro consista semplicemente nell'interazione con l'accesso e nell'aggiunta di linee di riferimento. Tutto ciò che crea effettivamente la funzionalità degli elementi interattivi è davvero molto semplice.
Questo script, così come i dati di esempio e lo script più ampio dello strumento PPH, saranno caricati insieme al contenuto della mia presentazione. Dovresti averli a disposizione per chi volesse provarli o approfondire il funzionamento di alcuni di essi.
Concluderò con alcune delle cose che ho imparato durante questo processo di creazione e utilizzo dello strumento PPH. La prima è che l'aggiunta di elementi interattivi alle piattaforme in JMP amplia notevolmente le capacità di analisi.
Si tratta di cose del genere, semplicemente l'opzione di selezionare un valore e di popolarlo altrove, oppure nello strumento PPH, lo screening del predittore, e quindi di poter selezionare i valori da lì e poi espanderli ulteriormente con un grafico di variabilità.
Il passo successivo è la possibilità di documentare i risultati dell'esportazione, il che contribuisce notevolmente a semplificare la comunicazione. Partiamo dai dati grezzi, arriviamo a qualcuno che esegue un'analisi e poi possiamo esportare i dati in una tabella che può essere inviata a chiunque si occupi della manutenzione del modello.
È possibile creare note da inviare a un ingegnere di processo o di apparecchiature per verificare diversi aspetti dei propri strumenti. Inoltre, per quanto riguarda lo scripting, quegli elenchi ordinati e il loro utilizzo come chiavi di indice con array associativi per archiviare, ricercare dati e passarli tra diversi elementi di visualizzazione sono stati davvero fondamentali per far funzionare il tutto con un ampio set di dati.
Quindi crea i controlli interattivi con un elemento di visualizzazione variabile by eseguendo il ciclo. Ci sono molte cose che puoi fare semplicemente eseguendo un ciclo nell'elenco degli elementi di visualizzazione che ottieni quando crei qualcosa usando una variabile by.
Infine, la cosa più importante che voglio far capire è che la scrittura di script non è così difficile come sembra. Lo strumento PPH è uno script di grandi dimensioni e potrebbe sembrare intimidatorio, ma col tempo non è poi così difficile costruire qualcosa del genere.
Quando scrivo script, utilizzo sempre l'indice di scripting. Tengo sempre aperte le finestre di supporto di JMP e il mio log per vedere cosa succede mentre lavoro in JMP.
Voglio davvero incoraggiare chiunque non l'abbia ancora provato o possa esserne intimidito a provarlo, perché amplia davvero le possibilità di JMP. Questo è tutto. Grazie per il tuo tempo.