private void OnExecuteCommand(Object sender)
{
#region 开始初始化监测
//TODO::lxw 调试注释
if (!Global.InitializeAutoDone)
{ ShowMessageBox("请先全部初始化!");
return;
}
if (Global.BasketContinueWork)
{
if (SelectedSlotFlow.FlowName != AnotherBasket.SelectedSlotFlow.FlowName)
{
ShowMessageBox("连续作业配方需一致!");
return;
}
}
if (!Global.InitializeSystemDone || Helpering.IsInitializing)
{
ShowMessageBox("未初始化完成!");
return;
}
#endregion 开始初始化监测
//保存操作日志
GloBusiness.SaveOperationLog(View.Start.Content?.ToString());
#region 确认花篮状态
string id = "DI2.0";
switch (Basket)
{
case Constant.Basket1:
id = SelectedMapSize.ComboCode == Global.Size6 ? "DI2.1" : "DI2.0";
Helpering.RunningSizeA = SelectedMapSize.ComboCode;
break;
case Constant.Basket2:
id = SelectedMapSize.ComboCode == Global.Size6 ? "DI2.4" : "DI2.3";
Helpering.RunningSizeB = SelectedMapSize.ComboCode;
break;
}
var port
= Global.InputIOs.FirstOrDefault(i => i.RecId == id);
if (!GloBusiness.CheckOn(port, 800))
{
ShowMessageBox("请摆放新花篮后重新开始加工!");
return;
}
if (FlowerWorkStatusEnum == FlowerWorkStatusEnum.Finish)
{
ShowMessageBox("请摆放新花篮后重新开始加工!");
return;
}
#endregion 确认花篮状态
#region 确认工位状态、批配方、尺寸
if (!Global.Auto)
{
ShowMessageBox("请切换自动模式后重新开始加工!");
return;
}
if (SelectedSlotFlow == null)
{
ShowMessageBox("批配方为空不允许加工!");
return;
}
if (SelectedMapSize == null)
{
ShowMessageBox("尺寸选择为空不允许加工!");
return;
}
#endregion 确认工位状态、批配方、尺寸
//排放检测标志
var exhaustFlag = Global.Oems.FirstOrDefault(s => s.RecId == Constant.EXHAUST_CHECK_FLAG);
foreach (var s in Global.CanNotStartWarning)
{
if ((s == "EQU_015" || s == "EQU_016" || s == "EQU_017" || s == "EQU_018") &&
exhaustFlag.SettingStatus == 0)
{
continue;
}
if (GlobalTimer.warningPool.ContainsKey(s) && GlobalTimer.warningPool[s])
{
ShowMessageBox("当前设备有报警!");
return;
}
}
//液罐状态
//
var tankFlag = Global.Oems.FirstOrDefault(s => s.RecId == Constant.TANK_CHECK_FLAG);
if (tankFlag.SettingStatus == 1 &&
!(LiquidExPbc.Tank2InGasIsOpen&&LiquidExPbc.Tank1InLqIsOpen) ||(LiquidExPbc.Tank2InGasIsOpen&& LiquidExPbc.Tank2InLqIsOpen))
// ( 1出液&&1进气 )||( 2出液&&2进气 )
{
//ShowMessageBox("液罐供液异常,请确保有一个液罐在出液状态!");
//return;
var result = ShowMessageBoxYesNo("液罐供液异常,请确保有一个液罐在出液状态!请确认是否继续加工!");
if (result == DialogState.Ok)
{
//MessageBox.Show("继续执行...");
}
else if (result == DialogState.No)
{
//MessageBox.Show("操作已取消");
return;
}
}
if ((string)sender != "button")
{
if (!timeClicked)
{
timeClicked = true;
}
else
{
if (clickThread != null)
{
clickThread.Abort();
clickThread = null;
}
timeClicked = true;
clickThread = new Thread(new ThreadStart((Action)(() =>
{
Thread.Sleep(100);
timeClicked = false;
})));
clickThread.IsBackground = true;
clickThread.Start();
return; // 避免双击
}
}
clickThread = new Thread(new ThreadStart((Action)(() =>
{
Thread.Sleep(100);
timeClicked = false;
})));
clickThread.IsBackground = true;
clickThread.Start();
ProgressEnabled = false;
SetRunning(!ProgressEnabled);
NoticeBack(basketStatus);
Setting.Save("Home", this.Basket + "MapSize", SelectedMapSize.RecId);
Setting.Save("Home", this.Basket + "SlotFlow", SelectedSlotFlow.RecId);
FlowerWorkStatusEnum = FlowerWorkStatusEnum.Prepare;
Task.Run((() => RobotExecute.RemoveUnUseTask(Basket)));
RobotExecute.Start();
Thread t = new Thread(() =>
{
int CanNext = 0;
StopClicked = false;
TerminateClicked = false;
Thread tr = new Thread(new ThreadStart((Action)(() =>
{
try
{
if (Global.TwoBasketContinue)
{
if (Basket == Constant.Basket1)
{
while (Helpering.IsRunningB && !StopClicked && !TerminateClicked &&
GloBusiness.CheckOn(port, 300))
{
Thread.Sleep(100);
}
}
else if (Basket == Constant.Basket2)
{
while (Helpering.IsRunningA && !StopClicked && !TerminateClicked &&
GloBusiness.CheckOn(port, 300))
{
Thread.Sleep(100);
}
}
}
basketStatus = Workflow.InitiateStations(SelectedSlotFlow, this.Basket);
SlotStatues = basketStatus?.SlotStatues;
ExecuteHelper.MonitorBasketWarning(basketStatus.StationCode, Basket,
SelectedMapSize.ComboCode);
if (StopClicked || TerminateClicked || !GloBusiness.CheckOn(port))
{
CanNext = 1;
ProgressEnabled = true;
SetRunning(!ProgressEnabled);
return;
}
//数据准备
foreach (string stationCode in basketStatus.StationCodes)
{
StationState stationState = Global.GetStationState(stationCode);
if (!(stationState == StationState.Prepared || stationState == StationState.Maintenance
|| stationState == StationState.DoingFormula ||
stationState == StationState.WaitingTake))
{
ShowMessageBox($"{stationCode}工位未初始化,请确认全部工位初始化后重新开始加工!");
CanNext = 1;
ProgressEnabled = true;
SetRunning(!ProgressEnabled);
return;
}
}
Message = "开始执行";
FlowerWorkStatusEnum = FlowerWorkStatusEnum.Working;
basketStatus.ProductId = _productId;
basketStatus.BatchNo = _batchNo;
//SaveTask
basketStatus.HardExecuteEntity =
HardExecuteDA.Save(ExecuteConvert.ConvertExecuteMain(basketStatus));
Global.DebugBasketStatus = basketStatus;
basketStatus.ExceptionMessage = string.Empty;
basketStatus.Basket = Basket;
basketStatus.Canceling = false;
basketStatus.LittleName = string.Format("[{0}]",
Basket == Constant.Basket1 ? Constant.LittleAName : Constant.LittleBName);
basketStatus.StationCode = string.Format("{0}",
Basket == Constant.Basket1 ? Constant.BasketCode1 : Constant.BasketCode2);
basketStatus.Size = SelectedMapSize.RecId;
//加载花篮后再执行
//Global.GetDefaultPR();
//CS1_001,CS2_001,花篮异常, 和花篮尺寸匹对相当于double check
ExecuteHelper.MonitorBasketWarning(basketStatus.StationCode, basketStatus.Basket,
SelectedMapSize.ComboCode);
if (ExecuteHelper.CheckBasketWarning(basketStatus.StationCode, basketStatus.Basket,
SelectedMapSize.RecId) && Global.IsRelease)
{
CanNext = 1;
ProgressEnabled = true;
SetRunning(!ProgressEnabled);
FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
return;
}
//CS1_002,CS2_002,晶圆异常
//TODO xj 临时屏蔽
//if (ExecuteHelper.CheckDiskWarning(basketStatus.StationCode, true) && Global.IsRelease)
//{
// CanNext = 1;
// ProgressEnabled = true;
// SetRunning(!ProgressEnabled);
// FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
// ShowErrorBox(string.Format("[{0}-WRN]晶圆片异常!", basketStatus.StationCode));
// return;
//}
// 下发配方
WorkflowPreTask.PreRun(SelectedSlotFlow);
Thread.Sleep(1000);
//TODO::lxw 调试注释
while (!StopClicked && !TerminateClicked && GloBusiness.CheckOn(port, 300))
{
if (ExeBaseHelper.DtmCheck())
{
break;
}
Thread.Sleep(300);
}
if (StopClicked || TerminateClicked || !GloBusiness.CheckOn(port))
{
CanNext = 1;
ProgressEnabled = true;
SetRunning(!ProgressEnabled);
return;
}
//Robot Mapping Speed
var setting = Global.Settings.FirstOrDefault(q => q.RecId == "Robot_MappingSpeed");
var command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SSPP);
string callback = Robot.Send(string.Format("{0} {1},{2},{2},{2},{2}", command.CommandCode,
command.CommandParam, setting.SettingValue));
if (callback != ">")
{
CanNext = 1;
ProgressEnabled = true;
SetRunning(!ProgressEnabled);
FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
ShowErrorBox(string.Format("设置Map速度失败!"));
return;
}
//开关真空检测
command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SRTF);
string commandText = string.Format("{0} {1}", command.CommandCode, command.CommandParam);
callback = Robot.Send(commandText);
if (callback != ">")
{
CanNext = 1;
ProgressEnabled = true;
SetRunning(!ProgressEnabled);
FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
ShowErrorBox(string.Format("开关真空检测失败!"));
return;
}
//略感測器之訊號
setting = Global.Settings.FirstOrDefault(q =>
q.RecId == "Robot_ArmRVacuumCheck"); //Robot_ArmLVacuumCheck
if (setting != null)
{
command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SSEN);
commandText = string.Format("{0} {1}", command.CommandCode,
setting.SettingStatus == 1 ? 0 : 1);
callback = Robot.Send(commandText);
if (callback != ">")
{
CanNext = 1;
ProgressEnabled = true;
SetRunning(!ProgressEnabled);
FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
ShowErrorBox(string.Format("略感測器之訊號!"));
return;
}
}
string scanValue = "";
//复用
if (IsRepeated != null && IsRepeated.Code)
{
var hardScanSlotRecordEntity = HardScanSlotRecordDA.QueryLatestOne(basketStatus.Basket);
scanValue = hardScanSlotRecordEntity.Value;
}
else
{
//等待机器人
while (Robot.RobotState == RobotState.Run)
{
Thread.Sleep(500);
}
if (Global.Mock)
{
scanValue = "111111111111111111111111111";
}
else
{
//扫片
DtStart = DateTime.Now;
Robot.RobotState = RobotState.Run;
string a = "";
if (Basket == Constant.Basket1)
{
if (basketStatus.Size == Global.Size6)
{
a = "c";
}
else
{
a = "a";
}
}
else if (Basket == Constant.Basket2)
{
if (basketStatus.Size == Global.Size6)
{
a = "e";
}
else
{
a = "b";
}
}
command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.MAP);
commandText = $"{command.CommandCode} {a}";
// commandText = $"{command.CommandCode} {(Basket == Constant.Basket1 ? "a" : "b")}";
callback = Robot.Send(commandText);
if (callback != ">")
{
ExecuteRobotHelper.CheckRobotWarning(true, "");
CanNext = 1;
ProgressEnabled = true;
FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
Robot.RobotState = RobotState.Idle;
ShowErrorBox(string.Format("运行Map失败"));
return;
}
TsNow = DateTime.Now - DtStart;
double tt1 = TsNow.TotalMilliseconds;
command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.RSR);
commandText = $"{command.CommandCode}";
scanValue = Robot.Send(commandText);
Robot.RobotState = RobotState.Idle;
Log.Info($"scan {scanValue}");
//scanValue = "000011111111111111111111111";
}
}
HardScanSlotRecordDA.Save(ExecuteConvert.ConvertScanSlotRecord(basketStatus, scanValue));
//扫片结果
Robot.AnalyzeScanWafer(scanValue, basketStatus.SlotStatues);
SlotStatues = basketStatus?.SlotStatues;
TsNow = DateTime.Now - DtStart;
double tt2 = TsNow.TotalMilliseconds;
#region 扫片异常处理现代码
//CS1_002,CS2_002,晶圆异常
var firstError = basketStatus.SlotStatues.FirstOrDefault(q => q.InStatus > 1);
if (firstError != null ||
!basketStatus.SlotStatues.Any(q => q.InBasketStatus == SlotInBasketStatus.Exist))
{
//异常后人工处理
WorkChooseScanningAnomalyViewModule lvm = new WorkChooseScanningAnomalyViewModule();
lvm.ShowDialog(scanValue);
scanValue = Global.ScanningValue;
//再次处理扫片结果
Robot.AnalyzeScanWafer(scanValue, basketStatus.SlotStatues);
SlotStatues = basketStatus?.SlotStatues;
//Robot AutoRunSpeed 连续作业再次设设置机器人速度
if (Global.BasketContinueWork)
{
setting = Global.Settings.FirstOrDefault(q => q.RecId == "Robot_AutoRunSpeed");
command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SSPP);
callback = Robot.Send(string.Format("{0} {1},{2},{2},{2},{2}", command.CommandCode,
command.CommandParam, setting.SettingValue));
if (callback != ">")
{
CanNext = 1;
ShowErrorBox(string.Format("设置机器人配方运行速度失败"));
return;
}
}
}
#endregion
#region 扫片异常处理原代码
//CS1_002,CS2_002,晶圆异常
// var firstError = basketStatus.SlotStatues.FirstOrDefault(q => q.InStatus > 1);
// if (firstError != null ||
// !basketStatus.SlotStatues.Any(q => q.InBasketStatus == SlotInBasketStatus.Exist))
// {
//
// //扫片异常
// var warning =
// Global.Warnings.FirstOrDefault(q => q.WarningCode == basketStatus.StationCode + "_003");
// if (warning != null)
// {
// SysWarningEntity swe = new SysWarningEntity();
// swe.WarnCode = warning.WarningCode;
// swe.WarnName = warning.WarningCode;
// swe.LogDetail = string.Format(Constant.DefaultWarningCode, warning.WarningCode,
// warning.WarningName);
// swe.StartTime = DateTime.Now;
// swe.CreateBy = Global.CurrentUserCode;
// swe.LogType = warning.ActionType; //告警等级
// swe.RefWarn = warning.RecId;
// SysWarningDA.Save(swe);
// }
//
// CanNext = 1;
// ProgressEnabled = true;
// SetRunning(!ProgressEnabled);
// FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
// ShowErrorBox(
// "扫片异常,请检查花篮晶圆摆放!"); // string.Format(, basketStatus.StationCode, firstError?.Index, firstError?.StatusMessage));
// SetWoringEndState();
//
// //Robot AutoRunSpeed 连续作业再次设设置机器人速度
// if (Global.BasketContinueWork)
// {
// setting = Global.Settings.FirstOrDefault(q => q.RecId == "Robot_AutoRunSpeed");
// command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SSPP);
// callback = Robot.Send(string.Format("{0} {1},{2},{2},{2},{2}", command.CommandCode,
// command.CommandParam, setting.SettingValue));
// if (callback != ">")
// {
// CanNext = 1;
// ShowErrorBox(string.Format("设置机器人配方运行速度失败"));
// return;
// }
// }
//
// return;
// }
// else //恢复状态
// {
// HardWarningEntity warning =
// Global.Warnings.FirstOrDefault(q => q.WarningCode == basketStatus.StationCode + "_003");
// if (warning != null)
// {
// //查找最近的告警,如存在则更新状态
// string recid = SysWarningDA.LoadLastWarning(warning.RecId);
// if (!string.IsNullOrWhiteSpace(recid))
// {
// SysWarningDA.RefreshEndTime(recid);
// }
// }
// }
#endregion
//根据选择过滤
List<string> filter = basketStatus.StationCode == Constant.BasketCode1
? Global.CS1WorkState
: Global.CS2WorkState;
basketStatus.SlotStatues.ForEach(s => s.IsSelected = filter[s.Index - 1] == "ON");
TsNow = DateTime.Now - DtStart;
double tt3 = TsNow.TotalMilliseconds;
//Robot AutoRunSpeed
setting = Global.Settings.FirstOrDefault(q => q.RecId == "Robot_AutoRunSpeed");
command = Global.RobotCommands.FirstOrDefault(q => q.CommandCode == Constant.SSPP);
callback = Robot.Send(string.Format("{0} {1},{2},{2},{2},{2}", command.CommandCode,
command.CommandParam, setting.SettingValue));
if (callback != ">")
{
CanNext = 1;
ProgressEnabled = true;
SetRunning(!ProgressEnabled);
FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
ShowErrorBox(string.Format("设置机器人配方运行速度失败"));
return;
}
TsNow = DateTime.Now - DtStart;
check1 = TsNow.TotalMilliseconds;
ProgressEnabled = false;
CanNext = 2;
}
catch (Exception ex)
{
FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
ShowErrorBox(ex.Message);
CanNext = 1;
}
})));
tr.IsBackground = true;
tr.Name = $"ScanThread:{GloBusiness.CreateRandom()}";
tr.Start();
//等待信息返回
while (CanNext == 0)
{
Helpering.Sleep(30);
}
TsNow = DateTime.Now - DtStart;
check2 = TsNow.TotalMilliseconds;
if (CanNext == 2)
{
ProgressEnabled = false;
NoticeBack(basketStatus);
cancellationTokenSource = new CancellationTokenSource();
RobotExecute.RemoveDoneTask(this.basketStatus.BasketCode);
DebugLog.WriteLog("create main task");
RobotScanResult robotScanResult = new RobotScanResult();
if (basketStatus.StationCode == Constant.BasketCode1)
{
Global.BasketAStatus = basketStatus;
}
else
{
Global.BasketBStatus = basketStatus;
}
robotScanResult.BasketCode = basketStatus.StationCode;
robotScanResult.Slots = basketStatus.SlotStatues;
AppEventAggregator.GetEventAggregator().GetEvent<RobotScanResultEvent>().Publish(robotScanResult);
Task flowTask = new Task(() =>
{
try
{
Thread.CurrentThread.Name = $"basket {basketStatus.StationCode} thread";
//TODO 一开始把所有的花篮拿的任务都放到机器人队列里
string key = basketStatus.StationCode;
if (basketStatus.Size != Global.Size6)
{
key = key + "-4";
}
HardRobotStationEntity basket =
Global.RobotStations.FirstOrDefault(q => q.StationCode == key);
foreach (SlotStatus slotStatus in basketStatus.SlotStatues.Where(s =>
s.InStatus == 1 && s.Status == ExecuteStatusEnum.Prepare && s.IsSelected))
{
StationStatus stationStatus = new StationStatus()
{
BasketStatus = basketStatus,
SlotStatus = slotStatus,
StationCode = basketStatus.StationCode,
SlotStepStatus = new SlotStepStatus()
{
BasketStatus = basketStatus,
IsLastStep = false,
StationType = StationTypeEnum.CS,
NextType = StationTypeEnum.CA,
NextSlotStepStatus = slotStatus.SlotStepStatues[0],
SlotStatus = slotStatus,
Status = ExecuteStatusEnum.Wait,
Index = 0
}
};
slotStatus.SlotStepStatues[0].PreviousSlotStepStatus = stationStatus.SlotStepStatus;
FlowStatus flowStatus = new FlowStatus()
{
StationStatus = stationStatus,
BasketStatus = basketStatus,
SlotStepStatus = stationStatus.SlotStepStatus,
SlotStatus = slotStatus,
};
RobotTask task = new RobotTask()
{
Priority = 9,
TaskId = Guid.NewGuid().ToString(),
Status = TaskStatus.Puted,
PutType = TaskType.Get,
RobotStation = basket,
StationStatus = stationStatus,
FlowStatus = flowStatus,
CancellationTokenSource = cancellationTokenSource
};
RobotExecute.Push(task);
}
RobotExecute.Start(); //开启机器人任务调度
TsNow = DateTime.Now - DtStart;
check3 = TsNow.TotalMilliseconds;
//解除暂停
foreach (var stationCode in basketStatus.StationCodes)
{
Global.ClearPauseState(stationCode);
Global.ClearAbortState(stationCode);
}
workflowTask = new WorkflowTask();
SetWorkflowStatus();
//登记开始加工日志
SysLogEntity sle = new SysLogEntity();
sle.LogType = (int)LogType.FlowStart;
sle.LogStatus = (int)LogStatus.Start;
sle.Basket = Basket;
sle.BatchNo = BatchNo;
sle.ProductId = ProductId;
sle.WorkflowId = basketStatus.WorkflowId;
sle.FlowId = basketStatus.FlowId;
sle.LogCode = basketStatus.SelectedSlotFlow.FlowCode;
sle.LogName = basketStatus.SelectedSlotFlow.FlowName;
sle.Pieces = basketStatus.SlotStatues.Count(q =>
q.Status == ExecuteStatusEnum.Done && q.SlotStepStatues.Count > 0);
sle.LogDetail = string.Format("花篮:{0}开始加工", Basket);
sle.StartTime = DateTime.Now;
sle.CreateBy = Global.CurrentUser.UserName;
SysLogDA.Save(sle);
basketStatus.Canceling = false;
DebugLog.WriteLog("execute main task");
if (!StopClicked && !TerminateClicked)
{
Helpering.IsRunning = true; //同步运行状态
if (Basket == Constant.Basket1)
{
Helpering.RunningSizeA = SelectedMapSize.ComboCode;
}
else
{
Helpering.RunningSizeB = SelectedMapSize.ComboCode;
}
//清空告警信息
if (basketStatus.StationCode == Constant.BasketCode1)
{
Global.AllowBasketABeep = false;
}
else
{
Global.AllowBasketBBeep = false;
}
// workflowTask.Prepare(basketStatus);
TsNow = DateTime.Now - DtStart;
check4 = TsNow.TotalMilliseconds;
basketStatus.HardExecuteEntity.Status = 1;
HardExecuteDA.Update(basketStatus.HardExecuteEntity);
//作业任务
workflowTask.Execute(cancellationTokenSource, basketStatus);
}
StopClicked = false;
TerminateClicked = false;
ProgressEnabled = true;
SetRunning(!ProgressEnabled);
NoticeBack(basketStatus);
//timer.Stop();
if (cancellationTokenSource.IsCancellationRequested)
{
Message = "手工终止!";
FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
IsFinisingState = false;
basketStatus.HardExecuteEntity.Status = 3;
}
else
{
SetWoringEndState();
}
HardExecuteDA.Update(basketStatus.HardExecuteEntity);
UpdateWorkingLog();
workflowTask = null;
}
catch (Exception ex)
{
Log.Info($"flow task error{ex}");
workflowTask = null;
if (!cancellationTokenSource.IsCancellationRequested) //等待取片
{
ProgressEnabled = true;
SetRunning(!ProgressEnabled);
}
Message = ex.Message;
FlowerWorkStatusEnum = FlowerWorkStatusEnum.None;
IsFinisingState = false;
NoticeBack(basketStatus);
}
Task.Run((() => RobotExecute.RemoveUnUseTask(Basket)));
Log.Info("flow task finished");
}, cancellationTokenSource.Token, TaskCreationOptions.LongRunning);
flowTask.Start();
}
});
t.Name = $"BasketWorkingThread:{GloBusiness.CreateRandom()}";
t.Start();
}
我是在这个方法里这里//异常后人工处理
WorkChooseScanningAnomalyViewModule lvm = new WorkChooseScanningAnomalyViewModule();
lvm.ShowDialog(scanValue);
scanValue = Global.ScanningValue;调用的,出现刚才的错误,怎么修改
最新发布