| | |
| | | import com.jcdm.main.plcserver.conf.OPCElement; |
| | | import com.jcdm.main.plcserver.util.TimeUtil; |
| | | import com.jcdm.main.restful.factoryMes.service.RestfulService; |
| | | import com.jcdm.main.restful.qingYan.doman.ChildVO; |
| | | import com.jcdm.main.restful.qingYan.doman.ParentVO; |
| | | import com.kangaroohy.milo.model.ReadWriteEntity; |
| | | import com.kangaroohy.milo.runner.subscription.SubscriptionCallback; |
| | | import com.kangaroohy.milo.service.MiloService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.websocket.Session; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.Instant; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | |
| | | @Slf4j |
| | | @Component |
| | | public class OPCUaSubscription implements SubscriptionCallback { |
| | | |
| | | private static final Logger logger = LoggerFactory.getLogger("sys-user"); |
| | | |
| | | public SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | |
| | |
| | | @Override |
| | | public void onSubscribe(String identifier, Object value) { |
| | | |
| | | logger.info("地址:"+identifier+"值:"+value); |
| | | try { |
| | | if(null != value && Integer.valueOf(value.toString())!= 0) { |
| | | String[] nodes = identifier.split("[.]"); |
| | |
| | | if(automaticList.stream().anyMatch(s -> s.equals(device))){ |
| | | //自动工位 |
| | | //出站保存数据 |
| | | recordDataDoneValue = outSaveDate(thoroughfare,device); |
| | | outSaveDate(thoroughfare,device); |
| | | //记录数据完成 |
| | | String RecordDataDoneAddress = thoroughfare + "." + device + ".RecordDataDone"; |
| | | miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(Integer.valueOf(recordDataDoneValue)).build()); |
| | | /*String RecordDataDoneAddress = thoroughfare + "." + device + ".RecordDataDone"; |
| | | miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(Integer.valueOf(recordDataDoneValue)).build());*/ |
| | | }else { |
| | | //手动工位 |
| | | // if(device.contains("OP330")){ |
| | |
| | | // } |
| | | if(testList.stream().anyMatch(s -> s.equals(device))){ |
| | | String RecordDataDoneAddress = thoroughfare + "." + device + ".RecordDataDone"; |
| | | miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(21).build()); |
| | | // Object packCodeObject = miloService.readFromOpcUa(thoroughfare + "." + device + ".ModuleCode").getValue(); |
| | | // DaTestDeviceInterface deviceInterfaceOne = null; |
| | | // |
| | |
| | | // writeToOpc(RecordDataDoneAddress, (short) 22); |
| | | // } |
| | | // writeToOpc(RecordDataDoneAddress, (short) 21); |
| | | miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(21).build()); |
| | | } |
| | | |
| | | |
| | |
| | | List<Object> collect = list1.stream().map(ReadWriteEntity::getValue).collect(Collectors.toList()); |
| | | String joinedString = String.join(",", collect.toString()); |
| | | WebSocketUsers.sendMessageToUserByText(map.get(device), TightenTheConversionOkNg(joinedString)); |
| | | if(device.contains("270") || device.contains("260")){ |
| | | logger.info("读取到工位{}的Scaner数据:{}",device,TightenTheConversionOkNg(joinedString)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | |
| | | logger.info("订阅方法报错:{}"+e.getMessage()); |
| | | logger.error("订阅方法报错",e); |
| | | } |
| | | } |
| | | |
| | |
| | | /** |
| | | * 出站保存数据 |
| | | */ |
| | | public String outSaveDate(String thoroughfare,String device) { |
| | | public void outSaveDate(String thoroughfare,String device) { |
| | | String snCode = ""; |
| | | String result = ""; |
| | | String read = thoroughfare + "." + device + "."; |
| | | |
| | | try { |
| | | if(nullList.stream().noneMatch(s -> s.equals(device))){ |
| | | if(nullList.stream().noneMatch(s -> s.equals(device))){//删除…………………………………………………… |
| | | if(moduleCodeList.stream().anyMatch(s -> s.equals(device))){ |
| | | read = read + "ModuleCode"; |
| | | if(device.equals("OP365")){ |
| | | try { |
| | | saveStationInfo365(thoroughfare,device); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | }else { |
| | | read = read + "PACKCode"; |
| | | } |
| | | } |
| | | snCode = miloService.readFromOpcUa(read).getValue().toString(); |
| | | |
| | | if(null == snCode || "".equals(snCode)){ |
| | | result = "22"; |
| | | }else{ |
| | | |
| | | String workOrderNo = ""; |
| | | String productCode = ""; |
| | | //2、保存过站采集数据 |
| | | Object orderNumberObject = miloService.readFromOpcUa(thoroughfare + "." + device + "." + "WorkOrderNumber").getValue(); |
| | | if(orderNumberObject!=null){ |
| | | workOrderNo = orderNumberObject.toString(); |
| | | } |
| | | |
| | | Object productCodeObject = miloService.readFromOpcUa(thoroughfare + "." + device + "." + "ProductType").getValue(); |
| | | if(productCodeObject!=null){ |
| | | productCode = productCodeObject.toString(); |
| | | } |
| | | |
| | | saveStationInfo(snCode,thoroughfare,device,workOrderNo,productCode); |
| | | //3、保存参数采集数据 |
| | | SaveParamData(snCode,thoroughfare,device,workOrderNo,productCode); |
| | | |
| | | //如果是末尾工站要报工 |
| | | if(device.equals("OP500")){ |
| | | RestfulService.getWorkReportResultFeedback(snCode,device,format.format(new Date())); |
| | | //1、更新工单信息 |
| | | updateOrderInfo(snCode); |
| | | } |
| | | try{ |
| | | daParamCollectionService.pushGeelycvMesFeedback(snCode,device); |
| | | if(device.equals("OP365")){ |
| | | try { |
| | | saveStationInfo365(thoroughfare,device); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | result = "21"; |
| | | }else { |
| | | snCode = miloService.readFromOpcUa(read).getValue().toString(); |
| | | |
| | | if(null == snCode || "".equals(snCode)){ |
| | | String RecordDataDoneAddress = thoroughfare + "." + device + ".RecordDataDone"; |
| | | miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(Integer.valueOf("22")).build()); |
| | | }else{ |
| | | |
| | | String workOrderNo = ""; |
| | | String productCode = ""; |
| | | //2、保存过站采集数据 |
| | | Object orderNumberObject = miloService.readFromOpcUa(thoroughfare + "." + device + "." + "WorkOrderNumber").getValue(); |
| | | if(orderNumberObject!=null){ |
| | | workOrderNo = orderNumberObject.toString(); |
| | | } |
| | | |
| | | Object productCodeObject = miloService.readFromOpcUa(thoroughfare + "." + device + "." + "ProductType").getValue(); |
| | | if(productCodeObject!=null){ |
| | | productCode = productCodeObject.toString(); |
| | | } |
| | | |
| | | saveStationInfo(snCode,thoroughfare,device,workOrderNo,productCode); |
| | | //3、保存参数采集数据 |
| | | List<DaParamCollection> daParamCollectionList = SaveParamData(snCode,thoroughfare,device,workOrderNo,productCode); |
| | | |
| | | //如果是末尾工站要报工 |
| | | if(device.equals("OP500")){ |
| | | RestfulService.getWorkReportResultFeedback(snCode,device,format.format(new Date())); |
| | | //1、更新工单信息 |
| | | updateOrderInfo(snCode); |
| | | } |
| | | |
| | | try{ |
| | | daParamCollectionService.automaticWorkstationPushGeelycvMesFeedback(snCode,device,daParamCollectionList); |
| | | }catch (Exception e){ |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | }catch (Exception e) { |
| | | System.out.println(e.getMessage()); |
| | | logger.error("出站保存数据异常:"+e); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | |
| | | * 保存过站采集 |
| | | */ |
| | | public void saveStationInfo(String packCode,String thoroughfare,String device,String workOrderNo,String productCode) throws Exception { |
| | | logger.info("进入工位{}-方法saveStationInfo",device); |
| | | SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); |
| | | sdf.setTimeZone(TimeZone.getTimeZone("GMT+8")); // CST通常表示中国标准时间,即东八区 |
| | | String prefix = thoroughfare+"."+device+"."; |
| | |
| | | daPassingStationCollection.setOutboundTime(format.parse(TimeUtil.test(end)));//出站时间 |
| | | daPassingStationCollection.setOutRsSign(stationStatus);//出站是否合格 |
| | | daPassingStationCollectionService.insertDaPassingStationCollection(daPassingStationCollection); |
| | | logger.info("结束工位{}-方法saveStationInfo",device); |
| | | } |
| | | |
| | | public static void SaveParamData(String packCode,String thoroughfare,String device,String workOrderNo,String productType) throws Exception { |
| | | public static List<DaParamCollection> SaveParamData(String packCode,String thoroughfare,String device,String workOrderNo,String productType) throws Exception { |
| | | logger.info("进入工位{}-方法SaveParamData",device); |
| | | List<DaCollectionParamConf> list; |
| | | DaCollectionParamConf daCollectionParamConf = new DaCollectionParamConf(); |
| | | daCollectionParamConf.setGatherAddress(thoroughfare+ "." + device); |
| | | list = collectionParamConfService.selectDaCollectionParamConfList(daCollectionParamConf); |
| | | List<DaParamCollection> daParamCollectionlist = new ArrayList<>(); |
| | | |
| | | List<String> nodeIdList = list.stream().map(info -> { |
| | | String nodeid = info.getGatherAddress(); |
| | |
| | | |
| | | if(!nodeIdList.isEmpty()){ |
| | | List<ReadWriteEntity> readWriteEntityList = miloService.readFromOpcUa(nodeIdList); |
| | | for (int i = 0; i < readWriteEntityList.size(); i++) { |
| | | for(int i=0;i<nodeIdList.size();i++){ |
| | | if(readWriteEntityList.get(i).getValue() == null){ |
| | | readWriteEntityList.get(i).setValue(" "); |
| | | } |
| | | } |
| | | List<DaParamCollection> daParamCollectionlist = new ArrayList<>(); |
| | | for(int i=0;i<nodeIdList.size();i++){ |
| | | if(!readWriteEntityList.get(i).getValue().toString().equals("0.0")){ |
| | | String tt = readWriteEntityList.get(i).getValue().toString(); |
| | | DaParamCollection ParamCollection = new DaParamCollection(); |
| | | ParamCollection.setParamCode(list.get(i).getCollectParameterId()); |
| | | ParamCollection.setLocationCode(device); |
| | | if(tt.contains("Time")){ |
| | | // String str = TimeUtil.getTimestamp(TimeUtil.stringProcessing(tt)); |
| | | // ParamCollection.setParamValue(str); |
| | | ParamCollection.setParamValue(TimeUtil.test(TimeUtil.stringProcessing(tt))); |
| | | }else { |
| | | ParamCollection.setParamValue(readWriteEntityList.get(i).getValue().toString()); |
| | | } |
| | | ParamCollection.setSfcCode(packCode); |
| | | if(device.contains("OP360")){ |
| | | String node = nodeIdList.get(i); |
| | | Object value = miloService.readFromOpcUa("PACK.OP360.ModuleSNCode"+node.charAt(node.length()-1)).getValue(); |
| | | if(value!=null){ |
| | | ParamCollection.setModuleCode(value.toString()); |
| | | } |
| | | } |
| | | ParamCollection.setParamName(list.get(i).getCollectParameterName()); |
| | | ParamCollection.setParamUpper(list.get(i).getParamUpper()); |
| | | ParamCollection.setParamLower(list.get(i).getParamLower()); |
| | | ParamCollection.setUnit(list.get(i).getCollectParameterUnit()); |
| | | //ParamCollection.setState("合格"); |
| | | ParamCollection.setType(list.get(i).getCollectParameterType()); |
| | | ParamCollection.setCollectionTime(new Date()); |
| | | ParamCollection.setWorkOrderNo(workOrderNo); |
| | | ParamCollection.setProductCode(productType); |
| | | daParamCollectionlist.add(ParamCollection); |
| | | // daParamCollectionService.insertDaParamCollection(ParamCollection); |
| | | String paramValue = readWriteEntityList.get(i).getValue().toString(); |
| | | DaParamCollection ParamCollection = new DaParamCollection(); |
| | | ParamCollection.setParamCode(list.get(i).getCollectParameterId()); |
| | | ParamCollection.setLocationCode(device); |
| | | if(paramValue.contains("Time")){ |
| | | ParamCollection.setParamValue(TimeUtil.test(TimeUtil.stringProcessing(paramValue))); |
| | | }else { |
| | | ParamCollection.setParamValue(readWriteEntityList.get(i).getValue().toString()); |
| | | } |
| | | ParamCollection.setSfcCode(packCode); |
| | | if(device.contains("OP360")){ |
| | | String node = nodeIdList.get(i); |
| | | Object value = miloService.readFromOpcUa("PACK.OP360.ModuleSNCode"+node.charAt(node.length()-1)).getValue(); |
| | | if(value!=null){ |
| | | ParamCollection.setModuleCode(value.toString()); |
| | | } |
| | | } |
| | | ParamCollection.setParamName(list.get(i).getCollectParameterName()); |
| | | ParamCollection.setParamUpper(list.get(i).getParamUpper()); |
| | | ParamCollection.setParamLower(list.get(i).getParamLower()); |
| | | ParamCollection.setUnit(list.get(i).getCollectParameterUnit()); |
| | | ParamCollection.setType(list.get(i).getCollectParameterType()); |
| | | ParamCollection.setCollectionTime(new Date()); |
| | | ParamCollection.setWorkOrderNo(workOrderNo); |
| | | ParamCollection.setProductCode(productType); |
| | | daParamCollectionlist.add(ParamCollection); |
| | | } |
| | | daParamCollectionService.saveBeachDaParamCollection(daParamCollectionlist); |
| | | } |
| | | addBaseData(workOrderNo,productType,device,packCode); |
| | | |
| | | String RecordDataDoneAddress = thoroughfare + "." + device + ".RecordDataDone"; |
| | | miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(Integer.valueOf("21")).build()); |
| | | logger.info("给工位{}写了21",device); |
| | | daParamCollectionService.saveBeachDaParamCollection(daParamCollectionlist); |
| | | List<DaParamCollection> baseDataList = addBaseData(workOrderNo,productType,device,packCode); |
| | | for (int i = 0; i < baseDataList.size(); i++){ |
| | | daParamCollectionlist.add(baseDataList.get(i)); |
| | | } |
| | | logger.info("结束工位{}-方法SaveParamData",device); |
| | | return daParamCollectionlist; |
| | | } |
| | | |
| | | public static void addBaseData(String workOrderNo,String productCode,String locationCode,String packCode){ |
| | | public static List<DaParamCollection> addBaseData(String workOrderNo,String productCode,String locationCode,String packCode){ |
| | | Map<String, String> map = new HashMap<>(); |
| | | map.put("GC", "南浔工厂"); |
| | | map.put("CXBH", "Pack线"); |
| | |
| | | confList.add(saveData); |
| | | }); |
| | | daParamCollectionService.insertBatch(confList); |
| | | return confList; |
| | | } |
| | | |
| | | public static void getFactoryOrder(String locationCode){ |
| | |
| | | try { |
| | | value = Float.parseFloat(part); // 尝试将字符串转换为浮点数 |
| | | String replacement; |
| | | if (value == 1f) { |
| | | if(i<2){ |
| | | replacement = part; |
| | | }else{ |
| | | if (value == 1f) { |
| | | replacement = "OK"; |
| | | } else{ |
| | | replacement = "NG"; |
| | | } |
| | | } |
| | | /* if (value == 1f) { |
| | | replacement = "OK"; |
| | | } else if (value == 2f) { |
| | | replacement = "NG"; |
| | | } else { |
| | | replacement = part; // 如果不是1或2,则保持不变 |
| | | } |
| | | }*/ |
| | | sb.append(replacement); |
| | | if (i < parts.length - 1) { |
| | | sb.append(','); // 添加逗号(除了最后一个元素) |
| | |
| | | } |
| | | daPassingStationCollectionService.saveBeachDaPassingStationCollection(passingStationCollections); |
| | | miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(21).build()); |
| | | return; |
| | | logger.info("工位{}回复21",device); |
| | | |
| | | }else { |
| | | miloService.writeToOpcShort(ReadWriteEntity.builder().identifier(RecordDataDoneAddress).value(22).build()); |
| | | return; |
| | | } |
| | | } |
| | | |