zhoushihao
2025-09-05 f4390f7fc1185bf87e7d2dc641ec3032a792b83b
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
package com.mes.job;
 
import com.github.xingshuangs.iot.common.buff.ByteReadBuff;
import com.github.xingshuangs.iot.common.buff.EByteBuffFormat;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
import com.github.xingshuangs.iot.utils.ByteUtil;
import com.kangaroohy.milo.model.ReadWriteEntity;
import com.kangaroohy.milo.service.MiloService;
import com.mes.hollow.entity.vo.HollowGlassFormulaVO;
import com.mes.hollow.service.HollowFormulaDetailsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import javax.annotation.Resource;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
 
/**
 * @author SNG-015
 */
@Component
@Slf4j
public class OpcHollowRemoveTask {
    @Resource
    private HollowFormulaDetailsService hollowFormulaDetailsService;
    @Resource
    private OpcPlcStorageCageHollowTask opcPlcStorageCageHollowTask;
 
    @Autowired(required = false)
    MiloService miloService;
 
    @Autowired
    @Qualifier("CMJ1ModbusTcp")
    ModbusTcp CMJ1ModbusTcp;
 
    @Autowired
    @Qualifier("CMJ2ModbusTcp")
    ModbusTcp CMJ2ModbusTcp;
 
    private Integer offset = 40001;
 
    /**
     * 除膜机联机状态
     *
     * @throws Exception
     */
    @Scheduled(fixedDelay = 3000)
    public void filmRemoveStateOne() throws Exception {
        ModbusTcp modbusTcp = CMJ1ModbusTcp;
        try {
            modbusTcp.readUInt16(42001 - offset);
            log.info("除膜机1联机状态正常");
        } catch (Exception e) {
            log.error("除膜机1联机状态异常", e);
        }
    }
 
    @Scheduled(fixedDelay = 3000)
    public void filmRemoveStateTwo() throws Exception {
        ModbusTcp modbusTcp = CMJ2ModbusTcp;
        try {
            modbusTcp.readUInt16(42001 - offset);
            log.info("除膜机2联机状态正常");
        } catch (Exception e) {
            log.error("除膜机2联机状态异常", e);
        }
    }
 
    /**
     * 收到除膜机请求及玻璃id
     *
     * @throws Exception
     */
    @Scheduled(fixedDelay = 1000)
    public void hollowRemoveTaskOne() throws Exception {
        hollowRemoveChildTask("CMJ1.CMJ1.");
    }
 
    @Scheduled(fixedDelay = 1000)
    public void hollowRemoveTaskTwo() throws Exception {
        hollowRemoveChildTask("CMJ2.CMJ2.");
    }
 
    public String readString(ModbusTcp modbusTcp, int address) {
        //
        byte[] bytes = new byte[20];
        for (int i = 0; i < 10; i++) {
            int res = modbusTcp.readUInt16(address + i);
 
            bytes[i * 2 + 1] = (byte) ((res >> 8) & 0xFF);
            bytes[i * 2] = (byte) (res & 0xFF);
        }
        int endIndex = 0;
        while (endIndex < bytes.length) {
            if (bytes[endIndex] == 0) {
                break;
            }
            endIndex++;
        }
        // 截取有效部分
        return new String(bytes, 0, endIndex);
    }
 
