您的位置:首页 > 其它

浅谈MES的通用设计之三:过程数据的上传

2016-02-04 21:53 441 查看
MES的另一个常见应用是过程数据的上传。

车间现场的设备会产生大量过程数据,需要上传到MES,主要基于以下两个考虑:

1、 过程数据经过整理,可以用于统计分析。

2、 结果数据上传到MES后,MES会根据结果来判断产品的后续工序。

通常来说,不同行业有自己的专属工具,特别是自动测试台架有很强的定制性,软件也往往是高度定制的。

下面我尝试以实例说明,来探讨过程数据上传的通用设计。

某测试台架产生测试数据后,将关键数据写入PLC,上传到MES,MES根据传入数据的结果来决定将产品送入包装工位还是返修工位。

大致的设计思路是:

1、 MES将PLC的原始数据按照某种规则转换成标准的过程数据结构。

2、 MES判断结果,并执行对应的业务流程。

比如说,PLC的数据结构是:

字段

起始位

长度

示例

说明

String Length

0

3

011

PLC有效字符长度11

Result

3

1

P

测试结果,P表示成功,其它值表示失败

Item1

4

2

20

测试项1的值

Item2

6

3

120

测试项2的值

String End

9

2

OK

结束字符

现在我们在数据库中建一个表来表达通用的数据结构:

字段名

数据类型

说明

STATION

VARCHAR2(20 BYTE)

工位

ITEMNO

NUMBER(2,0)

参数序列

ITEMNAME

VARCHAR2(200 BYTE)

参数名

ITEMLENGTH

NUMBER(3,0)

参数长度

ITEMUNIT

VARCHAR2(20 BYTE)

参数单位

STATUSMARK

NUMBER(1,0)

值为1表示此参数用于判定测试结果

STATUSVALUE

VARCHAR2(20 BYTE)

判定测试通过的有效数据

那么此PLC数据结构在此表中这样定义:

STATION

ITEMNO

ITEMNAME

ITEMLENGTH

ITEMUNIT

STATUSMARK

STATUSVALUE

1234

1

Test Status

1

1

P

1234

2

Item1

2

G

1234

3

Item2

3

MM

有了这个结构作为参照,当我们接收到PLC的原始数据后,我们就可以解析出测试结果,以及测试项1、测试项2的值。

附加上产品序列号、测试工位、测试时间、测试人员这些基本数据,我们就得到完整的测试过程数据。

下面我们进一步就可以把过程数据保存到数据库中。

在数据库中建立一个主表,一个从表,其中主表保存产品序列号、测试工位、测试时间、测试人员、测试结果。从表保存所有测试项的名称、值和单位。

在数据库中再建立一个触发器,监控主表的创建,一旦有新的数据,则立即查询测试结果,根据结果的不同来执行对应的业务逻辑。

下面是实现数据解析及结果处理的示例代码(Oracel数据库):

DECLARE

uploadstring VARCHAR2(2000);

leftstring VARCHAR2(2000);

itemname VARCHAR2(20);

itemvalue VARCHAR2(2000);

itemunit VARCHAR2(2000);

itemlength INTEGER;

statusmark VARCHAR2(1);

statusvalue VARCHAR2(1);

passfail INTEGER;

CURSOR mycur IS

SELECT

t.itemno,

t.itemname,

t.itemlength,

t.itemunit,

t.statusmark,

t.statusvalue

FROM t -- à t是定义结构的表

WHERE t.station = I_STATION

ORDER BY t.itemno;

BEGIN

uploadstring := I_UPLOADSTRING;

leftstring := uploadstring;

itemname := 0;

itemvalue := uploadstring;

itemunit := '';

itemlength := 0;

statusmark := 0;

statusvalue := '';

passfail := 1;

-- 1. get all items 查询得到所有数据

FOR rec IN mycur

LOOP

itemname := rec.itemname;

itemlength := rec.itemlength;

statusmark := rec.statusmark;

statusvalue := rec.statusvalue;

itemvalue := SUBSTR(leftstring, 1, itemlength);

-- 1.1 check test status mark 找到判断结果的参数

IF statusmark = 1

THEN

if itemvalue = statusvalue

THEN

passfail := 1;

ELSE

passfail := 0;

END IF;

END IF;

leftstring := SUBSTR(leftstring, length(itemvalue)+1,1000);

END LOOP;

-- 1.2 add test data master 插入数据到主表

SP_INS_TESTDATAMST

(

I_ESN,

I_STATION,

I_TIME,

I_OPERATOR,

passfail,

O_MSTID -- à 主表流水号

);

COMMIT;

-- 2 add test data detail插入数据到从表

leftstring := uploadstring;

FOR rec2 IN mycur

LOOP

itemname := rec2.itemname;

itemlength := rec2.itemlength;

statusmark := rec2.statusmark;

statusvalue := rec2.statusvalue;

itemunit := rec2.itemunit;

itemvalue := SUBSTR(leftstring, 1, itemlength);

-- 1.1 check NOT test status mark

IF statusmark = 0

THEN

SP_INS_TESTDET

(

O_MSTID,

itemname,

itemvalue,

itemunit

);

COMMIT;

END IF;

leftstring := SUBSTR(leftstring, length(itemvalue)+1,1000);

END LOOP;

END;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: