zoukankan      html  css  js  c++  java
  • 浅谈MES的通用设计之三:过程数据的上传

    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;

     

  • 相关阅读:
    Servlet的生命周期及工作原理
    抓包---firebug
    firebug抓包
    token认证来龙去脉
    性能测试报告注意事项
    性能测试报告
    Error -26601解决办法
    lr新手误区
    css定位
    xpath定位
  • 原文地址:https://www.cnblogs.com/tallrain/p/Common_MES_3.html
Copyright © 2011-2022 走看看