自动化立体仓库 - WCS系统
Junjie
2023-04-04 c08e857d010676d45ff5f4fc022613b974563d43
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
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
package com.zy.core.model.protocol;
 
import com.core.common.SpringUtils;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.BasShuttleService;
import com.zy.asrs.service.LocMastService;
import com.zy.core.News;
import com.zy.core.enums.ShuttleErrorCodeType;
import com.zy.core.enums.ShuttleProtocolStatusType;
import com.zy.core.enums.ShuttleStatusType;
import com.zy.core.model.command.ShuttleAssignCommand;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
 
/**
 * 四向穿梭车
 */
@Slf4j
@Data
public class ShuttleProtocol {
 
    /**
     * 四向穿梭车号
     */
    private Short shuttleNo;
 
    /**
     * 任务号
     */
    private Short taskNo = 0;
 
    /**
     * 任务指令
     */
    private ShuttleAssignCommand assignCommand;
 
    /**
     * 当前小车状态(内部自我维护)
     */
    private Integer protocolStatus;
 
    /**
     * 当前小车状态枚举
     */
    private ShuttleProtocolStatusType protocolStatusType;
 
    /**
     * 源库位
     */
    private String sourceLocNo;
 
    /**
     * 目标库位
     */
    private String locNo;
 
    /**
     * 小车忙状态位
     * 1: 忙
     * 0: 空闲
     */
    private Short busyStatus;
 
    /**
     * 小车忙状态位枚举
     */
    private ShuttleStatusType busyStatusType;
 
    /**
     * 当前二维码
     * 0为空
     */
    private Short currentCode;
 
    /**
     * 电池电量百分比
     */
    private Short batteryPower;
 
    /**
     * 电池温度
     */
    private Short batteryTemp;
 
    /**
     * 错误编号
     */
    private Short errorCode;
 
    /**
     * 错误编号枚举
     */
    private ShuttleErrorCodeType errorCodeType;
 
    /**
     * Plc输出状态IO
     */
    private Short plcOutputStatusIO;
 
    /**
     * 错误信息码
     */
    private Short statusErrorCode;
 
    /**
     * PLC输入状态
     */
    private Short plcInputStatus;
 
    /**
     * 当前或者之前读到的二维码值
     */
    private Short currentOrBeforeCode;
 
    /**
     * 读到的二维码X方向偏移量
     */
    private Short codeOffsetX;
 
    /**
     * 读到的二维码Y方向偏移量
     */
    private Short codeOffsetY;
 
    /**
     * 当前的电压值
     */
    private Short currentVoltage;
 
    /**
     * 当前的模拟量值
     */
    private Short currentAnalogValue;
 
    /**
     * 当前的升降伺服速度
     */
    private Short currentLiftServoSpeed;
 
    /**
     * 当前的行走伺服速度
     */
    private Short currentMoveServoSpeed;
 
    /**
     * 当前的升降伺服负载率
     */
    private Short currentLiftServoLoad;
 
    /**
     * 当前的行走伺服负载率
     */
    private Short currentMoveServoLoad;
 
    /**
     * 作业标记
     */
    private Boolean pakMk = true;
 
    public void setBusyStatus(Short status) {
        this.busyStatus = status;
        this.busyStatusType = ShuttleStatusType.get(status);
    }
 
    public void setBusyStatus(ShuttleStatusType type) {
        this.busyStatus = type.id.shortValue();
        this.busyStatusType = type;
    }
 
    //获取电池电量
    public Short getBatteryPower$() {
        return (short) (this.batteryPower * 0.1);
    }
 
    //获取电池温度
    public Short getBatteryTemp$() {
        return (short) (this.batteryTemp * 0.1);
    }
 
    /**
     * 设置小车状态
     */
    public void setProtocolStatus(Integer status) {
        this.protocolStatus = status;
        this.protocolStatusType = ShuttleProtocolStatusType.get(status);
    }
 
    /**
     * 设置小车状态
     */
    public void setProtocolStatus(ShuttleProtocolStatusType status) {
        this.protocolStatus = status.id;
        this.protocolStatusType = status;
    }
 
    /**
     * 设置错误编号
     */
    public void setErrorCode(Short errorCode) {
        this.errorCode = errorCode;
        this.errorCodeType = ShuttleErrorCodeType.get(errorCode.intValue());
    }
 
    /**
     * 设置错误编号
     */
    public void setErrorCode(ShuttleErrorCodeType type) {
        this.errorCode = type.id.shortValue();
        this.errorCodeType = type;
    }
 
    // 是否处于空闲待命状态
    public Boolean isIdle() {
        boolean res = this.busyStatusType.equals(ShuttleStatusType.IDLE)
                && this.pakMk.equals(true)
                && this.errorCodeType.equals(ShuttleErrorCodeType.NORMAL)
                && this.taskNo == 0
                ;
        if (!res) {
            return res;
        } else {
            // 电量
            try {
                Integer chargeLine = SpringUtils.getBean(BasShuttleService.class).selectById(this.shuttleNo).getChargeLine();
                return this.getBatteryPower$() > chargeLine;
            } catch (Exception e) {
                News.error("fail", e);
                return false;
            }
        }
    }
 
    // 是否处于空闲待命状态,传入的taskNo和当前taskNo相同时允许放行
    public Boolean isIdle(Short taskNo) {
        boolean res = this.busyStatusType.equals(ShuttleStatusType.IDLE)
                && this.pakMk.equals(true)
                && this.errorCodeType.equals(ShuttleErrorCodeType.NORMAL)
                && (this.taskNo == 0 || this.taskNo == taskNo)
                ;
        if (!res) {
            return res;
        } else {
            // 电量
            try {
                Integer chargeLine = SpringUtils.getBean(BasShuttleService.class).selectById(this.shuttleNo).getChargeLine();
                return this.getBatteryPower$() > chargeLine;
            } catch (Exception e) {
                News.error("fail", e);
                return false;
            }
        }
    }
 
    //通过当前二维码获取当前库位号
    public String getCurrentLocNo() {
        LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
        if (locMastService == null) {
            return null;
        }
        //源库位(小车当前位置)
        LocMast currentLocMast = locMastService.queryByQrCode(this.currentCode.toString());
        if (currentLocMast == null) {
            return null;
        }
        return currentLocMast.getLocNo();
    }
 
}