zoukankan      html  css  js  c++  java
  • 浅谈MES的通用设计之二:工艺参数的下载

    MES是计划和执行层之间的桥梁,除了将工单下发到车间外,还有一个重要功能是将工艺参数下载到设备,从而起到指导现场作业的作用。

    本文试以实例说明常见的两种设计思路,以及一种更为通用的设计方法。

     

    业务场景及设计实例1

    某发动机工厂支持混线生产,有两种发动机,排量分别为2L、3L。当发动机到达加油机工位时,PLC需要判断发动机的排量,从而进行对应的加油作业,如2L发动机加20L油,3L发动机加30L油。

    实现方法如下:

    为此工位专门写一个程序,逻辑步骤为:

    1、发动机到达时,PLC读取RFID存储的发动机序列号。

    2、PLC将发动机序列号上传到MES服务器,执行查询请求。

    3、MES根据发动机序列号查询得到工单号。

    4、MES根据工单号查询得到制造BOM。

    5、MES根据油缸料号的命名规则,查询得到发动机对应的油缸类型。

    6、MES将油缸类型数据下载到PLC。

    7、PLC根据油缸类型决定加油量,进行加油作业。

     

    业务场景及设计实例2

    某整车厂焊装车间支持混线生产,同一款车有两种车门配置,分别为4门、5门。当车身到达某焊装工位时,PLC需要判断车门配置,从而决定焊接机器人的取料路径。

    实现方法如下:

    扩展工单的属性表,为每个工单建立一个长长的配置单,包括车型、门数、天窗、颜色、内饰等所有工艺需要的配置参数。逻辑步骤为:

    1、车身到达时,PLC读取RFID存储的车辆识别码。

    2、PLC将车辆识别码上传到MES服务器,执行查询请求。

    3、MES根据车辆识别码查询得到工单号。

    4、MES根据工单号关联查询配置单,得到所有配置参数。

    5、MES将所有配置参数下载到PLC。

    6、PLC读取指定的数据块位置,得到门数参数。

    7、PLC根据门数参数决定取料路径。

    方法1的缺点是几乎每个工位都要做客户化开发。

    方法2的缺点是配置单的准备相当繁琐,并且下载到PLC的数据量相当大。

    下面介绍一种更为通用的、基于工艺配方的脚本化设计方法。

    1、首先提供一个界面,允许用户定义工艺配方。

    决定工艺配方唯一性的条件有:产品料号、工位号、步骤号、工单执行时间等。

    每个工艺配方允许用户定义解释性字段,如名称、说明、图片等。

    每个工艺配方的输出值为不定长的字符串。

    为每个工艺配方定义字符转换条件,如长度、空值处理等。

    每个工艺配方对应的逻辑是一个数据库函数。

    也就是说,每次查询一次工艺配方,相当于运行一次数据库函数,根据输入值及函数逻辑(通常是一次查询),得到输出值也就是工艺配方的值。

    2、然后编写一段代码,实现:

    1) 运行工艺配方,得到每个步骤对应的初始工艺参数。

    2) 根据字符转换条件,得到更为规范的步骤工艺参数。

    3) 将工位所有步骤号对应的步骤工艺参数,根据步骤顺序进行拼合,得到工位完整的工艺参数。

    3、然后将完整工艺参数下载到PLC。

    工艺配方的示例:

     

    表中,字段itemtype表示工艺配方的类型,其中类型0表示常量,工艺参数值为字段itemvalue的值;类型1表示变量,工艺参数值为字段itemfunction的值对应的数据库函数的执行结果。

    字段itemlength表示步骤工艺参数的长度。

    字段fillchar表示查询返回空值时的填充字符。

    Oracle中利用动态游标技术拼合步骤工艺参数的方法示例,下面为部分代码:

      DECLARE

        tmp VARCHAR2(2000);

        tmp2 VARCHAR2(2000);

        tmpfun VARCHAR2(2000);

        allstr VARCHAR2(2000);

        type curtype is ref cursor;

          mycur2 curtype;

        CURSOR mycur IS

        SELECT

          t.itemno,

          t.itemname,

          t.itemtype,

          t.itemvalue,

          t.itemfunction,

          t.itemlength,

          t.fillchar

        FROM t -- 此处t应为工艺配方表

        WHERE t.station = I_STATION -- 此处可添加更多的筛选条件

        ORDER BY t.itemno;

      

      BEGIN

      -- 1. get all item for station

        tmp := '';

        tmpfun := '';

        allstr := '';

            

        FOR rec IN mycur

        LOOP

                  IF rec.itemtype = 0

            THEN tmp2 := rec.itemvalue; --> get value

            ELSE --> get function

              tmpfun := rec.ITEMFUNCTION;   

              tmpfun := tmpfun || '(''' || TO_CHAR(I_SN) || ''')';

              tmpfun := 'SELECT ' || tmpfun || ' myvalue FROM dual'; 

              OPEN   mycur2   FOR   tmpfun;  --> get item function

              FETCH   mycur2 INTO tmp2;

              close mycur2;              

            END IF;

            tmp := LPAD(tmp2, rec.itemlength, rec.fillchar);

            allstr := allstr || tmp;          

        END LOOP;         

       

      RETURN allstr;

  • 相关阅读:
    数据校验
    Struts2中OGNL
    Struts2 入门(新手必看)
    transactionManager 以及datasource type解析
    MyBatis
    rails 布署
    ubuntu ssh
    ubutun 下配置php和postgresql
    MS SQL 数据库所在C盘变得很大解决办法
    将表里的数据批量生成INSERT语句的存储过程 增强版
  • 原文地址:https://www.cnblogs.com/tallrain/p/Common_MES_2.html
Copyright © 2011-2022 走看看