自动化立体仓库 - WCS系统
zyx
2024-02-07 05e7ab5c6a01f793c19faac419a7095ba182959b
#AGV 输送线扫码器扫描
1个文件已添加
5个文件已修改
308 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/SlaveType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/properties/SlaveProperties.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread3.java 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvController.java
@@ -2,12 +2,14 @@
import com.alibaba.fastjson.JSONObject;
import com.core.common.R;
import com.zy.core.thread.SiemensDevpThread3;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -22,9 +24,16 @@
    @PostMapping("/container/release")
    public R containerRelease(@RequestBody JSONObject jsonObject){
        System.out.println(jsonObject.toString());
        HashMap<String, String> map = new HashMap<>();
        map.put("allow","true");
        HashMap<String, Boolean> currentStationInfoMap = SiemensDevpThread3.currentStationInfoMap;
        String slotCode = jsonObject.get("slotCode").toString();
        Map<String,String> map = new HashMap<>();
        if(currentStationInfoMap.get(slotCode)){
            map.put("allow","true");
        }else {
            map.put("allow","false");
        }
        R r = new R(0, "");
        return r.add(map);
src/main/java/com/zy/core/ServerBootstrap.java
@@ -52,6 +52,9 @@
        for (Slave devp2 : slaveProperties.getDevp2()) {
            MessageQueue.init(SlaveType.Devp2, devp2);
        }
        for (Slave devp3 : slaveProperties.getDevp3()) {
            MessageQueue.init(SlaveType.Devp3, devp3);
        }
        // 初始化条码扫描仪mq
        for (Slave barcode : slaveProperties.getBarcode()) {
            MessageQueue.init(SlaveType.Barcode, barcode);
@@ -91,6 +94,11 @@
            new Thread(siemensDevpThread2).start();
            SlaveConnection.put(SlaveType.Devp2, devp2.getId(), siemensDevpThread2);
        }
        for (Devp2Slave devp3 : slaveProperties.getDevp3()) {
            SiemensDevpThread3 siemensDevpThread3 = new SiemensDevpThread3(devp3);
            new Thread(siemensDevpThread3).start();
            SlaveConnection.put(SlaveType.Devp3, devp3.getId(), siemensDevpThread3);
        }
        // 初始化提升机
        News.info("初始化提升机........................................................");
        for (LiftSlave liftSlave : slaveProperties.getLift()) {
src/main/java/com/zy/core/enums/SlaveType.java
@@ -5,6 +5,7 @@
    Crn,
    Devp,
    Devp2,
    Devp3,
    Barcode,
    Led,
    Scale,
src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -33,6 +33,8 @@
    private List<Devp2Slave> devp2 = new ArrayList<>();
    private List<Devp2Slave> devp3 = new ArrayList<>();
    private List<Slave> barcode = new ArrayList<>();
    private List<LedSlave> led = new ArrayList<>();
src/main/java/com/zy/core/thread/SiemensDevpThread3.java
New file
@@ -0,0 +1,275 @@
package com.zy.core.thread;
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.DevpThread;
import com.zy.core.News;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.Devp2Slave;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.StaProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 输送线线程
 * Created by vincent on 2020/8/4
 */
@Data
@Slf4j
public class SiemensDevpThread3 implements Runnable, DevpThread {
    public static HashMap<String,Boolean> currentStationInfoMap;
    private Devp2Slave slave;
    private SiemensS7Net siemensS7Net;
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    private short heartBeatVal = 1;
    private int barcodeSize = 1;
    public static final ArrayList<Integer> staNos = new ArrayList<Integer>() {{
        add(313);add(312);
        add(311);add(310);
    }};
    public SiemensDevpThread3(Devp2Slave slave) {
        this.slave = slave;
    }
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        connect();
        while (true) {
            try {
                int step = 1;
                Task task = MessageQueue.poll(SlaveType.Devp2, 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.S1200, 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 {
        if(Cools.isEmpty(currentStationInfoMap)){
            currentStationInfoMap = new HashMap<>();
        }
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB69.0.0", (short) (staNos.size()));
        boolean[] booleans = siemensS7Net.getByteTransform().TransBool(result.Content, 0, 1);
        for (int i=0; i<staNos.size();i++){
            String station = staNos.get(i) + "-1";
            currentStationInfoMap.put(station,booleans[0]);
//            StaProtocol staProtocol = station.get(staNos.get(i));
//            if(Cools.isEmpty(staProtocol)){
//                staProtocol = new StaProtocol();
//                staProtocol.setSiteId(staNos.get(i));
//                staProtocol.setLoading(booleans[i]);
//                station.put(staNos.get(i),staProtocol);
//            }
        }
    }
    /**
     * 写入 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 < 5){
            writeResult = siemensS7Net.Write("DB1000." + index*4, array);    // 工作号、目标站
            if(writeResult.IsSuccess){
                Thread.sleep(200);
                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);
        }
    }
    @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/resources/application.yml
@@ -333,6 +333,13 @@
    port: 102
    rack: 0
    slot: 0
  # 输送线2
  devp3[0]:
    id: 1
    ip: 10.10.10.239
    port: 102
    rack: 0
    slot: 0
  # 条码扫描仪
  barcode[0]: