Browse Source

Merge branch '环穿' of zuolinhao/YG-OPP-WCS into master

zuolinhao 3 years ago
parent
commit
198fb62eb5

BIN
DLL/PLC.Siemens.dll


+ 18 - 3
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -591,17 +591,32 @@ namespace WCS.Service.Extensions
         /// 写入取货任务
         /// </summary>
         /// <param name="addr">目标地址</param>
-        public void Pick(StationDeviceGroup addr, int task1 = 0, int task2 = 0)
+        public void Pick(StationDeviceGroup addr, int task1, int task2)
         {
             InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV取货任务-开始:{Data.TaskID_1},{Data.TaskID_2},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
             Data.TaskType_1 = RGVTaskType.取货;
             Data.DestPosition_1 = addr.Entity.CODE.GetShortCode();
-            if (task1 != 0) Data.TaskID_1 = task1;
-            if (task2 != 0) Data.TaskID_2 = task2;
+            Data.TaskID_1 = task1;
+            Data.TaskID_2 = task2;
             Data.Trigger_1++;
             InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV取货任务-结束:{Data.TaskID_1},{Data.TaskID_2},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
         }
 
+        ///// <summary>
+        ///// 写入取货任务
+        ///// </summary>
+        ///// <param name="addr">目标地址</param>
+        //public void Pick(StationDeviceGroup addr, int task1 = 0, int task2 = 0)
+        //{
+        //    InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV取货任务-开始:{Data.TaskID_1},{Data.TaskID_2},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
+        //    Data.TaskType_1 = RGVTaskType.取货;
+        //    Data.DestPosition_1 = addr.Entity.CODE.GetShortCode();
+        //    if (task1 != 0) Data.TaskID_1 = task1;
+        //    if (task2 != 0) Data.TaskID_2 = task2;
+        //    Data.Trigger_1++;
+        //    InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV取货任务-结束:{Data.TaskID_1},{Data.TaskID_2},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
+        //}
+
         /// <summary>
         /// 写入放货任务
         /// </summary>

+ 12 - 1
Projects/永冠OPP/WCS.Service/Extensions/WCS_TaskExtensions.cs

@@ -2,6 +2,7 @@
 using System;
 using WCS.Entity;
 using WCS.Entity.Protocol;
+using WCS.Service.Log;
 
 namespace WCS.Service.Extensions
 {
@@ -34,5 +35,15 @@ namespace WCS.Service.Extensions
                 Console.WriteLine(e.Message);
             }
         }
+
+        public static void infolog(this string code, string msg)
+        {
+            if (code == "G1190")
+            {
+                InfoLog.INFO_ERRORCHECK(msg);
+                //InfoLog.INFO_ERRORCHECK($"{res.WMSTaskGroupKey}第一次分配:WMS返回{JsonConvert.SerializeObject(tunnels)}。");
+                //InfoLog.INFO_ERRORCHECK($"{res.WMSTaskGroupKey}第一次分配:WCS选择{tunnelInfo.Tunnel.CODE}。");
+            }
+        }
     }
-}
+}

+ 16 - 0
Projects/永冠OPP/WCS.Service/Handlers/SCHandler.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WCS.Core;
+
+namespace WCS.Service.Handlers
+{
+    [Description("堆垛机")]
+    class SCHandler : WorkHandler
+    {
+        public override bool ParallelRun =>true;
+    }
+}

+ 10 - 1
Projects/永冠OPP/WCS.Service/Log/InfoLog.cs

@@ -39,6 +39,15 @@ namespace WCS.Service.Log
             LogHelper.Init(this);
         }
 
+        /// <summary>
+        /// 错误检查
+        /// </summary>
+        /// <param name="msg"></param>
+        public static void INFO_ERRORCHECK(string msg)
+        {
+            Log.Info(msg, "INFO_ERRORCHECK");
+        }
+
         /// <summary>
         /// 系统执行信息
         /// </summary>
@@ -180,4 +189,4 @@ namespace WCS.Service.Log
             Log.Info(msg, "INFO_AGV");
         }
     }
-}
+}

