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 |  196 +++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 151 insertions(+), 45 deletions(-)

diff --git a/src/A032.Process/ProcessControl_Method.cs b/src/A032.Process/ProcessControl_Method.cs
index 97166ab..dc0d8c8 100644
--- a/src/A032.Process/ProcessControl_Method.cs
+++ b/src/A032.Process/ProcessControl_Method.cs
@@ -20,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)
         {
@@ -42,7 +87,7 @@
                 //    bind.RobotStatus = TaskStatus.Running;
                 //}
 
-                bind.AGVStatus = TaskStatus.Available;
+                bind.SetAGVStatus(TaskStatus.Available);
             }
         }
 
@@ -64,20 +109,26 @@
                 //    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:
@@ -85,6 +136,7 @@
                 }
             }
         }
+        #endregion
 
         private void OnRobotMsgReceived(DateTime dt, AuboRobotDriver robot, RobotMsg msg)
         {
@@ -142,8 +194,11 @@
 
                                     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)
                                         {
@@ -165,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;
@@ -210,12 +272,17 @@
                     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:
@@ -309,7 +376,7 @@
                     while (bind.IsEmptyTrayEmpty && !bind.IsEmptyTrayTaskAssigned)
                     {
                         //if (bind.TaskList.Count == 0)
-                        if (bind.AGVStatus == TaskStatus.Available && bind.RobotStatus == TaskStatus.Available)
+                        if (bind.UnitStatus == TaskStatus.Available)
                         {
                             //List<AGVTaskModel> models = new List<AGVTaskModel>();
                             //models.Add(new AGVTaskModel(TaskAvailableLevel.Both, "AGV_LoadEmptyTray"));
@@ -317,12 +384,14 @@
 
                             //AddNewTaskToBind(device.Id, models);
 
-                            AGV_LoadEmptyTray(bind.Id);
-                            bind.IsEmptyTrayTaskAssigned = true;
+                            if (AGV_LoadEmptyTray(bind.Id))
+                            {
+                                bind.IsEmptyTrayTaskAssigned = true;
+                            }
                         }
                         else
                         {
-                            Thread.Sleep(500);
+                            Thread.Sleep(WAITTIME);
                         }
                     }
                 });
@@ -339,6 +408,7 @@
         [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)
@@ -351,7 +421,7 @@
                     while (bind.IsFullTrayFull && !bind.IsFullTrayTaskAssigned)
                     {
                         //if (bind.TaskList.Count == 0)
-                        if (bind.AGVStatus == TaskStatus.Available && bind.RobotStatus == TaskStatus.Available)
+                        if (bind.UnitStatus == TaskStatus.Available)
                         {
                             //List<AGVTaskModel> models = new List<AGVTaskModel>();
                             //models.Add(new AGVTaskModel(TaskAvailableLevel.Both, "AGV_UnloadFullTray"));
@@ -359,13 +429,14 @@
 
                             //AddNewTaskToBind(device.Id, models);
 
-                            AGV_UnloadFullTray(bind.Id);
-
-                            bind.IsFullTrayTaskAssigned = true;
+                            if (AGV_UnloadFullTray(bind.Id))
+                            {
+                                bind.IsFullTrayTaskAssigned = true;
+                            }
                         }
                         else
                         {
-                            Thread.Sleep(500);
+                            Thread.Sleep(WAITTIME);
                         }
                     }
                 });
@@ -376,7 +447,9 @@
                 bind.IsFullTrayTaskAssigned = false;
             }
 
-            bind.RobotIOHandle.Set();
+            //(device as AuboRobotDriver).IOChangedHandle.Set();
+
+            //bind.RobotIOHandle.Set();
 
             return new ProcessResponse(true);
         }
@@ -384,11 +457,13 @@
         [ProcessMethod("", "Robot_Monitor_FullTrayEmpty", "鏈哄櫒浜虹洃鍚簨浠�-婊ray鍖哄煙娓呯┖", true)]
         public ProcessResponse Robot_Monitor_FullTrayEmpty(IOperationConfig config, IDevice device)
         {
+            //(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);
         }
@@ -460,7 +535,7 @@
         //    return new ProcessResponse(true);
         //}
 
