林豪 左 2 年之前
父节点
当前提交
eaeb3e6e0e

+ 63 - 24
WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -1,13 +1,11 @@
-using System;
-using System.Collections.Generic;
+using ServiceCenter.SqlSugars;
 using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using WCS.Core;
-using WCS.WorkEngineering.WebApi.Models.AGV.Request;
-using WCS.WorkEngineering.WebApi.Models.AGV.Response;
+using WCS.Entity;
+using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.WebApi.Controllers;
 using WCS.WorkEngineering.Worlds;
+using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
 
 namespace WCS.WorkEngineering.Systems
 {
@@ -16,33 +14,74 @@ namespace WCS.WorkEngineering.Systems
     /// </summary>
     [BelongTo(typeof(MainWorld))]
     [Description("Agv交互系统")]
-    public class AgvSystems : ServiceSystem<AgvCallbackRequest, AgvCallbackResponse>
+    public class AgvSystems : DeviceSystem<Station>
     {
-        protected override AgvCallbackResponse Do(AgvCallbackRequest reqDto)
+        protected override bool ParallelDo => true;
+
+        protected override bool SaveLogsToFile => true;
+
+        public override void Do(Station obj)
         {
-            switch (reqDto.method)
+            if (obj.Entity.HasFlag(DeviceFlags.出库))
             {
-                case "申请":
-                    break;
+                SqlSugarHelper.Do(db =>
+                {
+                    //获取所有未结束的AGV任务
+                    var agvTaks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status <= AGVTaskStatus.MissionCompleted && v.Position == obj.Entity.Code).SplitTable(tabs => tabs.Take(3)).ToList();
 
-                case "申请放货":
-                    break;
+                    foreach (var agv in agvTaks)
+                    {
+                        switch (agv.Status)
+                        {
+                            case AGVTaskStatus.RequestOrPermission2:
+                                //调继续执行任务接口
+                                var res = AgvApi.ContinueTask(agv.AgvID, "");
+                                agv.Status = AGVTaskStatus.Complete2;
 
-                case "申请取货":
-                    break;
+                                break;
+                        }
 
-                case "取放完成":
-                    break;
+                        db.Default.Updateable(agv).AddQueue();
+                    }
 
-                default:
-                    break;
+                    db.Default.SaveQueues();
+                });
             }
+            else if (obj.Entity.HasFlag(DeviceFlags.入库))
+            {
+                SqlSugarHelper.Do(db =>
+                {
+                    //获取所有未结束的AGV任务
+                    var agvTaks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status <= AGVTaskStatus.MissionCompleted && v.Position == obj.Entity.Code).SplitTable(tabs => tabs.Take(3)).ToList();
+
+                    foreach (var agv in agvTaks)
+                    {
+                        switch (agv.Status)
+                        {
+                            case AGVTaskStatus.RequestOrPermission1:
+                                //调继续执行任务接口
+                                AgvApi.ContinueTask(agv.AgvID, "");
+                                agv.Status = AGVTaskStatus.Complete1;
+                                break;
+
+                            case AGVTaskStatus.RequestOrPermission2:
+                                //调继续执行任务接口
+                                AgvApi.ContinueTask(agv.AgvID, "");
+                                agv.Status = AGVTaskStatus.Complete2;
+                                break;
+                        }
 
-            var res = new AgvCallbackResponse() { code = "0", message = "成功" };
+                        db.Default.Updateable(agv).AddQueue();
+                    }
 
-            return res;
+                    db.Default.SaveQueues();
+                });
+            }
         }
-    }
 
-  
+        public override bool Select(Device dev)
+        {
+            return dev.HasFlag(DeviceFlags.巷道口);
+        }
+    }
 }

+ 28 - 2
WCS.WorkEngineering/Systems/OutboundSiteInteractionSystems.cs

@@ -1,6 +1,8 @@
-using WCS.Core;
+using ServiceCenter.SqlSugars;
+using WCS.Core;
+using WCS.Entity;
 using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Worlds;
+using WCS.WorkEngineering.WebApi.Controllers;
 using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
 
 namespace WCS.WorkEngineering.Systems
