package com.example.springboot.service; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.springboot.component.PLCAutoMes; import com.example.springboot.component.S7control; import com.example.springboot.entity.GlassInfo; import com.example.springboot.entity.StorageCage; import com.example.springboot.entity.GlassInfo; import com.example.springboot.entity.device.PlcParameterObject; import com.example.springboot.mapper.AlbaniaMapper; import com.google.common.primitives.Bytes; @Service public class SpianServiceNew { @Autowired private AlbaniaMapper albaniaMapper; //读取DB105区文件 private PlcParameterObject plcmes=PLCAutoMes.PlcMesObject; public Short selectAll(GlassInfo glassInfo) { if(glassInfo==null){ //有进片请求但是测量台没有玻璃 return 400; } //定义初始字段 int cageid; String glassid=glassInfo.getGlassid(); Double width=glassInfo.getWidth(); //int mateid=glassInfo.getMateid(); String flowcard=glassInfo.getFlowcard(); int glasstype=glassInfo.getGlasstype(); //判断是否有同类型的 cageid=albaniaMapper.SelectCage(glasstype,width, 50); //如果有同类型时直接增加 if(cageid!=Integer.MIN_VALUE){ //发送plc任务 Mestast(glassid, 1001, cageid, 1,"MESID1"); //任务发送字 //Mestast(glassid,1001,cageid,1); }else{ //判断玻璃是否进入大片笼 if(glassInfo.getThickness()>=15){ cageid=albaniaMapper.SelectNewCell(3,5); }else{ cageid=albaniaMapper.SelectNewCell(3,5); //发送plc任务 } //当返回的格子号为空时,返回400笼子已满 if(cageid!=Integer.MIN_VALUE){ Mestast(glassid,1001,cageid,1,"MESID1"); //发送plc任务 }else{ return(400); } } //增加任务记录 albaniaMapper.Inserttask(0, 0, 1001, cageid, glassid,glasstype, flowcard,0,0); return(200); } //出片 public Short selectout(int line) { int mateid; int glasstype; int tier; int sumid; String flowcard; GlassInfo glassmate=new GlassInfo(); for(int i=1;i<=7;i++){ glassmate= albaniaMapper.SelectOutGlass(line); mateid=glassmate.getMateid(); glasstype=glassmate.getGlasstype(); tier=glassmate.getTier(); sumid=glassmate.getId(); flowcard=glassmate.getFlowcard(); StorageCage glass= albaniaMapper.SelectCageGlass(glasstype); //发送配片数据 Mestast(glassmate.getGlasstype()+"i", glass.getId(),2002, 0,"MESID1"); albaniaMapper.AddFinishNumber(flowcard, mateid, tier); albaniaMapper.Inserttask(1, 0, glass.getId(), 2002, glassmate.getGlassid()+i, glasstype,glass.getFlowcard(),mateid,tier); if(tier==sumid){ //本次配片完成发送启动命令 S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToPLC").getAddress(), (short)2);//出片任务启动 return (200);//结束 } } return(200);// 结束 } // 派发任务玻璃id public void outmesid(String glassid, String address) { //读取DB105区文件 PlcParameterObject plcmes=PLCAutoMes.PlcMesObject; // System.out.println("outmesid:" + glassid); List glassidlist = new ArrayList(); char ds[] = glassid.toCharArray(); for (char iditem : ds) { glassidlist.add((byte) iditem); } byte[] bytes = Bytes.toArray(glassidlist); //writeString System.out.println("outmesidbytes:" + bytes.length); System.out.println(plcmes.getPlcParameter(address).getAddress()); System.out.println(); //S7control.getinstance().WriteByte(plcmes.getPlcParameter(address).getAddress(),bytes); //S7control.getinstance().WriteByte(address, bytes);// 派发出片id } // 获取地址内的玻璃id转字符串 public StringBuilder queGlassid(String address, int count) { StringBuilder writedstrIdOut = new StringBuilder(); byte[] writedglassidbytesOut = S7control.getinstance().ReadByte(address, count); if (writedglassidbytesOut != null) { // 获取玻璃id for (byte iditem : writedglassidbytesOut) { writedstrIdOut.append((char) iditem); } } return writedstrIdOut; } // char数组转化成bit数组 public static byte[] toBytes(char[] chars) { String s = new String(chars); return s.getBytes(StandardCharsets.UTF_8); } // bit数组转化成char数组 public static char[] toChars(byte[] bytes) { String s = new String(bytes, StandardCharsets.UTF_8); return s.toCharArray(); } // 判断集合里是否为1 public boolean listbool(String address) { List list = S7control.getinstance().ReadWord(address, 1);// 返回为ture时为1 boolean listbool = list.contains((short) 1); return listbool; } //下发理片任务 public void Mestast(String glassid,int MESToPLCStart1,int MESToPLCTarget1,int MESToPLC,String address) { //outmesid(glassid, "MESID1");//下发玻璃id S7control.getinstance().writeString(plcmes.getPlcParameter(address).getAddress(),glassid); S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToPLCStart1").getAddress(), (short) MESToPLCStart1);//起始位置 S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToPLCTarget1").getAddress(), (short) MESToPLCTarget1);//目标位置 if(MESToPLC!=0){ S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToPLC").getAddress(), (short)MESToPLC);//mes理片任务类型 } } }