yanjinhui
4 小时以前 cba2c0ff983f40757aa9840a3bd520c28a9896d9
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
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Common;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Common.LocationEnum;
using SixLabors.ImageSharp;
using Autofac.Core;
 
namespace WIDESEAWCS_Tasks
{
    public partial class TSJJob
    {
        /// <summary>
        /// 海康继续执行任务
        /// </summary>
        /// <param name="device"></param>
        public void HKConexecutTask(OtherDevice device)
        {
 
            List<Dt_Task> Uptasks = new List<Dt_Task>();
            //查询所有任务类型为3,4楼的入库任务类型且任务状态为AGV_WaitToExecute的任务 
            var taskList = _taskService.Repository.QueryData(x => x.TaskState == TaskStatusEnum.AGV_WaitToExecute.ObjToInt());
            //任务的目标地址对于站台号;
            foreach (var task in taskList)
            {
                //先检查设备状态
                if (device.GetValue<HoistEnum, short>(HoistEnum.EquipmentStatus, "TSJ") == 2)
                {
                    if (task.ExceptionMessage == "提升机设备故障")
                    {
                        continue;
                    }
                    task.ExceptionMessage = "提升机设备故障";
                    Uptasks.Add(task);
                    continue;
                    //throw new Exception("设备故障");
                }
                if (task.TaskType == TaskTypeEnum.RK3F.ObjToInt() || task.TaskType == TaskTypeEnum.CHUKU1.ObjToInt() || task.TaskType == TaskTypeEnum.F04.ObjToInt())
                {
                    if (task.TaskType == TaskTypeEnum.RK3F.ObjToInt())
                    {
                        //判断3楼入库箱号有无
                        if (device.GetValue<HoistEnum, short>(HoistEnum.OutboundInplace, task.TargetAddress) != 2)
                        {
                            if (task.ExceptionMessage == "3楼入库箱号有货,请先处理")
                            {
                                continue;
                            }
                            task.ExceptionMessage = "3楼入库箱号有货,请先处理";
                            Uptasks.Add(task);
                            continue;
                        }
                    }
                    else
                    {
                        if (device.GetValue<HoistEnum, short>(HoistEnum.ReturnbinAvailable, task.TargetAddress) != 2)
                        {
                            if (task.ExceptionMessage != "4F提升机入口有货")
                            {
                                task.ExceptionMessage = "4F提升机入口有货";
                                Uptasks.Add(task);
                            }
                            continue;
                        }
                    }
 
 
                    //然后调用输送线接口,通知输送线有料箱需要入库,任务举行执行
                    var result = _taskService.Hikvisiontaskscontinue(task.WMSTaskNum);
                    if (result.Status == false)
                    {
                        if (task.ExceptionMessage != result.Message)
                        {
                            task.ExceptionMessage = result.Message;
                            Uptasks.Add(task);
                        }
                        continue;
                    }
                    task.TaskState = (int)TaskStatusEnum.AGV_ToExecute;
                    task.ExceptionMessage = "";
                    Uptasks.Add(task);
 
                    //这里任务变成了CheckPalletCodeing
 
                }
                else if (task.TaskType == TaskTypeEnum.CK3F.ObjToInt() || task.TaskType == TaskTypeEnum.Q1TSJ4.ObjToInt() || task.TaskType == TaskTypeEnum.F03.ObjToInt()) //出库
                {
                    ////出库料箱缓存数量(这个是库区查询的时候要查一下,返给wms)
                    //if (device.GetValue<HoistEnum, short>(HoistEnum.Outboundmaterialbox, "TSJ") == 0) throw new Exception("没有出库料箱缓存数量为空");
 
                    if (task.TaskType == TaskTypeEnum.CK3F.ObjToInt())
                    {
                        //读取3楼出库料箱到位
                        if (device.GetValue<HoistEnum, short>(HoistEnum.SOutboundmaterialbox, task.SourceAddress) != 1)
                        {
                            if (task.ExceptionMessage != "3楼提升机出口光电反馈无货")
                            {
                                task.ExceptionMessage = "3楼提升机出口光电反馈无货";
                                Uptasks.Add(task);
                            }
                            continue;
                        }
                    }
                    else
                    {
                        if (device.GetValue<HoistEnum, short>(HoistEnum.FOutboundmaterialbox, task.SourceAddress) != 1)
                        {
                            if (task.ExceptionMessage != "4楼提升机出口光电反馈无货")
                            {
                                task.ExceptionMessage = "4楼提升机出口光电反馈无货";
                                Uptasks.Add(task);
                            }
                            continue;
                        }
 
                        if (device.GetValue<HoistEnum, short>(HoistEnum.ROutScanningCompletionSignal, task.SourceAddress) != 1)
                        {
                            if (task.ExceptionMessage != "4楼提升机出口扫码完成信号没有完成")
                            {
                                task.ExceptionMessage = "4楼提升机出口扫码完成信号没有完成";
                                Uptasks.Add(task);
                            }
                            continue;
                        }
                    }
                    //然后调用输送线接口,通知输送线有料箱需要入库,任务举行执行
                    var result = _taskService.Hikvisiontaskscontinue(task.WMSTaskNum);
                    if (result.Status == false)
                    {
                        if (task.ExceptionMessage != result.Message)
                        {
                            task.ExceptionMessage = result.Message;
                            Uptasks.Add(task);
                        }
                        continue;
                    }
                    task.TaskState = (int)TaskStatusEnum.AGV_ToExecute;
                    task.ExceptionMessage = "";
                    Uptasks.Add(task);
                }
            }
            if (Uptasks.Count > 0)
            {
                _taskService.UpdateData(Uptasks);
            }
 
 
 
        }
 
 
 