    private void hollowRemoveChildTask(String cell) throws Exception {
        ModbusTcp modbusTcp = null;
        if ("CMJ1.CMJ1.".equals(cell)) {
            modbusTcp = CMJ1ModbusTcp;
        } else {
            modbusTcp = CMJ2ModbusTcp;
        }
        if (!modbusTcp.checkConnected()) {
            log.info("除膜机{}未连接", cell);
            return;
        }
        String glassIdEntitys = readString(modbusTcp, 42003 - offset);
        log.info("除膜{}获取当前的玻璃id:{}", cell, glassIdEntitys);
        Integer requestEntity = modbusTcp.readUInt16(42001 - offset);
        if (0 == requestEntity) {
            log.info("当前除膜机为单机状态");
            return;
        }
        int request = requestEntity;
        int flagRequest = request & 3;
        if (flagRequest != 3) {
            log.info("当前未收到请求玻璃id数据,结束任务");
            return;
        }
 
        String glassIdEntity = readString(modbusTcp, 42003 - offset);
        log.info("除膜{}获取当前的信号为:{},玻璃id:{}", cell, flagRequest, glassIdEntity);
        if (null == glassIdEntity || StringUtils.isBlank(glassIdEntity)) {
            log.info("当前未收到玻璃id数据,结束任务");
            return;
        }
        log.info("当前需要除膜的玻璃id为:{}", glassIdEntity);
        //按照玻璃id获取对应的任务id
        HollowGlassFormulaVO detailsVO = hollowFormulaDetailsService.queryFormulaDetailsByGlassId(glassIdEntity, null, null);
        if (null == detailsVO) {
            log.info("玻璃id不存在,请检查数据");
            return;
        }
        //按照任务id获取对应的配方信息
        int Id = 0;
        log.info("除膜{}获取玻璃{},是否除膜:{}", cell, requestEntity, detailsVO.getFilmRemove());
        if (detailsVO.getFilmRemove() == 0) {
            // 10111011
            int sendId = request & 63;
            Id = sendId + 4;
            modbusTcp.writeUInt16(42001 - offset, sendId);
        } else {
            // 先将对应的位置为0,获得请求的玻璃数据, 然后将对应位值     110111011
            int sendId = request & 63;
            Id = sendId + 4 + 64;
 
            modbusTcp.writeUInt32(42019 - offset, detailsVO.getTopRemove());
            modbusTcp.writeUInt32(42021 - offset, detailsVO.getTopRemove());
            modbusTcp.writeUInt32(42023 - offset, detailsVO.getTopRemove());
            modbusTcp.writeUInt32(42025 - offset, detailsVO.getTopRemove());
        }
        modbusTcp.writeUInt32(42013 - offset, (int) (detailsVO.getThickness() * 10));
        modbusTcp.writeUInt32(42015 - offset, (int) (Math.max(detailsVO.getWidth(), detailsVO.getHeight())) * 10);
        modbusTcp.writeUInt32(42017 - offset, (int) (Math.min(detailsVO.getWidth(), detailsVO.getHeight())) * 10);
        modbusTcp.writeUInt16(42001 - offset, Id);
        return;
    }
 
    /**
     * 收到除膜机ID接收完成开始执行任务
     *
     * @throws Exception
     */
    @Scheduled(fixedDelay = 1000)
    public void finishHollowRemoveOneTask() throws Exception {
        finishHollowRemoveChildTask("CMJ1.CMJ1.");
    }
 
    @Scheduled(fixedDelay = 1000)
    public void finishHollowRemoveTwoTask() throws Exception {
        finishHollowRemoveChildTask("CMJ2.CMJ2.");
    }
 
    public void finishHollowRemoveChildTask(String cell) throws Exception {
//        ReadWriteEntity requestEntity = miloService.readFromOpcUa(cell + "mesControl");
        ModbusTcp modbusTcp = null;
        if ("CMJ1.CMJ1.".equals(cell)) {
            modbusTcp = CMJ1ModbusTcp;
        } else {
            modbusTcp = CMJ2ModbusTcp;
        }
        if (!modbusTcp.checkConnected()) {
            log.info("除膜机{}未连接", cell);
            return;
        }
        int requestEntity = modbusTcp.readUInt16(42001 - offset);
        int request = requestEntity;
        int flagRequest = request & 9;
        if (flagRequest != 9) {
            log.info("当前未收到除膜机ID接收完成信号,结束任务");
            return;
        }
        //向电气发送清楚信号
        int sendId = request & 251;
        log.info("{}收到除膜机ID接收完成信号,将写入数据完成置0,发送数据为:{}", cell, sendId);
        modbusTcp.writeUInt16(42001 - offset, sendId);
    }
 
}