package com.mes.job; import cn.hutool.core.lang.Assert; import cn.smallbun.screw.core.util.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.mes.common.S7object; import com.mes.common.config.Const; import com.mes.device.PlcParameterObject; import com.mes.downglassinfo.entity.DownGlassInfo; import com.mes.downglassinfo.entity.DownGlassTask; import com.mes.downglassinfo.service.DownGlassInfoService; import com.mes.downglassinfo.service.DownGlassTaskService; import com.mes.downstorage.entity.DownStorageCage; import com.mes.downstorage.entity.DownStorageCageDetails; import com.mes.downstorage.service.DownStorageCageDetailsService; import com.mes.downstorage.service.DownStorageCageService; import com.mes.downworkstation.entity.DownWorkstation; import com.mes.downworkstation.entity.dto.DownGlassInfoDTO; import com.mes.downworkstation.service.DownWorkstationService; import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.service.GlassInfoService; import com.mes.tools.S7control; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @Author : zhoush * @Date: 2024/5/8 8:17 * @Description: */ @Component @Slf4j public class DownLoadCacheGlassTask { @Autowired DownGlassTaskService downGlassTaskService; @Autowired GlassInfoService glassInfoService; @Autowired DownStorageCageDetailsService downStorageCageDetailsService; @Autowired DownStorageCageService downStorageCageService; @Autowired DownWorkstationService downWorkstationService; @Autowired DownGlassInfoService downGlassInfoService; @Value("${mes.threshold}") private Integer threshold; @Value("${mes.throughWidth}") private Integer throughWidth; @Value("${mes.throughHeight}") private Integer throughHeight; @Value("${mes.maxWidth}") private Integer maxWidth; @Value("${mes.maxHeight}") private Integer maxHeight; @Scheduled(fixedDelay = 1000) public void plcHomeEdgTask() { PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; String requestWord = plcParameterObject.getPlcParameter("requestWord").getValue(); String glassIdeValue = plcParameterObject.getPlcParameter("requestID").getValue(); //A08 A09表示线路相同 可做等价 无数据转int异常 String out06Glassstate = plcParameterObject.getPlcParameter("glassStatus06").getValue(); String out08Glassstate = plcParameterObject.getPlcParameter("glassStatus08").getValue(); String out11Glassstate = plcParameterObject.getPlcParameter("glassStatus11").getValue(); String out13Glassstate = plcParameterObject.getPlcParameter("glassStatus13").getValue(); String confirmationWrodValue = plcParameterObject.getPlcParameter("confirmationWord").getValue(); String confirmationWrodAddress = plcParameterObject.getPlcParameter("confirmationWord").getAddress(); String currentSlot = plcParameterObject.getPlcParameter("currentCell").getValue(); log.info("1、获取到的请求字为:{},获取到的扫描ID为:{},获取到的确认字为:{},获取到的出片状态分别为:g06:{}、g08:{}、g11:{}、g13:{},当前格子号为:{}", requestWord, glassIdeValue, confirmationWrodValue, out06Glassstate, out08Glassstate, out11Glassstate, out13Glassstate, currentSlot); if ("0".equals(requestWord)) { if ("0".equals(confirmationWrodValue)) { log.info("2、获取到的请求字为0,且确认字为0,不执行任务"); return; } log.info("2、获取到的请求字为0,将确认字改为0"); S7object.getinstance().plccontrol.writeWord(confirmationWrodAddress, (short) 0); return; } if (!"0".equals(confirmationWrodValue)) { log.info("2、获取到的请求字不为0,将确认字不为0,直接结束"); return; } if ("1".equals(requestWord)) { log.info("2、进片请求,且确认字为0,执行进片任务"); inTo(glassIdeValue, requestWord, currentSlot); } else if ("2".equals(requestWord)) { //09空闲 :1 10空闲 :2 都空闲:3 其他0 log.info("2、出片请求,且确认字为0,执行进片任务"); outTo(out06Glassstate, out08Glassstate, out11Glassstate, out13Glassstate, glassIdeValue, currentSlot); } else if ("3".equals(requestWord)) { log.info("2、进片和出片都空闲,执行出片任务"); //加笼子里面是否有玻璃,有先出,无玻璃先进 boolean outFlase = outTo(out06Glassstate, out08Glassstate, out11Glassstate, out13Glassstate, glassIdeValue, currentSlot); log.info("出片任务是否完成:{},失败且玻璃id:{}不为空则执行进片任务", outFlase, glassIdeValue); if (!outFlase && StringUtils.isNotBlank(glassIdeValue)) { inTo(glassIdeValue, requestWord, currentSlot); } } } public void inTo(String glassId, String requestWord, String currentSlot) { log.info("1、按照玻璃id:{}获取玻璃小片信息,当前格子为:{}", glassId, currentSlot); //添加进片任务 查找空格 DownStorageCage nearestEmpty = downStorageCageService.selectCacheEmpty(Integer.parseInt(currentSlot), Boolean.FALSE); Assert.isTrue(null != nearestEmpty, "格子已满,无法执行进片操作"); log.info("2、查询卧式理片笼里面的空格:{}", nearestEmpty); GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper().eq(GlassInfo::getGlassId, glassId)); Assert.isFalse(null == glassInfo, "玻璃信息不存在"); if ("1".equals(requestWord) && (glassInfo.getWidth() > throughWidth || glassInfo.getHeight() > throughHeight)) { log.info("玻璃当前尺寸宽:{},高:{}只能直通,当前进片任务需等待", glassInfo.getWidth(), glassInfo.getHeight()); return; } Boolean checkFlag = Boolean.FALSE; //玻璃尺寸是否走人工下片 if (glassInfo.getWidth() > maxWidth || glassInfo.getHeight() > maxHeight) { log.info("该玻璃尺寸走人工下片,直接进片"); } else { log.info("该玻璃尺寸非人工下片"); //获取该玻璃的流程卡是否已绑定架子 DownWorkstation one = downWorkstationService.getOne(new LambdaQueryWrapper() .eq(DownWorkstation::getLayer, glassInfo.getLayer()) .eq(DownWorkstation::getFlowCardId, glassInfo.getFlowCardId())); Boolean isBind = Boolean.FALSE; if (null != one) { log.info("该流程卡已绑定架子"); isBind = Boolean.TRUE; checkFlag = multilayerCheck(glassInfo, isBind); } if (!checkFlag && !isBind) { log.info("该玻璃的流程卡未绑定架子,获取是否有空架子"); List list = downWorkstationService.list(new LambdaQueryWrapper() .isNull(DownWorkstation::getFlowCardId)); if (CollectionUtils.isNotEmpty(list)) { log.info("有空架子,将流程卡与架子好绑定,执行进片任务 结束"); //绑定流程卡 downWorkstationService.update(new LambdaUpdateWrapper() .set(DownWorkstation::getFlowCardId, glassInfo.getFlowCardId()) .set(DownWorkstation::getLayer, glassInfo.getLayer()) .eq(DownWorkstation::getWorkstationId, list.get(0).getWorkstationId())); checkFlag = Boolean.TRUE; } } if (!checkFlag) { log.info("无空架子,获取已绑定架子的流程卡信息,查看玻璃信息是否可被对调"); List downGlassInfoDTOList = downGlassInfoService.queryWorkStationIsIn(Boolean.FALSE); log.info("获取架子上已绑定流程卡落架的数量及未落架的玻璃数据:{}", downGlassInfoDTOList); if (CollectionUtils.isNotEmpty(downGlassInfoDTOList)) { log.info("已绑定流程卡均无未落架玻璃,请及时处理架子上的玻璃,清除流程卡,执行进片任务"); } else { //替换玻璃信息 endLoop: for (DownGlassInfoDTO e : downGlassInfoDTOList) { List glassInfoList = e.getGlassInfoList(); for (GlassInfo item : glassInfoList) { if (item.getWidth() == glassInfo.getWidth() && item.getHeight() == glassInfo.getHeight() && item.getThickness() == glassInfo.getThickness() && item.getFilmsid().equals(glassInfo.getFilmsid())) { //玻璃是否为多层 checkFlag = multilayerCheck(item, Boolean.FALSE); if (checkFlag) { //玻璃替换 仅替换流程卡id及层数 String tempFlowCardId = item.getFlowCardId(); Integer tempLayer = item.getLayer(); String flowCardId = glassInfo.getFlowCardId(); Integer layer = glassInfo.getLayer(); log.info("替换流程卡信息,当前玻璃信息:{}的流程卡号{}及层数{},替换后玻璃信息:{}的流程卡号{}及层数{}", item, glassInfo, flowCardId, layer, tempFlowCardId, tempLayer); glassInfo.setFlowCardId(tempFlowCardId); glassInfo.setLayer(tempLayer); glassInfoService.updateById(glassInfo); item.setFlowCardId(flowCardId); item.setLayer(layer); glassInfoService.updateById(item); break endLoop; } } } } } } } //将任务插入理片笼详情表 DownStorageCageDetails downStorageCageDetails = new DownStorageCageDetails(); BeanUtils.copyProperties(glassInfo, downStorageCageDetails); downStorageCageDetails.setState(Const.GLASS_STATE_IN); downStorageCageDetails.setSlot(nearestEmpty.getSlot()); downStorageCageDetailsService.save(downStorageCageDetails); // 生成进片任务 initDownGlassTask(glassInfo, 0, nearestEmpty.getSlot(), Const.GLASS_CACHE_TYPE_IN); } public Boolean outTo(String glassStatus06, String out08Glassstate, String glassStatus11, String glassStatus13, String glassId, String currentSlot) { if ("2".equals(glassStatus06) && "2".equals(glassStatus11) && "2".equals(glassStatus13)) { log.info("G06、G11、G13分别为{},{}、{}非自动状态,无法出片", glassStatus06, glassStatus11, glassStatus13); return Boolean.FALSE; } List tempList = downStorageCageDetailsService.list(new LambdaQueryWrapper() .eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN)); //获取待进片玻璃 DownStorageCageDetails cageDetails = new DownStorageCageDetails(); if (StringUtils.isNotBlank(glassId)) { GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper().eq(GlassInfo::getGlassId, glassId)); BeanUtils.copyProperties(glassInfo, cageDetails); //获取当前笼子空格信息 DownStorageCage empty = downStorageCageService.selectCacheEmpty(Integer.parseInt(currentSlot), Boolean.TRUE); cageDetails.setSlot(empty.getSlot()); tempList.add(cageDetails); } log.info("笼内玻璃的数据有:{}", tempList); if (CollectionUtils.isEmpty(tempList)) { log.info("笼内没有玻璃,无法执行出片"); return Boolean.FALSE; } Boolean flag08 = "1".equals(out08Glassstate) ? Boolean.TRUE : Boolean.FALSE; if (!generateTaskByShelf(glassStatus11, flag08, glassStatus13, tempList, cageDetails)) { return generateTaskByShelf(glassStatus11, !flag08, glassStatus13, tempList, cageDetails); } return Boolean.TRUE; } private Boolean multilayerCheck(GlassInfo glassInfo, boolean isBind) { //查询该流程卡是否为多层 if (glassInfo.getTotalLayer() > 1) { log.info("按照流程卡获取当前流程卡各层已落架数量"); DownGlassInfoDTO downGlassInfoDTO = downGlassInfoService.queryDownGlassMaxLayer(glassInfo.getFlowCardId()); if (null == downGlassInfoDTO) { if (isBind) { return Boolean.TRUE; } else { log.info("架子已经占满,多层玻璃无法找到对应的格子,需执行替换玻璃的操作"); return Boolean.FALSE; } } if (downGlassInfoDTO.getLayer().equals(glassInfo.getLayer())) { log.info("当前玻璃的流程在架子上落架最多 直接进片"); return Boolean.TRUE; } Integer sequence = downGlassInfoService.queryMaxSequence(glassInfo.getFlowCardId(), glassInfo.getLayer()); log.info("获取当前玻璃需要放的次序:笼内同流程 同层数的通达次序+1:{}", sequence); DownGlassInfo downGlassInfo = downGlassInfoService.getOne(new LambdaQueryWrapper() .eq(DownGlassInfo::getFlowCardId, downGlassInfoDTO.getFlowCardId()) .eq(DownGlassInfo::getLayer, downGlassInfoDTO.getLayer()).eq(DownGlassInfo::getSequence, sequence)); log.info("拿当前版序获取玻璃信息{},按照次序判断当前玻璃是否尺寸对应的上(与数量最多的次序比较)。", downGlassInfo); if (null != downGlassInfoDTO && downGlassInfo.getWidth() == glassInfo.getWidth() && downGlassInfo.getHeight() == glassInfo.getHeight()) { log.info("相同次序玻璃对应上,可执行进片任务"); return Boolean.TRUE; } else { log.info("同次序玻璃对应不上,需执行替换玻璃的操作"); return Boolean.FALSE; } } else { log.info("非多层玻璃,直接进片"); return Boolean.TRUE; } } private Boolean generateTaskByShelf(String glassStatus, Boolean flag08, String glassStatus13, List tempList, DownStorageCageDetails cageDetails) { //获取2个机械臂范围内的架子绑定的流程卡信息 List workList = new ArrayList(); if (flag08) { if (!"2".equals(glassStatus)) { workList.addAll(Const.G11_WORK_STATION); } } else { if (!"2".equals(glassStatus)) { workList.addAll(Const.G06_WORK_STATION); } } List list = new ArrayList(); Boolean isEmptyShelf = Boolean.FALSE; //对笼内玻璃进行过滤,仅出符合逻辑的玻璃 if (CollectionUtils.isNotEmpty(workList)) { List downWorkstationList = downWorkstationService.list(new LambdaQueryWrapper() .eq(DownWorkstation::getEnableState, 0).in(DownWorkstation::getWorkstationId, workList)); log.info("架子被禁用,无法出片落架"); if (CollectionUtils.isEmpty(downWorkstationList)) { log.info("笼子被禁用,无法走机械臂下片"); //走人工下片 if (!"2".equals(glassStatus13)) { list = tempList.stream().filter(item -> item.getWidth() > maxWidth || item.getHeight() > maxHeight).collect(Collectors.toList()); } } else { List workstationsIsNotBind = downWorkstationList.stream().filter(item -> null == (item.getFlowCardId())).collect(Collectors.toList()); Map> listMap = downWorkstationList.stream().collect(Collectors.groupingBy(item -> item.getFlowCardId() + ":" + item.getLayer())); if (CollectionUtils.isEmpty(workstationsIsNotBind)) { log.info("不存在未绑定流程卡架子"); //筛选出对应架子已绑定流程卡可下片的玻璃 list = tempList.stream().filter(item -> listMap.containsKey(item.getFlowCardId() + ":" + item.getLayer())).collect(Collectors.toList()); } else { log.info("存在未绑定流程卡架子,直接获取笼内所有玻璃"); isEmptyShelf = Boolean.TRUE; //todo:如果禁用架子已绑定流程卡,因为时间不确定,笼子内的玻璃可重新绑定新架子 // list = tempList.stream().filter(item -> !listMap.containsKey(item.getFlowCardId() + ":" + item.getLayer())).collect(Collectors.toList()); list = tempList; } } } else { if (flag08 && !"2".equals(glassStatus13)) { //直接走人工下片 list = tempList.stream().filter(item -> item.getWidth() > maxWidth || item.getHeight() > maxHeight).collect(Collectors.toList()); } } if (CollectionUtils.isEmpty(list)) { log.info("笼内玻璃无法执行出片"); return Boolean.FALSE; } String tempGlassId = null; Boolean isBind = Boolean.FALSE; for (DownStorageCageDetails item : list) { if (item.getWidth() > maxWidth || item.getHeight() > maxHeight) { if (flag08 && !"2".equals(glassStatus13)) { log.info("玻璃宽度或高度超出阈值,执行人工下片"); tempGlassId = item.getGlassId(); break; } } } loop: if (tempGlassId == null) { //获取正在落架的绑定流程卡的信息(流程卡、层数、落架数量) List downGlassInfoDTOList = downGlassInfoService.queryWorkStationIsIn(Boolean.TRUE); List downGlassFlowList = downGlassInfoDTOList.stream().map(item -> item.getFlowCardId() + ":" + item.getLayer()).collect(Collectors.toList()); if (CollectionUtils.isEmpty(downGlassFlowList)) { //架子都未绑定流程卡,出笼内子数量最多尺寸最大的玻璃 DownStorageCageDetails downStorageCageDetails = downStorageCageDetailsService.getGlassInfoMaxCount(); //绑定流程卡,更新玻璃状态,生成出片任务, tempGlassId = downStorageCageDetails.getGlassId(); isBind = Boolean.TRUE; break loop; } //将笼子内的玻璃进行过滤,仅获取无法落架的流程卡玻璃 List noDownLoadList = list.stream().filter(item -> !downGlassFlowList.contains(item.getFlowCardId() + ":" + item.getLayer())).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(noDownLoadList)) { //是否有空架子 // List emptyShelfList = downWorkstationService.list(new LambdaQueryWrapper() // .isNull(DownWorkstation::getFlowCardId)); if (isEmptyShelf) { DownStorageCageDetails downStorageCageDetails = downStorageCageDetailsService.getGlassInfoMaxCount(); //绑定流程卡,更新玻璃状态,生成出片任务 tempGlassId = downStorageCageDetails.getGlassId(); isBind = Boolean.TRUE; break loop; } } //将笼子内的玻璃进行过滤,仅获取可落架的流程卡玻璃 List downLoadList = list.stream().filter(item -> downGlassFlowList.contains(item.getFlowCardId() + ":" + item.getLayer())).collect(Collectors.toList()); if (CollectionUtils.isEmpty(downLoadList)) { //不执行出片任务,笼内没有合适的出片玻璃 return Boolean.FALSE; } //将笼内玻璃的流程卡+层号 和落架的流程卡 去重,得出展示无法落架的玻璃,判断玻璃数是否超过阈值 //笼内玻璃是否可落架:笼内是否有需要中空的 List multiLayerList = list.stream().filter(item -> item.getTotalLayer() >= 2).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(multiLayerList)) { for (DownStorageCageDetails item : multiLayerList) { DownGlassInfoDTO downGlassInfoDTO = downGlassInfoService.queryDownGlassMaxLayer(item.getFlowCardId()); if (null == downGlassInfoDTO) { // 历史落架玻璃按照相关流程卡取数据库未找到最多玻璃信息,表明当前流程卡下的有层的玻璃均未落架,直接可出当前玻璃 log.info(""); isBind = Boolean.FALSE; tempGlassId = item.getGlassId(); break loop; } if (downGlassInfoDTO.getLayer().equals(downGlassInfoDTO.getLayer())) { log.info("当前玻璃的流程在架子上落架最多,直接出片"); //更新玻璃状态,生成出片任务 tempGlassId = item.getGlassId(); isBind = Boolean.FALSE; break loop; } Integer sequence = downGlassInfoService.queryMaxSequence(item.getFlowCardId(), item.getLayer()); log.info("获取当前玻璃需要放的次序:笼内同流程 同层数的通达次序+1:{}", sequence); DownGlassInfo downGlassInfo = downGlassInfoService.getOne(new LambdaQueryWrapper() .eq(DownGlassInfo::getFlowCardId, downGlassInfoDTO.getFlowCardId()) .eq(DownGlassInfo::getLayer, downGlassInfoDTO.getLayer()).eq(DownGlassInfo::getSequence, sequence)); if (null != downGlassInfoDTO && downGlassInfo.getWidth() == item.getWidth() && downGlassInfo.getHeight() == item.getHeight()) { log.info("相同次序玻璃对应上,可执行进片任务"); //更新玻璃状态,生成出片任务 tempGlassId = item.getGlassId(); isBind = Boolean.FALSE; break loop; } } } Map> singleLayerMap = list.stream().filter(item -> item.getTotalLayer() == 1) .collect(Collectors.groupingBy(item -> item.getFlowCardId() + item.getLayer(), Collectors.toList())); if (tempGlassId == null) { if (CollectionUtils.isNotEmpty(singleLayerMap)) { //获取已落架流程卡信息,按落架数量排序 for (DownGlassInfoDTO e : downGlassInfoDTOList) { List downStorageCageDetails = singleLayerMap.get(e.getFlowCardId() + e.getLayer()); if (CollectionUtils.isNotEmpty(downStorageCageDetails)) { tempGlassId = downStorageCageDetails.get(0).getGlassId(); isBind = Boolean.FALSE; break; } } } } } if (tempGlassId == null) { log.info("没有找到可以下片的的玻璃,结束任务"); return Boolean.FALSE; } else { //按照出片的玻璃id更新笼内的玻璃状态为已出片 return generateDownGlassOutTask(tempGlassId, Const.GLASS_CACHE_TYPE_OUT, isBind, cageDetails); } } public Boolean generateDownGlassOutTask(String glassId, Integer taskType, Boolean isBind, DownStorageCageDetails cageDetails) { //按玻璃id获取玻璃信息 DownStorageCageDetails downStorageCageDetails = null; if (glassId.equals(cageDetails.getGlassId())) { downStorageCageDetails = cageDetails; taskType = 3; } else { downStorageCageDetails = downStorageCageDetailsService.getOne(new LambdaQueryWrapper() .eq(DownStorageCageDetails::getGlassId, glassId)); } Integer endCell = null; if (isBind) { //获取空架子信息,将空架子信息绑定流程卡 DownWorkstation emptyDownWorkstation = downWorkstationService.getOne(new LambdaQueryWrapper() .isNull(DownWorkstation::getFlowCardId).orderByDesc(DownWorkstation::getWorkstationId).last("limit 1")); if (null != emptyDownWorkstation) { log.info("获取到空架子信息,绑定流程卡"); emptyDownWorkstation.setFlowCardId(downStorageCageDetails.getFlowCardId()); emptyDownWorkstation.setLayer(downStorageCageDetails.getLayer()); downWorkstationService.updateById(emptyDownWorkstation); endCell = emptyDownWorkstation.getWorkstationId(); } else { log.info("没有空架子信息,无法绑定流程卡"); return Boolean.FALSE; } } else { DownWorkstation workstation = downWorkstationService.getOne(new LambdaUpdateWrapper() .eq(DownWorkstation::getFlowCardId, downStorageCageDetails.getFlowCardId()).eq(DownWorkstation::getLayer, downStorageCageDetails.getLayer())); endCell = workstation.getWorkstationId(); } //更新详情表内的状态 if (downStorageCageDetailsService.update(new LambdaUpdateWrapper() .set(DownStorageCageDetails::getState, Const.GLASS_STATE_OUT).eq(DownStorageCageDetails::getGlassId, glassId))) { log.info("更新详情表内的状态成功"); } else { log.info("更新详情表内的状态失败"); return Boolean.FALSE; } //生成任务信息 DownGlassInfo downGlassInfo = new DownGlassInfo(); BeanUtils.copyProperties(downStorageCageDetails, downGlassInfo); downGlassInfoService.save(downGlassInfo); //生成任务信息 GlassInfo glassInfo = new GlassInfo(); BeanUtils.copyProperties(downStorageCageDetails, glassInfo); return initDownGlassTask(glassInfo, downStorageCageDetails.getSlot(), endCell, taskType); } public Boolean initDownGlassTask(GlassInfo glassInfo, Integer startCell, Integer endCell, Integer taskType) { log.info("玻璃{}生成进片任务", glassInfo.getGlassId()); DownGlassTask downGlassTask = new DownGlassTask(); downGlassTask.setStartCell(startCell); downGlassTask.setGlassId(glassInfo.getGlassId()); downGlassTask.setEndCell(endCell); downGlassTask.setTaskType(taskType + ""); downGlassTask.setWidth((int) glassInfo.getWidth()); downGlassTask.setHeight((int) glassInfo.getHeight()); downGlassTask.setFlowCardId(glassInfo.getFlowCardId()); downGlassTask.setLayer(glassInfo.getLayer()); downGlassTask.setTaskStauts(0); downGlassTask.setCreateTime(new Date()); downGlassTaskService.save(downGlassTask); //向plc发送命令 return sendMessageToPlc((int) glassInfo.getWidth(), (int) glassInfo.getHeight(), (int) glassInfo.getThickness(), startCell, endCell, taskType); } private Boolean sendMessageToPlc(int width, int height, int thickness, int startCell, int endCell, int taskType) { S7control s7control = S7object.getinstance().plccontrol; PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject; s7control.writeWord(plcMesObject.getPlcParameter("Glass_width").getAddress(), (short) width); s7control.writeWord(plcMesObject.getPlcParameter("Glass_height").getAddress(), (short) height); s7control.writeWord(plcMesObject.getPlcParameter("Glass_thickness").getAddress(), (short) thickness); s7control.writeWord(plcMesObject.getPlcParameter("Start_cell").getAddress(), (short) startCell); s7control.writeWord(plcMesObject.getPlcParameter("End_cell").getAddress(), (short) endCell); s7control.writeWord(plcMesObject.getPlcParameter("task_type").getAddress(), (short) taskType); s7control.writeWord(plcMesObject.getPlcParameter("confirmationWord").getAddress(), (short) 1); return Boolean.TRUE; } }