增加清料功能

master
lhiven 2 years ago
parent 6248cfebf8
commit b143427b69

@ -1,4 +1,5 @@
using Rs.Controls;
using Rs.Framework;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@ -115,6 +116,7 @@ namespace Rs.MotionPlat
{
if (WindowsClose())
{
//Environment.Exit(-1);
this.Close();
}
}

@ -23,6 +23,9 @@ namespace Rs.MotionPlat.Commom
public static RsTray TestTray { get; set; }
public static RsTray DischargeNozzle { get; set; }
public static RsTray TurnoverNozzle { get; set; }
public static RsTray GetTray(ETrayType trayType)
{
switch (trayType)
@ -47,30 +50,5 @@ namespace Rs.MotionPlat.Commom
}
return null;
}
public static RsTray GetTray(int trayType)
{
switch (trayType)
{
case 1:
return Empty1Tray;
case 2:
return InputTray;
case 3:
return OkTary;
case 4:
return NgTray;
case 5:
return MultiTray;
case 6:
return Empty2Tray;
case 7:
return TurnoverTray;
case 8:
return TestTray;
default: break;
}
return null;
}
}
}

@ -950,5 +950,32 @@ namespace Rs.Framework
get;
set;
}
/// <summary>
/// 是否清料
/// </summary>
public static bool CleanOut
{
get;
set;
} = false;
/// <summary>
/// 排料吸嘴是否有料
/// </summary>
public static bool DischargeNozzleHasProduct
{
get;
set;
}= false;
/// <summary>
/// 周转吸嘴是否有料
/// </summary>
public static bool TurnoverNozzleHasProduct
{
get;
set;
} = false;
}
}

@ -62,12 +62,27 @@ namespace Rs.MotionPlat.Commom
public bool Update()
{
Task.Run(() => {
SqliteHelper db = new SqliteHelper();
string val = Status == ENozzleStatus.IDLE ? "0" : "1";
string updateSql = $"update TrayStatus set status={val} where trayname='DischargeNozzle' and slotindex={NozzleIndex}";
db.ExecuteNonQuery(updateSql);
});
//string updateSql = $"update nozzle set fromtype='{FromType}',fromfloor={FromFloor},fromindex={FromIndex},ToType='{ToType}',tofloor={ToFloor},ToIndex={ToIndex},Status='{Status}' where NozzleIndex={NozzleIndex}";
//string updateSql = $"update nozzle set Status='{Status}' where NozzleIndex={NozzleIndex}";
//return db.ExecuteNonQuery(updateSql) > 0;
return true;
}
public void ResetStatus()
{
Status=ENozzleStatus.IDLE;
FromIndex = 0;
FromType = TurnoverType.Unknown;
ToIndex = 0;
ToType = TurnoverType.Unknown;
}
/// <summary>
/// 重置吸嘴
/// </summary>
@ -178,11 +193,17 @@ namespace Rs.MotionPlat.Commom
{
if(disableNozzle1)
{
return nozzles.Where(n => n.Status == ENozzleStatus.IDLE && n.NozzleIndex!=1).First();
if(nozzles.Where(n => n.Status == ENozzleStatus.IDLE && n.NozzleIndex != 1).Count()>0)
{
return nozzles.Where(n => n.Status == ENozzleStatus.IDLE && n.NozzleIndex != 1).First();
}
}
else
{
return nozzles.Where(n => n.Status == ENozzleStatus.IDLE).First();
if(nozzles.Where(n => n.Status == ENozzleStatus.IDLE).Count()>0)
{
return nozzles.Where(n => n.Status == ENozzleStatus.IDLE).First();
}
}
}
@ -247,5 +268,13 @@ namespace Rs.MotionPlat.Commom
{
return nozzles.Where(n => n.NozzleIndex == nozzleIndex).FirstOrDefault();
}
/// <summary>
/// 获取所有的吸嘴
/// </summary>
/// <returns></returns>
public static List<Nozzle> GetAllNozzles()
{
return nozzles;
}
}
}

@ -16,6 +16,7 @@ using System.Threading;
using System.Diagnostics;
using Rs.MotionPlat.AuxiliaryEquipment;
using System.Windows.Forms;
using Rs.MotionPlat.Flow.SubFlow;
namespace Rs.MotionPlat.Commom
{
@ -131,21 +132,23 @@ namespace Rs.MotionPlat.Commom
{
Ops.On($"{i}号料仓托盘气缸");
}
if (!DeviceFactory.Init())
{
Msg.ShowError("laser connect fail!");
}
QifuManager.Instance.Init();
QifuManager.Instance.Write(SysConfigParam.GetValue<float>("QifuValue"));
LightManger.Instance.SetStatus(ELightStatus.YellowBlink);
Off("启动灯");
Off("停止灯");
}
NozzleManager.Init();
TrayPointManager.LoadPoint();
TurnoverSlotOffset.Init();
MonitorSystemButton.Instance.Start();
TestCenter.Instance.Init();
if(!DeviceFactory.Init())
{
Msg.ShowError("laser connect fail!");
}
QifuManager.Instance.Init();
QifuManager.Instance.Write(SysConfigParam.GetValue<float>("QifuValue"));
LightManger.Instance.SetStatus(ELightStatus.YellowBlink);
Off("启动灯");
Off("停止灯");
SysConfigParam.Update("EnableVirtuleBarCode", "False");
}
@ -431,6 +434,7 @@ namespace Rs.MotionPlat.Commom
public static void Quit()
{
CleanOutFlow.Instance.Quit();
LightManger.Instance.CloseAll();
Off("启动灯");
Off("停止灯");

@ -1,4 +1,6 @@
using Rs.Framework;
using NPOI.SS.Formula.Functions;
using Rs.DataAccess;
using Rs.Framework;
using Rs.MotionPlat.Entitys.Trays;
using System;
using System.Collections.Generic;
@ -55,6 +57,21 @@ namespace Rs.MotionPlat.Commom
{
return nozzles.Where(n => n.IsHasProduct).ToList();
}
/// <summary>
/// 重置所有的穴位状态
/// </summary>
public void ResetStatus()
{
foreach (TransitNozzle nozzle in nozzles)
{
nozzle.IsHasProduct = false;
nozzle.FromIndex = 0;
nozzle.FromType = TurnoverType.Unknown;
nozzle.ToType= TurnoverType.Unknown;
nozzle.ToIndex = 0;
}
}
}
/// <summary>
@ -87,6 +104,11 @@ namespace Rs.MotionPlat.Commom
ToIndex= task.ToIndex;
ToType= task.ToType;
ToFloor= task.ToFloor;
Task.Run(() => {
SqliteHelper db = new SqliteHelper();
string updateSql = $"update TrayStatus set status=1 where trayname='TurnoverNozzle' and slotindex={NozzleIndex}";
db.ExecuteNonQuery(updateSql);
});
}
@ -98,6 +120,20 @@ namespace Rs.MotionPlat.Commom
{
CloseVac();
}
Task.Run(() => {
SqliteHelper db = new SqliteHelper();
string updateSql = $"update TrayStatus set status=0 where trayname='TurnoverNozzle' and slotindex={NozzleIndex}";
db.ExecuteNonQuery(updateSql);
});
}
public void ResetStaus()
{
IsHasProduct = false;
FromIndex = 0;
FromType = TurnoverType.Unknown;
ToType = TurnoverType.Unknown;
ToIndex = 0;
}
/// <summary>
/// 吸嘴索引