-        public void AGV_LoadEmptyTray(string bindId)
+        public bool AGV_LoadEmptyTray(string bindId)
         {
             var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId);
             PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.LoadEmptyTray);
@@ -470,10 +545,17 @@
                 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;
+            }
         }
 
         //[ProcessMethod("", "AfterEmptyTrayPositionArrived", "鍒拌揪绌篢ray涓婃枡鐐�", true)]
@@ -589,20 +671,21 @@
                             //bind.AddTask(model_AGV);
                             //bind.AddTask(model_Robot);
 
-                            AGV_UnloadEmptyTray(bind.Id, position);
-
-                            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 void AGV_UnloadEmptyTray(string bindId, PathPosition position)
+        public bool AGV_UnloadEmptyTray(string bindId, PathPosition position)
         {
             var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId);
 
@@ -611,10 +694,17 @@
                 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;
+            }
         }
 
         //[ProcessMethod("", "Robot_UnloadEmptyTray", "鏈哄櫒浜鸿繍鍔ㄨ嚦绌篢ray鎷嶇収浣嶇疆", true)]
@@ -756,7 +846,7 @@
 
                 adjust_X = (float)dx_Robot.D;
                 adjust_Y = (float)dy_Robot.D;
-                adjust_Angle = angle;
+                adjust_Angle = visionConfig.StandardPoint.Angle - angle;
             }
 
             //bind.Robot.SendMsg(RobotMsgAction.Unload, RobotMsgParas.EmptyTray, position.PositionNo, new List<float>() { (float)dx_Robot.D, (float)dy_Robot.D, angle });
@@ -831,10 +921,11 @@
                             //bind.AddTask(model_AGV);
                             //bind.AddTask(model_Robot);
 
-                            AGV_LoadFullTray(bind.Id, position);
-
-                            taskStatus.IsTaskAssgined = true;
-                            taskStatus.AgvId = bind.AGVId;
+                            if (AGV_LoadFullTray(bind.Id, position))
+                            {
+                                taskStatus.IsTaskAssgined = true;
+                                taskStatus.AgvId = bind.AGVId;
+                            }
                         }
                     }
 
@@ -844,7 +935,7 @@
         }
 
         //[ProcessMethod("", "AGV_LoadFullTray", "AGV鍘诲線婊ray涓婃枡浣嶇疆", true)]
-        public void AGV_LoadFullTray(string bindId, PathPosition position)
+        public bool AGV_LoadFullTray(string bindId, PathPosition position)
         {
             var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId);
 
@@ -855,10 +946,17 @@
                 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);
         }
@@ -1026,7 +1124,7 @@
 
                 adjust_X = (float)dx_Robot.D;
                 adjust_Y = (float)dy_Robot.D;
-                adjust_Angle = angle;
+                adjust_Angle = visionConfig.StandardPoint.Angle - angle;
             }
 
             //bind.Robot.SendMsg(RobotMsgAction.Load, RobotMsgParas.FullTray, position.PositionNo, new List<float>() { (float)dx_Robot.D, (float)dy_Robot.D, angle });
@@ -1060,7 +1158,7 @@
         //    return new ProcessResponse(true);
         //}
 
-        public void AGV_UnloadFullTray(string bindId)
+        public bool AGV_UnloadFullTray(string bindId)
         {
             var bind = Config.AGVBindCollection.FirstOrDefault(u => u.Id == bindId);
             PathPosition position = Config.PositionCollection.FirstOrDefault(u => u.Description == PathPositionDefinition.UnloadFullTray);
@@ -1070,10 +1168,17 @@
                 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;
+            }
         }
 
         //[ProcessMethod("", "Robot_UnloadFullTray", "鏈哄櫒浜哄嵏杞芥弧Tray", true)]
@@ -1115,6 +1220,7 @@
 
             bind.RobotStatus = TaskStatus.Running;
             bind.Robot.SendMsg(RobotMsgAction.Move, RobotMsgParas.LineSnap, position.PositionNo);
+            //LogAsync(DateTime.Now, "Robot杩愬姩鑷充笅婊ray鎷嶇収", "");
         }
 
         //[ProcessMethod("", "Camera_UnloadFullTray", "鐩告満鎿嶄綔鍗歌浇婊ray", true)]

--
Gitblit v1.8.0