        /// <summary>
        /// 托盘号确认中
        /// </summary>
        /// <param name="device"></param>
        public void PalletNumConfirmation(OtherDevice device)
        {
            #region 托盘号确认中
            //查找三楼入库任务状态为CheckPalletCodeing的任务托盘号确认中
            var RK3FTask = _taskService.Repository.QueryFirst(x => x.TaskType == TaskTypeEnum.RK3F.ObjToInt() && x.TaskState == (int)TaskStatusEnum.CheckPalletCodeing);
            if (RK3FTask != null)
            {
                if (device.GetValue<HoistEnum, short>(HoistEnum.RInScanningCompletionSignal, RK3FTask.TargetAddress) != 1)
                {
                    RK3FTask.ExceptionMessage = "3楼扫码完成信号没有完成";
                    _taskService.UpdateData(RK3FTask);
                }
                else //完成就把任务状态改成托盘号确认完成
                {
                    //检查3楼入库箱号是多少,然后传给wms
                    var BinNumber = device.GetValue<HoistEnum, string>(HoistEnum.Inboxnumber, RK3FTask.TargetAddress);
                    if (!string.IsNullOrEmpty(BinNumber))
                    {
                        BinNumber = BinNumber.TrimEnd('\0').Substring(2);
                        //根据读到的箱号进行料箱检验,检验通过就触发读码器读取,如果不通过就抛出异常
                        var Verification = _taskService.MaterialBoxInspection(RK3FTask.WMSTaskNum, BinNumber);
                        if (!Verification.Status)
                        {
                            if (RK3FTask.ExceptionMessage != Verification.Message)
                            {
                                RK3FTask.ExceptionMessage = Verification.Message;
                                _taskService.UpdateData(RK3FTask);
                            }
                        }
                        else
                        {
 
                            //如果质检通过就不改变RK3FTask.TargetAddress的值,
                            if (!string.IsNullOrEmpty(Verification.Message))
                            {
                                //寻找平库货位
                                var Location = _stationInfoService.Repository.QueryFirst(x => x.StationRegion == Verification.Message.ObjToInt() && x.StationStatus == (int)LocationStatusEnum.Free && x.FloorNumber == "CC" && x.IsOccupied == (int)LocationStatusEnum.Free);
                                //这里要判断
                                if (Location == null)
                                {
                                    RK3FTask.ExceptionMessage = "$未找到{Verification.Message}区域的货位{Location}";
                                }
                                RK3FTask.CurrentAddress = RK3FTask.TargetAddress;
                                RK3FTask.NextAddress = Location.StationCode;
                                RK3FTask.TargetAddress = Location.StationCode;
                                _taskService.UpdateData(RK3FTask);
                            }
                            //调用海康进行执行完成接口
                            var result = _taskService.Hikvisiontaskscontinue(RK3FTask.WMSTaskNum, RK3FTask.NextAddress);
                            if (result.Status)
                            {
                                RK3FTask.ExceptionMessage = "";
                                RK3FTask.TaskState = (int)TaskStatusEnum.CheckPalletCodeFinish;
                                _taskService.UpdateData(RK3FTask);
                            }
                            else
                            {
                                if (RK3FTask.ExceptionMessage != result.Message)
                                {
                                    RK3FTask.ExceptionMessage = result.Message;
                                    _taskService.UpdateData(RK3FTask);
                                }
                            }
                        }
                    }
                }
            }
            #endregion
        }
 
 
        /// <summary>
        /// 4F提升机出口托盘号上报WMS
        /// </summary>
        /// <param name="device"></param>
 