@ -39,13 +39,6 @@ namespace Rs.MotionPlat.Entitys.Trays
/// </summary>
public int SuckerNo { get; set; }
public void ClearProduct()
{
IsHasProduct = false;
SN = "";
FromIndex = 0;
FromType = TurnoverType.Unknown;
SuckerNo = 0;
}
}
}

@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Rs.DataAccess;
namespace Rs.MotionPlat.Entitys.Trays
{
@ -151,6 +152,18 @@ namespace Rs.MotionPlat.Entitys.Trays
{
return slots.ToList();
}
/// <summary>
/// 重置测试治具穴位状态
/// </summary>
public void ResetStatus()
{
foreach (TestTraySlot slot in slots)
{
slot.IsHasProduct= false;
slot.FromIndex = 0;
slot.FromType = TurnoverType.Unknown;
}
}
}
public class TestTraySlot:BaseTraySlot
@ -171,6 +184,25 @@ namespace Rs.MotionPlat.Entitys.Trays
FromIndex = nozzle.FromIndex;
FromType = nozzle.FromType;
SuckerNo = nozzle.NozzleIndex;
Task.Run(() => {
SqliteHelper db = new SqliteHelper();
string updateSql = $"update TrayStatus set status=1 where trayname='FixtureTray' and slotindex={Index}";
db.ExecuteNonQuery(updateSql);
});
}
public void ClearProduct()
{
IsHasProduct = false;
SN = "";
FromIndex = 0;
FromType = TurnoverType.Unknown;
SuckerNo = 0;
Task.Run(() => {
SqliteHelper db = new SqliteHelper();
string updateSql = $"update TrayStatus set status=0 where trayname='FixtureTray' and slotindex={Index}";
db.ExecuteNonQuery(updateSql);
});
}
/// <summary>
@ -181,5 +213,12 @@ namespace Rs.MotionPlat.Entitys.Trays
{
return Ops.IsOn($"测试{Index}号穴位真空吸检测");
}
public void ResetStatus()
{
IsHasProduct = false;
FromIndex = 0;
FromType = TurnoverType.Unknown;
}
}
}

@ -89,6 +89,114 @@ namespace Rs.MotionPlat.Entitys.Trays
}
}
}
/// <summary>
/// 加载排料吸嘴状态
/// </summary>
public static void InitDischargeNozzle()
{
string selectSql = $"select * from traystatus where trayname='DischargeNozzle'";
DataTable dt = db.GetDataTable(selectSql);
if (dt != null && dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
if (row["status"].ToString() == "1")
{
int slotIndex = int.Parse(row["slotindex"].ToString());
GlobalTray.DischargeNozzle.ChangeStatus(slotIndex, Controls.ESlotStatus.Have);
Nozzle nozzle = NozzleManager.GetNozzle(slotIndex);
if(nozzle!=null)
{
NozzleManager.GetNozzle(slotIndex).FromType = TurnoverType.Turnover;
nozzle.FromIndex = slotIndex - 1;
NozzleManager.GetNozzle(slotIndex).ToType = TurnoverType.Multifunction;
nozzle.ToIndex = 0;
NozzleManager.GetNozzle(slotIndex).Status = ENozzleStatus.ToUnload;
}
}
}
}
}
/// <summary>
/// 加载周转盘状态
/// </summary>
public static void InitTrunoverTray()
{
string selectSql = $"select * from traystatus where trayname='TurnoverTray'";
DataTable dt = db.GetDataTable(selectSql);
if(dt!=null &&dt.Rows.Count>0)
{
foreach (DataRow row in dt.Rows)
{
if (row["status"].ToString()=="1")
{
GlobalTray.TurnoverTray.ChangeStatus(int.Parse(row["slotindex"].ToString()), Controls.ESlotStatus.Have);
TurnoverTrayManager.Instance.Slot(int.Parse(row["slotindex"].ToString())).IsHasProduct = true;
}
}
}
}
/// <summary>
/// 加载周转吸嘴状态
/// </summary>
public static void InitTurnoverNozzle()
{
string selectSql = $"select * from traystatus where trayname='TurnoverNozzle' and status=1";
DataTable dt = db.GetDataTable(selectSql);
if (dt != null && dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
int slotIndex = int.Parse(row["slotindex"].ToString());
GlobalTray.TurnoverNozzle.ChangeStatus(slotIndex, Controls.ESlotStatus.Have);
TransitNozzleManager.Instance.Nozzle(slotIndex).FromType = TurnoverType.Turnover;
TransitNozzleManager.Instance.Nozzle(slotIndex).FromIndex = slotIndex - 1;
TransitNozzleManager.Instance.Nozzle(slotIndex).ToType = TurnoverType.Multifunction;
TransitNozzleManager.Instance.Nozzle(slotIndex).ToIndex = (slotIndex <= 8 ? slotIndex + 8 : slotIndex + 16) - 1;
TransitNozzleManager.Instance.Nozzle(slotIndex).IsHasProduct = true;
}
}
}
/// <summary>
/// 加载治具盘状态
/// </summary>
public static void InitFixtureTray()
{
string selectSql = $"select * from traystatus where trayname='FixtureTray'";
DataTable dt = db.GetDataTable(selectSql);
if (dt != null && dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
if (row["status"].ToString() == "1")
{
GlobalTray.TestTray.ChangeStatus(int.Parse(row["slotindex"].ToString()), Controls.ESlotStatus.Have);
TestTrayManager.Instance.Slot(int.Parse(row["slotindex"].ToString())).IsHasProduct = true;
}
}
}
}
public static void UpdateSlotAsync(string trayname, int slot, int status)
{
Task.Run(() => {
string updateSql = $"update traystatus set status={status} where trayname='{trayname}' and slotindex= {slot}";
db.ExecuteNonQuery(updateSql);
});
}
public static void UpdateMultiSlotAsync(string trayname,int[] slots,int status)
{
Task.Run(() => {
string slotindexs = string.Join(",", slots);
string updateSql = $"update traystatus set status={status} where trayname='{trayname}' and slotindex in({slotindexs})";
db.ExecuteNonQuery(updateSql);
});
}
}
}

@ -1,4 +1,5 @@
using Rs.MotionPlat.Commom;
using Rs.DataAccess;
using Rs.MotionPlat.Commom;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@ -140,6 +141,18 @@ namespace Rs.MotionPlat.Entitys.Trays
{
return slots.ToList();
}
/// <summary>
/// 重置周转盘穴位状态
/// </summary>
public void ResetStatus()
{
foreach (TurnoverTraySlot slot in slots)
{
slot.IsHasProduct = false;
slot.FromIndex = 0;
slot.FromType = TurnoverType.Unknown;
}
}
}
@ -157,6 +170,11 @@ namespace Rs.MotionPlat.Entitys.Trays
FromIndex = nozzle.FromIndex;
FromType = nozzle.FromType;
SuckerNo = nozzle.NozzleIndex;
Task.Run(() => {
SqliteHelper db = new SqliteHelper();
string updateSql = $"update TrayStatus set status=1 where trayname='TurnoverTray' and slotindex={Index}";
db.ExecuteNonQuery(updateSql);
});
}
public void AddProduct(TransitNozzle nozzle)
@ -166,6 +184,25 @@ namespace Rs.MotionPlat.Entitys.Trays
FromIndex = nozzle.FromIndex;
FromType = nozzle.FromType;
SuckerNo = nozzle.NozzleIndex;
Task.Run(() => {
SqliteHelper db = new SqliteHelper();
string updateSql = $"update TrayStatus set status=1 where trayname='TurnoverTray' and slotindex={Index}";
db.ExecuteNonQuery(updateSql);
});
}
public void ClearProduct()
{
IsHasProduct = false;
SN = "";
FromIndex = 0;
FromType = TurnoverType.Unknown;
SuckerNo = 0;
Task.Run(() => {
SqliteHelper db = new SqliteHelper();
string updateSql = $"update TrayStatus set status=0 where trayname='TurnoverTray' and slotindex={Index}";
db.ExecuteNonQuery(updateSql);
});
}
public bool HasVac()
@ -175,6 +212,13 @@ namespace Rs.MotionPlat.Entitys.Trays
return false;
}
public void ResetStatus()
{
IsHasProduct = false;
FromIndex = 0;
FromType = TurnoverType.Unknown;
}
/// <summary>
/// 穴位真空异常
/// </summary>

@ -884,6 +884,38 @@ namespace Rs.MotionPlat.Flow
else return slotIndex + 16;
}
/// <summary>
/// 创建从排料吸嘴到多功能料仓的下料任务
/// </summary>
public void CreateDischargeNozzleCleanOutTask()
{
lock(this)
{
List<Nozzle> unloadNozzles = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload);
if (unloadNozzles != null && unloadNozzles.Count > 0)
{
foreach (Nozzle nozzle in unloadNozzles)
{
TurnoverInfo ti = new TurnoverInfo();
ti.GUID = GuidHelper.Create();
ti.FromType = TurnoverType.Turnover;
ti.FromFloor = 1;
ti.FromIndex = nozzle.NozzleIndex-1;
ti.SN = "";
ti.ToType = TurnoverType.Multifunction;
ti.ToFloor = 1;
ti.ToIndex = 0;
ti.taskMode = ETaskType.Unload;
ti.Instruction = EInstruction.LoadAndUnload;
ti.GroupID = 0;
ti.TurnoverID = 0;
unloadTaskList.Add(ti);
}
}
}
}
/// <summary>
/// 创建周转盘清料任务
/// </summary>
@ -891,34 +923,82 @@ namespace Rs.MotionPlat.Flow
{
lock(this)
{
for (int i = 0; i < 32; i++)
foreach(TurnoverTraySlot slot in TurnoverTrayManager.Instance.Slots)
{
TurnoverInfo ti = new TurnoverInfo();
ti.GUID = GuidHelper.Create();
ti.FromType = TurnoverType.Turnover;
ti.FromFloor = 1;
ti.FromIndex = i;
ti.SN = "";
ti.ToType = TurnoverType.Multifunction;
ti.ToFloor = 1;
ti.ToIndex = 0;
ti.taskMode = ETaskType.Unload;
ti.Instruction = EInstruction.LoadAndUnload;
ti.GroupID = 0;
ti.TurnoverID = 0;
unloadTaskList.Add(ti);
if(slot.IsHasProduct)
{
TurnoverInfo ti = new TurnoverInfo();
ti.GUID = GuidHelper.Create();
ti.FromType = TurnoverType.Turnover;
ti.FromFloor = 1;
ti.FromIndex = slot.Index - 1;
ti.SN = "";
ti.ToType = TurnoverType.Multifunction;
ti.ToFloor = 1;
ti.ToIndex = 0;
ti.taskMode = ETaskType.Unload;
ti.Instruction = EInstruction.LoadAndUnload;
ti.GroupID = 0;
ti.TurnoverID = 0;
unloadTaskList.Add(ti);
}
}
}
}
/// <summary>
/// 创建测试治具清料任务
/// 创建周转吸嘴
/// </summary>
private void CreateFixtureCleanTask()
public void CreateTurnoverNozzleTestTrayCleanTask()
{
lock(this)
{
List<TransitNozzle> hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
if (hasProductNozzles != null && hasProductNozzles.Count > 0)
{
foreach (TransitNozzle nozzle in hasProductNozzles)
{
TurnoverInfo ti = new TurnoverInfo();
ti.GUID = GuidHelper.Create();
ti.FromType = TurnoverType.Tester;
ti.FromFloor = 1;
ti.FromIndex = nozzle.NozzleIndex-1;
ti.SN = "";
ti.ToType = TurnoverType.Turnover;
ti.ToFloor = 1;
ti.ToIndex = TestUnLoadSlotIndexChange(nozzle.NozzleIndex) - 1;
ti.taskMode = ETaskType.TestLoad;
ti.Instruction = EInstruction.LoadAndUnload;
ti.GroupID = 0;
ti.TurnoverID = 0;
testUnloadTaskList.Add(ti);
}
}
List<TestTraySlot> hasProductSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have);
if (hasProductSlots != null && hasProductSlots.Count > 0)
{
foreach (TestTraySlot slot in hasProductSlots)
{
TurnoverInfo ti = new TurnoverInfo();
ti.GUID = GuidHelper.Create();
ti.FromType = TurnoverType.Tester;
ti.FromFloor = 1;
ti.FromIndex = slot.Index - 1;
ti.SN = "";
ti.ToType = TurnoverType.Turnover;
ti.ToFloor = 1;
ti.ToIndex = TestUnLoadSlotIndexChange(slot.Index) - 1;
ti.taskMode = ETaskType.TestLoad;
ti.Instruction = EInstruction.LoadAndUnload;
ti.GroupID = 0;
ti.TurnoverID = 0;
testUnloadTaskList.Add(ti);
}
}
}
}
}
/// <summary>

@ -147,8 +147,24 @@ namespace Rs.MotionPlat.Flow
StockTrayToTurnoverTray = true;
logInfo = GetClassName()+$"接收到排料任务";
MessageQueue.Instance.Insert(logInfo);
if(GlobalVar.CleanOut && GlobalVar.DischargeNozzleHasProduct)
{
foreach(TurnoverInfo ti in LoadAndUnloadTask.Instance.GetUnDealedTask())
{
ti.Dealed = true;
}
mrs = new List<MatchResult>();
for (int i = 0; i < 8; i++)
{
mrs.Add(new MatchResult());
}
flowStep = EDischargeFlowStep.;
}
else
{
flowStep = EDischargeFlowStep.;
}
flowStep = EDischargeFlowStep.;
}
}
break;
@ -459,6 +475,7 @@ namespace Rs.MotionPlat.Flow
reFetchNum = 0;
logInfo = GetClassName()+$"排料吸嘴{curNozzle.NozzleIndex}号真空检测OK";
MessageQueue.Instance.Insert(logInfo);
GlobalTray.DischargeNozzle.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.Have);
UpdateNozzleStatus(curNozzle, curTask);
undoTaskNum = LoadAndUnloadTask.Instance.GetTaskNum(curTask.taskMode);
if (undoTaskNum > 0 && NozzleManager.GetNozzlesByStatus(ENozzleStatus.IDLE).Count > 0)
@ -1075,9 +1092,9 @@ namespace Rs.MotionPlat.Flow
//如果吸嘴是1并且最后一列
downSlot = GlobalTray.MultiTray.GetSlot(ESlotStatus.NotHave);
#region 为了解决第一个吸嘴到不了最后一列的问题
if (curNozzle.NozzleIndex == 1 && downSlot != null && (downSlot.Column == 0))
if (curNozzle.NozzleIndex == 1 && downSlot != null && (downSlot.Column == 7))
{
if (downSlot.Column == 0)
if (downSlot.Column == 7)
{
downSlot = GlobalTray.MultiTray.GetSlot(downSlot.Index + 1);
}
@ -1117,7 +1134,7 @@ namespace Rs.MotionPlat.Flow
if (curSlotPoint != null)
{
nozzleDist = TrayPointManager.GetDistToNozzle1(curNozzle.NozzleIndex);
if (mrs[curNozzle.NozzleIndex - 1].OffsetRow < 3 && mrs[curNozzle.NozzleIndex - 1].OffsetCol < 3)
if (mrs!=null && mrs.Count>0 && mrs.Count>=curNozzle.NozzleIndex && mrs[curNozzle.NozzleIndex - 1].OffsetRow < 3 && mrs[curNozzle.NozzleIndex - 1].OffsetCol < 3)
{
targetX = mrs[curNozzle.NozzleIndex - 1].OffsetCol + curSlotPoint.X + nozzleDist.X + turnoverOffsetPoint.X;
targetY = mrs[curNozzle.NozzleIndex - 1].OffsetRow + curSlotPoint.Y + nozzleDist.Y + turnoverOffsetPoint.Y;
@ -1353,6 +1370,7 @@ namespace Rs.MotionPlat.Flow
}
else
{
GlobalTray.DischargeNozzle.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.NotHave);
/*关闭排料吸嘴真空吸*/
//logInfo = GetClassName() + $"关闭{curNozzle.NozzleIndex}号排料吸嘴真空吸";
//MessageQueue.Instance.Insert(logInfo);
@ -1439,6 +1457,7 @@ namespace Rs.MotionPlat.Flow
{
if (Ops.IsOn($"周转盘{curNozzle.ToIndex + 1}号穴位真空吸检测") || GlobalVar.RunSpace)
{
logInfo = GetClassName() + $"周转盘{curNozzle.ToIndex + 1}号穴位真空吸检测OK";
MessageQueue.Instance.Insert(logInfo);
flowStep = EDischargeFlowStep.;
@ -1619,6 +1638,7 @@ namespace Rs.MotionPlat.Flow
//Ops.HomeAndGoStartPos($"NozzleR{NozzleIndex}");
if (curNozzle.Status == ENozzleStatus.ToUnload)
{
GlobalTray.DischargeNozzle.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.NotHave);
logInfo = GetClassName() + $"排料吸嘴{curNozzle.NozzleIndex}号{WitchTrayWitchSlot(curNozzle.ToType, curNozzle.ToIndex)}放料任务完成";
MessageQueue.Instance.Insert(logInfo);
if (curNozzle.ToType == TurnoverType.Turnover)
@ -1705,7 +1725,7 @@ namespace Rs.MotionPlat.Flow
//检测一下是否需要换盘
{
#region 通知中控排料任务结束
if(curNozzle.ToType!= TurnoverType.Turnover)
if(curNozzle.ToType!= TurnoverType.Turnover && !GlobalVar.CleanOut)
{
if (TestCenter.Instance.LoadResult())
{

@ -197,16 +197,19 @@ namespace Rs.AutoDischarge.V3.Flow
}
else
{
MessageQueue.Instance.Warn("stock is busy");
return false;
}
IAxis StockZ = AxisControl.GetAxis($"StockZ{(int)m_stockType}");
if(StockZ.HomeStatus!= EHomeStatus.Finished && !GlobalVar.VirtualAxis)
{
MessageQueue.Instance.Warn($"not homed {StockZ.HomeStatus}");
MsgBox.ShowAxisAlarmDialog(StockZ, ErrorCode.AxisNotHome);
return false;
}
if (!finished)
{
MessageQueue.Instance.Warn("stock is busy");
return false;
}
else
@ -437,6 +440,7 @@ namespace Rs.AutoDischarge.V3.Flow
public void Reset()
{
finished = true;
isRunning = false;
loadStep = EStockTrayLoadFlowStep.;
unloadStep = EStockTrayUnloadFlowStep.;

@ -197,7 +197,14 @@ namespace Rs.MotionPlat.Flow
retakeNum = 0;
logInfo = GetClassName() + $"接收到测试工位下料任务";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.;
if(GlobalVar.CleanOut==true && GlobalVar.TurnoverNozzleHasProduct)
{
Step = ETurnoverFlowStep.;
}
else
{
Step = ETurnoverFlowStep.;
}
//Step = ETurnoverFlowStep.到测试取料位上方;
}
break;
@ -471,6 +478,7 @@ namespace Rs.MotionPlat.Flow
{
if (Ops.IsOn($"周转{task.ToIndex + 1}号吸嘴真空吸检测") || GlobalVar.VirtualAxis || GlobalVar.RunSpace)
{
GlobalTray.TurnoverNozzle.ChangeStatus(task.ToIndex + 1, ESlotStatus.Have);
//如果真空检测OK带料产品已经吸上了
TransitNozzleManager.Instance.Nozzle(task.ToIndex + 1).AddProduct(task);
TurnoverTrayManager.Instance.Slot(task.FromIndex + 1).ClearProduct();
@ -547,6 +555,7 @@ namespace Rs.MotionPlat.Flow
while (true)
{
alarmInfo = $"测试穴位{testTrayHasProductList.ToJoinString()}中有产品,请取出后点击确定";
LogHelper.Debug(alarmInfo);
MsgBox.ShowDialog(1, alarmInfo, ETipButton.Ok);
//再次检测
TestTrayHasProduct();
@ -753,6 +762,7 @@ namespace Rs.MotionPlat.Flow
{
//获取需要放料的吸嘴
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
//TrayStatusManager.UpdateMultiSlotAsync("TurnoverNozzle", hasProductNozzles.Select(n => n.NozzleIndex).ToArray(), 0);
logInfo = GetClassName() + $"已运动到到测试放料位下方2 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}";
MessageQueue.Instance.Insert(logInfo);
/*打开测试穴位真空吸*/
@ -763,7 +773,8 @@ namespace Rs.MotionPlat.Flow
VacManager.TransitNozzleVacBreak(EVacOperator.Open, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
/*关闭周转吸头真空破*/
VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
//在这里更新产品状态
//TransitNozzleManager.Instance.Transi
Step = ETurnoverFlowStep.1;
}
}
@ -914,7 +925,11 @@ namespace Rs.MotionPlat.Flow
if (Ops.IsOff($"测试{nozzle.NozzleIndex}号穴位光纤检测") || GlobalVar.RunSpace)
{
//如果出现光纤异常,先用压头压一下
FiberWarningPressFlow.Instance.Press();
if(!GlobalVar.RunSpace)
{
FiberWarningPressFlow.Instance.Press();
}
//压一下之后如果还出现异常,则报警
if(Ops.IsOff($"测试{nozzle.NozzleIndex}号穴位光纤检测"))
{
@ -965,6 +980,7 @@ namespace Rs.MotionPlat.Flow
{
if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位真空吸检测") || GlobalVar.RunSpace || GlobalVar.DisableFixtureVacuumCheck)
{
GlobalTray.TurnoverNozzle.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.NotHave);
GlobalTray.TestTray.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.Have);
TestTrayManager.Instance.Slot(nozzle.NozzleIndex).AddProduct(nozzle);
nozzle.Clear();
@ -1120,7 +1136,8 @@ namespace Rs.MotionPlat.Flow
case ETurnoverFlowStep.2:
if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis)
{
if(Ops.IsArrived(AxisControl.PressZ) || GlobalVar.VirtualAxis)
Thread.Sleep(100);
//if(Ops.IsArrived(AxisControl.PressZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已到测试保压位下方2 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}";
MessageQueue.Instance.Insert(logInfo);
@ -1543,6 +1560,7 @@ namespace Rs.MotionPlat.Flow
TestTraySlot testSlot = TestTrayManager.Instance.Slot(task.FromIndex + 1);
if (Ops.IsOn($"周转{task.FromIndex + 1}号吸嘴真空吸检测") || GlobalVar.VirtualAxis || GlobalVar.RunSpace)
{
GlobalTray.TurnoverNozzle.ChangeStatus(task.FromIndex + 1, ESlotStatus.Have);
logInfo = $"周转{task.FromIndex + 1}号吸嘴真空吸检测OK";
MessageQueue.Instance.Insert(logInfo);
testSlot.ClearProduct();
@ -1593,7 +1611,7 @@ namespace Rs.MotionPlat.Flow
}
break;
case ETurnoverFlowStep.:
if (bTakeFlag)
if (bTakeFlag|| GlobalVar.CleanOut)
{
Step = ETurnoverFlowStep.;
}
@ -1781,9 +1799,14 @@ namespace Rs.MotionPlat.Flow
{
if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
foreach (TransitNozzle nozzle in hasProductNozzles)
{
GlobalTray.TurnoverNozzle.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.NotHave);
}
logInfo = GetClassName() + $"已运动到周转盘放料位下方2";
MessageQueue.Instance.Insert(logInfo);
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
//TrayStatusManager.UpdateMultiSlotAsync("TurnoverNozzle", hasProductNozzles.Select(n => n.NozzleIndex).ToArray(), 0);
/*关闭周转吸头真空吸*/
VacManager.TransitNozzleVacSuction(EVacOperator.Close, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray());
/*打开周转吸头真空破*/
@ -2125,19 +2148,30 @@ namespace Rs.MotionPlat.Flow
}
break;
case ETurnoverFlowStep.:
if (LoadAndUnloadTask.Instance.TestUnloadTaskArrived)
if(GlobalVar.CleanOut)
{
hasUnloadFlag = false;
LoadAndUnloadTask.Instance.TestUnloadTaskArrived = false;
MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null });
logInfo = GetClassName() + "通知中控产品全部已从治具中取出状态变成NotReady";
MessageQueue.Instance.Insert(logInfo);
unloadOk = true;
TestCenter.Instance.LoadTestUnLoadResult();
MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null });
LoadAndUnloadTask.Instance.Clear(1);
MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting);
Step = ETurnoverFlowStep.;
}
else
{
if (LoadAndUnloadTask.Instance.TestUnloadTaskArrived)
{
hasUnloadFlag = false;
LoadAndUnloadTask.Instance.TestUnloadTaskArrived = false;
MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null });
logInfo = GetClassName() + "通知中控产品全部已从治具中取出状态变成NotReady";
MessageQueue.Instance.Insert(logInfo);
unloadOk = true;
TestCenter.Instance.LoadTestUnLoadResult();
LoadAndUnloadTask.Instance.Clear(1);
MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting);
Step = ETurnoverFlowStep.;
}
}
break;
}
}

@ -0,0 +1,179 @@
using Rs.Framework;
using Rs.MotionPlat.Commom;
using Rs.MotionPlat.Entitys.Trays;
using Rs.MotionPlat.Recipe;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Rs.MotionPlat.Flow.SubFlow
{
enum ECleanOutFlowStep
{
,
,
,
,
,
,
}
/// <summary>
/// 清料处理流程
/// </summary>
public class CleanOutFlow
{
string logInfo = string.Empty;
bool run = false;
ECleanOutFlowStep step = ECleanOutFlowStep.;
private static CleanOutFlow _instance;
public static CleanOutFlow Instance
{
get
{
if(_instance==null)
_instance = new CleanOutFlow();
return _instance;
}
}
private CleanOutFlow() { }
public void CleanOut()
{
if (run)
return;
else
run = true;
ECleanOutFlowStep step = ECleanOutFlowStep.;
Task.Run(() => {
while (run)
{
switch (step)
{
case ECleanOutFlowStep.:
if(MachineManage.Instance.MachineStatus== EMachineStatus.Working && WorkEnvironment.Instance.EnvironmentOk)
{
List<Nozzle> unloadNozzles = NozzleManager.GetNozzlesByStatus(ENozzleStatus.ToUnload);
if (unloadNozzles != null && unloadNozzles.Count > 0)
{
LogHelper.Debug(GetClassName() + $"检测到排料吸嘴有料{unloadNozzles.Count}");
GlobalVar.DischargeNozzleHasProduct = true;
//生成下料任务
LoadAndUnloadTask.Instance.CreateDischargeNozzleCleanOutTask();
Thread.Sleep(100);
step = ECleanOutFlowStep.;
}
else
{
LogHelper.Debug(GetClassName() + $"检测到排料吸嘴无料");
step = ECleanOutFlowStep.;
}
}
break;
case ECleanOutFlowStep.:
if(DischargeFlow.Instance.GetCurStep()=="等待任务")
{
GlobalVar.DischargeNozzleHasProduct = false;
step = ECleanOutFlowStep.;
}
break;
case ECleanOutFlowStep.:
//检测周转盘是否有任务
int num = TurnoverTrayManager.Instance.Slots.Where(s => s.IsHasProduct).Count();
if (num > 0)
{
LogHelper.Debug(GetClassName() + $"检测到周转盘有料{num}");
LoadAndUnloadTask.Instance.CreateTurnoverTrayCleanTask();
Thread.Sleep(1000);
step = ECleanOutFlowStep.;
}
else
{
LogHelper.Debug(GetClassName() + $"检测到周转盘无料");
//检测周转吸嘴是否有料
if (TransitNozzleManager.Instance.GetHasProductNozzles().Count > 0 || TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0)
{
step = ECleanOutFlowStep.;
}
else
{
//清料结束
run = false;
logInfo = $"CleanOut finished";
MessageQueue.Instance.Insert(logInfo);
//清料结束
GlobalVar.CleanOut = false;
GlobalVar.DischargeNozzleHasProduct = false;
GlobalVar.TurnoverNozzleHasProduct = false;
Ops.Stop();
MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting);
}
}
break;
case ECleanOutFlowStep.:
if(DischargeFlow.Instance.GetCurStep()=="等待任务")
{
//检测周转吸嘴是否有料
if (TransitNozzleManager.Instance.GetHasProductNozzles().Count > 0 || TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0)
{
step = ECleanOutFlowStep.;
}
else
{
logInfo = $"CleanOut finished";
MessageQueue.Instance.Insert(logInfo);
//清料结束
GlobalVar.CleanOut = false;
GlobalVar.DischargeNozzleHasProduct = false;
GlobalVar.TurnoverNozzleHasProduct = false;
Ops.Stop();
run = false;
MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting);
}
}
break;
case ECleanOutFlowStep.:
//检测周转吸嘴是否有料
if (TransitNozzleManager.Instance.GetHasProductNozzles().Count > 0 || TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0)
{
if(TransitNozzleManager.Instance.GetHasProductNozzles().Count > 0)
{
GlobalVar.TurnoverNozzleHasProduct = true;
}
LogHelper.Debug(GetClassName() + $"检测到周转吸嘴有料{TransitNozzleManager.Instance.GetHasProductNozzles().Count}");
LoadAndUnloadTask.Instance.CreateTurnoverNozzleTestTrayCleanTask();
Thread.Sleep(1000);
step = ECleanOutFlowStep.;
}
else
{
LogHelper.Debug(GetClassName() + $"检测到周转吸嘴无料");
step = ECleanOutFlowStep.;
}
break;
case ECleanOutFlowStep.:
if (TurnoverFlow.Instance.GetStep() == "等待任务")
{
step = ECleanOutFlowStep.;
}
break;
default:
break;
}
}
});
}
private string GetClassName()
{
return "CleanOutFlow_";
}
public void Quit()
{
run = false;
}
}
}

