|
|
using NPOI.SS.Formula.Functions;
|
|
|
using Rs.Framework;
|
|
|
using Rs.MotionPlat.Commom;
|
|
|
using Rs.MotionPlat.Flow.SafePosFlow;
|
|
|
using Rs.MotionPlat.Flow.SubFlow;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Reflection;
|
|
|
using System.Text;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace Rs.MotionPlat.Flow
|
|
|
{
|
|
|
enum EStockCheckStep
|
|
|
{
|
|
|
|
|
|
空闲,
|
|
|
Input料仓是否就绪,
|
|
|
Ok料仓是否就绪,
|
|
|
Ng料仓是否就绪,
|
|
|
Multi料仓是否就绪,
|
|
|
等待搬运料盘就绪,
|
|
|
等待所有料仓就绪
|
|
|
}
|
|
|
public class WorkEnvironment
|
|
|
{
|
|
|
string logInfo = string.Empty;
|
|
|
EStockCheckStep step = EStockCheckStep.Input料仓是否就绪;
|
|
|
EStockCheckStep restoreStep;
|
|
|
public bool EnvironmentOk { get; set; } = false;
|
|
|
public ManualResetEvent EnvReadyOkEvent = new ManualResetEvent(false);
|
|
|
private static WorkEnvironment instance;
|
|
|
private bool isRunning = false;
|
|
|
public static WorkEnvironment Instance
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
if (instance == null)
|
|
|
instance = new WorkEnvironment();
|
|
|
return instance;
|
|
|
}
|
|
|
}
|
|
|
public void Ready()
|
|
|
{
|
|
|
if (!isRunning)
|
|
|
{
|
|
|
isRunning = true;
|
|
|
}
|
|
|
else
|
|
|
return;
|
|
|
step = EStockCheckStep.Input料仓是否就绪;
|
|
|
EnvReadyOkEvent.Reset();
|
|
|
Task.Run(() =>
|
|
|
{
|
|
|
//EnvironmentOk = false;
|
|
|
//while (isRunning)
|
|
|
//{
|
|
|
// Thread.Sleep(5);
|
|
|
// switch (step)
|
|
|
// {
|
|
|
// case EStockCheckStep.Input料仓是否就绪:
|
|
|
// if (!GlobalVar.CleanOut)
|
|
|
// {
|
|
|
// if ((!StockManager.Instance.GetStock(ETrayType.Input).HasTray() && StockManager.Instance.GetStock(ETrayType.Input).Status != EStockTrayStatus.Backed)
|
|
|
// || GlobalVar.VirtualAxis)
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"{ETrayType.Input}料仓无料盘,开始给{ETrayType.Input}料仓上料";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// Task.Run(() => {
|
|
|
// StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.Whole, null);//.Load(EStockType.Input, EStockTrayLoadMode.Whole);
|
|
|
// });
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"{ETrayType.Input}料仓有料盘";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// }
|
|
|
// }
|
|
|
// if (!StockManager.Instance.GetStock(ETrayType.Empty2).HasTray() || GlobalVar.VirtualAxis)
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"{ETrayType.Empty2}料仓无料盘,开始给{ETrayType.Empty2}料仓上料";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// Task.Run(() => {
|
|
|
// StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null);//.Load(EStockType.Empty2, EStockTrayLoadMode.Whole);
|
|
|
// });
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"{ETrayType.Empty2}料仓有料盘";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// }
|
|
|
// step = EStockCheckStep.Ok料仓是否就绪;
|
|
|
// break;
|
|
|
// case EStockCheckStep.Ok料仓是否就绪:
|
|
|
// if (!GlobalVar.CleanOut)
|
|
|
// {
|
|
|
// if (!StockManager.Instance.GetStock(ETrayType.Ok).HasTray() || GlobalVar.VirtualAxis)
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"{ETrayType.Ok}料仓无料盘,开始给{ETrayType.Ok}料仓上料";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// //if (StockManager.Instance.HasTray(EStockType.Empty2))
|
|
|
// {
|
|
|
// //LogHelper.Debug("Empty2料仓有料,开始搬运Empty2->Ok");
|
|
|
// //if(
|
|
|
// TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Ok,
|
|
|
// () =>
|
|
|
// {
|
|
|
// GlobalTray.GetTray(ETrayType.Empty2).ChangeStatus(Controls.ESlotStatus.Null);
|
|
|
// Task.Run(() =>
|
|
|
// {
|
|
|
// StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null);
|
|
|
// });
|
|
|
// }, null,
|
|
|
// () =>
|
|
|
// {
|
|
|
|
|
|
// Task.Run(() =>
|
|
|
// {
|
|
|
// StockManager.Instance.GetStock(ETrayType.Ok).Load(EStockTrayLoadMode.AfterTakeTray, null);
|
|
|
// });
|
|
|
// });
|
|
|
// //)
|
|
|
// //{
|
|
|
// step = EStockCheckStep.Ng料仓是否就绪;
|
|
|
// //}
|
|
|
|
|
|
// //restoreStep = EStockCheckStep.Ng料仓是否就绪;
|
|
|
// }
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"{ETrayType.Ok}料仓有料盘";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// step = EStockCheckStep.Ng料仓是否就绪;
|
|
|
// }
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// step = EStockCheckStep.Ng料仓是否就绪;
|
|
|
// }
|
|
|
// break;
|
|
|
// case EStockCheckStep.Ng料仓是否就绪:
|
|
|
// if (!GlobalVar.CleanOut)
|
|
|
// {
|
|
|
// if (!StockManager.Instance.GetStock(ETrayType.Ng).HasTray() || GlobalVar.VirtualAxis)
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"{ETrayType.Ng}料仓无料,开始给{ETrayType.Ng}料仓上料";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// //if (StockManager.Instance.HasTray(EStockType.Empty2))
|
|
|
// {
|
|
|
// //LogHelper.Debug("Empty2料仓有料,开始搬运Empty2->Ng");
|
|
|
// //if (
|
|
|
// TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Ng,
|
|
|
// () =>
|
|
|
// {
|
|
|
// GlobalTray.GetTray(ETrayType.Empty2).ChangeStatus(Controls.ESlotStatus.Null);
|
|
|
// Task.Run(() =>
|
|
|
// {
|
|
|
// StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null);
|
|
|
// });
|
|
|
|
|
|
// }, null,
|
|
|
// () =>
|
|
|
// {
|
|
|
// Task.Run(() =>
|
|
|
// {
|
|
|
// StockManager.Instance.GetStock(ETrayType.Ng).Load(EStockTrayLoadMode.AfterTakeTray, null);
|
|
|
// });
|
|
|
// });
|
|
|
// //)
|
|
|
// //{
|
|
|
// step = EStockCheckStep.Multi料仓是否就绪;
|
|
|
// //}
|
|
|
|
|
|
// //restoreStep = EStockCheckStep.Multi料仓是否就绪;
|
|
|
// }
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"{ETrayType.Ng}料仓有料盘";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// step = EStockCheckStep.Multi料仓是否就绪;
|
|
|
// }
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// step = EStockCheckStep.Multi料仓是否就绪;
|
|
|
// }
|
|
|
// break;
|
|
|
// case EStockCheckStep.Multi料仓是否就绪:
|
|
|
// if (!StockManager.Instance.GetStock(ETrayType.Multi).HasTray() || GlobalVar.VirtualAxis)
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"{ETrayType.Multi}料仓无料,开始给{ETrayType.Multi}料仓上料";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// //if (StockManager.Instance.HasTray(EStockType.Empty2))
|
|
|
// {
|
|
|
// //LogHelper.Debug("Empty2料仓有料,开始搬运Empty2->Multi");
|
|
|
// //if (
|
|
|
// TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Multi,
|
|
|
// () =>
|
|
|
// {
|
|
|
// GlobalTray.GetTray(ETrayType.Empty2).ChangeStatus(Controls.ESlotStatus.Null);
|
|
|
// Task.Run(() =>
|
|
|
// {
|
|
|
// StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null);
|
|
|
// });
|
|
|
// }, null,
|
|
|
// () =>
|
|
|
// {
|
|
|
// Task.Run(() =>
|
|
|
// {
|
|
|
// StockManager.Instance.GetStock(ETrayType.Multi).Load(EStockTrayLoadMode.AfterTakeTray, null);
|
|
|
// });
|
|
|
// });
|
|
|
// //)
|
|
|
// //{
|
|
|
// step = EStockCheckStep.等待所有料仓就绪;
|
|
|
// //}
|
|
|
|
|
|
// //restoreStep = EStockCheckStep.等待所有料仓就绪;
|
|
|
// }
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"{ETrayType.Multi}料仓有料盘";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// step = EStockCheckStep.等待所有料仓就绪;
|
|
|
// }
|
|
|
// break;
|
|
|
// //case EStockCheckStep.等待搬运料盘就绪:
|
|
|
// // if(TakeTrayFlow.Instance.TakeStatus == ETakeStatus.TakeOK)
|
|
|
// // {
|
|
|
// // MessageQueue.Instance.Insert("搬运OK");
|
|
|
// // step = restoreStep;
|
|
|
// // restoreStep = EStockCheckStep.空闲;
|
|
|
// // }
|
|
|
// // break;
|
|
|
// case EStockCheckStep.等待所有料仓就绪:
|
|
|
// if (!GlobalVar.CleanOut)
|
|
|
// {
|
|
|
// if (StockManager.Instance.IsReady())
|
|
|
// {
|
|
|
// MessageQueue.Instance.Insert("所有料仓准备就绪");
|
|
|
// EnvironmentOk = true;
|
|
|
// isRunning = false;
|
|
|
// EnvReadyOkEvent.Set();
|
|
|
// }
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// if (StockManager.Instance.GetStock(ETrayType.Multi).Status == EStockTrayStatus.Loaded)
|
|
|
// {
|
|
|
// MessageQueue.Instance.Insert("多功能料仓准备就绪");
|
|
|
// EnvironmentOk = true;
|
|
|
// isRunning = false;
|
|
|
// EnvReadyOkEvent.Set();
|
|
|
// }
|
|
|
// }
|
|
|
// break;
|
|
|
// }
|
|
|
//}
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
private string GetClassName()
|
|
|
{
|
|
|
return this.GetType().Name + "-";
|
|
|
}
|
|
|
|
|
|
public bool IsRunning()
|
|
|
{
|
|
|
return isRunning;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 检测排料吸嘴、周转吸嘴、周转盘穴位,SOCKET穴位中是否有产品
|
|
|
/// </summary>
|
|
|
public void Check()
|
|
|
{
|
|
|
while (true)
|
|
|
{
|
|
|
List<int> dischargeNozzles = new List<int>();
|
|
|
List<int> turnoverNozzles = new List<int>();
|
|
|
List<int> turnoverTraySlots = new List<int>();
|
|
|
List<int> socketSlots = new List<int>();
|
|
|
MessageQueue.Instance.Insert("discharge nozzle have or not product check");
|
|
|
//1 吸嘴检测
|
|
|
for (int i = 1; i < 9; i++)
|
|
|
{
|
|
|
Ops.On($"{i}号吸嘴真空吸电磁阀");
|
|
|
MessageQueue.Instance.Insert($"打开{i}号吸嘴真空吸电磁阀");
|
|
|
}
|
|
|
Thread.Sleep(200);
|
|
|
for (int i = 1; i < 9; i++)
|
|
|
{
|
|
|
//Ops.On($"{i}号吸嘴真空吸电磁阀");
|
|
|
//MessageQueue.Instance.Insert($"打开{i}号吸嘴真空吸电磁阀");
|
|
|
|
|
|
if (Ops.IsOn($"{i}号吸嘴真空吸检测"))
|
|
|
{
|
|
|
MessageQueue.Instance.Insert($"{i}号吸嘴有料");
|
|
|
dischargeNozzles.Add(i);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
MessageQueue.Instance.Insert($"{i}号吸嘴无料");
|
|
|
Ops.Off($"{i}号吸嘴真空吸电磁阀");
|
|
|
MessageQueue.Instance.Insert($"关闭{i}号吸嘴真空吸电磁阀");
|
|
|
}
|
|
|
}
|
|
|
//2 周转吸头检测
|
|
|
for (int i = 1; i < 17; i++)
|
|
|
{
|
|
|
Ops.On($"周转{i}号吸嘴真空吸");
|
|
|
MessageQueue.Instance.Insert($"打开周转{i}号吸嘴真空吸");
|
|
|
|
|
|
}
|
|
|
Thread.Sleep(200);
|
|
|
for (int i = 1; i < 17; i++)
|
|
|
{
|
|
|
//Ops.On($"周转{i}号吸嘴真空吸");
|
|
|
//MessageQueue.Instance.Insert($"打开周转{i}号吸嘴真空吸");
|
|
|
//Thread.Sleep(100);
|
|
|
if (Ops.IsOn($"周转{i}号吸嘴真空吸检测"))
|
|
|
{
|
|
|
MessageQueue.Instance.Insert($"周转{i}号吸嘴有料");
|
|
|
turnoverNozzles.Add(i);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
MessageQueue.Instance.Insert($"周转{i}号吸嘴无料");
|
|
|
Ops.Off($"周转{i}号吸嘴真空吸");
|
|
|
MessageQueue.Instance.Insert($"关闭周转{i}号吸嘴真空吸");
|
|
|
}
|
|
|
}
|
|
|
// 3周转盘穴位检测
|
|
|
for (int i = 1; i < 33; i++)
|
|
|
{
|
|
|
Ops.On($"周转盘{i}号穴位真空吸");
|
|
|
MessageQueue.Instance.Insert($"打开周转盘{i}号穴位真空吸");
|
|
|
|
|
|
}
|
|
|
Thread.Sleep(200);
|
|
|
|
|
|
for (int i = 1; i < 33; i++)
|
|
|
{
|
|
|
//Ops.On($"周转盘{i}号穴位真空吸");
|
|
|
//MessageQueue.Instance.Insert($"打开周转盘{i}号穴位真空吸");
|
|
|
//Thread.Sleep(100);
|
|
|
if (Ops.IsOn($"周转盘{i}号穴位真空吸检测"))
|
|
|
{
|
|
|
Ops.Off($"周转盘{i}号穴位真空吸");
|
|
|
MessageQueue.Instance.Insert($"周转盘{i}号穴位有料");
|
|
|
turnoverTraySlots.Add(i);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
MessageQueue.Instance.Insert($"周转盘{i}号穴位无料");
|
|
|
Ops.Off($"周转盘{i}号穴位真空吸");
|
|
|
MessageQueue.Instance.Insert($"关闭周转盘{i}号穴位真空吸");
|
|
|
}
|
|
|
//SlotProductHasOrNotResult result = UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, i, true);
|
|
|
//if(result.HasProduct)
|
|
|
//{
|
|
|
// turnoverTraySlots.Add(i);
|
|
|
//}
|
|
|
}
|
|
|
//DischargeModuleGoSafePosFlow.Instance.GoSafePostion();
|
|
|
//4 SOCKET穴位检测
|
|
|
for (int i = 1; i < 17; i++)
|
|
|
{
|
|
|
Ops.On($"测试{i}号穴位真空吸");
|
|
|
MessageQueue.Instance.Insert($"打开测试{i}号穴位真空吸");
|
|
|
|
|
|
}
|
|
|
Thread.Sleep(200);
|
|
|
for (int i = 1; i < 17; i++)
|
|
|
{
|
|
|
if (Ops.IsOn($"测试{i}号穴位真空吸检测"))
|
|
|
{
|
|
|
Ops.Off($"测试{i}号穴位真空吸");
|
|
|
MessageQueue.Instance.Insert($"测试{i}号穴位有料");
|
|
|
socketSlots.Add(i);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
MessageQueue.Instance.Insert($"测试{i}号穴位无料");
|
|
|
Ops.Off($"测试{i}号穴位真空吸");
|
|
|
LogHelper.Debug($"关闭测试{i}号穴位真空吸");
|
|
|
}
|
|
|
}
|
|
|
if (dischargeNozzles.Count > 0 || turnoverNozzles.Count > 0 || turnoverTraySlots.Count > 0 || socketSlots.Count > 0)
|
|
|
{
|
|
|
StringBuilder msg = new StringBuilder();
|
|
|
if (dischargeNozzles.Count > 0)
|
|
|
{
|
|
|
msg.AppendLine($"discharge nozzle {dischargeNozzles.ToJoinString()} has product");
|
|
|
}
|
|
|
|
|
|
if (turnoverNozzles.Count > 0)
|
|
|
{
|
|
|
msg.AppendLine($"turnover nozzle {turnoverNozzles.ToJoinString()} has product");
|
|
|
}
|
|
|
|
|
|
if (turnoverTraySlots.Count > 0)
|
|
|
{
|
|
|
msg.AppendLine($"turnover tray {turnoverTraySlots.ToJoinString()} has product");
|
|
|
}
|
|
|
|
|
|
if (socketSlots.Count > 0)
|
|
|
{
|
|
|
msg.AppendLine($"socket {socketSlots.ToJoinString()} has product");
|
|
|
}
|
|
|
//PromptMessageBox.ShowDialog(AlarmConstID.工作环境检测, msg.ToString(), SchedulingMessageBox.ETipButton.Retry);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|