        public void PalletReportingToWMS(OtherDevice device)
        {
            #region 4F提升机出口托盘号上报WMS
            var Address = "TSJC4F";
            if (device.GetValue<HoistEnum, short>(HoistEnum.ROutScanningCompletionSignal, Address) == 1)
            {
                var BinNumber = device.GetValue<HoistEnum, string>(HoistEnum.Emptycontainernumber, Address);
                if (!string.IsNullOrEmpty(BinNumber))
                {
                    BinNumber = BinNumber.TrimEnd('\0').Substring(2);
                    _taskService.InboundElevatorExit(Address, BinNumber);
                }
            }
            #endregion
        }
 
 
        /// <summary>
        /// 提升机报警
        /// </summary>
        /// <param name="device"></param>
        public void TSJAlarm(OtherDevice device)
        {
 
            var alarmPoints = new Dictionary<HoistEnum, string>{
            { HoistEnum.EquipmentStatus, "设备状态" },
            { HoistEnum.R_ElectricDrumA301, "电动滚筒A301报警" },
            { HoistEnum.R_ElectricDrumA302, "电动滚筒A302报警" },
            { HoistEnum.R_ElectricDrumA303, "电动滚筒A303报警" },
            { HoistEnum.R_ElectricDrumA304, "电动滚筒A304报警" },
            { HoistEnum.R_ElectricDrumA305, "电动滚筒A305报警" },
            { HoistEnum.R_ElectricDrumA306, "电动滚筒A306报警" },
            { HoistEnum.R_ElectricDrumA307, "电动滚筒A307报警" },
            { HoistEnum.R_ElectricDrumT001, "电动滚筒T001报警" },
            { HoistEnum.R_InverterAlarm, "变频器报警" },
            { HoistEnum.R_ElectricDrumA401, "电动滚筒A401报警" },
            { HoistEnum.R_ElectricDrumA402, "电动滚筒A402报警" },
            { HoistEnum.R_ElectricDrumA403, "电动滚筒A403报警" },
            { HoistEnum.R_ElectricDrumA404, "电动滚筒A404报警" },
            { HoistEnum.R_ElectricDrumA405, "电动滚筒A405报警" },
            { HoistEnum.R_ElectricDrumA406, "电动滚筒A406报警" },
            { HoistEnum.R_ElectricDrumA407, "电动滚筒A407报警" },
            { HoistEnum.R_ElectricDrumT002, "提升机2变频器报警" },
            { HoistEnum.R_UpperlimitAlarm1, "上限位报警1" },
            { HoistEnum.R_LowerlimitAlarm1, "下限位报警1" },
            { HoistEnum.R_UpperlimitAlarm2, "上限位报警2" },
            { HoistEnum.R_LowerlimitAlarm2, "下限位报警2" },
            { HoistEnum.R_ScancodeError1, "读码器3楼扫码异常" },
            { HoistEnum.R_ScancodeError2, "读码器4楼扫码异常" },
            { HoistEnum.R_EmergencSytop1, "急停1" },
            { HoistEnum.R_EmergencSytop2, "急停2" },
            { HoistEnum.R_TSJEmergencSytop1, "提升机急停1" },
            { HoistEnum.R_TSJEmergencSytop2, "提升机急停2" },
            { HoistEnum.R_DrumAlarmT002, "电滚筒4楼报警T002" },
            { HoistEnum.R_TSJSpare1, "备用报警1" },
            { HoistEnum.R_TSJSpare2, "备用报警2" }
        };
            var Address = "TSJ";
 
 
            foreach (var point in alarmPoints)
            {
                    // 读取PLC值(需要根据实际API调整)
                    bool isAlarming = device.GetValue<HoistEnum, bool>(point.Key,Address);
                    // 或者 device.ReadBool(point.Key);
 
                    if (isAlarming)
                    {
                        // 有报警,发送给WMS
                        //SendAlarmToWMS(device, point.Key, point.Value);
                    }
                
            }
        }
 
 
    }
 
    }