林豪 左 2 rokov pred
rodič
commit
853b297a00

+ 0 - 381
WCS.Entity.Protocol/Station/StationEunm.cs

@@ -1,381 +0,0 @@
-using System;
-
-namespace WCS.Entity.Protocol.Station
-{
-    /// <summary>
-    /// 指令类型
-    /// </summary>
-    [Flags]
-    public enum CmdTypeEnum : ushort
-    {
-        /// <summary>
-        /// AGV放货请求
-        /// </summary>
-        AGV_PUT_ASK = 1 << 0,
-
-        /// <summary>
-        /// AGV放货运行
-        /// </summary>
-        AGV_PUT_RUN = 1 << 1,
-
-        /// <summary>
-        /// AGV放货完成
-        /// </summary>
-        AGV_PUT_OK = 1 << 2,
-
-        /// <summary>
-        /// AGV取货请求
-        /// </summary>
-        AGV_GET_ASK = 1 << 3,
-
-        /// <summary>
-        /// AGV取货运行
-        /// </summary>
-        AGV_GET_RUN = 1 << 4,
-
-        /// <summary>
-        /// AGV取货完成
-        /// </summary>
-        AGV_GET_OK = 1 << 5,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES1 = 1 << 6,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES2 = 1 << 7,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES3 = 1 << 8,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES4 = 1 << 9,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES5 = 1 << 10,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES6 = 1 << 11,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES7 = 1 << 12,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES8 = 1 << 13,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES9 = 1 << 14,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES10 = 1 << 15,
-    }
-
-    /// <summary>
-    /// 指令回复
-    /// </summary>
-    [Flags]
-    public enum CmdReplyEnum : ushort
-    {
-        /// <summary>
-        /// CONV允许接货
-        /// </summary>
-        CONV_PUT_ALLOW = 1 << 0,
-
-        /// <summary>
-        /// CONV接货完成
-        /// </summary>
-        CONV_PUT_ACK = 1 << 1,
-
-        /// <summary>
-        /// CONV运行取货
-        /// </summary>
-        CONV_GET_ALLOW = 1 << 2,
-
-        /// <summary>
-        /// CONV取货完成确认
-        /// </summary>
-        CONV_GET_ACK = 1 << 3,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES11 = 1 << 4,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES12 = 1 << 5,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES1 = 1 << 6,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES2 = 1 << 7,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES3 = 1 << 8,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES4 = 1 << 9,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES5 = 1 << 10,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES6 = 1 << 11,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES7 = 1 << 12,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES8 = 1 << 13,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES9 = 1 << 14,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES10 = 1 << 15,
-    }
-
-    /// <summary>
-    /// 输送机模式
-    /// </summary>
-    public enum ModeEunm : short
-    {
-        /// <summary>
-        /// 自动
-        /// </summary>
-        Automatic = 1,
-
-        /// <summary>
-        /// 手动
-        /// </summary>
-        Manual = 2,
-
-        /// <summary>
-        /// 维修
-        /// </summary>
-        Repair = 3,
-    }
-
-    /// <summary>
-    /// 输送机警报
-    /// </summary>
-    [Flags]
-    public enum AlarmEunm
-    {
-    }
-
-    /// <summary>
-    /// 输送机状态
-    /// </summary>
-    [Flags]
-    public enum StatusEunm : ulong
-    {
-        /// <summary>
-        /// 自动
-        /// </summary>
-        Auto = 1 << 0,
-
-        /// <summary>
-        /// 选中状态位
-        /// </summary>
-        Choice_Bit = 1 << 1,
-
-        /// <summary>
-        /// 任务有货
-        /// </summary>
-        OT_Status = 1 << 2,
-
-        /// <summary>
-        /// 光电有货
-        /// </summary>
-        PH_Status = 1 << 3,
-
-        /// <summary>
-        /// 运行状态位
-        /// </summary>
-        Run = 1 << 4,
-
-        /// <summary>
-        /// 正转
-        /// </summary>
-        Fwd_1 = 1 << 5,
-
-        /// <summary>
-        /// 反转
-        /// </summary>
-        Rev_1 = 1 << 6,
-
-        /// <summary>
-        /// 上升/右转/伸出(顶升移栽升降、拆码盘机升降、提升机升降、拆码盘机拨叉伸出)
-        /// </summary>
-        Up_Right_Front_2 = 1 << 7,
-
-        /// <summary>
-        /// 下降/左转/缩回(顶升移栽升降、拆码盘机升降、提升机升降、拆码盘机拨叉缩回)
-        /// </summary>
-        Down_Left_Back_2 = 1 << 8,
-
-        /// <summary>
-        /// 高位(顶升移栽升降、拆码盘机升降、提升机升降)
-        /// </summary>
-        High_Station_2 = 1 << 9,
-
-        /// <summary>
-        /// 中位(拆码盘机升降)
-        /// </summary>
-        Mid_Station_2 = 1 << 10,
-
-        /// <summary>
-        /// 低位(顶升移栽升降、拆码盘机升降、提升机升降)
-        /// </summary>
-        Low_Station_2 = 1 << 11,
-
-        /// <summary>
-        /// 前位(拆码盘机拨叉伸出)
-        /// </summary>
-        Front_Station_2 = 1 << 12,
-
-        /// <summary>
-        /// 后位(拆码盘机拨叉缩回)
-        /// </summary>
-        Back_Station_2 = 1 << 13,
-
-        /// <summary>
-        /// 手动入库
-        /// </summary>
-        ManualStorage = 1 << 14,
-
-        /// <summary>
-        /// 上位机未分配任务
-        /// </summary>
-        UnassignedTask = 1 << 15,
-    }
-
-    /// <summary>
-    /// 外形故障
-    /// </summary>
-    [Flags]
-    public enum ShapeAlarmEunm : ushort
-    {
-        /// <summary>
-        /// 外形/条码等货物故障
-        /// </summary>
-        Goods_Err = 1 >> 0,
-
-        /// <summary>
-        /// 前超长故障
-        /// </summary>
-        F_Outside = 1 >> 1,
-
-        /// <summary>
-        /// 后超长故障
-        /// </summary>
-        B_Outside = 1 >> 2,
-
-        /// <summary>
-        /// 左超宽故障
-        /// </summary>
-        L_Outside = 1 >> 3,
-
-        /// <summary>
-        /// 右超宽故障
-        /// </summary>
-        R_Outside = 1 >> 4,
-
-        /// <summary>
-        /// 超高故障
-        /// </summary>
-        H_Outside = 1 >> 5,
-
-        /// <summary>
-        /// 条码读取失败
-        /// </summary>
-        BCR_Noread = 1 >> 6,
-
-        /// <summary>
-        /// 超重
-        /// </summary>
-        Overload = 1 >> 7,
-
-        /// <summary>
-        /// 货物严重外检故障
-        /// </summary>
-        Goods_Err_1 = 1 >> 8,
-
-        /// <summary>
-        /// 二维条码未读出
-        /// </summary>
-        BCR_Noread_1 = 1 >> 9,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES1 = 1 >> 10,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES2 = 1 >> 11,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES3 = 1 >> 12,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES4 = 1 >> 13,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES5 = 1 >> 14,
-
-        /// <summary>
-        /// 备用
-        /// </summary>
-        RES6 = 1 >> 15,
-    }
-}