@@ -32,6 +34,30 @@ namespace WCS.WorkEngineering.Systems
 
             if (IsThereATask)
             {
+                //有货检查是否有当前起始点的未取货完成的AGV任务
+                //创建一个Agv任务
+                var result = SqlSugarHelper.Do(db =>
+                {
+                    //跟据DB521的任务号找到对应的WCS任务信息
+                    var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.ConveyorExecution);
+                    //生成对应的AGV任务
+                    var agvTask = new WCS_AgvTaskInfo()
+                    {
+                        Position = obj.Entity.Code,
+                    };
+
+                    //调用任务生成单接口
+                    var res = AgvApi.GenAgvSchedulingTask(agvTask.Position, "");
+                    agvTask.AgvID = res.data;
+                    agvTask.Status = AGVTaskStatus.Confirm;
+                    task.Status = Entity.TaskStatus.AGVExecution;
+                    db.Default.Insertable(agvTask).AddQueue();
+                    task.AddWCS_TASK_DTL(db, obj.Entity.Code, "AGV", $"任务以下发AGV,AGV任务单号{res.data}");
+                    db.Default.Updateable(task).AddQueue();
+                    db.Default.SaveQueues();
+                });
+
+
             }
             else
             {

+ 59 - 0
WCS.WorkEngineering/Systems/SrmDebugSystem.cs

@@ -0,0 +1,59 @@
+using WCS.Core;
+using WCS.Entity.Protocol.SRM;
+using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.Worlds;
+
+namespace WCS.WorkEngineering.Systems
+{
+    /// <summary>
+    ///  设备信息写入接口
+    /// </summary>
+    [BelongTo(typeof(MainWorld))]
+    public class SrmDebugSystem : ServiceSystem<SrmDebugInfo>
+    {
+        private List<SRM> Srms;
+
+        /// <summary>
+        ///  构造函数
+        /// </summary>
+        public SrmDebugSystem()
+        {
+            Srms = Device.All.Where(v => v.HasProtocol<ISRM520>()).Select(v => new SRM(v, this.World)).ToList();
+        }
+
+        protected override void Do(SrmDebugInfo info)
+        {
+            var srm = Srms.FirstOrDefault(v => v.Entity.Code == info.SrmCode);
+            srm.Data.TaskType = info.srmTaskType;
+            srm.Data.SLine = info.SLine;
+            srm.Data.SCol = info.SCol;
+            srm.Data.SLayer = info.SLayer;
+            srm.Data.ELine = info.ELine;
+            srm.Data.ECol = info.ECol;
+            srm.Data.ELayer = info.ELayer;
+            srm.Data.VoucherNo++;
+        }
+    }
+
+    /// <summary>
+    /// 设备写入信息
+    /// </summary>
+    public class SrmDebugInfo
+    {
+        public string SrmCode { get; set; }
+
+        public SrmTaskTypeEnum srmTaskType { get; set; }
+
+        public short SLine { get; set; }
+
+        public short SCol { get; set; }
+
+        public short SLayer { get; set; }
+
+        public short ELine { get; set; }
+
+        public short ECol { get; set; }
+
+        public short ELayer { get; set; }
+    }
+}

+ 7 - 4
WCS.WorkEngineering/Systems/SrmSystems.cs

@@ -59,10 +59,13 @@ namespace WCS.WorkEngineering.Systems
             if (obj.Entity.Code == "SRM1")
             {
                 if (obj.Data.VoucherNo != obj.Data2.VoucherNo) return;
-                if (obj.Data2.RunStatus != SrmRunStatus.Idle) throw new KnownException($"堆垛机处于{obj.Data2.RunStatus}状态", LogLevelEnum.High);
-                obj.Data.TaskType = SrmTaskTypeEnum.Default;
-                obj.Data.SLine = 1011;
-                obj.Data.ELine = 4;
+              // if (obj.Data2.RunStatus != SrmRunStatus.Idle) throw new KnownException($"堆垛机处于{obj.Data2.RunStatus}状态", LogLevelEnum.High);
+                obj.Data.TaskType = SrmTaskTypeEnum.DeleteTask;
+                obj.Data.SLine = 6;
+                obj.Data.SCol = 1;
+                obj.Data.SLayer = 1;
+                obj.Data.EDepth = ForkPosition.OneDepth;
+                obj.Data.ELine = 1014;
                 obj.Data.ECol = 1;
                 obj.Data.ELayer = 1;
                 obj.Data.EDepth = ForkPosition.TwoDepth;

+ 23 - 15
WCS.WorkEngineering/WebApi/Controllers/AgvApi.cs

@@ -16,21 +16,29 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// </summary>
         public static string AgvUrl = null!;
 
-        //public static GenAgvSchedulingTaskResponse GenAgvSchedulingTask()
-        //{
-        //    var res = APICaller.CallApi2<ContinueTaskResponse>(AgvUrl + "/hikRpcService/continueTask", new ContinueTaskRequest
-        //    {
-        //        reqCode = Guid.NewGuid().ToString(),
-        //        taskCode = taskCode,
-        //        type = "00",
-        //        nextPositionCode = nextPositionCode
-        //    });
-        //    if (res.code != AgvContinueTaskResponseCode.Success)
-        //    {
-        //        throw new KnownException(res.message, LogLevelEnum.High);
-        //    }
-        //    return res;
-        //}
+        /// <summary>
+        ///  Agv任务单生成接口
+        /// </summary>
+        /// <param name="position">起始位置</param>
+        /// <param name="nextPosition">目标位置</param>
+        /// <returns></returns>
+        /// <exception cref="KnownException"></exception>
+        public static GenAgvSchedulingTaskResponse GenAgvSchedulingTask(string position, string nextPosition)
+        {
+            var res = APICaller.CallApi2<GenAgvSchedulingTaskResponse>(AgvUrl + "/hikRpcService/continueTask", new ContinueTaskRequest
+            {
+                reqCode = Guid.NewGuid().ToString(),
+                //taskCode = taskCode,
+                type = "00",
+                positionCode = position,
+                nextPositionCode = nextPosition
+            });
+            if (res.code != AgvResponseCode.Success)
+            {
+                throw new KnownException(res.message, LogLevelEnum.High);
+            }
+            return res;
+        }
 
         /// <summary>
         ///  继续执行任务

+ 50 - 3
WCS.WorkEngineering/WebApi/Controllers/AgvController.cs

@@ -1,6 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
-using WCS.Core;
-using WCS.WorkEngineering.Systems;
+using ServiceCenter.SqlSugars;
+using WCS.Entity;
+using WCS.WorkEngineering.WebApi.Models.AGV;
 using WCS.WorkEngineering.WebApi.Models.AGV.Request;
 using WCS.WorkEngineering.WebApi.Models.AGV.Response;
 
@@ -21,7 +22,53 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         [HttpPost]
         public AgvCallbackResponse AgvCallback(AgvCallbackRequest reqDto)
         {
-            return World.GetSystemInstance<AgvSystems>().Invoke(reqDto);
+            var msg = "成功";
+            var code = AgvResponseCode.Success;
+            try
+            {
+                SqlSugarHelper.Do(db =>
+                {
+                    //跟据AGVid找到对应的AGV任务
+                    var agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(3)).First(v => v.AgvID == reqDto.taskCode);
+                    if (agvTask == null)
+                    {
+                        msg = "未找到对应的AGV任务";
+                        code = AgvResponseCode.Fail;
+
+                    }
+                    switch (reqDto.method)
+                    {
+                        case "巷道分配":
+                            agvTask.Status = AGVTaskStatus.RequestOrPermission1;//表示请求巷道
+                            break;
+
+                        case "安全检测":
+                            agvTask.Status = AGVTaskStatus.RequestOrPermission2;//表示请求放货或取货
+                            break;
+
+                        case "出库任务完成":
+                            agvTask.Status = AGVTaskStatus.MissionCompleted;
+                            break;
+
+                        case "入库任务完成":
+                            agvTask.Status = AGVTaskStatus.MissionCompleted;
+                            break;
+
+                        default:
+                            break;
+                    }
+                    db.Default.Updateable(agvTask).ExecuteCommand();
+                });
+            }
+            catch (Exception ex)
+            {
+                code = AgvResponseCode.Error;
+                msg = ex.Message;
+            }
+
+            var res = new AgvCallbackResponse() { code = code, message = msg };
+
+            return res;
         }
     }
 }

