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.

821 lines
36 KiB
C#

using log4net.Core;
using Rs.Controls;
using Rs.Framework;
using Rs.MotionPlat.Commom;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Rs.MotionPlat.Flow
{
/// <summary>
/// 周转流程步序
/// </summary>
enum ETurnoverFlowStep
{
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
}
enum ETestLoadStep
{
}
enum ETestUnloadStep
{
}
/// <summary>
/// 周转流程
/// </summary>
public class TurnoverFlow:BaseFlow
{
private static TurnoverFlow instance;
public static TurnoverFlow Instance
{
get
{
if(instance == null)
instance = new TurnoverFlow();
return instance;
}
}
private TurnoverFlow()
{
slots.Add(1);
slots.Add(2);
slots.Add(3);
slots.Add(4);
slots.Add(5);
slots.Add(6);
slots.Add(7);
slots.Add(8);
}
/// <summary>
/// 保压位上料
/// </summary>
private bool pressLoad = false;
/// <summary>
/// 保压位下料
/// </summary>
private bool pressUnload = false;
private bool loadOk = false;
private bool unloadOk = false;
string logInfo = "";
List<int> slots = new List<int>();
List<int> ngList = new List<int>();
ETurnoverFlowStep Step = ETurnoverFlowStep.;
double targetPos = 0.0;
Motion.ErrorCode errCode = Motion.ErrorCode.Ok;
public override void Run()
{
switch (Step)
{
case ETurnoverFlowStep.:
if(pressLoad)//测试位上料
{
pressLoad = false;
Step = ETurnoverFlowStep.;
}
if(pressUnload)//测试位下料
{
pressUnload = false;
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeY");
errCode = AxisControl.TurnoverY.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"到周转盘取料位上方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverY))
{
logInfo = $"已运动到周转盘取料位上方 TurnoverY at:{Ops.GetCurPosition( AxisAlias.TurnoverY)}";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"到周转盘下方取料位";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ))
{
logInfo = $"已运动到周转盘下方取料位 at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
//打开真空吸
foreach (var slot in slots)
{
Ops.On($"周转{slot}号吸嘴真空吸");
}
Thread.Sleep(GlobalVar.TurnoverNozzleOpenVacSuctionDelaytime);
//关闭周转盘真空吸
foreach (var slot in slots)
{
Ops.Off($"周转盘{slot}号穴位真空吸");
}
Thread.Sleep(GlobalVar.TurnoverTrayCloseVacSuctionDelaytime);
//打开周转盘真空破
foreach (var slot in slots)
{
Ops.On($"周转盘{slot}号穴位真空破");
}
Thread.Sleep(GlobalVar.TurnoverTrayOpenVacBreakDelaytime);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeZ")+GlobalVar.CloseVacOffsetHeight;
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if (errCode == Motion.ErrorCode.Ok)
{
logInfo = $"到周转盘取料破真空位";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ))
{
logInfo = $"已到周转盘取料破真空位";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
//关闭周转盘真空破
foreach (var slot in slots)
{
Ops.Off($"周转盘{slot}号穴位真空破");
}
Thread.Sleep(GlobalVar.TurnoverTrayCloseVacBreakDelaytime);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("TurnoverSafeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"周转盘取料完成抬起";
MessageQueue.Instance.Insert (logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ))
{
logInfo = $"已周转盘取料完成抬起";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
ngList = CheckNozzleVac();
if(ngList.Count==0||GlobalVar.RunSpace)
{
logInfo = $"真空检测OK";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
else
{
string msg = string.Join(",", ngList.ToArray());
logInfo = $"周转吸嘴 {msg} 真空值未达到";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Msg.ShowError($"周转吸嘴 {msg} 真空值未达到,请处理后点击确定");
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressDumpY");
errCode = AxisControl.TurnoverY.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"到测试放料位上方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverY))
{
logInfo = $"已运动到测试放料位上方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressDumpZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"到测试放料位下方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ))
{
logInfo = $"已运动到到测试放料位下方 at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
OpenPressVac();
Thread.Sleep(GlobalVar.PressOpenVacSuctionDelaytime);
CloseNozzleVac();
Thread.Sleep(GlobalVar.TurnoverNozzleCloseVacSuctionDelaytime);
foreach (var slot in slots)
{
Ops.On($"周转{slot}号吸嘴真空破");
}
Thread.Sleep(GlobalVar.TurnoverNozzleOpenVacBreakDelaytime);
foreach (var slot in slots)
{
Ops.Off($"周转{slot}号吸嘴真空破");
}
Thread.Sleep(GlobalVar.TurnoverNozzleCloseVacBreakDelaytime);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressSafeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"测试位放料完成抬起";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ))
{
logInfo = $"测试位放料完成抬起完成";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
if(GlobalVar.RunSpace)
{
Step = ETurnoverFlowStep.;
}
else
{
Step = ETurnoverFlowStep.;
}
}
break;
case ETurnoverFlowStep.:
ngList = TestVacCheck();
if(ngList.Count==0)
{
Step = ETurnoverFlowStep.;
}
else
{
string msg = string.Join(",", ngList.ToArray());
logInfo = $"测试穴位 {msg} 真空异常";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Msg.ShowError($"测试穴位 {msg} 真空异常,请处理后点击确定");
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressY");
errCode = AxisControl.TurnoverY.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"到测试保压位上方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverY))
{
logInfo = $"已运动到测试保压位上方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressZ");
errCode = AxisControl.PressZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"到测试保压位下方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.PressZ))
{
logInfo = $"已到测试保压位下方 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
ClosePressVac();
Thread.Sleep(GlobalVar.PresseCloseVacSuctionDelaytime);
loadOk = true;
Step = ETurnoverFlowStep.;
}
break;
//-----------------------------------------------测试位下料
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressSafeZ");
errCode = AxisControl.PressZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = "测试完成准备抬起";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.PressZ))
{
logInfo = $"测试完成已抬起 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressTakeY");
errCode = AxisControl.TurnoverY.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"到测试取料位上方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
MessageQueue.Instance.Insert($"goto press take product up position");
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverY))
{
logInfo = $"已运动到测试取料位上方 TurnoverY at:{Ops.GetCurPosition(AxisAlias.TurnoverY)}";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressTakeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"到测试取料位下方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ))
{
logInfo = $"已运动到测试取料位下方 TurnoverZ at:{Ops.GetCurPosition("TurnoverZ")}";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
//打开吸嘴真空吸
foreach (var slot in slots)
{
Ops.On($"周转{slot}号吸嘴真空吸");
}
Thread.Sleep(GlobalVar.TurnoverNozzleOpenVacSuctionDelaytime);
foreach (var slot in slots)
{
Ops.On($"测试{slot}号穴位真空破");
}
Thread.Sleep(GlobalVar.PresseOpenVacBreakDelaytime);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
logInfo = $"到测试破真空位";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
targetPos = SysConfigParam.GetValue<double>("PressTakeZ")+1;
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if (errCode == Motion.ErrorCode.Ok)
{
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if(Ops.IsStop(AxisAlias.TurnoverZ))
{
logInfo = $"已运动到测试破真空位";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
foreach (var slot in slots)
{
Ops.Off($"测试{slot}号穴位真空破");
}
Thread.Sleep(GlobalVar.PressCloseVacBreakDelaytime);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressSafeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"测试位取料完成准备抬起";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ))
{
logInfo = $"测试位取料完成已抬起";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
ngList = CheckNozzleVac();
if (ngList.Count==0 || GlobalVar.RunSpace)
{
Step = ETurnoverFlowStep.;
}
else
{
string msg = string.Join(",", ngList.ToArray());
Msg.ShowError($"吸嘴{msg}真空值未达到,请处理后点击确定");
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("TurnoverDumpY");
//targetPos = SysConfigParam.GetValue<double>("TurnoverTakeY");
errCode = AxisControl.TurnoverY.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"到周转盘放料位上方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverY))
{
logInfo = $"已运动到周转盘放料位上方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
//targetPos = SysConfigParam.GetValue<double>("TurnoverDumpZ");
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos+1, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"到周转盘放料位下方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ))
{
logInfo = $"已运动到周转盘放料位下方";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
//打开周转盘真空吸
foreach (var slot in slots)
{
Ops.On($"周转盘{slot + 8}号穴位真空吸");
}
Thread.Sleep(GlobalVar.TurnoverTrayOpenVacSuctionDelaytime);
//关闭吸嘴真空吸
foreach (var slot in slots)
{
Ops.Off($"周转{slot}号吸嘴真空吸");
}
Thread.Sleep(GlobalVar.TurnoverNozzleCloseVacSuctionDelaytime);
//打开吸嘴真空破
foreach (var slot in slots)
{
Ops.On($"周转{slot}号吸嘴真空破");
}
Thread.Sleep(GlobalVar.TurnoverNozzleOpenVacBreakDelaytime);
foreach (var slot in slots)
{
Ops.Off($"周转{slot}号吸嘴真空破");
}
Thread.Sleep(GlobalVar.TurnoverNozzleCloseVacBreakDelaytime);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("TurnoverSafeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok)
{
logInfo = $"周转盘放料完成准备抬起";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ))
{
logInfo = $"周转盘放料完成已抬起";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
ngList = TurnoverTrayVacCheck();
if (ngList.Count == 0 || GlobalVar.RunSpace)
{
Step = ETurnoverFlowStep.;
//判断周转盘是否有需要测试的穴位
//List<TraySlot> haveSlots = GlobalTray.TurnoverTray.GetSlots(ESlotStatus.Have);
//var loadList = haveSlots.Where(slot => ((slot.Index >= 1 && slot.Index <= 8) || (slot.Index >= 17 && slot.Index <= 24)));
//if (loadList.Count()==0)
//{
// //周转盘没有需要测试的穴位,把轴移动到安全位
// Step = ETurnoverFlowStep.到安全位;
//}
//else
//{
// unloadOk = true;
// Step = ETurnoverFlowStep.等待命令;
//}
}
else
{
string msg = string.Join(",", ngList);
Msg.ShowError($"周转穴位{msg}真空异常,请处理后点击确定");
Step = ETurnoverFlowStep.;
//判断周转盘是否有需要测试的穴位
//List<TraySlot> haveSlots = GlobalTray.TurnoverTray.GetSlots(ESlotStatus.Have);
//var loadList = haveSlots.Where(slot => ((slot.Index >= 1 && slot.Index <= 8) || (slot.Index >= 17 && slot.Index <= 24)));
//if (loadList.Count() == 0)
//{
// //周转盘没有需要测试的穴位,把轴移动到安全位
// Step = ETurnoverFlowStep.到安全位;
//}
//else
//{
// unloadOk = true;
// Step = ETurnoverFlowStep.等待命令;
//}
}
break;
case ETurnoverFlowStep.:
errCode = AxisControl.TurnoverY.MovePos(SysConfigParam.GetValue<double>("PressY"), GlobalVar.WholeSpeed);
if ((errCode> Motion.ErrorCode.Ok))
{
Msg.ShowError($"TurnoverY move fail ret:{errCode}");
}
else
{
logInfo = $"到安全位";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if(Ops.IsStop("TurnoverY"))
{
logInfo = $"已运动到安全位,任务结束";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
unloadOk = true;
Step = ETurnoverFlowStep.;
}
break;
}
}
public bool LoadFinished()
{
return loadOk;
}
public bool UnloadFinished()
{ return unloadOk; }
public void PressLoad(List<TurnoverInfo> taskList)
{
slots.Clear();
foreach(var slot in taskList)
{
slots.Add(slot.FromIndex+1);
}
pressLoad = true;
loadOk= false;
}
/// <summary>
/// 周转盘真空吸检测
/// </summary>
/// <returns></returns>
public List<int> TurnoverTrayVacCheck()
{
List<int> result = new List<int>();
foreach (var slot in slots)
{
if (!Ops.IsOn($"周转盘{slot+8}号穴位真空吸检测"))
{
result.Add(slot+8);
}
}
return result;
}
/// <summary>
/// 测试穴位真空吸检测
/// </summary>
/// <returns></returns>
public List<int> TestVacCheck()
{
List<int> result = new List<int>();
foreach (var slot in slots)
{
if (!Ops.IsOn($"测试{slot}号穴位真空吸检测"))
{
result.Add(slot);
}
}
return result;
}
public void PressUnload(List<TurnoverInfo> taskList)
{
slots.Clear();
foreach (var item in taskList)
{
slots.Add(item.FromIndex+1);
}
pressUnload = true;
unloadOk= false;
}
/// <summary>
/// 吸嘴真空吸检测
/// </summary>
/// <returns></returns>
List<int> CheckNozzleVac()
{
List<int> ngList = new List<int>();
//周转1号吸嘴真空吸检测
foreach (var slot in slots)
{
if (!Ops.IsOn($"周转{slot}号吸嘴真空吸检测"))
{
ngList.Add(slot);
}
}
return ngList;
}
void OpenNozzleVac()
{
foreach (var slot in slots)
{
Ops.On($"周转{slot}号吸嘴真空吸");
}
}
void CloseNozzleVac()
{
foreach (var slot in slots)
{
Ops.Off($"周转{slot}号吸嘴真空吸");
}
}
void OpenTurnoverTrayVac()
{
foreach (var slot in slots)
{
Ops.On($"周转盘{slot}号穴位真空吸");
}
}
void CloseTurnoverTrayVac()
{
foreach (var slot in slots)
{
Ops.Off($"周转盘{slot}号穴位真空吸");
}
}
void OpenPressVac()
{
foreach (var slot in slots)
{
Ops.On($"测试{slot}号穴位真空吸");
}
}
void ClosePressVac()
{
foreach (var slot in slots)
{
Ops.Off($"测试{slot}号穴位真空吸");
}
}
}
}