qinchulong
2025-03-29 039a4a5433e7f80adc88b491b549e5d9486e4f9a
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using WIDESEA_Common;
using WIDESEA_Common.Tools;
using WIDESEA_Core.EFDbContext;
using WIDESEA_Entity.DomainModels;
using WIDESEA_Services.IRepositories;
using WIDESEA_Services.Repositories;
using WIDESEA_Services.Services;
using WIDESEA_WCS.EquipBaseInfo;
using WIDESEA_WCS.WCSClient;
 
namespace WIDESEA_WCS.SchedulerExecute.AGV
{
    public partial class AGVSchedulerExecute
    {
        private static bool  isTrue=false;
        private static string name = "";
 
        public static void SendAGVTask(PLCClient plcClient)
        {
            //if (Interlocked.Exchange(ref _readSendAGVTaskSignalso, 1) == 0)
            //{
            try
            {
                if (plcClient == null)
                {
                    return;
                }
                VOLContext context = new VOLContext();
                Idt_agvtaskRepository agvtaskRepository = new dt_agvtaskRepository(context);
                Idt_task_numberRepository tasknumberRep = new dt_task_numberRepository(context);
                dt_task_numberService tasknumber = new dt_task_numberService(tasknumberRep);
                var task = agvtaskRepository.FindFirst(e => e.agv_tasknum.Length <= 3);
                if (task != null)
                {
                    task.agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep);
                    agvtaskRepository.Update(task, true);
                }
                int TaskInteractive = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveR.ToString()));//1收到
                int TaskInteractiveW = Convert.ToInt32(plcClient.ReadValue(TaskDBName.taskInteractiveW.ToString()));//0初始/1下发/2取消/3更改
                int resetTaskInteractiveW= Convert.ToInt32(plcClient.ReadValue(TaskDBName.resetTaskInteractiveW.ToString()));
 
