src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -24,7 +24,7 @@ import com.zy.core.properties.SlaveProperties; import com.zy.core.properties.SystemProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.CrnThread; import com.zy.core.thread.SiemensCrnThread; import com.zy.core.thread.DevpThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -111,7 +111,7 @@ List<CrnLatestDataVo> vos = new ArrayList<>(); for (CrnSlave crn : slaveProperties.getCrn()) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); SiemensCrnThread crnThread = (SiemensCrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); if (crnThread == null) { continue; } @@ -224,7 +224,7 @@ CrnDetailVo vo = new CrnDetailVo(); for (CrnSlave crnSlave : slaveProperties.getCrn()) { if (crnSlave.getId().equals(crnNo)) { CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId()); SiemensCrnThread crnThread = (SiemensCrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); vo.setCrnNo(crnNo); vo.setWorkNo(crnProtocol.getTaskNo()); src/main/java/com/zy/asrs/controller/CrnController.java
@@ -28,7 +28,7 @@ import com.zy.core.model.command.CrnCommand; import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.CrnThread; import com.zy.core.CrnThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -26,7 +26,7 @@ import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.CrnThread; import com.zy.core.CrnThread; import com.zy.core.thread.DevpThread; import com.zy.core.thread.LedThread; import lombok.extern.slf4j.Slf4j; @@ -112,9 +112,11 @@ } // 获取入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()).clone(); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } // 判断是否满足入库条件 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() @@ -218,8 +220,12 @@ for (DevpSlave.Sta inSta : devp.getInSta()) { // 获取入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()).clone(); if (staProtocol == null) { continue; } StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } // 判断是否满足入库条件 if (staProtocol.isAutoing() && staProtocol.isLoading() && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() == 0 @@ -264,8 +270,12 @@ for (DevpSlave.Sta pickSta : devp.getPickSta()) { // 获取拣料入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo()).clone(); if (staProtocol == null) { continue; } StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.getWorkNo() > 0 && staProtocol.isPakMk()){ WrkMast wrkMast = wrkMastMapper.selectPickStep(staProtocol.getWorkNo().intValue()); @@ -350,8 +360,12 @@ for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) { // 获取堆垛机出库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone(); if (staProtocol == null) { continue; } StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) { // 查询工作档 WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(staProtocol.getSiteId()); @@ -452,8 +466,12 @@ boolean flag = false; // 获取堆垛机入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone(); if (staProtocol == null) { continue; } StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } // 查询站点详细信息 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); if (staDetl == null) { @@ -540,8 +558,12 @@ } // 获取堆垛机出库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone(); if (staProtocol == null) { continue; } StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } // 查询站点详细信息 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); if (staDetl == null) { @@ -712,8 +734,12 @@ for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) { // 获取空板入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo()).clone(); if (staProtocol == null) { continue; } StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } // 站点条件判断 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isEmptyMk() && staProtocol.getWorkNo() == 0 && staProtocol.isPakMk()) { @@ -790,8 +816,12 @@ List<WrkMast> wrkMasts = new ArrayList<>(); for (Integer staNo : led.getStaArr()) { // 获取叉车站点 StaProtocol staProtocol = devpThread.getStation().get(staNo).clone(); if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) { continue; } StaProtocol staProtocol = devpThread.getStation().get(staNo); if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) { continue; } else { staProtocol = staProtocol.clone(); } // 获取工作档数据 WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo()); if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; } @@ -877,8 +907,12 @@ boolean reset = true; for (Integer staNo : led.getStaArr()) { // 获取叉车站点 StaProtocol staProtocol = devpThread.getStation().get(staNo).clone(); if (staProtocol == null) {continue;} StaProtocol staProtocol = devpThread.getStation().get(staNo); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (staProtocol.getWorkNo() != 0) { reset = false; break; src/main/java/com/zy/core/CrnThread.java
New file @@ -0,0 +1,11 @@ package com.zy.core; import com.zy.core.model.protocol.CrnProtocol; public interface CrnThread extends ThreadHandler { CrnProtocol getCrnProtocol(); void setResetFlag(boolean flag); } src/main/java/com/zy/core/ServerBootstrap.java
@@ -6,10 +6,7 @@ import com.zy.core.model.CrnSlave; import com.zy.core.model.DevpSlave; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.CarThread; import com.zy.core.thread.CrnThread; import com.zy.core.thread.DevpThread; import com.zy.core.thread.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; @@ -76,8 +73,18 @@ // 初始化堆垛机线程 log.info("初始化堆垛机线程..................................................."); for (CrnSlave crn : slaveProperties.getCrn()) { CrnThread crnThread = new CrnThread(crn); new Thread(crnThread).start(); CrnThread crnThread = null; switch (crn.getId()) { case 1: crnThread = new SiemensCrnThread(crn); break; case 2: crnThread = new MelsecCrnThread(crn); break; default: break; } new Thread((Runnable) crnThread).start(); SlaveConnection.put(SlaveType.Crn, crn.getId(), crnThread); } src/main/java/com/zy/core/enums/CrnFingerPosType.java
New file @@ -0,0 +1,41 @@ package com.zy.core.enums; public enum CrnFingerPosType { DOWN(2, "下定位"), // 下定位 UP(1, "上定位"), // 上定位 NONE(0, "不在定位"), // 不在定位 ; public Integer id; public String desc; CrnFingerPosType(Integer id, String desc) { this.id = id; this.desc = desc; } public static CrnFingerPosType get(Short id) { if (null == id) { return null; } for (CrnFingerPosType type : CrnFingerPosType.values()) { if (type.id.equals(id.intValue())) { return type; } } return null; } public static CrnFingerPosType get(CrnFingerPosType type) { if (null == type) { return null; } for (CrnFingerPosType crnLiftPosType : CrnFingerPosType.values()) { if (crnLiftPosType == type) { return crnLiftPosType; } } return null; } } src/main/java/com/zy/core/enums/CrnForkPosType.java
@@ -5,6 +5,8 @@ HOME(0, "货叉原位"), // 货叉原位 LEFT(1, "货叉在左侧"), // 货叉在左侧 RIGHT(2, "货叉在右侧"), // 货叉在右侧 _LEFT(3, "货叉在左侧远"), // 货叉在右侧远 _RIGHT(4, "货叉在右侧远"), // 货叉在右侧远 ; public Integer id; src/main/java/com/zy/core/enums/CrnLiftPosType.java
@@ -2,6 +2,7 @@ public enum CrnLiftPosType { POSITION(3, "在定位"), // 在定位 DOWN(2, "下定位"), // 下定位 UP(1, "上定位"), // 上定位 NONE(0, "不在定位"), // 不在定位 src/main/java/com/zy/core/enums/CrnStatusType.java
@@ -10,6 +10,9 @@ TO_ORIGIN(5, "回原点中"), ORIGIN(6, "反原点"), LOC_MOVE(7, "库位移位"), POSITON_MOVE(10, "坐标移行"), FETCH_WAITING(21, "等待取货允许"), PUT_WAITING(22, "等待放货允许"), WAITING(90, "任务完成等待WCS确认"), SOS(99, "报警"), ; src/main/java/com/zy/core/enums/CrnTaskModeType.java
@@ -9,6 +9,7 @@ SITE_MOVE(4), // 站位移转 GO_ORIGIN(5), // 回原点 OFFSET_MOVE(7), // 坐标移行 TIMING(90), // 校时 ; public Integer id; src/main/java/com/zy/core/model/command/CrnCommand.java
@@ -4,6 +4,9 @@ import com.zy.core.enums.CrnTaskModeType; import lombok.Data; import java.util.Calendar; import java.util.Date; /** * 堆垛机命令报文 * Created by vincent on 2020/8/11 @@ -30,6 +33,8 @@ * 5 = 回原点 不用发 * 6 = 去反原点 目标发 * 7 = 坐标移行 目标发 * 90 = 设置时间 * 99 = 取消当前任务 */ private Short taskMode = 0; @@ -54,6 +59,8 @@ // 目标位置层号 private Short destinationPosZ = 0; private Short taskSend = 0; public void setTaskMode(Short taskMode){ this.taskMode = taskMode; this.taskModeType = CrnTaskModeType.get(taskModeType); @@ -64,4 +71,26 @@ this.taskMode = CrnTaskModeType.get(type).id.shortValue(); } public static void main(String[] args) { Date date = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(date); System.out.println(cal.get(Calendar.YEAR)); //默认从0-11 System.out.println(cal.get(Calendar.MONTH)+1); System.out.println(cal.get(Calendar.DATE)); int hour = cal.get(Calendar.HOUR_OF_DAY); System.out.println("时"); System.out.println(hour); int minute = cal.get(Calendar.MINUTE); System.out.println("分"); System.out.println(minute); int second = cal.get(Calendar.SECOND); System.out.println("秒"); System.out.println(second); int mm = cal.get(Calendar.DAY_OF_WEEK) - 1; // 星期:0(日)~6(六) System.out.println("礼拜"); System.out.println(mm); } } src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -1,10 +1,7 @@ package com.zy.core.model.protocol; import com.zy.asrs.entity.BasCrnp; import com.zy.core.enums.CrnForkPosType; import com.zy.core.enums.CrnLiftPosType; import com.zy.core.enums.CrnModeType; import com.zy.core.enums.CrnStatusType; import com.zy.core.enums.*; import lombok.Data; /** @@ -92,6 +89,16 @@ * 1 = 不在定位 */ public Short walkPos; /** * 拨指位置 * 0 = 不在定位 * 1 = 上定位 * 2 = 下定位 */ public Short fingerPos; public CrnFingerPosType fingerPosType; /** * 堆垛机任务完成 @@ -233,6 +240,11 @@ this.status = CrnStatusType.get(type).id.shortValue(); } public void setFingerPos(Short type) { this.fingerPos = type; this.fingerPosType = CrnFingerPosType.get(type); } public void setError1(boolean[] error1){ this.error1 = error1; this.crnError1 = new CrnError1(); src/main/java/com/zy/core/thread/MelsecCrnThread.javacopy from src/main/java/com/zy/core/thread/CrnThread.java copy to src/main/java/com/zy/core/thread/MelsecCrnThread.java
File was copied from src/main/java/com/zy/core/thread/CrnThread.java @@ -2,14 +2,14 @@ import HslCommunication.Core.Types.OperateResult; import HslCommunication.Core.Types.OperateResultExOne; import HslCommunication.Profinet.Siemens.SiemensPLCS; import HslCommunication.Profinet.Siemens.SiemensS7Net; import HslCommunication.Profinet.Melsec.MelsecMcNet; import com.alibaba.fastjson.JSON; import com.core.common.Arith; import com.core.common.DateUtils; import com.core.common.SpringUtils; import com.zy.asrs.entity.BasCrnp; import com.zy.asrs.service.BasCrnpService; import com.zy.core.ThreadHandler; import com.zy.core.CrnThread; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.CrnStatusType; @@ -23,6 +23,7 @@ import lombok.extern.slf4j.Slf4j; import java.text.MessageFormat; import java.util.Calendar; import java.util.Date; /** @@ -31,14 +32,16 @@ */ @Data @Slf4j public class CrnThread implements Runnable, ThreadHandler { public class MelsecCrnThread implements Runnable, CrnThread { private SiemensS7Net siemensNet; private MelsecMcNet melsecMcNet; private CrnSlave slave; private CrnProtocol crnProtocol; private boolean resetFlag = false; private short heartBeatVal = 1; private int heartTimes = 0; public CrnThread(CrnSlave slave) { public MelsecCrnThread(CrnSlave slave) { this.slave = slave; } @@ -83,6 +86,12 @@ default: break; } // 心跳 2s一次 heartTimes++; if (Arith.remainder(heartTimes, 4) == 0) { heartbeat(); heartTimes = 0; } Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); @@ -94,19 +103,46 @@ @Override public boolean connect() { boolean result = false; siemensNet = new SiemensS7Net(SiemensPLCS.S300, slave.getIp()); siemensNet.setRack(slave.getRack().byteValue()); siemensNet.setSlot(slave.getSlot().byteValue()); OperateResult connect = siemensNet.ConnectServer(); melsecMcNet = new MelsecMcNet(slave.getIp(), slave.getPort()); OperateResult connect = melsecMcNet.ConnectServer(); if(connect.IsSuccess){ result = true; OutputQueue.CRN.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())); log.info("堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); OutputQueue.CRN.offer(MessageFormat.format( "【{0}】堆垛机plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.info("堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort()); } else { OutputQueue.CRN.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())); log.error("堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); OutputQueue.CRN.offer(MessageFormat.format("【{0}】堆垛机plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort()); } siemensNet.ConnectClose(); // 命令下发区 -------------------------------------------------------------------------- /** * array[1] = command.getSourcePosY(); // 列 * array[2] = command.getSourcePosZ(); // 层 * array[3] = command.getSourcePosX(); // 排 * array[4] = command.getDestinationPosY(); // 列 * array[5] = command.getDestinationPosZ(); // 层 * array[6] = command.getDestinationPosX(); // 排 * array[7] = command.getTaskNo(); */ Date date = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(date); CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 crnCommand.setTaskMode(CrnTaskModeType.TIMING); // 任务模式: 设置时间 crnCommand.setSourcePosY((short) cal.get(Calendar.YEAR)); // 年:1980~2079 crnCommand.setSourcePosZ((short) (cal.get(Calendar.MONTH)+1)); // 月:1~12 crnCommand.setSourcePosX((short) cal.get(Calendar.DATE)); // 日:1~31 crnCommand.setDestinationPosY((short) cal.get(Calendar.HOUR_OF_DAY)); // 时:0~23 crnCommand.setDestinationPosZ((short) cal.get(Calendar.MINUTE)); // 分:0~59 crnCommand.setDestinationPosX((short) cal.get(Calendar.SECOND)); // 秒:0~59 crnCommand.setTaskNo((short) (cal.get(Calendar.DAY_OF_WEEK) - 1)); // 星期:0(日)~6(六) crnCommand.setTaskSend((short) 1); crnCommand.setAckFinish((short) 0); if (write(crnCommand)) { log.info("堆垛机plc校对时间成功 ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort()); } melsecMcNet.ConnectClose(); return result; } @@ -114,36 +150,33 @@ * 读取状态 */ private void readStatus(){ OperateResultExOne<byte[]> result = siemensNet.Read("DB8.18", (short) 62); OperateResultExOne<byte[]> result = melsecMcNet.Read("D1119", (short) 58); if (result.IsSuccess) { if (null == crnProtocol) { crnProtocol = new CrnProtocol(); } crnProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0)); crnProtocol.setTaskNo(siemensNet.getByteTransform().TransInt16(result.Content, 2)); crnProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 4)); crnProtocol.setBay(siemensNet.getByteTransform().TransInt16(result.Content, 6)); crnProtocol.setLevel(siemensNet.getByteTransform().TransInt16(result.Content, 8)); crnProtocol.setForkPos(siemensNet.getByteTransform().TransInt16(result.Content, 10)); crnProtocol.setLiftPos(siemensNet.getByteTransform().TransInt16(result.Content, 12)); crnProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 14)); // crnProtocol.setTaskFinish(siemensNet.getByteTransform().TransInt16(result.Content, 16)); crnProtocol.setLoaded(siemensNet.getByteTransform().TransInt16(result.Content, 18)); crnProtocol.setAlarm1(siemensNet.getByteTransform().TransInt16(result.Content, 20)); // 异常信息 crnProtocol.setError1(siemensNet.getByteTransform().TransBool(result.Content, 22, 2)); crnProtocol.setError2(siemensNet.getByteTransform().TransBool(result.Content, 24, 2)); crnProtocol.setError3(siemensNet.getByteTransform().TransBool(result.Content, 26, 2)); crnProtocol.setError4(siemensNet.getByteTransform().TransBool(result.Content, 28, 2)); crnProtocol.setError5(siemensNet.getByteTransform().TransBool(result.Content, 30, 2)); crnProtocol.setError6(siemensNet.getByteTransform().TransBool(result.Content, 32, 2)); crnProtocol.setXSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 34)); crnProtocol.setYSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 38)); crnProtocol.setZSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 42)); crnProtocol.setXDistance(siemensNet.getByteTransform().TransSingle(result.Content, 46)); crnProtocol.setYDistance(siemensNet.getByteTransform().TransSingle(result.Content, 50)); crnProtocol.setXDuration(siemensNet.getByteTransform().TransSingle(result.Content, 54)); crnProtocol.setYDuration(siemensNet.getByteTransform().TransSingle(result.Content, 58)); crnProtocol.setTaskNo(melsecMcNet.getByteTransform().TransInt16(result.Content, 0)); crnProtocol.setMode(melsecMcNet.getByteTransform().TransInt16(result.Content, 2)); crnProtocol.setStatus(melsecMcNet.getByteTransform().TransInt16(result.Content, 4)); crnProtocol.setBay(melsecMcNet.getByteTransform().TransInt16(result.Content, 6)); crnProtocol.setLevel(melsecMcNet.getByteTransform().TransInt16(result.Content, 8)); crnProtocol.setForkPos(melsecMcNet.getByteTransform().TransInt16(result.Content, 10)); crnProtocol.setLiftPos(melsecMcNet.getByteTransform().TransInt16(result.Content, 12)); crnProtocol.setWalkPos(melsecMcNet.getByteTransform().TransInt16(result.Content, 14)); crnProtocol.setFingerPos(melsecMcNet.getByteTransform().TransInt16(result.Content, 16)); crnProtocol.setLoaded(melsecMcNet.getByteTransform().TransInt16(result.Content, 18)); crnProtocol.setAlarm1(melsecMcNet.getByteTransform().TransInt16(result.Content, 20)); crnProtocol.setTemp1(melsecMcNet.getByteTransform().TransInt16(result.Content, 22)); crnProtocol.setTemp2(melsecMcNet.getByteTransform().TransInt16(result.Content, 24)); crnProtocol.setTemp3(melsecMcNet.getByteTransform().TransInt16(result.Content, 26)); crnProtocol.setTemp4(melsecMcNet.getByteTransform().TransInt16(result.Content, 28)); crnProtocol.setXSpeed(melsecMcNet.getByteTransform().TransSingle(result.Content, 30)); crnProtocol.setYSpeed(melsecMcNet.getByteTransform().TransSingle(result.Content, 34)); crnProtocol.setZSpeed(melsecMcNet.getByteTransform().TransSingle(result.Content, 38)); crnProtocol.setXDistance(melsecMcNet.getByteTransform().TransSingle(result.Content, 42)); crnProtocol.setYDistance(melsecMcNet.getByteTransform().TransSingle(result.Content, 46)); crnProtocol.setXDuration(melsecMcNet.getByteTransform().TransSingle(result.Content, 50)); crnProtocol.setYDuration(melsecMcNet.getByteTransform().TransSingle(result.Content, 54)); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId())); @@ -164,12 +197,12 @@ BasCrnp basCrnp = new BasCrnp(); basCrnp.setCrnNo(slave.getId()); if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))){ log.error("堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); log.error("堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); } } else { OutputQueue.CRN.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())); log.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取堆垛机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); } } @@ -181,32 +214,54 @@ log.error("堆垛机写入命令为空"); return false; } if (command.getAckFinish() == 1) { command.setTaskSend((short) 0); } else if (command.getAckFinish() == 0) { command.setTaskSend((short) 1); } command.setCrnNo(slave.getId()); short[] array = new short[9]; array[0] = command.getAckFinish(); array[1] = command.getTaskNo(); array[2] = command.getTaskMode(); array[3] = command.getSourcePosX(); array[4] = command.getSourcePosY(); array[5] = command.getSourcePosZ(); array[6] = command.getDestinationPosX(); array[7] = command.getDestinationPosY(); array[8] = command.getDestinationPosZ(); OperateResult result = siemensNet.Write("DB8.0", array); short[] array = new short[10]; array[0] = command.getTaskMode(); array[1] = command.getSourcePosY(); // 列 array[2] = command.getSourcePosZ(); // 层 array[3] = command.getSourcePosX(); // 排 array[4] = command.getDestinationPosY(); // 列 array[5] = command.getDestinationPosZ(); // 层 array[6] = command.getDestinationPosX(); // 排 array[7] = command.getTaskNo(); array[8] = command.getTaskSend(); array[9] = command.getAckFinish(); OperateResult result = melsecMcNet.Write("D1001", array); if (result.IsSuccess) { log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); return true; } else { OutputQueue.CRN.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())); log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()); OutputQueue.CRN.offer(MessageFormat.format("【{0}】写入堆垛机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); log.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); return false; } } /** * 心跳 */ private void heartbeat(){ if (heartBeatVal == 1) { heartBeatVal = 0; } else { heartBeatVal = 1; } OperateResult write = melsecMcNet.Write("D1000", heartBeatVal); if (!write.IsSuccess) { log.error("输送线plc编号={} 心跳失败", slave.getId()); } } @Override public void close() { siemensNet.ConnectClose(); melsecMcNet.ConnectClose(); } /******************************************************************************************/ @@ -216,9 +271,7 @@ CrnSlave slave = new CrnSlave(); slave.setId(1); slave.setIp("192.168.6.9"); slave.setRack(0); slave.setSlot(0); CrnThread crnThread = new CrnThread(slave); MelsecCrnThread crnThread = new MelsecCrnThread(slave); crnThread.connect(); crnThread.readStatus(); System.out.println(JSON.toJSONString(crnThread.crnProtocol)); @@ -323,5 +376,4 @@ // } } } src/main/java/com/zy/core/thread/SiemensCrnThread.java
File was renamed from src/main/java/com/zy/core/thread/CrnThread.java @@ -9,7 +9,7 @@ import com.core.common.SpringUtils; import com.zy.asrs.entity.BasCrnp; import com.zy.asrs.service.BasCrnpService; import com.zy.core.ThreadHandler; import com.zy.core.CrnThread; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.CrnStatusType; @@ -31,14 +31,14 @@ */ @Data @Slf4j public class CrnThread implements Runnable, ThreadHandler { public class SiemensCrnThread implements Runnable, CrnThread { private SiemensS7Net siemensNet; private CrnSlave slave; private CrnProtocol crnProtocol; private boolean resetFlag = false; public CrnThread(CrnSlave slave) { public SiemensCrnThread(CrnSlave slave) { this.slave = slave; } @@ -218,7 +218,7 @@ slave.setIp("192.168.6.9"); slave.setRack(0); slave.setSlot(0); CrnThread crnThread = new CrnThread(slave); SiemensCrnThread crnThread = new SiemensCrnThread(slave); crnThread.connect(); crnThread.readStatus(); System.out.println(JSON.toJSONString(crnThread.crnProtocol)); src/main/resources/application.yml
@@ -62,6 +62,15 @@ row: 1 bay: 0 lev: 1 # 堆垛机2 crn[1]: id: 1 ip: 192.168.6.10 port: 102 rack: 0 slot: 0 # 偏移量,当堆垛机站点列号=1时,偏移量=2 offset: 2 # 输送线 devp[0]: id: 1 src/main/webapp/views/crn.html
@@ -96,6 +96,7 @@ <span class="select-title">堆垛机号</span> <div class="select-container"> <label><input type="radio" name="crnSelect" value="1" checked> 1号堆垛机</label> <label><input type="radio" name="crnSelect" value="2"> 2号堆垛机</label> </div> </div> <!-- 源站/源库位 选择 -->