+ 1 - 0
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -137,6 +137,7 @@ namespace WCS.Service.Works.RGV
                             //开始下达取货任务
                             DB.Do(db =>
                             {
+                                if (rgvDevice.Data.TaskID_1 != pickStation.Entity.CODE.Replace("G","").ToShort()) throw new WarnException($"目标站台{rgvDevice.Data.TaskID_1}与当前站台{pickStation.Entity.CODE.Replace("G", "").ToShort()}不一致");
                                 if (rgvDevice.Data2.TaskType_1 != RGVTaskType.移动) throw new WarnException($"RGV正在执行{rgvDevice.Data2.TaskType_1}");
                                 if (rgvDevice.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV有光电,无法取货,请检查实际情况");
                                 if (!rgvDevice.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.RGV到站)) throw new WarnException("RGV无到站状态,请检查RGV实际状态");

+ 28 - 5
Projects/永冠OPP/WCS.Service/Works/Station/BOPP入库.cs

@@ -1,5 +1,6 @@
 using DBHelper;
 using Microsoft.EntityFrameworkCore;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -127,11 +128,13 @@ namespace WCS.Service.Works.Station
 
                     var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
                     if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
+
                     var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
 
                     var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
 
                     var tunnelInfos = new List<TunnelInfo>();
+
                     foreach (var item in tunnels)
                     {
                         //当前巷道的取货点
@@ -182,8 +185,8 @@ namespace WCS.Service.Works.Station
                         task.ADDRNEXT = tunnelInfo.taskIN.CODE;
                         task.TaskGroupKey = res.WMSTaskGroupKey;
                         task.ADDRTO = task.DEVICE;
-                        var msg = $"下达从G1030移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
-                        msg += $"[{dev.Data.Tasknum}][G1030][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
+                        var msg = $"下达从G23移动至{dev.Data.Goodsend}的PLC指令。同时将任务分配至[{task.TUNNEL}]-[{task.DEVICE}]";
+                        msg += $"[{dev.Data.Tasknum}][G23][{dev.Data.Goodsend}][{tunnelInfo.SRM.Entity.CODE}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
                         task.CreateStatusLog(db, msg, this.GetType());
                         finishTaskList.Add(new FinishTaskList<int>(task.ID, item.Station));
                     }
@@ -241,26 +244,33 @@ namespace WCS.Service.Works.Station
 
                     var res = WMS.GetTunnelList(taskList.Select(v => v.WMSTASK.ToString()).ToList(), code);
                     if (string.IsNullOrEmpty(res.TunnelNum)) throw new WarnException($"WMS未返回巷道");
+
                     var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
 
                     var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
 
                     var tunnelInfos = new List<TunnelInfo>();
+                    var setting = new JsonSerializerSettings();
+                    setting.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
+                    setting.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
+                    code.infolog($"{res.WMSTaskGroupKey}第二次分配:WMS返回{JsonConvert.SerializeObject(tunnelNo, setting)}。");
                     foreach (var item in tunnels)
                     {
                         //当前巷道的取货点
                         var allIn = Device.Where(v => v.Is(DF.SRMBOPP取货))
-                                          .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
+                                          .Where(v => v.ROUTES.Any(p => p.NEXT.CODE == item.CODE)) //下一个点为当前巷道的取货点
                                           .Select(v => v.CODE)
                                           .ToList();
+                        code.infolog($"allIn:{JsonConvert.SerializeObject(allIn, setting)};item:{item.CODE}");
                         //下一个目标地址包含取货点的设备,此时获得的数据是旋转台
                         var turntable = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE)))
                                               .Where(v => stationDeviceGroup.Items.Any(p => p.Entity == v))// 筛选出包含在当前设备组的设备
                                               .Distinct()
                                               .FirstOrDefault();//去一次重
                         if (turntable == null) continue;
+                        code.infolog($"turntable:{turntable.CODE};item:{item.CODE}");
                         var dev = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => allIn.Contains(d.MEMBER.CODE))).MinBy(p => p.CODE);
-
+                        code.infolog($"dev:{dev.CODE};item:{item.CODE}");
                         tunnelInfos.Add(new TunnelInfo
                         {
                             Tunnel = item,
@@ -268,9 +278,21 @@ namespace WCS.Service.Works.Station
                             SRM = Device.Where(p => p.IsSC()).FirstOrDefault(p => item.ROUTES.Any(d => d.NEXT.CODE == p.CODE)).Create<SRMDevice>()
                         });
                     }
