文/ 王永锐
WIP(Working In Progress)指的是在制零件,概念来自于ERP系统,指车间里已装配但尚未随成品下线报交而被扣除库存的零件。
我们建立一个最简单的模型,来直观说明WIP,如图1:
● SAP系统中有仓库库存点和总装(General Assembly,以下简称“GA”)车间两个库存点;
● 仓库库存点A零件系统数与实物数一致为8个;
GA库存点,系统数为6个,但是其中4个在工位n的线旁料架上还未使用,还有2个已在工位n装车,经过工位n的车辆都装上了A零件;这2个已经装车的A零件就是WIP。SAP系统中只能显示出GA库存点的库存6个,而不能区分线旁料架和WIP。
经过整车下线报交点的车辆,A零件库存在SAP系统的GA库存点扣除,不再以零件形式而存在。
● 当然,实际中的WIP要比这个模型复杂得多,在后文中会逐步体现出来。
图1 两个库存点的模型
图2 GA的单一线性结构
图3 BS的树状结构
我们首先需要理解两种具有代表性的生产线结构,实际上就是GA的单一线性结构和BS(Body Shop,车身车间)的树状结构。
图4 顺序计算法的生产线
图5 顺序计算法的生产线盘点
如图2所示:
生产线从左向右流动,G1/G2/G3/G4/G5/G6是工位,每个工位上一辆在制品车,B1/B2/B3是buffer,为连接G1~G4与G5~G6两段刚性生产线的缓冲地带,共3个车位(buffer也是造成ERP系统中看到的WIP不精确的一个原因,系统中只能对buffer设定一个恒定值,而buffer的实际值如图2所示可以是0~3辆车)。
● 零件A在G1工位安装,零件B在G2工位安装,零件C和D在G3工位安装。
表1 《盘点表》示例
表2 《车号表》示例
表3 《BOM表》示例
表4 《盘点表》
表5 《BOM表》
如图3所示:
● 两条主线,主线1(经由G1/G2/G3/G4/G5)与主线2(经由G'1/ G'2)汇合在G6工位。
● 主线1的分拼线1,经由G2'和G2''两个工位后汇合到G2工位。
● 主线1的分拼线2,经由G4''和G4'两个工位后汇合到G4工位。
● A/B/C/D/E/F/E'/F'/H/I/J/K/L这些零件,分别在箭头所指的工位上安装。
显然,BS的树状结构WIP要比GA的单一线性结构复杂一些。
一般来说,主机厂如果不清线,要获取WIP的现状情况有四种,但都不精确。本文由于篇幅所限,在此不进行详细展开。接下来,我们将以其中一种情况入手,循序渐进讲述所有车间的WIP精确获取办法。
表6
概要:单一主线从装车工位顺序依次计算到下线报交点前第一辆车。
首先,我们建立一条生产线(生产线方向,如图4),包含刚性的工位段,以及buffer段,然后我们要计算A、B两个零件的WIP。
我们走到G1和G2两个工位,盘点出G1工位车号为Sn9,G2工位车号为Sn8,如图5。
然后,我们会把这个盘点结果记录到表上,以下我们称此表为《盘点表》,预留“WIP”列用于填写计算的WIP结果,如表1。
接下来,我们从生产控制系统中拉出车号序列清单,以下简称《车号表》,内容如表2。
(假设Sn3由于某问题被Set Out,《车号表》也将精确体现这个情况。)
随后,我们再打开《BOM表》,关键内容如表3。
接下来,我们就根据上面三张表,用简单的Excel VBA编程,顺序计算A、B两个零件的WIP数量。算法如下:
a.从表4《盘点表》中从上往下顺序执行—首先程序找到零件号A,及其在工位G1上的盘点车号是Sn9(注意:工位很重要,可能存在同零件多工位)。
b.接下来程序到表5《BOM表》中查找到,A零件在工位G1上只用于ES6车型,用量为1。
c.程序(如表6)随后就知道,从工位G1对应的车号Sn9开始,往报交点前第一辆车(Sn1)数过去,凡是《车号表》中为ES6的车型,就把A零件的WIP数量累加1。从表6中我们可以看到从Sn9~Sn1,车型为ES6的车号分别是Sn9/8/6/4/2/1,共6个,那么在G1工位使用的A零件的WIP就是6。
d.盘点表中A零件的“WIP列”就会被程序填写上数字6,如表7,然后程序循环回到步骤a,开始对B零件进行同样a/b/c/d四个步骤的计算。
结合上文所述,我们可以思考并总结复述一下B零件WIP的计算过程:
B零件用于工位G2(《盘点表》和《BOM表》一致);《BOM表》上B零件在G2工位同时用于ES6和ES8且用量为2;然后《盘点表》上G2工位所盘点到的车号是Sn8,那么到《车号表》中找到车号Sn8,从上往下数到最后的Sn1,看到ES6和ES8总共7辆车,于是7辆车×用量2=14,G2工位B零件的WIP=14就计算出来了。
图6 逆向计算法的生产线
图7 逆向计算法的生产线WIP分步情况
表7
表9
表10
表11
表12
表13
基于这个计算原理,《盘点表》的“零件号+工位+车号”可以往下延长,《BOM表》的“零件号+工位”也可以往下延长,同时BOM表的车型配置列也可以往右增加,于是就可以精确计算出任意零件+工位的WIP了。当然,前提是单一主线,生产控制系统中的《车号表》精确体现了实际的在制车辆序列,实际上也就是主机厂的GA车间适用。
表14
表15
概要:对于单一主线的WIP,计算该工位的在制品由哪些零件构成。
算法1是正向算法,既然有正向思路,就有逆向的办法,下面我们看看如何以逆向的思路来计算WIP。这种逆向的计算方式,将突破单一主线的框架,将适用于几乎任何形式的生产线。不过,我们在举例讲解时,为便于理解,还是先以单一主线的模型来讲述这一原理。
同样,我们继续刚才的例子,建立一条生产线,包含刚性的工位段,以及数量不确定的buffer段(这个buffer段后面会很有用),如图6。
基于图6的假设,我们把A/B/C三个零件在各个工位上的WIP先标识出来,如图7。
由图7可见,从G1工位开始,后面的每一辆ES车型,都含有A零件×1件;从G2工位开始,后面的每一辆ES车型,都含有C零件×3件;从G4工位开始,后面的每一辆ES和ET车型,都各有B零件×2件,我们标注在每个工位号和当前工位车型的下面。
如果我们把每个工位上停留的车由哪些零件装配组合而成,形成清单;再把每个工位的清单全部集合起来,就可以知道整个生产线的WIP了。
我们从G 1工位到G 5工位一路加过去,得出A零件WIP=5,B零件WIP=8,C零件WIP=12。
这就是逆向计算法—计算每个工位的在制品由哪些零件构成,再求每个工位的并集,得出整个车间的零件WIP。
这个时候,对于盘点的要求就有所变化了,不再是针对零件进行盘点,而是针对工位上放置的是什么车型配置进行盘点,《盘点表》会变成表8所示,盘点出每个工位上有什么车型,多少台。
需要注意的是, buffer车位不是工位,不安装零件,buffer上车型也属于已完成G4工位装配的在制车型。所以,buffer上的在制车辆都盘进G4工位里面了。
接下来,我们根据《BOM表》开始计算,为便于理解,我们再在前面《BOM表》中模型增加一个C零件,在ES车型上单车用量为3,如表9。
a.我们从《盘点表》的G1工位开始,从上往下,按G1工位往G5工位的顺序开始计算每个工位上的车型由哪些零件组成。程序先来到G1工位,查看到G1工位上有1台ES,于是程序转到《BOM表》,查找到所有工位在G1,且用于ES车型的零件,是A这个零件,1件,于是程序生成了表10《后台计算过程数据暂存表》(以下简称《暂存表》)。
b.然后,程序转回《盘点表》,从G1工位转到了G2工位。程序查看到,G2工位上有一台ES车型,于是程序转到《BOM表》,查找到所有工位在G2和G1上,且用于ES车型的零件—为什么是G2和G1工位呢?因为按照《盘点表》,程序知道G2工位前面还有G1工位,到达G2工位的在制品一定经G1工位装配过了。因此,程序执行的逻辑是执行到哪个工位,就从《BOM表》中查找≤该工位,且符合该工位车型配置的所有零件。于是程序在《BOM表》中查找到,ES车型在《BOM表》的G2工位安装C零件3件,在G1工位安装A零件1件,程序在a中的《暂存表》中增加了两行数据,如表11。
表11中最后一行数据之所以将工位标G2,表示的是在G2工位上已安装的意思,而不是说A零件的《BOM表》工位是G2,注意与第一行的区别。
c.接下来程序回到《盘点表》,继续往下执行到工位G3,然后看到G3工位上有1台ET车型;同样,程序到《BOM表》中查看从ET车型在G3/G2/G1工位上有哪些零件安装,结果发现无零件安装,返回值为空,于是《暂存表》保持不变。
d.再下去程序执行到《盘点表》的G4工位,发现G4工位上有2台ES和1台ET,那么就两个车型WIP分别计算再相加。
程序回到《BOM表》,查找G4/G3/G2/G1工位上ES车型所装配的零件分别是B×2/无/C×3/A×1,因G4工位上有2台ES,于是程序计算出来G4工位上的两台ES车型共有(B×2+无+C×3+A×1)×2=B×4+C×6+A×2。然后,程序接着前面的《暂存表》增加了三行记录,如表12。
执行完对G4工位上2台ES的计算,程序不会忘记G4上还有1台ET,根据同样的原理,程序在《BOM表》中查找G4/G3/G2/G1工位上ET车型所装配的零件,查找结果只有G4工位上有B零件2件,于是继续在《暂存表》增加一行记录,如表13。
图8 存在树状结构的工位模型
图9 单一序列工位图
e.程序回到《盘点表》继续分别执行最后一个G5工位,然后G5工位在《BOM表》中没有零件安装,所以G5工位上这台ES在制品WIP计算结果与G4工位中的1台ES在制品WIP一致,B×2/无/C×3/A×1(计算过程原理与上同,不具体展开),于是在《暂存表》增加三行记录,如表14。
f.至此,程序已经从《盘点表》的G1执行到了G5工位,执行完毕,最后程序对《暂存表》按照零件号汇总,得到最终的WIP计算结果,如表15。
在此进行小结,有两个关键点值得注意:
一是程序按照《盘点表》工位顺序从上往下顺序执行,即从第一个工位一直执行到最后一个工位,每个工位上的在制品分别计算WIP。
二是程序在执行《盘点表》的每个工位时,针对工位上盘点到的不同车型配置,查找《BOM表》中该车型配置下≤该工位安装的所有零件,也就是从该工位一直往前到整个生产线的起点工位。(这一条很重要,后面我们在讲非单一主线装配结构生产线WIP的计算时将要举一反三)。
概要:通过“工位插入截止法”,把树状工位转化成单一主线,计算任何形式结构工位的WIP。
BS的树状工位,显然无法用算法2的单一主线WIP逆向算法来计算。但是,该算法是一个基础,我们对于树状工位WIP的算法,也需要把树状工位转化成单一主线工位。笔者称之为“工位插入截止法”,来将多主线、多分枝分拼线整合成单一主线。
表16 《BOM表》
表17
表18 《盘点表》
表19
表20
表21 《盘点表》
我们先建立一个存在树状结构的工位模型,如图8。在这个模型里,主线工位从最前端到最末尾,从左向右依次为G1/G2/G3/G4;同时,G3工位还和一段分拼线相连接,分拼工位从G7开始,经过G7/G6/G5后汇合到G3。
假设各个工位上需要安装的零件是A/B/C/D/D'/E/F/H,把这些零件按照《BOM表》(如表16)标注在对应的工位附近。假设各个工位上的车型配置分别是ET和ES,直接标注在各个工位下面。
上面标注到各个工位上的车型是我们盘点出来的,《盘点表》如表17。
这里注意该《盘点表》,实际上已经在第一列把树状工位串成了一条“单一主线”工位序列,过程如图9。
这就是“工位建模”的过程,将树状的工位全部插入、拉直,形成一条“单一主线”工位序列。这个工位序列,也就是《盘点表》第一列中从上往下的工位序列。
看起来和前文第六部分中的算法有些像,但还不完整,我们还需要在工位序列的右边增加一列“截止工位”。什么是截止工位呢?其实在前文第五部分也是有截止工位的,只不过所有的截止工位都是同一个,也就是单一线性工位的起点工位G1。
在前文的算法总结中提到,“程序在执行《盘点表》的每个工位时,针对工位上盘点到的不同车型配置,查找《BOM表》中该车型配置下≤该工位安装的所有零件,也就是从该工位一直往前到整个生产线的起点工位”。但现在我们用“插入截止法”把分拼树状枝线工位插进了主线工位,而分拼枝线工位的起点并非是整个生产线的起点工位,而是枝线工位自己的起点。因此,在《盘点表》中,我们可以看到工位列中G5/G6/G7旁边的“截止工位”标注的都是G7工位,如表18。
接下来我们举例看看截止工位在程序中所起到的作用:略去前面执行过程,假如程序按《盘点表》从上到下执行到了工位G6,要计算G6工位上的在制品有多少零件WIP。
a.程序从《盘点表》中识别到G6工位上有6台ES和5台ET。
b.程序到《BOM表》中,先查看BOM中所有工位在G6且车型配置为ES的零件,查到为D零件,单车用量1,再乘以6台,得出D零件6件;随后,程序继续查看BOM中所有工位在G6且车型配置为ET的零件,查到为D’零件,单车用量为2,再乘以5台,得出D’零件10件,把计算结果写入到《暂存表》,表19。
c.与前文第五部分讲的算法原理同,程序在计算完G6工位后,会沿着《盘点表》中的工位顺序,依次向上计算G6工位前面的每一个工位相应车型配置会安装什么零件,即按照G7、G2、G1的顺序依次计算。
程序在b.计算完G6后,再计算G6前面的G7工位,到BOM中查找工位在G7且车型配置为ES的零件,查到为C零件1件,然后乘以《盘点表》上G6工位上盘点到的6台ES,得到这6台ES在经过G7工位时被安装了C零件1×6=6件;程序自然也不会忘记还有5台ET也经由G7工位到达G6工位,于是程序再从BOM中查找所有工位在G7且车型配置为ET的零件,查到也是C零件,单车用量2,得到这5台ET在经过G7工位时被安装了C零件2×5=10件。程序把这两行计算结果增加写入到《暂存表》中,如表20。
注意工位还是G6,因为是针对G6工位WIP的计算。
d. 如果仍按照前面算法2的算法,计算完G7工位后还要继续沿着《盘点表》工位顺序向前,轮到计算G2工位。但是,G6工位是在分拼线上,其起点是G7工位,并没有经由G2和G1工位,因此在《盘点表》的工位列旁边增加的“截止工位”列就要起作用了,我们对于G6工位旁边标注的截止工位是G7,也就是说当计算G6工位WIP时,沿着《盘点表》继续往前爬的时候不要爬到最前面的工位G1,而是只要爬到G7工位就需要截止了。程序执行到步骤c.的时候,已经爬到了G7工位从而截止,针对G6工位的WIP就计算完毕了。这就是“截止工位”的重要作用。
e.这个程序执行过程用文字模拟到了插入的这段工位内,为更加明白我们继续模拟下去,略去工位G5,我们假设现在程序沿着《盘点表》工位顺序执行到了G3工位。现在主要讲下程序执行到G3工位时的子步骤:
e1. BOM中查询G3工位的所有符合G3工位盘点出来的车型的所有零件,加入《暂存表》。
e2. 沿着《盘点表》往前往上计算工位G5(因为G3工位的截止工位是G1,所以要一直往前往上追溯)。
♦算出BOM中G5工位上所有符合G3工位盘点出来的车型的所有零件,加入《暂存表》;
图10 树状结构的Excel建模1
图11 树状结构的Excel建模2
图12 以第一人称视角的盘点示意图
♦算出BOM中G6工位上所有符合G3工位盘点出来的车型的所有零件,加入《暂存表》;
♦算出BOM中G7工位上所有符合G3工位盘点出来的车型的所有零件,加入《暂存表》;
♦G5工位的截止工位是G7,到此,针对G5工位计算完毕。
表22
表23
表24
表25 《盘点表》
e3. 沿着《盘点表》继续往前往上计算工位G6;
♦算出BOM中G6工位上所有符合G3工位盘点出来的车型的所有零件,加入《暂存表》;
♦算出BOM中G7工位上所有符合G3工位盘点出来的车型的所有零件,加入《暂存表》;
♦G6工位的截止工位是G7,到此,针对G6工位计算完毕。
e4. 沿着《盘点表》继续往前往上计算工位G7;
♦算出BOM中G7工位上所有符合G3工位盘点出来的车型的所有零件,加入《暂存表》;
♦G7工位的截止工位是G7,到此,针对G7工位计算完毕。
e5. 沿着《盘点表》继续往前往上计算工位G2;
♦算出BOM中G2工位上所有符合G3工位盘点出来的车型的所有零件,加入《暂存表》;
♦算出BOM中G1工位上所有符合G3工位盘点出来的车型的所有零件,加入《暂存表》;
♦G2工位的截止工位是G1,到此,针对G2工位计算完毕。
e6. 沿着《盘点表》继续往前往上计算工位G1;
♦算出BOM中G1工位上所有符合G3工位盘点出来的车型的所有零件,加入《暂存表》;
♦G1工位的截止工位是G1,到此,针对G1工位计算完毕。
至此,G3工位上所盘到的车型WIP计算完毕。对于计算结果,可以根据程序进行自行验算。
这里要补充明确一个关键点,我们通篇所讲的工位上的某车型在制品,不一定是一台车,甚至哪怕这个工位只有一个零件,都叫做该工位的在制品,只要辨明这个在制品是什么车型配置,盘出该在制品的车型配置及数量即可。假如BS的第一个工位G1就是放一个零件A上去,待下一个工位G2的机器人去抓,那么我们盘点G1工位时,只需要盘出G1工位上有1台什么车型配置即可,不需要知道是什么零件。就像我们前面举例的G1工位上盘出一台ET,如表21。
总结来看,根据算法3,盘点WIP时只需要盘出该工位有多少个什么车型的在制品。接下来我们看看如何将理论运用于实际盘点工作。
BS WIP只能使用算法3所述的“工位插入截止法”,我们再将这个过程更加真实地展现一遍:
(1)完成BS工位按其实际树状结构的Excel建模(参见图10)。
(2)完成BS工位由树状结构到单一主线工位的转换,标注“截止工位”。
截止工位是可以多层级嵌套的,注意每一段分拼枝线的截止工位都是该分拼枝线的起点工位,转换也是灵活多变不影响计算结果的,比如举两种方法来转换:
●方法一:
把G'1—G'2—G6—G7看作第一层级主线,把G1—G2—G3—G4—G5看作第二层级枝线,把G2''—G2'看作第二层级枝线下的第三层级枝线,把G4''—G4'看作第二层级枝线下的另一条第三层级枝线,如图10。
然后,我们把第三层级枝线插入到第二层级枝线,插入后的结果,如表23。
然后,我们再把上表整体插入到第一层级工位序列的G'2工位和G6工位之间,完成了树状工位到单一主线工位的转换,如表23。
●方法二:
把G1—G2—G3—G4—G5—G6—G7看作第一层级主线,把G2''—G2'看作第一段第二层级枝线,把G4''— G4'看作第二段第二层级枝线,把G'1—G'2看作是第三段第二层级枝线,如图11。
然后,把三段第二层级枝线插入到第一层级主线序列中,如表24。
如果看到最初的树状工位要用“插入截止法”进行“拉直”,方法二可能更加符合第一印象,不过为了说明“插入截止法”可以嵌套,所以笔者也将方法一举例示意出来了。
这两种”拉直“方法虽然工位的排列顺序不同,但是对于接下来的盘点方法、计算结果,都是一样,没有影响。
以上的步骤(1)和(2)可以说基本上是一劳永逸的,除非遇到车间的改造,再做相应的工位建模维护。
(3)准备《盘点表》和《BOM表》
《盘点表》就是在(2)中的工位序列插入截止表的右边,预置上该车间里面所有的车型配置。
(BS车间的车型配置一般也不多,如果一个成熟的车间柔性化同时生产三种车型,每种车型再分高低配的话,也就六种车型配置;而BS的高低配区别,一般也就在诸如是否带天窗,是否车门、行李箱盖上有预留的饰条饰板孔之类的微小区别上,影响少数零件。)
《BOM表》里有与《盘点表》相同字符的工位、车型配置信息,程序才能参照BOM进行计算,如表25。
图13 WIP在制零件计算VBA程序界面
(4)车间各工位实际盘点
如图12,是以第一人称视角来画的盘点示意图。
比如G'1工位上对A和B两个零件进行装配,其产成品在G'1工位的工装台上有1个,G'1工位的产成品还会放置到一个buffer料架上供下一个工位使用,图12上在这个buffer料架上下两层各4个共有8个,那么我们就盘点得到G'1工位产成品(也就是G'1工位在制品)数量为1+8=9,然后盘点人员这点基本素质还是有的,知道该产成品是车型ES的,于是就在《盘点单》G'1工位旁边、配置为ES列的格子内填入数量“9”。
再盘点G'2工位,我们看到G'2工位上放着一件在制品,同时G'2工位旁边还有该在制品的buffer库存6件,该工位在制品共计1+6=7件;盘点人员也识别出该产成品为ES车型的,于是在《盘点单》的G'2工位旁边、配置为ES列的格子内填写入数量7。
接下来,看到G6工位上的在制品是1辆ES车型、G7工位上的在制品是1辆ET车型,于是分别在《盘点单》上做1件的记录,如图12。(BS车间主线工位也经常有在制品车身被拉下来的情况,这些车身需要注明从哪个工位拉下来的,是什么车型,将其计入到相应工位盘点数量中,即成为WIP盘点的一部分)。
如果主机厂的BS生产控制系统中能精确看到在制车型的工位分布,将进一步简化盘点过程。
(5)完成《盘点单》和《BOM表》后,用VBA程序进行运算,从而得出整个BS车间的在制零件WIP(VBA程序界面如图13)
GA WIP的实际盘点操作,本文将不详细展开讲述,算法1、2、3都可以使用,而算法2实际上就是算法3中的工位如果没有任何枝线的一个极端情况。熟练掌握方法,只要灵活务实、因地制宜的选用即可。