半導体工場のキャパシティモデリングには、数千ものプロセスレシピのスループット値(PPH(Parts Per Hour:時間当たりの部品数))の維持管理が含まれます。処理データは各実行ごとに保存され、PPH値の算出に使用できる豊富な履歴データプールが提供されます。キャパシティモデリングでは、キャパシティを低下させる非効率性はスループットから分離されるため、モデル化されたPPHは連続運転における最高のパフォーマンスを表す必要があります。これらの要件により、履歴データの精査プロセスが複雑になり、プロセス専門家は、分析から除外すべき非定常状態の実行を特定するために特別な注意を払う必要があります。
JSLを用いて、過去のスループットデータの分析を支援するインタラクティブツールが作成されました。このツールは、キャパシティモデリングに使用するレシピごとのPPHを評価、選択、文書化するためのツールです。このスクリプトは、JSL拡張プラットフォームとカスタムコントロールを活用した、完全にインタラクティブで自己完結型のダッシュボードアプリケーションを構築し、変動の原因の調査と定常状態の実行の分離を支援します。PPH値の選択と文書化はダッシュボード内で直接行われ、最後に選択された値と分布の概要をPowerPointにエクスポートして、完全な分析レポートを作成できます。
こんにちは、ミシェル・ターウィリガーです。テキサス・インスツルメンツ(Texas Instruments)のメイン州サウスポートランド拠点で産業エンジニアとして働いています。本日は、JSLスクリプトを使って作成された、過去のスループットデータを探索するためのインタラクティブなツールについてお話します。
スクリプトについて説明する前に、まず工場のキャパシティモデリングについて少しお話ししたいと思います。JMPをどのように活用しているか、その背景をご説明いたします。まず、キャパシティモデリングの対象となるツールセットの情報(レシピごとのスループットや、そのツールセットの合計稼働時間など)を用意します。
次に、工場で実行することを検討している開始プロファイルを適用し、レシピごとにパスを見つけ、それをレシピごとのスループットを通じて集計して、その材料を実行するために必要な生産時間を取得します。
次に、ツールセットに予想される非効率性を考慮し、それを用いてツールセットの総時間をスケール化し、計画された実際の生産時間を算出します。そして、これら2つの値の比率から、稼働率(%)が得られます。これにより、計画されたプロファイルを実行できるかどうか、あるいはウェハを追加または削除する必要があるかどうかがわかります。
今回のプレゼンテーションでは、レシピごとのスループットについてお話します。これは、PPH(部品/時間)という単位で測定しています。何度かこの表現を耳にすると思いますが、スループットの値は工場にあるほぼすべてのレシピについて保存されています。つまり、数千ものレシピが保存されているということです。ご想像のとおり、保存・管理し、常に最新の状態に保つには膨大な量になります。
また、非効率性はスループットとは完全に切り離されている点も指摘しておきたいと思います。モデルのスループット値を考える際には、レシピが維持できる最高のパフォーマンスを表す値、つまり非効率性を一切排除したモデル化を目指します。
モデルの値を選択する際には、いくつか留意すべき条件があります。最高の性能を発揮し、非効率性を排除することを目指します。また、連続運転時の定常状態を再現することも重要です。なお、非効率性はモデルの他の部分でも表現されているため、無視しているわけではありません。
これを製造環境で再現するのは非常に困難、あるいは不可能です。このシナリオを再現するテストを実行するのではなく、過去の製造データを用いて、このシナリオで実行した場合にどのような値になるかを探ります。そこでJMPの出番です。
JMPは、変動の原因を視覚化し、調査するために使用します。JMPは、既知の非効率性を示す実行を除外し、定常状態を表す実行を分離し、その結果を文書化するために使用します。
レビュー用のデータセットに近づくと、特定のレシピのスループット測定のサンプルが得られます。この中には、ツールの違いやレシピ間の差異など、様々な要因による損失が含まれていると想定できます。前回の実行結果の影響は、次回の実行結果に大きな影響を与える可能性があります。ロードタイミング、使用するチャンバー数などが挙げられます。
それを踏まえると、これらの損失がゼロに近づくという測定値も得られるはずです。もしそうなれば、すべての損失がゼロに限りなく近づくときに、観測されるスループットの上限が明らかになるはずです。そして実際にその通りになりました。データには、上限においてかなり顕著なプラトーが見られます。これが、モデリングの目的において私たちが求める最高のパフォーマンスを実現するための条件です。
PPHを選択するにはプロセスがあります。まず、定常状態の実行を分離することから始めます。一部の実行は高速に見えるかもしれませんが、複数回の実行にわたって維持できない状況で発生するため、定常状態ではないことに注意してください。
次に、スループット損失の原因が特定できる実行を除外します。つまり、ここに表示されているような項目です。観測された上限値に基づいて、モデルのPPH値を選択します。通常は98パーセンタイルを推奨値として使用しますが、もちろん調整の余地はあります。
これをすべてのレシピに対して繰り返し、結果レポートをエクスポートします。デモに移りましょう。これはツールセットから実行データをエクスポートするサンプルテーブルです。各行は、様々なツールを用いた様々なレシピの実行1回分です。いくつかの異なる手法で取得したPPH測定値があります。さらにこちらには、変動性に影響を与える要因がいくつか示されています。
PPHツールを実行し、まずはこの列セレクタから始めます。このツールセットにはTakt PPHを使用します。変動要因はここにグループ化されています。ツール、ウェーハ総数、チャンバー数、前回のレシピ仕様を確認します。
これを実行します。これがダッシュボードのメインビューです。上部にはグローバルコントロールがあります。このパネルには各レシピスペックの分布が表示されており、それぞれの下に、その上にあるレシピスペックに直接適用されるカスタムコントロールがあります。下部には各レシピの情報を含むサマリーテーブルがあり、レビューを行うとこのテーブルに情報が追加されます。
このパネルは分析用です。今はまだ何も表示されていませんが、ここにあるオプションをクリックすると、情報が表示されます。各レシピの時間プロットがあり、最後にデータフィルターがあります。まずはこの最初のレシピから始めましょう。
まず最初に、フィルターを適用します。フィルターを適用すると、予測因子のスクリーニング結果が変化したことに気づくでしょう。これで、このレシピにおいて、このツールの変動性に最も大きく寄与する要因が何であるかが分かります。これをクリックしてから「変動性プロット」をクリックすると、選択した項目ごとに色分けできます。
このデータセットでは、ツールによってどのように変化するかを確認できます。ここで注目すべきは、ほぼすべてのツールが、先ほど確認した上限に達する可能性があることです。この上限に、モデルのPPH値を設定しても問題ないと考えています。
この例では、モデルPPHの行があることを指摘しておきます。これは、このツールセットでモデル化していた以前の値です。この場合、このツールの能力を大幅に過小評価しています。35.1で動作可能としていますが、実際には37.48で動作可能です。
正しく設定されていないと、工場の生産能力を正しく理解できないという大きなギャップが生じます。工場の正確な生産能力をモデル化するために、適切な値を見つけることが重要です。
この値を選択する際に、別のオプションとして、データから削除したいフライヤーと思われるポイントがいくつかある場合は、「トリム」というボタンを使用して、データの上位 1% と下位 1% を削除します。
モデルPPHまたは推奨98% PPHのいずれかを選択できます。また、カスタム値を入力するオプションもあります。これらのボタンを使って値を上下に移動できます。希望する値が見つかったら、ここで選択してクリックし、「選択」をクリックします。すると、サマリーテーブルに入力された値が表示されます。必要に応じてメモを追加することもできます。メモはここに表示されます。
さて、もう少し複雑なレシピ仕様に移り、このようなデータの詳細な分析が実際にどのようなものなのかを見てみましょう。まずはフィルタリングから始めましょう。このパネルが更新されているのがわかると思います。さて、このデータセットの変動に最も大きく影響しているのが、以前のレシピ仕様です。このウエハースをロードする前は何が実行されていたのでしょうか?
変動プロットを見て、色を塗りましょう。これはかなり目立ちます。レシピBの後に実行しているときの方が速くなっています。実はレシピBを見ていることに気づくでしょう。これは定常状態条件を満たしています。同じレシピを次々に実行しています。これがこのレシピを実行する最も効率的な方法です。これがモデルで捉えたいものです。
残りの変数も選択し、このボタンを使って非表示にして除外します。こうすることで、既知の変動源を除外できます。予測因子スクリーニングツールを見てみると、これが再び、最も大きな要因であることが分かります。
ちょっと確認してみます。ほとんどのツールがその高い値を達成できるように思えます。繰り返しになりますが、この98%の推奨値を選択しても問題ないと思います。ツール6は他のツールと比べてかなりテールが大きいことに気づきました。これはメモしておき、プロセッサ機器のエンジニアリング担当者と相談して、このツールについて確認したい点があるかどうかを確認した方が良いかもしれません。そのメモを記入して、98%の値を選択します。
さて、このレビューを実施している際に、完了した、あるいは完了していない以前のレビューを再確認し、途中まで完了したサマリーをインポートしたいとします。このボタンをクリックしてサマリーテーブルをインポートできます。これは、このテーブルの保存バージョンです。これにより、以前のすべての値がテーブルに再入力され、分布内の選択されたすべての値が更新されます。以前行ったレビューをすぐに呼び出すことができます。
最後に、作業が完了し、結果をエクスポートする準備ができたら、このボタンをクリックすると、選択したすべての値、メモ、それらの取得元、そして各レシピの仕様のサムネイルを含む表を含むPowerPointファイルが作成されます。これらの表は別のインポートで使用でき、その後、この表をモデルに直接インポートできます。
スライドショーに戻りましょう。このツールのスクリプト全体をステップごとに解説するのはかなり大変です。ここでは、ツール全体をまとめ、実現していると思われる3つの機能に焦点を当てたいと思います。
まず、by変数を使って作成された表示要素を扱う際に、グループ内の特定の要素を操作しようとすると、操作が複雑になることがあります。これはレシピごとのディストリビューションのリストです。操作したい要素をどのように選択すればよいでしょうか?
私の解決策は、ディストリビューションを作成する際に名前を付けることで、個々の表示要素への参照リストを取得することです。このリストはループで使用したり、インデックスで直接参照したりできます。
2つ目はデータの管理です。レシピの仕様やレポート内の様々な側面に関連する様々な値があり、それらを管理し、表示要素や他の場所間で受け渡す必要があります。この問題を解決するために、レシピ名による別のインデックスリストを作成します。このリストは、前述のインデックスリストに直接マッピングされ、連想配列を使用して名前でデータを格納します。
3つ目はインタラクティブ要素です。クリックしたり操作したりする際に、ディストリビューションのどの部分、どのディストリビューションと連携させたいかを識別する必要があります。これらの要素は特定のレシピ仕様に結び付けられる必要があります。ループ内で生成した場合、生成時のインデックス値は保持されません。
解決策は、親要素への参照を保存し、Xパスコマンドを使ってその要素が存在するインデックス値を抽出することで、要素が自身のコンテキストを自己識別できるようにすることです。これらの例をいくつか挙げて、理解を少しでも深めていただければ幸いです。
これは、Byレシピ仕様という変数を使って作成した分布です。dist_right_hereという名前をつけています。この変数には、この表示を構成するすべての分布要素のリストが含まれています。また、レシピ名もリストに保存されており、これらに直接マッピングされています。
ループ処理が可能です。このディストリビューションのリストをループ処理して、レシピの仕様に基づいてデータを入力するなどの処理を行います。ここでは連想配列を使用しており、サマリーデータテーブルの4列目を使ってデータを入力しています。
これで分位数が分かりました。それぞれのレシピ名が値を指し示しているのが分かります。同じループ内でグラフ要素を操作することもできます。ここではアクセスにいくつか変更を加えており、今回は参照線を追加しています。
これを実現するために、ここではネストされた命名規則を使用しています。レシピリストには名前が格納されており、それが連想配列の中にネストされています。連想配列は名前を参照し、値を返します。このネストされた手法は、値にアクセスする必要がある様々な場所間でデータの受け渡しを可能にする上で、非常に重要な役割を果たしています。
次に、インタラクティブ要素についてですが、これは先ほど説明したループ内で作成されます。これらは、個々のディストリビューション要素の兄弟要素として追加されます。ここではインデックスで参照しています。
「選択」ボタンの例を以下に示します。ここでは多くのコードが使用されていますが、このパスでディスプレイパスをチェックし、ディストリビューションボックスまで戻ります。ディストリビューションが作成された際に保持されていた親コンテナへの参照を保存しているので、この関数はこの参照まで戻り、ディスプレイ要素のインデックス番号と同じ数値を含むテキストを返します。
「選択」ボタンをクリックすると、その位置がチェックされ、マッピングされたインデックスが与えられます。「レシピAにはこれを選択します」という指示です。すると、そのレシピ(インデックスでも名前でも)は、その中の他の関数に渡されます。例えば、サマリーテーブル内の特定の行をレシピ名で操作したり、表示要素を変更したり、データ値にアクセスしたりできます。レシピ名を使って必要な操作はすべて、クリックした際にレシピ名が何の目的で使用されるかが分かれば、他の関数で実行できます。
実は、もう一つデモがあります。こちらはJMPのサンプルデータを使って作成した、より簡潔な例です。大きなスクリプトで行っていることと似たような処理をいくつか実行している、よりシンプルな例です。強調しておきたいのは、これは見た目よりもはるかにシンプルだということです。コメントのスペースを除けば、コードはわずか73行です。このデモを一つずつ説明していきます。
まずスクリプトを実行します。消費者物価のサンプルデータが開きます。各商品、平均価格、そして選択された価格がまとめられた表があり、それぞれの分布の下に小さなインタラクティブ要素があります。
平均値をデフォルトにして上下に移動させることもできますし、値を選択して価格を選択すると、その価格がここに入力されます。これは、より大きなスクリプトで行ったことと似たようなことを示そうとした、ちょっとした例です。
このスクリプトをステップごとに見ていきましょう。まずは基本的な部分から始めましょう。宣言として、アイテムのリスト、平均価格の連想配列、そして一時価格(この値の内容を追跡するためのプレースホルダ)があります。そして、選択された価格です。これは、ここで選択された値を取得し、サマリーテーブルにポップ入力するために使用されます。
まず、サマリーテーブルを作成し、書式を変更して新しい列を追加します。次に表示ウィンドウを作成し、このHスプリッターボックスの中に、先ほど作成したサマリーテーブルへの参照を設定します。そして、そこに分布を作成していきます。ここでも、参照で指定された分布を保持するスクロールボックスへの親参照があることに気づくでしょう。これが、現在ご覧いただいている表示ボックスを作成するために使用されたすべての要素です。
次に、アイテムのリストを作成します。これは、この分布リスト内の個々の表示要素にマッピングされます。次に、先ほど説明したのと同じループを実行します。まず、サマリーテーブルから取得した平均価格を入力し、次に一時価格を設定します。
それぞれのアクセス形式を変更し、先ほど説明したネスト手法を使って平均値に参照線を追加します。次に、各分布に「兄弟として追加」します。ここにはスペース用のコンテナがいくつかあり、その下に数値編集ボックスがあります。これは実際に入力して移動できるボックスです。
これを操作すると、内部にある関数が実行されます。まず最初にパスをチェックします。値を表示するように設定しています。どれか一つを選んで操作してみると、下のログを見ると、Xパスが出力されているのが分かります。インデックスを抽出して名前を付与します。
様々なものを作成していくと、クリックした内容に応じて異なる名前が付けられているのがわかります。その後は、アクセスボックスにアクセスして操作するだけです。この操作を行うたびに参照線が重複しないように、古い参照線を削除しています。また、削除した参照線があれば、前の参照線によって重複していた可能性があるため、再度追加しています。これがここで行われていることです。
すると、アイテム名と数値ボックス内の値に基づいて、一時価格が更新されます。次に、選択した値専用の参照線を追加します。これが「選択」ボタンのコードです。数値ボックスと同様に、アイテム名とインデックスを抽出するためにパスを遡って確認しています。
以前選択したアクセス行を削除し、削除された可能性のある行を再度追加します。選択されている価格を、先ほどボックスを操作した際に作成した仮価格に更新します。次に、サマリーテーブルを選択した価格で更新し、選択された値であることを示す太い緑の線を作成します。
以上です。あまり複雑に思われなかったでしょうか?実際は、アクセスと対話して参照線を追加するだけで、インタラクティブ要素の機能を作成するための作業は実にシンプルです。
このスクリプト、サンプルデータ、そしてより大規模なPPHツールスクリプトはすべて、プレゼンテーションコンテンツと一緒にアップロードされます。これらのスクリプトを試したり、その仕組みを詳しく知りたい場合は、いつでもアクセスしていただけます。
最後に、PPHツールの作成と使用を通して得た学びをいくつか述べて締めくくりたいと思います。まず、JMPのプラットフォームにインタラクティブな要素を追加することで、分析能力が大幅に向上するということです。
これは、値を選択してそれを他の場所に入力したり、PPH ツールで予測子をスクリーニングしてそこから値を選択し、さらに変動プロットで展開したりするオプションのようなものです。
次に、結果をドキュメント化するエクスポート機能です。これはコミュニケーションパイプラインの効率化に非常に役立ちます。生データから分析を開始し、最終的に誰かが分析を実施した後、その結果をテーブルにエクスポートして、モデルのメンテナンス担当者に送信できます。
プロセスエンジニアや設備エンジニアがツールの様々なチェック項目について確認できるよう、メモを作成できます。次にスクリプト作成についてですが、順序付きリストと、それを連想配列のインデックスキーとして利用し、データの保存、検索、そして異なる表示要素間でのデータの受け渡しを行うことが、大規模なデータセットを扱う上で非常に重要でした。
次に、ループ処理を実行する変数byを使った表示要素を使ってインタラクティブなコントロールを作成します。変数byを使って何かを作成したときに得られる表示要素リストをループ処理するだけで、多くのことが可能になります。
最後に、私が最も伝えたいのは、スクリプト作成は見た目ほど難しくないということです。PPHツールは大きなスクリプトなので、見た目では難しそうに感じるかもしれませんが、実際には時間をかけて慣れていけば、そのようなものを作るのはそれほど難しくありません。
スクリプトを作成するときは、常にスクリプトインデックスを使用しています。JMPのヘルプページは常に開いており、JMPで作業しているときに何が起こっているかを確認するためにログも開いています。
まだ試したことがない方、あるいは少し不安に思っている方も、ぜひ一度お試しください。JMPでできることが本当に広がります。私からお伝えできるのは以上です。お時間いただきありがとうございました。