| src/main/java/com/zy/core/network/ZyCrnV2ConnectDriver.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/core/network/real/ZyCrnV2RealConnect.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/core/thread/impl/ZySiemensCrnV2Thread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/core/network/ZyCrnV2ConnectDriver.java
New file @@ -0,0 +1,102 @@ package com.zy.core.network; import com.zy.asrs.entity.DeviceConfig; import com.zy.core.ThreadHandler; import com.zy.core.model.CommandResponse; import com.zy.core.model.command.CrnCommand; import com.zy.core.network.api.ZyCrnConnectApi; import com.zy.core.network.entity.ZyCrnStatusEntity; import com.zy.core.network.fake.ZyCrnFakeConnect; import com.zy.core.network.real.ZyCrnRealConnect; import com.zy.core.network.real.ZyCrnV2RealConnect; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; /** * 连接驱动 */ @Slf4j public class ZyCrnV2ConnectDriver implements ThreadHandler{ private boolean connected = false; private DeviceConfig deviceConfig; private ZyCrnConnectApi zyCrnConnectApi; private volatile boolean closed = false; private ScheduledExecutorService executor; public ZyCrnV2ConnectDriver(DeviceConfig deviceConfig) { this.deviceConfig = deviceConfig; } @Override public void run() { } @Override public boolean connect() { if (deviceConfig.getFake() == 0) { zyCrnConnectApi = new ZyCrnV2RealConnect(deviceConfig); }else { zyCrnConnectApi = new ZyCrnFakeConnect(deviceConfig); } boolean connect = zyCrnConnectApi.connect(); connected = connect; return connect; } @Override public void close() { closed = true; ScheduledExecutorService ex = executor; if (ex != null) { try { ex.shutdownNow(); } catch (Exception ignore) {} } if (zyCrnConnectApi != null) { zyCrnConnectApi.disconnect(); zyCrnConnectApi = null; } connected = false; } public void start() { executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setName("CrnV2Connect-" + deviceConfig.getDeviceNo()); t.setDaemon(true); return t; } }); executor.scheduleAtFixedRate(() -> { if (closed || Thread.currentThread().isInterrupted()) { return; } try { if (!connected) { connect(); } } catch (Exception e) { e.printStackTrace(); } }, 0, 1000, TimeUnit.MILLISECONDS); } public ZyCrnStatusEntity getStatus() { if (zyCrnConnectApi == null) { return null; } return zyCrnConnectApi.getStatus(); } public CommandResponse sendCommand(CrnCommand command) { return zyCrnConnectApi.sendCommand(command); } } src/main/java/com/zy/core/network/real/ZyCrnV2RealConnect.java
New file @@ -0,0 +1,186 @@ package com.zy.core.network.real; 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.DateUtils; import com.zy.asrs.entity.DeviceConfig; import com.zy.core.News; import com.zy.core.cache.OutputQueue; import com.zy.core.model.CommandResponse; import com.zy.core.model.command.CrnCommand; import com.zy.core.network.api.ZyCrnConnectApi; import com.zy.core.network.entity.ZyCrnStatusEntity; import java.text.MessageFormat; import java.util.Date; public class ZyCrnV2RealConnect implements ZyCrnConnectApi { private SiemensS7Net siemensNet; private DeviceConfig deviceConfig; public ZyCrnV2RealConnect(DeviceConfig deviceConfig) { this.deviceConfig = deviceConfig; } public boolean connect() { boolean connected = false; siemensNet = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp()); OperateResult connect = siemensNet.ConnectServer(); if(connect.IsSuccess){ connected = true; OutputQueue.CRN.offer(MessageFormat.format( "【{0}】堆垛机plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort())); News.info("堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()); } else { OutputQueue.CRN.offer(MessageFormat.format("【{0}】堆垛机plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort())); News.error("堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()); } // siemensNet.ConnectClose(); return connected; } @Override public boolean disconnect() { siemensNet.ConnectClose(); return true; } @Override public ZyCrnStatusEntity getStatus() { try { OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 56); if (result.IsSuccess) { ZyCrnStatusEntity crnStatus = new ZyCrnStatusEntity(); crnStatus.setCrnNo(deviceConfig.getDeviceNo()); crnStatus.setMode((int) siemensNet.getByteTransform().TransInt16(result.Content, 0)); crnStatus.setTaskNo((int) siemensNet.getByteTransform().TransInt16(result.Content, 2)); crnStatus.setStatus((int) siemensNet.getByteTransform().TransInt16(result.Content, 4)); crnStatus.setBay((int) siemensNet.getByteTransform().TransInt16(result.Content, 6)); crnStatus.setLevel((int) siemensNet.getByteTransform().TransInt16(result.Content, 8)); crnStatus.setForkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 10)); crnStatus.setLiftPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 12)); crnStatus.setWalkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 14)); crnStatus.setLoaded((int) siemensNet.getByteTransform().TransInt16(result.Content, 16)); crnStatus.setAlarm((int) siemensNet.getByteTransform().TransInt16(result.Content, 18)); crnStatus.setTemp1((int) siemensNet.getByteTransform().TransInt16(result.Content, 24)); crnStatus.setTemp2((int) siemensNet.getByteTransform().TransInt16(result.Content, 26)); crnStatus.setXSpeed((double) siemensNet.getByteTransform().TransSingle(result.Content, 28)); crnStatus.setYSpeed((double) siemensNet.getByteTransform().TransSingle(result.Content, 32)); crnStatus.setZSpeed((double) siemensNet.getByteTransform().TransSingle(result.Content, 36)); crnStatus.setXDistance((double) siemensNet.getByteTransform().TransSingle(result.Content, 40)); crnStatus.setYDistance((double) siemensNet.getByteTransform().TransSingle(result.Content, 44)); crnStatus.setXDuration((double) siemensNet.getByteTransform().TransSingle(result.Content, 48)); crnStatus.setYDuration((double) siemensNet.getByteTransform().TransSingle(result.Content, 52)); return crnStatus; } else { OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取堆垛机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort())); News.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()); } } catch (Exception e) { e.printStackTrace(); OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取堆垛机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort())); News.error("读取垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort()); } return null; } @Override public CommandResponse sendCommand(CrnCommand command) { CommandResponse response = new CommandResponse(false); try { if (null == command) { News.error("堆垛机写入命令为空"); response.setMessage("堆垛机写入命令为空"); return response; } int writeAck = 0; boolean commandResult = false; do { OperateResultExOne<byte[]> commandReadResult = siemensNet.Read("DB100.0", (short) 2); if (commandReadResult.IsSuccess) { short commandRead = siemensNet.getByteTransform().TransInt16(commandReadResult.Content, 0); if (commandRead == 1) { Thread.sleep(500); }else { commandResult = true; break; } writeAck++; } } while (writeAck < 5); if (!commandResult) { response.setMessage("堆垛机命令下发[id:{}] >>>>> {}" + command.getCrnNo() + "任务状态位异常"); return response; } short[] array = new short[9]; array[0] = (short) 0; array[1] = command.getTaskNo().shortValue(); array[2] = command.getTaskMode().shortValue(); array[3] = command.getSourcePosX().shortValue(); array[4] = command.getSourcePosY().shortValue(); array[5] = command.getSourcePosZ().shortValue(); array[6] = command.getDestinationPosX().shortValue(); array[7] = command.getDestinationPosY().shortValue(); array[8] = command.getDestinationPosZ().shortValue(); OperateResult result = siemensNet.Write("DB100.0", array); if (!result.IsSuccess) { response.setMessage("堆垛机命令下发[id:{}] >>>>> {}" + command.getCrnNo() + "任务状态位异常"); return response; } int idx = 0; do { OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20); if (resultRead.IsSuccess) { short taskNo = siemensNet.getByteTransform().TransInt16(resultRead.Content, 2); short taskMode = siemensNet.getByteTransform().TransInt16(resultRead.Content, 4); short sourcePosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 6); short sourcePosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 8); short sourcePosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 10); short destinationPosX = siemensNet.getByteTransform().TransInt16(resultRead.Content, 12); short destinationPosY = siemensNet.getByteTransform().TransInt16(resultRead.Content, 14); short destinationPosZ = siemensNet.getByteTransform().TransInt16(resultRead.Content, 16); if (taskNo == 0 || taskMode == 0 || sourcePosX == 0 || sourcePosY == 0 || sourcePosZ == 0 || destinationPosX == 0 || destinationPosY == 0 || destinationPosZ == 0) { result = siemensNet.Write("DB100.0", array); } else { break; } } idx++; Thread.sleep(500); } while (idx < 5); OperateResult confirmResult = siemensNet.Write("DB100.18", (short) 1); if (!confirmResult.IsSuccess) { News.error("堆垛机写入确认数据失败 ===>> [id:{}]", command.getCrnNo()); response.setMessage("堆垛机写入确认数据失败"); return response; } if (result != null && result.IsSuccess) { News.info("堆垛机命令下发[id:{}] >>>>> {}", command.getCrnNo(), JSON.toJSON(command)); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), command.getCrnNo(), JSON.toJSON(command))); response.setResult(true); response.setMessage("命令下发成功"); } else { News.error("写入堆垛机plc数据失败 ===>> [id:{}]", command.getCrnNo()); OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}]", DateUtils.convert(new Date()), command.getCrnNo())); response.setResult(false); response.setMessage("命令下发失败"); } return response; } catch (Exception e) { e.printStackTrace(); } return response; } } src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
@@ -275,9 +275,6 @@ crnCommand.setTaskNo(taskNo); // 工作号 crnCommand.setAckFinish(0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.CRN_MOVE.id); // 任务模式: 堆垛机移动 crnCommand.setSourcePosX(Utils.getRow(targetLocNo)); // 目标库位排 crnCommand.setSourcePosY(Utils.getBay(targetLocNo)); // 目标库位列 crnCommand.setSourcePosZ(Utils.getLev(targetLocNo)); // 目标库位层 crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // 目标库位排 crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // 目标库位列 crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // 目标库位层 src/main/java/com/zy/core/thread/impl/ZySiemensCrnV2Thread.java
New file @@ -0,0 +1,333 @@ package com.zy.core.thread.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.DateUtils; import com.core.common.SpringUtils; import com.zy.asrs.entity.*; import com.zy.asrs.service.BasCrnpErrLogService; import com.zy.asrs.service.BasCrnpOptService; import com.zy.asrs.service.BasCrnpService; import com.zy.asrs.utils.Utils; import com.zy.common.utils.RedisUtil; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.CrnTaskModeType; import com.zy.core.enums.RedisKeyType; import com.zy.core.enums.SlaveType; import com.zy.core.model.CommandResponse; import com.zy.core.model.Task; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.network.DeviceConnectPool; import com.zy.core.network.ZyCrnV2ConnectDriver; import com.zy.core.network.entity.ZyCrnStatusEntity; import com.zy.core.thread.CrnThread; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.text.MessageFormat; import java.util.Date; /** * 堆垛机线程 */ @Data @Slf4j public class ZySiemensCrnV2Thread implements Runnable, CrnThread { private DeviceConfig deviceConfig; private RedisUtil redisUtil; private ZyCrnV2ConnectDriver zyCrnConnectDriver; private CrnProtocol crnProtocol; private int deviceLogCollectTime = 200; public ZySiemensCrnV2Thread(DeviceConfig deviceConfig, RedisUtil redisUtil) { this.deviceConfig = deviceConfig; this.redisUtil = redisUtil; } @Override @SuppressWarnings("InfiniteLoopStatement") public void run() { this.connect(); this.initCrn(); Thread readThread = new Thread(() -> { while (true) { try { deviceLogCollectTime = Utils.getDeviceLogCollectTime(); readStatus(); Thread.sleep(100); } catch (Exception e) { log.error("CrnThread Fail", e); } } }); readThread.start(); Thread processThread = new Thread(() -> { while (true) { try { int step = 1; Task task = MessageQueue.poll(SlaveType.Crn, deviceConfig.getDeviceNo()); if (task != null) { step = task.getStep(); } if (step == 2) { sendCommand((CrnCommand) task.getData()); } Thread.sleep(100); } catch (Exception e) { log.error("CrnProcess Fail", e); } } }); processThread.start(); } /** * 初始化堆垛机状态 */ private void initCrn() { if (null == crnProtocol) { crnProtocol = new CrnProtocol(); crnProtocol.setCrnNo(deviceConfig.getDeviceNo()); } crnProtocol.setMode(-1); crnProtocol.setTaskNo(0); crnProtocol.setStatus(-1); crnProtocol.setBay(0); crnProtocol.setLevel(0); crnProtocol.setForkPos(-1); crnProtocol.setLiftPos(-1); crnProtocol.setWalkPos(0); crnProtocol.setLoaded(0); crnProtocol.setAlarm(0); crnProtocol.setXSpeed(0D); crnProtocol.setYSpeed(0D); crnProtocol.setZSpeed(0D); crnProtocol.setXDistance(0D); crnProtocol.setYDistance(0D); crnProtocol.setXDuration(0D); crnProtocol.setYDuration(0D); BasCrnpService basCrnpService = null; try { basCrnpService = SpringUtils.getBean(BasCrnpService.class); }catch (Exception e){ } if (basCrnpService != null) { BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", deviceConfig.getDeviceNo())); if(basCrnp == null) { basCrnp = new BasCrnp(); basCrnp.setCrnNo(deviceConfig.getDeviceNo()); basCrnp.setStatus(1); basCrnp.setInEnable("N"); basCrnp.setOutEnable("N"); basCrnp.setMaxInTask(5); basCrnp.setMaxOutTask(5); basCrnp.setCreateTime(new Date()); basCrnpService.insert(basCrnp); } } } @Override public boolean connect() { zyCrnConnectDriver = new ZyCrnV2ConnectDriver(deviceConfig); zyCrnConnectDriver.start(); DeviceConnectPool.put(SlaveType.Crn, deviceConfig.getDeviceNo(), zyCrnConnectDriver); return true; } /** * 读取状态 */ private void readStatus(){ ZyCrnStatusEntity crnStatus = zyCrnConnectDriver.getStatus(); if (crnStatus == null) { OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取堆垛机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort())); return; } crnProtocol.setMode(crnStatus.getMode()); crnProtocol.setTaskNo(crnStatus.getTaskNo()); crnProtocol.setStatus(crnStatus.getStatus()); crnProtocol.setBay(crnStatus.getBay()); crnProtocol.setLevel(crnStatus.getLevel()); crnProtocol.setForkPos(crnStatus.getForkPos()); crnProtocol.setLiftPos(crnStatus.getLiftPos()); crnProtocol.setWalkPos(crnStatus.getWalkPos()); crnProtocol.setLoaded(crnStatus.getLoaded()); crnProtocol.setAlarm(crnStatus.getAlarm()); crnProtocol.setTemp1(crnStatus.getTemp1()); crnProtocol.setTemp2(crnStatus.getTemp2()); crnProtocol.setTemp3(crnStatus.getTemp3()); crnProtocol.setTemp4(crnStatus.getTemp4()); crnProtocol.setXSpeed(crnStatus.getXSpeed()); crnProtocol.setYSpeed(crnStatus.getYSpeed()); crnProtocol.setZSpeed(crnStatus.getZSpeed()); crnProtocol.setXDistance(crnStatus.getXDistance()); crnProtocol.setYDistance(crnStatus.getYDistance()); crnProtocol.setXDuration(crnStatus.getXDuration()); crnProtocol.setYDuration(crnStatus.getYDuration()); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), deviceConfig.getDeviceNo())); if (crnProtocol.getAlarm() > 0) { crnProtocol.setLastCommandTime(-1L); } if (crnProtocol.getAlarm() == 0 && crnProtocol.getLastCommandTime() == -1) { crnProtocol.setLastCommandTime(System.currentTimeMillis()); } if (System.currentTimeMillis() - crnProtocol.getDeviceDataLog() > deviceLogCollectTime) { //保存数据记录 DeviceDataLog deviceDataLog = new DeviceDataLog(); deviceDataLog.setOriginData(JSON.toJSONString(crnStatus)); deviceDataLog.setWcsData(JSON.toJSONString(crnProtocol)); deviceDataLog.setType(String.valueOf(SlaveType.Crn)); deviceDataLog.setDeviceNo(crnProtocol.getCrnNo()); deviceDataLog.setCreateTime(new Date()); redisUtil.set(RedisKeyType.DEVICE_LOG_KEY.key + System.currentTimeMillis(), deviceDataLog, 60 * 60 * 24); //更新采集时间 crnProtocol.setDeviceDataLog(System.currentTimeMillis()); } try { BasCrnpErrLogService errLogService = SpringUtils.getBean(BasCrnpErrLogService.class); if (errLogService != null) { String errFlagKey = RedisKeyType.DEVICE_ERR_ACTIVE_CRN.key + crnProtocol.getCrnNo(); Object active = redisUtil.get(errFlagKey); if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { if (active == null) { BasCrnpErrLog log = new BasCrnpErrLog(); log.setWrkNo(crnProtocol.getTaskNo()); log.setStartTime(new Date()); log.setCrnNo(crnProtocol.getCrnNo()); log.setBarcode(crnProtocol.getBarcode()); log.setErrCode(crnProtocol.getAlarm()); log.setStatus(1); log.setCreateTime(new Date()); log.setSystemStatus(JSON.toJSONString(crnProtocol)); errLogService.insert(log); if (log.getId() != null) { redisUtil.set(errFlagKey, log.getId(), 60 * 60 * 24); } } } else { if (active != null) { Long id = Long.valueOf(String.valueOf(active)); BasCrnpErrLog update = new BasCrnpErrLog(); update.setId(id); update.setEndTime(new Date()); update.setStatus(2); update.setUpdateTime(new Date()); errLogService.updateById(update); redisUtil.del(errFlagKey); } } } } catch (Exception ignore) {} } @Override public void close() { if (zyCrnConnectDriver != null) { zyCrnConnectDriver.close(); } } @Override public CrnProtocol getStatus() { return this.crnProtocol; } @Override public CrnCommand getPickAndPutCommand(String sourceLocNo, String targetLocNo, Integer taskNo, Integer crnNo) { CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(crnNo); // 堆垛机编号 crnCommand.setTaskNo(taskNo); // 工作号 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE.id); // 任务模式: 库位移转 crnCommand.setSourcePosX(Utils.getRow(sourceLocNo)); // 源库位排 crnCommand.setSourcePosY(Utils.getBay(sourceLocNo)); // 源库位列 crnCommand.setSourcePosZ(Utils.getLev(sourceLocNo)); // 源库位层 crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // 目标库位排 crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // 目标库位列 crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // 目标库位层 crnCommand.setCommand(1); // 任务确认 return crnCommand; } @Override public CrnCommand getMoveCommand(String targetLocNo, Integer taskNo, Integer crnNo) { CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(crnNo); // 堆垛机编号 crnCommand.setTaskNo(taskNo); // 工作号 crnCommand.setAckFinish(0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.CRN_MOVE.id); // 任务模式: 堆垛机移动 crnCommand.setSourcePosX(Utils.getRow(targetLocNo)); // 目标库位排 crnCommand.setSourcePosY(Utils.getBay(targetLocNo)); // 目标库位列 crnCommand.setSourcePosZ(Utils.getLev(targetLocNo)); // 目标库位层 crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // 目标库位排 crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // 目标库位列 crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // 目标库位层 crnCommand.setCommand(1); // 任务确认 return crnCommand; } @Override public CrnCommand getResetCommand(Integer crnNo) { CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(crnNo); // 堆垛机编号 crnCommand.setTaskNo(0); // 工作号 crnCommand.setAckFinish(1); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.NONE.id); // 任务模式 crnCommand.setSourcePosX(0); // 源库位排 crnCommand.setSourcePosY(0); // 源库位列 crnCommand.setSourcePosZ(0); // 源库位层 crnCommand.setDestinationPosX(0); // 目标库位排 crnCommand.setDestinationPosY(0); // 目标库位列 crnCommand.setDestinationPosZ(0); // 目标库位层 crnCommand.setCommand(1); // 任务确认 return crnCommand; } @Override public synchronized CommandResponse sendCommand(CrnCommand command) { this.crnProtocol.setLastCommandTime(System.currentTimeMillis()); CommandResponse response = null; try { response = zyCrnConnectDriver.sendCommand(command); return response; } finally { String sourceLocNo = Utils.getLocNo(command.getSourcePosX(), command.getSourcePosY(), command.getSourcePosZ()); String targetLocNo = Utils.getLocNo(command.getDestinationPosX(), command.getDestinationPosY(), command.getDestinationPosZ()); BasCrnpOptService bean = SpringUtils.getBean(BasCrnpOptService.class); ZyCrnStatusEntity statusEntity = zyCrnConnectDriver.getStatus(); BasCrnpOpt basCrnpOpt = new BasCrnpOpt( command.getTaskNo().intValue(), command.getCrnNo(), new Date(), String.valueOf(command.getTaskMode()), sourceLocNo, targetLocNo, null, null, null, JSON.toJSONString(command), JSON.toJSONString(statusEntity), 1, JSON.toJSONString(response) ); if (bean != null) { bean.insert(basCrnpOpt); } } } }