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); } } } }