src/main/java/com/zy/Boot.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/common/model/AgvTaskCompleteDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/common/task/GhlnWcsScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/controller/OpenController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/MainProcess.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/protocol/StaProtocol.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/SiemensCrnThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/SiemensDevpThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/WrkMastMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/Boot.java
@@ -5,8 +5,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @EnableAsync @EnableScheduling @SpringBootApplication public class Boot extends SpringBootServletInitializer { src/main/java/com/zy/common/model/AgvTaskCompleteDto.java
New file @@ -0,0 +1,12 @@ package com.zy.common.model; import lombok.Data; /** * @author pang.jiabao * @description * @createDate 2024/7/29 11:04 */ @Data public class AgvTaskCompleteDto { } src/main/java/com/zy/common/task/GhlnWcsScheduler.java
New file @@ -0,0 +1,142 @@ package com.zy.common.task; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.SlaveType; import com.zy.core.model.Task; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.thread.SiemensDevpThread; import com.zy.entity.BasDevp; import com.zy.entity.WrkDetl; import com.zy.entity.WrkMast; import com.zy.service.BasDevpService; import com.zy.service.WrkDetlService; import com.zy.service.WrkMastService; import com.zy.utils.HttpHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; /** * @author pang.jiabao * @description 冠鸿龙南专用定时任务 * @createDate 2024/7/10 9:20 */ @Slf4j @Component public class GhlnWcsScheduler { @Autowired private BasDevpService basDevpService; @Autowired private WrkMastService wrkMastService; @Resource private WrkDetlService wrkDetlService; /** * wcs开门完成,通知agv取货放货 */ @Scheduled(cron = "0/5 * * * * ?") private void wcsOpenComplete() { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); StaProtocol staProtocol305 = devpThread.getStation().get(305); if (staProtocol305!= null && staProtocol305.getIfOpenDoor()) { BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 305)); if (basDevp.getWrkNo() != 0) { WrkMast wrkMast = wrkMastService.selectById(basDevp.getWrkNo()); if (wrkMast == null || wrkMast.getWhsType() == null || wrkMast.getWhsType() == 3){ return; } if (wrkMast.getWhsType() == 4) { return; } WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo())); // 判断开门完成,则通知agv可以放货 // 调用结果 boolean success = false; // 构造请求头 Map<String, Object> headers = new HashMap<>(); headers.put("Content-Type", "application/json;charset=UTF-8"); // 构造请求体 JSONObject jsonObject = new JSONObject(); jsonObject.put("matnr",wrkDetl.getMatnr()); jsonObject.put("batch",wrkDetl.getBatch()); jsonObject.put("flag",wrkMast.getIoType() > 100 ? "0" : "1"); String body = jsonObject.toJSONString(); String response = ""; try { response = new HttpHandler.Builder() .setUri("http://192.168.204.44:8010") .setPath("/api/TaskCreat/AllowEntry") .setHeaders(headers) .setJson(body) .build() .doPost(); if (!Cools.isEmpty(response)) { JSONObject jsonObject1 = JSONObject.parseObject(response); if ((Integer) jsonObject1.get("code") == 200) { success = true; wrkMast.setWhsType(3); wrkMastService.updateById(wrkMast); } } else { log.error("wcs开门完成通知agv接口异常接口失败!!!url:{};request:{};response:{}", "", body, response); } } catch (Exception e) { log.error("wcs开门完成通知agv接口异常:{}", e.getMessage()); } finally { log.error("wcs开门完成通知agv接口:{}", success); } } } } /** * 读已关门 */ @Scheduled(cron = "0/5 * * * * ?") private void wcsCloseComplete() { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); StaProtocol staProtocol = devpThread.getStation().get(305); if (staProtocol == null) { return; } else { staProtocol = staProtocol.clone(); } BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 305)); if (basDevp.getWrkNo() != 0 && basDevp.getWrkNo() != 9999) { WrkMast wrkMast = wrkMastService.selectById(basDevp.getWrkNo()); if (wrkMast == null || wrkMast.getWhsType() == null ||wrkMast.getWhsType() != 4) { return; } if (wrkMast.getIoType() == 1 && wrkMast.getWrkSts() == 1) { staProtocol.setWorkNo(wrkMast.getWrkNo()); staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); if(!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))){ log.error("入库关门完成失败"); } wrkMast.setWrkSts(2L); wrkMastService.updateById(wrkMast); basDevp.setWrkNo(staProtocol.getWorkNo()); basDevpService.updateById(basDevp); } else if (wrkMast.getIoType() == 101) { staProtocol.setWorkNo(9999); staProtocol.setStaNo(wrkMast.getSourceStaNo().shortValue()); if(!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))){ log.error("出库关门完成失败"); } basDevp.setWrkNo(staProtocol.getWorkNo()); basDevpService.updateById(basDevp); } } } } src/main/java/com/zy/controller/OpenController.java
New file @@ -0,0 +1,91 @@ package com.zy.controller; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.R; import com.core.exception.CoolException; import com.zy.common.model.AgvTaskCompleteDto; import com.zy.common.web.BaseController; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.SlaveType; import com.zy.core.model.Task; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.thread.SiemensDevpThread; import com.zy.entity.BasDevp; import com.zy.entity.WrkMast; import com.zy.service.BasDevpService; import com.zy.service.WrkMastService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; /** * Created by vincent on 2022/4/8 */ @Slf4j @RestController @RequestMapping("open/asrs") public class OpenController extends BaseController { private static final boolean auth = true; public static final ArrayList<String> APP_KEY_LIST = new ArrayList<String>() {{ add("ea1f0459efc02a79f046f982767939ae"); }}; @Autowired private BasDevpService basDevpService; @Autowired private WrkMastService wrkMastService; /** * agv取放货完成,通知wcs */ @PostMapping("/agv/agvTaskComplete") public synchronized R agvTaskComplete(@RequestHeader(required = false) String appkey, @RequestBody AgvTaskCompleteDto param, HttpServletRequest request) { auth(appkey, param, request); // 给305写关门 BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 305)); if (basDevp.getWrkNo() != 0) { WrkMast wrkMast = wrkMastService.selectById(basDevp.getWrkNo()); if(wrkMast.getWhsType() != null && wrkMast.getWhsType() == 3) { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); StaProtocol staProtocol305 = devpThread.getStation().get(305); if (!staProtocol305.getIfCloseDoor()) { // 没请求关闭 // 请求关闭 if(!MessageQueue.offer(SlaveType.Devp, 1, new Task(3, 0))){ log.error("请求关门失败"); R.parse("请求关门失败"); } staProtocol305.setOpenAskDoor(false); wrkMast.setWhsType(4); wrkMastService.updateById(wrkMast); } } } else { return R.parse("无任务"); } return R.ok("请求关门成功"); } private void auth(String appkey, Object obj, HttpServletRequest request) { log.info("{}接口被访问;appkey:{};请求数据:{}", request.getRequestURI(), appkey, JSON.toJSONString(obj)); request.setAttribute("cache", obj); if (!auth) { return; } if (Cools.isEmpty(appkey)) { throw new CoolException("认证失败,请确认appkey无误!"); } if (!APP_KEY_LIST.contains(appkey)) { throw new CoolException("认证失败,请确认appkey无误!"); } } } src/main/java/com/zy/core/MainProcess.java
@@ -78,11 +78,14 @@ mainService.outOfDevp(11); // 生成106出库任务 // mainService.generateOutbound(); // 106生成转移任务 mainService.autoMoveLoc(); // 生成106到105转移任务 // mainService.autoMoveLoc(); // 给plc写开门信号 mainService.writePlc305(); // 305入库调用底座到305 mainService.invokingBase(); // if (i>10){ // //空托盘自动出库 src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -98,6 +98,14 @@ private Boolean upcontactErr = false; //顶升电机接触器故障 private Boolean ifOpenDoor = false; // 是否打开 private Boolean ifCloseDoor = false; // 是否关闭 private Boolean openAskDoor = false; // 请求开门 private Boolean closeAskDoor = false; // 请求关门 public BasDevp toSqlModel(){ BasDevp basDevp = new BasDevp(); basDevp.setDevNo(siteId); @@ -108,7 +116,7 @@ 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.setLocType3((short) (high?1:0)); // 轻重类型{0:未知,1:轻库位,2:重库位} basDevp.setLocType1(high != low && low ? (short) 1 : (short) 2); basDevp.setInQty(inQty !=null ?(int)inQty : 0); return basDevp; src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -314,7 +314,7 @@ || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY()) || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX()) || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ()) || !command.isTraySize() == one.isTraySize() ){ try{ News.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one)); src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -5,7 +5,6 @@ import HslCommunication.Profinet.Siemens.SiemensPLCS; import HslCommunication.Profinet.Siemens.SiemensS7Net; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.SpringUtils; @@ -21,15 +20,16 @@ import com.zy.core.model.protocol.StaError1; import com.zy.core.model.protocol.StaProtocol; import com.zy.entity.BasDevp; import com.zy.entity.WrkMast; import com.zy.service.BasDevpService; import com.zy.service.WrkMastService; import com.zy.utils.News; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.text.MessageFormat; import java.util.*; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** @@ -108,6 +108,10 @@ write((StaProtocol)task.getData()); log.error("输送线下发命令:"+((StaProtocol) task.getData()).getWorkNo()+","+((StaProtocol) task.getData()).getStaNo()); break; // 写开门 case 3: write2((Integer) task.getData()); break; default: break; } @@ -120,6 +124,42 @@ } } private void write2(int flag) throws InterruptedException { if (flag == 0) { OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1); if (readOpenResult.IsSuccess) { boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1); booleans[1] = true; // 关门信号 booleans[0] = false; siemensS7Net.Write("DB100.826",booleans); } } else if(flag == 1) { OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1); if (readOpenResult.IsSuccess) { boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1); booleans[0] = true; // 开门信号 booleans[1] = false; siemensS7Net.Write("DB100.826",booleans); } } Thread.sleep(500); OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1); if (readOpenResult.IsSuccess) { boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1); StaProtocol staProtocol = station.get(305); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(305); station.put(305, staProtocol); } staProtocol.setOpenAskDoor(booleans[0]); staProtocol.setCloseAskDoor(booleans[1]); staProtocol.setIfOpenDoor(booleans[2]); staProtocol.setIfCloseDoor(booleans[3]); } } /** * 初始化站点状态 */ @@ -263,7 +303,36 @@ staProtocol.setPakMk(true); } } // 读二楼3区 OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB101.1600", (short) (6*8)); if (result2.IsSuccess) { for (int i = 13; i < staNos.size(); i++) { Integer siteId = staNos.get(i); // 站点编号 StaProtocol staProtocol = station.get(siteId); if (null == staProtocol) { staProtocol = new StaProtocol(); staProtocol.setSiteId(siteId); station.put(siteId, staProtocol); } staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result4.Content, (i-13)*8)); // 工作号 staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result4.Content, (i-13)*8 + 4)); // 目标站 boolean[] status = siemensS7Net.getByteTransform().TransBool(result4.Content, (i-13)*8 + 6, 2); staProtocol.setAutoing(status[0]); // 自动 staProtocol.setLoading(status[1]); // 有物 staProtocol.setInEnable(status[2]); // 可入 staProtocol.setOutEnable(status[3]);// 可出 staProtocol.setEmptyMk(status[4]); // 空板信号 staProtocol.setFullPlt(status[5]); // 满托盘 staProtocol.setHigh(status[6]); // 高库位 staProtocol.setLow(status[7]); // 低库位 if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { staProtocol.setPakMk(true); } } } // BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class); //RGV小车1 // Thread.sleep(100); @@ -343,72 +412,105 @@ staProtocol.setUpcontactErr(status[7]); } } // 一楼出入库模式切换 OperateResultExOne<byte[]> ioModeResult = siemensS7Net.Read("DB101.3724", (short) 1); if (ioModeResult.IsSuccess) { boolean[] ioModelBooleans = siemensS7Net.getByteTransform().TransBool(ioModeResult.Content, 0, 1); // log.info("读取出入库模式:" + Arrays.toString(ioModelBooleans)); WrkMastService wrkMastService = SpringUtils.getBean(WrkMastService.class); if (ioModelBooleans[0]) { // 100切入库 if (ioModeOf101 == IoModeType.PAKOUT_MODE) { int outCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101) .eq("sta_no", 100).in("wrk_sts", 12, 13, 14)); if (outCount == 0) { boolean[] booleans = new boolean[8]; booleans[0]=true; ioModeOf101 = IoModeType.PAKIN_MODE; siemensS7Net.Write("DB100.824",booleans); log.info("101切换入库模式成功"); } } } if (ioModelBooleans[1]) { // 100切出库 if (ioModeOf101 == IoModeType.PAKIN_MODE) { int inCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1) .eq("sta_no", 101).in("wrk_sts", 2, 3, 4)); if (inCount == 0) { boolean[] booleans = new boolean[8]; booleans[0]=true; ioModeOf101 = IoModeType.PAKOUT_MODE; siemensS7Net.Write("DB100.824",booleans); log.info("101切换出库模式成功"); } } } if (ioModelBooleans[2]) { // 102切入库 if (ioModeOf103 == IoModeType.PAKOUT_MODE) { int outCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101) .eq("sta_no", 102).in("wrk_sts", 12, 13, 14)); if (outCount == 0) { boolean[] booleans = new boolean[8]; booleans[1]=true; ioModeOf103 = IoModeType.PAKIN_MODE; siemensS7Net.Write("DB100.824",booleans); log.info("103切换入库模式成功"); } } } if (ioModelBooleans[3]) { // 102切出库 if (ioModeOf103 == IoModeType.PAKIN_MODE) { int inCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1) .eq("sta_no", 103).in("wrk_sts", 2, 3, 4)); if (inCount == 0) { boolean[] booleans = new boolean[8]; booleans[1]=true; ioModeOf103 = IoModeType.PAKOUT_MODE; siemensS7Net.Write("DB100.824",booleans); log.info("103切换出库模式成功"); } } // 读三区故障信息反馈 OperateResultExOne<byte[]> resultErr4 = siemensS7Net.Read("DB101.2096", (short) (6*2)); if (resultErr4.IsSuccess) { for (int i = 13; i < staNos.size(); i++) { boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr4.Content, (i-13) * 2 + 1, 1); StaProtocol staProtocol = station.get(staNos.get(i)); // 站点编号 staProtocol.setBreakerErr(status[0]); staProtocol.setInfraredErr(status[1]); staProtocol.setOutTimeErr(status[2]); staProtocol.setSeizeSeatErr(status[3]); staProtocol.setWrkYgoodsN(status[4]); staProtocol.setInverterErr(status[5]); staProtocol.setContactErr(status[6]); staProtocol.setUpcontactErr(status[7]); } } // 一楼出入库模式切换 // OperateResultExOne<byte[]> ioModeResult = siemensS7Net.Read("DB101.3724", (short) 1); // if (ioModeResult.IsSuccess) { // boolean[] ioModelBooleans = siemensS7Net.getByteTransform().TransBool(ioModeResult.Content, 0, 1); //// log.info("读取出入库模式:" + Arrays.toString(ioModelBooleans)); // WrkMastService wrkMastService = SpringUtils.getBean(WrkMastService.class); // if (ioModelBooleans[0]) { // 100切入库 // if (ioModeOf101 == IoModeType.PAKOUT_MODE) { // int outCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101) // .eq("sta_no", 100).in("wrk_sts", 12, 13, 14)); // if (outCount == 0) { // boolean[] booleans = new boolean[8]; // booleans[0]=true; // ioModeOf101 = IoModeType.PAKIN_MODE; // siemensS7Net.Write("DB100.824",booleans); // log.info("101切换入库模式成功"); // } // } // } // if (ioModelBooleans[1]) { // 100切出库 // if (ioModeOf101 == IoModeType.PAKIN_MODE) { // int inCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1) // .eq("sta_no", 101).in("wrk_sts", 2, 3, 4)); // if (inCount == 0) { // boolean[] booleans = new boolean[8]; // booleans[0]=true; // ioModeOf101 = IoModeType.PAKOUT_MODE; // siemensS7Net.Write("DB100.824",booleans); // log.info("101切换出库模式成功"); // } // } // } // if (ioModelBooleans[2]) { // 102切入库 // if (ioModeOf103 == IoModeType.PAKOUT_MODE) { // int outCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101) // .eq("sta_no", 102).in("wrk_sts", 12, 13, 14)); // if (outCount == 0) { // boolean[] booleans = new boolean[8]; // booleans[1]=true; // ioModeOf103 = IoModeType.PAKIN_MODE; // siemensS7Net.Write("DB100.824",booleans); // log.info("103切换入库模式成功"); // } // } // } // if (ioModelBooleans[3]) { // 102切出库 // if (ioModeOf103 == IoModeType.PAKIN_MODE) { // int inCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1) // .eq("sta_no", 103).in("wrk_sts", 2, 3, 4)); // if (inCount == 0) { // boolean[] booleans = new boolean[8]; // booleans[1]=true; // ioModeOf103 = IoModeType.PAKOUT_MODE; // siemensS7Net.Write("DB100.824",booleans); // log.info("103切换出库模式成功"); // } // } // } // } // OperateResultExOne<byte[]> resultErr3 = siemensS7Net.Read("DB13.400", (short) 3); // if (resultErr3.IsSuccess) { // if (staError1 == null){ // staError1 = new StaError1(); // 读开门信号 // OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1); // if (readOpenResult.IsSuccess) { // boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1); // StaProtocol staProtocol = station.get(305); // if (null == staProtocol) { // staProtocol = new StaProtocol(); // staProtocol.setSiteId(305); // station.put(305, staProtocol); // } // staProtocol.setOpenAskDoor(booleans[0]); // staProtocol.setCloseAskDoor(booleans[1]); // staProtocol.setIfOpenDoor(booleans[2]); // staProtocol.setIfCloseDoor(booleans[3]); //// log.info("开门信号:" + Arrays.toString(booleans)); // } //// OperateResultExOne<byte[]> resultErr3 = siemensS7Net.Read("DB13.400", (short) 3); //// if (resultErr3.IsSuccess) { //// if (staError1 == null){ //// staError1 = new StaError1(); // } // boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr3.Content, 0, 3); // staError1.setEMERGENCY_Stop_Core(status[0]); @@ -486,6 +588,12 @@ case 202: address = 408; break; case 203: address = 412; break; case 210: address = 440; break; case 300: address = 800; break; case 301: address = 804; break; case 302: address = 808; break; case 303: address = 812; break; case 304: address = 816; break; case 305: address = 820; break; default: } if(address == -1) { @@ -562,12 +670,13 @@ siemensS7Net.ConnectClose(); } // 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(); public static void main(String[] args) throws Exception { DevpSlave slave = new DevpSlave(); slave.setIp("10.10.10.18"); SiemensDevpThread devpThread = new SiemensDevpThread(slave); devpThread.connect(); devpThread.write2(0); devpThread.read(); // // 写 // StaProtocol staProtocol = devpThread.getStation().get(1); // staProtocol.setWorkNo((short) 232); @@ -580,7 +689,7 @@ // // 读 // devpThread.read(); // System.out.println(JSON.toJSONString(devpThread.station)); // // } } } src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -177,6 +177,7 @@ devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.error("输送线下发1:"+wrkNo+","+inSta.getBackSta()); return; } // 判断是否满足入库条件 @@ -186,14 +187,14 @@ && !staProtocol.isEmptyMk() && staProtocol.isPakMk()) { if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) { News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); staProtocol.setWorkNo(wrkNo); News.info("{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo); staProtocol.setStaNo(inSta.getBackSta().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.error("输送线下发1:"+wrkNo+","+inSta.getBackSta()); // News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); // // staProtocol.setWorkNo(wrkNo); // News.info("{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo); // staProtocol.setStaNo(inSta.getBackSta().shortValue()); // devpThread.setPakMk(staProtocol.getSiteId(), false); // MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); // log.error("输送线下发1:"+wrkNo+","+inSta.getBackSta()); continue; } // 判断重复工作档 @@ -681,17 +682,33 @@ // 命令下发区 -------------------------------------------------------------------------- // 下发站点信息 staProtocol.setWorkNo(wrkMast.getWrkNo()); staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) { continue; } // 更新工作档状态为14失败 wrkMast.setWrkSts(14L); // 下发站点信息 if (wrkMast.getSourceStaNo() == 106 && wrkMast.getWrkSts() == 12L) { wrkMast.setWrkSts(16L); wrkMast.setCrnNo(1); if (wrkMast.getStaNo() == 107) { wrkMast.setSourceStaNo(107); } else if(wrkMast.getStaNo()==104) { wrkMast.setSourceStaNo(105); } staProtocol.setStaNo((short) 106); log.info("----------106移库标识---------"); }else if(wrkMast.getSourceStaNo() == 105 && wrkMast.getWrkSts() == 16L) { staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); log.info("106移库完成,输送线发送105到104,源站为:" + staProtocol.getSiteId()); wrkMast.setWrkSts(14L); }else { staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); wrkMast.setWrkSts(14L); } staProtocol.setWorkNo(wrkMast.getWrkNo()); if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) { continue; } wrkMast.setCrnEndTime(new Date()); if (wrkMastMapper.updateById(wrkMast) != 0) { @@ -991,6 +1008,7 @@ // 获取工作状态为11(生成出库ID)的出库工作档 // WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo()); List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo()); // todo 限制出库到305的工作档,如果配置outModel不等于Y,则跳过 for (WrkMast wrkMast : wrkMasts) { if (wrkMast == null) { continue; @@ -1041,7 +1059,7 @@ if (staProtocol.isAutoing() && staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { // 命令下发区 -------------------------------------------------------------------------- log.warn("堆垛机出库命令下发:"+staProtocol.getWorkNo()+","+staProtocol.isOutEnable()+","+staProtocol.getSiteId()); // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { // continue; @@ -1102,9 +1120,9 @@ break; // return; } if(crnStn.getStaNo() == 105) { continue; } // if(crnStn.getStaNo() == 105) { // continue; // } News.warnNoLog(""+mark+" - 2"+" - 12"+" - 命令下发 : 工作号={},源排={},源列={},源层={},目标排={},目标列={},目标层={}",wrkMast.getWrkNo().shortValue() ,sourceSta.getRow1().shortValue(),sourceSta.getBay1().shortValue(),sourceSta.getLev1().shortValue() @@ -2996,82 +3014,42 @@ } } /** * 判断106站点状态,有物+有任务号,则生成移库任务 */ public synchronized void generateOutbound() { WrkMast wrkMast = wrkMastMapper.selectBy104(); if (wrkMast == null) { return; } BasCrnp basCrnp = basCrnpService.selectById(1); if (!basCrnp.getInEnable().equals("Y") && !basCrnp.getOutEnable().equals("Y")) { return; } CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, 1); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { return; } // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { return; } // 已经存在吊车执行任务时,则过滤 if (wrkMastMapper.selectWorking(1) != null) { return; } LocMast sourceSta = locMastService.selectById(wrkMast.getSourceLocNo()); // 1.堆垛机开始移动 CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(1); // 堆垛机编号 crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 // crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 crnCommand.setSourcePosX(sourceSta.getRow1().shortValue()); // 源库位排 crnCommand.setSourcePosY(sourceSta.getBay1().shortValue()); // 源库位列 crnCommand.setSourcePosZ(sourceSta.getLev1().shortValue()); // 源库位层 crnCommand.setDestinationPosX((short) 3); // 目标库位排 crnCommand.setDestinationPosY((short) 3); // 目标库位列 crnCommand.setDestinationPosZ((short) 1); // 目标库位层 crnCommand.setTraySize(sourceSta.getLocType1() == 2); //库位类型 if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { News.error("到106站点堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); } else { // 修改工作档状态 11.生成出库ID => 12.吊车出库中 Date now = new Date(); wrkMast.setWrkSts(12L); wrkMast.setCrnStrTime(now); wrkMast.setModiTime(now); if (wrkMastMapper.updateById(wrkMast) == 0) { News.error("到106站点修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); } } } public synchronized void autoMoveLoc() { WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_sts", 16L)); if (wrkMast == null || wrkMast.getStaNo() != 104 && wrkMast.getStaNo() != 107) { return; } // 判断源站点情况 有任务号,有物,自动 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); StaProtocol staProtocol106 = devpThread.getStation().get(106); StaProtocol staProtocol105 = devpThread.getStation().get(105); StaProtocol staProtocol107 = devpThread.getStation().get(107); if (staProtocol106 == null) { return; } else { staProtocol106 = staProtocol106.clone(); } // if (staProtocol105 == null) { // return; // } else { // staProtocol105 = staProtocol105.clone(); // } if (staProtocol105 == null) { return; } else { staProtocol105 = staProtocol105.clone(); } if (staProtocol107 == null) { return; } else { staProtocol107 = staProtocol107.clone(); } // 判断出库站点情况 if (wrkMast.getStaNo() == 104) { // 判断出库站点情况,可入,堆垛机可以取货,可出,堆垛机可以放货 if (!staProtocol106.isInEnable() || !staProtocol105.isOutEnable()) { return; } } else if (wrkMast.getStaNo() == 107) { if (!staProtocol106.isInEnable() || !staProtocol107.isOutEnable()) { return; } } // 获取堆垛机信息 并 判断是否可入出 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, 1); @@ -3102,7 +3080,7 @@ crnCommand.setSourcePosX((short) 3); // 源库位排 crnCommand.setSourcePosY((short) 28); // 源库位列 crnCommand.setSourcePosZ((short) 1); // 源库位层 crnCommand.setDestinationPosX((short) 2); // 目标库位排 crnCommand.setDestinationPosX((short) 1); // 目标库位排 crnCommand.setDestinationPosY((short) 28); // 目标库位列 crnCommand.setDestinationPosZ((short) 1); // 目标库位层 if(wrkMast.getStaNo() == 104) { // 目标站104,出到105位置 @@ -3110,14 +3088,57 @@ crnCommand.setDestinationPosY((short) 4); // 目标库位列 crnCommand.setDestinationPosZ((short) 1); // 目标库位层 } crnCommand.setCommand((short)1); crnCommand.setTraySize(true); //库位类型 if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { if (!MessageQueue.offer(SlaveType.Crn, 1, new Task(2, crnCommand))) { News.error("106移库1号堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); } // else { // wrkMast.setCrnNo(2); // wrkMastMapper.updateById(wrkMast); // } News.infoNoLog("106移库2号堆垛机入出库作业下发:库位移转完成"); News.infoNoLog("106移库给1号堆垛机下发完成"); } public synchronized void writePlc305() { BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 305)); if (basDevp.getWrkNo() != 0 && basDevp.getWrkNo() != 9999) { WrkMast wrkMast = wrkMastService.selectById(basDevp.getWrkNo()); if(wrkMast != null && wrkMast.getWhsType() != null && wrkMast.getWhsType() == 2) { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); StaProtocol staProtocol305 = devpThread.getStation().get(305); if (!staProtocol305.getOpenAskDoor() && !staProtocol305.getIfOpenDoor()) { // 没请求打开 // 请求打开 if(!MessageQueue.offer(SlaveType.Devp, 1, new Task(3, 1))){ log.error("请求开门失败"); } } } } } public synchronized void readPlc305() { WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_sts", 16L)); } public synchronized void invokingBase() { WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_sts", 1L).eq("io_type", 1) .eq("source_sta_no", 305)); if (wrkMast != null) { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); StaProtocol staProtocol= devpThread.getStation().get(wrkMast.getStaNo()); if (staProtocol == null) { return; } else { staProtocol = staProtocol.clone(); } if(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() == 0) { staProtocol.setWorkNo(wrkMast.getWrkNo()); staProtocol.setStaNo(wrkMast.getSourceStaNo().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); boolean result = MessageQueue.offer(SlaveType.Devp,1, new Task(2, staProtocol)); log.info("入库请求底座------"); } } } } src/main/resources/application.yml
@@ -8,7 +8,7 @@ name: @pom.build.finalName@ datasource: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://127.0.0.1:1433;databasename=ghlnasrs url: jdbc:sqlserver://10.10.10.243:1433;databasename=ghlnasrs username: sa password: sa@123 mvc: @@ -34,7 +34,7 @@ enable: false wms: url: 127.0.0.1:8080/ghlnwms url: 10.10.10.243:8080/ghlnwms # 下位机配置 wcs-slave: @@ -202,21 +202,22 @@ # LED1 led[0]: id: 1 ip: 10.10.10.101 ip: 10.10.10.190 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 100 staArr: 101,100 # LED2 led[1]: id: 2 ip: 10.10.10.102 ip: 10.10.10.191 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 102 staArr: 102,103 # LED3 led[2]: id: 3 ip: 10.10.10.103 ip: 10.10.10.192 port: 5005 devpPlcId: ${wcs-slave.devp[0].id} staArr: 104 src/main/resources/mapper/WrkMastMapper.xml
@@ -111,7 +111,7 @@ </select> <select id="selectPakOutStep2" resultMap="BaseResultMap"> select top 1 * from dbo.asr_wrk_mast where source_sta_no=#{sourceStaNo} and wrk_sts=12 and io_type>100 order by io_pri desc,io_time desc,wrk_no ASC select top 1 * from dbo.asr_wrk_mast where source_sta_no=#{sourceStaNo} and (wrk_sts=12 or wrk_sts = 16) and io_type>100 order by io_pri desc,io_time desc,wrk_no ASC </select> <select id="selectLocMove" resultMap="BaseResultMap">