#
Junjie
2025-04-10 150a2e9b867995ce118940655c8e0fafe2b4e1b9
#
4个文件已修改
4个文件已添加
611 ■■■■■ 已修改文件
src/main/java/com/zy/core/cache/MessageQueue.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/cache/OutputQueue.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/SlaveType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/DevpSlave.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/DevpThread.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/SiemensDevpThread.java 399 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/index.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/cache/MessageQueue.java
@@ -16,6 +16,8 @@
    //四向穿梭车mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> SHUTTLE_EXCHANGE = new ConcurrentHashMap<>();
    //输送mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> DEVP_EXCHANGE = new ConcurrentHashMap<>();
    //提升机mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> LIFT_EXCHANGE = new ConcurrentHashMap<>();
    //货叉提升机mq交换机
@@ -40,6 +42,9 @@
            case Lift:
                LIFT_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
                break;
            case Devp:
                DEVP_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
                break;
            default:
                break;
        }
@@ -59,6 +64,8 @@
                return FORK_LIFT_MASTER_EXCHANGE.get(id).offer(task);
            case Lift:
                return LIFT_EXCHANGE.get(id).offer(task);
            case Devp:
                return DEVP_EXCHANGE.get(id).offer(task);
            default:
                return false;
        }
@@ -78,6 +85,8 @@
                return FORK_LIFT_MASTER_EXCHANGE.get(id).poll();
            case Lift:
                return LIFT_EXCHANGE.get(id).poll();
            case Devp:
                return DEVP_EXCHANGE.get(id).poll();
            default:
                return null;
        }
@@ -96,6 +105,8 @@
                return FORK_LIFT_MASTER_EXCHANGE.get(id).peek();
            case Lift:
                return LIFT_EXCHANGE.get(id).peek();
            case Devp:
                return DEVP_EXCHANGE.get(id).peek();
            default:
                return null;
        }
@@ -115,6 +126,9 @@
            case Lift:
                LIFT_EXCHANGE.get(id).clear();
                break;
            case Devp:
                DEVP_EXCHANGE.get(id).clear();
                break;
            default:
                break;
        }
