La modélisation de la capacité d'une usine de semi-conducteurs implique la gestion des valeurs de débit (exprimées en pièces par heure [PPH]) pour des milliers de recettes de fabrication. Les données de traitement sont enregistrées pour chaque cycle, constituant ainsi un riche historique permettant de déterminer les valeurs de PPH. Dans la modélisation de la capacité, les inefficacités qui la dégradent sont isolées du débit ; le PPH modélisé doit donc représenter la performance maximale possible en fonctionnement continu. Ces exigences complexifient l'analyse des données historiques et les experts en procédés doivent veiller tout particulièrement à identifier les cycles non stationnaires à exclure de l'analyse.
Un outil interactif a été créé à l'aide de JSL pour faciliter l'analyse des données de débit historiques et évaluer, sélectionner et documenter les PPH (Points de Performance de Production) par recette, en vue de leur utilisation dans la modélisation des capacités. Le script génère une application de tableau de bord entièrement interactive et autonome, qui exploite des plateformes optimisées par JSL et des commandes personnalisées pour explorer les sources de variation et isoler les cycles en régime permanent. La sélection des valeurs de PPH est effectuée et documentée directement dans le tableau de bord. Enfin, un résumé des valeurs et distributions sélectionnées peut être exporté vers PowerPoint pour générer un rapport d'analyse complet.
Cette présentation comprend une démonstration de l'outil de tableau de bord et passe en revue certaines parties du script.
Bonjour, je m'appelle Michelle Terwilliger. Je suis ingénieure industrielle chez Texas Instruments, sur notre site de South Portland, dans le Maine. Aujourd'hui, je vais vous parler d'un outil interactif permettant d'explorer les données historiques de débit, développé à l'aide de scripts JSL.
Avant de vous parler de mon script, j'aimerais vous expliquer brièvement la modélisation de la capacité d'une usine, afin de vous donner un aperçu de la manière dont nous utilisons JMP. Nous commençons par les informations relatives à l'ensemble d'outils dont nous souhaitons modéliser la capacité, notamment le débit par recette et le nombre total d'heures d'utilisation de cet ensemble.
Nous appliquons ensuite un profil de démarrage que nous envisageons d'exécuter en usine, et nous déterminons nos passages par recette, puis nous agrégeons ces données en fonction du débit par recette afin d'obtenir les heures de production requises pour traiter ce matériau.
Nous prenons ensuite en compte les inefficacités prévues pour l'ensemble d'outils et nous les utilisons pour ajuster le nombre total d'heures d'utilisation de cet ensemble, ce qui nous donne le nombre d'heures de production réelles prévues. Le ratio entre ces deux valeurs nous donne le pourcentage de charge. Cela nous indique si nous pouvons exécuter le profil prévu ou s'il est nécessaire d'ajouter ou de retirer des plaquettes.
Dans cette présentation, je vais aborder le débit par recette. Ce débit est mesuré en pièces par heure (PPH). J'utiliserai cette unité de mesure à plusieurs reprises. Les valeurs de débit sont enregistrées pour quasiment toutes les recettes de notre usine, soit des milliers de recettes individuelles. Comme vous pouvez l'imaginer, cela représente un volume considérable de données à stocker, à gérer et à mettre à jour régulièrement.
Je tiens également à préciser que les inefficacités sont totalement indépendantes du débit. Lorsque nous définissons les valeurs de débit pour le modèle, nous cherchons à obtenir des valeurs représentatives des performances maximales que cette recette peut atteindre, c'est-à-dire à la modéliser sans tenir compte des inefficacités.
Lors du choix des valeurs pour le modèle, plusieurs conditions sont à prendre en compte. Nous recherchons des performances optimales, sans aucune perte d'efficacité. Nous souhaitons représenter le régime permanent en fonctionnement continu. Il est important de rappeler que les pertes d'efficacité sont prises en compte ailleurs dans le modèle ; nous ne les négligeons donc pas.
Il est très difficile, voire impossible, de reproduire ce scénario en production. Plutôt que de réaliser des tests le reproduisant, nous utilisons les données de production historiques pour tenter d'anticiper les valeurs que l'on obtiendrait dans ces conditions. C'est là que JMP intervient.
Nous utilisons JMP pour visualiser et explorer les sources de variation. Nous l'utilisons pour exclure les essais présentant des inefficacités connues, isoler ceux qui sont représentatifs des conditions d'état stationnaire, puis documenter ces résultats.
Lorsqu'on s'apprête à analyser un jeu de données, on dispose d'un échantillon de mesures de débit pour une recette donnée. On peut supposer que cet échantillon comprendra des pertes dues à diverses sources, comme des différences entre les outils ou entre les recettes. L'influence d'une exécution précédente peut avoir un impact considérable sur les résultats de l'exécution suivante : temps de chargement, nombre de chambres utilisées, etc.
Dans ce contexte, nous devrions également observer des mesures indiquant que ces pertes tendent vers zéro. Si tel est le cas, le débit observé devrait atteindre une limite supérieure lorsque toutes les pertes sont aussi proches de zéro que possible. Or, c'est effectivement le cas. Nous constatons en effet un plateau significatif dans nos données, correspondant à cette limite supérieure. C'est précisément ce plateau que nous recherchons pour obtenir les performances optimales nécessaires à notre modélisation.
Il existe une procédure pour sélectionner le PPH. Nous commencerons par isoler les exécutions en régime permanent, en gardant à l'esprit que certaines exécutions peuvent sembler plus rapides, mais elles se produisent dans des situations qui ne peuvent pas être maintenues sur plusieurs exécutions, elles ne sont donc pas en régime permanent.
Nous souhaitons ensuite supprimer les exécutions présentant des sources identifiables de pertes de débit, comme celles illustrées ci-dessus. Nous voulons sélectionner une valeur PPH pour le modèle en fonction de cette limite supérieure observée. Nous utilisons généralement le 98e percentile à titre indicatif, mais il existe bien sûr une marge de manœuvre.
Nous répétons ensuite cette opération pour toutes les recettes et exportons un rapport des résultats. Je vais vous faire une démonstration. Voici un exemple de tableau que nous exporterions pour les données d'exécution d'un ensemble d'outils. Chaque ligne correspond à une exécution de différentes recettes à l'aide de divers outils. Nous avons des mesures de PPH effectuées selon plusieurs méthodologies. Plus loin, vous trouverez certains des facteurs qui influencent la variabilité.
Je vais lancer mon outil PPH et nous commencerons par ce sélecteur de colonnes. J'utiliserai Takt PPH pour cet ensemble d'outils, et mes sources de variation sont regroupées ici. Nous allons examiner l'outil, le nombre total de plaquettes, le nombre de chambres et les spécifications de la recette précédente.
Je vais lancer ceci. Voici la vue principale de notre tableau de bord. En haut, vous trouverez des commandes globales. Ce panneau affiche la répartition de chaque spécification de recette. En dessous de chaque spécification, vous verrez des commandes personnalisées qui s'appliquent directement à la recette correspondante. Un tableau récapitulatif, situé plus bas, contient des informations pour chaque recette et se mettra à jour au fur et à mesure des révisions.
Ce panneau sert à l'analyse. Pour l'instant, il est presque vide, mais il se remplira au fur et à mesure que vous cliquerez sur les options. J'ai des graphiques temporels pour chaque recette, et enfin, des filtres de données. Commençons par la première recette.
Je vais commencer par appliquer un filtre. Vous remarquerez que le filtrage des prédicteurs a changé. On constate maintenant que, pour cette recette, le principal facteur de variabilité est cet outil. Je clique dessus, puis sur « Graphique de variabilité », et je peux colorer les éléments sélectionnés.
On peut maintenant observer, au sein de cet ensemble de données, les variations selon les outils. Je constate que quasiment tous les outils sont capables d'atteindre la limite supérieure que nous avons identifiée. Je serais donc tout à fait à l'aise de fixer la valeur PPH de mon modèle à cette limite.
Je tiens à préciser que dans cet exemple, j'ai une ligne pour le modèle PPH. Il s'agit de la valeur précédente que nous modélisions pour cet ensemble d'outils. Dans ce cas précis, nous sous-estimons largement la capacité de cet outil. Nous indiquons qu'il peut fonctionner à 35,1, alors qu'en réalité, il est capable de fonctionner à 37,48.
Il y a un problème majeur avec la capacité de l'usine : nous ne la comprenons pas correctement. Il est essentiel de trouver la valeur adéquate pour modéliser précisément sa capacité.
Lorsque je réfléchis à la sélection de cette valeur, une autre option s'offre à moi : s'il y a des points qui semblent être des données aberrantes que vous souhaitez supprimer, j'ai un bouton appelé « trim » qui supprimera les 1 % supérieurs et inférieurs des données.
Nous pouvons sélectionner le modèle PPH ou le PPH recommandé à 98 %, ou saisir une valeur personnalisée. Vous pouvez la déplacer à l'aide des boutons ci-dessous. Une fois la valeur souhaitée trouvée, sélectionnez-la ici, cliquez dessus, puis appuyez sur « Sélectionner ». Elle s'affichera alors dans le tableau récapitulatif. Vous pouvez également ajouter des notes, qui apparaîtront ici.
Je vais maintenant aborder une spécification de recette un peu plus complexe pour vous montrer ce que représente l'analyse de données de ce type. Je vais commencer par filtrer les données. Vous constaterez que ce panneau s'est mis à jour. Le principal facteur de variabilité dans cet ensemble de données est constitué des spécifications de recette précédentes. Quel processus était en cours d'exécution avant le chargement de ce lot de plaquettes ?
Je vais examiner ce graphique de variabilité et le colorer. Celui-ci me semble particulièrement intéressant. L'exécution est plus rapide après la recette B. On remarque que nous observons actuellement la recette B. Celle-ci satisfait la condition d'état stationnaire. Nous exécutons la même recette à la suite. C'est la méthode la plus efficace pour exécuter cette recette. C'est ce que nous cherchons à reproduire dans le modèle.
Je vais sélectionner les autres et utiliser ce bouton pour les masquer et les exclure, afin d'éliminer cette source de variation connue et identifiée. L'analyse de notre outil de sélection des prédicteurs révèle, une fois de plus, le facteur le plus déterminant.
Je vais y jeter un œil. Il me semble que la plupart des outils sont capables d'atteindre cette valeur élevée. Je serais donc assez à l'aise, une fois de plus, avec le choix de cette valeur recommandée de 98 %. Je remarque que l'outil 6 présente une traînée assez importante par rapport aux autres. Je vais le noter afin d'en discuter avec l'équipe d'ingénierie des processeurs et voir s'ils souhaitent vérifier quelque chose concernant cet outil. Je vais ajouter cette note et sélectionner ma valeur de 98 %.
Supposons que vous soyez en train de réaliser cette révision et que vous souhaitiez revenir sur une révision précédente, terminée ou non, et importer un résumé partiellement rempli. Vous pouvez cliquer sur ce bouton pour importer un tableau récapitulatif, qui sera une version enregistrée de ce tableau. Ce dernier sera alors rempli à nouveau avec toutes vos valeurs précédentes et les valeurs sélectionnées dans la distribution seront mises à jour. Vous pouvez ainsi réintégrer facilement une révision que vous aviez effectuée précédemment.
Enfin, une fois que vous estimez avoir terminé et que vous êtes prêt à exporter vos résultats, ce bouton créera une présentation PowerPoint contenant un tableau reprenant toutes les valeurs sélectionnées, vos notes, leur provenance, ainsi que des vignettes de chaque spécification de recette. Vous pourrez ensuite utiliser ces données lors d'une autre importation, puis importer directement ce tableau dans le modèle.
Pour en revenir à mon diaporama, plutôt que de détailler l'intégralité du script (celui de cet outil étant assez vaste), je vais me concentrer sur trois fonctionnalités clés qui, à mon avis, en constituent le cœur et le rendent possible.
Premièrement, lorsque vous travaillez avec des éléments d'affichage créés à l'aide d'une variable de regroupement, il peut s'avérer complexe d'interagir avec des éléments spécifiques au sein d'un groupe. Prenons l'exemple de ma liste de distributions par recette. Comment sélectionner l'élément avec lequel je souhaite interagir ?
Ma solution consiste à nommer la distribution lors de sa création, ce qui me fournit une liste de références vers chaque élément d'affichage. Je peux ensuite utiliser cette liste dans une boucle ou y accéder directement par son index.
Deuxièmement, il y a la gestion des données. De nombreuses valeurs, associées aux spécifications des recettes ou à divers aspects de ce rapport, doivent être gérées et transmises entre les éléments d'affichage et d'autres emplacements. La solution consiste à créer une autre liste d'index par nom de recette, qui correspond directement à la liste d'index précédente et utilise des tableaux associatifs pour stocker les données par nom.
Troisièmement, concernant les éléments interactifs : ils doivent identifier la partie de votre distribution avec laquelle ils doivent interagir lorsque l’utilisateur clique dessus ou interagit avec eux. Ils doivent être liés à la spécification de recette correspondante. Lorsqu’ils sont créés dans une boucle, ils ne conservent pas l’index avec lequel ils ont été créés.
La solution consiste à leur permettre d'identifier eux-mêmes leur contexte en stockant une référence à l'élément parent, puis en utilisant la commande XPath pour extraire l'index de leur position. Je vais illustrer cela par quelques exemples afin de clarifier ce point.
Voici mes distributions créées à l'aide d'une variable, « Par spécification de recette », que j'ai nommée « dist_right_here ». Cette variable contient la liste de tous les éléments de distribution qui composent cet affichage. Les noms de mes recettes sont également stockés dans une liste qui correspond directement à ces éléments.
Je vais parcourir cette liste de distributions et effectuer des opérations comme renseigner vos données par spécification de recette. Ici, j'ai un tableau associatif que je remplis à l'aide de la quatrième colonne de mon tableau de données récapitulatives.
Cela me donne mes quantiles, et vous pouvez voir que chaque nom de recette correspond à une valeur. Vous pouvez également interagir avec les éléments du graphique au sein de la même boucle. Ici, je modifie l'accès et, dans ce cas précis, j'ajoute une ligne de référence.
Pour ce faire, j'utilise une convention de nommage imbriquée. Ma liste de recettes stocke le nom, qui est ensuite imbriqué dans un tableau associatif. Ce dernier référence le nom et renvoie la valeur. Cette technique d'imbrication est essentielle pour permettre l'échange de données entre tous les endroits qui ont besoin d'accéder à cette valeur.
Ensuite, les éléments interactifs sont créés au sein de la même boucle que celle que nous venons d'évoquer. Ils sont ajoutés comme éléments frères à chacun des éléments de distribution individuels, que je référence ici par un index.
Voici un exemple pour le bouton Sélectionner. Le code est assez conséquent, mais il commence par vérifier le chemin d'affichage jusqu'à la boîte de distribution. Une référence au conteneur parent contenant la distribution est stockée lors de sa création, ce qui permet à la fonction de revenir à ce conteneur et de renvoyer un texte dont le numéro correspond à l'index de l'élément affiché.
Lorsque vous cliquez sur le bouton Sélectionner, le système vérifie l'emplacement de l'élément et attribue un index permettant de le sélectionner pour la recette A. Cette recette, qu'il s'agisse de son index ou de son nom, peut ensuite être transmise à d'autres fonctions. Vous pouvez ainsi interagir avec des lignes spécifiques de votre tableau récapitulatif grâce à ce nom de recette, modifier les éléments d'affichage et accéder aux valeurs des données. En bref, toutes les actions nécessaires concernant ce nom de recette sont possibles dans d'autres fonctions, une fois que vous avez identifié à quoi il correspond.
J'ai une autre démo à vous présenter. Il s'agit d'un exemple plus court et plus simple, réalisé avec les données JMP, afin de reproduire certaines des fonctionnalités de mon script principal. Je tiens à souligner que cet exemple est beaucoup plus simple qu'il n'y paraît. Il ne comporte que 73 lignes de code, commentaires exclus. Je vais vous l'expliquer étape par étape.
Je vais commencer par exécuter le script. Il ouvre ces données d'exemple sur les prix à la consommation. Nous avons un tableau récapitulatif qui présente chaque article, son prix moyen, puis un prix de référence, et sous chaque distribution, un petit élément interactif.
Vous pouvez définir la valeur moyenne par défaut et la modifier, ou sélectionner une valeur puis votre prix, qui sera ensuite affiché ici. Voici un petit exemple pour illustrer une fonctionnalité similaire à celle du script principal.
Analysons ce script étape par étape. Commençons par les bases. J'ai des déclarations qui constituent ma liste d'articles, mes tableaux associatifs pour le prix moyen, un prix temporaire (un espace réservé pour mémoriser sa valeur), et enfin le prix sélectionné, qui permet de récupérer la valeur choisie et de l'insérer dans le tableau récapitulatif.
Je commence par créer le tableau récapitulatif, puis je modifie sa mise en forme et j'ajoute une nouvelle colonne. Ensuite, je crée une fenêtre d'affichage. Dans ce cadre en forme de H, j'ai une référence au tableau récapitulatif que nous venons de créer, et je crée maintenant mes distributions directement dans cette fenêtre. Vous remarquerez, une fois de plus, cette référence au cadre de défilement qui contient les distributions, nommées ici. C'est tout ce qui permet de créer la fenêtre d'affichage que vous voyez.
Ensuite, je vais créer ma liste d'éléments, qui correspondra aux éléments d'affichage individuels de cette liste de distributions. Puis, j'exécuterai ma boucle, la même que celle dont nous avons parlé précédemment. Je commencerai par renseigner le prix moyen, qui provient directement du tableau récapitulatif, puis le prix temporaire, de la même manière.
Je vais maintenant modifier les formats d'accès pour chacun et ajouter des lignes de référence à la valeur moyenne en utilisant la technique d'imbrication dont nous avons parlé. Je vais ensuite ajouter un élément frère à chaque distribution. J'ai ici plusieurs conteneurs pour l'espacement, puis ma zone de saisie numérique, c'est-à-dire la zone où l'on peut saisir et déplacer des valeurs.
Lorsqu'on interagit avec cet élément, il exécute la fonction qu'il contient. La première action consiste à vérifier son chemin d'accès. J'ai configuré l'affichage des valeurs correspondantes. Si l'on en sélectionne un et qu'on le modifie, comme vous pouvez le voir dans le journal ci-dessous, il renvoie le chemin X. Il extrait l'index et affiche le nom.
Au fur et à mesure que nous explorons différentes options, vous pouvez constater que le nom affiché varie selon l'élément sur lequel vous cliquez. Ensuite, il suffit d'accéder à la boîte de dialogue pour interagir avec elle. Nous supprimons les anciennes lignes de référence afin d'éviter les doublons, et nous rétablissons celles qui auraient pu être supprimées en cas de chevauchement. Voilà ce qui se passe ici.
Le prix temporaire sera ensuite mis à jour en fonction du nom de l'article et de la valeur saisie dans le champ numérique. Nous ajouterons ensuite une ligne de référence spécifique à la valeur sélectionnée. Voici le code du bouton Sélectionner. Comme pour le champ numérique, nous parcourons l'arborescence pour extraire le nom et l'index de l'article.
Nous allons supprimer toutes les lignes d'accès précédemment sélectionnées, en réintégrant celles qui ont été supprimées, puis mettre à jour le prix sélectionné avec le prix temporaire que nous avons créé lors de notre interaction précédente avec la case. Ensuite, nous mettrons à jour le tableau récapitulatif avec le prix sélectionné et tracerons une ligne verte en gras pour indiquer qu'il s'agit de la valeur sélectionnée.
Voilà, c'est tout. J'espère que cela n'a pas paru trop compliqué. En fait, il s'agit surtout d'interagir avec les accès et d'ajouter des lignes de référence ; tout ce qui permet de rendre les éléments interactifs fonctionnels est vraiment assez simple.
Ce script, ainsi que les données d'exemple et le script PPH complet, seront tous disponibles avec le contenu de ma présentation. Vous pourrez ainsi les tester ou approfondir leur fonctionnement.
Pour conclure, je vais partager quelques enseignements tirés de la création et de l'utilisation de l'outil PPH. Le premier est que l'ajout d'éléments interactifs aux plateformes de JMP élargit considérablement les possibilités d'analyse.
Il s'agit de choses comme celles-ci, simplement la possibilité de sélectionner une valeur et de la voir s'afficher ailleurs, ou dans l'outil PPH, le filtrage des prédicteurs, puis la possibilité de sélectionner des valeurs à partir de là et ensuite d'approfondir avec un graphique de variabilité.
L'étape suivante consiste à documenter les résultats d'exportation, ce qui contribue grandement à fluidifier le processus de communication. Nous partons de données brutes, une personne effectue une analyse, puis elle peut exporter ces résultats dans un tableau transmissible à la personne chargée de la maintenance du modèle.
Vous pouvez prendre des notes qui seront transmises à un ingénieur de procédés ou d'équipement pour l'aider à vérifier différents points concernant ses outils. Ensuite, pour la programmation, l'utilisation de listes ordonnées comme clés d'index avec des tableaux associatifs pour stocker, rechercher et transmettre des données entre différents éléments d'affichage s'est avérée essentielle pour le traitement d'un grand volume de données.
Créez ensuite les commandes interactives à l'aide d'un élément d'affichage défini par une variable et parcouru dans une boucle. Vous pouvez réaliser de nombreuses actions simplement en parcourant la liste des éléments d'affichage obtenue grâce à cette variable.
Enfin, le plus important pour moi est de souligner que la programmation n'est pas aussi complexe qu'il n'y paraît. L'outil PPH est un script volumineux et peut sembler intimidant au premier abord, mais avec le temps, sa mise en œuvre est relativement simple.
Lorsque je crée des scripts, j'utilise systématiquement l'index des scripts. J'ai toujours les outils d'aide JMP ouverts, ainsi que mon journal d'activité, afin de suivre l'activité pendant que je travaille dans JMP.
J'encourage vivement tous ceux qui ne l'ont pas encore essayé ou qui pourraient être intimidés à se lancer, car cela élargit considérablement les possibilités offertes par JMP. C'est tout pour le moment. Merci de votre attention.