                if (isTrue&&name==plcClient.PLCName)
                {
                    if (TaskInteractiveW != 0 || resetTaskInteractiveW != 0 || TaskInteractive != 0)
                    {
                        plcClient.WriteValue(TaskDBName.resetTaskInteractiveW.ToString(), 1);
                        Task.Delay(2000).Wait();
                        resetTaskInteractiveW = Convert.ToInt32(plcClient.ReadValue(TaskDBName.resetTaskInteractiveW.ToString()));
                        if (resetTaskInteractiveW == 1)
                        {
                            plcClient.WriteValue(TaskDBName.resetTaskInteractiveW.ToString(), 0);
                            plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
                            Task.Delay(2000).Wait();
                        }
                        return;
                    }
                    else
                    {
                        isTrue = false;
                        name = "";
                    }
                }
                if (0 == TaskInteractive && TaskInteractiveW == 0)
                {
                    #region 查询有没有下发未接收到任务
                    dt_agvtask agvTask = agvtaskRepository.Find(r => r.agv_taskstate == AGVTaskStateEnum.Wait.ToString() && r.agv_code == plcClient.PLCName && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).OrderBy(r => r.agv_createtime)
                            .OrderByDescending(r => r.agv_grade).FirstOrDefault();
                    if (null != agvTask)
                    {
                        AGVBaseInfo.TaskWrite(plcClient, agvTask, AGVJobEnum.newTaskEnum);
                        string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString();
                        if (taskId == agvTask.agv_tasknum)
                        {
                            plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 1);
                            WriteLog.Info("SendAGVTask").Write("SendAGVTask" + agvTask.agv_tasknum + DateTime.Now, "SendAGVTask");
                        }
                        return;
                    }
                    #endregion
                    agvTask = agvtaskRepository.Find(r => r.agv_taskstate == AGVTaskStateEnum.Create.ToString() && r.agv_code == plcClient.PLCName && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).OrderBy(r => r.agv_createtime).OrderByDescending(r => r.agv_grade).FirstOrDefault();
                    if (null != agvTask)
                    {
                        string rel = AGVBaseInfo.TaskWrite(plcClient, agvTask, AGVJobEnum.newTaskEnum);
                        if (string.IsNullOrEmpty(rel))
                        {
                            string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString();
                            if (taskId.Contains("\b")) { taskId = taskId.Remove(0, 1); }
                            if (taskId == agvTask.agv_tasknum)
                            {
                                agvTask.agv_taskstate = AGVTaskStateEnum.Wait.ToString();
                                agvTask.agv_realesstime = DateTime.Now;
                                agvtaskRepository.Update(agvTask, true);
                                plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 1);
                                WriteLog.Info("SendAGVTask").Write("SendAGVTask" + agvTask.agv_tasknum + DateTime.Now, "SendAGVTask");
                            }
                        }
                        else
                        {
                            throw new Exception(rel);
                        }
                    }
                }
                #region 下发任务没收到重新下发
                if (TaskInteractive == 0 && TaskInteractiveW == 1)//写入任务没收到重新写入
                {
                    string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString();
                    if (taskId.Contains("\b")) { taskId = taskId.Remove(0, 1); }
                    if (null != taskId)
                    {
                        dt_agvtask agvTask = agvtaskRepository.Find(r => r.agv_tasknum == taskId && r.agv_taskstate == AGVTaskStateEnum.Wait.ToString() && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).OrderBy(r => r.agv_createtime)
                            .OrderByDescending(r => r.agv_grade).FirstOrDefault();
                        if (null != agvTask)
                            AGVBaseInfo.TaskWrite(plcClient, agvTask, AGVJobEnum.newTaskEnum);
                    }
                    else
                    {
                        dt_agvtask agvTask = agvtaskRepository.Find(r => r.agv_taskstate == AGVTaskStateEnum.Wait.ToString() && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).OrderBy(r => r.agv_createtime).OrderByDescending(r => r.agv_grade).FirstOrDefault();
                        if (null != agvTask)
                            AGVBaseInfo.TaskWrite(plcClient, agvTask, AGVJobEnum.newTaskEnum);
                    }
                }
                #endregion
                if (1 == TaskInteractive && TaskInteractiveW == 1)
                {
                    string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString();
                    if (taskId.Contains("\b")) { taskId = taskId.Remove(0, 1); }
                    if (taskId != null)
                    {
                        dt_agvtask agvTask = agvtaskRepository.Find(r => r.agv_tasknum == taskId && r.agv_taskstate == AGVTaskStateEnum.Wait.ToString() && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).FirstOrDefault();
                        if (agvTask != null)
                        {
                            agvTask.agv_taskstate = AGVTaskStateEnum.SendOut.ToString();
                            agvtaskRepository.Update(agvTask, true);
                            ////UpdateLocationState.UpdateState(agvTask);//todo 修改货位状态
                            //string taskStart = plcClient.ReadValue(TaskDBName.taskStart.ToString()).ToString();
                            //string taskEnd = plcClient.ReadValue(TaskDBName.taskEnd.ToString()).ToString();
                            //string taskType = plcClient.ReadValue(TaskDBName.taskType.ToString()).ToString();
                            plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
                        }
                        else
                        {
                            isTrue = true ;
                            name = plcClient.PLCName;
                        }
                        //if (agvTask != null && agvTask.agv_toaddress.Contains("WLX"))
                        //{
                        //    plcClient.WriteValue(TaskDBName.materBarcode.ToString(), agvTask.agv_materbarcode);
                        //}
                        //else if (agvTask != null && agvTask.agv_fromaddress.Contains("JJK") && agvTask.agv_toaddress.Contains("TBHCJ"))
                        //{
                        //    string barcode = "TB-" + agvTask.agv_materbarcode.Split('*')[0].Substring(agvTask.agv_materbarcode.Split('*')[0].Length - 1, 1);
                        //    plcClient.WriteValue(TaskDBName.materBarcode.ToString(), barcode);
                        //}
                        //else
                        //{
                        //    plcClient.WriteValue(TaskDBName.materBarcode.ToString(), "");
                        //}
                        //plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
                    }
                   
                }
                else if (11 == TaskInteractive && TaskInteractiveW == 1)//RCS已收到新下发的任务但无法执行
                {
                    string taskId = plcClient.ReadValue(TaskDBName.taskID.ToString()).ToString();
                    if (taskId.Contains("\b")) { taskId = taskId.Remove(0, 1); }
                    dt_agvtask agvTask2 = agvtaskRepository.Find(r => r.agv_tasknum == taskId && r.agv_taskstate == AGVTaskStateEnum.Wait.ToString() && r.agv_tasktype.Contains(AGVTaskTypeEnum.TaskType_Outbound.ToString())).OrderBy(r => r.agv_createtime)
                        .OrderByDescending(r => r.agv_grade).FirstOrDefault();
                    if (agvTask2 != null)
                    {
                        agvTask2.agv_taskstate = AGVTaskStateEnum.Abnormal.ToString();
                        agvtaskRepository.Update(agvTask2, true);
                    }
                    plcClient.WriteValue(TaskDBName.taskInteractiveW.ToString(), 0);
                }
            }
            catch (Exception ex)
            {
                //TODO 日志记录
            }
            //finally
            //{
            //    Interlocked.Exchange(ref _readSendAGVTaskSignalso, 0);
            //}
 
            //  }
        }
    }
}