| | |
| | | package com.mes.job; |
| | | |
| | | import cn.hutool.json.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.mes.common.S7object; |
| | | import com.mes.device.PlcParameterObject; |
| | | import com.mes.md.entity.LineConfiguration; |
| | | import com.mes.md.entity.Machine; |
| | | import com.mes.md.entity.PrimitiveTask; |
| | | import com.mes.md.entity.Tasking; |
| | | import com.mes.md.service.TaskingService; |
| | | import com.mes.md.mapper.MachineMapper; |
| | | import com.mes.md.mapper.TaskingMapper; |
| | | import com.mes.md.service.*; |
| | | import com.mes.service.ModbusTcp; |
| | | import com.mes.service.PlcAgreement; |
| | | import com.mes.service.PlcParameter; |
| | | import com.mes.tools.WebSocketServer; |
| | | import com.mes.utils.HexUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.io.InputStream; |
| | | import java.io.OutputStream; |
| | | import java.net.Socket; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * @author SNG-010 |
| | |
| | | @Slf4j |
| | | public class PLCEdging { |
| | | |
| | | PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; |
| | | @Autowired |
| | | TaskingMapper taskingMapper; |
| | | @Autowired |
| | | MachineMapper machineMapper; |
| | | @Autowired |
| | | TaskingService taskingService; |
| | | @Scheduled(fixedDelay = 500) |
| | | public void PLCEdging() { |
| | | //磨边进片请求信号 |
| | | String edgingSign = plcParameterObject.getPlcParameter("edgingSign").getValue(); |
| | | if (!Objects.equals(edgingSign, "")){ |
| | | Tasking glass = new Tasking(); |
| | | glass.setWorkState("工作"); |
| | | //glass.setCurrentCraft("磨边"); |
| | | glass.setState("线上"); |
| | | Tasking tasking =new Tasking(); |
| | | //Tasking tasking =taskingService.selectTasking(glass); |
| | | //发送长宽厚尺寸 |
| | | S7object.getinstance().plccontrol.writeWord(plcParameterObject.getPlcParameter("length").getAddress(), Integer.parseInt(tasking.getLength().toString())); |
| | | S7object.getinstance().plccontrol.writeWord(plcParameterObject.getPlcParameter("width").getAddress(), Integer.parseInt(tasking.getWidth().toString())); |
| | | S7object.getinstance().plccontrol.writeWord(plcParameterObject.getPlcParameter("thickness").getAddress(), Integer.parseInt(tasking.getThickness().toString())); |
| | | @Autowired |
| | | ProjectService projectService; |
| | | |
| | | } |
| | | //持续获取速度同步给下一个机器 |
| | | String edgingSpeed = plcParameterObject.getPlcParameter("edgingSpeed").getValue(); |
| | | if(!Objects.equals(edgingSpeed, "")){ |
| | | S7object.getinstance().plccontrol.writeWord(plcParameterObject.getPlcParameter("cleaningSpeed").getAddress(), Integer.parseInt(edgingSpeed)); |
| | | @Autowired |
| | | PrimitiveTaskService primitiveTaskService; |
| | | @Autowired |
| | | KBBTJPDrawingBPService kBBTJPDrawingBPService; |
| | | @Autowired |
| | | LineConfigurationService lineConfigurationService; |
| | | public static int thinness = 40; |
| | | public static int edgSpeed = 40; |
| | | public static Long machineId1 = 5L; |
| | | public static Long machineId2 = 6L; |
| | | public List<Map> sendRecords = new ArrayList<>(); |
| | | |
| | | //@Scheduled(fixedDelay = 1000) |
| | | public void plcEdging() { |
| | | Machine machine=machineMapper.selectById(machineId2); |
| | | ModbusTcp modbusTcp1 =new ModbusTcp(machine.getIp(),machine.getPort(),"PlcEdging"); |
| | | try { |
| | | modbusTcp1.connect(); |
| | | PlcAgreement plcAgreement=modbusTcp1.getPlcAgreement("PlcEdging"); |
| | | if(!modbusTcp1.read(plcAgreement)){ |
| | | log.info("通讯读取新数据失败"); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | PlcParameter inputOrOut2 =plcAgreement.getPlcParameter("inputOrOut2"); |
| | | edgSpeed=inputOrOut2.getValueInt(); |
| | | |
| | | PlcParameter plcRequest =plcAgreement.getPlcParameter("plcRequest");//请求字 |
| | | PlcParameter mesSend =plcAgreement.getPlcParameter("mesSend");//发送字 |
| | | |
| | | |
| | | PlcParameter plcReport =plcAgreement.getPlcParameter("plcReport");//汇报字 |
| | | PlcParameter plcReportID =plcAgreement.getPlcParameter("plcReportID");//汇报ID |
| | | PlcParameter plcReport2 =plcAgreement.getPlcParameter("plcReport2");//手动汇报字 |
| | | PlcParameter plcReportID2 =plcAgreement.getPlcParameter("plcReportID2");//手动汇报ID |
| | | |
| | | PlcParameter mesConfirm =plcAgreement.getPlcParameter("mesConfirm");//确认字 |
| | | PlcParameter mesConfirmID =plcAgreement.getPlcParameter("mesConfirmID");//确认ID |
| | | PlcParameter mesConfirm2 =plcAgreement.getPlcParameter("mesConfirm2");//手动确认字 |
| | | PlcParameter mesConfirmID2 =plcAgreement.getPlcParameter("mesConfirmID2");//手动确认ID |
| | | if (machine.getIsLog()>0){ |
| | | modbusTcp1.consoleLogInfo(plcAgreement); |
| | | } |
| | | if (0==plcRequest.getValueInt()&&1==mesSend.getValueInt()) { |
| | | log.info("1.发送字置零"); |
| | | //发送字置0 |
| | | String send= HexUtil.intTo2ByteHex(0); |
| | | modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesSend.getAddressStart()/2)); |
| | | log.info("发送字 清空成功;内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesSend.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | if (0==plcReport.getValueInt()&&0!=mesConfirm.getValueInt()) { |
| | | log.info("2.确认字置零"); |
| | | //发送字置0 |
| | | String send=HexUtil.intTo2ByteHex(0); |
| | | modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesConfirm.getAddressStart()/2)); |
| | | log.info("任务完成 清空成功;内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | if (0==plcReport2.getValueInt()&&0!=mesConfirm2.getValueInt()) { |
| | | log.info("2.确认字置零"); |
| | | //发送字置0 |
| | | String send=HexUtil.intTo2ByteHex(0); |
| | | modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart()/2)); |
| | | log.info("任务完成 清空成功;内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | if(1==plcReport.getValueInt()&&0==mesConfirm.getValueInt()){ |
| | | int finishCount=taskingService.finishMachineTask(machine); |
| | | log.info("3、任务完成"); |
| | | if(finishCount>0) {//有任务 |
| | | String send = HexUtil.intTo2ByteHex(1); |
| | | modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2)); |
| | | log.info("任务完成 成功 内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | String send = HexUtil.intTo2ByteHex(1); |
| | | modbusTcp1.writeString(send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart() / 2)); |
| | | log.info("任务完成 异常成功 内容:{},发送起始地址:{}", send, HexUtil.intTo2ByteHex(mesConfirm.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | if(4==plcReport2.getValueInt()&&0==mesConfirm2.getValueInt()){ |
| | | int finishCount=taskingService.glassDownLineOne(machine); |
| | | if(finishCount>0){//有任务 |
| | | log.info("4、人工拿走"); |
| | | String send=HexUtil.intTo2ByteHex(4); |
| | | modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart()/2)); |
| | | log.info("人工拿走发送报文内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | String send=HexUtil.intTo2ByteHex(4); |
| | | modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart()/2)); |
| | | log.info("人工拿走异常 发送报文内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | if(2==plcReport2.getValueInt()&&0==mesConfirm2.getValueInt()){ |
| | | int finishCount=taskingService.loseMachineTask(machine); |
| | | if(finishCount>0){//有任务 |
| | | log.info("2、重发"); |
| | | String send=HexUtil.intTo2ByteHex(2); |
| | | modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart()/2)); |
| | | log.info("重发发送报文内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | }else{ |
| | | log.info("2、异常重发"); |
| | | String send=HexUtil.intTo2ByteHex(2); |
| | | modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart()/2)); |
| | | log.info("异常重发发送报文内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | if(3==plcReport2.getValueInt()&&0==mesConfirm2.getValueInt()){ |
| | | int finishCount=taskingService.finishMachineTask(machine); |
| | | if(finishCount>0){//有任务 |
| | | log.info("3、设备上人工点破损"); |
| | | String send=HexUtil.intTo2ByteHex(3); |
| | | modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart()/2)); |
| | | log.info("人工点破损发送报文内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | }else{ |
| | | //是否自动清除破损 |
| | | log.info("3、无效破损 (没有找到此ID的玻璃)"); |
| | | String send=HexUtil.intTo2ByteHex(3); |
| | | modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart()/2)); |
| | | log.info("发送报文内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesConfirm2.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | } |
| | | List<Tasking> taskingCount=taskingService.findMachineWorkStateTask(machine,"正在工作"); |
| | | |
| | | if((1==plcRequest.getValueInt()&&0==mesSend.getValueInt()) |
| | | &&"开工".equals(machine.getState()) |
| | | &&taskingCount.size()<machine.getMaxTaskCount()){ |
| | | Machine loadMachine=machineMapper.selectById(2L); |
| | | Tasking tasking; |
| | | String scan_id=""; |
| | | if(loadMachine.getMode()==1){ |
| | | //标准模式 找已领取未完成的第一条任务 |
| | | LineConfiguration lineConfiguration=lineConfigurationService.machineLineConfiguration(machine); |
| | | List<PrimitiveTask> findPrimitiveTasking=primitiveTaskService.findPrimitiveTasking(machine,lineConfiguration.getLineId()); |
| | | //添加数据: |
| | | for(PrimitiveTask primitiveTask:findPrimitiveTasking){ |
| | | List<Tasking> taskingTopList=taskingMapper.selectList(new QueryWrapper<Tasking>().lambda() |
| | | .eq(Tasking::getScanId,primitiveTask.getScanId()) |
| | | ); |
| | | //任务数>已上数量 |
| | | if(taskingTopList.size()<primitiveTask.getTaskQuantity()){ |
| | | Tasking taskingAdd=primitiveTaskService.convertListTasking(primitiveTask,lineConfiguration.getId()); |
| | | Integer taskSequence=1; |
| | | if (machine.getTodayCount()>0&&machine.getTodayCount()<5000){ |
| | | taskSequence=machine.getTodayCount()+1; |
| | | }else{ |
| | | taskSequence=1; |
| | | } |
| | | machine.setTodayCount(taskSequence); |
| | | taskingAdd.setTaskSequence(taskSequence); |
| | | machineMapper.updateById(machine); |
| | | taskingMapper.insert(taskingAdd); |
| | | } |
| | | break; |
| | | } |
| | | tasking=taskingService.startMachineTask(machine); |
| | | }else{ |
| | | //定制模式 |
| | | String PlcRequestID_=clientTCPSocket(); |
| | | //String PlcRequestID_=",,46607221"; |
| | | if (PlcRequestID_==null||PlcRequestID_.lastIndexOf(",")<0){ |
| | | modbusTcp1.close(); |
| | | errorMachine(machine,("扫不到码:"+PlcRequestID_)); |
| | | return; |
| | | } |
| | | scan_id= PlcRequestID_.substring(PlcRequestID_.lastIndexOf(",")+1); |
| | | tasking=taskingService.startMachineTask(machine,scan_id); |
| | | } |
| | | if(tasking!=null){ |
| | | log.info("4、发送任务 任务数据:{}, 设备状态:{}, ",machine,tasking); |
| | | String send= |
| | | HexUtil.intTo2ByteHex(1)+ |
| | | HexUtil.intTo2ByteHex(tasking.getGlassId().intValue())+ |
| | | HexUtil.intTo2ByteHex(((Double)(tasking.getLength()*10)).intValue())+ |
| | | HexUtil.intTo2ByteHex(((Double)(tasking.getWidth()*10)).intValue())+ |
| | | HexUtil.intTo2ByteHex(((Double)(tasking.getThickness()*10)).intValue()); |
| | | modbusTcp1.writeString(send,HexUtil.intTo2ByteHex(mesSend.getAddressStart()/2)); |
| | | log.info("发送任务发送报文内容:{},发送起始地址:{}",send,HexUtil.intTo2ByteHex(mesSend.getAddressStart())); |
| | | modbusTcp1.close(); |
| | | errorMachine(machine,""); |
| | | SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | String sendRecord=df.format(new Date())+" "+ |
| | | tasking.getGlassId()+"-"+ |
| | | tasking.getWidth()+"-"+ |
| | | tasking.getLength()+"-"+ |
| | | tasking.getThickness(); |
| | | if (sendRecords.size()>7){ |
| | | sendRecords.remove(0); |
| | | } |
| | | Map sendContentMap=new HashMap(); |
| | | sendContentMap.put("sendContent",sendRecord); |
| | | sendRecords.add(sendContentMap); |
| | | return; |
| | | }else if(!scan_id.isEmpty()){ |
| | | taskingService.scanMachineAdd(machine,scan_id); |
| | | modbusTcp1.close(); |
| | | return; |
| | | } |
| | | } |
| | | //} |
| | | |
| | | } catch (Exception e) { |
| | | log.info("交互逻辑错误"); |
| | | } |
| | | |
| | | modbusTcp1.close(); |
| | | //log.info("无可执行的条件"); |
| | | } |
| | | @Scheduled(fixedDelay = 1000) |
| | | public void edgingWeb() { |
| | | //获取当前任务表最新的一块任务状态 |
| | | //获取报警状态 |
| | | String warning = plcParameterObject.getPlcParameter("warning").getValue(); |
| | | JSONObject jsonObject = new JSONObject(); |
| | | if (!Objects.equals(warning, "0")) { |
| | | //log.info("报警信息:"+warning); |
| | | jsonObject.append("warning", warning); |
| | | |
| | | |
| | | public void errorMachine(Machine machine,String error) { |
| | | if (!error.equals(machine.getRemark())){ |
| | | machine.setRemark(error); |
| | | machineMapper.updateById(machine); |
| | | } |
| | | ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("scanQrCode"); |
| | | } |
| | | public String clientTCPSocket() { |
| | | try { |
| | | Machine machine=machineMapper.selectById(4L); |
| | | Socket clientSocket = new Socket(machine.getIp(), machine.getPort()); |
| | | try { |
| | | // 创建输入流和输出流 |
| | | InputStream inputStream = clientSocket.getInputStream(); |
| | | OutputStream outputStream = clientSocket.getOutputStream(); |
| | | // 发送启动命令 |
| | | String message = "start"; |
| | | outputStream.write(message.getBytes()); |
| | | // 读取服务器响应的数据 |
| | | byte[] buffer = new byte[1024]; |
| | | int bytesRead = inputStream.read(buffer); |
| | | String receivedMessage = new String(buffer, 0, bytesRead); |
| | | System.out.println("收到扫码枪返回内容:" + receivedMessage); |
| | | // 关闭连接 |
| | | String message2 = "stop"; |
| | | outputStream.write(message2.getBytes()); |
| | | clientSocket.close(); |
| | | return receivedMessage; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | clientSocket.close(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return ""; |
| | | } |
| | | @Scheduled(fixedDelay = 500) |
| | | public void EdgingTasks() { |
| | | |
| | | JSONObject jsonObject = new JSONObject(); |
| | | Machine machine=machineMapper.selectById(6L); |
| | | List<Tasking> taskingList=taskingService.findMachineTask(machine); |
| | | jsonObject.append("taskingList", taskingList); |
| | | jsonObject.append("machine", machine); |
| | | jsonObject.append("sendRecords", sendRecords); |
| | | ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("edgingTask"); |
| | | if (sendwServer != null) { |
| | | for (WebSocketServer webserver : sendwServer) { |
| | | if (webserver != null) { |
| | | webserver.sendMessage(jsonObject.toString()); |
| | | List<String> messages = webserver.getMessages(); |
| | | if (!messages.isEmpty()) { |
| | | // // 将最后一个消息转换为整数类型的列表 |
| | | webserver.clearMessages(); |
| | | try { |
| | | webserver.sendMessage(jsonObject.toString()); |
| | | List<String> messages = webserver.getMessages(); |
| | | if (!messages.isEmpty()) { |
| | | // // 将最后一个消息转换为整数类型的列表 |
| | | webserver.clearMessages(); |
| | | } |
| | | }catch (Exception e) { |
| | | |
| | | } |
| | | |
| | | } else { |
| | | log.info("Home is closed"); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |