src/main/java/com/zy/asrs/WrkMast.java
New file @@ -0,0 +1,469 @@ package com.zy.asrs; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.core.common.Cools; import com.core.common.SpringUtils; import com.zy.asrs.entity.BasCrnp; import com.zy.asrs.entity.BasWrkIotype; import com.zy.asrs.entity.BasWrkStatus; import com.zy.asrs.entity.LocMast; import com.zy.asrs.service.BasCrnpService; import com.zy.asrs.service.LocMastService; import com.zy.system.entity.User; import com.zy.system.service.UserService; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; @Data @TableName("asr_wrk_mast") public class WrkMast implements Serializable { private static final long serialVersionUID = 1L; /** * 工作号 */ @ApiModelProperty(value = "工作号") @TableId(value = "wrk_no", type = IdType.AUTO) @TableField("wrk_no") private Long wrkNo; /** * plc工作号 */ @ApiModelProperty(value = "plc工作号") @TableField("plc_wrk_no") private Integer plcWrkNo; @ApiModelProperty(value = "") @TableField("inv_wh") private String invWh; @ApiModelProperty(value = "") private Date ymd; @ApiModelProperty(value = "") private String mk; @ApiModelProperty(value = "") @TableField("whs_type") private Integer whsType; /** * 工作状态 */ @ApiModelProperty(value = "工作状态") @TableField("wrk_sts") private Long wrkSts; /** * 入出库类型 */ @ApiModelProperty(value = "入出库类型") @TableField("io_type") private Integer ioType; /** * 堆垛机 */ @ApiModelProperty(value = "堆垛机") @TableField("crn_no") private String crnNo; @ApiModelProperty(value = "") @TableField("sheet_no") private String sheetNo; /** * 优先级 */ @ApiModelProperty(value = "优先级") @TableField("io_pri") private Double ioPri; @ApiModelProperty(value = "") @TableField("wrk_date") private Date wrkDate; /** * 目标库位 */ @ApiModelProperty(value = "目标库位") @TableField("loc_no") private String locNo; /** * 源库位 */ @ApiModelProperty(value = "源库位") @TableField("source_loc_no") private String sourceLocNo; @ApiModelProperty(value = "") @TableField("loc_sts") private String locSts; /** * 拣料 */ @ApiModelProperty(value = "拣料") private String picking; @ApiModelProperty(value = "") @TableField("link_mis") private String linkMis; @ApiModelProperty(value = "") @TableField("online_yn") private String onlineYn; @ApiModelProperty(value = "") @TableField("upd_mk") private String updMk; /** * 退出 */ @ApiModelProperty(value = "退出") @TableField("exit_mk") private String exitMk; @ApiModelProperty(value = "") @TableField("plt_type") private Integer pltType; /** * 空板 */ @ApiModelProperty(value = "空板") @TableField("empty_mk") private String emptyMk; /** * 工作时间 */ @ApiModelProperty(value = "工作时间") @TableField("io_time") private Date ioTime; @ApiModelProperty(value = "") @TableField("ctn_type") private Integer ctnType; @ApiModelProperty(value = "") private String packed; @ApiModelProperty(value = "") @TableField("ove_mk") private String oveMk; @ApiModelProperty(value = "") @TableField("mtn_type") private Double mtnType; @ApiModelProperty(value = "") @TableField("user_no") private String userNo; /** * 堆垛机启动时间 */ @ApiModelProperty(value = "堆垛机启动时间") @TableField("crn_str_time") private Date crnStrTime; /** * 堆垛机停止时间 */ @ApiModelProperty(value = "堆垛机停止时间") @TableField("crn_end_time") private Date crnEndTime; @ApiModelProperty(value = "") @TableField("plc_str_time") private Date plcStrTime; @ApiModelProperty(value = "") @TableField("crn_pos_time") private Date crnPosTime; @ApiModelProperty(value = "") @TableField("load_time") private Double loadTime; @ApiModelProperty(value = "") @TableField("exp_time") private Double expTime; @ApiModelProperty(value = "") @TableField("ref_wrkno") private Double refWrkno; /** * 拣料时间 */ @ApiModelProperty(value = "拣料时间") @TableField("ref_iotime") private Date refIotime; /** * 修改人员 */ @ApiModelProperty(value = "修改人员") @TableField("modi_user") private Long modiUser; /** * 修改时间 */ @ApiModelProperty(value = "修改时间") @TableField("modi_time") private Date modiTime; /** * 创建者 */ @ApiModelProperty(value = "创建者") @TableField("appe_user") private Long appeUser; /** * 添加时间 */ @ApiModelProperty(value = "添加时间") @TableField("appe_time") private Date appeTime; @ApiModelProperty(value = "") @TableField("pause_mk") private String pauseMk; @ApiModelProperty(value = "") @TableField("error_time") private Date errorTime; @ApiModelProperty(value = "") @TableField("error_memo") private String errorMemo; @ApiModelProperty(value = "") @TableField("ctn_kind") private Integer ctnKind; @ApiModelProperty(value = "") @TableField("manu_type") private String manuType; /** * 备注 */ @ApiModelProperty(value = "备注") private String memo; @ApiModelProperty(value = "") @TableField("sc_weight") private Double scWeight; @ApiModelProperty(value = "") @TableField("log_mk") private String logMk; @ApiModelProperty(value = "") @TableField("log_err_time") private Date logErrTime; @ApiModelProperty(value = "") @TableField("log_err_memo") private String logErrMemo; /** * 条码 */ @ApiModelProperty(value = "条码") private String barcode; // Y:销售订单出库任务 @ApiModelProperty(value = "") @TableField("Pdc_type") private String PdcType; @ApiModelProperty(value = "") @TableField("ctn_no") private String ctnNo; /** * 满板 */ @ApiModelProperty(value = "满板") @TableField("full_plt") private String fullPlt; /** * 先入品 / 双重入库 */ @ApiModelProperty(value = "先入品") @TableField("pre_have") private String preHave; /** * 空操作 / 取货无箱 */ @ApiModelProperty(value = "空操作") @TableField("take_none") private String takeNone; public WrkMast() { } public String getYmd$() { if (Cools.isEmpty(this.ymd)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.ymd); } public String getCrnNo$() { BasCrnpService service = SpringUtils.getBean(BasCrnpService.class); BasCrnp basCrnp = service.selectById(this.crnNo); if (!Cools.isEmpty(basCrnp)) { return String.valueOf(basCrnp.getCrnNo()); } return null; } public String getWrkDate$() { if (Cools.isEmpty(this.wrkDate)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.wrkDate); } public String getLocNo$() { LocMastService service = SpringUtils.getBean(LocMastService.class); LocMast locMast = service.selectById(this.locNo); if (!Cools.isEmpty(locMast)) { return String.valueOf(locMast.getLocNo()); } return null; } public String getSourceLocNo$() { LocMastService service = SpringUtils.getBean(LocMastService.class); LocMast locMast = service.selectById(this.sourceLocNo); if (!Cools.isEmpty(locMast)) { return String.valueOf(locMast.getLocNo()); } return null; } public String getIoTime$() { if (Cools.isEmpty(this.ioTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.ioTime); } public String getCrnStrTime$() { if (Cools.isEmpty(this.crnStrTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.crnStrTime); } public String getCrnEndTime$() { if (Cools.isEmpty(this.crnEndTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.crnEndTime); } public String getPlcStrTime$() { if (Cools.isEmpty(this.plcStrTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.plcStrTime); } public String getCrnPosTime$() { if (Cools.isEmpty(this.crnPosTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.crnPosTime); } public String getRefIotime$() { if (Cools.isEmpty(this.refIotime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.refIotime); } public String getModiUser$() { UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.modiUser); if (!Cools.isEmpty(user)) { return String.valueOf(user.getUsername()); } return null; } public String getModiTime$() { if (Cools.isEmpty(this.modiTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime); } public String getAppeUser$() { UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.appeUser); if (!Cools.isEmpty(user)) { return String.valueOf(user.getUsername()); } return null; } public String getAppeTime$() { if (Cools.isEmpty(this.appeTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime); } public String getErrorTime$() { if (Cools.isEmpty(this.errorTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.errorTime); } // public void setErrorMemo(String errorMemo) { // if (errorMemo.length() > 255) { // errorMemo = errorMemo.substring(0, 150); // } // this.errorMemo = errorMemo; // } public String getLogErrTime$() { if (Cools.isEmpty(this.logErrTime)) { return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.logErrTime); } } src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -231,8 +231,6 @@ if (wrkMast != null) { vo.setWrkSts(wrkMast.getWrkSts$()); // 工作状态 vo.setIoType(wrkMast.getIoType$()); // 入出库类型 vo.setSourceStaNo(wrkMast.getSourceStaNo$()); vo.setStaNo(wrkMast.getStaNo$()); vo.setSourceLocNo(wrkMast.getSourceLocNo$()); vo.setLocNo(wrkMast.getLocNo$()); } @@ -275,8 +273,6 @@ if (crnProtocol.getTaskNo() > 0) { WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo()); if (wrkMast != null) { vo.setSourceStaNo(wrkMast.getSourceStaNo$()); vo.setStaNo(wrkMast.getStaNo$()); vo.setWrkSts(wrkMast.getWrkSts$()); // 工作状态 vo.setIoType(wrkMast.getIoType$()); // 入出库类型 vo.setSourceLocNo(wrkMast.getSourceLocNo$()); src/main/java/com/zy/asrs/controller/CrnController.java
@@ -20,7 +20,6 @@ import com.zy.asrs.service.BasCrnpService; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.service.impl.MainServiceImpl; import com.zy.asrs.utils.VersionUtils; import com.zy.core.CrnThread; import com.zy.core.cache.MessageQueue; @@ -65,8 +64,6 @@ private BasCrnErrorMapper basCrnErrorMapper; @Autowired private BasCrnpService basCrnpService; @Autowired private MainServiceImpl mainService; @Autowired private LocMastService locMastService; @@ -160,8 +157,6 @@ WrkMast wrkMast = wrkMastService.selectById(crnProtocol.getTaskNo()); if (wrkMast != null) { vo.setStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc()); // 模式状态 vo.setSourceStaNo(wrkMast.getSourceStaNo$()); // 源站 vo.setStaNo(wrkMast.getStaNo$()); // 目标站 vo.setSourceLocNo(wrkMast.getSourceLocNo()); // 源库位 vo.setLocNo(wrkMast.getLocNo()); // 目标库位 } src/main/java/com/zy/asrs/controller/RgvController.java
File was deleted src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -28,9 +28,16 @@ * 工作号 */ @ApiModelProperty(value= "工作号") @TableId(value = "wrk_no", type = IdType.INPUT) @TableId(value = "wrk_no", type = IdType.AUTO) @TableField("wrk_no") private Integer wrkNo; private Long wrkNo; /** * 工作号 */ @ApiModelProperty(value= "工作号") @TableField("plc_wrk_no") private Integer plcWrkNo; @ApiModelProperty(value= "") @TableField("inv_wh") @@ -65,7 +72,7 @@ */ @ApiModelProperty(value= "堆垛机") @TableField("crn_no") private Integer crnNo; private String crnNo; @ApiModelProperty(value= "") @TableField("sheet_no") @@ -89,19 +96,6 @@ @TableField("loc_no") private String locNo; /** * 目标站 */ @ApiModelProperty(value= "目标站") @TableField("sta_no") private Integer staNo; /** * 源站 */ @ApiModelProperty(value= "源站") @TableField("source_sta_no") private Integer sourceStaNo; /** * 源库位 @@ -358,23 +352,7 @@ return null; } public String getStaNo$(){ BasDevpService service = SpringUtils.getBean(BasDevpService.class); BasDevp basDevp = service.selectById(this.staNo); if (!Cools.isEmpty(basDevp)){ return String.valueOf(basDevp.getDevNo()); } return null; } public String getSourceStaNo$(){ BasDevpService service = SpringUtils.getBean(BasDevpService.class); BasDevp basDevp = service.selectById(this.sourceStaNo); if (!Cools.isEmpty(basDevp)){ return String.valueOf(basDevp.getDevNo()); } return null; } public String getSourceLocNo$(){ LocMastService service = SpringUtils.getBean(LocMastService.class); @@ -470,12 +448,6 @@ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.errorTime); } public void setErrorMemo(String errorMemo) { if (errorMemo.length() > 255) { errorMemo = errorMemo.substring(0, 150); } this.errorMemo = errorMemo; } public String getLogErrTime$(){ if (Cools.isEmpty(this.logErrTime)){ src/main/java/com/zy/asrs/service/impl/CtuMainServiceImpl.java
@@ -1,10 +1,11 @@ package com.zy.asrs.service.impl; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.mapper.*; import com.zy.asrs.service.*; import com.zy.common.service.CommonService; import com.zy.asrs.mapper.WrkMastMapper; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.WrkMastService; import com.zy.common.utils.News; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; @@ -16,7 +17,6 @@ import com.zy.core.thread.SiemensDevpThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,7 +27,7 @@ * Created by vincent on 2020/8/6 */ @Slf4j @Service("mainService") @Service("ctuMainService") @Transactional public class CtuMainServiceImpl { @@ -36,8 +36,12 @@ @Autowired private SlaveProperties slaveProperties; @Autowired private WrkMastMapper wrkMastMapper; @Autowired private LocMastService locMastService; @Autowired private WrkMastService wrkMastService; @@ -62,28 +66,49 @@ staProtocol = staProtocol.clone(); } // 判断是否满足条件 if (!staProtocol.isLoading()) { continue; } if (staProtocol.isAutoing() && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && (staProtocol.getWorkNo() == 0 || staProtocol.getWorkNo() == 9999) && staProtocol.isPakMk()) { // if (!staProtocol.isLoading()) { // continue; // } // && staProtocol.isInEnable() if (staProtocol.isAutoing() && !staProtocol.isEmptyMk() && staProtocol.isPakMk()) { WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo()); if (wrkMast.getWrkSts() == 106) { if (wrkMast != null) { //下发移动任务,并生成入库工作档 WrkMast in = new WrkMast(); wrkMast.setWrkSts(223L); wrkMast.setModiTime(new Date()); wrkMastService.updateById(wrkMast); in.setSourceLocNo("1007"); in.setLocNo(wrkMast.getSourceLocNo()); in.setIoType(10); in.setIoTime(new Date()); in.setWrkSts(1L); // 工作状态:11.生成出库ID in.setIoPri(13D); // 优先级:13 in.setFullPlt("Y"); // 满板:Y in.setPicking("N"); // 拣料 in.setExitMk("N"); // 退出 in.setEmptyMk("Y"); // 空板 in.setLinkMis("N"); in.setAppeTime(new Date()); in.setModiTime(new Date()); in.setBarcode(wrkMast.getBarcode()); in.setPlcWrkNo(wrkMast.getPlcWrkNo()); wrkMastService.insert(in); LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo()); locMast.setLocSts("S"); locMast.setModiTime(new Date()); locMastService.selectById(locMast); } } } } } } else { log.info("" + mark + " - " + staProtocol.getWorkNo() + " - 找不到对应的工作档"); } } } } } /** * 出库站到拣料站 * 出库 */ public synchronized void generateStoreWrkFile0(Integer mark) { public synchronized void out(Integer mark) { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 @@ -100,13 +125,12 @@ if (!staProtocol.isLoading()) { continue; } if (staProtocol.isAutoing() && staProtocol.isOutEnable() && !staProtocol.isEmptyMk() && (staProtocol.getWorkNo() == 0 || staProtocol.getWorkNo() == 9999) && staProtocol.isPakMk()) { //&& staProtocol.isOutEnable() if (staProtocol.isAutoing() && !staProtocol.isEmptyMk() && (staProtocol.getWorkNo() == 0 || staProtocol.getWorkNo() == 9999) && staProtocol.isPakMk()) { News.warnNoLog("" + mark + " - 0" + " - 开始执行"); // 判断重复工作档 WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_sta_no", staProtocol.getSiteId()).eq("wrk_sts", 105)); // 106也算上,以后106-》107用于更新库存 WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("loc_no", "1001").in("wrk_sts", 106,107)); if (wrkMast == null) { continue; } @@ -114,14 +138,14 @@ // 命令下发区 -------------------------------------------------------------------------- // 更新站点信息 且 下发plc命令 staProtocol.setWorkNo(wrkMast.getWrkNo()); staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); staProtocol.setWorkNo(wrkMast.getPlcWrkNo()); staProtocol.setStaNo((short) 1004); devpThread.setPakMk(staProtocol.getSiteId(), false); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); log.info("输送线下发3:{},{}", wrkMast.getWrkNo(), wrkMast.getStaNo()); log.info("输送线下发3:{},{}", wrkMast.getWrkNo(), 1004); if (result) { // 更新工作主档 wrkMast.setWrkSts(106L); wrkMast.setWrkSts(108L); wrkMast.setModiTime(new Date()); if (wrkMastMapper.updateById(wrkMast) == 0) { News.error("" + mark + " - 1" + " - 更新工作档失败!!! [工作号:{}]", wrkMast.getWrkNo()); @@ -131,9 +155,7 @@ } } else { News.errorNoLog("" + mark + " - 6" + " - 站点信息不符合入库条件!!!" + " 自动信号:" + staProtocol.isLoading() + "、可入信号:" + staProtocol.isInEnable() + "、空板信号:" + staProtocol.isEmptyMk() + "、工作号:" + staProtocol.getWorkNo() + "、锁定标记" + staProtocol.isPakMk() + "、入库印记:" + staProtocol.getStamp()); News.errorNoLog("" + mark + " - 6" + " - 站点信息不符合入库条件!!!" + " 自动信号:" + staProtocol.isLoading() + "、可入信号:" + staProtocol.isInEnable() + "、空板信号:" + staProtocol.isEmptyMk() + "、工作号:" + staProtocol.getWorkNo() + "、锁定标记" + staProtocol.isPakMk() + "、入库印记:" + staProtocol.getStamp()); } } } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
Diff too large src/main/java/com/zy/core/CtuMainProcess.java
@@ -46,8 +46,8 @@ // 入库 ctuMainService.generateStoreWrkFile(1); // 拣料完成 //ctuMainService.checkCpm(1); // 出库 ctuMainService.out(1); } catch (Exception e) { e.printStackTrace(); src/main/java/com/zy/core/MainProcess.java
@@ -1,106 +1,106 @@ package com.zy.core; import com.zy.asrs.service.impl.MainServiceImpl; import com.zy.core.properties.SystemProperties; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; import java.util.ArrayList; /** * WCS主流程 * Created by vincent on 2020/8/6 */ @Data @Slf4j @Component public class MainProcess { @Autowired private MainServiceImpl mainService; // 所属线程 private Thread thread; // 频率 private int i = 0; private boolean rgcWrk = true; /** * =====>> 开始工作 */ public void start(){ thread = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { try { // 间隔 Thread.sleep(1000); // 系统运行状态判断 if (!SystemProperties.WCS_RUNNING_STATUS.get()) { continue; } // 演示 // mainService.crnDemoOfLocMove1(); // 入出库模式切换函数 // mainService.ioConvert(); // mainService.stnToCrnStnPick2(); // 入库 ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档 mainService.generateStoreWrkFile(1); // 组托 // mainService.generateStoreWrkFile0(2); // WMS入库 Thread.sleep(400); // 拣料、并板、盘点再入库 mainService.stnToCrnStnPick(3); // 出库 ===>> 堆垛机出库站到出库站 mainService.crnStnToOutStn(4); // 入出库 ===>> 堆垛机入出库作业下发 mainService.crnIoExecute(5); // 入出库增强 ===>> 堆垛机命令下发后,异步修改工作档状态 // mainService.crnIoWrkMast(); // 入库 ===>> 执行对工作档的完成操作 mainService.storeFinished(6); // 堆垛机异常信息记录 mainService.recCrnErr(7); // 入库 ===>> 空栈板初始化入库,叉车入库站放货 mainService.storeEmptyPlt(8); // 出库 ===>> 工作档信息写入led显示器 mainService.ledExecute(9); // 其他 ===>> LED显示器复位,显示默认信息 mainService.ledReset(); mainService.outOfDevp(11); // if (i>10){ // //空托盘自动出库 // mainService.autoEmptyOut(); // //空托盘自动入库 // mainService.autoEmptyIn(); // i=0; //package com.zy.core; // //import com.zy.asrs.service.impl.MainServiceImpl; //import com.zy.core.properties.SystemProperties; //import lombok.Data; //import lombok.extern.slf4j.Slf4j; //import org.springframework.beans.factory.annotation.Autowired; //import org.springframework.beans.factory.annotation.Value; //import org.springframework.stereotype.Component; // //import javax.annotation.PreDestroy; //import java.util.ArrayList; // ///** // * WCS主流程 // * Created by vincent on 2020/8/6 // */ //@Data //@Slf4j //@Component //public class MainProcess { // // @Autowired // private MainServiceImpl mainService; // // 所属线程 // private Thread thread; // // 频率 // private int i = 0; // private boolean rgcWrk = true; // // /** // * =====>> 开始工作 // */ // public void start(){ // thread = new Thread(() -> { // while (!Thread.currentThread().isInterrupted()) { // try { // // // 间隔 // Thread.sleep(1000); // // // 系统运行状态判断 // if (!SystemProperties.WCS_RUNNING_STATUS.get()) { // continue; // } // i++; } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); } @PreDestroy public void shutDown(){ if (thread != null) thread.interrupt(); } } // // // 演示 //// mainService.crnDemoOfLocMove1(); // // // 入出库模式切换函数 //// mainService.ioConvert(); // // // // mainService.stnToCrnStnPick2(); // // // 入库 ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档 // mainService.generateStoreWrkFile(1); // 组托 //// mainService.generateStoreWrkFile0(2); // WMS入库 // Thread.sleep(400); // // // // 拣料、并板、盘点再入库 // mainService.stnToCrnStnPick(3); // // 出库 ===>> 堆垛机出库站到出库站 // mainService.crnStnToOutStn(4); // // 入出库 ===>> 堆垛机入出库作业下发 // mainService.crnIoExecute(5); // // 入出库增强 ===>> 堆垛机命令下发后,异步修改工作档状态 //// mainService.crnIoWrkMast(); // // 入库 ===>> 执行对工作档的完成操作 // mainService.storeFinished(6); // // 堆垛机异常信息记录 // mainService.recCrnErr(7); // // 入库 ===>> 空栈板初始化入库,叉车入库站放货 // mainService.storeEmptyPlt(8); // // 出库 ===>> 工作档信息写入led显示器 // mainService.ledExecute(9); // // 其他 ===>> LED显示器复位,显示默认信息 // mainService.ledReset(); // // mainService.outOfDevp(11); // //// if (i>10){ //// //空托盘自动出库 //// mainService.autoEmptyOut(); //// //空托盘自动入库 //// mainService.autoEmptyIn(); //// i=0; //// } //// i++; // // // } catch (Exception e) { // e.printStackTrace(); // } // } // }); // thread.start(); // } // // @PreDestroy // public void shutDown(){ // if (thread != null) thread.interrupt(); // } // //} src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -5,19 +5,14 @@ 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.core.exception.CoolException; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.BasRgvMap; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.service.BasRgvMapService; import com.zy.common.utils.News; import com.zy.core.DevpThread; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.OutputQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.IoModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.DevpSlave; @@ -47,33 +42,30 @@ private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>(); private short heartBeatVal = 1; private StaError1 staError1; // public static final ArrayList<Integer> staNos = new ArrayList<Integer>() {{ // // }}; public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{ add(100);add(101);add(102);add(103); add(104);add(105);add(106);add(107); add(108);add(109);add(110);add(111); add(112);add(113);add(114);add(115); add(116);add(117);add(118);add(119); add(120);add(121);add(122);add(123); add(200);add(201);add(202);add(203); add(204);add(205);add(206);add(207); add(208);add(209);add(210);add(211); add(212);add(213);add(214);add(215); add(216);add(217);add(218);add(219); add(220);add(221);add(222);add(223); public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{ add(1001); add(1002); add(1003); add(1004); add(1005); add(1006); add(1007); add(101); add(102); add(103); add(104); add(105); add(106); add(107); add(108); }}; public static final ArrayList<Integer> BarcodeList = new ArrayList<Integer>() {{ add(1); add(2); }}; public static final ArrayList<Integer> staNosErrList = new ArrayList<Integer>() {{ add(101); add(201); add(1); }}; private Integer count=0; /** * 条码数量 @@ -139,13 +131,12 @@ } } /** * 初始化站点状态 */ private void initSite() { count ++; ArrayList<Integer> staNos = getStaNo(); if(count > 48) { // 站点编号 for (Integer siteId : staNos) { StaProtocol staProtocol = station.get(siteId); @@ -165,8 +156,6 @@ if (!staProtocol.isPakMk() && !staProtocol.isLoading()) { staProtocol.setPakMk(true); } } count = 0; } } @@ -198,8 +187,8 @@ // updateIoMode(); ArrayList<Integer> staNos = getStaNo(); int staNoSize = staNos.size(); OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize*8)); OperateResultExOne<byte[]> result200 = siemensS7Net.Read("DB101.800", (short) (staNoSize*8)); OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNoSize * 2)); OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100.0", (short) (staNoSize * 4)); if (result.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 站点编号 @@ -210,20 +199,11 @@ station.put(siteId, staProtocol); } boolean[] status = null; if(i < 24){ staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, i*8)); // 工作号 staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4)); // 目标站 status = siemensS7Net.getByteTransform().TransBool(result.Content, i*8 + 6, 2); }else { staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result200.Content, (i-24)*8)); // 工作号 staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result200.Content, (i-24)*8 + 4)); // 目标站 status = siemensS7Net.getByteTransform().TransBool(result200.Content, (i-24)*8 + 6, 2); if (i < 7) { staProtocol.setWorkNo((int) siemensS7Net.getByteTransform().TransInt16(result2.Content, i * 4)); staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result2.Content, i * 4 + 2)); } status = siemensS7Net.getByteTransform().TransBool(result.Content, i * 2, 2); staProtocol.setAutoing(status[0]); // 自动 staProtocol.setLoading(status[1]); // 有物 staProtocol.setInEnable(status[2]); // 可入 @@ -240,82 +220,82 @@ } //条码扫描器 ArrayList<Integer> barcodeList = BarcodeList; OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.1648", (short) (barcodeList.size() * 8)); if (result2.IsSuccess) { for (int i = 0; i < barcodeList.size(); i++) { Integer barcodeId = barcodeList.get(i); String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*8,8, "UTF-8"); BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId); if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { barcodeThread.setBarcode(barcode); } } } // ArrayList<Integer> barcodeList = BarcodeList; // OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.1648", (short) (barcodeList.size() * 8)); // if (result2.IsSuccess) { // for (int i = 0; i < barcodeList.size(); i++) { // Integer barcodeId = barcodeList.get(i); // String barcode = siemensS7Net.getByteTransform().TransString(result2.Content, i * 8, 8, "UTF-8"); // BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId); // if (!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) { // barcodeThread.setBarcode(barcode); // } // } // } //外形检测 ArrayList<Integer> staNoErrs = staNosErrList; int staNoErrsSize = staNoErrs.size(); OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.1608", (short) (staNoErrsSize*8)); if (resultErr.IsSuccess){ for (int i = 0;i<2;i++){ Integer siteId = staNoErrs.get(i); // 站点编号 boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i*4+2, 1); StaProtocol staProtocol = station.get(siteId); staProtocol.setFrontErr(status[0]); staProtocol.setBackErr(status[1]); staProtocol.setHighErr(status[2]); staProtocol.setLeftErr(status[3]); staProtocol.setRightErr(status[4]); staProtocol.setWeightErr(status[5]); staProtocol.setBarcodeErr(status[6]); } } // ArrayList<Integer> staNoErrs = staNosErrList; // int staNoErrsSize = staNoErrs.size(); // OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.1608", (short) (staNoErrsSize * 8)); // if (resultErr.IsSuccess) { // for (int i = 0; i < 2; i++) { // Integer siteId = staNoErrs.get(i); // 站点编号 // boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i * 4 + 2, 1); // StaProtocol staProtocol = station.get(siteId); // staProtocol.setFrontErr(status[0]); // staProtocol.setBackErr(status[1]); // staProtocol.setHighErr(status[2]); // staProtocol.setLeftErr(status[3]); // staProtocol.setRightErr(status[4]); // staProtocol.setWeightErr(status[5]); // staProtocol.setBarcodeErr(status[6]); // } // } //plc故障 OperateResultExOne<byte[]> resultErr2 = siemensS7Net.Read("DB101.1728", (short) (staNoSize*4)); if (resultErr2.IsSuccess) { for (int i = 0; i < staNoSize; i++) { Integer siteId = staNos.get(i); // 站点编号 boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr2.Content, i*4, 1); StaProtocol staProtocol = station.get(siteId); 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[]> 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]); staError1.setEMERGENCY_STOP1(status[1]); staError1.setEMERGENCY_STOP2(status[2]); staError1.setEMERGENCY_STOP3(status[3]); staError1.setEMERGENCY_STOP4(status[4]); staError1.setDoor_EMERGENCY_STOP1(status[5]); staError1.setDoor_EMERGENCY_STOP2(status[6]); staError1.setDoor_EMERGENCY_STOP3(status[7]); staError1.setDoor_EMERGENCY_STOP4(status[8]); staError1.setDoor_EMERGENCY_STOP5(status[9]); staError1.setDoor_EMERGENCY_STOP6(status[10]); staError1.setDoor_Open_Err1(status[11]); staError1.setDoor_Open_Err1(status[12]); staError1.setDoor_Open_Err1(status[13]); staError1.setDoor_Open_Err1(status[14]); staError1.setDoor_Open_Err1(status[15]); staError1.setDoor_Open_Err1(status[16]); } // OperateResultExOne<byte[]> resultErr2 = siemensS7Net.Read("DB101.1728", (short) (staNoSize * 4)); // if (resultErr2.IsSuccess) { // for (int i = 0; i < staNoSize; i++) { // Integer siteId = staNos.get(i); // 站点编号 // boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr2.Content, i * 4, 1); // StaProtocol staProtocol = station.get(siteId); // 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[]> 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]); // staError1.setEMERGENCY_STOP1(status[1]); // staError1.setEMERGENCY_STOP2(status[2]); // staError1.setEMERGENCY_STOP3(status[3]); // staError1.setEMERGENCY_STOP4(status[4]); // // staError1.setDoor_EMERGENCY_STOP1(status[5]); // staError1.setDoor_EMERGENCY_STOP2(status[6]); // staError1.setDoor_EMERGENCY_STOP3(status[7]); // staError1.setDoor_EMERGENCY_STOP4(status[8]); // staError1.setDoor_EMERGENCY_STOP5(status[9]); // staError1.setDoor_EMERGENCY_STOP6(status[10]); // // staError1.setDoor_Open_Err1(status[11]); // staError1.setDoor_Open_Err1(status[12]); // staError1.setDoor_Open_Err1(status[13]); // staError1.setDoor_Open_Err1(status[14]); // staError1.setDoor_Open_Err1(status[15]); // staError1.setDoor_Open_Err1(status[16]); // // } if (result.IsSuccess) { @@ -357,23 +337,18 @@ ArrayList<Integer> staNos = getStaNo(); int index = staNos.indexOf(staProtocol.getSiteId()); if(index >= 24){ index = 76 + index; } OperateResult write = null; OperateResult write1 = null; //任务下发次数 int writeCount = 0; do { write = siemensS7Net.Write("DB100." + index*6, staProtocol.getWorkNo()); // 工作号 write = siemensS7Net.Write("DB100." + index * 4, staProtocol.getWorkNo().shortValue()); // 工作号 Thread.sleep(200); write1 = siemensS7Net.Write("DB100." + (index*6+4), staProtocol.getStaNo().shortValue()); // 目标站 write1 = siemensS7Net.Write("DB100." + (index * 4 + 2), staProtocol.getStaNo().shortValue()); // 目标站 if(write.IsSuccess && write1.IsSuccess){ log.error("写入输送线命令成功。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); break; } else { } else { writeCount++; log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount); } @@ -386,20 +361,6 @@ } OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol))); News.error("SiemensDevp"+" - 4"+" - 写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol)); } else { //dang 101,201zhan xaifazhiling qingchu tiaoxingsaomaolide shuju shanchu if (staProtocol.getSiteId()==101){ BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, 1); log.info("qingchutiaoma,{}",barcodeThread.getBarcode()); barcodeThread.clearBarcode(); } if (staProtocol.getSiteId()==201){ BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, 2); log.info("qingchutiaoma,{}",barcodeThread.getBarcode()); barcodeThread.clearBarcode(); } OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol))); News.info("SiemensDevp"+" - 5"+" - 输送线命令下发 [id:{}] >>>>> 命令下发: {}", slave.getId(), JSON.toJSON(staProtocol)); } } src/main/resources/application.yml
@@ -161,15 +161,15 @@ # 输送线1 devp[0]: id: 1 ip: 10.10.10.140 ip: 10.10.10.191 port: 102 rack: 0 slot: 0 # 入库口1 inSta[0]: staNo: 1004 staNo: 1007 barcode: ${wcs-slave.barcode[0].id} backSta: 1004 backSta: 1007 led: ${wcs-slave.led[0].id} # # 入库口1 # inSta[1]: @@ -209,7 +209,7 @@ # 条码扫描仪1 barcode[0]: id: 1 ip: 10.10.10.143 ip: 10.10.10.194 port: 51236 # 条码扫描仪2 barcode[1]: src/main/resources/mapper/WrkMastMapper.xml
@@ -5,6 +5,7 @@ <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMast"> <id column="wrk_no" property="wrkNo" /> <id column="plc_wrk_no" property="plcWrkNo" /> <result column="inv_wh" property="invWh" /> <result column="ymd" property="ymd" /> <result column="mk" property="mk" /> @@ -190,6 +191,6 @@ </select> <select id="selectByWrkNo" resultMap="BaseResultMap"> select * from asr_wrk_mast where wrk_no = #{wrkNo} where plc_wrk_no = #{wrkNo} and wrk_sts = 108 </select> </mapper>