@ -135,7 +135,13 @@ namespace Rs.MotionPlat.Flow
switch (eInstructioneInstruction)
{
case EInstruction.Cleanout:
MachineManage.Instance.SetLoadUnloadStatus(ERunState.Busying);
ReportToTestCenter(schedule);
Thread.Sleep(100);
//在这里启动
GlobalVar.CleanOut = true;
Ops.Start();
CleanOutFlow.Instance.CleanOut();
break;
case EInstruction.TransferSiloTray:
ReportToTestCenter(schedule);
@ -167,6 +173,7 @@ namespace Rs.MotionPlat.Flow
case EInstruction.CancelLoadAndUnload:
//schedulResult = new SchedulingResult() { Instruction = EInstruction.CancelLoadAndUnload, State = ERunState.Busying, GroupID = sm.GroupID, TurnoverID = sm.TurnoverID };
ReportToTestCenter(schedule);
MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting);
break;
case EInstruction.InquireStatus:
SchedulingStatusInfo statusInto = JsonConvert.DeserializeObject<SchedulingStatusInfo>(json);

@ -58,19 +58,22 @@ namespace Rs.MotionPlat.Flow
switch (step)
{
case EStockCheckStep.Input:
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
if(!GlobalVar.CleanOut)
{
logInfo = GetClassName() + $"{ETrayType.Input}料仓有料盘";
MessageQueue.Instance.Insert(logInfo);
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)
{
@ -88,84 +91,98 @@ namespace Rs.MotionPlat.Flow
step = EStockCheckStep.Ok;
break;
case EStockCheckStep.Ok:
if (!StockManager.Instance.GetStock(ETrayType.Ok).HasTray() || GlobalVar.VirtualAxis)
if (!GlobalVar.CleanOut)
{
logInfo = GetClassName() + $"{ETrayType.Ok}料仓无料盘,开始给{ETrayType.Ok}料仓上料";
MessageQueue.Instance.Insert(logInfo);
//if (StockManager.Instance.HasTray(EStockType.Empty2))
if (!StockManager.Instance.GetStock(ETrayType.Ok).HasTray() || GlobalVar.VirtualAxis)
{
//LogHelper.Debug("Empty2料仓有料开始搬运Empty2->Ok");
//if(
TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Ok,
() =>
{
GlobalTray.GetTray(ETrayType.Empty2).ChangeStatus(Controls.ESlotStatus.Null);
Task.Run(() =>
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,
() =>
{
StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null);
});
}, null,
() =>
{
Task.Run(() =>
GlobalTray.GetTray(ETrayType.Empty2).ChangeStatus(Controls.ESlotStatus.Null);
Task.Run(() =>
{
StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null);
});
}, null,
() =>
{
StockManager.Instance.GetStock(ETrayType.Ok).Load(EStockTrayLoadMode.AfterTakeTray, null);
Task.Run(() =>
{
StockManager.Instance.GetStock(ETrayType.Ok).Load(EStockTrayLoadMode.AfterTakeTray, null);
});
});
});
//)
//{
//)
//{
step = EStockCheckStep.Ng;
//}
//restoreStep = EStockCheckStep.Ng料仓是否就绪;
//}
//restoreStep = EStockCheckStep.Ng料仓是否就绪;
}
}
else
{
logInfo = GetClassName() + $"{ETrayType.Ok}料仓有料盘";
MessageQueue.Instance.Insert(logInfo);
step = EStockCheckStep.Ng;
}
}
else
{
logInfo = GetClassName() + $"{ETrayType.Ok}料仓有料盘";
MessageQueue.Instance.Insert(logInfo);
step = EStockCheckStep.Ng;
}
break;
case EStockCheckStep.Ng:
if (!StockManager.Instance.GetStock(ETrayType.Ng).HasTray() || GlobalVar.VirtualAxis)
if(!GlobalVar.CleanOut)
{
logInfo = GetClassName() + $"{ETrayType.Ng}料仓无料,开始给{ETrayType.Ng}料仓上料";
MessageQueue .Instance.Insert(logInfo);
//if (StockManager.Instance.HasTray(EStockType.Empty2))
if (!StockManager.Instance.GetStock(ETrayType.Ng).HasTray() || GlobalVar.VirtualAxis)
{
//LogHelper.Debug("Empty2料仓有料开始搬运Empty2->Ng");
//if (
TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Ng,
() =>
{
GlobalTray.GetTray(ETrayType.Empty2).ChangeStatus(Controls.ESlotStatus.Null);
Task.Run(() =>
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,
() =>
{
StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null);
});
GlobalTray.GetTray(ETrayType.Empty2).ChangeStatus(Controls.ESlotStatus.Null);
Task.Run(() =>
{
StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null);
});
}, null,
() =>
{
Task.Run(() =>
}, null,
() =>
{
StockManager.Instance.GetStock(ETrayType.Ng).Load(EStockTrayLoadMode.AfterTakeTray, null);
Task.Run(() =>
{
StockManager.Instance.GetStock(ETrayType.Ng).Load(EStockTrayLoadMode.AfterTakeTray, null);
});
});
});
//)
//{
//)
//{
step = EStockCheckStep.Multi;
//}
//restoreStep = EStockCheckStep.Multi料仓是否就绪;
//}
//restoreStep = EStockCheckStep.Multi料仓是否就绪;
}
}
else
{
logInfo = GetClassName() + $"{ETrayType.Ng}料仓有料盘";
MessageQueue.Instance.Insert(logInfo);
step = EStockCheckStep.Multi;
}
}
else
{
logInfo = GetClassName() + $"{ETrayType.Ng}料仓有料盘";
MessageQueue.Instance.Insert(logInfo);
step = EStockCheckStep.Multi;
}
break;
@ -218,12 +235,25 @@ namespace Rs.MotionPlat.Flow
// }
// break;
case EStockCheckStep.:
if(StockManager.Instance.IsReady())
if(!GlobalVar.CleanOut)
{
MessageQueue.Instance.Insert("所有料仓准备就绪");
EnvironmentOk = true;
isRunning = false;
EnvReadyOkEvent.Set();
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;
}