+                    code.infolog($"tunnelInfo:{JsonConvert.SerializeObject(tunnelInfos.Select(v => new { taskIN = v.taskIN.CODE, Tunnel = v.Tunnel.CODE, SRM = v.SRM.Entity.CODE }), setting)};");
                     //筛选出优先级最高的可用巷道
-                    var tunnelInfo = tunnelInfos.Where(v => { try { return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲; } catch { return false; } }).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
+                    var tunnelInfo = tunnelInfos.Where(v =>
+                    {
+                        try
+                        {
+                            code.infolog($"SCAlarm:{v.SRM.Data3.SCAlarm};SRMMode:{v.SRM.Data2.SRMMode};SRMStatus:{v.SRM.Data2.SRMStatus};CODE:{v.SRM.Entity.CODE}");
+                            return v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程 && v.SRM.Data2.SRMStatus == SCRunStatus.空闲;
+                        }
+                        catch { return false; }
+                    }).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
                     if (tunnelInfo == null) throw new WarnException("无可用巷道");
+                    code.infolog($"tunnelNo:{JsonConvert.SerializeObject(tunnelNo, setting)}。");
+                    code.infolog($"tunnelInfo:{JsonConvert.SerializeObject(new { taskIN = tunnelInfo.taskIN.CODE, Tunnel = tunnelInfo.Tunnel.CODE, SRM = tunnelInfo.SRM.Entity.CODE }, setting)};");
+                    code.infolog($"{res.WMSTaskGroupKey}第二次分配:WCS选择{tunnelInfo.Tunnel.CODE}。");
 
                     //开始变更任务信息
                     foreach (var item in devise)
@@ -306,6 +328,7 @@ namespace WCS.Service.Works.Station
                         finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
                         finishTask.Station.Data.CmdType = IstationCmdType.分配目标地址;
                         finishTask.Station.Data.VoucherNo++;
+                        code.infolog($"{task.TaskGroupKey}第二次分配:WCS目标地址{finishTask.Station.Data.Goodsend}。");
                     }
                 });
             });

+ 1 - 1
Projects/永冠OPP/WCS.Service/Works/Station/涂布入库.cs

@@ -261,7 +261,7 @@ namespace WCS.Service.Works.Station
                     var infos = devise.GetWMSInTask();
 
                     WCS_AGVTask agvTask = null;
-
+                    
                     if (!stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.手动入库)))
                     {
                         if (stationDeviceGroup.Entity.CODE == "G1435")

+ 4 - 1
Projects/永冠OPP/WCS.Service/Works/Station/涂布出库.cs

@@ -428,7 +428,10 @@ namespace WCS.Service.Works.Station
                              if (stationDeviceGroup.Entity.CODE != "G1340") continue;
                              var qty = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成).Count(v => v.Position == tasking.Position);
 
