半导体工厂产能建模涉及维护数千种工艺配方的吞吐量值(以每小时产量[PPH]表示)。每次运行的加工数据都会被存储,从而形成丰富的历史数据池,可用于确定PPH值。在产能建模中,降低产能的效率损失与吞吐量被隔离,因此建模的PPH值应代表连续运行下的最高性能。这些要求使得筛选历史数据的过程变得复杂,工艺专家需要格外谨慎地识别那些应从分析中排除的非稳态运行数据。
利用 JSL,我们创建了一个交互式工具,用于辅助分析历史吞吐量数据,以便评估、选择和记录按配方划分的 PPH(生产者每小时产量),用于产能建模。该脚本构建了一个完全交互式的独立仪表板应用程序,利用 JSL 增强的平台和自定义控件,帮助用户探索变异来源并分离稳态运行数据。PPH 值的选择和记录直接在仪表板中进行,最后,可以将所选值和分布的摘要导出到 PowerPoint,生成完整的分析报告。
大家好,我叫米歇尔·特威利格 (Michelle Terwilliger)。我是德州仪器公司位于缅因州南波特兰分部的工业工程师。今天,我将介绍一个使用 JSL 脚本编写的交互式工具,该工具可用于探索历史吞吐量数据。
在介绍我的脚本之前,我想先简单介绍一下工厂产能建模,以便大家了解我们如何使用 JMP 来进行建模。首先,我们需要了解要建模产能的工具集的相关信息,包括每个配方的吞吐量以及该工具集的总工时。
然后,我们应用一个正在考虑在工厂运行的启动配置文件,并按配方查找我们的工序,然后通过按配方计算吞吐量来汇总这些工序,从而获得运行该物料所需的生产时间。
然后,我们考虑工具集预期存在的效率损失,并以此来调整工具集的总工时,从而得出计划的实际生产工时。这两个值的比值即为产能利用率。这可以告诉我们是否可以按计划运行生产流程,或者是否需要增加或减少晶圆。
本次演讲我将重点介绍按配方划分的产量。我们用每小时产量(PPH)来衡量产量。您会听到我多次提到这个单位。我们工厂几乎每个配方都有产量数据,总共有数千个配方。您可以想象,要存储、维护并及时更新这些数据,工作量相当大。
我还想指出,这些效率低下之处与吞吐量完全无关。我们在考虑模型的吞吐量值时,希望尽可能捕捉到能够代表该配方所能达到的最高性能的值,也就是在建模时排除所有效率低下因素。
在为模型选择参数值时,我们需要牢记以下几个条件。我们希望模型达到最高性能,并且没有任何效率损失。我们希望模型能够模拟连续运行下的稳态条件。需要注意的是,模型的其他部分已经体现了效率损失,所以我们并没有忽略它们。
然而,这种情况在生产环境中很难甚至不可能重现。与其尝试运行测试来重现这种场景,我们不如利用历史生产数据来了解如果真的在这种情况下运行,可能会出现哪些数值。这就是 JMP 的用武之地。
我们使用 JMP 来可视化和探索变异来源。我们用它来排除已知效率低下的运行,筛选出能够代表稳态条件的运行,然后记录这些结果。
当我们着手审查数据集时,我们会得到特定配方的吞吐量测量样本。我们可以假设,其中会存在来自多种不同来源的损耗,例如工具差异、配方差异等等。前一次运行的结果会对下一次运行产生很大影响,例如装料时间、使用的腔室数量等等。
鉴于此,我们也应该测量到这些损耗接近于零的情况。如果确实如此,那么当所有损耗都尽可能接近于零时,观测到的吞吐量应该存在一个上限。事实证明确实如此。我们的数据确实在上限处出现了一个相当明显的平台期。这就是我们为了建模目的而追求的最佳性能。
选择 PPH 需要遵循一定的流程。首先,我们要筛选出处于稳定状态的运行数据。需要注意的是,有些运行数据看起来可能更快,但它们出现在无法持续多次运行的情况下,因此并非处于稳定状态。
接下来,我们要剔除那些存在明显吞吐量损失的运行记录,就像上面提到的那些。我们希望根据观察到的上限值来为模型选择一个 PPH 值。我们通常建议使用第 98 百分位数,但显然还有调整的空间。
然后我们对所有配方重复此操作,并导出结果报告。接下来我将进行演示。这是一个示例表格,用于导出工具集运行数据。您可以看到,每一行代表使用各种工具运行不同配方的一次结果。我们使用几种不同的方法测量了一些 PPH 值。再往后看,我列出了一些影响变异性的因素。
我将运行我的 PPH 工具,我们先从这个列选择器开始。我将使用 Takt PPH 作为此工具集,我的变异来源都集中在这里。我们将查看工具、晶圆总数、腔室数量和之前的配方规格。
我来运行一下。这是我们仪表盘的主视图。上面是一些全局控件。这个面板包含每个配方规格的分布情况,您会看到每个规格下方都有一些自定义控件,这些控件直接应用于其上方的配方规格。下面是一个汇总表,其中包含每个配方的信息,它会在我们进行审核时更新。
这个面板用于分析。现在它几乎是空的,但随着我们点击这些选项,你会看到它逐渐显示内容。我这里有每个食谱的时间曲线图,最后,这里还有一些数据筛选器。我们先从第一个食谱开始。
首先,我要进行筛选。你会注意到,筛选之后,预测因子的筛选条件发生了变化。现在我们可以看到,对于这个食谱来说,影响变异性最大的因素是这个工具。我点击它,然后点击“变异性图”,就可以按选定项着色了。
现在我们可以从这个数据集中看出不同工具之间的差异。我注意到,几乎每种工具都能达到我们观察到的上限值。因此,我完全可以放心地将我的模型 PPH 值设定在这个上限值。
在这个例子中,我需要指出,这里有一行是 PPH 型号的数值。这是我们之前为这套工具建模的值。在这个例子中,我们严重低估了这套工具的实际能力。我们说它的运行速度是 35.1,但实际上它能达到 37.48。
这里存在一个很大的认知偏差,即当这个参数设置不正确时,我们对工厂产能的理解就会出现偏差。找到正确的参数值至关重要,这样我们才能真正建立起工厂的正确产能模型。
当我考虑选择这个值时,我还有另一个选择:如果这里有一些看起来像是你想从数据中删除的传单,我有一个名为“修剪”的按钮,它可以删除顶部和底部 1% 的数据。
我们可以选择模型 PPH 值或推荐的 98% PPH 值,也可以输入自定义值,您可以使用这些按钮上下移动它。找到所需值后,您可以在这里选中它,点击它,然后点击“选择”。您会注意到它出现在汇总表中。我们还可以根据需要添加备注,这些备注也会显示在这里。
现在我将使用一个稍微复杂一些的配方规范,来展示深入分析这类数据究竟是什么样的体验。首先进行筛选。你会看到这个面板已经更新了。现在,造成此数据集变异性的主要因素是之前的配方规范。在我加载这批晶圆之前,运行的是什么配方规范呢?
我会查看这个变异性图并进行着色。对我来说,这个图非常突出。它在执行完配方 B 之后运行速度更快。我们会注意到,我们实际上正在查看配方 B。这满足了稳态条件。我们连续运行相同的配方。这是运行该配方最有效的方式。这正是我们想要在模型中捕捉到的。
我接下来要选中剩下的几个,然后用这个按钮把它们隐藏并排除掉,这样我们就能消除这个已知且已识别的变异来源。现在,再次查看我们的预测因子筛选工具,它仍然是最大的影响因素。
我这就去看一下。在我看来,大多数工具似乎都能达到这么高的值。所以我再次觉得选择98%这个推荐值比较放心。我注意到工具6的尾部与其他工具相比明显更长。我可能需要记下来,以便和处理器设备工程师沟通,看看他们是否需要检查一下这个工具。我会把这个记录记下来,然后选择98%的值。
假设您正在进行本次审核,并且想要重新查看之前已完成或未完成的审核,并导入部分完成的摘要,我们可以点击此按钮导入摘要表(即该表格的已保存版本),它会将您之前的所有值重新填充到表格中,并更新分布中所有选定的值。您可以直接返回之前完成的审核。
最后,当您觉得一切就绪,准备导出结果时,点击此按钮即可创建一个 PowerPoint 文件,其中包含一个表格,列出了您选择的所有值、您的备注、值来源以及每个配方规格的缩略图。您可以将这些内容用于其他导入操作,然后将此表格直接导入到模型中。
回到我的幻灯片演示。这个工具的脚本非常复杂,所以我不会逐一讲解。我将重点介绍三个我认为真正将所有功能整合在一起并使其得以实现的独特特性。
首先,当您使用基于变量创建的显示元素时,操作起来可能会比较复杂,尤其是在尝试与组内的特定元素进行交互时。例如,这是我按配方列出的分发列表。我该如何选择要交互的元素呢?
我的解决方案是,在创建分发包时,我会给它命名,这样就能得到一个指向各个显示元素的引用列表。我可以使用循环来调用这个列表,也可以直接通过索引来引用它们。
其次是数据管理。这份报告中有很多与配方规格或其他方面相关的不同值,需要维护并在显示元素和其他位置之间传递。解决方案是创建一个按配方名称排列的索引列表,该列表直接映射回我们之前使用的索引列表,并使用关联数组按名称存储数据。
第三点是交互元素,它们需要识别出你分发包中的哪个部分,或者当你点击或与之交互时,你希望它们与哪个分发包进行交互。它们需要与特定的配方规范关联起来。当你在循环中创建它们时,它们不会保留创建时使用的索引值。
解决方案是让它们能够通过存储对父元素的引用来识别自身所处的上下文,然后使用 XPath 命令提取它们所在的索引值。我将逐步举例说明这些内容,希望能帮助大家更好地理解。
这是我根据“按配方规格”变量创建的分布列表,您可以看到我把它命名为 dist_right_here。它实际上包含构成此显示的所有分布元素的列表。此外,我还将配方名称存储在一个列表中,该列表直接映射到这些分布元素。
你可以循环遍历这个分销列表,并执行一些操作,例如根据配方规格填充数据。这里,我有一个关联数组,我正在使用汇总数据表的第四列来填充它。
这样就能得到我的分位数,你可以看到每个配方名称都指向一个值。你也可以在同一个循环中与图表元素进行交互。这里我对访问权限进行了一些更改,在这个例子中,我添加了一条参考线。
为此,我在这里使用了嵌套命名约定。我的菜谱列表存储名称,该名称嵌套在关联数组中。关联数组引用名称,从而返回值。这种嵌套技术是关键所在,它使得所有需要访问该值的地方都能来回传递数据。
接下来是交互元素,它们是在我们刚才提到的同一个循环中创建的。它们会作为同级元素添加到每个单独的分发元素之后,我在这里用索引来引用这些分发元素。
以下是“选择”按钮的示例。这里涉及大量代码,但首先会检查显示路径,使其返回到分发框。我存储了一个指向父容器的引用,该容器在创建分发框时就存在,这样该函数就可以回溯到该容器,并返回一个包含数字的文本,该数字与显示元素所在的索引号相同。
点击“选择”按钮后,程序会检查当前位置,并返回一个索引,该索引会映射并指示“好的,我要选择这个食谱 A”。然后,无论是索引还是食谱名称,都可以将该食谱传递给程序内部的其他函数。您可以根据该食谱名称与汇总表中的特定行进行交互,更改显示元素,访问数据值。一旦确定了点击该名称所对应的食谱,您就可以在其他函数中使用该食谱名称执行任何操作。
我其实还有另一个演示要讲解。这是一个更小更短的例子,使用 JMP 示例数据制作,旨在展示一个更简单的示例,实现我在较长脚本中实现的一些相同功能。我想强调的是,它比看起来要简单得多。如果去掉注释中的空格,这段代码只有 73 行。接下来我会一步一步地讲解。
我先运行一下脚本。它会打开消费者价格样本数据。我们有一个汇总表,其中包含了每种不同商品的价格、平均价格和选定价格,在每个价格分布下方,还有一个小小的交互式元素。
你可以使用默认值,也可以上下调整这个值,或者选择一个值,然后选择价格,价格就会显示在这里。这只是一个简单的例子,用来展示与我在完整脚本中实现的功能类似的操作。
我们来逐步分析一下这个脚本。先从基础讲起。这里有声明,包括商品列表、平均价格的关联数组、一个临时价格(用来记录当前值),以及一个选定价格,它会获取你选择的价格并将其填充到汇总表中。
我首先创建汇总表并修改一些格式,添加一列。然后我创建一个显示窗口,在这个 H 型分隔符框内,我引用了刚才创建的汇总表,现在我直接在里面创建分布。你会再次注意到,这里引用了包含分布的滚动框。这就是创建你现在看到的显示框的全部内容。
接下来,我将创建项目列表,该列表将映射到分布列表中的各个显示元素。现在我将执行循环,也就是我们之前讨论过的那个循环。首先,我将填充平均价格,该价格直接来自汇总表,然后是临时价格,其值也相同。
现在我要更改每个数据的访问格式,并使用我们之前讨论过的嵌套技术,为平均值添加参考线。接下来,我会将它们作为同级元素添加到每个分布中。这里有一些容器,只是为了保持间距,然后是我的数字编辑框,也就是你可以输入和移动的实际框。
当与该对象交互时,它会执行其内部的函数。首先,它会检查其路径。我已经设置好显示路径中的值。如果我们选择一个对象并开始修改它,您可以在下面的日志中看到,它会输出 X 路径。它会提取索引并给出名称。
当我们执行不同的操作时,可以看到它会根据你点击的内容给出不同的名称。之后,它只是访问访问框以便与之交互。我们正在删除所有旧的引用线,以确保每次操作时不会重复引用线,并重新添加任何可能被删除的引用线,以防任何行重叠,它们会被之前的引用线覆盖。这就是这里正在发生的事情。
然后,临时价格会根据商品名称更新为数字框中的值。接下来,我们会添加一条专门针对您选择的值的引用行。这是“选择”按钮的代码。与数字框一样,我们会检查返回路径以提取商品名称和索引。
我们将移除之前选定的所有接入线,重新添加任何可能已被删除的接入线,并将选定的价格更新为我们之前与该框交互时创建的临时价格。然后,我们将使用刚刚选定的价格更新汇总表,并创建一条粗体绿线,以指示这是选定的值。
就这些了。希望这没有让我觉得太复杂。我觉得大部分内容其实就是和访问控制交互,添加引用行,而真正实现交互元素功能的部分其实很简单。
这份脚本、示例数据以及更大型的PPH工具脚本都将与我的演示文稿一起上传。如果您想尝试使用它们或深入了解其工作原理,这些资源应该都可以访问。
最后,我想分享一下我在创建和使用PPH工具的过程中的一些心得体会。首先,在JMP平台中添加交互式元素确实能极大地扩展分析功能。
诸如此类的功能,例如选择一个值并将其填充到其他地方,或者在 PPH 工具中进行预测因子筛选,然后能够从中选择值,然后使用变异性图进一步扩展。
其次是记录导出结果的功能,这确实有助于简化沟通流程。我们从原始数据开始,最终由某人进行分析,然后他们可以将分析结果导出为表格,发送给模型维护人员。
您可以添加注释,并将其发送给工艺或设备工程师,以便他们检查工具上的各种事项。其次,在脚本编写方面,使用有序列表作为索引键,结合关联数组来存储、查找数据并在不同的显示元素之间传递数据,对于处理大型数据集至关重要。
然后,通过循环遍历使用变量显示的交互式控件元素。只需循环遍历使用变量创建元素时获得的显示元素列表,就可以完成很多操作。
最后,我想强调的最重要的一点是,脚本编写并没有看起来那么难。PPH 工具的脚本很大,乍一看可能令人望而生畏,但实际上,随着时间的推移,构建类似的东西并没有那么困难。
我编写脚本时,总是使用脚本索引。我总是打开 JMP 帮助文档,并且始终打开日志,以便在 JMP 中执行操作时查看发生了什么。
我真心想鼓励那些还没试过或者可能对它感到畏惧的人,请务必尝试一下,因为它确实能极大地拓展JMP的功能。以上就是我的全部内容。谢谢您的时间。