@ -264,6 +264,8 @@ namespace Rs.MotionPlat
GlobalTray.Empty2Tray = trayEmpty2;
GlobalTray.TurnoverTray = trayTurnover;
GlobalTray.TestTray = trayTest;
GlobalTray.DischargeNozzle= trayDischargeNozzle;
GlobalTray.TurnoverNozzle= trayTurnoverNozzle;
//StockManager.Instance.Start();
LoadStockStatus();
HOperatorSet.ReadImage(out defaultImage, "default.bmp");
@ -526,11 +528,119 @@ namespace Rs.MotionPlat
{
GlobalTray.GetTray(ETrayType.Empty2).Status = EStockTrayStatus.Empty.ToString();
}
TrayStatusManager.InitDischargeNozzle();
TrayStatusManager.InitTrunoverTray();
TrayStatusManager.InitTurnoverNozzle();
TrayStatusManager.InitFixtureTray();
}
private void button1_Click(object sender, EventArgs e)
{
MsgBox.ShowDialog(111, "取料失败!! \r\n周转吸嘴取治具{}号穴位的物料时失败 \r\nPickup fail !!\r\nNozzle of tester from site{} socket\r\nPickup fail !!\r\nSite{} socket 으로부터 Unit을 pickup할때 pickup fail이 발생하였습니다.", ETipButton.Yes);
}
/// <summary>
/// 治具盘画盘后事件
/// </summary>
/// <param name="obj"></param>
private void trayTest_DrawTrayAfterEvent(RsTray obj, ESlotStatus status, List<TraySlot> opSlots)
{
//TestTrayManager.Instance.ResetStatus();
//List<TraySlot> slots = obj.GetSlots(ESlotStatus.Have);
LogHelper.Debug($"手动画盘设置{opSlots.Select(s=>s.Index).ToJoinString()}{status}");
foreach (TraySlot slot in opSlots)
{
int slotIndex = slot.Index;
if(status== ESlotStatus.Have)
{
TestTrayManager.Instance.Slot(slotIndex).IsHasProduct = true;
}
else
{
TestTrayManager.Instance.Slot(slotIndex).ResetStatus();
}
}
}
/// <summary>
/// 周转盘画盘后事件
/// </summary>
/// <param name="obj"></param>
private void trayTurnover_DrawTrayAfterEvent(RsTray obj, ESlotStatus status, List<TraySlot> opSlots)
{
//TurnoverTrayManager.Instance.ResetStatus();
//List<TraySlot> slots = obj.GetSlots(ESlotStatus.Have);
LogHelper.Debug($"手动画盘设置{opSlots.Select(s => s.Index).ToJoinString()}{status}");
foreach (TraySlot slot in opSlots)
{
int slotIndex = slot.Index;
if (status == ESlotStatus.Have)
{
TurnoverTrayManager.Instance.Slot(slotIndex).IsHasProduct = true;
}
else
{
TurnoverTrayManager.Instance.Slot(slotIndex).ResetStatus();
}
}
}
/// <summary>
/// 周转吸嘴画盘后事件
/// </summary>
/// <param name="obj"></param>
private void trayTurnoverNozzle_DrawTrayAfterEvent(RsTray obj, ESlotStatus status, List<TraySlot> opSlots)
{
//TransitNozzleManager.Instance.ResetStatus();
//List<TraySlot> slots = obj.GetSlots(ESlotStatus.Have);
LogHelper.Debug($"手动画盘设置{opSlots.Select(s => s.Index).ToJoinString()}{status}");
foreach (TraySlot slot in opSlots)
{
int slotIndex = slot.Index;
if(status== ESlotStatus.Have)
{
TransitNozzleManager.Instance.Nozzle(slotIndex).FromType = TurnoverType.Turnover;
TransitNozzleManager.Instance.Nozzle(slotIndex).FromIndex = slotIndex - 1;
TransitNozzleManager.Instance.Nozzle(slotIndex).ToType = TurnoverType.Multifunction;
TransitNozzleManager.Instance.Nozzle(slotIndex).ToIndex = (slotIndex <= 8 ? slotIndex + 8 : slotIndex + 16) - 1;
TransitNozzleManager.Instance.Nozzle(slotIndex).IsHasProduct = true;
}
else
{
TransitNozzleManager.Instance.Nozzle(slotIndex).ResetStaus();
}
}
}
/// <summary>
/// 排料吸嘴画盘后事件
/// </summary>
/// <param name="obj"></param>
private void trayDischargeNozzle_DrawTrayAfterEvent(RsTray obj, ESlotStatus status, List<TraySlot> opSlots)
{
//NozzleManager.GetAllNozzles().ForEach((n) => { n.ResetStatus(); });
//List<TraySlot> slots = obj.GetSlots(ESlotStatus.Have);
LogHelper.Debug($"手动画盘设置{opSlots.Select(s => s.Index).ToJoinString()}{status}");
foreach (TraySlot slot in opSlots)
{
int slotIndex = slot.Index;
if (status == ESlotStatus.Have)
{
Nozzle nozzle = NozzleManager.GetNozzle(slotIndex);
if (nozzle != null)
{
NozzleManager.GetNozzle(slotIndex).FromType = TurnoverType.Turnover;
nozzle.FromIndex = slotIndex - 1;
NozzleManager.GetNozzle(slotIndex).ToType = TurnoverType.Multifunction;
nozzle.ToIndex = 0;
NozzleManager.GetNozzle(slotIndex).Status = ENozzleStatus.ToUnload;
}
}
else
{
NozzleManager.GetNozzle(slotIndex).ResetStatus();
}
}
}
}
}

