Admin
5 天以前 bd6818fc9d40f343547bafca0743658f3c0379dc
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
using HslCommunication;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using WIDESEA_Common;
using WIDESEA_Common.Tools;
using WIDESEA_Core.Utilities;
using WIDESEA_Entity.DomainModels;
using WIDESEA_Services;
using WIDESEA_Services.IRepositories;
using WIDESEA_Services.Repositories;
using WIDESEA_Services.Services;
using WIDESEA_WCS.WCSClient;
 
namespace WIDESEA_WCS.Jobs.ConveyorLine.InboundArea
{
    public partial class InboundAreaDispatch
    {
        private static string MeasureStationNo = "10301";
        public static void MeasureStationAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client,string lineCode)
        {
            //读取设备正常
            try
            {
                //出库测量到达终点处理逻辑
                string rfidResult = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), MeasureStationNo).ToString();
                //出库测量到达终点处理逻辑
                int taskResult = Int32.Parse(client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), MeasureStationNo).ToString());
                //机械手是否开始工作
                bool workingResult = bool.Parse(client.ReadValue(CLineInfoDBName.R_RobotArm_Catch_Moving.ToString(), "RobotArm").ToString());
                //读取轴承是否被机械手放回10301
                bool backResult = bool.Parse(client.ReadValue(CLineInfoDBName.R_RobotArm_Back_Normal.ToString(), "RobotArm").ToString());
 
                string str = string.Empty;
                //准备测量,出库测量到达目的地
                Dt_TaskWCSinfo taskWCSinfo = taskWCSinfoRepository.FindFirst(x => x.wcstask_barcode == rfidResult && x.wcstask_state == TaskState.TaskState_Measure_Out_Line_Executing.ToString());
                if (null != taskWCSinfo)
                {
                    WebResponseContent content = WMSApi.PostTaskStateToWMS(rfidResult, TaskState.TaskState_Measure_Out_Line_Finished.ToString());
                    if (content.Status)
                    {
                        taskWCSinfo.wcstask_state = TaskState.TaskState_Measure_Out_Line_Finished.ToString();
                        taskWCSinfo.wcstask_dispatcherTime = DateTime.Now;
                        taskWCSinfoRepository.Update(taskWCSinfo, true);
                    }
                }
                //测量完毕后,机械手把轴承放回该工位,准备走测量回库流程
                Dt_TaskWCSinfo back_TaskWCSinfo = taskWCSinfoRepository.FindFirst(x => x.wcstask_barcode == rfidResult && x.wcstask_state == TaskState.TaskState_Measureing.ToString());
                if (null != back_TaskWCSinfo && backResult)
                {
                    WebResponseContent content = WMSApi.PostTaskStateToWMS(rfidResult, TaskState.TaskState_Measure_Back_Line_Wait_Executing.ToString());
                    if (content.Status)
                    {
                        //将任务类型改为回库中
                        back_TaskWCSinfo.wcstask_type = TaskType.TaskType_Box_Pallet_Measure_Back.ToString();
                        //将任务起始站台和目的站台对调,准备回库
                        back_TaskWCSinfo.wcstask_endPoint = back_TaskWCSinfo.wcstask_startPoint;
                        back_TaskWCSinfo.wcstask_startPoint = "10301";
                        back_TaskWCSinfo.wcstask_endLocation = back_TaskWCSinfo.wcstask_startLocation;
                        back_TaskWCSinfo.wcstask_startLocation = back_TaskWCSinfo.wcstask_endPoint;
                        back_TaskWCSinfo.wcstask_state = TaskState.TaskState_Measure_Back_Line_Wait_Executing.ToString();
                        back_TaskWCSinfo.wcstask_dispatcherTime = DateTime.Now;
                        taskWCSinfoRepository.Update(back_TaskWCSinfo, true);
                    }
                }
                //测量完毕
                Dt_TaskWCSinfo backMoving_TaskWCSinfo = taskWCSinfoRepository.FindFirst(x => x.wcstask_barcode == rfidResult && (x.wcstask_state == TaskState.TaskState_Measure_Back_Line_Wait_Executing.ToString() ||
                    x.wcstask_state == TaskState.TaskState_Measure_Back_Line_Executing.ToString()));
                if (null != backMoving_TaskWCSinfo)
                {
                    //回库这里需要考虑冲突, 即穿梭车可能要放货到回库的目标地址,看是否有该类型已经开始
                    //出库测量任务
                    //起始站台为回库目的站台
                    //已经开始
                    //还没有到达托盘码校验位置
                    Dt_TaskWCSinfo tmpMeasureOutTask = taskWCSinfoRepository.FindFirst(x =>
                    x.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() &&
                    x.wcstask_startPoint.Contains(backMoving_TaskWCSinfo.wcstask_endPoint) &&
                    x.wcstask_state != TaskState.TaskState_Assigned.ToString() &&
                    string.IsNullOrEmpty(x.wcstask_backUp_1));
                    if (tmpMeasureOutTask != null)
                    {
                        Console.WriteLine($"当前有该站台:【{backMoving_TaskWCSinfo.wcstask_endPoint}】的出库测量任务正在进行,回库任务:【{backMoving_TaskWCSinfo.wcstask_taskNumber}】等待执行");
                        return;
                    }
 
                    //string lineCode = "Measure_B";
 
                    //读取逻辑控制值
                    int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString());
 
                    //说明工位在等待调度,准备下发任务
                    if (logicValue == 1 || logicValue == 2)
                    {
                        WriteTaskInfo.WriteTaskInfoAction(backMoving_TaskWCSinfo, client, lineCode);
                    }
                    else if (logicValue == 3)   //说明站台已经收到任务数据,等待WCS的启动指令
                    {
                        client.WriteValue(CLineInfoDBName.W_Line_Logic.ToString(), lineCode, 1);//启动任务
                    }
                    else if (logicValue == 4 || logicValue == 5)
                    {
                        if (backMoving_TaskWCSinfo.wcstask_state == TaskState.TaskState_Measure_Back_Line_Executing.ToString())
                            return;
 
                        //启动成功后,在此更新任务状态、上报WMS任务状态
                        WebResponseContent content1 = WMSApi.PostTaskStateToWMS(backMoving_TaskWCSinfo.wcstask_barcode, TaskState.TaskState_Measure_Back_Line_Executing.ToString());
                        if (content1.Status)
                        {
                            backMoving_TaskWCSinfo.wcstask_state = TaskState.TaskState_Measure_Back_Line_Executing.ToString();
                            backMoving_TaskWCSinfo.wcstask_dispatcherTime = DateTime.Now;
                            taskWCSinfoRepository.Update(backMoving_TaskWCSinfo, true);
                        }
                    }
                }
 
                //说明机械手在抓取轴承到测量设备,在此修改任务状态为:正在测量中
                if (workingResult)
                {
                    Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(x => x.wcstask_barcode == rfidResult && x.wcstask_state == TaskState.TaskState_Measure_Out_Line_Finished.ToString());
                    if (null != executingTask)
                    {
                        WebResponseContent content = WMSApi.PostTaskStateToWMS(rfidResult, TaskState.TaskState_Measureing.ToString());
                        if (content.Status)
                        {
                            executingTask.wcstask_state = TaskState.TaskState_Measureing.ToString();
                            executingTask.wcstask_dispatcherTime = DateTime.Now;
                            taskWCSinfoRepository.Update(executingTask, true);
                        }
                    }
                }
 
                /***********************************************/
                /*****************机械手逻辑********************/
                /***********************************************/
 
                //查看机械手是否待测量等待状态
                bool robotReadyResult = bool.Parse(client.ReadValue(CLineInfoDBName.R_RobotArm_Ready.ToString(), "RobotArm").ToString());
                if (robotReadyResult)
                {
                    //通知机械手抓取轴承
                    Dt_TaskWCSinfo _taskWCSinfo = taskWCSinfoRepository.FindFirst(x => x.wcstask_barcode == rfidResult && x.wcstask_state == TaskState.TaskState_Measure_Out_Line_Finished.ToString());
                    if (_taskWCSinfo != null)
                    {
                        //查看机械手是否已经启动
                        bool robotWorkResult = bool.Parse(client.ReadValue(CLineInfoDBName.R_RobotArm_Working.ToString(), "RobotArm").ToString());
                        if (!robotWorkResult)//说明机械手还没启动,发送启动指令
                            client.WriteValue(CLineInfoDBName.W_RobotArm_Catch.ToString(), true);
                    }
                }
                //机械手已启动
                bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_RobotArm_Working.ToString(), "RobotArm").ToString());
                if (flag)
                    client.WriteValue(CLineInfoDBName.W_RobotArm_Catch.ToString(), false);
 
                //查看机械手是否已经启动
                //bool _robotWorkResult = bool.Parse(client.ReadValue(CLineInfoDBName.R_RobotArm_Catch_Moving.ToString(), "RobotArm").ToString());
                //if (_robotWorkResult)//启动成功后,置位机械手启动信号为 false
                //    client.WriteValue(CLineInfoDBName.W_RobotArm_Catch.ToString(), false);
            }
            catch (Exception ex)
            {
                WriteLog.Info(MeasureStationNo).Write($"{ DateTime.Now }测量站台调度失败:{ex.Message}", MeasureStationNo);
            }
        }
 
    }
 
 
}