hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/common/S7control.java
New file @@ -0,0 +1,470 @@ package com.mes.common; import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType; import com.github.xingshuangs.iot.protocol.s7.service.MultiAddressWrite; import com.github.xingshuangs.iot.protocol.s7.service.S7PLC; import com.google.common.primitives.Bytes; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; public class S7control { S7PLC s7PLC; // PLC通讯类实例 private EPlcType plcType = EPlcType.S1500; // 西门子PLC类型 private String ip = "192.168.10.1"; // plc ip地址 private int port = 102; // plc 端口号 private static volatile S7control instance = null; private S7control() { if (s7PLC == null) s7PLC = new S7PLC(plcType, ip, port,0,0); } // 单例模式 获取类的唯一实例 public static S7control getinstance() { if (instance == null) { synchronized (S7control.class) { if (instance == null) { instance = new S7control(); } } } return instance; } /** * 关闭西门子s7通讯连接 */ public void CloseS7client() { if (s7PLC == null) s7PLC.close(); s7PLC.checkConnected(); } /** * s7通讯连接状态 */ public boolean CheckConnected() { return s7PLC.checkConnected(); } /** * 按指定的地址 写入一个word * * @param address 地址 * @param data word的值 */ public void WriteWord(String address, short data) { if (s7PLC==null) { return; } s7PLC.writeInt16(address, data); } /** * 从某地址连续 写入多个word * * @param address 地址 * @param datas word的值 */ public void WriteWord(String address, List<Short> datas) { if (s7PLC==null) return; // s7PLC.write(address, data); List<String> addresslist = GetAddressList(address, datas.size(), 16); MultiAddressWrite addressWrite = new MultiAddressWrite(); for (int i = 0; i < datas.size(); i++) { addressWrite.addInt16(addresslist.get(i), datas.get(i)); } s7PLC.writeMultiData(addressWrite); } /** * 按指定的地址 写入多个word * * @param address 地址 * @param datas word的值 */ /** * 按指定的地址 写入一个Bit * * @param address 地址 * @param data Bit的值 */ public void WriteBit(String address, Boolean data) { if (s7PLC==null) return; s7PLC.writeBoolean(address, data); } /** * 按指定的地址 写入多个bit * * @param address 地址 * @param datas bit的值 */ public void WriteBit(List<String> address, List<Boolean> datas) { if (s7PLC==null) return; // s7PLC.write(address, data); MultiAddressWrite addressWrite = new MultiAddressWrite(); for (int i = 0; i < address.size(); i++) { addressWrite.addBoolean(address.get(i), datas.get(i)); } s7PLC.writeMultiData(addressWrite); } /** * 从某地址连续 写入多个bit * * @param address 地址 * @param datas word的值 */ public void WriteBit(String address, List<Boolean> datas) { if (s7PLC==null) return; // s7PLC.write(address, data); List<String> addresslist = GetAddressList(address, datas.size(), 1); MultiAddressWrite addressWrite = new MultiAddressWrite(); for (int i = 0; i < datas.size(); i++) { addressWrite.addBoolean(addresslist.get(i), datas.get(i)); } s7PLC.writeMultiData(addressWrite); } /** * 按指定的地址 写入多个byte * * @param address 地址 * @param datas byte的值 */ public void WriteByte(String address, byte[] datas) { if (s7PLC==null) return; // s7PLC.write(address, data); s7PLC.writeByte(address, datas); } /** * 按指定的地址 读取word结果集 * * @param address 地址 * @return 结果 */ public List<Short> ReadWord(List<String> address) { if (s7PLC == null) return null; try { return s7PLC.readInt16(address); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } } private int getIndexFromAddress(String address) { // 可以解析出地址中的数字部分,并转换为整数 return 0; } private String getAddressFromIndex(int index) { // 整数转换为地址格式的字符串 return ""; } /** * 按指定的地址 读取word结果集 * * @param address 地址 * @param count 连续读多少个word * @return 结果 */ public List<Short> ReadWord(String address, int count) { if (s7PLC == null) return null; List<String> addresslist = GetAddressList(address, count, 16); try { return s7PLC.readInt16(addresslist); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } } /** * 按指定的地址 读取byte结果集 * * @param address 地址 * @param count 连续读多少个byte * @return 结果 */ public byte[] ReadByte(String address, int count) { if (s7PLC==null) return null; // List<String> addresslist = GetAddressList(address, count, 16); try { return s7PLC.readByte(address, count); }catch (Exception e) { // 处理异常 System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } } /** * 按指定的地址 按bit位 0 flase 1 true 读取结果 * * @param addresslist 地址集 * @return Boolean结果 */ public List<Boolean> ReadBits(List<String> addresslist) { if (s7PLC==null) return null; return s7PLC.readBoolean(addresslist); } //读取不连续地址bit public List<Boolean> readBits(List<String> addressList) { if (s7PLC == null || addressList.isEmpty()) { return null; } List<Boolean> values = new ArrayList<>(); for (String address : addressList) { try { boolean value = s7PLC.readBoolean(address); values.add(value); } catch (Exception e) { // 处理异常 System.out.println("读取 " + address + " 失败:" + e.getMessage()); } } return values; } //读取String public List<String> readStrings(List<String> addressList) { if (s7PLC == null) { return null; } List<String> result = new ArrayList<>(); for (String address : addressList) { try { byte[] bytes = s7PLC.readByte(address, 14); if (bytes != null) { String str = new String(bytes, StandardCharsets.UTF_8); result.add(str); } } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); result.add(null); } } return result; } public List<String> readStringsandword(List<String> addressList) { if (s7PLC == null) { return null; } List<String> result = new ArrayList<>(); for (String address : addressList) { try { if (address.contains("-")) { address = address.substring(0, address.indexOf("-")); byte[] bytes = s7PLC.readByte(address, 14); if (bytes != null) { String str = new String(bytes, StandardCharsets.UTF_8); result.add(str); } } else { Short value = s7PLC.readInt16(address); result.add(value.toString()); } } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); result.add(null); } } return result; } //不连续地址写入Word public void WriteWord(List<String> address, List<Short> datas) { if (s7PLC == null) return; for (int i = 0; i < address.size(); i++) { String addr = address.get(i); short data = datas.get(i); if (addr.contains("-")) { outmesid(String.valueOf(data),addr); // 单独处理带破折号的地址 } else { s7PLC.writeInt16(addr, data); // 将数据写入单个地址 } } } //字符串写入 public void outmesid(String data, String addr) { // System.out.println("outmesid: " + data); List<Byte> glassidlist = new ArrayList<>(); String[] parts = addr.split("-"); if (parts.length == 2) { addr = parts[0]; // 只保留 "-" 前面的部分 } for (char iditem : data.toCharArray()) { glassidlist.add(Byte.valueOf(String.valueOf(iditem))); } byte[] bytes = Bytes.toArray(glassidlist); S7control.getinstance().WriteByte(addr, bytes); } //读取不连续word public List<Short> readWords(List<String> addresses) { if (s7PLC == null) { return null; } List<Short> data = new ArrayList<>(); for (String address : addresses) { try { // 单个地址 Short value = s7PLC.readInt16(address); data.add(value); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); } } return data; } //读取时间 public Long readtime(String address) { if (s7PLC == null) return null; try { return s7PLC.readTime(address); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } } public void writetime(String address, long datas) { if (s7PLC == null) return; s7PLC.writeTime(address, datas); // 将数据写入单个地址 } private int extractAddressNumber(String address) { String numberStr = address.replaceAll("\\D+", ""); // 使用正则表达式提取数字部分 return Integer.parseInt(numberStr); } /** * 从指定的地址开始 连续按bit位读取 * * @param address 地址 * @param count 长度 * @return Boolean结果 */ public List<Boolean> ReadBits(String address, int count) { if (s7PLC == null) return null; List<String> addresslist = GetAddressList(address, count, 1); try { return s7PLC.readBoolean(addresslist); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } }; public void writeString(String addr,String data) { s7PLC.writeString(addr,data); } private List<String> GetAddressList(String address, int count, int addedbit) { List<String> addresslist = new ArrayList<String>(); String[] stringdatas = address.trim().split("\\."); if (stringdatas.length < 2 || !address.startsWith("DB")) return null; int dbwindex = 0; int bitindex = 0; if (stringdatas.length == 2) { dbwindex = Integer.parseInt(stringdatas[1]); } else if (stringdatas.length == 3) { dbwindex = Integer.parseInt(stringdatas[1]); bitindex = Integer.parseInt(stringdatas[2]); } else return null; addresslist.add(address); for (int i = 0; i < count-1; i++) { int bitcurrent = bitindex + addedbit; if (bitcurrent > 7) { dbwindex += bitcurrent / 8; bitindex = 0; } else bitindex = bitcurrent; String endstr=stringdatas.length==3?"." + bitindex:""; addresslist.add(stringdatas[0] + "." + dbwindex + endstr); } return addresslist; } } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/entity/DownStorageCageDetails.java
@@ -81,6 +81,11 @@ */ private Integer temperingFeedSequence; /** * 膜系id */ private int filmsid; /** * 状态 */ hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/mapper/SelectInfo.java
New file @@ -0,0 +1,75 @@ package com.mes.downstorage.mapper; import com.mes.downstorage.entity.DownStorageCageDetails; import com.mes.uppattenusage.entity.GlassInfo; import com.mes.downglassinfo.entity.DownGlassTask; import org.apache.ibatis.annotations.*; import java.util.List; import java.util.Map; @Mapper public interface SelectInfo { // 玻璃信息 按ID查询 @Select("select * from `glass_info` where id=#{id}") GlassInfo SelectGlassId(String id); // 钢化按工程查询 //@Select("select * from `v_optimize_heat_layout` where project_no=#{projeceid} ") //List<Map> SelectTemperedTerritory(String projeceid); // // // 切割版图按工程查询 // @Select("select * from optimize_detail where project_no=#{projeceid} ") // List<Map> SelectCutTerritory(String projeceid); // // // 查询磨边信息 // @Select("select * from task_cache where task_type='2' and task_stauts='2' and end_cell=#{EndCell}") // List<Map> SelectEdgInfo(String EndCell); // 查询笼子内空闲 @Select("select escd.* from down_storage_cage as esc LEFT JOIN down_storage_cage_details as escd on esc.slot=escd.slot where escd.slot is null order by escd.slot") List<DownStorageCageDetails> SelectCacheLeisure(); // 查询笼子内出片任务 @Select("select escd.* from down_storage_cage as esc LEFT JOIN down_storage_cage_details as escd on esc.slot=escd.slot WHERE escd.slot IS NOT NULL order by escd.tempering_layout_id,escd.tempering_feed_sequence") List<DownStorageCageDetails> SelectCacheOut(); // 查询笼子内信息 @Select("select escd.* from down_storage_cage as esc LEFT JOIN down_storage_cage_details as escd on esc.slot=escd.slot order by esc.slot") List<DownStorageCageDetails> SelectCachInfo(); // 查询可进此片玻璃的栅格号 @Select("select escd.* from down_storage_cage as esc LEFT JOIN down_storage_cage_details as escd on esc.slot=escd.slot where escd.slot is not null escd.tempering_layout_id=#{tempering_layout_id} and escd.tempering_feed_sequence<#{tempering_feed_sequence} and esc.remain_width-#{width}>0 order by escd.tempering_feed_sequence") List<DownStorageCageDetails> SelectIsExistIntoCache(Integer tempering_layout_id, Integer tempering_feed_sequence, double width); // 查询可进此片玻璃的栅格号 @Select("select escd.* from down_storage_cage as esc LEFT JOIN down_storage_cage_details as escd on esc.slot=escd.slot where escd.slot is not null escd.tempering_layout_id<#{tempering_layout_id} and esc.remain_width-#{width}>0 order by escd.tempering_layout_id desc,escd.tempering_feed_sequence") List<DownStorageCageDetails> SelectIsExistIntoCache(Integer tempering_layout_id, double width); // 查询全部任务 @Select("select * from down_glass_task") List<DownGlassTask> SelectCacheInfoAll(); // 查询进片任务 @Select("select * from down_glass_task where task_type='1' and task_stauts='0'") List<DownGlassTask> SelectInputCacheInfo(); // 查询出片任务 @Select("select * from down_glass_task where task_type='2' and task_stauts='0'") List<DownGlassTask> SelectOutCacheInfo(); // 查询 A06 或 A11 最新的一片 出片任务 @Select("select * from down_glass_task where task_type='2' and task_stauts='2' and end_cell=#{EndCell} limit 1") GlassInfo SelectLastOutCacheInfo(String EndCell); // 修改笼子内信息 @Update("update") Integer UpdateCache(@Param("id") Integer id, @Param("order_id") String order_id); // 添加下片任务 @Insert("INSERT into down_glass_task VALUES(#{id},#{start},#{end},#{type},0,)") Integer insertCacheTask(String id, String start, String end, String type,double width,double height,Integer filmsId,double thickness,String flowCardId); } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownGlassCacheLogic.java
New file @@ -0,0 +1,234 @@ package com.mes.downstorage.service; import com.mes.common.PLCAutoMes; import com.mes.common.S7control; import com.mes.device.PlcParameterObject; import com.mes.downstorage.entity.DownStorageCageDetails; import com.mes.downstorage.mapper.SelectInfo; import com.mes.uppattenusage.entity.GlassInfo; import lombok.Data; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Data @Service public class DownGlassCacheLogic { @Autowired private SelectInfo selectInfo; /** * @param Number * //识别逻辑 不交互 */ public void identify(String Number){ //查询任务 PlcParameterObject plcmes= PLCAutoMes.PlcMesObject; S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),(short) 1); String s=S7control.getinstance().ReadWord("DB14.26", 1).get(0)+""; boolean isexist=isExist(Number); if (isexist) { //存在逻辑 1.添加信息 2.回复PLC存在 //S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),(short) 1); }else { //不存在逻辑 1.回复PLC不存在 //S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),(short) 2); } } //下片前理片 public static final String RESULT_IN = "1"; public static final String RESULT_OUT = "2"; public static final String RESULT_IN_OUT = "3"; public void process() { String result = S7control.getinstance().ReadWord("DB14.0", 1).get(0) + ""; String number = S7control.getinstance().ReadWord("DB14.2", 1).get(0) + ""; // 进片请求 if (RESULT_IN.equals(result)) { processInto(number); } // 出片请求 else if (RESULT_OUT.equals(result)) { processOut(); } // 进出片请求 else if (RESULT_IN_OUT.equals(result)) { // 先出后进 if (!processOut()) { processInto(number); } } } /** * @param Number * @return * //下片前理片 进 */ public boolean processInto(String Number){ //按id查询玻璃信息表里的玻璃 GlassInfo GlassInfo=selectInfo.SelectGlassId(Number); PlcParameterObject plcmes=PLCAutoMes.PlcMesObject; //存在此玻璃编号 if(GlassInfo!=null){ //同钢化版图内的栅格号 List<DownStorageCageDetails> list=selectInfo.SelectIsExistIntoCache(GlassInfo.getTemperingLayoutId(),GlassInfo.getTemperingFeedSequence(),GlassInfo.getWidth()); //空栅格号 if (list.size()==0) { list=selectInfo.SelectCacheLeisure(); } //小于此玻璃钢化版图序号的栅格号 if(list.size()==0){ list=selectInfo.SelectIsExistIntoCache(GlassInfo.getTemperingLayoutId(),GlassInfo.getWidth()); } if(list.size()>0){ //存在空格 //1.生成任务: 起始位置0 结束位置this.slot 任务类型 1 (进片任务) //2.回复 1进片 DownStorageCageDetails item=list.get(0); selectInfo.insertCacheTask(GlassInfo.getId()+"","0",item.getSlot()+"","1",GlassInfo.getWidth(),GlassInfo.getHeight(),GlassInfo.getFilmsid(),GlassInfo.getThickness(),GlassInfo.getFlowcardId()); S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),(short) 1); return true; } }else{ // ID编号不存在 不处理/回复PLC 进行报警提示 } //返回结果 return false; } //理片 出 public boolean processOut(){ //查询任务 String G06=S7control.getinstance().ReadWord("DB14.56", 1).get(0)+""; String G11=S7control.getinstance().ReadWord("DB14.58", 1).get(0)+""; String G13=S7control.getinstance().ReadWord("DB14.58", 1).get(0)+""; PlcParameterObject plcmes=PLCAutoMes.PlcMesObject; List<DownStorageCageDetails> list=selectInfo.SelectCacheOut(); //其他情况条件 如:后续设备故障禁止理片出片 等 boolean isOut=true; if (list.size()>0&&isOut) { DownStorageCageDetails item=list.get(0); // if(G06=="0"&&G11=="1"){ //出到 G06 selectInfo.insertCacheTask(item.getGlassId()+"","0","06","2",item.getWidth(),item.getHeight(),item.getFilmsid(),item.getThickness(),item.getFlowCardId()); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.28").getAddress(), "1"); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.20").getAddress(), "1"); return true; }else if(G06=="1"&&G11=="0"){ //出到 G11 selectInfo.insertCacheTask(item.getGlassId()+"","0","11","2",item.getWidth(),item.getHeight(),item.getFilmsid(),item.getThickness(),item.getFlowCardId()); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.28").getAddress(), "2"); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.20").getAddress(), "1"); return true; }else if(G06=="0"&&G11=="0"){ //都允许 G04/G05 上一片是否和此片玻璃尺寸尺寸相同 String endcell="06"; String SendEndcell="1"; boolean If_=false; GlassInfo glassInfo06= selectInfo.SelectLastOutCacheInfo("06"); GlassInfo glassInfo11= selectInfo.SelectLastOutCacheInfo("11"); GlassInfo glassInfo13= selectInfo.SelectLastOutCacheInfo("13"); if(glassInfo06!=null&&glassInfo11.getWidth()==item.getWidth()&&glassInfo06.getHeight()==item.getHeight()){ endcell="11"; SendEndcell="2"; }else if(item.getHeight()>=3440&&item.getWidth()>=1440){ //其他条件人工处理 } selectInfo.insertCacheTask(item.getGlassId()+"","0",endcell,"2",item.getWidth(),item.getHeight(),item.getFilmsid(),item.getThickness(),item.getFlowCardId()); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.28").getAddress(), SendEndcell); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.20").getAddress(), "1"); return true; } } //返回结果 return false; } /** * @param Number * //磨边 不交互 理片和磨边机自己交互 */ public void processMb(String Number){ //按id查询玻璃信息表里的玻璃 GlassInfo GlassInfo=selectInfo.SelectGlassId(Number); PlcParameterObject plcmes=PLCAutoMes.PlcMesObject; if(GlassInfo!=null){ //发送任务 ID 长 宽 厚 倒角 工艺功能等 S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.22").getAddress(),"N10000"); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.24").getAddress(), "1000"); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.26").getAddress(),"800"); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.28").getAddress(),"60"); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.30").getAddress(), "2"); S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.20").getAddress(), "1"); } //返回结果 } /** * @param Number * @return * 查询消息队列里此玻璃ID的数据 */ public boolean selectMessageId(String Number){ //查询是否存在 GlassInfo GlassInfo=selectInfo.SelectGlassId(Number); if(GlassInfo==null){ //返回 不存在 return false; } //返回 存在 return true; } /** * @param Number * @return * 删除消息队列里此玻璃ID的数据 */ public boolean deleteMessageId(String Number){ //查询是否存在 GlassInfo GlassInfo=selectInfo.SelectGlassId(Number); if(GlassInfo==null){ //返回 不存在 return false; } //返回 存在 return true; } /** * @param Number * @return * //是否存在此编号玻璃 */ public boolean isExist(String Number){ //查询是否存在 GlassInfo GlassInfo=selectInfo.SelectGlassId(Number); if(GlassInfo==null){ //返回 不存在 return false; } //返回 存在 return true; } } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/DownGlassLogic.java
@@ -64,10 +64,11 @@ downGlassInfoMapper = WebSocketServer.applicationContext.getBean(DownGlassInfoMapper.class); List<DownGlassInfo> taskdownGlassInf = downGlassInfoMapper.selectunloadingtaskstate(); // if (taskdownGlassInf != null && !taskdownGlassInf.isEmpty()) { // for (DownGlassInfo downGlassInfo : taskdownGlassInf) { // 创建新的 DownGlassInfo 对象并设置相关属性 @@ -88,6 +89,7 @@ // 插入数据到下片玻璃信息表 downGlassInfoMapper.insert(newdownGlassInfo); //插入数据到机械手任务表 downWorkstationMapper.insertdownWorkstationtask(newdownGlassInfo); //更新下片任务表状态为0 downGlassInfoMapper.updateTaskStateToZero(downGlassInfo.getFlowCardId());