+ 95 - 0
WCS.WorkEngineering/Extensions/WorldExtension.cs

@@ -0,0 +1,95 @@
+using WCS.Core;
+using WCS.WorkEngineering.Worlds.Logs;
+using LogInfo = WCS.WorkEngineering.Worlds.Logs.LogInfo;
+
+namespace WCS.WorkEngineering.Extensions
+{
+    public static class WorldExtension
+    {
+        /// <summary>
+        ///  记录日志
+        ///  默认:低级别 已知 不上抛
+        /// </summary>
+        /// <param name="source">世界</param>
+        /// <param name="msg">消息</param>
+        public static void Log(this World source, string msg)
+        {
+            source.Log(new LogInfo { Level = LogLevelEnum.Low, Type = ErrorTypeEnum.Kown, LogUpLoad = LogUpLoadEnum.NotUpLoad, Message = msg });
+        }
+
+        /// <summary>
+        ///  记录日志
+        ///  默认:已知
+        ///  上抛根据日志级别决定:低级别不上抛,中高级别上抛WMS
+        /// </summary>
+        /// <param name="source">世界</param>
+        /// <param name="msg">消息</param>
+        /// <param name="level">日志级别</param>
+        public static void Log(this World source, string msg, LogLevelEnum level)
+        {
+            LogUpLoadEnum logUpLoad = LogUpLoadEnum.NotUpLoad;
+            switch (level)
+            {
+                case LogLevelEnum.Low:
+                    logUpLoad = LogUpLoadEnum.NotUpLoad;
+                    break;
+
+                case LogLevelEnum.Mid:
+                    logUpLoad = LogUpLoadEnum.UpLoadWMS;
+                    break;
+
+                case LogLevelEnum.High:
+                    logUpLoad = LogUpLoadEnum.UpLoadWMS;
+                    break;
+
+                default:
+                    break;
+            }
+            source.Log(new LogInfo { Level = level, Type = ErrorTypeEnum.Kown, LogUpLoad = logUpLoad, Message = msg });
+        }
+
+        /// <summary>
+        ///  记录日志
+        ///  上抛根据日志级别决定:低级别不上抛,中高级别上抛WMS
+        /// </summary>
+        /// <param name="source">世界</param>
+        /// <param name="msg">消息</param>
+        /// <param name="level">日志级别</param>
+        /// <param name="errorType">日志类型</param>
+        public static void Log(this World source, string msg, LogLevelEnum level, ErrorTypeEnum errorType)
+        {
+            LogUpLoadEnum logUpLoad = LogUpLoadEnum.NotUpLoad;
+            switch (level)
+            {
+                case LogLevelEnum.Low:
+                    logUpLoad = LogUpLoadEnum.NotUpLoad;
+                    break;
+
+                case LogLevelEnum.Mid:
+                    logUpLoad = LogUpLoadEnum.UpLoadWMS;
+                    break;
+
+                case LogLevelEnum.High:
+                    logUpLoad = LogUpLoadEnum.UpLoadWMS;
+                    break;
+
+                default:
+                    break;
+            }
+            source.Log(new LogInfo { Level = level, Type = errorType, LogUpLoad = logUpLoad, Message = msg });
+        }
+
+        /// <summary>
+        ///  记录日志
+        /// </summary>
+        /// <param name="source">世界</param>
+        /// <param name="msg">消息</param>
+        /// <param name="level">日志级别</param>
+        /// <param name="errorType">日志类型</param>
+        /// <param name="logUpLoad">日志上抛类型</param>
+        public static void Log(this World source, string msg, LogLevelEnum level, ErrorTypeEnum errorType, LogUpLoadEnum logUpLoad)
+        {
+            source.Log(new LogInfo { Level = level, Type = errorType, LogUpLoad = logUpLoad, Message = msg });
+        }
+    }
+}