+ 28 - 0
WCS.WorkEngineering/WebApi/Controllers/WcsController.cs

@@ -1,5 +1,6 @@
 using Microsoft.AspNetCore.Mvc;
 using WCS.Core;
+using WCS.Entity.Protocol.SRM;
 using WCS.WorkEngineering.Systems;
 
 namespace WCS.WorkEngineering.WebApi.Controllers
@@ -41,6 +42,33 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         {
             return Device.All.ToList();
         }
+
+        /// <summary>
+        ///  堆垛机测试
+        /// </summary>
+        /// <param name="srmcod">堆垛机编号</param>
+        /// <param name="typeEnum">任务类型</param>
+        /// <param name="value1">起始行</param>
+        /// <param name="value2">起始列</param>
+        /// <param name="value3">起始层</param>
+        /// <param name="value4">目标行</param>
+        /// <param name="value5">目标列</param>
+        /// <param name="value6">目标层</param>
+        [HttpPost]
+        public void SrmDeBug(string srmcod, SrmTaskTypeEnum typeEnum, short value1, short value2, short value3, short value4, short value5, short value6)
+        {
+            World.GetSystemInstance<SrmDebugSystem>().Invoke(new SrmDebugInfo
+            {
+                SrmCode = srmcod,
+                srmTaskType = typeEnum,
+                SLine = value1,
+                SCol = value2,
+                SLayer = value3,
+                ELine = value4,
+                ECol = value5,
+                ELayer = value6
+            });
+        }
     }
 
     public interface IDeviceWriter