package com.billion.main.plc.sub;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.billion.main.da.domain.DaParamCollection;
|
import com.billion.main.da.service.IDaParamCollectionService;
|
import com.billion.main.da.service.IDaStationCollectionService;
|
import com.billion.main.plc.constant.Constants;
|
import com.billion.main.sc.domain.ScCollectionParamConf;
|
import com.billion.main.sc.service.IScCollectionParamConfService;
|
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.springframework.stereotype.Component;
|
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.concurrent.CompletableFuture;
|
import java.util.stream.Collectors;
|
|
|
@Slf4j
|
public class OPCUaSubscriptionTemp implements SubscriptionCallback {
|
|
public static MiloService miloService;
|
public static IScCollectionParamConfService collectionParamConfService;
|
public static IDaParamCollectionService paramCollectionService;
|
public static IDaStationCollectionService stationCollectionService;
|
|
public OPCUaSubscriptionTemp(MiloService miloService, IScCollectionParamConfService collectionParamConfService
|
, IDaParamCollectionService paramCollectionService, IDaStationCollectionService stationCollectionService) {
|
OPCUaSubscriptionTemp.miloService = miloService;
|
OPCUaSubscriptionTemp.collectionParamConfService = collectionParamConfService;
|
OPCUaSubscriptionTemp.paramCollectionService = paramCollectionService;
|
OPCUaSubscriptionTemp.stationCollectionService = stationCollectionService;
|
}
|
|
@Override
|
public void onSubscribe(String identifier, Object value) {
|
log.info("地址:"+identifier+"值:"+value);
|
try {
|
if(null != value && !Constants.ZERO.equals(value.toString())) {
|
String[] nodes = identifier.split("[.]");
|
String thoroughfare = nodes[0];//通道
|
String device = nodes[1];//设备
|
String tab = nodes[2];//标记
|
String valueString = value.toString();//地址值
|
|
CompletableFuture<Void> cp1 = CompletableFuture.runAsync(() -> {
|
subHandle(thoroughfare,device,tab,valueString);
|
});
|
|
}
|
} catch (Exception e) {
|
log.error(e.getMessage());
|
}
|
}
|
|
public void subHandle(String thoroughfare,String device,String tab,String valueString){
|
try{
|
//监听recordData
|
if(tab.equals(Constants.RECORD_DATA)){
|
//如果是1做进站处理
|
if(valueString.equals(Constants.ONE)){
|
Object sfcCodeObject = miloService.readFromOpcUa(thoroughfare + "." + device + ".sfcCode").getValue();
|
if(ObjectUtil.isNotNull(sfcCodeObject)){
|
miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(Constants.STRING_ONE_ONE).build());
|
}else {
|
miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(Constants.STRING_ONE_TWO).build());
|
}
|
//如果是2做出站处理处理
|
}else if(valueString.equals(Constants.TWO)){
|
String result = Constants.STRING_TWO_ONE;
|
//读变速箱总成码
|
Object sfcCodeObject = miloService.readFromOpcUa(thoroughfare + "." + device + ".sfcCode").getValue();
|
//为空时,返回5
|
if (ObjectUtil.isNull(sfcCodeObject)){
|
miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(Constants.STRING_TWO_FIVE).build());
|
}else {
|
String snCode = sfcCodeObject.toString().trim();//产品SN
|
Object stationStatusObjcet = miloService.readFromOpcUa(thoroughfare + "." + device + ".StationStatus").getValue();//站状态地址
|
String stationStatus = stationStatusObjcet.toString();
|
if (ObjectUtil.isNotNull(stationStatusObjcet)) {
|
//保存参数,发送工厂MES
|
result = saveParamCollection(device, snCode, stationStatus);
|
//保存过站记录
|
savePassingStation(device,snCode,stationStatus);
|
}else {
|
result = Constants.STRING_TWO_THREE;
|
log.info("读取到工位{}StationStatus数据:{},返回RecordDataDone的值为{}", device, "IS NULL!", result);
|
}
|
}
|
miloService.writeToOpcUa(ReadWriteEntity.builder().identifier(thoroughfare + "." + device + ".RecordDataDone").value(result).build());
|
}
|
}
|
}catch (Exception e) {
|
log.error(e.getMessage());
|
}
|
}
|
|
/**
|
* 保存过站数据
|
*
|
* @param device 工位
|
* @param snCode 产品序列号
|
* @return Integer
|
* @throws Exception e
|
*/
|
private static Integer savePassingStation(String device, String snCode,String stationStatus){
|
Integer result = 21;
|
try {
|
|
|
} catch (Exception e) {
|
throw new RuntimeException(e);
|
}
|
|
return result;
|
}
|
|
/**
|
* 保存参数数据和发送工厂MES
|
* @param device 工位
|
* @param snCode 产品SN
|
* @param stationStatus 站状态
|
* @return result
|
* @throws Exception e
|
*/
|
private static String saveParamCollection(String device,String snCode,String stationStatus){
|
String result = Constants.STRING_TWO_ONE;//返回结果
|
try {
|
//查询参数配置表
|
List<ScCollectionParamConf> list = collectionParamConfService.list(new LambdaQueryWrapper<ScCollectionParamConf>()
|
.eq(ScCollectionParamConf::getLocationCode, device)//工位
|
.eq(ScCollectionParamConf::getSubscribe, Constants.ONE)//是否采集
|
);
|
if (CollUtil.isNotEmpty(list)){
|
List<String> collect = list.stream()
|
.map(ScCollectionParamConf::getNode).collect(Collectors.toList());
|
List<ReadWriteEntity> readWriteEntityList = miloService.readFromOpcUa(collect);
|
ArrayList<DaParamCollection> collectionList = new ArrayList<>();
|
for (int i = 0; i < readWriteEntityList.size(); i++) {
|
DaParamCollection daParamCollection = new DaParamCollection();
|
daParamCollection.setSfcCode(snCode);
|
daParamCollection.setLocationCode(device);
|
daParamCollection.setParamCode(list.get(i).getParamCode());//参数编码
|
daParamCollection.setParamName(list.get(i).getParamName());//参数名称
|
daParamCollection.setParamValue(readWriteEntityList.get(i).getValue().toString());
|
daParamCollection.setCollectTime(new Date());
|
collectionList.add(daParamCollection);
|
}
|
paramCollectionService.saveBatch(collectionList);
|
}
|
|
}catch (Exception e) {
|
throw new RuntimeException("保存数据发送工厂MES异常");
|
}
|
return result;
|
}
|
|
|
}
|