+ 11 - 9
WCS.WorkEngineering/Systems/SrmSystems.cs

@@ -7,6 +7,8 @@ using WCS.Entity.Protocol.SRM;
 using WCS.Entity.Protocol.Station;
 using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.Worlds;
+using WCS.WorkEngineering.Worlds.Logs;
+using KnownException = WCS.WorkEngineering.Worlds.Logs.KnownException;
 
 namespace WCS.WorkEngineering.Systems
 {
@@ -53,10 +55,10 @@ namespace WCS.WorkEngineering.Systems
         public override void Do(Device<ISRM520, ISRM521, ISRM523> obj)
         {
             //判断堆垛机是否报警
-            if (obj.Data2.Status.HasFlag(SrmStatus.Alarm)) throw new KnownException(obj.Data3.Alarm.ToString(), LogLevel.High);
+            if (obj.Data2.Status.HasFlag(SrmStatus.Alarm)) throw new KnownException(obj.Data3.Alarm.ToString(), LogLevelEnum.High);
 
             //判断DB520 完成任务确认清除信号 是否为1
-            if (obj.Data.OkAck == 1) throw new KnownException("任务完成确认信号未清除", LogLevel.Mid);
+            if (obj.Data.OkAck == 1) throw new KnownException("任务完成确认信号未清除", LogLevelEnum.Mid);
 
             //判断完成任务号是否大于0
             if (obj.Data2.TaskFinishiId > 0)
@@ -64,9 +66,9 @@ namespace WCS.WorkEngineering.Systems
                 Db.Do(db =>
                 {
                     //根据DB521任务号获取对应任务
-                    var task = db.Default.Queryable<WCS_TASK>().First(v => v.ID == obj.Data2.TaskFinishiId) ?? throw new KnownException($"未找到任务{obj.Data2.TaskFinishiId}", LogLevel.High);
+                    var task = db.Default.Queryable<WCS_TASK>().First(v => v.ID == obj.Data2.TaskFinishiId) ?? throw new KnownException($"未找到任务{obj.Data2.TaskFinishiId}", LogLevelEnum.High);
                     if (task.STATUS != Entity.TaskStatus.StackerExecution)
-                        throw new KnownException($"任务{task.ID}状态是{task.STATUS.Description()}.堆垛机完成任务需要对应任务状态处于堆垛机执行中", LogLevel.High);
+                        throw new KnownException($"任务{task.ID}状态是{task.STATUS.Description()}.堆垛机完成任务需要对应任务状态处于堆垛机执行中", LogLevelEnum.High);
                     //根据任务类型做不同的处理
                     switch (task.TYPE)
                     {
@@ -99,9 +101,9 @@ namespace WCS.WorkEngineering.Systems
             }
 
             //堆垛机是否可以下发任务
-            if (obj.Data2.VoucherNo != obj.Data.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo},DB521:{obj.Data2.VoucherNo}", LogLevel.Mid);
-            if (obj.Data2.AutoStatus != SrmAutoStatus.Automatic) throw new KnownException($"堆垛机处于{obj.Data2.AutoStatus}模式", LogLevel.Low);
-            if (obj.Data2.RunStatus != SrmRunStatus.Idle) throw new KnownException($"堆垛机处于{obj.Data2.RunStatus}状态", LogLevel.High);
+            if (obj.Data2.VoucherNo != obj.Data.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo},DB521:{obj.Data2.VoucherNo}", LogLevelEnum.Mid);
+            if (obj.Data2.AutoStatus != SrmAutoStatus.Automatic) throw new KnownException($"堆垛机处于{obj.Data2.AutoStatus}模式", LogLevelEnum.Low);
+            if (obj.Data2.RunStatus != SrmRunStatus.Idle) throw new KnownException($"堆垛机处于{obj.Data2.RunStatus}状态", LogLevelEnum.High);
 
             //默认没有移库任务
             bool isTransfer = false;
@@ -115,7 +117,7 @@ namespace WCS.WorkEngineering.Systems
                 //获取当前堆垛机的所有未完成任务
                 var tasks = db.Default.Queryable<WCS_TASK>().Where(v => v.STATUS < Entity.TaskStatus.Finish && (v.DEVICE == obj.Entity.Code));
                 //任务集合是否有处于堆垛机执行状态的任务
-                if (tasks.Any(v => v.STATUS == Entity.TaskStatus.StackerExecution)) throw new KnownException($"有任务处于堆垛机执行状态", LogLevel.High);
+                if (tasks.Any(v => v.STATUS == Entity.TaskStatus.StackerExecution)) throw new KnownException($"有任务处于堆垛机执行状态", LogLevelEnum.High);
 
                 //判断是否存在调整优先级任务
                 if (!tasks.Any(v => v.TYPE != TaskType.TransferDepot && v.STATUS < Entity.TaskStatus.StackerExecution && v.Priority > 0))
@@ -148,7 +150,7 @@ namespace WCS.WorkEngineering.Systems
                     //获取一条当前堆垛机优先级最高的新建移库任务
                     var task = db.Default.Queryable<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.Code && v.TYPE == TaskType.TransferDepot && v.STATUS == Entity.TaskStatus.NewBuild)
                                                                .OrderByDescending(v => v.Priority)
-                                                               .First() ?? throw new KnownException("未找到移库任务", LogLevel.High);
+                                                               .First() ?? throw new KnownException("未找到移库任务", LogLevelEnum.High);
                     //任务状态改为堆垛机执行中
                     task.STATUS = Entity.TaskStatus.StackerExecution;
                     task.STARTTIME = DateTime.Now;

+ 1 - 1
WCS.WorkEngineering/WCS.WorkEngineering.csproj

@@ -8,7 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.5" />
-    <PackageReference Include="ServiceCenter" Version="1.0.0.16" />
+    <PackageReference Include="ServiceCenter" Version="1.0.0.17" />
   </ItemGroup>
 
   <ItemGroup>

+ 2 - 5
WCS.WorkEngineering/Worlds/SortingMainLineWorld.cs

@@ -1,15 +1,12 @@
-using WCS.Core;
-
-namespace WCS.WorkEngineering.Worlds
+namespace WCS.WorkEngineering.Worlds
 {
     /// <summary>
     /// 分拣主线
     /// </summary>
-    public class SortingMainLineWorld : World
+    public class SortingMainLineWorld : MainWorld
     {
         public SortingMainLineWorld()
         {
-            Interval = 100;
         }
     }
 }

+ 85 - 9
WCS.WorkEngineering/worlds/MainWorld.cs

@@ -1,16 +1,18 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Collections.Concurrent;
+using System.ComponentModel;
 using WCS.Core;
+using WCS.WorkEngineering.Worlds.Logs;
+using KnownException = WCS.WorkEngineering.Worlds.Logs.KnownException;
+using LogInfo = WCS.WorkEngineering.Worlds.Logs.LogInfo;
 
 namespace WCS.WorkEngineering.Worlds
 {
     /// <summary>
     /// 主世界,所有的系统(交互点)默认在该世界下执行。
-    /// 如有系统需独立,请自行增加
+    /// 如有系统需独立,请自行增加对应世界
+    /// 新增世界应当继承此世界,而不是直接继承World
     /// </summary>
+    [Description("主世界")]
     public class MainWorld : World
     {
         /// <summary>
@@ -18,15 +20,89 @@ namespace WCS.WorkEngineering.Worlds
         /// </summary>
         public MainWorld()
         {
-            Interval = 300;
         }
 
         /// <summary>
-        /// 更新后执行
+        ///  日志队列
+        /// </summary>
+        private ConcurrentQueue<KeyLog> Logs = new ConcurrentQueue<KeyLog>();
+
+        /// <summary>
+        ///  世界执行周期间隔
+        ///  单位:毫秒
+        /// </summary>
+        protected override int Interval => 300;
+
+        /// <summary>
+        ///  更新前执行,重写改方法后请自行添加执行内容
+        ///  执行内容:清空日志队列
+        /// </summary>
+        protected override void BeforeUpdate()
+        {
+            // 清空日志队列,确保日志队列中只会有当前周期日志
+            Logs.Clear();
+        }
+
+        /// <summary>
+        /// 更新后执行,重写改方法后请自行添加执行内容
+        /// 执行内容:清空日志队列
         /// </summary>
         protected override void AfterUpdate()
         {
-            //var objs = GetSystem<CollectConvDataSys>().Objects;
+            #region 日志处理
+
+            //TODO:暂时仅将日志记录至文本文件
+            if (Logs.Count() > 0)
+            {
+                var time = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:FF")}";
+                var fst = Logs.First();
+                var dir = $"Logs\\{DateTime.Now.ToString("yyyy-MM-dd")}\\{fst.Channel.World}\\{fst.Channel.System}\\";
+                if (!Directory.Exists(dir))
+                    Directory.CreateDirectory(dir);
+
+                foreach (var log in Logs)
+                {
+                    var msg = $"--------------------{log.Time}[{Thread.CurrentThread.ManagedThreadId}]--------------------\n{log}\n";
+                    File.AppendAllText(Path.Combine(dir, $"{log.Channel.Item}.txt"), msg);
+                }
+            }
+
+            #endregion 日志处理
+        }
+
+        /// <summary>
+        ///  异常处理,重写改方法后请自行添加执行内容
+        ///  执行内容:Exception as KnownException并添加至日志队列
+        /// </summary>
+        /// <param name="channel"></param>
+        /// <param name="exception"></param>
+        /// <exception cref="NotImplementedException"></exception>
+        protected override void OnError(Channel channel, Exception exception)
+        {
+            if (exception is KnownException)
+            {
+                var ex = exception as KnownException;
+                var log = new LogInfo { Level = ex.Level, Type = ErrorTypeEnum.Kown, LogUpLoad = ex.logUpLoad, Message = ex.Message };
+                Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
+            }
+            else
+            {
+                var log = new LogInfo { Level = LogLevelEnum.High, Type = ErrorTypeEnum.Unkown, LogUpLoad = LogUpLoadEnum.NotUpLoad, Message = exception.Message };
+                Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
+            }
+        }
+
+        /// <summary>
+        ///  日志处理,重写改方法后请自行添加执行内容
+        ///  执行内容:LogInfo as KeyLog并添加至日志队列
+        /// </summary>
+        /// <param name="channel"></param>
+        /// <param name="logObj"></param>
+        /// <exception cref="NotImplementedException"></exception>
+        protected override void OnLog(Channel channel, object logObj)
+        {
+            var log = (LogInfo)logObj;
+            Logs.Enqueue(new KeyLog { Channel = channel, Log = log, Time = DateTime.Now });
         }
     }
 }