自动化立体仓库 - WCS系统
#
zjj
2024-10-18 7354b5dd039dc7053f3a17f1d3a695f0628cd8da
#
7个文件已修改
628 ■■■■ 已修改文件
src/main/java/com/zy/common/model/LocTypeDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/css/render.css 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/console.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/console.map.js 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -31,14 +31,10 @@
    }
    public LocTypeDto(StaProtocol staProtocol) {
//        if (staProtocol.isHigh() == staProtocol.isLow()) {
//            throw new CoolException("plc高低检测异常");
//        }
        if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){
            this.locType1 = 2; // 高库位
        }else {
            this.locType1 = 1; // 低库位
        if (staProtocol.locType.id.shortValue()!=1 && staProtocol.locType.id.shortValue()!=2 && staProtocol.locType.id.shortValue()!=3) {
            throw new CoolException("plc高低检测异常");
        }
        this.locType1 = staProtocol.locType.id.shortValue();
    }
    /**
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -185,8 +185,8 @@
                // 复位信号
                if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
                    News.error("---第一步、[堆垛机号:{}, 工作号:{}, 载货台信号:{}]==>> 状态为10,等待确认!!",
                            slave.getId(),crnProtocol.getTaskNo(), crnProtocol.getLoaded()==1 ? "有物" : "无物");
//                    News.error("---第一步、[堆垛机号:{}, 工作号:{}, 载货台信号:{}]==>> 状态为10,等待确认!!",
//                            slave.getId(),crnProtocol.getTaskNo(), crnProtocol.getLoaded()==1 ? "有物" : "无物");
                    if (resetFlag) {
                        if(crnProtocol.getTaskNo()==9999){
                            backHpFlag = false;
@@ -196,8 +196,8 @@
                        crnCommand.setAckFinish((short)1);
                        if (write(crnCommand)) {
                            resetFlag = false;
                            News.error("---第二步、[堆垛机号:{}, 工作号:{}]==>> 复位resetFlag标记成功{}!!",
                                    slave.getId(), wrkNo, resetFlag);
//                            News.error("---第二步、[堆垛机号:{}, 工作号:{}]==>> 复位resetFlag标记成功{}!!",
//                                    slave.getId(), wrkNo, resetFlag);
                        }
                    }
                }
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -53,10 +53,13 @@
    add(1000);    add(1001);    add(1002);    add(1003);    add(1004);    add(1005);    add(1006);    add(1007);    add(1008);    add(1009);    add(1010);
    add(1011);    add(1012);    add(1013);    add(1014);    add(1015);    add(1016);    add(1017);    add(1018);    add(1019);    add(1020);    add(1021);
    add(1022);    add(1023);    add(1024);    add(1025);    add(1026);    add(1027);    add(1028);    add(1029);    add(1030);
    add(2000); add(2001); add(2002); add(2003); add(2004);add(2005); add(2006); add(2007);
//        add(200);add(201);add(202);
    }};
    public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
       add(1400);
       add(1040);add(1041);add(1042);add(1043);add(1044);add(1045);add(1046);add(1047);
       add(2010);add(2011);add(2012);add(2013);add(2014);add(2015);add(2016);add(2017);
       add(3010);add(3011);add(3012);add(3013);add(3014);add(3015);add(3016);add(3017);
//        add(200);add(201);add(202);
    }};
@@ -125,7 +128,7 @@
                    // 写数据 ID+目标站
                    case 2:
                        writeD((StaProtocol)task.getData(),1);
                        log.error("输送线下发命令:"+((StaProtocol) task.getData()).getWorkNo()+","+((StaProtocol) task.getData()).getStaNo());
//                        log.error("输送线下发命令:"+((StaProtocol) task.getData()).getWorkNo()+","+((StaProtocol) task.getData()).getStaNo());
                        break;
                    default:
                        break;
@@ -307,55 +310,102 @@
    }
    private void writeD(StaProtocol staProtocol,Integer count)throws InterruptedException{
        boolean reset = true;
        if (null == staProtocol) {
            return;
        }
        staProtocol = staProtocol.clone();
        Integer oriWrkNo = staProtocol.getWorkNo();
        short oriStaNo = staProtocol.getStaNo();
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        if(writeWrk(staProtocol,1)){
            int whileCount = 0;
            OperateResult write3 = siemensS7Net.Write("DB100." + (index*66+6), (short) 1);
            if (write3.IsSuccess){
                News.info("输送线命令下发[id:"+slave.getId()+"] >>>>>"+"["+1+"]");
                Thread.sleep(100);
                do {
                    OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100."+(index*66 +6), (short) 2);
                    short mk = siemensS7Net.getByteTransform().TransInt16(result2.Content, 0);
                    if (mk == 2){
                        OperateResult write5 = siemensS7Net.Write("DB100." + index*66, 0);    // 工作号
                        Thread.sleep(100);
                        OperateResult write6 = siemensS7Net.Write("DB100." + (index*66+4), (short) 0);    // 目标站
                        Thread.sleep(100);
                        OperateResult write4 = siemensS7Net.Write("DB100." + (index*66+6), (short) 0);
                        reset = false;
                        if (write4.IsSuccess && write5.IsSuccess && write6.IsSuccess){
                            News.info("输送线命令下发[id:"+slave.getId()+"] >>>>>"+"["+"0,0,0"+"]");
                            OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100."+(index*66), (short) 8);
                            Integer wrkNo1 = siemensS7Net.getByteTransform().TransInt32(result1.Content, 0);
                            short staNo1 = siemensS7Net.getByteTransform().TransInt16(result1.Content, 4);
                            short mk1 = siemensS7Net.getByteTransform().TransInt16(result1.Content, 6);
                            if (wrkNo1 != 0 || staNo1 !=0 || mk1 !=0){
                                whileCount++;
                                News.info("复位失败,输送线命令下发[id:"+slave.getId()+"] >>>>>"+"["+"0,0,0"+"]");
                            }else {
                                News.info("输送线复位完成");
                                break;
                            }
                        }
                    }else if (reset && mk == 0 ){
                        OperateResult write7 = siemensS7Net.Write("DB100." + (index*66+6), (short) 1);
                        News.info("回读1失败,输送线命令下发[id:"+slave.getId()+"] >>>>>"+"["+"1"+"]");
                        Thread.sleep(100);
                        whileCount++;
                    }else {
                        whileCount++;
                    }
                }while (whileCount <10);
            }
        }else {
            log.error("输送命令下发失败"+JSON.toJSONString(staProtocol));
        }
    }
    private boolean writeWrk(StaProtocol staProtocol,Integer count)throws InterruptedException {
        if (null == staProtocol) {
            return false;
        }
        Integer oriWrkNo = staProtocol.getWorkNo();
        short oriStaNo = staProtocol.getStaNo();
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        OperateResult write1 = siemensS7Net.Write("DB100." + index*66, staProtocol.getWorkNo());    // 工作号
        Thread.sleep(100);
        OperateResult write2 = siemensS7Net.Write("DB100." + (index*66+4), staProtocol.getStaNo());    // 目标站
        if(write1.IsSuccess && write2.IsSuccess){
            OperateResultExOne<byte[]> result = siemensS7Net.Read("DB100."+(index*66), (short) 6);
            Integer wrkNo = siemensS7Net.getByteTransform().TransInt32(result.Content, 0);
            short staNo = siemensS7Net.getByteTransform().TransInt16(result.Content, 4);
            if (!oriWrkNo.equals(wrkNo)  || oriStaNo != staNo){
                if (count >= 5){
                    log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), count);
                    return;
                }
                count++;
                writeD(staProtocol,count);
            }
            int whileCount = 0;
            OperateResult write3 = siemensS7Net.Write("DB100." + (index*66+6), (short) 1);
            if (write3.IsSuccess){
                Thread.sleep(200);
                do {
                    OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100."+(index*66 +6), (short) 2);
                    short mk = siemensS7Net.getByteTransform().TransInt16(result2.Content, 0);
                    if (mk == 2){
                        OperateResult write5 = siemensS7Net.Write("DB100." + index*66, 0);    // 工作号
                        OperateResult write6 = siemensS7Net.Write("DB100." + (index*66+4), (short) 0);    // 目标站
                        OperateResult write4 = siemensS7Net.Write("DB100." + (index*66+6), (short) 0);
                        if (write4.IsSuccess){
                            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
                            News.info("SiemensDevp"+" - 5"+" - 输送线命令下发 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
                            break;
                        }
                    }else {
                        whileCount++;
        do {
            log.info("输送递归次数:" + count);
            OperateResult write1 = siemensS7Net.Write("DB100." + index * 66, staProtocol.getWorkNo());    // 工作号
            Thread.sleep(100);
            OperateResult write2 = siemensS7Net.Write("DB100." + (index * 66 + 4), staProtocol.getStaNo());    // 目标站
            if (write1.IsSuccess && write2.IsSuccess) {
                News.info("输送线命令下发[id:" + slave.getId() + "] >>>>>" + "[" + staProtocol.getWorkNo() + "," + staProtocol.getStaNo() + "]");
                OperateResultExOne<byte[]> result = siemensS7Net.Read("DB100." + (index * 66), (short) 6);
                Integer wrkNo = siemensS7Net.getByteTransform().TransInt32(result.Content, 0);
                short staNo = siemensS7Net.getByteTransform().TransInt16(result.Content, 4);
                if (!oriWrkNo.equals(wrkNo) || oriStaNo != staNo) {
                    if (count >= 5) {
                        log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), count);
                        return false;
                    }
                }while (whileCount <5);
                    count++;
                }else {
                    return true;
                }
            }
        }
        }while (count <=5);
        return true;
    }
    // 更新入出库模式
src/main/resources/application.yml
@@ -61,6 +61,14 @@
      row: 2
      bay: 47
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 2003
      row: 3
      bay: 47
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
@@ -68,6 +76,52 @@
      row: 3
      bay: 47
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 2003
      row: 3
      bay: 47
      lev: 2
    crnInStn[2]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 1043
      row: 3
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[2]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 1043
      row: 3
      bay: 1
      lev: 1
    crnInStn[3]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 2013
      row: 3
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[3]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 2013
      row: 3
      bay: 1
      lev: 2
    crnInStn[4]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 3013
      row: 3
      bay: 1
      lev: 3
    # 堆垛机出库站点
    crnOutStn[4]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 3013
      row: 3
      bay: 1
      lev: 3
  # 堆垛机2
  crn[1]:
    id: 2
@@ -92,6 +146,62 @@
      row: 6
      bay: 47
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 2004
      row: 6
      bay: 47
      lev: 2
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 2004
      row: 6
      bay: 47
      lev: 2
    # 堆垛机入库站点
    crnInStn[2]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 1044
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[2]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 1044
      row: 6
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[3]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 2014
      row: 6
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[3]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 2014
      row: 6
      bay: 1
      lev: 2
    # 堆垛机入库站点
    crnInStn[4]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 3014
      row: 6
      bay: 1
      lev: 3
    # 堆垛机出库站点
    crnOutStn[4]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 3014
      row: 6
      bay: 1
      lev: 3
  # 输送线1
  devp[0]:
@@ -105,6 +215,10 @@
      staNo: 1001
      backSta: 1000
      led: ${wcs-slave.led[1].id}
    inSta[1]:
      staNo: 2001
      backSta: 2000
      led: ${wcs-slave.led[1].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 1001
@@ -114,6 +228,12 @@
    emptyInSta[1]:
      staNo: 1025
      backSta: 1000
      led: ${wcs-slave.led[1].id}
    # 空板入库口1
    emptyInSta[2]:
      staNo: 2001
      backSta: 200
      led: ${wcs-slave.led[1].id}
    # 出库口1
    outSta[0]:
@@ -128,29 +248,68 @@
    slot: 0
    # 入库口1
    inSta[0]:
      staNo: 106
      backSta: 105
      staNo: 1041
      backSta: 1040
      led: ${wcs-slave.led[1].id}
    # 入库口1
    inSta[1]:
      staNo: 2011
      backSta: 2010
      led: ${wcs-slave.led[1].id}
    # 入库口1
    inSta[2]:
      staNo: 3011
      backSta: 3010
      led: ${wcs-slave.led[1].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 106
      backSta: 105
      staNo: 1041
      backSta: 1040
      led: ${wcs-slave.led[1].id}
    # 空板入库口1
    emptyInSta[1]:
      staNo: 2011
      backSta: 2010
      led: ${wcs-slave.led[1].id}
    # 空板入库口1
    emptyInSta[2]:
      staNo: 3011
      backSta: 3010
      led: ${wcs-slave.led[1].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 159
      staNo: 1041
      led: ${wcs-slave.led[5].id}
      backSta: 160
      backSta: 1040
    # 拣料入库口1
    pickSta[1]:
      staNo: 2011
      led: ${wcs-slave.led[5].id}
      backSta: 2010
    # 拣料入库口1
    pickSta[2]:
      staNo: 3011
      led: ${wcs-slave.led[5].id}
      backSta: 3010
    # 出库口1
    outSta[0]:
      staNo: 100
      staNo: 1040
      led: ${wcs-slave.led[0].id}
    outSta[1]:
      staNo: 152
      staNo: 1042
      led: ${wcs-slave.led[3].id}
    outSta[2]:
      staNo: 156
      led: ${wcs-slave.led[4].id}
      staNo: 2010
      led: ${wcs-slave.led[3].id}
    outSta[3]:
      staNo: 2012
      led: ${wcs-slave.led[3].id}
    outSta[4]:
      staNo: 3010
      led: ${wcs-slave.led[3].id}
    outSta[5]:
      staNo: 3012
      led: ${wcs-slave.led[3].id}
   # LED1
  led[0]:
src/main/webapp/static/css/render.css
@@ -93,7 +93,7 @@
.floorBtn {
    position: absolute;
    border-radius: 5px;
    left: 1750px;
    left: 10px;
    width: 90px;
    height: 40px;
    color: #ffffff;
src/main/webapp/static/js/console.js
@@ -129,9 +129,9 @@
        let floor = areas[i].text
        let barcodes = areas[i].barcode
        floorId = areas[i].id
        var position = (i+1)*100
        var position = (i+1)*100 +400
        floorBtn =
            "<button class='floorBtn btn-16' onclick='changFloor("+i+")' style='top: "+position+"px;'>" + floor +"</button>"
            "<button class='floorBtn btn-16' onclick='changFloor("+i+")' style='top: "+10+"px;left: "+position+"px;'>" + floor +"</button>"
        if (mapInfo.areas[0].floors.length == 1) {
            floorBtnss = ''
        } else {
src/main/webapp/static/js/console.map.js
@@ -85,16 +85,16 @@
        "text": "#16",
        "top": 167,
        "left": 1810,
        "width": 30,
        "height": 23
        "width": 0,
        "height": 0
    }, {
        "type": "rackDescs",
        "id": "lb_desc2",
        "text": "#1",
        "top": 596,
        "left": 1810,
        "width": 30,
        "height": 23
        "width": 0,
        "height": 0
    }],
    "crns": [{
        "type": "track",
@@ -523,6 +523,295 @@
                    "height": 20
                }
            ]
        },{
            "type": "floor",
            "id": "page_floor2",
            "text": "2F",
            "top": 4,
            "left": 22,
            "width": 1819,
            "height": 668,
            "stns":[
                {
                    "type": "stn",
                    "id": "site-2004",
                    "text": "2004",
                    "top": 300,
                    "left": 1510,
                    "width": 80,
                    "height": 19
                },{
                    "type": "stn",
                    "id": "site-2006",
                    "text": "2006",
                    "top": 300,
                    "left": 1592,
                    "width": 80,
                    "height": 19
                },{
                    "type": "stn",
                    "id": "site-2003",
                    "text": "2003",
                    "top": 239,
                    "left": 1510,
                    "width": 80,
                    "height": 19
                },{
                    "type": "stn",
                    "id": "site-2005",
                    "text": "2005",
                    "top": 239,
                    "left": 1592,
                    "width": 80,
                    "height": 19
                },{
                    "type": "track",
                    "id": "lb_track9",
                    "text": "",
                    "top": 180,
                    "left": 1680,
                    "width": 2,
                    "height": 500
                }
                ,{
                    "type": "track",
                    "id": "lb_track10",
                    "text": "",
                    "top": 180,
                    "left": 1720,
                    "width": 2,
                    "height": 500
                }
                ,{
                    "type": "stn",
                    "id": "site-2001",
                    "text": "2001",
                    "top": 239,
                    "left": 1756,
                    "width": 80,
                    "height": 19
                },{
                    "type": "stn",
                    "id": "site-2000",
                    "text": "2000",
                    "top": 239,
                    "left": 1838,
                    "width": 80,
                    "height": 19
                }
                ,{
                    "type": "stn",
                    "id": "site-2007",
                    "text": "2007",
                    "top": 300,
                    "left": 1674,
                    "width": 80,
                    "height": 19
                },{
                    "type": "stn",
                    "id": "site-2002",
                    "text": "2002",
                    "top": 350,
                    "left": 1756,
                    "width": 80,
                    "height": 19
                },{
                    "type": "stn",
                    "id": "site-2015",
                    "text": "2015",
                    "top": 239,
                    "left": 365,
                    "width": 80,
                    "height": 19
                }, {
                    "type": "stn",
                    "id": "site-2013",
                    "text": "2013",
                    "top": 239,
                    "left": 448,
                    "width": 80,
                    "height": 19
                },  {
                    "type": "stn",
                    "id": "site-2016",
                    "text": "2016",
                    "top": 352,
                    "left": 365,
                    "width": 80,
                    "height": 19
                }, {
                    "type": "stn",
                    "id": "site-2014",
                    "text": "2014",
                    "top": 352,
                    "left": 448,
                    "width": 80,
                    "height": 19
                },{
                    "type": "track",
                    "id": "lb_track6",
                    "text": "",
                    "top": 180,
                    "left": 350,
                    "width": 2,
                    "height": 500
                },{
                    "type": "track",
                    "id": "lb_track7",
                    "text": "",
                    "top": 180,
                    "left": 320,
                    "width": 2,
                    "height": 500
                }, {
                    "type": "stn",
                    "id": "site-2017",
                    "text": "2017",
                    "top": 352,
                    "left": 282,
                    "width": 80,
                    "height": 19
                },{
                    "type": "stn",
                    "id": "site-2010",
                    "text": "2010",
                    "top": 239,
                    "left": 118,
                    "width": 80,
                    "height": 19
                }, {
                    "type": "stn",
                    "id": "site-2011",
                    "text": "2011",
                    "top": 239,
                    "left": 200,
                    "width": 80,
                    "height": 19
                },{
                    "type": "stn",
                    "id": "site-2012",
                    "text": "2012",
                    "top": 400,
                    "left": 200,
                    "width": 80,
                    "height": 19
                }
            ],
            "barcode":[
                {
                    "type": "barcode",
                    "id": "barcode-1",
                    "text": "",
                    "top": 749,
                    "left": 470,
                    "width": 80,
                    "height": 20
                },
            ]
        },{
            "type": "floor",
            "id": "page_floor3",
            "text": "3F",
            "top": 4,
            "left": 22,
            "width": 1819,
            "height": 668,
            "stns":[
               {
                    "type": "stn",
                    "id": "site-3015",
                    "text": "3015",
                    "top": 239,
                    "left": 365,
                    "width": 80,
                    "height": 19
                }, {
                    "type": "stn",
                    "id": "site-3013",
                    "text": "3013",
                    "top": 239,
                    "left": 448,
                    "width": 80,
                    "height": 19
                },  {
                    "type": "stn",
                    "id": "site-3016",
                    "text": "3016",
                    "top": 352,
                    "left": 365,
                    "width": 80,
                    "height": 19
                }, {
                    "type": "stn",
                    "id": "site-3014",
                    "text": "3014",
                    "top": 352,
                    "left": 448,
                    "width": 80,
                    "height": 19
                },{
                    "type": "track",
                    "id": "lb_track6",
                    "text": "",
                    "top": 180,
                    "left": 350,
                    "width": 2,
                    "height": 500
                },{
                    "type": "track",
                    "id": "lb_track7",
                    "text": "",
                    "top": 180,
                    "left": 320,
                    "width": 2,
                    "height": 500
                }, {
                    "type": "stn",
                    "id": "site-3017",
                    "text": "3017",
                    "top": 352,
                    "left": 282,
                    "width": 80,
                    "height": 19
                },{
                    "type": "stn",
                    "id": "site-3010",
                    "text": "3010",
                    "top": 239,
                    "left": 118,
                    "width": 80,
                    "height": 19
                }, {
                    "type": "stn",
                    "id": "site-3011",
                    "text": "3011",
                    "top": 239,
                    "left": 200,
                    "width": 80,
                    "height": 19
                },{
                    "type": "stn",
                    "id": "site-3012",
                    "text": "3012",
                    "top": 400,
                    "left": 200,
                    "width": 80,
                    "height": 19
                }
            ],
            "barcode":[
                {
                    "type": "barcode",
                    "id": "barcode-1",
                    "text": "",
                    "top": 749,
                    "left": 470,
                    "width": 80,
                    "height": 20
                },
            ]
        }]
    }]
}