src/main/java/com/zy/core/cache/OutputQueue.java
@@ -15,5 +15,6 @@
    public static ArrayBlockingQueue<String> LIFT = new ArrayBlockingQueue<>(32);
    //货叉提升机输出日志
    public static ArrayBlockingQueue<String> FORKLIFT = new ArrayBlockingQueue<>(32);
    public static ArrayBlockingQueue<String> DEVP = new ArrayBlockingQueue<>(32);
}
src/main/java/com/zy/core/enums/SlaveType.java
@@ -3,6 +3,7 @@
public enum SlaveType {
    Shuttle,
    Devp,
    Lift,
    ForkLift,
    ForkLiftMaster,
src/main/java/com/zy/core/model/DevpSlave.java
New file
@@ -0,0 +1,66 @@
package com.zy.core.model;
import com.zy.core.Slave;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.ArrayList;
import java.util.List;
/**
 * 输送线配置
 * Created by vincent on 2020/8/6
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class DevpSlave extends Slave {
    private Integer rack;
    private Integer slot;
    private List<Sta> inSta = new ArrayList<>();
    private List<Sta> emptyInSta = new ArrayList<>();
    private List<Sta> outSta = new ArrayList<>();
    private List<Sta> pickInSta = new ArrayList<>();
    private List<Sta> pickInSta2 = new ArrayList<>();
    private List<Sta> pickOutSta = new ArrayList<>();
    private List<StaRack> rackInStn = new ArrayList<>();
    private List<StaRack> rackOutStn = new ArrayList<>();
    @Data
    public static class Sta {
        private Integer staNo;
        private Integer barcode;
        private Integer backSta;
        private Integer led;
        private Integer liftNo;
    }
    @Data
    public static class StaRack {
        private Integer devpPlcId;
        private Integer staNo;
        private Integer row;
        private Integer bay;
        private Integer lev;
    }
}
src/main/java/com/zy/core/model/protocol/StaProtocol.java
New file
@@ -0,0 +1,115 @@
package com.zy.core.model.protocol;
import com.zy.asrs.entity.BasDevp;
import lombok.Data;
/**
 * 输送线plc单个站点详细信息
 */
@Data
public class StaProtocol implements Cloneable {
    // 站点编号
    private Integer siteId;
    // ----------------------------------------------------------------
    // 工作号
    private Short workNo = 0;
    // ----------------------------------------------------------------
    // 目标站
    private Short staNo;
    // ----------------------------------------------------------------
    // 自动
    private boolean autoing;
    // 有物
    private boolean loading;
    // 可入
    private boolean inEnable;
    // 可出
    private boolean outEnable;
    // 空板信号
    private boolean emptyMk;
    // 满托盘
    private boolean fullPlt;
    //提升机到位信号
    private boolean liftArrival;
    //四向穿梭车可取信号
    private boolean shuttleTakeEnable;
    // 高
    private boolean high;
    // 低
    private boolean low;
    // 锁定标记
    private boolean pakMk = true;
    // 外形检测 ------------------------------------------------------------------------
    // 前超限
    private boolean frontErr;
    // 后超限
    private boolean backErr;
    // 高超限
    private boolean highErr;
    // 左超限
    private boolean leftErr;
    // 右超限
    private boolean rightErr;
    // 超重
    private boolean weightErr;
    // 扫码失败
    private boolean barcodeErr;
    //出入库模式0、未知 1、入库,2、出库
    private Short outInModel;
    //高低信号 0:无 1:低 2:中 3:高
    private Short locType1;
    public BasDevp toSqlModel(){
        BasDevp basDevp = new BasDevp();
        basDevp.setDevNo(siteId);
        basDevp.setWrkNo(workNo.intValue());
        basDevp.setAutoing(autoing?"Y":"N");
        basDevp.setLoading(loading?"Y":"N");
        basDevp.setInEnable(inEnable?"Y":"N");
        if (siteId == 105 || siteId == 205 || siteId == 346) {
            basDevp.setOutEnable(outInModel == 2 ? "Y" : "N");
        }else {
            basDevp.setOutEnable(outEnable ? "Y" : "N");
        }
        basDevp.setLocType1((short) 0);  // 高低类型{0:未知,1:低库位,2:高库位}
        basDevp.setLocType2((short) 0);  // 宽窄类型{0:未知,1:窄库位,2:宽库位}
        basDevp.setLocType3((short) 0);  // 轻重类型{0:未知,1:轻库位,2:重库位}
        basDevp.setLocType1(high != low && low ? (short) 1 : (short) 2);
        return basDevp;
    }
    @Override
    public StaProtocol clone() {
        try {
            return (StaProtocol) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}
src/main/java/com/zy/core/thread/DevpThread.java
New file
@@ -0,0 +1,14 @@
package com.zy.core.thread;
import com.zy.core.ThreadHandler;
import com.zy.core.model.protocol.StaProtocol;
import java.util.Map;
public interface DevpThread extends ThreadHandler {
    Map<Integer, StaProtocol> getStation();
    void setPakMk(Integer siteId, boolean pakMk);
}
src/main/java/com/zy/core/thread/impl/SiemensDevpThread.java
New file
@@ -0,0 +1,399 @@
//package com.zy.core.thread.impl;
//
//import HslCommunication.Core.Types.OperateResult;
//import HslCommunication.Core.Types.OperateResultExOne;
//import HslCommunication.Profinet.Siemens.SiemensPLCS;
//import HslCommunication.Profinet.Siemens.SiemensS7Net;
//import com.alibaba.fastjson.JSON;
//import com.core.common.Cools;
//import com.core.common.DateUtils;
//import com.core.common.SpringUtils;
//import com.zy.asrs.entity.BasDevp;
//import com.zy.asrs.service.BasDevpService;
//import com.zy.core.News;
//import com.zy.core.cache.MessageQueue;
//import com.zy.core.cache.OutputQueue;
//import com.zy.core.cache.SlaveConnection;
//import com.zy.core.enums.SlaveType;
//import com.zy.core.model.DevpSlave;
//import com.zy.core.model.Task;
//import com.zy.core.model.protocol.StaProtocol;
//import com.zy.core.thread.DevpThread;
//import lombok.Data;
//import lombok.extern.slf4j.Slf4j;
//
//import java.text.MessageFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * 输送线线程
// * Created by vincent on 2020/8/4
// */
//@Data
//@Slf4j
//public class SiemensDevpThread implements Runnable, DevpThread {
//
//    private DevpSlave slave;
//    private SiemensS7Net siemensS7Net;
//    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
//    private short heartBeatVal = 1;
//    private int barcodeSize = 10;
//    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
//        add(1012);
//        add(1014);
//        add(1015);
//        add(1022);
//        add(1023);
//        add(1025);
//        add(1026);
//        add(1031);
//        add(1032);
//    }};
//
//    public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
//        add(1011);
//        add(1012);
//        add(1013);
//        add(1014);
//        add(1015);
//        add(1021);
//        add(1022);
//        add(1023);
//        add(1024);
//        add(1025);
//        add(1026);
//        add(1031);
//        add(1032);
//    }};
//
//    public SiemensDevpThread(DevpSlave slave) {
//        this.slave = slave;
//    }
//
//    @Override
//    @SuppressWarnings("InfiniteLoopStatement")
//    public void run() {
//        connect();
//        while (true) {
//            try {
//                int step = 1;
//                Task task = MessageQueue.poll(SlaveType.Devp, slave.getId());
//                if (task != null) {
//                    step = task.getStep();
//                }
//                switch (step) {
//                    // 读数据
//                    case 1:
//                        read();
//                        break;
//                    // 写数据 ID+目标站
//                    case 2:
//                        write((StaProtocol) task.getData());
//                        read();
//                        break;
//                    default:
//                        break;
//                }
//                // 心跳
////                heartbeat();
//                Thread.sleep(400);
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//
//        }
//    }
//
//    @Override
//    public boolean connect() {
//        boolean result = false;
//        siemensS7Net = new SiemensS7Net(SiemensPLCS.S1500, slave.getIp());
//        siemensS7Net.setRack(slave.getRack().byteValue());
//        siemensS7Net.setSlot(slave.getSlot().byteValue());
//        OperateResult connect = siemensS7Net.ConnectServer();
//        if (connect.IsSuccess) {
//            result = true;
//            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】输送线plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
//            News.info("输送线plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
//        } else {
//            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】输送线plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]  [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
//            News.error("输送线plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
//        }
//        // siemensS7Net.ConnectClose();
//        return result;
//    }
//
//    /**
//     * 读取状态 ====> 整块plc
//     */
//    private void read() throws InterruptedException {
//        ArrayList<BasConveyorSta> staNos = getStaNo();
//        int staNoSize = staNos.size();
//        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB82.14", (short) (staNoSize * 26));
//        if (result.IsSuccess) {
//            for (int i = 0; i < staNoSize; i++) {
//                BasConveyorSta siteStation = staNos.get(i);
//                int siteId = siteStation.getSiteNo();// 站点编号
//                StaProtocol staProtocol = station.get(siteId);
//                if (null == staProtocol) {
//                    staProtocol = new StaProtocol();
//                    staProtocol.setSiteId(siteId);
//
//                    if (siteId == 1015) {
//                        staProtocol.setLocNo("1200301");
//                    } else if (siteId == 1026) {
//                        staProtocol.setLocNo("1200305");
//                    }
//
//                    station.put(siteId, staProtocol);
//                }
//                Thread.sleep(300);
//                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i * 26, 2);
//                staProtocol.setAutoing(status[0]);  // 自动
//                staProtocol.setIdle(status[1]); //空闲
//                staProtocol.setLoading(status[2]);  // 有物
//
//                staProtocol.setBackErr(status[5]);
//                staProtocol.setLeftErr(status[6]);
//                staProtocol.setRightErr(status[7]);
//                staProtocol.setHighErr(status[8]);
//                staProtocol.setWeightErr(status[9]);
//                staProtocol.setLow(status[10]);
//                staProtocol.setHigh(status[11]);
//                staProtocol.setInEnable(status[13]); // 可入
//                staProtocol.setOutEnable(status[14]);// 可出
//
//
//                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 26 + 2));     // 工作号
//                staProtocol.setStaNo((short) siemensS7Net.getByteTransform().TransInt16(result.Content, i * 26 + 4));   // 目标站
//                staProtocol.setFinishWorkNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i * 26 + 6)); //已完成工作号
//                staProtocol.setBarcode(siemensS7Net.getByteTransform().TransString(result.Content, i * 26 + 10, 12, "UTF-8").trim()); //条码
//                staProtocol.setWeight(siemensS7Net.getByteTransform().TransInt32(result.Content, i * 26 + 22)); //重量
//
//
////                staProtocol.setWorkMode((int) siemensS7Net.getByteTransform().TransInt16(result.Content, i * 40 + 8));// 工作模式
//                //staProtocol.setWorkNo((short) siemensS7Net.getByteTransform().TransInt16(result.Content, i * 18 + 10));     // 工作号
//
//                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
//                    staProtocol.setPakMk(true);
//                }
//            }
//        }
//
//        OperateResultExOne<byte[]> resultBarcode = siemensS7Net.Read("DB100.166", (short) 9);
//        if (resultBarcode.IsSuccess) {
//            //条码数据
//            String barcode = siemensS7Net.getByteTransform().TransString(resultBarcode.Content, 0, 9, "UTF-8");// 条码
//            BasConveyorStaService basConveyorStaService = SpringUtils.getBean(BasConveyorStaService.class);
//            DeviceBarcodeService deviceBarcodeService = SpringUtils.getBean(DeviceBarcodeService.class);
//            BasConveyorSta basConveyorSta = basConveyorStaService.getOne(new LambdaQueryWrapper<BasConveyorSta>().eq(BasConveyorSta::getSiteNo, 31002));
//            if (basConveyorSta != null) {
//                DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId());
//                if (deviceBarcode != null) {
//                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, Integer.parseInt(deviceBarcode.getDeviceId()));
//                    if (barcodeThread != null) {
//                        barcodeThread.setBarcode(barcode);
//                    }
//                }
//            }
//        }
//
//        if (!Cools.isEmpty(result) && result.IsSuccess) {
//
//            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), device.getId()));
//
//            // 根据实时信息更新数据库
//            try {
//                List<BasConveyorSta> stations = new ArrayList<>();
//                for (BasConveyorSta sta : getStaNo()) {
//                    StaProtocol staProtocol = station.get(sta.getSiteNo());
//                    BasConveyorSta sqlModel = staProtocol.toSqlModel(sta);
//                    stations.add(sqlModel);
//                }
//
//                if (!stations.isEmpty()) {
//                    BasConveyorStaService basConveyorStaService = SpringUtils.getBean(BasConveyorStaService.class);
//                    if (null != basConveyorStaService && !basConveyorStaService.updateBatchById(stations)) {
//                        throw new Exception("更新数据库数据失败");
//                    }
//                }
//
//            } catch (Exception e) {
//                e.printStackTrace();
//                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】更新数据库数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort(), device.getRack(), device.getSlot()));
//                News.error("更新数据库数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", device.getId(), device.getIp(), device.getPort(), device.getRack(), device.getSlot());
//            }
//
//        } else {
//            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】读取输送线plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), device.getId(), device.getIp(), device.getPort(), device.getRack(), device.getSlot()));
////            log.error("读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", device.getId(), device.getIp(), device.getPort(), device.getRack(), device.getSlot());
//        }
//    }
//
//    /**
//     * 写入 ID+目标站 =====> 单站点写入
//     */
//    private void write(StaProtocol staProtocol) throws InterruptedException {
//        if (null == staProtocol) {
//            return;
//        }
//        int index = staNos.indexOf(staProtocol.getSiteId());
//        short[] array = new short[2];
//        array[0] = staProtocol.getWorkNo();
//        array[1] = staProtocol.getStaNo();
////        OperateResult write = siemensS7Net.Write("DB100." + index*4, staProtocol.getWorkNo());    // 工作号
////        Thread.sleep(500);
////        OperateResult write1 = siemensS7Net.Write("DB100." + (index*4+2), staProtocol.getStaNo());    // 目标站
//
//        OperateResult writeResult;
//        //任务下发次数
//        int writeCount = 0;
//        //任务下发成功标识
//        boolean writeFlag = false;
//        while(writeCount < 1){
//            writeResult = siemensS7Net.Write("DB1000." + index*4, array);    // 工作号、目标站
//            if(writeResult.IsSuccess){
//                Thread.sleep(500);
//                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB1000." + index*4, (short)4);
//                if(readResult.IsSuccess){
//                    short workNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0);
//                    short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 2);
//                    if(staProtocol.getWorkNo().equals(workNo) && staProtocol.getStaNo().equals(staNo)){
//                        //任务命令写入成功
//                        writeFlag = true;
//                        log.info("写入输送线命令后返回成功,并且回读成功。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//                        break;
//                    } else {//返回结果是成功了,但是真实值不相同
//                        writeCount++;
//                        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={1},站点数据={2},写入次数={3}",
//                                slave.getId(), JSON.toJSON(staProtocol),writeCount));
//                        log.error("写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//                    }
//                } else {
//                    writeCount++;
//                    OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后读取失败。输送线plc编号={1},站点数据={2},写入次数={3}",
//                            slave.getId(), JSON.toJSON(staProtocol), writeCount));
//                    log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//                }
//            } else {
//                writeCount++;
//                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令失败。输送线plc编号={1},站点数据={2},写入次数={3}",
//                        slave.getId(), JSON.toJSON(staProtocol),writeCount));
//                log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
//            }
//            Thread.sleep(200);
//        }
//
//        //写命令尝试了5次还是失败了
//        if(!writeFlag){
//            staProtocol = station.get(staProtocol.getSiteId());
//            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
//                staProtocol.setPakMk(true);
//            }
//            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令尝试5次失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
//            log.error("写入输送线命令尝试5次失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
//
////            //重新添加数据到任务队列
////            boolean result = MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(2, staProtocol));
//            read();//读取1次设备状态
//            return;
//        } else {
//            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发成功 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
//            log.info("输送线命令下发 [id:{}] >>>>> 命令下发成功: {}",  slave.getId(), JSON.toJSON(staProtocol));
//
//            Integer siteId = staProtocol.getSiteId();
//            staProtocol = station.get(siteId);
//            if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) {
//                staProtocol.setPakMk(true);
//            }
//        }
//    }
//
//    /**
//     * 心跳
//     */
//    private void heartbeat(){
//        if (heartBeatVal == 1) {
//            heartBeatVal = 2;
//        } else {
//            heartBeatVal = 1;
//        }
//        OperateResult write = siemensS7Net.Write("DB100.50", heartBeatVal);
//        if (!write.IsSuccess) {
//            News.error("输送线plc编号={} 心跳失败", slave.getId());
//        }
//    }
//
//    /**
//     * 设置入库标记
//     */
//    @Override
//    public void setPakMk(Integer siteId, boolean pakMk) {
//        StaProtocol staProtocol = station.get(siteId);
//        if (null != staProtocol) {
//            staProtocol.setPakMk(pakMk);
//        }
//    }
//
//    public synchronized void setOutInModel(Short staNo, Short outInModel) {
//        String dbAddress = "DB51.4";
//        if (staNo == 105) {
//            dbAddress = "DB51.4";
//        }else if (staNo == 205) {
//            dbAddress = "DB51.10";
//        }else if (staNo == 346) {
//            dbAddress = "DB51.12";
//        }else {
//            News.error("模式切换失败,地址错误={},model={}", staNo, outInModel);
//            return;
//        }
//        OperateResult write = siemensS7Net.Write(dbAddress, outInModel);
//        if (!write.IsSuccess) {
//            News.error("模式切换失败={},model={}", staNo, outInModel);
//        }
//    }
//
//    @Override
//    public void close() {
//        siemensS7Net.ConnectClose();
//    }
//
//    public static void main(String[] args) {
////        System.out.println(staNos.indexOf(129));
//        System.out.println(staNos.size());
//        for (int i = 0; i<staNos.size(); i++) {
////            System.out.println(i*2);
////            System.out.println(i*2 + 200);
////            System.out.println(i);
//        }
////        int index = staNos.indexOf(128);
////        System.out.println(index*2);
////        System.out.println(index*2 + 200);
//    }
//
////    public static void main(String[] args) throws Exception {
////        DevpSlave slave = new DevpSlave();
////        slave.setIp("192.168.2.125");
////        SiemensDevpThread devpThread = new SiemensDevpThread(slave);
////        devpThread.connect();
////        devpThread.read();
////        // 写
////        StaProtocol staProtocol = devpThread.getStation().get(1);
////        staProtocol.setWorkNo((short) 232);
////        staProtocol.setStaNo((short) 6);
////        staProtocol.setAutoing(true);
////        staProtocol.setEmptyMk(true);
////        staProtocol.setInEnable(true);
////        devpThread.write(staProtocol);
////        System.out.println("----------------------------------------");
////        // 读
////        devpThread.read();
////        System.out.println(JSON.toJSONString(devpThread.station));
////
////    }
//
//}
src/main/webapp/views/index.html
@@ -19,6 +19,7 @@
    <div class="nav">
        <ul class="cl-effect-4">
            <li><a id="console" onclick="nav(this.id)" class="nav-select" href="#">主控图</a></li>
            <li><a id="pipline" onclick="nav(this.id)" class="nav-select" href="#">输送线</a></li>
            <li><a id="lift" onclick="nav(this.id)" class="nav-unselect" href="#">提升机</a></li>
            <li><a id="shuttle" onclick="nav(this.id)" class="nav-unselect" href="#">四向穿梭车</a></li>
            <li><a id="admin" onclick="nav(this.id)" class="nav-unselect" href="#">管理后台</a></li>