File diff suppressed because it is too large Load Diff

@ -101,10 +101,8 @@ namespace Rs.MotionPlat
else if (button == btnQuit)
{
button.Selected = false;
DialogResult dr = MessageBox.Show("确定要退出吗?", "提示", MessageBoxButtons.OKCancel);
if (dr == DialogResult.OK)
if(WindowsClose())
{
Ops.Quit();
System.Environment.Exit(-1);
}
}
@ -296,6 +294,7 @@ namespace Rs.MotionPlat
DialogResult dr = MessageBox.Show("确定要退出吗?", "提示", MessageBoxButtons.OKCancel);
if (dr == DialogResult.OK)
{
LogHelper.Debug("手动退出软件");
Ops.Quit();
return true;
}

@ -31,6 +31,6 @@ using System.Runtime.InteropServices;
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
[assembly: AssemblyVersion("2.20.24.15")]
[assembly: AssemblyVersion("2.20.24.19")]
//[assembly: AssemblyVersion("1.0.0.0")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

@ -213,6 +213,7 @@
<Compile Include="Flow\LoadAndUnloadTask.cs" />
<Compile Include="Flow\MachineManage.cs" />
<Compile Include="Flow\MonitorSystemButton.cs" />
<Compile Include="Flow\SubFlow\CleanOutFlow.cs" />
<Compile Include="Flow\SubFlow\FiberWarningPressFlow.cs" />
<Compile Include="Flow\SubFlow\NgTrayToInputTrayFlow.cs" />
<Compile Include="Flow\SubFlow\TestFixtureVacSuctionCheckFlow.cs" />

@ -31,7 +31,8 @@ namespace Rs.MotionPlat.SysConfig
if (ok)
{
Task.Run(() => {
if (MachineManage.Instance.MachineStatus == EMachineStatus.Homed || MachineManage.Instance.MachineStatus == EMachineStatus.Stop)
//if (MachineManage.Instance.MachineStatus == EMachineStatus.Homed || MachineManage.Instance.MachineStatus == EMachineStatus.Stop)
if(true)
{
if (!StockManager.Instance.GetStock(result).IsRunning())
{
@ -56,6 +57,7 @@ namespace Rs.MotionPlat.SysConfig
}
else
{
MessageQueue.Instance.Warn("Stock is busy");
Msg.ShowError("Stock is busy");
}
}
@ -78,7 +80,8 @@ namespace Rs.MotionPlat.SysConfig
{
Task.Run(() => {
if(MachineManage.Instance.MachineStatus== EMachineStatus.Homed || MachineManage.Instance.MachineStatus== EMachineStatus.Stop)
//if(MachineManage.Instance.MachineStatus== EMachineStatus.Homed || MachineManage.Instance.MachineStatus== EMachineStatus.Stop)
if(true)
{
if (!StockManager.Instance.GetStock(result).IsRunning())
{

Loading…
Cancel
Save