You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

468 lines
24 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Rs.AutoDischarge.V3.Flow;
using Rs.Controls;
using Rs.Framework;
using Rs.Motion;
using Rs.MotionPlat.Commom;
using Rs.MotionPlat.Flow.Space;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static Rs.MotionPlat.Commom.SchedulingMessageBox;
namespace Rs.MotionPlat.Flow
{
enum ETakeTrayFlowStep
{
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
}
public enum ETakeStatus
{
Idle,
Taking,
TakeOK
}
public enum ELoadUnloadType
{
Load,
Unload
}
/// <summary>
/// 料盘搬运流程
/// </summary>
public class TakeTrayFlow
{
private static TakeTrayFlow intance;
string logInfo = string.Empty;
public ETakeStatus TakeStatus { get; set; } = ETakeStatus.Idle;
public static TakeTrayFlow Instance
{
get
{
if(intance == null)
intance = new TakeTrayFlow();
return intance;
}
}
Stopwatch stopwatch = new Stopwatch();
ETakeTrayFlowStep step = ETakeTrayFlowStep.;
private ETrayType m_fromTray = ETrayType.Empty2;
private ETrayType m_toTray = ETrayType.Ok;
private bool finisehd = true;
double targetX = 0.0;
double targetY = 0.0;
/// <summary>
/// 料盘搬运
/// </summary>
/// <param name="fromTray">需要搬运料仓的料盘</param>
/// <param name="toTray">料盘搬运的目的料仓</param>
/// <param name="takeTrayFinishedEvent">搬运料盘被拿起后事件</param>
/// <param name="arrivedDumpPosEvent">到达放料盘位上方事件</param>
/// <param name="dumpTrayFinishedEvent">放料盘完成后事件</param>
public bool Take(ETrayType fromTray, ETrayType toTray, Action takeTrayFinishedEvent, Action arrivedDumpPosEvent, Action dumpTrayFinishedEvent)
{
if (!finisehd)
return false;
else
finisehd = false;
TakeStatus = ETakeStatus.Taking;
step = ETakeTrayFlowStep.;
m_fromTray = fromTray;
m_toTray = toTray;
while (!finisehd)
{
if (MachineManage.Instance.MachineStatus == EMachineStatus.Stop)
{
Thread.Sleep(10);
continue;
}
switch (step)
{
case ETakeTrayFlowStep.:
if(DischargeFlow.Instance.XYCanGoLocalArea())
{
//double centerX = SysConfigParam.GetValue<double>($"Tray{m_fromTray.ToString()}CenterX");
//double centerY = SysConfigParam.GetValue<double>($"Tray{m_fromTray.ToString()}CenterY");
double cameraCenterX = SysConfigParam.GetValue<double>("ClampCenter2UpCameraCenterX");
double cameraCenterY = SysConfigParam.GetValue<double>("ClampCenter2UpCameraCenterY");
targetX = SysConfigParam.GetValue<double>($"{m_fromTray.ToString()}TakeTrayX");
targetY = SysConfigParam.GetValue<double>($"{m_fromTray.ToString()}TakeTrayY");
Motion.ErrorCode errCode = AxisControl.LoadX.MovePos(targetX + cameraCenterX, GlobalVar.TakeTraySpeed);
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
{
errCode = AxisControl.LoadY.MovePos(targetY + cameraCenterY, GlobalVar.TakeTraySpeed);
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
{
if (GlobalVar.VirtualAxis)
{
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
}
logInfo = GetClassName() + $"准备运动到{m_fromTray}料仓取料盘位上方";
MessageQueue.Instance.Insert(logInfo);
step = ETakeTrayFlowStep.;
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode);
}
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode);
}
}
else
{
Msg.ShowError("周转Y轴不在安全位请移动到安全后点击确定");
}
break;
case ETakeTrayFlowStep.:
if (Ops.IsStop("LoadX", "LoadY") || GlobalVar.VirtualAxis)
{
if(Ops.IsArrived(AxisControl.LoadX,AxisControl.LoadY) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已运动到{m_fromTray}料仓取料盘位上方";
MessageQueue.Instance.Insert(logInfo);
step = ETakeTrayFlowStep.;
}
}
break;
case ETakeTrayFlowStep.:
if (StockManager.Instance.GetStock(m_fromTray).Status == EStockTrayStatus.Loaded)
{
logInfo = GetClassName() + $"{m_fromTray}料仓料盘准备就绪";
MessageQueue.Instance.Insert(logInfo);
Ops.On("上下气缸电磁阀动位");
logInfo = GetClassName()+ "上下气缸电磁阀动位on";
MessageQueue.Instance.Insert(logInfo);
Ops.Off("上下气缸电磁阀原位");
logInfo = GetClassName() + "上下气缸电磁阀原位 off";
MessageQueue.Instance.Insert(logInfo);
Thread.Sleep(150);
step = ETakeTrayFlowStep.;
stopwatch.Restart();
}
break;
case ETakeTrayFlowStep.:
if ((Ops.IsOn("上下气缸动位") && stopwatch.ElapsedMilliseconds < 5000) || (GlobalVar.VirtualAxis))
{
logInfo =GetClassName()+ $"检测上下气缸动位OK";
MessageQueue.Instance.Insert(logInfo);
stopwatch.Stop();
Ops.On("夹爪气缸电磁阀");
logInfo = GetClassName() + $"夹爪气缸on";
MessageQueue.Instance.Insert(logInfo);
Thread.Sleep(1000);
if (!GlobalVar.TakeTrayDisableVac)
{
Ops.On("夹爪真空吸");
logInfo = GetClassName() + $"打开夹爪夹爪真空吸";
MessageQueue.Instance.Insert(logInfo);
}
Ops.Off($"{(int)m_fromTray}号料仓斜推气缸");
logInfo = GetClassName() + $"关闭{m_fromTray}号料仓斜推气缸";
MessageQueue.Instance.Insert(logInfo);
Ops.Off($"{(int)m_toTray}号料仓斜推气缸");
logInfo = GetClassName() + $"关闭{m_toTray}号料仓斜推气缸";
MessageQueue.Instance.Insert(logInfo);
step = ETakeTrayFlowStep.;
}
else if (stopwatch.ElapsedMilliseconds > 5000)
{
logInfo = "上下气缸动位异常,请处理后点击确定";
MessageQueue.Instance.Warn(GetClassName()+ logInfo);
TestCenterMessageBox.Show(AlarmConstID.UpDownCylinderExceptionAlarm, logInfo,ETipButton.Ok);
TestCenterMessageBox.WaitResult(AlarmConstID.UpDownCylinderExceptionAlarm);
stopwatch.Restart();
}
break;
case ETakeTrayFlowStep.:
Ops.Off("上下气缸电磁阀动位");
logInfo = GetClassName() + $"上下气缸电磁阀动位 off";
MessageQueue.Instance.Insert(logInfo);
Ops.On("上下气缸电磁阀原位");
logInfo = GetClassName() + $"上下气缸电磁阀原位 on";
MessageQueue.Instance.Insert(logInfo);
stopwatch.Restart();
step = ETakeTrayFlowStep.;
break;
case ETakeTrayFlowStep.:
if (stopwatch.ElapsedMilliseconds < 10000)
{
if ((Ops.IsOn("上下气缸原位")) || (GlobalVar.VirtualAxis))
{
logInfo = $"检测到上下气缸原位OK";
stopwatch.Restart();
if(GlobalVar.TakeTrayDisableVac)
{
step = ETakeTrayFlowStep.;
}
else
{
step = ETakeTrayFlowStep.;
}
}
}
else
{
logInfo = "上下气缸原位异常,请处理后点击确定";
MessageQueue.Instance.Warn(GetClassName()+ logInfo);
TestCenterMessageBox.Show(AlarmConstID.UpDownCylinderExceptionAlarm, logInfo, ETipButton.Ok);
TestCenterMessageBox.WaitResult(AlarmConstID.UpDownCylinderExceptionAlarm);
stopwatch.Stop();
stopwatch.Restart();
}
break;
case ETakeTrayFlowStep.:
if (stopwatch.ElapsedMilliseconds < 5000 || GlobalVar.VirtualAxis)
{
if (Ops.IsOn("夹爪真空吸检测") || (GlobalVar.VirtualAxis))
{
logInfo = GetClassName()+$"夹爪真空吸检测 OK";
MessageQueue.Instance.Insert(logInfo);
step = ETakeTrayFlowStep.;
}
}
else
{
logInfo = "夹爪真空吸检测异常,请处理后点击确定";
MessageQueue.Instance.Warn(GetClassName()+ logInfo);
TestCenterMessageBox.Show(AlarmConstID.UpDownCylinderExceptionAlarm, logInfo, ETipButton.Ok);
TestCenterMessageBox.WaitResult(AlarmConstID.UpDownCylinderExceptionAlarm);
stopwatch.Stop();
stopwatch.Restart();
Ops.On("上下气缸电磁阀动位");
logInfo = GetClassName() + "上下气缸电磁阀动位on";
MessageQueue.Instance.Insert(logInfo);
Ops.Off("上下气缸电磁阀原位");
logInfo = GetClassName() + "上下气缸电磁阀原位 off";
step = ETakeTrayFlowStep.;
}
break;
case ETakeTrayFlowStep.:
if (DischargeFlow.Instance.XYCanGoLocalArea())
{
//if(GlobalVar.RunSpace)
//{
// Thread.Sleep(2000);
//}
//centerX = SysConfigParam.GetValue<double>($"Tray{m_toTray.ToString()}CenterX");
//centerY = SysConfigParam.GetValue<double>($"Tray{m_toTray.ToString()}CenterY");
takeTrayFinishedEvent?.Invoke();
double cameraCenterX = SysConfigParam.GetValue<double>("ClampCenter2UpCameraCenterX");
double cameraCenterY = SysConfigParam.GetValue<double>("ClampCenter2UpCameraCenterY");
targetX = SysConfigParam.GetValue<double>($"{m_toTray.ToString()}TakeTrayX");
targetY = SysConfigParam.GetValue<double>($"{m_toTray.ToString()}TakeTrayY");
ErrorCode errCode = AxisControl.LoadX.MovePos(targetX + cameraCenterX, GlobalVar.TakeTraySpeed);
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
{
errCode = AxisControl.LoadY.MovePos(targetY + cameraCenterY - 2, GlobalVar.TakeTraySpeed);
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
{
if (GlobalVar.VirtualAxis)
{
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
}
logInfo = GetClassName() + $"到{toTray}料仓放料盘上方";
MessageQueue.Instance.Insert(logInfo);
step = ETakeTrayFlowStep.;
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.LoadY, errCode);
}
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.LoadX, errCode);
}
}
else
{
Msg.ShowError("周转Y轴不在安全位请移动到安全后点击确定");
}
break;
case ETakeTrayFlowStep.:
if (Ops.IsStop("LoadX", "LoadY") || GlobalVar.VirtualAxis)
{
if (Ops.IsArrived(AxisControl.LoadX, AxisControl.LoadY) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已运动到{toTray}料仓放料盘上方";
MessageQueue.Instance.Insert(logInfo);
arrivedDumpPosEvent?.Invoke();
step = ETakeTrayFlowStep.;
}
}
break;
case ETakeTrayFlowStep.:
if ((StockManager.Instance.GetStock(m_toTray).Status == EStockTrayStatus.Unloaded|| StockManager.Instance.GetStock(m_toTray).Status == EStockTrayStatus.Empty) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"检测到{m_toTray}料仓准备就绪";
MessageQueue.Instance.Insert(logInfo);
Ops.On("上下气缸电磁阀动位");
logInfo = GetClassName() + $"上下气缸电磁阀动位 on";
MessageQueue.Instance.Insert(logInfo);
Ops.Off("上下气缸电磁阀原位");
logInfo = GetClassName() + $"上下气缸电磁阀原位 off";
MessageQueue.Instance.Insert(logInfo);
Thread.Sleep(150);
step = ETakeTrayFlowStep.;
stopwatch.Restart();
}
break;
case ETakeTrayFlowStep.:
if (stopwatch.ElapsedMilliseconds < 5000)
{
if (Ops.IsOn("上下气缸动位") || GlobalVar.VirtualAxis)
{
logInfo = GetClassName()+ "检测到上下气缸动位 OK";
MessageQueue.Instance.Insert(logInfo);
stopwatch.Stop();
if(!GlobalVar.TakeTrayDisableVac)
{
Ops.Off("夹爪真空吸");
logInfo = GetClassName() + "夹爪真空吸 off";
MessageQueue.Instance.Insert(logInfo);
Thread.Sleep(10);
Ops.On("夹爪真空破");
logInfo = GetClassName() + "夹爪真空破 on";
MessageQueue.Instance.Insert(logInfo);
Thread.Sleep(200);
Ops.Off("夹爪真空破");
logInfo = GetClassName() + "夹爪真空破 off";
MessageQueue.Instance.Insert(logInfo);
}
Ops.Off("夹爪气缸电磁阀");
logInfo = GetClassName() + $"夹爪气缸off";
MessageQueue.Instance.Insert(logInfo);
Thread.Sleep(1000);
stopwatch.Restart();
step = ETakeTrayFlowStep.;
}
}
else
{
logInfo = "上下气缸动位检测异常,请处理后点击确定";
MessageQueue.Instance.Warn(GetClassName()+ logInfo);
TestCenterMessageBox.Show(AlarmConstID.UpDownCylinderExceptionAlarm, logInfo, ETipButton.Ok);
TestCenterMessageBox.WaitResult(AlarmConstID.UpDownCylinderExceptionAlarm);
stopwatch.Stop();
stopwatch.Restart();
}
break;
case ETakeTrayFlowStep.:
if(stopwatch.ElapsedMilliseconds<5000)
{
if(Ops.IsOn("夹爪气缸原位") || GlobalVar.RunSpace)
{
step = ETakeTrayFlowStep.;
}
}
else
{
logInfo = "夹爪气缸原位检测异常,请处理后点击确定";
MessageQueue.Instance.Warn(GetClassName() + logInfo);
TestCenterMessageBox.Show(AlarmConstID.UpDownCylinderExceptionAlarm, logInfo, ETipButton.Ok);
TestCenterMessageBox.WaitResult(AlarmConstID.UpDownCylinderExceptionAlarm);
stopwatch.Stop();
stopwatch.Restart();
}
break;
case ETakeTrayFlowStep.:
Ops.Off("上下气缸电磁阀动位");
logInfo = GetClassName() + "上下气缸电磁阀动位 off";
MessageQueue.Instance.Insert(logInfo);
Ops.On("上下气缸电磁阀原位");
logInfo = GetClassName() + "上下气缸电磁阀原位 on";
MessageQueue.Instance.Insert(logInfo);
Thread.Sleep(150);
step = ETakeTrayFlowStep.;
break;
case ETakeTrayFlowStep.:
if (Ops.IsOn("上下气缸原位") || GlobalVar.VirtualAxis)
{
if(GlobalVar.TakeTrayDisableVac)
{
step = ETakeTrayFlowStep.;
}
else
{
step = ETakeTrayFlowStep.;
}
}
break;
case ETakeTrayFlowStep.:
if (Ops.IsOff("夹爪真空吸检测") || (GlobalVar.VirtualAxis))
{
logInfo = GetClassName()+$"放料盘完成,料盘搬运结束";
MessageQueue.Instance.Insert(logInfo);
step = ETakeTrayFlowStep.;
//if (mLoadUnloadType == ELoadUnloadType.Load)
//{
// StockManager.Instance.Load(m_toTray, EStockTrayLoadMode.AfterTakeTray);
//}
}
else
{
//粘料盘
logInfo = "检测到料盘未放下,请处理后点击确定重放";
MessageQueue.Instance.Warn(GetClassName()+ logInfo);
TestCenterMessageBox.Show(AlarmConstID.UpDownCylinderExceptionAlarm, logInfo, ETipButton.Ok);
TestCenterMessageBox.WaitResult(AlarmConstID.UpDownCylinderExceptionAlarm);
step = ETakeTrayFlowStep.;
}
break;
case ETakeTrayFlowStep.:
finisehd = true;
TakeStatus = ETakeStatus.TakeOK;
dumpTrayFinishedEvent?.Invoke();
break;
}
Thread.Sleep(10);
}
return true;
}
public string GetCurStep()
{
return step.ToString();
}
public string GetClassName()
{
return this.GetType().Name + "-";
}
}
}