zhangyong
2024-11-26 dcc799551b532fa29d64f5f2cb614f5b80b233f6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package com.mes.job;
 
 
import com.kangaroohy.milo.model.ReadWriteEntity;
import com.kangaroohy.milo.service.MiloService;
import com.mes.pp.entity.OptimizeHeatDetail;
import com.mes.pp.entity.OptimizeHeatLayout;
import com.mes.pp.service.OptimizeHeatDetailService;
import com.mes.pp.service.OptimizeHeatLayoutService;
import com.mes.temperingglass.entity.TemperingGlass;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import com.mes.temperingglass.service.TemperingGlassInfoService;
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.Comparator;
import java.util.List;
import java.util.Optional;
 
 
@Component
@Slf4j
public class OpcNGTemperingTask {
 
    @Autowired(required = false)
    MiloService miloService;
 
    @Autowired
    private TemperingGlassInfoService temperingAgoService;
 
    @Autowired
    private OptimizeHeatLayoutService optimizeHeatLayoutService;
 
    @Autowired
    private OptimizeHeatDetailService optimizeHeatDetailService;
 
    /**
     * 摆片台请求进片逻辑处理
     * fixedRate : 上一个调用开始后再次调用的延时(不用等待上一次调用完成)
     * fixedDelay : 上一个调用结束后再次调用的延时
     */
    @Scheduled(fixedDelay = 1000)
    public void requestTemperingTask() throws Exception {
        ReadWriteEntity requestTemperingId = miloService.readFromOpcUa("XX.XX.requestTemperingId");//请求进片 炉号ID
        Integer id = Integer.parseInt(requestTemperingId.getValue().toString());
        if (id == 0) {
            miloService.writeToOpcUa(generateReadWriteEntity("XX.XX.responseInTempering", 0));//允许送片清零
        }
        ReadWriteEntity placedNumber = miloService.readFromOpcUa("XX.XX.placedNumber");//已摆片数量
        List<TemperingGlassInfo> glassList = temperingAgoService.selectGlassInfoById(id);
        if (glassList.size() == Integer.parseInt(placedNumber.getValue().toString())) {
            miloService.writeToOpcUa(generateReadWriteEntity("XX.XX.responseInTempering", 1));//写入允许送片
        }
    }
 
    /**
     * 钢化上片台下发参数逻辑处理
     * fixedRate : 上一个调用开始后再次调用的延时(不用等待上一次调用完成)
     * fixedDelay : 上一个调用结束后再次调用的延时
     */
    @Scheduled(fixedDelay = 1000)
    public void loadTemperingTask() throws Exception {
        ReadWriteEntity loadTemperingId = miloService.readFromOpcUa("XX.XX.loadTemperingId");//进片完成 炉号ID
        getNewTemperingID(Integer.parseInt(loadTemperingId.getValue().toString()));//进片完成 下发参数
    }
 
    //获取到炉号id执行参数下发任务
    private void getNewTemperingID(Integer temperingid) throws Exception {
        ReadWriteEntity AutoStatus = miloService.readFromOpcUa("GH1.GH1.AutoStatus");
        if (1 != Integer.parseInt(AutoStatus.getValue().toString())) {
            log.info("当前为非联机状态,结束钢化下发参数任务");
            return;
        }
        ReadWriteEntity QandA = miloService.readFromOpcUa("GH1.GH1.QandA");
        ReadWriteEntity RecipeStatus = miloService.readFromOpcUa("GH1.GH1.RecipeStatus");
        if (1 == Integer.parseInt(QandA.getValue().toString()) && 2 == Integer.parseInt(RecipeStatus.getValue().toString())) {
            log.info("版面信息已经下发,并且已经匹配参数,结束钢化下发参数任务");
            return;
        }
        List<TemperingGlassInfo> glassList = temperingAgoService.selectGlassInfoById(temperingid);
        if (glassList != null && glassList.size() > 0) {
            int glasstype = GetGlassType(glassList.get(0).getFilmsid());//膜系
            int process = 0;//钢化类型
            int thiness = (int) glassList.get(0).getThickness();//厚度
            String engineerId = glassList.get(0).getEngineerId();
            Integer temperingLayoutId = glassList.get(0).getTemperingLayoutId();
            OptimizeHeatLayout heatLayoutinfo = optimizeHeatLayoutService.selectHeatLayoutInfo(engineerId, temperingLayoutId);
            int loadingRate = (int) (heatLayoutinfo.getLayoutRate() * 100); //装载率
            loadingRate = loadingRate > 10000 ? 10000 : loadingRate;
            List<OptimizeHeatDetail> heatDetailGlassInfoList = optimizeHeatDetailService.selectHeatDetailGlassInfo(engineerId, temperingLayoutId);
 
            Optional<Double> maxProductOpt = heatDetailGlassInfoList.stream()
                    .map(ohd -> ohd.getWidth() * ohd.getHeight())
                    .max(Double::compareTo);
            double totalarea = heatDetailGlassInfoList.stream().mapToDouble(ohd -> ohd.getWidth() * ohd.getHeight()).sum();
 
            int shape = 0; //最大片占总面积的比例
            if (maxProductOpt.isPresent()) {
                shape = (int) (maxProductOpt.get() / totalarea * 100);
            }
            shape = shape > 10000 ? 10000 : shape;
            int workmode = 0; //工位数
            int furmode = 0; //双室/联室
 
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.TemperingId", temperingid));//写入炉号
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.GlassType", glasstype));//写入玻璃类型
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Process", process));//写入钢化类型 全钢 半钢 防火
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Thickness", thiness));//写入厚度
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.LoadingRate", loadingRate));//写入装载率
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Shape", shape));//写入大片比例
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.WorkMode", workmode));//写入工位数
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.FurnaceMode", furmode));//写入炉体工作方式
            log.info("炉号" + temperingid + "版面信息尝试下发");
        }
    }
 
 
    //根据膜系返回玻璃类型
    private int GetGlassType(String glasstype) {
        int result = 0;
        String str = glasstype.toLowerCase();
        if (str.contains("白玻")) {
            result = 0;
        }
        if (str.contains("超白")) {
            result = 4;
        }
        if (str.contains("lowe") || str.contains("low-e")) {
            result = 1;
        }
        if (str.contains("双银")) {
            result = 2;
        }
        if (str.contains("三银")) {
            result = 3;
        }
        if (str.contains("热反射")) {
            result = 5;
        }
        return result;
    }
 
    private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) {
        return ReadWriteEntity.builder()
                .identifier(identifier)
                //Kep中是Long类型,即:Int32,Java中的int类型
                .value(value)
                .build();
    }
}