From 6428fad15dbe79e30a48ffc9aabe31e03a45426c Mon Sep 17 00:00:00 2001 From: patrick <patrick.xu@broconcentric.com> Date: 星期四, 05 十二月 2019 12:50:13 +0800 Subject: [PATCH] 1. 添加部分log信息 2. 修改部分机器人动作流程 3. 开放OperationConfig的InputData参数 --- src/A032.Process/ProcessControl_Method.cs | 751 +++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 509 insertions(+), 242 deletions(-) diff --git a/src/A032.Process/ProcessControl_Method.cs b/src/A032.Process/ProcessControl_Method.cs index 61fb662..dc0d8c8 100644 --- a/src/A032.Process/ProcessControl_Method.cs +++ b/src/A032.Process/ProcessControl_Method.cs @@ -8,6 +8,7 @@ using HalconDotNet; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Drawing; using System.IO; using System.Linq; @@ -19,9 +20,54 @@ { public partial class ProcessControl { + const int WAITTIME = 5000; + Dictionary<int, int> machineFullTrayDict = new Dictionary<int, int>(); Dictionary<int, int> machineEmptyTrayDict = new Dictionary<int, int>(); List<TaskAssignInfo> taskAssignedList = new List<TaskAssignInfo>(); + + #region AGV浜嬩欢 + private void OnAGVBatteryLvlChanged(SeerAGVDriver agv, float preBatteryLvl, float batteryLvl) + { + var bind = Config.AGVBindCollection.FirstOrDefault(u => u.AGVId == agv.Id); + SeerAGVInitialConfig iConfig = agv.InitialConfig as SeerAGVInitialConfig; + if (batteryLvl <= iConfig.BatteryLvlToCharge && preBatteryLvl > iConfig.BatteryLvlToCharge) + { + Task.Run(() => + { + var position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.Charge); + + if (position == null) + { + throw new ProcessException("鏈壘鍒板厖鐢靛湴鐐�"); + } + + while (bind.UnitStatus != TaskStatus.Available) + { + if (bind.SetAGVStatus(TaskStatus.Running)) + { + bind.AGV.TaskOrder(position.PositionCode); + break; + } + + Thread.Sleep(WAITTIME); + } + }); + + return; + } + + if (batteryLvl >= iConfig.BatteryLvlChargeDone && preBatteryLvl < iConfig.BatteryLvlChargeDone) + { + var position = Config.PositionCollection.FirstOrDefault(u => u.PositionCode == agv.CurrentPosition); + + if (position != null && position.Description == PathPositionDefinition.Charge) + { + bind.SetAGVStatus(TaskStatus.Available); + } + return; + } + } private void OnAGVTaskStatusChanged(SeerAGVDriver agv, AGVTaskStatus taskStatus) { @@ -41,7 +87,7 @@ // bind.RobotStatus = TaskStatus.Running; //} - bind.AGVStatus = TaskStatus.Available; + bind.SetAGVStatus(TaskStatus.Available); } } @@ -63,9 +109,34 @@ // bind.RobotStatus = TaskStatus.Running; //} - bind.AGVStatus = TaskStatus.Available; + bind.SetAGVStatus(TaskStatus.Available); + LogAsync(DateTime.Now, $"AGV鍒颁綅{positionCode}", ""); + + PathPosition position = Config.PositionCollection.FirstOrDefault(p => p.PositionCode == bind.AGVDest); + switch (position.Description) + { + case PathPositionDefinition.LoadEmptyTray: + LogAsync(DateTime.Now, $"AGV瀹屾垚锛屽噯澶囦笂绌篢ray", ""); + Robot_LoadEmptyTray(bind.Id, position); + break; + case PathPositionDefinition.LoadFullTray: + LogAsync(DateTime.Now, $"AGV瀹屾垚锛屽噯澶囦笂婊ray", ""); + Robot_LoadFullTraySnap(bind.Id, position); + break; + case PathPositionDefinition.UnloadEmptyTray: + LogAsync(DateTime.Now, $"AGV瀹屾垚锛屽噯澶囦笅绌篢ray", ""); + Robot_UnloadEmptyTraySnap(bind.Id, position); + break; + case PathPositionDefinition.UnloadFullTray: + LogAsync(DateTime.Now, $"AGV瀹屾垚锛屽噯澶囦笅婊ray", ""); + Robot_UnloadFullTraySnap(bind.Id, position); + break; + default: + break; + } } } + #endregion private void OnRobotMsgReceived(DateTime dt, AuboRobotDriver robot, RobotMsg msg) { @@ -78,7 +149,7 @@ throw new ProcessException("鏈兘鏍规嵁鏈哄櫒浜轰俊鎭幏鍙栫粦瀹氳澶囦俊鎭�", null); } - List<AGVTaskModel> models = new List<AGVTaskModel>(); + //List<AGVTaskModel> models = new List<AGVTaskModel>(); switch (msg.Action) { @@ -123,13 +194,20 @@ if (machineEmptyTrayDict[msg.Para2] < Config.Machine_EmptyTrayNum) { - bind.RobotIOHandle.Reset(); - bind.RobotIOHandle.WaitOne(); + //bind.RobotIOHandle.Reset(); + //bind.RobotIOHandle.WaitOne(); + bind.Robot.MonitorHandle.WaitOne(); + //bind.Robot.IOChangedHandle.WaitOne(); + Thread.Sleep((bind.Robot.InitialConfig as AuboRobotInitialConfig).ScanInterval); if (!bind.IsFullTrayFull) { RobotMsg_UnloadEmptyTray.Para2 = msg.Para2; robot.SendMsg(RobotMsg_UnloadEmptyTray, true); + } + else + { + bind.RobotStatus = TaskStatus.Available; } } else @@ -142,12 +220,19 @@ { bind.CurrentFullTray = int.Parse(msg.Datas[1]); - bind.RobotIOHandle.Reset(); - bind.RobotIOHandle.WaitOne(); + //bind.RobotIOHandle.Reset(); + //bind.RobotIOHandle.WaitOne(); + bind.Robot.MonitorHandle.WaitOne(); + //bind.Robot.IOChangedHandle.WaitOne(); + Thread.Sleep((bind.Robot.InitialConfig as AuboRobotInitialConfig).ScanInterval); if (!bind.IsFullTrayEmpty) { Camera_UnloadFullTray(robot.Id, msg.Para2); + } + else + { + bind.RobotStatus = TaskStatus.Available; } } break; @@ -187,29 +272,34 @@ break; case RobotMsgAction.Calibration: { + _calibReply.CalibIndex = int.Parse(msg.Datas[4]); + _calibReply.CalibPositionNo = msg.Para2; + _calibReply.RobotPosition = new CustomizedPoint(float.Parse(msg.Datas[0]), float.Parse(msg.Datas[1])); + _calibReply.CalibHandle.Set(); } break; case RobotMsgAction.StandardPoint: { - + _calibReply.CalibPositionNo = msg.Para2; + _calibReply.CalibHandle.Set(); } break; default: break; } - if (models.Count > 0) - { - models.ForEach(model => - { - if (!bind.TaskList.Any(t => t.MethodFunc.Method.Name == model.MethodFunc.Method.Name)) - { - model.OpConfig = new AGVBindOpConfig(bind.Id); - bind.TaskList.Add(model); - } - }); - } + //if (models.Count > 0) + //{ + // models.ForEach(model => + // { + // if (!bind.TaskList.Any(t => t.MethodName == model.MethodName)) + // { + // model.OpConfig = new AGVBindOpConfig(bind.Id); + // bind.AddTask(model); + // } + // }); + //} } public void QueryRobotIO() @@ -220,39 +310,40 @@ }); } - private void OnBindUnitTaskInvoke(AGVBindUnit bind) - { - var task = bind.TaskList[0]; - var response = task.MethodFunc.Invoke(task.OpConfig, task.Device); - } + //private void OnBindUnitTaskInvoke(AGVTaskModel task) + //{ + // InvokeMethodDict[task.MethodName].Invoke(this, new object[] { task.OpConfig, task.Device }); + + // //var response = task.MethodFunc.Invoke(task.OpConfig, task.Device); + //} #region Robot鐩戝惉浜嬩欢 - private void AddNewTaskToBind(string robotId, List<AGVTaskModel> models) - { - var bind = Config.AGVBindCollection.FirstOrDefault(u => u.RobotId == robotId); + //private void AddNewTaskToBind(string robotId, List<AGVTaskModel> models) + //{ + // var bind = Config.AGVBindCollection.FirstOrDefault(u => u.RobotId == robotId); - if (bind == null) - { - throw new ProcessException("鏈兘鏍规嵁鏈哄櫒浜轰俊鎭幏鍙栫粦瀹氳澶囦俊鎭�", null); - } + // if (bind == null) + // { + // throw new ProcessException("鏈兘鏍规嵁鏈哄櫒浜轰俊鎭幏鍙栫粦瀹氳澶囦俊鎭�", null); + // } - AddNewTaskToBind(bind, models); - } + // AddNewTaskToBind(bind, models); + //} - private void AddNewTaskToBind(AGVBindUnit bind, List<AGVTaskModel> models) - { - if (models.Count > 0) - { - models.ForEach(model => - { - if (!bind.TaskList.Any(t => t.MethodFunc.Method.Name == model.MethodFunc.Method.Name)) - { - model.OpConfig = new AGVBindOpConfig(bind.Id); - bind.TaskList.Add(model); - } - }); - } - } + //private void AddNewTaskToBind(AGVBindUnit bind, List<AGVTaskModel> models) + //{ + // if (models.Count > 0) + // { + // models.ForEach(model => + // { + // if (!bind.TaskList.Any(t => t.MethodName == model.MethodName)) + // { + // model.OpConfig = new AGVBindOpConfig(bind.Id); + // bind.AddTask(model); + // } + // }); + // } + //} [ProcessMethod("", "Robot_Monitor_Alarm", "鏈哄櫒浜虹洃鍚簨浠�-鎶ヨ", true)] public ProcessResponse Robot_Monitor_Alarm(IOperationConfig config, IDevice device) @@ -273,7 +364,7 @@ [ProcessMethod("", "Robot_Monitor_EmptyTrayEmpty", "鏈哄櫒浜虹洃鍚簨浠�-绌篢ray鍖哄煙娓呯┖", true)] public ProcessResponse Robot_Monitor_EmptyTrayEmpty(IOperationConfig config, IDevice device) { - bool isEmptyTrayEmpty = config.InputPara[0] == 1; + bool isEmptyTrayEmpty = config.InputPara[0] == 0; var bind = Config.AGVBindCollection.FirstOrDefault(u => u.RobotId == device.Id); if (isEmptyTrayEmpty) { @@ -281,36 +372,43 @@ Task.Run(() => { - Func<IOperationConfig, IDevice, ProcessResponse> action = AGV_LoadEmptyTray; - while (bind.IsEmptyTrayEmpty && bind.TaskList.Count == 0 && !bind.TaskList.Any(u => u.MethodFunc.Method.Name == action.Method.Name)) + //Func<IOperationConfig, IDevice, ProcessResponse> action = AGV_LoadEmptyTray; + while (bind.IsEmptyTrayEmpty && !bind.IsEmptyTrayTaskAssigned) { - if (bind.TaskList.Count == 0) + //if (bind.TaskList.Count == 0) + if (bind.UnitStatus == TaskStatus.Available) { - List<AGVTaskModel> models = new List<AGVTaskModel>(); - models.Add(new AGVTaskModel(TaskAvailableLevel.Both, AGV_LoadEmptyTray)); - models.Add(new AGVTaskModel(TaskAvailableLevel.AGV, AfterEmptyTrayPositionArrived)); + //List<AGVTaskModel> models = new List<AGVTaskModel>(); + //models.Add(new AGVTaskModel(TaskAvailableLevel.Both, "AGV_LoadEmptyTray")); + //models.Add(new AGVTaskModel(TaskAvailableLevel.AGV, "AfterEmptyTrayPositionArrived")); - AddNewTaskToBind(device.Id, models); + //AddNewTaskToBind(device.Id, models); + + if (AGV_LoadEmptyTray(bind.Id)) + { + bind.IsEmptyTrayTaskAssigned = true; + } } else { - Thread.Sleep(500); + Thread.Sleep(WAITTIME); } } }); - } else { bind.IsEmptyTrayEmpty = false; + bind.IsEmptyTrayTaskAssigned = false; } return new ProcessResponse(true); } - [ProcessMethod("", "Robot_Monitor_EmptyTrayEmpty", "鏈哄櫒浜虹洃鍚簨浠�-婊ray鍖哄煙鏀炬弧", true)] + [ProcessMethod("", "Robot_Monitor_FullTrayFull", "鏈哄櫒浜虹洃鍚簨浠�-婊ray鍖哄煙鏀炬弧", true)] public ProcessResponse Robot_Monitor_FullTrayFull(IOperationConfig config, IDevice device) { + //(device as AuboRobotDriver).IOChangedHandle.Reset(); bool isFullTrayFull = config.InputPara[0] == 1; var bind = Config.AGVBindCollection.FirstOrDefault(u => u.RobotId == device.Id); if (isFullTrayFull) @@ -319,20 +417,26 @@ Task.Run(() => { - Func<IOperationConfig, IDevice, ProcessResponse> action = AGV_UnloadFullTray; - while (bind.IsFullTrayFull && !bind.TaskList.Any(u => u.MethodFunc.Method.Name == action.Method.Name)) + //Func<IOperationConfig, IDevice, ProcessResponse> action = AGV_UnloadFullTray; + while (bind.IsFullTrayFull && !bind.IsFullTrayTaskAssigned) { - if (bind.TaskList.Count == 0) + //if (bind.TaskList.Count == 0) + if (bind.UnitStatus == TaskStatus.Available) { - List<AGVTaskModel> models = new List<AGVTaskModel>(); - models.Add(new AGVTaskModel(TaskAvailableLevel.Both, AGV_UnloadFullTray)); - models.Add(new AGVTaskModel(TaskAvailableLevel.AGV, Robot_UnloadFullTray)); + //List<AGVTaskModel> models = new List<AGVTaskModel>(); + //models.Add(new AGVTaskModel(TaskAvailableLevel.Both, "AGV_UnloadFullTray")); + //models.Add(new AGVTaskModel(TaskAvailableLevel.AGV, "Robot_UnloadFullTray")); - AddNewTaskToBind(device.Id, models); + //AddNewTaskToBind(device.Id, models); + + if (AGV_UnloadFullTray(bind.Id)) + { + bind.IsFullTrayTaskAssigned = true; + } } else { - Thread.Sleep(500); + Thread.Sleep(WAITTIME); } } }); @@ -340,9 +444,12 @@ else { bind.IsFullTrayFull = false; + bind.IsFullTrayTaskAssigned = false; } - bind.RobotIOHandle.Set(); + //(device as AuboRobotDriver).IOChangedHandle.Set(); + + //bind.RobotIOHandle.Set(); return new ProcessResponse(true); } @@ -350,11 +457,13 @@ [ProcessMethod("", "Robot_Monitor_FullTrayEmpty", "鏈哄櫒浜虹洃鍚簨浠�-婊ray鍖哄煙娓呯┖", true)] public ProcessResponse Robot_Monitor_FullTrayEmpty(IOperationConfig config, IDevice device) { - bool isFullTrayEmpty = config.InputPara[0] == 1; + //(device as AuboRobotDriver).IOChangedHandle.Reset(); + bool isFullTrayEmpty = config.InputPara[0] == 0; var bind = Config.AGVBindCollection.FirstOrDefault(u => u.RobotId == device.Id); bind.IsFullTrayEmpty = isFullTrayEmpty; - bind.RobotIOHandle.Set(); + //(device as AuboRobotDriver).IOChangedHandle.Set(); + //bind.RobotIOHandle.Set(); return new ProcessResponse(true); } @@ -399,7 +508,7 @@ taskAssignedList.RemoveAll(u => u.AgvId == device.Id); - bind.TaskList.Clear(); + //bind.ClearTask(); bind.RobotStatus = bind.AGVStatus = TaskStatus.Available; return new ProcessResponse(true); @@ -407,10 +516,28 @@ #endregion #region 绌篢ray涓婃枡 - [ProcessMethod("", "AGV_LoadEmptyTray", "AGV鍘诲線绌篢ray涓婃枡", true)] - public ProcessResponse AGV_LoadEmptyTray(IOperationConfig config, IDevice device) + //[ProcessMethod("", "AGV_LoadEmptyTray", "AGV鍘诲線绌篢ray涓婃枡", true)] + //public ProcessResponse AGV_LoadEmptyTray(IOperationConfig config, IDevice device) + //{ + // var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); + // PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.LoadEmptyTray); + + // if (position == null) + // { + // throw new ProcessException("璺緞閰嶇疆鏈缃┖Tray涓婃枡鐐�"); + // } + + // bind.AGVDest = position.PositionCode; + // bind.AGV.TaskOrder(position.PositionCode); + + // bind.AGVStatus = TaskStatus.Running; + + // return new ProcessResponse(true); + //} + + public bool AGV_LoadEmptyTray(string bindId) { - var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); + var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId); PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.LoadEmptyTray); if (position == null) @@ -418,19 +545,45 @@ throw new ProcessException("璺緞閰嶇疆鏈缃┖Tray涓婃枡鐐�"); } - bind.AGVDest = position.PositionCode; - bind.AGV.TaskOrder(position.PositionCode); + if (bind.SetAGVStatus(TaskStatus.Running)) + { + bind.AGVDest = position.PositionCode; + bind.AGV.TaskOrder(position.PositionCode); - bind.AGVStatus = TaskStatus.Running; - - return new ProcessResponse(true); + return true; + } + else + { + return false; + } } - [ProcessMethod("", "AfterEmptyTrayPositionArrived", "鍒拌揪绌篢ray涓婃枡鐐�", true)] - public ProcessResponse AfterEmptyTrayPositionArrived(IOperationConfig config, IDevice device) + //[ProcessMethod("", "AfterEmptyTrayPositionArrived", "鍒拌揪绌篢ray涓婃枡鐐�", true)] + //public ProcessResponse AfterEmptyTrayPositionArrived(IOperationConfig config, IDevice device) + //{ + // var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); + // PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.LoadEmptyTray); + + // if (position == null) + // { + // throw new ProcessException("璺緞閰嶇疆鏈缃┖Tray涓婃枡鐐�", null); + // } + + // if (bind.AGV.CurrentPosition != position.PositionCode) + // { + // throw new ProcessException("AGV灏氭湭鍒拌揪绌篢ray涓婃枡鐐�", null); + // } + + // bind.Robot.SendMsg(RobotMsgAction.Load, RobotMsgParas.EmptyTray, 0); + // bind.RobotStatus = TaskStatus.Running; + + // return new ProcessResponse(true); + //} + + public void Robot_LoadEmptyTray(string bindId, PathPosition position) { - var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); - PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.LoadEmptyTray); + var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId); + //PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.LoadEmptyTray); if (position == null) { @@ -444,8 +597,6 @@ bind.Robot.SendMsg(RobotMsgAction.Load, RobotMsgParas.EmptyTray, 0); bind.RobotStatus = TaskStatus.Running; - - return new ProcessResponse(true); } //[ProcessMethod("", "EmptyTrayReady", "绌篢ray涓婃枡瀹屾垚", true)] @@ -489,13 +640,13 @@ }); } - CheckEmptyTrayTask(position.PositionNo); + CheckUnloadEmptyTrayTask(position.PositionNo); } return new ProcessResponse(true); } - private async void CheckEmptyTrayTask(int positionNo) + private async void CheckUnloadEmptyTrayTask(int positionNo) { await Task.Run(() => { @@ -506,55 +657,61 @@ while (taskStatus.IsTaskNeed && !taskStatus.IsTaskAssgined) { - Func<IOperationConfig, IDevice, ProcessResponse> action = AGV_UnloadEmptyTray; + //Func<IOperationConfig, IDevice, ProcessResponse> action = AGV_UnloadEmptyTray; - //if (!Config.AGVBindCollection.Any(b => b.TaskList.Any(t => t.MethodFunc.Method.Name == action.Method.Name))) + //if (!Config.AGVBindCollection.Any(b => b.TaskList.Any(t => t.MethodName == "AGV_UnloadEmptyTray"))) { var bind = Config.AGVBindCollection.FirstOrDefault(u => u.UnitStatus == TaskStatus.Available); if (bind != null) { var position = Config.PositionCollection.FirstOrDefault(u => u.PositionNo == positionNo); - AGVTaskModel model_AGV = new AGVTaskModel(TaskAvailableLevel.Both, action, new AGVBindOpConfig(bind.Id, position)); - AGVTaskModel model_Robot = new AGVTaskModel(TaskAvailableLevel.AGV, Robot_UnloadEmptyTray, new AGVBindOpConfig(bind.Id)); + //AGVTaskModel model_AGV = new AGVTaskModel(TaskAvailableLevel.Both, "AGV_UnloadEmptyTray", new AGVBindOpConfig(bind.Id, position)); + //AGVTaskModel model_Robot = new AGVTaskModel(TaskAvailableLevel.AGV, "Robot_UnloadEmptyTray", new AGVBindOpConfig(bind.Id)); - bind.TaskList.Add(model_AGV); - bind.TaskList.Add(model_Robot); + //bind.AddTask(model_AGV); + //bind.AddTask(model_Robot); - taskStatus.IsTaskAssgined = true; - taskStatus.AgvId = bind.AGVId; + if (AGV_UnloadEmptyTray(bind.Id, position)) + { + taskStatus.IsTaskAssgined = true; + taskStatus.AgvId = bind.AGVId; + } } } - Thread.Sleep(300); + Thread.Sleep(WAITTIME); } }); } //[ProcessMethod("", "AGV_UnloadEmptyTray", "AGV鍘诲線鍗歌浇绌篢ray鏂欎綅缃�", true)] - public ProcessResponse AGV_UnloadEmptyTray(IOperationConfig config, IDevice device) + public bool AGV_UnloadEmptyTray(string bindId, PathPosition position) { - var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); - - PathPosition position = (config as AGVBindOpConfig).Position; + var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId); if (position == null) { throw new ProcessException("璺緞閰嶇疆鏈缃┖Tray涓嬫枡鐐�"); } - bind.AGVDest = position.PositionCode; - bind.AGV.TaskOrder(position.PositionCode); + if (bind.SetAGVStatus(TaskStatus.Running)) + { + bind.AGVDest = position.PositionCode; + bind.AGV.TaskOrder(position.PositionCode); - bind.AGVStatus = TaskStatus.Running; - - return new ProcessResponse(true); + return true; + } + else + { + return false; + } } //[ProcessMethod("", "Robot_UnloadEmptyTray", "鏈哄櫒浜鸿繍鍔ㄨ嚦绌篢ray鎷嶇収浣嶇疆", true)] - public ProcessResponse Robot_UnloadEmptyTray(IOperationConfig config, IDevice device) + public void Robot_UnloadEmptyTraySnap(string bindId, PathPosition position) { - var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); - PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.UnloadEmptyTray && u.PositionCode == bind.AGV.CurrentPosition); + var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId); + //PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.UnloadEmptyTray && u.PositionCode == bind.AGV.CurrentPosition); if (position == null) { @@ -565,8 +722,6 @@ bind.RobotStatus = TaskStatus.Running; bind.Robot.SendMsg(RobotMsgAction.Move, RobotMsgParas.UnloadEmptyTraySnap, position.PositionNo); - - return new ProcessResponse(true); } //[ProcessMethod("", "Camera_UnloadEmptyTray", "鐩告満纭绌篢ray鍗歌浇鏈哄櫒浜轰綅缃皟鏁�", true)] @@ -645,49 +800,60 @@ throw new ProcessException("AGV褰撳墠鏈浜庣┖Tray涓嬫枡鐐�"); } - PositionVisionConfig visionConfig = Config.VisionConfigCollection.FirstOrDefault(u => u.PositionCode == position.PositionCode && u.CameraId == bind.CameraId); + float adjust_X = 0.0f; + float adjust_Y = 0.0f; + float adjust_Angle = 0.0f; - if (visionConfig == null) + if (Config.IsEnableVisionGuide) { - throw new ProcessException("鏈厤缃鐩告満鐨勭┖Tray涓嬫枡鐐圭殑瑙嗚鎿嶄綔閰嶇疆"); - } + PositionVisionConfig visionConfig = Config.VisionConfigCollection.FirstOrDefault(u => u.PositionCode == position.PositionCode && u.CameraId == bind.CameraId); - float x = 0; - float y = 0; - float angle = 0; - - using (HObject hImage = CollectHImage(bind.Camera, visionConfig.CameraOpConfig, "Camera_UnloadEmptyTray")) - { - string toolPath = visionConfig.CameraOpConfig.AlgorithemPath; - if (!_halconToolDict.ContainsKey(toolPath)) + if (visionConfig == null) { - throw new ProcessException($"鏈厤缃瓹amera_UnloadEmptyTray鐨勮瑙夌畻娉曡矾寰�"); + throw new ProcessException("鏈厤缃鐩告満鐨勭┖Tray涓嬫枡鐐圭殑瑙嗚鎿嶄綔閰嶇疆"); } - var tool = _halconToolDict[toolPath]; - tool.SetDictionary(new Dictionary<string, HTuple>() { { "OUTPUT_X", new HTuple() }, { "OUTPUT_Y", new HTuple() }, { "OUTPUT_Angle", new HTuple() } }, new Dictionary<string, HObject>() { { "INPUT_Image", hImage } }); - tool.RunProcedure(); + float x = 0; + float y = 0; + float angle = 0; - x = (float)tool.GetResultTuple("OUTPUT_X").D; - y = (float)tool.GetResultTuple("OUTPUT_Y").D; - angle = (float)tool.GetResultTuple("OUTPUT_Angle").D; + using (HObject hImage = CollectHImage(bind.Camera, visionConfig.CameraOpConfig, "Camera_UnloadEmptyTray")) + { + string toolPath = visionConfig.CameraOpConfig.AlgorithemPath; + if (!_halconToolDict.ContainsKey(toolPath)) + { + throw new ProcessException($"鏈厤缃瓹amera_UnloadEmptyTray鐨勮瑙夌畻娉曡矾寰�"); + } + + var tool = _halconToolDict[toolPath]; + tool.SetDictionary(new Dictionary<string, HTuple>() { { "OUTPUT_X", new HTuple() }, { "OUTPUT_Y", new HTuple() }, { "OUTPUT_Angle", new HTuple() } }, new Dictionary<string, HObject>() { { "INPUT_Image", hImage } }); + tool.RunProcedure(); + + x = (float)tool.GetResultTuple("OUTPUT_X").D; + y = (float)tool.GetResultTuple("OUTPUT_Y").D; + angle = (float)tool.GetResultTuple("OUTPUT_Angle").D; + } + + if (x <= 0 || y <= 0) + { + throw new ProcessException("Camera_UnloadEmptyTray瑙嗚璁$畻鑾峰彇鐐逛綅涓嶅彲灏忎簬0"); + } + + float dx = visionConfig.StandardPoint.X - x; + float dy = visionConfig.StandardPoint.Y - y; + + HOperatorSet.AffineTransPoint2d(new HTuple(visionConfig.Matrix[0], visionConfig.Matrix[1], 0, visionConfig.Matrix[3], visionConfig.Matrix[4], 0), dx, dy, out HTuple dx_Robot, out HTuple dy_Robot); + + adjust_X = (float)dx_Robot.D; + adjust_Y = (float)dy_Robot.D; + adjust_Angle = visionConfig.StandardPoint.Angle - angle; } - - if (x <= 0 || y <= 0) - { - throw new ProcessException("Camera_UnloadEmptyTray瑙嗚璁$畻鑾峰彇鐐逛綅涓嶅彲灏忎簬0"); - } - - float dx = visionConfig.StandardPoint.X - x; - float dy = visionConfig.StandardPoint.Y - y; - - HOperatorSet.AffineTransPoint2d(new HTuple(visionConfig.Matrix[0], visionConfig.Matrix[1], 0, visionConfig.Matrix[3], visionConfig.Matrix[4], 0), dx, dy, out HTuple dx_Robot, out HTuple dy_Robot); //bind.Robot.SendMsg(RobotMsgAction.Unload, RobotMsgParas.EmptyTray, position.PositionNo, new List<float>() { (float)dx_Robot.D, (float)dy_Robot.D, angle }); RobotMsg_UnloadEmptyTray.Action = RobotMsgAction.Unload; RobotMsg_UnloadEmptyTray.Para1 = RobotMsgParas.EmptyTray; RobotMsg_UnloadEmptyTray.Para2 = position.PositionNo; - RobotMsg_UnloadEmptyTray.Datas = new List<float>() { (float)dx_Robot.D, (float)dy_Robot.D, angle }.ConvertAll(s => s.ToString()).ToList(); + RobotMsg_UnloadEmptyTray.Datas = new List<float>() { adjust_X, adjust_Y, 0, adjust_Angle }.ConvertAll(s => s.ToString()).ToList(); bind.Robot.SendMsg(RobotMsg_UnloadEmptyTray, true); return new ProcessResponse(true); @@ -741,7 +907,7 @@ while (taskStatus.IsTaskNeed && !taskStatus.IsTaskAssgined) { - Func<IOperationConfig, IDevice, ProcessResponse> action = AGV_LoadFullTray; + //Func<IOperationConfig, IDevice, ProcessResponse> action = AGV_LoadFullTray; //if (!Config.AGVBindCollection.Any(b => b.TaskList.Any(t => t.MethodFunc.Method.Name == action.Method.Name))) { @@ -749,14 +915,17 @@ if (bind != null) { var position = Config.PositionCollection.FirstOrDefault(u => u.PositionNo == positionNo); - AGVTaskModel model_AGV = new AGVTaskModel(TaskAvailableLevel.Both, action, new AGVBindOpConfig(bind.Id, position)); - AGVTaskModel model_Robot = new AGVTaskModel(TaskAvailableLevel.AGV, Robot_LoadFullTray, new AGVBindOpConfig(bind.Id)); + //AGVTaskModel model_AGV = new AGVTaskModel(TaskAvailableLevel.Both, "AGV_LoadFullTray", new AGVBindOpConfig(bind.Id, position)); + //AGVTaskModel model_Robot = new AGVTaskModel(TaskAvailableLevel.AGV, "Robot_LoadFullTray", new AGVBindOpConfig(bind.Id)); - bind.TaskList.Add(model_AGV); - bind.TaskList.Add(model_Robot); + //bind.AddTask(model_AGV); + //bind.AddTask(model_Robot); - taskStatus.IsTaskAssgined = true; - taskStatus.AgvId = bind.AGVId; + if (AGV_LoadFullTray(bind.Id, position)) + { + taskStatus.IsTaskAssgined = true; + taskStatus.AgvId = bind.AGVId; + } } } @@ -765,31 +934,59 @@ }); } - [ProcessMethod("", "AGV_LoadFullTray", "AGV鍘诲線婊ray涓婃枡浣嶇疆", true)] - public ProcessResponse AGV_LoadFullTray(IOperationConfig config, IDevice device) + //[ProcessMethod("", "AGV_LoadFullTray", "AGV鍘诲線婊ray涓婃枡浣嶇疆", true)] + public bool AGV_LoadFullTray(string bindId, PathPosition position) { - var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); + var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId); - PathPosition position = (config as AGVBindOpConfig).Position; + //PathPosition position = (config as AGVBindOpConfig).Position; if (position == null) { throw new ProcessException("璺緞閰嶇疆鏈缃弧Tray涓婃枡鐐�"); } - bind.AGVDest = position.PositionCode; - bind.AGV.TaskOrder(position.PositionCode); + if (bind.SetAGVStatus(TaskStatus.Running)) + { + bind.AGVDest = position.PositionCode; + bind.AGV.TaskOrder(position.PositionCode); - bind.AGVStatus = TaskStatus.Running; + return true; + } + else + { + return false; + } - return new ProcessResponse(true); + //return new ProcessResponse(true); } - [ProcessMethod("", "Robot_LoadFullTray", "鏈哄櫒浜鸿繍鍔ㄨ嚦婊ray鎷嶇収浣嶇疆", true)] - public ProcessResponse Robot_LoadFullTray(IOperationConfig config, IDevice device) + //[ProcessMethod("", "Robot_LoadFullTray", "鏈哄櫒浜鸿繍鍔ㄨ嚦婊ray鎷嶇収浣嶇疆", true)] + //public ProcessResponse Robot_LoadFullTray(IOperationConfig config, IDevice device) + //{ + // var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); + // PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.LoadFullTray && u.PositionCode == bind.AGV.CurrentPosition); + + // if (position == null) + // { + // throw new ProcessException("璺緞閰嶇疆鏈缃弧Tray涓婃枡鐐�"); + // } + + // //if (bind.AGV.CurrentPosition != position.PositionCode) + // //{ + // // throw new ProcessException("AGV褰撳墠鏈浜庢弧Tray涓婃枡鐐�"); + // //} + + // bind.RobotStatus = TaskStatus.Running; + // bind.Robot.SendMsg(RobotMsgAction.Move, RobotMsgParas.LoadFullTraySnap, position.PositionNo); + + // return new ProcessResponse(true); + //} + + public void Robot_LoadFullTraySnap(string bindId, PathPosition position) { - var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); - PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.LoadFullTray && u.PositionCode == bind.AGV.CurrentPosition); + var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId); + //PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.LoadFullTray && u.PositionCode == bind.AGV.CurrentPosition); if (position == null) { @@ -803,8 +1000,6 @@ bind.RobotStatus = TaskStatus.Running; bind.Robot.SendMsg(RobotMsgAction.Move, RobotMsgParas.LoadFullTraySnap, position.PositionNo); - - return new ProcessResponse(true); } //[ProcessMethod("", "Camera_LoadFullTray", "鐩告満纭婊ray涓婃枡鏈哄櫒浜轰綅缃皟鏁�", true)] @@ -883,49 +1078,60 @@ throw new ProcessException("AGV褰撳墠鏈浜庢弧Tray涓婃枡鐐�"); } - PositionVisionConfig visionConfig = Config.VisionConfigCollection.FirstOrDefault(u => u.PositionCode == position.PositionCode && u.CameraId == bind.CameraId); + float adjust_X = 0.0f; + float adjust_Y = 0.0f; + float adjust_Angle = 0.0f; - if (visionConfig == null) + if (Config.IsEnableVisionGuide) { - throw new ProcessException("鏈厤缃鐩告満鐨勬弧Tray涓婃枡鐐圭殑瑙嗚鎿嶄綔閰嶇疆"); - } + PositionVisionConfig visionConfig = Config.VisionConfigCollection.FirstOrDefault(u => u.PositionCode == position.PositionCode && u.CameraId == bind.CameraId); - float x = 0; - float y = 0; - float angle = 0; - - using (HObject hImage = CollectHImage(bind.Camera, visionConfig.CameraOpConfig, "Camera_LoadFullTray")) - { - string toolPath = visionConfig.CameraOpConfig.AlgorithemPath; - if (!_halconToolDict.ContainsKey(toolPath)) + if (visionConfig == null) { - throw new ProcessException($"鏈厤缃瓹amera_LoadFullTray鐨勮瑙夌畻娉曡矾寰�"); + throw new ProcessException("鏈厤缃鐩告満鐨勬弧Tray涓婃枡鐐圭殑瑙嗚鎿嶄綔閰嶇疆"); } - var tool = _halconToolDict[toolPath]; - tool.SetDictionary(new Dictionary<string, HTuple>() { { "OUTPUT_X", new HTuple() }, { "OUTPUT_Y", new HTuple() }, { "OUTPUT_Angle", new HTuple() } }, new Dictionary<string, HObject>() { { "INPUT_Image", hImage } }); - tool.RunProcedure(); + float x = 0; + float y = 0; + float angle = 0; - x = (float)tool.GetResultTuple("OUTPUT_X").D; - y = (float)tool.GetResultTuple("OUTPUT_Y").D; - angle = (float)tool.GetResultTuple("OUTPUT_Angle").D; + using (HObject hImage = CollectHImage(bind.Camera, visionConfig.CameraOpConfig, "Camera_LoadFullTray")) + { + string toolPath = visionConfig.CameraOpConfig.AlgorithemPath; + if (!_halconToolDict.ContainsKey(toolPath)) + { + throw new ProcessException($"鏈厤缃瓹amera_LoadFullTray鐨勮瑙夌畻娉曡矾寰�"); + } + + var tool = _halconToolDict[toolPath]; + tool.SetDictionary(new Dictionary<string, HTuple>() { { "OUTPUT_X", new HTuple() }, { "OUTPUT_Y", new HTuple() }, { "OUTPUT_Angle", new HTuple() } }, new Dictionary<string, HObject>() { { "INPUT_Image", hImage } }); + tool.RunProcedure(); + + x = (float)tool.GetResultTuple("OUTPUT_X").D; + y = (float)tool.GetResultTuple("OUTPUT_Y").D; + angle = (float)tool.GetResultTuple("OUTPUT_Angle").D; + } + + if (x <= 0 || y <= 0) + { + throw new ProcessException("Camera_LoadFullTray瑙嗚璁$畻鑾峰彇鐐逛綅涓嶅彲灏忎簬0"); + } + + float dx = visionConfig.StandardPoint.X - x; + float dy = visionConfig.StandardPoint.Y - y; + + HOperatorSet.AffineTransPoint2d(new HTuple(visionConfig.Matrix[0], visionConfig.Matrix[1], 0, visionConfig.Matrix[3], visionConfig.Matrix[4], 0), dx, dy, out HTuple dx_Robot, out HTuple dy_Robot); + + adjust_X = (float)dx_Robot.D; + adjust_Y = (float)dy_Robot.D; + adjust_Angle = visionConfig.StandardPoint.Angle - angle; } - - if (x <= 0 || y <= 0) - { - throw new ProcessException("Camera_LoadFullTray瑙嗚璁$畻鑾峰彇鐐逛綅涓嶅彲灏忎簬0"); - } - - float dx = visionConfig.StandardPoint.X - x; - float dy = visionConfig.StandardPoint.Y - y; - - HOperatorSet.AffineTransPoint2d(new HTuple(visionConfig.Matrix[0], visionConfig.Matrix[1], 0, visionConfig.Matrix[3], visionConfig.Matrix[4], 0), dx, dy, out HTuple dx_Robot, out HTuple dy_Robot); //bind.Robot.SendMsg(RobotMsgAction.Load, RobotMsgParas.FullTray, position.PositionNo, new List<float>() { (float)dx_Robot.D, (float)dy_Robot.D, angle }); RobotMsg_LoadFullTray.Action = RobotMsgAction.Load; RobotMsg_LoadFullTray.Para1 = RobotMsgParas.FullTray; RobotMsg_LoadFullTray.Para2 = position.PositionNo; - RobotMsg_LoadFullTray.Datas = new List<float>() { (float)dx_Robot.D, (float)dy_Robot.D, angle }.ConvertAll(s => s.ToString()).ToList(); + RobotMsg_LoadFullTray.Datas = new List<float>() { adjust_X, adjust_Y, 0, adjust_Angle }.ConvertAll(s => s.ToString()).ToList(); bind.Robot.SendMsg(RobotMsg_LoadFullTray, true); return new ProcessResponse(true); @@ -933,10 +1139,28 @@ #endregion #region 婊ray浜х嚎涓嬫枡 - [ProcessMethod("", "AGV_UnloadFullTray", "AGV鍘诲線鍗歌浇婊ray鏂�", true)] - public ProcessResponse AGV_UnloadFullTray(IOperationConfig config, IDevice device) + //[ProcessMethod("", "AGV_UnloadFullTray", "AGV鍘诲線鍗歌浇婊ray鏂�", true)] + //public ProcessResponse AGV_UnloadFullTray(IOperationConfig config, IDevice device) + //{ + // var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); + // PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.UnloadFullTray); + + // if (position == null) + // { + // throw new ProcessException("璺緞閰嶇疆鏈缃弧Tray涓嬫枡鐐�"); + // } + + // bind.AGVDest = position.PositionCode; + // bind.AGV.TaskOrder(position.PositionCode); + + // bind.AGVStatus = TaskStatus.Running; + + // return new ProcessResponse(true); + //} + + public bool AGV_UnloadFullTray(string bindId) { - var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); + var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId); PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.UnloadFullTray); if (position == null) @@ -944,19 +1168,45 @@ throw new ProcessException("璺緞閰嶇疆鏈缃弧Tray涓嬫枡鐐�"); } - bind.AGVDest = position.PositionCode; - bind.AGV.TaskOrder(position.PositionCode); + if (bind.SetAGVStatus(TaskStatus.Running)) + { + bind.AGVDest = position.PositionCode; + bind.AGV.TaskOrder(position.PositionCode); - bind.AGVStatus = TaskStatus.Running; - - return new ProcessResponse(true); + return true; + } + else + { + return false; + } } - [ProcessMethod("", "Robot_UnloadFullTray", "鏈哄櫒浜哄嵏杞芥弧Tray", true)] - public ProcessResponse Robot_UnloadFullTray(IOperationConfig config, IDevice device) + //[ProcessMethod("", "Robot_UnloadFullTray", "鏈哄櫒浜哄嵏杞芥弧Tray", true)] + //public ProcessResponse Robot_UnloadFullTray(IOperationConfig config, IDevice device) + //{ + // var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); + // PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.UnloadFullTray); + + // if (position == null) + // { + // throw new ProcessException("璺緞閰嶇疆鏈缃弧Tray涓嬫枡鐐�"); + // } + + // if (bind.AGV.CurrentPosition != position.PositionCode) + // { + // throw new ProcessException("AGV褰撳墠鏈浜庢弧Tray涓嬫枡鐐�"); + // } + + // bind.RobotStatus = TaskStatus.Running; + // bind.Robot.SendMsg(RobotMsgAction.Move, RobotMsgParas.LineSnap, position.PositionNo); + + // return new ProcessResponse(true); + //} + + public void Robot_UnloadFullTraySnap(string bindId, PathPosition position) { - var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == (config as AGVBindOpConfig).BindId); - PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.UnloadFullTray); + var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId); + //PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.UnloadFullTray); if (position == null) { @@ -970,8 +1220,7 @@ bind.RobotStatus = TaskStatus.Running; bind.Robot.SendMsg(RobotMsgAction.Move, RobotMsgParas.LineSnap, position.PositionNo); - - return new ProcessResponse(true); + //LogAsync(DateTime.Now, "Robot杩愬姩鑷充笅婊ray鎷嶇収", ""); } //[ProcessMethod("", "Camera_UnloadFullTray", "鐩告満鎿嶄綔鍗歌浇婊ray", true)] @@ -991,52 +1240,64 @@ throw new ProcessException("AGV褰撳墠鏈浜庢弧Tray涓嬫枡鐐�"); } - PositionVisionConfig visionConfig = Config.VisionConfigCollection.FirstOrDefault(u => u.PositionCode == position.PositionCode && u.CameraId == bind.CameraId); - - if (visionConfig == null) - { - throw new ProcessException("鏈厤缃鐩告満鐨勬弧Tray涓嬫枡鐐圭殑瑙嗚鎿嶄綔閰嶇疆"); - } - + //float adjust_X = 0.0f; + //float adjust_Y = 0.0f; + //float adjust_Angle = 0.0f; bool isLineReady = false; - int reTryTime = Config.LineBusyRetryTimes; - do + if (Config.IsEnableVisionGuide) { - using (HObject hImage = CollectHImage(bind.Camera, visionConfig.CameraOpConfig, "Camera_UnloadFullTray")) + PositionVisionConfig visionConfig = Config.VisionConfigCollection.FirstOrDefault(u => u.PositionCode == position.PositionCode && u.CameraId == bind.CameraId); + + if (visionConfig == null) { - string toolPath = visionConfig.CameraOpConfig.AlgorithemPath; - if (!_halconToolDict.ContainsKey(toolPath)) + throw new ProcessException("鏈厤缃鐩告満鐨勬弧Tray涓嬫枡鐐圭殑瑙嗚鎿嶄綔閰嶇疆"); + } + + + int reTryTime = Config.LineBusyRetryTimes; + + do + { + using (HObject hImage = CollectHImage(bind.Camera, visionConfig.CameraOpConfig, "Camera_UnloadFullTray")) { - throw new ProcessException($"鏈厤缃瓹amera_UnloadFullTray鐨勮瑙夌畻娉曡矾寰�"); + string toolPath = visionConfig.CameraOpConfig.AlgorithemPath; + if (!_halconToolDict.ContainsKey(toolPath)) + { + throw new ProcessException($"鏈厤缃瓹amera_UnloadFullTray鐨勮瑙夌畻娉曡矾寰�"); + } + + _halconToolDict[toolPath].SetDictionary(new Dictionary<string, HTuple>() { { "OUTPUT_Result", new HTuple() } }, new Dictionary<string, HObject>() { { "INPUT_Image", hImage } }); + _halconToolDict[toolPath].RunProcedure(); + + isLineReady = _halconToolDict[toolPath].GetResultTuple("OUTPUT_Result").I == 1; } - _halconToolDict[toolPath].SetDictionary(new Dictionary<string, HTuple>() { { "OUTPUT_Result", new HTuple() } }, new Dictionary<string, HObject>() { { "INPUT_Image", hImage } }); - _halconToolDict[toolPath].RunProcedure(); + if (!isLineReady) + { + Thread.Sleep(Config.LineBusyWaitInterval * 1000); + reTryTime--; + } + else + { + reTryTime = 0; + } + } while (reTryTime > 0); - isLineReady = _halconToolDict[toolPath].GetResultTuple("OUTPUT_Result").I == 1; - } - - if (!isLineReady) - { - Thread.Sleep(Config.LineBusyWaitInterval * 1000); - reTryTime--; - } - else - { - reTryTime = 0; - } - } while (reTryTime > 0); - - //if (!isLineReady) - //{ - // bind.Robot.SendMsg(RobotMsgType.Send, -1, true, RobotMsgAction.State, RobotMsgParas.LineSnap, new List<string>() { "-1" }); - // throw new ProcessException("浜х嚎蹇欙紝绛夊緟瓒呮椂"); - //} - //else - //{ - // bind.Robot.SendMsg(RobotMsgType.Send, -1, true, RobotMsgAction.State, RobotMsgParas.LineSnap, new List<string>() { "1" }); - //} + //if (!isLineReady) + //{ + // bind.Robot.SendMsg(RobotMsgType.Send, -1, true, RobotMsgAction.State, RobotMsgParas.LineSnap, new List<string>() { "-1" }); + // throw new ProcessException("浜х嚎蹇欙紝绛夊緟瓒呮椂"); + //} + //else + //{ + // bind.Robot.SendMsg(RobotMsgType.Send, -1, true, RobotMsgAction.State, RobotMsgParas.LineSnap, new List<string>() { "1" }); + //} + } + else + { + isLineReady = true; + } if (isLineReady) { @@ -1052,9 +1313,15 @@ #endregion } + //[Device("AGVBind", "AGVBind", EnumHelper.DeviceAttributeType.OperationConfig)] public class AGVBindOpConfig : OperationConfigBase { + [Category("璁惧淇℃伅")] + [Description("鎿嶄綔鐩稿叧鐨勮澶囩紪鍙�")] public string BindId { get; set; } + + [Category("浣嶇疆淇℃伅")] + [Description("鎿嶄綔鐩稿叧鐨勪綅缃�")] public PathPosition Position { get; set; } public AGVBindOpConfig() { } -- Gitblit v1.8.0