-                             if (qty >= 4)
+                             var cmQty = ProtocolProxy.YGWMS150Redis.Get("MaxLineCallTaskCount").ToInt();
+                           
+
+                             if (qty >= cmQty)
                              {
                                  InfoLog.INFO_WarnDb($"{tasking.Position}正在执行的叫料任务数量已达{qty},暂停出库", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.逻辑异常);
                                  continue;

+ 2 - 1
Projects/永冠OPP/WCS.Service/config.json

@@ -20,7 +20,8 @@
         "INFO_UPEX": "INFO_I_WCS_GetExcTask",
         "INFO_CREATETASKIN": "CreateTaskIn",
         "INFO_RGVINFO": "RgvInfo",
-        "INFO_AGV": "info_agv"
+        "INFO_AGV": "info_agv",
+        "INFO_ERRORCHECK": "INFO_ErrorCheck"
       }
     },
     {

+ 82 - 0
WCS.sln

@@ -0,0 +1,82 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.32014.148
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCS.Core", "WCS.Core\WCS.Core.csproj", "{609C1A57-7CFF-4BC1-B0C6-DA679C530D43}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "项目", "项目", "{B500324F-34BF-4A32-ACDF-F1D4F3DE0889}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "框架", "框架", "{2C6BCFE4-581D-4BC8-91EC-BD9FA91B9605}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DBHelper", "DBHelper\DBHelper.csproj", "{6658427B-CB28-4F30-94D7-54541EB7D7FC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WCS.DebugTool", "WCS.DebugTool\WCS.DebugTool.csproj", "{6E83138E-F92B-40FB-BEB4-F5E02383B823}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PLC.Siemens", "PLC.Siemens\PLC.Siemens.csproj", "{8F6C4A79-98EA-4019-B72A-29290328185A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCS.Entity", "WCS.Entity\WCS.Entity.csproj", "{15418D7B-CA4F-4FE3-8179-E7D84FF9C167}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCS.Entity.Protocol", "Projects\永冠OPP\WCS.Entity.Protocol\WCS.Entity.Protocol.csproj", "{B5BA1EC4-EAA5-4003-B687-3159FB02E636}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "永冠OPP", "永冠OPP", "{37B86E98-86D4-41C0-A380-F56DD9431EFF}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{2D7E1E25-DEA4-4F74-9042-D3C41FA29999}"
+	ProjectSection(SolutionItems) = preProject
+		.editorconfig = .editorconfig
+	EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCS.Service", "Projects\永冠OPP\WCS.Service\WCS.Service.csproj", "{0C1638C8-68C1-4493-A731-186E58CEC4F0}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{609C1A57-7CFF-4BC1-B0C6-DA679C530D43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{609C1A57-7CFF-4BC1-B0C6-DA679C530D43}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{609C1A57-7CFF-4BC1-B0C6-DA679C530D43}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{609C1A57-7CFF-4BC1-B0C6-DA679C530D43}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6658427B-CB28-4F30-94D7-54541EB7D7FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6658427B-CB28-4F30-94D7-54541EB7D7FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6658427B-CB28-4F30-94D7-54541EB7D7FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6658427B-CB28-4F30-94D7-54541EB7D7FC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6E83138E-F92B-40FB-BEB4-F5E02383B823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6E83138E-F92B-40FB-BEB4-F5E02383B823}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6E83138E-F92B-40FB-BEB4-F5E02383B823}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6E83138E-F92B-40FB-BEB4-F5E02383B823}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8F6C4A79-98EA-4019-B72A-29290328185A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8F6C4A79-98EA-4019-B72A-29290328185A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8F6C4A79-98EA-4019-B72A-29290328185A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8F6C4A79-98EA-4019-B72A-29290328185A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{15418D7B-CA4F-4FE3-8179-E7D84FF9C167}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{15418D7B-CA4F-4FE3-8179-E7D84FF9C167}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{15418D7B-CA4F-4FE3-8179-E7D84FF9C167}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{15418D7B-CA4F-4FE3-8179-E7D84FF9C167}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B5BA1EC4-EAA5-4003-B687-3159FB02E636}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B5BA1EC4-EAA5-4003-B687-3159FB02E636}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B5BA1EC4-EAA5-4003-B687-3159FB02E636}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B5BA1EC4-EAA5-4003-B687-3159FB02E636}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C1638C8-68C1-4493-A731-186E58CEC4F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C1638C8-68C1-4493-A731-186E58CEC4F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C1638C8-68C1-4493-A731-186E58CEC4F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C1638C8-68C1-4493-A731-186E58CEC4F0}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{609C1A57-7CFF-4BC1-B0C6-DA679C530D43} = {2C6BCFE4-581D-4BC8-91EC-BD9FA91B9605}
+		{6658427B-CB28-4F30-94D7-54541EB7D7FC} = {2C6BCFE4-581D-4BC8-91EC-BD9FA91B9605}
+		{6E83138E-F92B-40FB-BEB4-F5E02383B823} = {2C6BCFE4-581D-4BC8-91EC-BD9FA91B9605}
+		{8F6C4A79-98EA-4019-B72A-29290328185A} = {2C6BCFE4-581D-4BC8-91EC-BD9FA91B9605}
+		{15418D7B-CA4F-4FE3-8179-E7D84FF9C167} = {2C6BCFE4-581D-4BC8-91EC-BD9FA91B9605}
+		{B5BA1EC4-EAA5-4003-B687-3159FB02E636} = {37B86E98-86D4-41C0-A380-F56DD9431EFF}
+		{37B86E98-86D4-41C0-A380-F56DD9431EFF} = {B500324F-34BF-4A32-ACDF-F1D4F3DE0889}
+		{0C1638C8-68C1-4493-A731-186E58CEC4F0} = {37B86E98-86D4-41C0-A380-F56DD9431EFF}
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {75D30B04-ADD6-4FC6-8D7E-FAD45B731BB4}
+	EndGlobalSection
+EndGlobal