1
czw
5 天以前 dc9fb292e8b057dbd0d45c60a1538d2d95727d67
2025Äê6ÔÂ12ÈÕ/AuxAllWCS/Scripts/Custom.json
@@ -677,8 +677,8 @@
      "Type": "VsCode",
      "Level": "Item",
      "Statement": "",
      "EditCode": "using Newtonsoft.Json;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.Concurrent;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing GZ.Modular.Redis;\r\nusing GZ.DB.Entity.OIDATABASE;\r\nusing GZ.DB.IRepository.OIDATABASE;\r\nusing GZ.DB.Repository.OIDATABASE;\r\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement;\r\nusing System.Windows.Interop;\r\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;\r\n\r\nnamespace GZ.Projects.AuxAllWCS\r\n{\r\n    public partial class AutoThread\r\n    {\r\n\r\n        private static AutoThread _instance;\r\n\r\n        // ç§æœ‰æž„造函数防止外部实例化\r\n        private AutoThread() { }\r\n\r\n        public static AutoThread Instance\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null)\r\n                {\r\n                    _instance = new AutoThread();\r\n                }\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        // çº¿ç¨‹å®‰å…¨çš„委托缓存\r\n        private static readonly ConcurrentDictionary<string, Delegate> _methodCache = new ConcurrentDictionary<string, Delegate>();\r\n\r\n        // æ–¹æ³•执行器\r\n        public static object InvokeMethod(object instance, string methodName, params object[] args)\r\n        {\r\n            var cacheKey = $\"{instance.GetType().FullName}_{methodName}\";\r\n\r\n            if (!_methodCache.TryGetValue(cacheKey, out var methodDelegate))\r\n            {\r\n                // èŽ·å–æ–¹æ³•ä¿¡æ¯\r\n                var methodInfo = instance.GetType().GetMethod(\r\n                    methodName,\r\n                    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\r\n\r\n                if (methodInfo == null)\r\n                    throw new MissingMethodException($\"Method {methodName} not found\");\r\n\r\n                // åˆ›å»ºå§”托并缓存\r\n                methodDelegate = Delegate.CreateDelegate(\r\n                    GetDelegateType(methodInfo),\r\n                    instance,\r\n                    methodInfo);\r\n\r\n                _methodCache.TryAdd(cacheKey, methodDelegate);\r\n            }\r\n\r\n            // æ‰§è¡Œå§”托\r\n            return methodDelegate.DynamicInvoke(args);\r\n        }\r\n\r\n        // æ ¹æ®æ–¹æ³•签名生成对应的委托类型\r\n        private static Type GetDelegateType(MethodInfo methodInfo)\r\n        {\r\n            var parameterTypes = methodInfo.GetParameters()\r\n                .Select(p => p.ParameterType)\r\n                .ToList();\r\n\r\n            if (methodInfo.ReturnType == typeof(void))\r\n            {\r\n                return System.Linq.Expressions.Expression.GetActionType(parameterTypes.ToArray());\r\n            }\r\n            else\r\n            {\r\n                parameterTypes.Add(methodInfo.ReturnType);\r\n                return System.Linq.Expressions.Expression.GetFuncType(parameterTypes.ToArray());\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// é…ç½®åˆå§‹åŒ–。\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        /// <param name=\"action\"></param>\r\n        public void ThreadSettingInit(Tag tag, Action action)\r\n        {\r\n            Console.WriteLine(\"初始化配置 çº¿ç¨‹ run \" + tag.Global.SettingsOver);\r\n            if (tag.Global.SettingsOver == 0)\r\n            {\r\n                action?.Invoke();\r\n                tag.Global.SettingsOver = 1;\r\n            }\r\n            else if (Settings.deviceInfos.Count == 0)\r\n            {\r\n                tag.Global.SettingsOver = 0;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// æ·é¡º1 ä¿¡å·å¤„理\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadJS1(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadJS1 æ·é¡º1 ä¿¡å·å¤„理 =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 2 && x.deviceName == \"Js捷顺1\");\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.Js1.D1212_LAST == 0 && TcpServer.GetBitdata(tag.Js1.D1212, 2) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[0]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js1.D1212_LAST = 1;\r\n                        RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js1.D1212_LAST == 1 && TcpServer.GetBitdata(tag.Js1.D1212, 2) == 0)\r\n                {\r\n                    //tag.Js1.D1212_LAST = 0; \r\n                    RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"0\", out string msg);\r\n                }\r\n                if (tag.Js1.D1213_LAST == 0 && TcpServer.GetBitdata(tag.Js1.D1212, 3) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[1]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js1.D1213_LAST = 1;\r\n                        RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js1.D1213_LAST == 1 && TcpServer.GetBitdata(tag.Js1.D1212, 3) == 0)\r\n                {\r\n                    //tag.Js1.D1213_LAST = 0;\r\n                    RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"0\", out string msg);\r\n                }\r\n            }\r\n        }\r\n        /// <summary>\r\n        /// æ·é¡º2 ä¿¡å·å¤„理\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadJS2(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadJS2 æ·é¡º2 ä¿¡å·å¤„理 =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 2 && x.deviceName == \"Js捷顺2\");\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.Js2.D1212_LAST == 0 && TcpServer.GetBitdata(tag.Js2.D1212, 2) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[0]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js2.D1212_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js2.D1212_LAST == 1 && TcpServer.GetBitdata(tag.Js2.D1212, 2) == 0)\r\n                {\r\n                    //tag.Js2.D1212_LAST = 0;\r\n\r\n                    RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"0\", out string msg);\r\n                }\r\n                if (tag.Js2.D1213_LAST == 0 && TcpServer.GetBitdata(tag.Js2.D1212, 3) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[1]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js2.D1213_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js2.D1213_LAST == 1 && TcpServer.GetBitdata(tag.Js2.D1213, 2) == 0)\r\n                {\r\n                    //tag.Js2.D1213_LAST = 0;\r\n\r\n                    RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"0\", out string msg);\r\n                }\r\n            }\r\n        }\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”1 å·¦\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr1L(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr1L ç»´å¸Œå°”1 å·¦ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"1\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr1.R44 && !tag.wxr1.R44_LAST && tag.wxr1.R10)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[0],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr1.R44_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    //TaskRepository ts = new TaskRepository();\r\n                    if (tag.wxr1.R10_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr1.R10)\r\n                        {\r\n                            tag.wxr1.R10_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr1.R10 = true;\r\n                                tag.wxr1.R44_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”1 å³\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr1R(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr1R ç»´å¸Œå°”1 å³ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"1\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr1.R46 && !tag.wxr1.R46_LAST && tag.wxr1.R11)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[1],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr1.R46_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr1.R11_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr1.R11)\r\n                        {\r\n                            tag.wxr1.R11_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr1.R11 = true;\r\n                                tag.wxr1.R46_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”2 å·¦\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr2L(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr2L ç»´å¸Œå°”2 å·¦ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"2\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr2.R44 && !tag.wxr2.R44_LAST && tag.wxr2.R10)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[0],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr2.R44_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr2.R10_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr2.R10)\r\n                        {\r\n                            tag.wxr2.R10_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr2.R10 = true;\r\n                                tag.wxr2.R44_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”2 å³\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr2R(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr2R ç»´å¸Œå°”2 å³ =================> \");\r\n\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"2\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr2.R46 && !tag.wxr2.R46_LAST && tag.wxr2.R11)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[1],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr2.R46_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[2], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr2.R11_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr2.R11)\r\n                        {\r\n                            tag.wxr2.R11_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr2.R11 = true;\r\n                                tag.wxr2.R46_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        public void ThreadTaskRun(Tag tag, Func<TaskEntity, bool> action)\r\n        {\r\n            Console.WriteLine($\"ThreadTaskRun ä»»åŠ¡ä¸‹å‘ =================> \");\r\n            LogHelper.Info(\"ThreadTaskRun ä»»åŠ¡ä¸‹å‘\");\r\n\r\n            ITaskRepository taskservice = new TaskRepository();\r\n            try\r\n            {\r\n                LogHelper.Info(\"任务下发  ARG ä»»åŠ¡ è¿›å…¥\");\r\n                #region AGV任务下发。\r\n\r\n                var tklist = taskservice.FindList(x => x.S_B_STATE == \"未执行\" && x.S_WORK_MODE == \"AGV\");\r\n                if (tklist.Any())\r\n                    foreach (var tk in tklist.GroupBy(item =>\r\n                    {\r\n                        var ticks = item.T_CREATE.Ticks;\r\n                        return new DateTime(ticks - ticks % (10 * TimeSpan.TicksPerMinute));\r\n                    }).OrderBy(x => x.Key))\r\n                    {\r\n                        var ts = tk.OrderByDescending(x => x.N_PRIORITY).ToList();\r\n                        foreach (var t in ts)\r\n                        {\r\n                            var b = false;\r\n                            b = action?.Invoke(t) ?? false; //new ViewModel().RunTask(t);\r\n\r\n                            if (b)\r\n                            {\r\n                                t.S_B_STATE = \"已推送\";\r\n                                taskservice.Update(t);\r\n                            }\r\n                        }\r\n                        break;\r\n                    }\r\n                //foreach (var tk in tklist.GroupBy(item =>\r\n                //{\r\n                //    var ticks = item.T_CREATE.Ticks;\r\n                //    return new DateTime(ticks - ticks % (10 * TimeSpan.TicksPerMinute));\r\n                //}).OrderBy(x => x.Key))\r\n                //if (tklist.Any())\r\n                //{\r\n\r\n                #endregion\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                LogHelper.Info(ex.Message + ex.StackTrace);\r\n            }\r\n            try\r\n            {\r\n                #region Rgv\r\n\r\n                LogHelper.Info($\"查看RGV ç”µé‡ï¼šã€{tag.RGV.R当前电量}】 å……电状态:【{tag.RGV.R充电状态}】 æ•…障代码:【{tag.RGV.RgvrunError}】\");\r\n\r\n                if (tag.RGV.taskend == 125)\r\n                {\r\n                    System.Threading.Thread.Sleep(3000);\r\n                    return;\r\n                }\r\n                LogHelper.Info(\"任务下发  Rgv ä»»åŠ¡ è¿›å…¥\");\r\n\r\n                var task1Isrun = false;\r\n                if (tag.RGV.ReadTask1No > 0 && tag.RGV.bit1taskOver != 1)\r\n                {\r\n                    task1Isrun = true;\r\n                    //if (tag.RGV.bit1taskOver_LAST == 1)\r\n                    //    RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                }\r\n                var task2Isrun = false;\r\n                if (tag.RGV.ReadTask2No > 0 && tag.RGV.bit2taskOver != 1)\r\n                {\r\n                    task2Isrun = true;\r\n                    //if (tag.RGV.bit2taskOver_LAST == 1)\r\n                    //    RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                }\r\n                if (task1Isrun || task2Isrun)\r\n                {\r\n                    string mes = \"\";\r\n                    if (task1Isrun)\r\n                        mes += tag.RGV.ReadTask1No + \"执行中...\";\r\n                    if (task2Isrun)\r\n                        mes += tag.RGV.ReadTask2No + \"执行中...\";\r\n                    LogHelper.Info($\"{mes} ä¸èƒ½ä¸‹å‘新任务。\");\r\n                    System.Threading.Thread.Sleep(3000);\r\n                    return; \r\n                }\r\n                var thisOver = 0;\r\n                TaskEntity task1 = null;\r\n                TaskEntity task2 = null;\r\n\r\n                LogHelper.Info($\"查看RGV 1工位任务》\");\r\n                if (tag.RGV.ReadTask1No > 0 && tag.RGV.bit1taskOver == 1)\r\n                {\r\n                    var taskno = tag.RGV.ReadTask1No;\r\n                    LogHelper.Info($\"RGV 1工位任务{tag.RGV.ReadTask1No}\");\r\n                    string tno = \"TN\" + (DateTime.Now.ToString(\"yy\")) + ((taskno.ToString()).PadLeft(8, '0'));\r\n                    task1 = taskservice.FindEntity(x => x.S_TASK_NO == tno);\r\n\r\n                    LogHelper.Info($\"RGV 1工位任务{JsonConvert.SerializeObject(task1)}.bit1taskOver_LAST:{tag.RGV.bit1taskOver_LAST}\");\r\n                    if (tag.RGV.bit1taskOver_LAST == 0 && task1 != null)\r\n                    {\r\n                        if (task1.S_B_STATE != \"完成\")\r\n                        {\r\n                            thisOver = 1;\r\n                            if (task1.S_B_STATE == \"取货完成\")\r\n                            {\r\n                                task1.S_B_STATE = \"完成\";\r\n                                tag.RGV.ReadTask1No = 0;\r\n                            }\r\n                            else\r\n                            {\r\n                                task1.S_B_STATE = \"取货完成\";\r\n                            }\r\n                            tag.RGV.bit1taskOver = 0;\r\n                            LogHelper.Info($\"RGV 1工位任务{task1.S_TASK_NO} çŠ¶æ€åˆ‡æ¢ä¸º{task1.S_B_STATE}\");\r\n                            //tag.RGV.bit1taskOver_LAST = 1;\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"1\", out string msg);\r\n                            LogHelper.Info($\"RGV 1工位任务写处理\");\r\n                            taskservice.Update(task1);\r\n                            LogHelper.Info($\"RGV 1工位任务更新。\");\r\n                        }\r\n                        else\r\n                        {\r\n                            LogHelper.Info(\"RGV1工位任务已经完成。\");\r\n                        }\r\n                    }\r\n                }\r\n                else if (tag.RGV.ReadTask1No == 0)\r\n                {\r\n                    LogHelper.Info($\"RGV 1工位没有任务》\");\r\n                }\r\n\r\n                LogHelper.Info($\"查看RGV 2工位任务》\");\r\n                if (tag.RGV.ReadTask2No > 0 && tag.RGV.bit2taskOver == 1)\r\n                {\r\n                    var taskno = tag.RGV.ReadTask2No;\r\n                    LogHelper.Info($\"RGV 2工位任务{tag.RGV.ReadTask2No}\");\r\n                    string tno = \"TN\" + (DateTime.Now.ToString(\"yy\")) + ((taskno.ToString()).PadLeft(8, '0'));\r\n                    task2 = taskservice.FindEntity(x => x.S_TASK_NO == tno);\r\n\r\n                    LogHelper.Info($\"RGV2工位任务{JsonConvert.SerializeObject(task2)}.bit2taskOver_LAST:{tag.RGV.bit2taskOver_LAST}\");\r\n                    if (tag.RGV.bit2taskOver_LAST == 0 && task2 != null)\r\n                    {\r\n                        if (task2.S_B_STATE != \"完成\")\r\n                        {\r\n                            thisOver = 2;\r\n                            if (task2.S_B_STATE == \"取货完成\")\r\n                            {\r\n                                task2.S_B_STATE = \"完成\";\r\n                                tag.RGV.ReadTask2No = 0;\r\n                            }\r\n                            else\r\n                            {\r\n                                task2.S_B_STATE = \"取货完成\";\r\n                            }\r\n                            tag.RGV.bit2taskOver = 0;\r\n                            LogHelper.Info($\"RGV 2工位任务{task2.S_TASK_NO} çŠ¶æ€åˆ‡æ¢ä¸º{task2.S_B_STATE}\");\r\n                            RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"1\", out string msg);\r\n                            LogHelper.Info($\"RGV 2工位任务写处理\");\r\n                            taskservice.Update(task2);\r\n                            LogHelper.Info($\"RGV 2工位任务更新。\");\r\n                        }\r\n                        else\r\n                        {\r\n                            LogHelper.Info(\"RGV2工位任务已经完成。\");\r\n                        }\r\n                    }\r\n                }\r\n                else if (tag.RGV.ReadTask2No == 0)\r\n                {\r\n                    LogHelper.Info($\"RGV 2工位没有任务》\");\r\n                }\r\n\r\n\r\n\r\n                //if (thisOver > 0)\r\n                //{\r\n                //    var v2 = RedisHelper.Get<WriteGroupEntity>(\"RGVQueue\", out string rev);\r\n                //    if (v2 != null)\r\n                //    {\r\n                //        LogHelper.Info($\"RGVQueue è¯»åˆ°ç»“æžœ-{JsonConvert.SerializeObject(v2)}  \\n ä¸‹å‘前进行清除。\");\r\n                //        var b = RedisHelper.Remove(\"RGVQueue\", out rev);\r\n                //    }\r\n                //}\r\n\r\n                ///1 æœ‰è´§  å°±2 å–。  1 æ²¡è´§ å°±2 å¸è´§ï¼Œ éƒ½æœ‰è´§  å°±1卸货。 éƒ½æ²¡è´§ å°±1卸\r\n                var tklist = taskservice.FindList(x => x.S_B_STATE == \"未执行\" && x.S_WORK_MODE == \"RGV\").OrderBy(x => x.T_CREATE).ToList();\r\n                if (task1 != null && task1.S_B_STATE != \"完成\") //1有任务\r\n                {\r\n                    if (task2 != null && task2.S_B_STATE != \"完成\")// 1 æœ‰ä»»åŠ¡  2 æœ‰ä»»åŠ¡ã€‚ \r\n                    {\r\n                        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 ä¹Ÿæœ‰ä»»åŠ¡{task2.S_TASK_NO}。 å¼€å§‹å·¥ä½1 å¸è´§ã€‚\");\r\n                        tag.RGV.workMod = 1;\r\n                        tag.RGV.taskmod = 2;\r\n                        tag.RGV.taskno1 = Convert.ToUInt32(task1.S_TASK_NO.Substring(4));\r\n                        tag.RGV.task1do = Convert.ToUInt16(task1.S_END_LOC);\r\n                        System.Threading.Thread.Sleep(750);\r\n                        //RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                        //tag.RGV.taskend = 125;\r\n                        //Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\");\r\n\r\n                        LogHelper.Info($\"{task1.S_TASK_NO}> bit1taskOver_LAST å†™ 0\");\r\n                        RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                        LogHelper.Info($\"{task1.S_TASK_NO}> end å†™ 125\");\r\n                        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                    }\r\n                    else //1有任务  2 æ²¡ä»»åŠ¡ã€‚  \r\n                    {\r\n\r\n                        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§å–货任务。\");\r\n\r\n                        var leftSide = new List<string> { \"1023\", \"1020\" };\r\n                        var RightSide = new List<string> { \"1002\", \"1008\", \"1010\", \"1016\" };\r\n                        bool creT2 = false;\r\n\r\n                        // 2号 ä¼˜å…ˆç»™ 1020  1008  1016\r\n                        var t2 = tklist.OrderBy(x => x.T_CREATE).ToList().Find(x => x.S_START_LOC == \"1020\" || x.S_START_LOC == \"1008\" || x.S_START_LOC == \"1016\");\r\n                        if (t2 != null)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾1020  1008  1016取货任务{t2.S_TASK_NO}。\");\r\n                            tag.RGV.workMod = 2;\r\n                            tag.RGV.taskmod = 1;\r\n                            tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                            tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                            t2.S_B_STATE = \"已推送\";\r\n                            taskservice.Update(t2);\r\n                            creT2 = true;\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                            RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                        ////2 å¦‚果有同侧取货任务。就取。没有\r\n                        //else if (leftSide.Contains(task1.S_START_LOC))\r\n                        //{\r\n                        //    leftSide.Remove(task1.S_START_LOC);\r\n                        //    var lsde = leftSide.FirstOrDefault();\r\n                        //    t2 = tklist.Find(x => x.S_START_LOC == lsde && x.S_END_LOC != \"1017\");\r\n                        //    if (t2 != null) //同侧取货任务。\r\n                        //    {\r\n                        //        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§å–货任务{t2.S_TASK_NO}。\");\r\n                        //        tag.RGV.workMod = 2;\r\n                        //        tag.RGV.taskmod = 1;\r\n                        //        tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                        //        tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                        //        t2.S_B_STATE = \"已推送\";\r\n                        //        taskservice.Update(t2);\r\n                        //        creT2 = true;\r\n                        //        System.Threading.Thread.Sleep(750);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                        //        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                        //        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        //    }\r\n                        //}\r\n                        //else if (RightSide.Contains(task1.S_START_LOC))\r\n                        //{\r\n                        //    RightSide.Remove(task1.S_START_LOC);\r\n                        //    t2 = tklist.Find(x => RightSide.Contains(x.S_START_LOC) && x.S_END_LOC != \"1017\");\r\n                        //    if (t2 != null) //同侧取货任务。\r\n                        //    {\r\n                        //        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§ 1002,1010 å–货任务{t2.S_TASK_NO}。\");\r\n                        //        tag.RGV.workMod = 2;\r\n                        //        tag.RGV.taskmod = 1;\r\n                        //        tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                        //        tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                        //        t2.S_B_STATE = \"已推送\";\r\n                        //        taskservice.Update(t2);\r\n                        //        creT2 = true;\r\n                        //        System.Threading.Thread.Sleep(750);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 125\");\r\n                        //        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                        //        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        //    }\r\n                        //}\r\n                        else //1 ç›´æŽ¥å¸è´§ã€‚ \r\n                        //if (!creT2)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ²¡æœ‰åŒä¾§å–货任务 1工位卸货。\");\r\n                            tag.RGV.workMod = 1;\r\n                            tag.RGV.taskmod = 2;\r\n                            tag.RGV.taskno1 = Convert.ToUInt32(task1.S_TASK_NO.Substring(4));\r\n                            tag.RGV.task1do = Convert.ToUInt16(task1.S_END_LOC);\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{task1.S_TASK_NO}> bit1taskOver_LAST å†™ 0\");\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{task1.S_TASK_NO}> taskend å†™ 0\");\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (task2 != null && task2.S_B_STATE != \"完成\")// 1 æ²¡ä»»åŠ¡  2 æœ‰ä»»åŠ¡ã€‚ \r\n                    {\r\n                        LogHelper.Info($\"查看RGV 1工位没任务,工位2 æœ‰ä»»åŠ¡{task2.S_TASK_NO}。工位2卸货。。\");\r\n                        //2 å¸è´§ã€‚\r\n                        tag.RGV.workMod = 2;\r\n                        tag.RGV.taskmod = 2;\r\n                        tag.RGV.taskno2 = Convert.ToUInt32(task2.S_TASK_NO.Substring(4));\r\n                        tag.RGV.task2do = Convert.ToUInt16(task2.S_END_LOC);\r\n                        System.Threading.Thread.Sleep(750);\r\n                        LogHelper.Info($\"{task2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //tag.RGV.taskend = 125;\r\n                        LogHelper.Info($\"{task2.S_TASK_NO}> taskend å†™125\");\r\n                        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                    }\r\n                    else if (tklist.Any()) //1mei ä»»åŠ¡  2 æ²¡ä»»åŠ¡ã€‚\r\n                    {\r\n                        LogHelper.Info($\"查看RGV 1工位没任务,工位2 ä¹Ÿæ²¡ä»»åŠ¡ã€‚ä¼˜å…ˆ1工位终点1017任务。。\");\r\n                        //、下 1017任务 ç»™1号工位。\r\n                        //var lss = tklist.Take(2).ToList();\r\n                        var e1017first = tklist.Find(x => x.S_START_LOC == \"1002\" || x.S_START_LOC == \"1010\" || x.S_START_LOC == \"1023\");\r\n                        //if (e1017first != null)\r\n                        //{\r\n                        //    e1017first = tklist.FirstOrDefault();\r\n                        //}\r\n                        if (e1017first != null)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 ä»»åŠ¡å·¥ä½2 æ²¡ä»»åŠ¡ã€‚ 1002  1010  1023取货任务{e1017first.S_TASK_NO}。\");\r\n                            tag.RGV.workMod = 1;\r\n                            tag.RGV.taskmod = 1;\r\n                            uint tno = Convert.ToUInt32(e1017first.S_TASK_NO.Substring(4));\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> è½¬æ¢åŽä»»åŠ¡å·{tno} å¼€å§‹å†™å…¥ã€‚\");\r\n                            tag.RGV.taskno1 = tno;\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}>开始写入 task1do>>{e1017first.S_START_LOC}。\");\r\n                            tag.RGV.task1do = Convert.ToUInt16(e1017first.S_START_LOC);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> æ›´æ–°ä»»åŠ¡ã€‚\");\r\n                            e1017first.S_B_STATE = \"已推送\";\r\n                            taskservice.Update(e1017first);\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> bit1taskOver_LAST å†™0\");\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> taskend å†™125\");\r\n                            //tag.RGV.taskend=125\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                        else\r\n                        {\r\n                            var t2 = tklist.OrderBy(x => x.T_CREATE).ToList().Find(x => x.S_START_LOC == \"1020\" || x.S_START_LOC == \"1008\" || x.S_START_LOC == \"1016\");\r\n                            if (tklist != null)\r\n                            {\r\n                                LogHelper.Info($\"查看RGV1 æ²¡ä»»åŠ¡å·¥ä½2 æ²¡ä»»åŠ¡ã€‚ æ‰¾1020  1008  1016取货任务{t2.S_TASK_NO}。\");\r\n                                tag.RGV.workMod = 2;\r\n                                tag.RGV.taskmod = 1;\r\n                                tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                                tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                                t2.S_B_STATE = \"已推送\";\r\n                                taskservice.Update(t2);\r\n                                System.Threading.Thread.Sleep(750);\r\n                                LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                                RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                                LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                                Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                LogHelper.Info($\"rgv å¤„理完成。taskend 125\");\r\n                #endregion\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                LogHelper.Info(ex.Message + ex.StackTrace);\r\n            }\r\n        }\r\n\r\n\r\n        public void ThreadGrats(Tag tag, Action<HaiKangOrderInfo> continueTask)\r\n        {\r\n            Console.WriteLine($\"ThreadGrats å…‰æ …处理 =================> \");\r\n            var taskCOdes = new List<string> { \"Sarrive\", \"Srelease\", \"Earrive\", \"Erelease\" };\r\n            TaskActRepository taskActRepository = new TaskActRepository();\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            var requires = taskActRepository.FindList(x => taskCOdes.Contains(x.S_ACTION_CODE) && x.N_CREATEMETHOD == 0);\r\n            foreach (var item in requires)\r\n            {\r\n                var tin = taskCOdes.IndexOf(item.S_ACTION_CODE);\r\n                if (tin == -1)\r\n                {\r\n                    item.N_CREATEMETHOD = -1;\r\n                    taskActRepository.Update(item);\r\n                    continue;\r\n                }\r\n                //var task = taskRepository.FindEntity(x => x.S_TASK_NO == item.S_TASK_NO);\r\n                string loc = \"\";\r\n                if (tin < 2)\r\n                {\r\n                    loc = item.S_START_LOC;\r\n                }\r\n                else\r\n                {\r\n                    loc = item.S_END_LOC;\r\n                }\r\n                if (loc == null) continue; else loc = loc.Trim();\r\n                bool goin = tin % 2 == 0;\r\n                bool continuuuuu = false;\r\n                var dev = Settings.deviceInfos.Find(x => x.location.Contains(loc));\r\n                if (dev != null)\r\n                {\r\n                    var V = dev.location.ToList().FindIndex(x => x == loc) == 0;\r\n                    //车走了  å¼€å…‰æ …\r\n                    if (!goin)\r\n                    {\r\n                        if (dev.deviceType == 1)\r\n                        {\r\n                            LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"R02\" : \"R04\"), \"true\", dev.deviceName + \"Queue\"));\r\n                            Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"R02\" : \"R04\"), \"true\", dev.deviceName + \"Queue\");\r\n\r\n                        }\r\n                        else if (dev.deviceType == 2)\r\n                        {\r\n                            LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"D1222\" : \"D1223\"), \"1\", dev.deviceName + \"Queue\"));\r\n                            Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"D1222\" : \"D1223\"), \"1\", dev.deviceName + \"Queue\");\r\n                        }\r\n\r\n                        item.N_CREATEMETHOD = 1;\r\n                        taskActRepository.Update(item);\r\n                    }\r\n                    //车要进入交互。\r\n                    else\r\n                    {\r\n                        if (dev.deviceType == 1)\r\n                        {\r\n                            var tf = Conn.默认Redis.GetValue(dev.deviceName + \".\" + (V ? \"R50\" : \"R52\"));//读关闭状态\r\n                            if (tf?.ToLower() == \"true\")\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚ å·²ç»å…³é—­ï¼\");\r\n                                continuuuuu = true;\r\n                            }\r\n                            else\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"R01\" : \"R03\"), \"true\", dev.deviceName + \"Queue\"));\r\n                                Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"R01\" : \"R03\"), \"true\", dev.deviceName + \"Queue\");\r\n                            }\r\n\r\n                        }\r\n                        else if (dev.deviceType == 2)\r\n                        {\r\n                            var tf = Conn.默认Redis.GetValue(dev.deviceName + \".D1202\");\r\n                            int numm = int.Parse(string.IsNullOrEmpty(tf) ? \"0\" : tf);\r\n                            if (TcpServer.GetBitdata(numm, (V ? 0 : 1)) == 1)\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚ å·²ç»å…³é—­ï¼\");\r\n                                continuuuuu = true;\r\n                            }\r\n                            else\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"D1220\" : \"D1221\"), dev.deviceName + \"Queue\"));\r\n                                Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"D1220\" : \"D1221\"), \"1\", dev.deviceName + \"Queue\");\r\n                            }\r\n                        }\r\n\r\n                    }\r\n\r\n                }\r\n                if (continuuuuu)\r\n                {\r\n                    LogHelper.Info($\"{item.S_TASK_NO}{item.S_ACTION_CODE} è½¦è¾†å‘送继续任务!\");\r\n                    continueTask?.Invoke(new HaiKangOrderInfo\r\n                    {\r\n                        reqCode = item.S_ID.Replace(\"-\", \"\"),\r\n                        taskCode = item.S_TASK_NO\r\n                    });\r\n                    item.N_CREATEMETHOD = 1;\r\n                    taskActRepository.Update(item);\r\n                }\r\n            }\r\n            System.Threading.Thread.Sleep(3000);\r\n            //重置信号\r\n            foreach (var dev in Settings.deviceInfos.FindAll(x => x.deviceType == 2))\r\n            {\r\n                var tf = Conn.默认Redis.GetValue(dev.deviceName + \".D1202\");\r\n                int numm = int.Parse(string.IsNullOrEmpty(tf) ? \"0\" : tf);\r\n                if (TcpServer.GetBitdata(numm, 0) == 0)\r\n                {\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1220\", \"0\", dev.deviceName + \"Queue\");\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1222\", \"0\", dev.deviceName + \"Queue\");\r\n                }\r\n                else if (TcpServer.GetBitdata(numm, 1) == 0)\r\n                {\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1221\", \"0\", dev.deviceName + \"Queue\");\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1223\", \"0\", dev.deviceName + \"Queue\");\r\n                }\r\n            }\r\n\r\n        }\r\n        /// <summary>\r\n        /// 1020  1023空框下线\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadEdown(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadEdown 20 23 = ç©ºä¸‹æ£€æµ‹ =================> \");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1020\", \"1023\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} ç©ºä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}  \");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n                    try\r\n                    {\r\n                        var listtep = new List<string>();\r\n                        if (Bssx == \"1020\")\r\n                        {\r\n                            if (tag.SF下料位.RArrive1003 == 1)\r\n                            {\r\n                                listtep = new List<string> { \"1012\", \"1004\" };\r\n                            }\r\n                            else\r\n                            {\r\n                                listtep = new List<string> { \"1004\", \"1012\" };\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            if (tag.SF下料位.RArrive1005 == 1)\r\n                            {\r\n                                listtep = new List<string> { \"1014\", \"1006\" };\r\n                            }\r\n                            else\r\n                            {\r\n                                listtep = new List<string> { \"1006\", \"1014\" };\r\n                            }\r\n                        }\r\n\r\n                        foreach (var item in listtep)//(Bssx == \"1020\" ? new string[] { \"1004\", \"1012\" } : new string[] { \"1006\", \"1014\" }))\r\n                        {\r\n                            var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                            var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                            if (R5 == 5 && R5空闲_LAST == 0 && task == null)\r\n                            {\r\n                                task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                                msg = \"\";\r\n                                if (task != null)\r\n                                {\r\n                                    Console.WriteLine($\" {item}有正在 [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                                    LogHelper.Info($\" {item}有正在 [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                                    continue;\r\n                                }\r\n\r\n                                var b = TaskProcess.CreateTask(\"\", Bssx, item, \"空上RGV\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                                if (b)\r\n                                {\r\n                                    LogHelper.Debug($\"输送线RGV空托任务 from:{Bssx}>to {item}开始创建成功\");\r\n                                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                                    RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out msg);\r\n                                    //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                                    break;\r\n                                }\r\n                            }\r\n                            else if (R5 != 5 && R5空闲_LAST == 1)\r\n                            {\r\n                                RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out msg);\r\n                                //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"0\", $\"S{item}ReadQueue\");\r\n                            }\r\n                        }\r\n                        System.Threading.Thread.Sleep(1000);\r\n                    }\r\n                    catch (Exception ex)\r\n                    {\r\n                        LogHelper.Error(ex.Message, ex);\r\n                        Console.WriteLine(ex.Message + ex.StackTrace);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"0\", $\"S{Bssx}ReadQueue\");\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n\r\n            foreach (var item in new string[] { \"1004\", \"1012\", \"1006\", \"1014\", \"1026\", \"1017\" })\r\n            {\r\n                var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                if (R5 != 5 && R5空闲_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"0\", $\"S{item}ReadQueue\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ThreadDdown(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadDdown 08 10 ==================> 1026\");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1008\", \"1016\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} æ»¡ä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}\");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n\r\n                    var item = \"1026\";\r\n                    var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                    var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                    if (R5 == 5 && R5空闲_LAST == 0)\r\n                    {\r\n                        task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                        msg = \"\";\r\n                        if (task != null)\r\n                        {\r\n                            Console.WriteLine($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            LogHelper.Info($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            continue;\r\n                        }\r\n                        var b = TaskProcess.CreateTask(\"\", Bssx, item, \"满转1026\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                        if (b)\r\n                        {\r\n                            RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                            RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out string msg2);\r\n                            //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                            //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                            break;\r\n                        }\r\n                    }\r\n                    else if (R5 != 5 && R5空闲_LAST == 1)\r\n                    {\r\n                        RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg2);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"0\", $\"S{Bssx}ReadQueue\");\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n        }\r\n\r\n        public void Thread0210Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Thread0210Down ==================>\");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1002\", \"1010\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} æ»¡ä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}\");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n                    var item = \"1017\";\r\n                    var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                    var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                    if (R5 == 5 && R5空闲_LAST == 0)\r\n                    {\r\n                        task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                        msg = \"\";\r\n                        if (task != null)\r\n                        {\r\n                            Console.WriteLine($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            LogHelper.Info($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            continue;\r\n                        }\r\n                        var b = TaskProcess.CreateTask(\"\", Bssx, item, \"满转1017\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                        if (b)\r\n                        {\r\n                            RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                            RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out string msg1);\r\n                            //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                            //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                            break;\r\n                        }\r\n                    }\r\n                    else if (R5 != 5 && R5空闲_LAST == 1)\r\n                    {\r\n                        RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg1);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n        }\r\n\r\n\r\n        public void Thread下料位检测(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Thread下料位检测    =====>\");\r\n            foreach (var ssx in new string[] { \"1003\", \"1005\", \"1011\", \"1013\" })\r\n            {\r\n                var RArrive = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"FNK1003051113.RArrive{ssx}\"), typeof(System.UInt16));\r\n                var RArriveLast = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"FNK1003051113.RArrive{ssx}_LAST\"), typeof(System.UInt16));\r\n                if (RArrive == 1 && RArriveLast == 0)\r\n                {\r\n                    if (ssx == \"1005\" && tag.SF下料位.WRelease1005 == 0)\r\n                    {\r\n                        tag.FNK1.D2215 = 1;\r\n                        //tag.SF下料位.RArrive1005_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1005_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1005 = 0;\r\n                        //tag.SF下料位.WSafe0305 = 0;\r\n                    }\r\n                    else if (ssx == \"1003\" && tag.SF下料位.WRelease1003 == 0)\r\n                    {\r\n                        tag.FNK1.D2210 = 1;\r\n                        //tag.SF下料位.RArrive1003_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1003_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1003 = 0;\r\n                        //tag.SF下料位.WSafe0305 = 0;\r\n                    }\r\n                    else if (ssx == \"1013\" && tag.SF下料位.WRelease1013 == 0)\r\n                    {\r\n                        tag.FNK2.D2215 = 1;\r\n                        //tag.SF下料位.RArrive1013_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1013_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1013 = 0;\r\n                        //tag.SF下料位.WSafe1113 = 0;\r\n                    }\r\n                    else if (ssx == \"1011\" && tag.SF下料位.WRelease1011 == 0)\r\n                    {\r\n                        tag.FNK2.D2210 = 1;\r\n                        //tag.SF下料位.RArrive1011_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1011_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1011 = 0;\r\n                        //tag.SF下料位.WSafe1113 = 0;\r\n                    }\r\n                }\r\n                else if (RArrive == 0 && RArriveLast == 1)\r\n                {\r\n                    RedisHelper.Add($\"FNK1003051113.RArrive{ssx}_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"FNK1003051113.RArrive{ssx}_LAST\", \"0\", $\"FNK1003051113Queue\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ThreadFNK1Over(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadFNK1Over    =====>\");\r\n            if (tag.FNK1.D2217 == 1 && tag.FNK1.D2217_LAST == 0)\r\n            {\r\n                tag.FNK1.D2215 = 0;\r\n                //tag.FNK1.D2212_LAST = 1;\r\n                RedisHelper.Add($\"p发那科1下线.D2217_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1005 = 1;\r\n                tag.SF下料位.WSafe0305 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1005_LAST\", \"0\", out msg);\r\n            }\r\n            if (tag.FNK1.D2216 == 1)\r\n                tag.FNK1.D2215 = 0;\r\n            else if (tag.FNK1.D2217 == 0 && tag.FNK1.D2217_LAST == 1)\r\n                //tag.FNK1.D2217_LAST = 0;\r\n                RedisHelper.Add($\"p发那科1下线.D2217_LAST\", \"0\", out string msg);\r\n\r\n            if (tag.FNK1.D2212 == 1 && tag.FNK1.D2212_LAST == 0)\r\n            {\r\n                tag.FNK1.D2210 = 0;\r\n                //tag.FNK1.D2217_LAST = 1;\r\n                RedisHelper.Add($\"p发那科1下线.D2212_LAST\", \"1\", out string msg);\r\n                tag.SF下料位.WRelease1003 = 1;\r\n                tag.SF下料位.WSafe0305 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1003_LAST\", \"0\", out msg);\r\n            }\r\n            //else if (tag.FNK1.D2211 == 1)\r\n            //    tag.FNK1.D2210 = 0;\r\n            else if (tag.FNK1.D2212 == 0 && tag.FNK1.D2212_LAST == 1)\r\n            {\r\n                //tag.FNK1.D2212_LAST = 0;\r\n                RedisHelper.Add($\"p发那科1下线.D2212_LAST\", \"0\", out string msg);\r\n            }\r\n            if (tag.FNK1.D2211 == 1)\r\n                tag.FNK1.D2210 = 0;\r\n\r\n        }\r\n        public void ThreadFNK2Over(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadFNK2Over    =====>\");\r\n            if (tag.FNK2.D2217 == 1 && tag.FNK2.D2217_LAST == 0)\r\n            {\r\n                tag.FNK2.D2215 = 0;\r\n                //tag.FNK2.D2212_LAST = 1;\r\n                RedisHelper.Add($\"p发那科2下线.D2217_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1013 = 1;\r\n                tag.SF下料位.WSafe1113 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1013_LAST\", \"0\", out msg);\r\n            }\r\n            else if (tag.FNK2.D2217 == 0 && tag.FNK2.D2217_LAST == 1)\r\n                //tag.FNK2.D2217_LAST = 0;\r\n                RedisHelper.Add($\"p发那科2下线.D2217_LAST\", \"0\", out string msg);\r\n\r\n            if (tag.FNK2.D2216 == 1)\r\n                tag.FNK2.D2215 = 0;\r\n\r\n            if (tag.FNK2.D2212 == 1 && tag.FNK2.D2212_LAST == 0)\r\n            {\r\n                tag.FNK2.D2210 = 0;\r\n                //tag.FNK2.D2217_LAST = 1;\r\n                RedisHelper.Add($\"p发那科2下线.D2212_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1011 = 1;\r\n                tag.SF下料位.WSafe1113 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1011_LAST\", \"0\", out msg);\r\n            }\r\n            else if (tag.FNK2.D2212 == 0 && tag.FNK2.D2212_LAST == 1)\r\n            {\r\n                //tag.FNK2.D2212_LAST = 0;\r\n                RedisHelper.Add($\"p发那科2下线.D2212_LAST\", \"0\", out string msg);\r\n            }\r\n            if (tag.FNK2.D2211 == 1)\r\n                tag.FNK2.D2210 = 0;\r\n\r\n        }\r\n\r\n        public void Thread1019Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"1019任务状态:   =====>\");\r\n            Console.WriteLine($\"1019任务状态:{tag.SA1019.RtaskState}- barcode:{tag.SA1019.R托盘码}- ç©ºé—²{tag.SA1019.R5空闲}\");\r\n        }\r\n        public void Thread1025Up(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1025 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA1025 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1025.RtaskState}- ç©ºé—²{tag.SA1025.R5空闲}\");\r\n        }\r\n        public void Thread1022Up(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1022    =====>\");\r\n            Console.WriteLine($\"SA1022 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1022.RtaskState}- ç©ºé—²{tag.SA1022.R5空闲}\");\r\n        }\r\n        public void Thread1030Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1030 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA1030 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1030.RtaskState}- ç©ºé—²{tag.SA1030.R5空闲}-->对应终点2001>空闲5:{tag.SA2001.R5空闲}\");\r\n        }\r\n        public void Thread2030Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA2030 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA2030 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA2030.RtaskState}- ç©ºé—²{tag.SA2030.R5空闲} - barcode:{tag.SA2030.R托盘码}\");\r\n        }\r\n\r\n\r\n    }\r\n}\r\n",
      "Code": "using Newtonsoft.Json;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.Concurrent;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing GZ.Modular.Redis;\r\nusing GZ.DB.Entity.OIDATABASE;\r\nusing GZ.DB.IRepository.OIDATABASE;\r\nusing GZ.DB.Repository.OIDATABASE;\r\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement;\r\nusing System.Windows.Interop;\r\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;\r\n\r\nnamespace GZ.Projects.AuxAllWCS\r\n{\r\n    public partial class AutoThread\r\n    {\r\n\r\n        private static AutoThread _instance;\r\n\r\n        // ç§æœ‰æž„造函数防止外部实例化\r\n        private AutoThread() { }\r\n\r\n        public static AutoThread Instance\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null)\r\n                {\r\n                    _instance = new AutoThread();\r\n                }\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        // çº¿ç¨‹å®‰å…¨çš„委托缓存\r\n        private static readonly ConcurrentDictionary<string, Delegate> _methodCache = new ConcurrentDictionary<string, Delegate>();\r\n\r\n        // æ–¹æ³•执行器\r\n        public static object InvokeMethod(object instance, string methodName, params object[] args)\r\n        {\r\n            var cacheKey = $\"{instance.GetType().FullName}_{methodName}\";\r\n\r\n            if (!_methodCache.TryGetValue(cacheKey, out var methodDelegate))\r\n            {\r\n                // èŽ·å–æ–¹æ³•ä¿¡æ¯\r\n                var methodInfo = instance.GetType().GetMethod(\r\n                    methodName,\r\n                    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\r\n\r\n                if (methodInfo == null)\r\n                    throw new MissingMethodException($\"Method {methodName} not found\");\r\n\r\n                // åˆ›å»ºå§”托并缓存\r\n                methodDelegate = Delegate.CreateDelegate(\r\n                    GetDelegateType(methodInfo),\r\n                    instance,\r\n                    methodInfo);\r\n\r\n                _methodCache.TryAdd(cacheKey, methodDelegate);\r\n            }\r\n\r\n            // æ‰§è¡Œå§”托\r\n            return methodDelegate.DynamicInvoke(args);\r\n        }\r\n\r\n        // æ ¹æ®æ–¹æ³•签名生成对应的委托类型\r\n        private static Type GetDelegateType(MethodInfo methodInfo)\r\n        {\r\n            var parameterTypes = methodInfo.GetParameters()\r\n                .Select(p => p.ParameterType)\r\n                .ToList();\r\n\r\n            if (methodInfo.ReturnType == typeof(void))\r\n            {\r\n                return System.Linq.Expressions.Expression.GetActionType(parameterTypes.ToArray());\r\n            }\r\n            else\r\n            {\r\n                parameterTypes.Add(methodInfo.ReturnType);\r\n                return System.Linq.Expressions.Expression.GetFuncType(parameterTypes.ToArray());\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// é…ç½®åˆå§‹åŒ–。\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        /// <param name=\"action\"></param>\r\n        public void ThreadSettingInit(Tag tag, Action action)\r\n        {\r\n            Console.WriteLine(\"初始化配置 çº¿ç¨‹ run \" + tag.Global.SettingsOver);\r\n            if (tag.Global.SettingsOver == 0)\r\n            {\r\n                action?.Invoke();\r\n                tag.Global.SettingsOver = 1;\r\n            }\r\n            else if (Settings.deviceInfos.Count == 0)\r\n            {\r\n                tag.Global.SettingsOver = 0;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// æ·é¡º1 ä¿¡å·å¤„理\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadJS1(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadJS1 æ·é¡º1 ä¿¡å·å¤„理 =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 2 && x.deviceName == \"Js捷顺1\");\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.Js1.D1212_LAST == 0 && TcpServer.GetBitdata(tag.Js1.D1212, 2) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[0]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js1.D1212_LAST = 1;\r\n                        RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js1.D1212_LAST == 1 && TcpServer.GetBitdata(tag.Js1.D1212, 2) == 0)\r\n                {\r\n                    //tag.Js1.D1212_LAST = 0; \r\n                    RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"0\", out string msg);\r\n                }\r\n                if (tag.Js1.D1213_LAST == 0 && TcpServer.GetBitdata(tag.Js1.D1212, 3) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[1]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js1.D1213_LAST = 1;\r\n                        RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js1.D1213_LAST == 1 && TcpServer.GetBitdata(tag.Js1.D1212, 3) == 0)\r\n                {\r\n                    //tag.Js1.D1213_LAST = 0;\r\n                    RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"0\", out string msg);\r\n                }\r\n            }\r\n        }\r\n        /// <summary>\r\n        /// æ·é¡º2 ä¿¡å·å¤„理\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadJS2(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadJS2 æ·é¡º2 ä¿¡å·å¤„理 =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 2 && x.deviceName == \"Js捷顺2\");\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.Js2.D1212_LAST == 0 && TcpServer.GetBitdata(tag.Js2.D1212, 2) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[0]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js2.D1212_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js2.D1212_LAST == 1 && TcpServer.GetBitdata(tag.Js2.D1212, 2) == 0)\r\n                {\r\n                    //tag.Js2.D1212_LAST = 0;\r\n\r\n                    RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"0\", out string msg);\r\n                }\r\n                if (tag.Js2.D1213_LAST == 0 && TcpServer.GetBitdata(tag.Js2.D1212, 3) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[1]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js2.D1213_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js2.D1213_LAST == 1 && TcpServer.GetBitdata(tag.Js2.D1213, 2) == 0)\r\n                {\r\n                    //tag.Js2.D1213_LAST = 0;\r\n\r\n                    RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"0\", out string msg);\r\n                }\r\n            }\r\n        }\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”1 å·¦\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr1L(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr1L ç»´å¸Œå°”1 å·¦ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"1\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr1.R44 && !tag.wxr1.R44_LAST && tag.wxr1.R10)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[0],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr1.R44_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    //TaskRepository ts = new TaskRepository();\r\n                    if (tag.wxr1.R10_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr1.R10)\r\n                        {\r\n                            tag.wxr1.R10_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr1.R10 = true;\r\n                                tag.wxr1.R44_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”1 å³\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr1R(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr1R ç»´å¸Œå°”1 å³ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"1\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr1.R46 && !tag.wxr1.R46_LAST && tag.wxr1.R11)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[1],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr1.R46_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr1.R11_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr1.R11)\r\n                        {\r\n                            tag.wxr1.R11_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr1.R11 = true;\r\n                                tag.wxr1.R46_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”2 å·¦\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr2L(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr2L ç»´å¸Œå°”2 å·¦ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"2\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr2.R44 && !tag.wxr2.R44_LAST && tag.wxr2.R10)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[0],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr2.R44_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr2.R10_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr2.R10)\r\n                        {\r\n                            tag.wxr2.R10_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr2.R10 = true;\r\n                                tag.wxr2.R44_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”2 å³\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr2R(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr2R ç»´å¸Œå°”2 å³ =================> \");\r\n\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"2\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr2.R46 && !tag.wxr2.R46_LAST && tag.wxr2.R11)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[1],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr2.R46_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[2], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr2.R11_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr2.R11)\r\n                        {\r\n                            tag.wxr2.R11_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr2.R11 = true;\r\n                                tag.wxr2.R46_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        public void ThreadTaskRun(Tag tag, Func<TaskEntity, bool> action)\r\n        {\r\n            Console.WriteLine($\"ThreadTaskRun ä»»åŠ¡ä¸‹å‘ =================> \");\r\n            LogHelper.Info(\"ThreadTaskRun ä»»åŠ¡ä¸‹å‘\");\r\n\r\n            ITaskRepository taskservice = new TaskRepository();\r\n            try\r\n            {\r\n                LogHelper.Info(\"任务下发  ARG ä»»åŠ¡ è¿›å…¥\");\r\n                #region AGV任务下发。\r\n\r\n                var tklist = taskservice.FindList(x => x.S_B_STATE == \"未执行\" && x.S_WORK_MODE == \"AGV\");\r\n                if (tklist.Any())\r\n                    foreach (var tk in tklist.GroupBy(item =>\r\n                    {\r\n                        var ticks = item.T_CREATE.Ticks;\r\n                        return new DateTime(ticks - ticks % (10 * TimeSpan.TicksPerMinute));\r\n                    }).OrderBy(x => x.Key))\r\n                    {\r\n                        var ts = tk.OrderByDescending(x => x.N_PRIORITY).ToList();\r\n                        foreach (var t in ts)\r\n                        {\r\n                            var b = false;\r\n                            b = action?.Invoke(t) ?? false; //new ViewModel().RunTask(t);\r\n\r\n                            if (b)\r\n                            {\r\n                                t.S_B_STATE = \"已推送\";\r\n                                taskservice.Update(t);\r\n                            }\r\n                        }\r\n                        break;\r\n                    }\r\n                //foreach (var tk in tklist.GroupBy(item =>\r\n                //{\r\n                //    var ticks = item.T_CREATE.Ticks;\r\n                //    return new DateTime(ticks - ticks % (10 * TimeSpan.TicksPerMinute));\r\n                //}).OrderBy(x => x.Key))\r\n                //if (tklist.Any())\r\n                //{\r\n\r\n                #endregion\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                LogHelper.Info(ex.Message + ex.StackTrace);\r\n            }\r\n            try\r\n            {\r\n                #region Rgv\r\n\r\n                LogHelper.Info($\"查看RGV ç”µé‡ï¼šã€{tag.RGV.R当前电量}】 å……电状态:【{tag.RGV.R充电状态}】 æ•…障代码:【{tag.RGV.RgvrunError}】\");\r\n\r\n                if (tag.RGV.taskend == 125)\r\n                {\r\n                    System.Threading.Thread.Sleep(3000);\r\n                    return;\r\n                }\r\n                LogHelper.Info(\"任务下发  Rgv ä»»åŠ¡ è¿›å…¥\");\r\n\r\n                var task1Isrun = false;\r\n                if (tag.RGV.ReadTask1No > 0 && tag.RGV.bit1taskOver != 1)\r\n                {\r\n                    task1Isrun = true;\r\n                    //if (tag.RGV.bit1taskOver_LAST == 1)\r\n                    //    RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                }\r\n                var task2Isrun = false;\r\n                if (tag.RGV.ReadTask2No > 0 && tag.RGV.bit2taskOver != 1)\r\n                {\r\n                    task2Isrun = true;\r\n                    //if (tag.RGV.bit2taskOver_LAST == 1)\r\n                    //    RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                }\r\n                if (task1Isrun || task2Isrun)\r\n                {\r\n                    string mes = \"\";\r\n                    if (task1Isrun)\r\n                        mes += tag.RGV.ReadTask1No + \"执行中...\";\r\n                    if (task2Isrun)\r\n                        mes += tag.RGV.ReadTask2No + \"执行中...\";\r\n                    LogHelper.Info($\"{mes} ä¸èƒ½ä¸‹å‘新任务。\");\r\n                    System.Threading.Thread.Sleep(3000);\r\n                    return; \r\n                }\r\n                var thisOver = 0;\r\n                TaskEntity task1 = null;\r\n                TaskEntity task2 = null;\r\n\r\n                LogHelper.Info($\"查看RGV 1工位任务》\");\r\n                if (tag.RGV.ReadTask1No > 0 && tag.RGV.bit1taskOver == 1)\r\n                {\r\n                    var taskno = tag.RGV.ReadTask1No;\r\n                    LogHelper.Info($\"RGV 1工位任务{tag.RGV.ReadTask1No}\");\r\n                    string tno = \"TN\" + (DateTime.Now.ToString(\"yy\")) + ((taskno.ToString()).PadLeft(8, '0'));\r\n                    task1 = taskservice.FindEntity(x => x.S_TASK_NO == tno);\r\n\r\n                    LogHelper.Info($\"RGV 1工位任务{JsonConvert.SerializeObject(task1)}.bit1taskOver_LAST:{tag.RGV.bit1taskOver_LAST}\");\r\n                    if (tag.RGV.bit1taskOver_LAST == 0 && task1 != null)\r\n                    {\r\n                        if (task1.S_B_STATE != \"完成\")\r\n                        {\r\n                            thisOver = 1;\r\n                            if (task1.S_B_STATE == \"取货完成\")\r\n                            {\r\n                                task1.S_B_STATE = \"完成\";\r\n                                tag.RGV.ReadTask1No = 0;\r\n                            }\r\n                            else\r\n                            {\r\n                                task1.S_B_STATE = \"取货完成\";\r\n                            }\r\n                            tag.RGV.bit1taskOver = 0;\r\n                            LogHelper.Info($\"RGV 1工位任务{task1.S_TASK_NO} çŠ¶æ€åˆ‡æ¢ä¸º{task1.S_B_STATE}\");\r\n                            //tag.RGV.bit1taskOver_LAST = 1;\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"1\", out string msg);\r\n                            LogHelper.Info($\"RGV 1工位任务写处理\");\r\n                            taskservice.Update(task1);\r\n                            LogHelper.Info($\"RGV 1工位任务更新。\");\r\n                        }\r\n                        else\r\n                        {\r\n                            LogHelper.Info(\"RGV1工位任务已经完成。\");\r\n                        }\r\n                    }\r\n                }\r\n                else if (tag.RGV.ReadTask1No == 0)\r\n                {\r\n                    LogHelper.Info($\"RGV 1工位没有任务》\");\r\n                }\r\n\r\n                LogHelper.Info($\"查看RGV 2工位任务》\");\r\n                if (tag.RGV.ReadTask2No > 0 && tag.RGV.bit2taskOver == 1)\r\n                {\r\n                    var taskno = tag.RGV.ReadTask2No;\r\n                    LogHelper.Info($\"RGV 2工位任务{tag.RGV.ReadTask2No}\");\r\n                    string tno = \"TN\" + (DateTime.Now.ToString(\"yy\")) + ((taskno.ToString()).PadLeft(8, '0'));\r\n                    task2 = taskservice.FindEntity(x => x.S_TASK_NO == tno);\r\n\r\n                    LogHelper.Info($\"RGV2工位任务{JsonConvert.SerializeObject(task2)}.bit2taskOver_LAST:{tag.RGV.bit2taskOver_LAST}\");\r\n                    if (tag.RGV.bit2taskOver_LAST == 0 && task2 != null)\r\n                    {\r\n                        if (task2.S_B_STATE != \"完成\")\r\n                        {\r\n                            thisOver = 2;\r\n                            if (task2.S_B_STATE == \"取货完成\")\r\n                            {\r\n                                task2.S_B_STATE = \"完成\";\r\n                                tag.RGV.ReadTask2No = 0;\r\n                            }\r\n                            else\r\n                            {\r\n                                task2.S_B_STATE = \"取货完成\";\r\n                            }\r\n                            tag.RGV.bit2taskOver = 0;\r\n                            LogHelper.Info($\"RGV 2工位任务{task2.S_TASK_NO} çŠ¶æ€åˆ‡æ¢ä¸º{task2.S_B_STATE}\");\r\n                            RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"1\", out string msg);\r\n                            LogHelper.Info($\"RGV 2工位任务写处理\");\r\n                            taskservice.Update(task2);\r\n                            LogHelper.Info($\"RGV 2工位任务更新。\");\r\n                        }\r\n                        else\r\n                        {\r\n                            LogHelper.Info(\"RGV2工位任务已经完成。\");\r\n                        }\r\n                    }\r\n                }\r\n                else if (tag.RGV.ReadTask2No == 0)\r\n                {\r\n                    LogHelper.Info($\"RGV 2工位没有任务》\");\r\n                }\r\n\r\n\r\n\r\n                //if (thisOver > 0)\r\n                //{\r\n                //    var v2 = RedisHelper.Get<WriteGroupEntity>(\"RGVQueue\", out string rev);\r\n                //    if (v2 != null)\r\n                //    {\r\n                //        LogHelper.Info($\"RGVQueue è¯»åˆ°ç»“æžœ-{JsonConvert.SerializeObject(v2)}  \\n ä¸‹å‘前进行清除。\");\r\n                //        var b = RedisHelper.Remove(\"RGVQueue\", out rev);\r\n                //    }\r\n                //}\r\n\r\n                ///1 æœ‰è´§  å°±2 å–。  1 æ²¡è´§ å°±2 å¸è´§ï¼Œ éƒ½æœ‰è´§  å°±1卸货。 éƒ½æ²¡è´§ å°±1卸\r\n                var tklist = taskservice.FindList(x => x.S_B_STATE == \"未执行\" && x.S_WORK_MODE == \"RGV\").OrderBy(x => x.T_CREATE).ToList();\r\n                if (task1 != null && task1.S_B_STATE != \"完成\") //1有任务\r\n                {\r\n                    if (task2 != null && task2.S_B_STATE != \"完成\")// 1 æœ‰ä»»åŠ¡  2 æœ‰ä»»åŠ¡ã€‚ \r\n                    {\r\n                        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 ä¹Ÿæœ‰ä»»åŠ¡{task2.S_TASK_NO}。 å¼€å§‹å·¥ä½1 å¸è´§ã€‚\");\r\n                        tag.RGV.workMod = 1;\r\n                        tag.RGV.taskmod = 2;\r\n                        tag.RGV.taskno1 = Convert.ToUInt32(task1.S_TASK_NO.Substring(4));\r\n                        tag.RGV.task1do = Convert.ToUInt16(task1.S_END_LOC);\r\n                        System.Threading.Thread.Sleep(750);\r\n                        //RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                        //tag.RGV.taskend = 125;\r\n                        //Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\");\r\n\r\n                        LogHelper.Info($\"{task1.S_TASK_NO}> bit1taskOver_LAST å†™ 0\");\r\n                        RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                        LogHelper.Info($\"{task1.S_TASK_NO}> end å†™ 125\");\r\n                        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                    }\r\n                    else //1有任务  2 æ²¡ä»»åŠ¡ã€‚  \r\n                    {\r\n\r\n                        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§å–货任务。\");\r\n\r\n                        var leftSide = new List<string> { \"1023\", \"1020\" };\r\n                        var RightSide = new List<string> { \"1002\", \"1008\", \"1010\", \"1016\" };\r\n                        bool creT2 = false;\r\n\r\n                        // 2号 ä¼˜å…ˆç»™ 1020  1008  1016\r\n                        var t2 = tklist.OrderBy(x => x.T_CREATE).ToList().Find(x => x.S_START_LOC == \"1020\" || x.S_START_LOC == \"1008\" || x.S_START_LOC == \"1016\");\r\n                        if (t2 != null)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾1020  1008  1016取货任务{t2.S_TASK_NO}。\");\r\n                            tag.RGV.workMod = 2;\r\n                            tag.RGV.taskmod = 1;\r\n                            tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                            tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                            t2.S_B_STATE = \"已推送\";\r\n                            taskservice.Update(t2);\r\n                            creT2 = true;\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                            RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                        ////2 å¦‚果有同侧取货任务。就取。没有\r\n                        //else if (leftSide.Contains(task1.S_START_LOC))\r\n                        //{\r\n                        //    leftSide.Remove(task1.S_START_LOC);\r\n                        //    var lsde = leftSide.FirstOrDefault();\r\n                        //    t2 = tklist.Find(x => x.S_START_LOC == lsde && x.S_END_LOC != \"1017\");\r\n                        //    if (t2 != null) //同侧取货任务。\r\n                        //    {\r\n                        //        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§å–货任务{t2.S_TASK_NO}。\");\r\n                        //        tag.RGV.workMod = 2;\r\n                        //        tag.RGV.taskmod = 1;\r\n                        //        tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                        //        tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                        //        t2.S_B_STATE = \"已推送\";\r\n                        //        taskservice.Update(t2);\r\n                        //        creT2 = true;\r\n                        //        System.Threading.Thread.Sleep(750);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                        //        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                        //        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        //    }\r\n                        //}\r\n                        //else if (RightSide.Contains(task1.S_START_LOC))\r\n                        //{\r\n                        //    RightSide.Remove(task1.S_START_LOC);\r\n                        //    t2 = tklist.Find(x => RightSide.Contains(x.S_START_LOC) && x.S_END_LOC != \"1017\");\r\n                        //    if (t2 != null) //同侧取货任务。\r\n                        //    {\r\n                        //        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§ 1002,1010 å–货任务{t2.S_TASK_NO}。\");\r\n                        //        tag.RGV.workMod = 2;\r\n                        //        tag.RGV.taskmod = 1;\r\n                        //        tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                        //        tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                        //        t2.S_B_STATE = \"已推送\";\r\n                        //        taskservice.Update(t2);\r\n                        //        creT2 = true;\r\n                        //        System.Threading.Thread.Sleep(750);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 125\");\r\n                        //        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                        //        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        //    }\r\n                        //}\r\n                        else //1 ç›´æŽ¥å¸è´§ã€‚ \r\n                        //if (!creT2)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ²¡æœ‰åŒä¾§å–货任务 1工位卸货。\");\r\n                            tag.RGV.workMod = 1;\r\n                            tag.RGV.taskmod = 2;\r\n                            tag.RGV.taskno1 = Convert.ToUInt32(task1.S_TASK_NO.Substring(4));\r\n                            tag.RGV.task1do = Convert.ToUInt16(task1.S_END_LOC);\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{task1.S_TASK_NO}> bit1taskOver_LAST å†™ 0\");\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{task1.S_TASK_NO}> taskend å†™ 0\");\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (task2 != null && task2.S_B_STATE != \"完成\")// 1 æ²¡ä»»åŠ¡  2 æœ‰ä»»åŠ¡ã€‚ \r\n                    {\r\n                        LogHelper.Info($\"查看RGV 1工位没任务,工位2 æœ‰ä»»åŠ¡{task2.S_TASK_NO}。工位2卸货。。\");\r\n                        //2 å¸è´§ã€‚\r\n                        tag.RGV.workMod = 2;\r\n                        tag.RGV.taskmod = 2;\r\n                        tag.RGV.taskno2 = Convert.ToUInt32(task2.S_TASK_NO.Substring(4));\r\n                        tag.RGV.task2do = Convert.ToUInt16(task2.S_END_LOC);\r\n                        System.Threading.Thread.Sleep(750);\r\n                        LogHelper.Info($\"{task2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //tag.RGV.taskend = 125;\r\n                        LogHelper.Info($\"{task2.S_TASK_NO}> taskend å†™125\");\r\n                        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                    }\r\n                    else if (tklist.Any()) //1mei ä»»åŠ¡  2 æ²¡ä»»åŠ¡ã€‚\r\n                    {\r\n                        LogHelper.Info($\"查看RGV 1工位没任务,工位2 ä¹Ÿæ²¡ä»»åŠ¡ã€‚ä¼˜å…ˆ1工位终点1017任务。。\");\r\n                        //、下 1017任务 ç»™1号工位。\r\n                        //var lss = tklist.Take(2).ToList();\r\n                        var e1017first = tklist.Find(x => x.S_START_LOC == \"1002\" || x.S_START_LOC == \"1010\" || x.S_START_LOC == \"1023\");\r\n                        //if (e1017first != null)\r\n                        //{\r\n                        //    e1017first = tklist.FirstOrDefault();\r\n                        //}\r\n                        if (e1017first != null)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 ä»»åŠ¡å·¥ä½2 æ²¡ä»»åŠ¡ã€‚ 1002  1010  1023取货任务{e1017first.S_TASK_NO}。\");\r\n                            tag.RGV.workMod = 1;\r\n                            tag.RGV.taskmod = 1;\r\n                            uint tno = Convert.ToUInt32(e1017first.S_TASK_NO.Substring(4));\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> è½¬æ¢åŽä»»åŠ¡å·{tno} å¼€å§‹å†™å…¥ã€‚\");\r\n                            tag.RGV.taskno1 = tno;\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}>开始写入 task1do>>{e1017first.S_START_LOC}。\");\r\n                            tag.RGV.task1do = Convert.ToUInt16(e1017first.S_START_LOC);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> æ›´æ–°ä»»åŠ¡ã€‚\");\r\n                            e1017first.S_B_STATE = \"已推送\";\r\n                            taskservice.Update(e1017first);\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> bit1taskOver_LAST å†™0\");\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> taskend å†™125\");\r\n                            //tag.RGV.taskend=125\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                        else\r\n                        {\r\n                            var t2 = tklist.OrderBy(x => x.T_CREATE).ToList().Find(x => x.S_START_LOC == \"1020\" || x.S_START_LOC == \"1008\" || x.S_START_LOC == \"1016\");\r\n                            if (tklist != null)\r\n                            {\r\n                                LogHelper.Info($\"查看RGV1 æ²¡ä»»åŠ¡å·¥ä½2 æ²¡ä»»åŠ¡ã€‚ æ‰¾1020  1008  1016取货任务{t2.S_TASK_NO}。\");\r\n                                tag.RGV.workMod = 2;\r\n                                tag.RGV.taskmod = 1;\r\n                                tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                                tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                                t2.S_B_STATE = \"已推送\";\r\n                                taskservice.Update(t2);\r\n                                System.Threading.Thread.Sleep(750);\r\n                                LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                                RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                                LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                                Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                LogHelper.Info($\"rgv å¤„理完成。taskend 125\");\r\n                #endregion\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                LogHelper.Info(ex.Message + ex.StackTrace);\r\n            }\r\n        }\r\n\r\n\r\n        public void ThreadGrats(Tag tag, Action<HaiKangOrderInfo> continueTask)\r\n        {\r\n            Console.WriteLine($\"ThreadGrats å…‰æ …处理 =================> \");\r\n            var taskCOdes = new List<string> { \"Sarrive\", \"Srelease\", \"Earrive\", \"Erelease\" };\r\n            TaskActRepository taskActRepository = new TaskActRepository();\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            var requires = taskActRepository.FindList(x => taskCOdes.Contains(x.S_ACTION_CODE) && x.N_CREATEMETHOD == 0);\r\n            foreach (var item in requires)\r\n            {\r\n                var tin = taskCOdes.IndexOf(item.S_ACTION_CODE);\r\n                if (tin == -1)\r\n                {\r\n                    item.N_CREATEMETHOD = -1;\r\n                    taskActRepository.Update(item);\r\n                    continue;\r\n                }\r\n                //var task = taskRepository.FindEntity(x => x.S_TASK_NO == item.S_TASK_NO);\r\n                string loc = \"\";\r\n                if (tin < 2)\r\n                {\r\n                    loc = item.S_START_LOC;\r\n                }\r\n                else\r\n                {\r\n                    loc = item.S_END_LOC;\r\n                }\r\n                if (loc == null) continue; else loc = loc.Trim();\r\n                bool goin = tin % 2 == 0;\r\n                bool continuuuuu = false;\r\n                var dev = Settings.deviceInfos.Find(x => x.location.Contains(loc));\r\n                if (dev != null)\r\n                {\r\n                    var V = dev.location.ToList().FindIndex(x => x == loc) == 0;\r\n                    //车走了  å¼€å…‰æ …\r\n                    if (!goin)\r\n                    {\r\n                        if (dev.deviceType == 1)\r\n                        {\r\n                            LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"R02\" : \"R04\"), \"true\", dev.deviceName + \"Queue\"));\r\n                            Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"R02\" : \"R04\"), \"true\", dev.deviceName + \"Queue\");\r\n\r\n                        }\r\n                        else if (dev.deviceType == 2)\r\n                        {\r\n                            LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"D1222\" : \"D1223\"), \"1\", dev.deviceName + \"Queue\"));\r\n                            Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"D1222\" : \"D1223\"), \"1\", dev.deviceName + \"Queue\");\r\n                        }\r\n\r\n                        item.N_CREATEMETHOD = 1;\r\n                        taskActRepository.Update(item);\r\n                    }\r\n                    //车要进入交互。\r\n                    else\r\n                    {\r\n                        if (dev.deviceType == 1)\r\n                        {\r\n                            var tf = Conn.默认Redis.GetValue(dev.deviceName + \".\" + (V ? \"R50\" : \"R52\"));//读关闭状态\r\n                            if (tf?.ToLower() == \"true\")\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚ å·²ç»å…³é—­ï¼\");\r\n                                continuuuuu = true;\r\n                            }\r\n                            else\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"R01\" : \"R03\"), \"true\", dev.deviceName + \"Queue\"));\r\n                                Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"R01\" : \"R03\"), \"true\", dev.deviceName + \"Queue\");\r\n                            }\r\n\r\n                        }\r\n                        else if (dev.deviceType == 2)\r\n                        {\r\n                            var tf = Conn.默认Redis.GetValue(dev.deviceName + \".D1202\");\r\n                            int numm = int.Parse(string.IsNullOrEmpty(tf) ? \"0\" : tf);\r\n                            if (TcpServer.GetBitdata(numm, (V ? 0 : 1)) == 1)\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚ å·²ç»å…³é—­ï¼\");\r\n                                continuuuuu = true;\r\n                            }\r\n                            else\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"D1220\" : \"D1221\"), dev.deviceName + \"Queue\"));\r\n                                Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"D1220\" : \"D1221\"), \"1\", dev.deviceName + \"Queue\");\r\n                            }\r\n                        }\r\n\r\n                    }\r\n\r\n                }\r\n                if (continuuuuu)\r\n                {\r\n                    LogHelper.Info($\"{item.S_TASK_NO}{item.S_ACTION_CODE} è½¦è¾†å‘送继续任务!\");\r\n                    continueTask?.Invoke(new HaiKangOrderInfo\r\n                    {\r\n                        reqCode = item.S_ID.Replace(\"-\", \"\"),\r\n                        taskCode = item.S_TASK_NO\r\n                    });\r\n                    item.N_CREATEMETHOD = 1;\r\n                    taskActRepository.Update(item);\r\n                }\r\n            }\r\n            System.Threading.Thread.Sleep(3000);\r\n            //重置信号\r\n            foreach (var dev in Settings.deviceInfos.FindAll(x => x.deviceType == 2))\r\n            {\r\n                var tf = Conn.默认Redis.GetValue(dev.deviceName + \".D1202\");\r\n                int numm = int.Parse(string.IsNullOrEmpty(tf) ? \"0\" : tf);\r\n                if (TcpServer.GetBitdata(numm, 0) == 0)\r\n                {\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1220\", \"0\", dev.deviceName + \"Queue\");\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1222\", \"0\", dev.deviceName + \"Queue\");\r\n                }\r\n                else if (TcpServer.GetBitdata(numm, 1) == 0)\r\n                {\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1221\", \"0\", dev.deviceName + \"Queue\");\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1223\", \"0\", dev.deviceName + \"Queue\");\r\n                }\r\n            }\r\n\r\n        }\r\n        /// <summary>\r\n        /// 1020  1023空框下线\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadEdown(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadEdown 20 23 = ç©ºä¸‹æ£€æµ‹ =================> \");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1020\", \"1023\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} ç©ºä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}  \");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n                    try\r\n                    {\r\n                        var listtep = new List<string>();\r\n                        if (Bssx == \"1020\")\r\n                        {\r\n                            if (tag.SF下料位.RArrive1003 == 1)\r\n                            {\r\n                                listtep = new List<string> { \"1012\", \"1004\" };\r\n                            }\r\n                            else\r\n                            {\r\n                                listtep = new List<string> { \"1004\", \"1012\" };\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            if (tag.SF下料位.RArrive1005 == 1)\r\n                            {\r\n                                listtep = new List<string> { \"1014\", \"1006\" };\r\n                            }\r\n                            else\r\n                            {\r\n                                listtep = new List<string> { \"1006\", \"1014\" };\r\n                            }\r\n                        }\r\n\r\n                        foreach (var item in listtep)//(Bssx == \"1020\" ? new string[] { \"1004\", \"1012\" } : new string[] { \"1006\", \"1014\" }))\r\n                        {\r\n                            var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                            var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                            if (R5 == 5 && R5空闲_LAST == 0 && task == null)\r\n                            {\r\n                                task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                                msg = \"\";\r\n                                if (task != null)\r\n                                {\r\n                                    Console.WriteLine($\" {item}有正在 [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                                    LogHelper.Info($\" {item}有正在 [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                                    continue;\r\n                                }\r\n\r\n                                var b = TaskProcess.CreateTask(\"\", Bssx, item, \"空上RGV\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                                if (b)\r\n                                {\r\n                                    LogHelper.Debug($\"输送线RGV空托任务 from:{Bssx}>to {item}开始创建成功\");\r\n                                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                                    RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out msg);\r\n                                    //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                                    break;\r\n                                }\r\n                            }\r\n                            else if (R5 != 5 && R5空闲_LAST == 1)\r\n                            {\r\n                                RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out msg);\r\n                                //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"0\", $\"S{item}ReadQueue\");\r\n                            }\r\n                        }\r\n                        System.Threading.Thread.Sleep(1000);\r\n                    }\r\n                    catch (Exception ex)\r\n                    {\r\n                        LogHelper.Error(ex.Message, ex);\r\n                        Console.WriteLine(ex.Message + ex.StackTrace);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"0\", $\"S{Bssx}ReadQueue\");\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n\r\n            foreach (var item in new string[] { \"1004\", \"1012\", \"1006\", \"1014\", \"1026\", \"1017\" })\r\n            {\r\n                var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                if (R5 != 5 && R5空闲_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"0\", $\"S{item}ReadQueue\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ThreadDdown(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadDdown 08 10 ==================> 1026\");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1008\", \"1016\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} æ»¡ä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}\");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n\r\n                    var item = \"1026\";\r\n                    var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                    var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                    if (R5 == 5 && R5空闲_LAST == 0)\r\n                    {\r\n                        task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                        msg = \"\";\r\n                        if (task != null)\r\n                        {\r\n                            Console.WriteLine($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            LogHelper.Info($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            continue;\r\n                        }\r\n                        var b = TaskProcess.CreateTask(\"\", Bssx, item, \"满转1026\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                        if (b)\r\n                        {\r\n                            RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                            RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out string msg2);\r\n                            //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                            //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                            break;\r\n                        }\r\n                    }\r\n                    else if (R5 != 5 && R5空闲_LAST == 1)\r\n                    {\r\n                        RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg2);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"0\", $\"S{Bssx}ReadQueue\");\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n        }\r\n\r\n        public void Thread0210Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Thread0210Down ==================>\");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1002\", \"1010\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} æ»¡ä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}\");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n                    var item = \"1017\";\r\n                    var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                    var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                    if (R5 == 5 && R5空闲_LAST == 0)\r\n                    {\r\n                        task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                        msg = \"\";\r\n                        if (task != null)\r\n                        {\r\n                            Console.WriteLine($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            LogHelper.Info($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            continue;\r\n                        }\r\n                        var b = TaskProcess.CreateTask(\"\", Bssx, item, \"满转1017\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                        if (b)\r\n                        {\r\n                            RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                            RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out string msg1);\r\n                            //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                            //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                            break;\r\n                        }\r\n                    }\r\n                    else if (R5 != 5 && R5空闲_LAST == 1)\r\n                    {\r\n                        RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg1);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n        }\r\n\r\n\r\n        public void Thread下料位检测(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Thread下料位检测    =====>\");\r\n            foreach (var ssx in new string[] { \"1003\", \"1005\", \"1011\", \"1013\" })\r\n            {\r\n                var RArrive = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"FNK1003051113.RArrive{ssx}\"), typeof(System.UInt16));\r\n                var RArriveLast = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"FNK1003051113.RArrive{ssx}_LAST\"), typeof(System.UInt16));\r\n                if (RArrive == 1 && RArriveLast == 0)\r\n                {\r\n                    if (ssx == \"1005\" && tag.SF下料位.WRelease1005 == 0)\r\n                    {\r\n                        tag.FNK1.D2215 = 1;\r\n                        //tag.SF下料位.RArrive1005_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1005_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1005 = 0;\r\n                        //tag.SF下料位.WSafe0305 = 0;\r\n                    }\r\n                    else if (ssx == \"1003\" && tag.SF下料位.WRelease1003 == 0)\r\n                    {\r\n                        tag.FNK1.D2210 = 1;\r\n                        //tag.SF下料位.RArrive1003_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1003_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1003 = 0;\r\n                        //tag.SF下料位.WSafe0305 = 0;\r\n                    }\r\n                    else if (ssx == \"1013\" && tag.SF下料位.WRelease1013 == 0)\r\n                    {\r\n                        tag.FNK2.D2215 = 1;\r\n                        //tag.SF下料位.RArrive1013_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1013_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1013 = 0;\r\n                        //tag.SF下料位.WSafe1113 = 0;\r\n                    }\r\n                    else if (ssx == \"1011\" && tag.SF下料位.WRelease1011 == 0)\r\n                    {\r\n                        tag.FNK2.D2210 = 1;\r\n                        //tag.SF下料位.RArrive1011_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1011_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1011 = 0;\r\n                        //tag.SF下料位.WSafe1113 = 0;\r\n                    }\r\n                }\r\n                else if (RArrive == 0 && RArriveLast == 1)\r\n                {\r\n                    RedisHelper.Add($\"FNK1003051113.RArrive{ssx}_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"FNK1003051113.RArrive{ssx}_LAST\", \"0\", $\"FNK1003051113Queue\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ThreadFNK1Over(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadFNK1Over    =====>\");\r\n            if (tag.FNK1.D2217 == 1 && tag.FNK1.D2217_LAST == 0)\r\n            {\r\n                tag.FNK1.D2215 = 0;\r\n                //tag.FNK1.D2212_LAST = 1;\r\n                RedisHelper.Add($\"p发那科1下线.D2217_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1005 = 1;\r\n                tag.SF下料位.WSafe0305 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1005_LAST\", \"0\", out msg);\r\n            }\r\n            if (tag.FNK1.D2216 == 1)\r\n                tag.FNK1.D2215 = 0;\r\n            else if (tag.FNK1.D2217 == 0 && tag.FNK1.D2217_LAST == 1)\r\n                //tag.FNK1.D2217_LAST = 0;\r\n                RedisHelper.Add($\"p发那科1下线.D2217_LAST\", \"0\", out string msg);\r\n\r\n            if (tag.FNK1.D2212 == 1 && tag.FNK1.D2212_LAST == 0)\r\n            {\r\n                tag.FNK1.D2210 = 0;\r\n                //tag.FNK1.D2217_LAST = 1;\r\n                RedisHelper.Add($\"p发那科1下线.D2212_LAST\", \"1\", out string msg);\r\n                tag.SF下料位.WRelease1003 = 1;\r\n                tag.SF下料位.WSafe0305 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1003_LAST\", \"0\", out msg);\r\n            }\r\n            //else if (tag.FNK1.D2211 == 1)\r\n            //    tag.FNK1.D2210 = 0;\r\n            else if (tag.FNK1.D2212 == 0 && tag.FNK1.D2212_LAST == 1)\r\n            {\r\n                //tag.FNK1.D2212_LAST = 0;\r\n                RedisHelper.Add($\"p发那科1下线.D2212_LAST\", \"0\", out string msg);\r\n            }\r\n            if (tag.FNK1.D2211 == 1)\r\n                tag.FNK1.D2210 = 0;\r\n\r\n        }\r\n        public void ThreadFNK2Over(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadFNK2Over    =====>\");\r\n            if (tag.FNK2.D2217 == 1 && tag.FNK2.D2217_LAST == 0)\r\n            {\r\n                tag.FNK2.D2215 = 0;\r\n                //tag.FNK2.D2212_LAST = 1;\r\n                RedisHelper.Add($\"p发那科2下线.D2217_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1013 = 1;\r\n                tag.SF下料位.WSafe1113 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1013_LAST\", \"0\", out msg);\r\n            }\r\n            else if (tag.FNK2.D2217 == 0 && tag.FNK2.D2217_LAST == 1)\r\n                //tag.FNK2.D2217_LAST = 0;\r\n                RedisHelper.Add($\"p发那科2下线.D2217_LAST\", \"0\", out string msg);\r\n\r\n            if (tag.FNK2.D2216 == 1)\r\n                tag.FNK2.D2215 = 0;\r\n\r\n            if (tag.FNK2.D2212 == 1 && tag.FNK2.D2212_LAST == 0)\r\n            {\r\n                tag.FNK2.D2210 = 0;\r\n                //tag.FNK2.D2217_LAST = 1;\r\n                RedisHelper.Add($\"p发那科2下线.D2212_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1011 = 1;\r\n                tag.SF下料位.WSafe1113 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1011_LAST\", \"0\", out msg);\r\n            }\r\n            else if (tag.FNK2.D2212 == 0 && tag.FNK2.D2212_LAST == 1)\r\n            {\r\n                //tag.FNK2.D2212_LAST = 0;\r\n                RedisHelper.Add($\"p发那科2下线.D2212_LAST\", \"0\", out string msg);\r\n            }\r\n            if (tag.FNK2.D2211 == 1)\r\n                tag.FNK2.D2210 = 0;\r\n\r\n        }\r\n\r\n        public void Thread1019Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"1019任务状态:   =====>\");\r\n            Console.WriteLine($\"1019任务状态:{tag.SA1019.RtaskState}- barcode:{tag.SA1019.R托盘码}- ç©ºé—²{tag.SA1019.R5空闲}\");\r\n        }\r\n        public void Thread1025Up(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1025 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA1025 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1025.RtaskState}- ç©ºé—²{tag.SA1025.R5空闲}\");\r\n        }\r\n        public void Thread1022Up(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1022    =====>\");\r\n            Console.WriteLine($\"SA1022 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1022.RtaskState}- ç©ºé—²{tag.SA1022.R5空闲}\");\r\n        }\r\n        public void Thread1030Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1030 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA1030 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1030.RtaskState}- ç©ºé—²{tag.SA1030.R5空闲}-->对应终点2001>空闲5:{tag.SA2001.R5空闲}\");\r\n        }\r\n        public void Thread2030Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA2030 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA2030 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA2030.RtaskState}- ç©ºé—²{tag.SA2030.R5空闲} - barcode:{tag.SA2030.R托盘码}\");\r\n        }\r\n\r\n\r\n    }\r\n}\r\n",
      "EditCode": "using Newtonsoft.Json;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.Concurrent;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing GZ.Modular.Redis;\r\nusing GZ.DB.Entity.OIDATABASE;\r\nusing GZ.DB.IRepository.OIDATABASE;\r\nusing GZ.DB.Repository.OIDATABASE;\r\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement;\r\nusing System.Windows.Interop;\r\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;\r\n\r\nnamespace GZ.Projects.AuxAllWCS\r\n{\r\n    public static class ExtendClass\r\n    {\r\n        public static void Disnull(this TaskRepository repository)\r\n        {\r\n            repository.dbcontext.Dispose();\r\n            repository = null;\r\n        }\r\n        public static void Disnull(this LocRepository repository)\r\n        {\r\n            repository.dbcontext.Dispose();\r\n            repository = null;\r\n        }\r\n        public static void Disnull(this TaskActRepository repository)\r\n        {\r\n            repository.dbcontext.Dispose();\r\n            repository = null;\r\n        }\r\n        public static void Disnull(this SYSRepository repository)\r\n        {\r\n            repository.dbcontext.Dispose();\r\n            repository = null;\r\n        }\r\n    }\r\n    public partial class AutoThread\r\n    {\r\n\r\n        private static AutoThread _instance;\r\n\r\n        // ç§æœ‰æž„造函数防止外部实例化\r\n        private AutoThread() { }\r\n\r\n        public static AutoThread Instance\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null)\r\n                {\r\n                    _instance = new AutoThread();\r\n                }\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        // çº¿ç¨‹å®‰å…¨çš„委托缓存\r\n        private static readonly ConcurrentDictionary<string, Delegate> _methodCache = new ConcurrentDictionary<string, Delegate>();\r\n\r\n        // æ–¹æ³•执行器\r\n        public static object InvokeMethod(object instance, string methodName, params object[] args)\r\n        {\r\n            var cacheKey = $\"{instance.GetType().FullName}_{methodName}\";\r\n\r\n            if (!_methodCache.TryGetValue(cacheKey, out var methodDelegate))\r\n            {\r\n                // èŽ·å–æ–¹æ³•ä¿¡æ¯\r\n                var methodInfo = instance.GetType().GetMethod(\r\n                    methodName,\r\n                    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\r\n\r\n                if (methodInfo == null)\r\n                    throw new MissingMethodException($\"Method {methodName} not found\");\r\n\r\n                // åˆ›å»ºå§”托并缓存\r\n                methodDelegate = Delegate.CreateDelegate(\r\n                    GetDelegateType(methodInfo),\r\n                    instance,\r\n                    methodInfo);\r\n\r\n                _methodCache.TryAdd(cacheKey, methodDelegate);\r\n            }\r\n\r\n            // æ‰§è¡Œå§”托\r\n            return methodDelegate.DynamicInvoke(args);\r\n        }\r\n\r\n        // æ ¹æ®æ–¹æ³•签名生成对应的委托类型\r\n        private static Type GetDelegateType(MethodInfo methodInfo)\r\n        {\r\n            var parameterTypes = methodInfo.GetParameters()\r\n                .Select(p => p.ParameterType)\r\n                .ToList();\r\n\r\n            if (methodInfo.ReturnType == typeof(void))\r\n            {\r\n                return System.Linq.Expressions.Expression.GetActionType(parameterTypes.ToArray());\r\n            }\r\n            else\r\n            {\r\n                parameterTypes.Add(methodInfo.ReturnType);\r\n                return System.Linq.Expressions.Expression.GetFuncType(parameterTypes.ToArray());\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// é…ç½®åˆå§‹åŒ–。\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        /// <param name=\"action\"></param>\r\n        public void ThreadSettingInit(Tag tag, Action action)\r\n        {\r\n            Console.WriteLine(\"初始化配置 çº¿ç¨‹ run \" + tag.Global.SettingsOver);\r\n            if (tag.Global.SettingsOver == 0)\r\n            {\r\n                action?.Invoke();\r\n                tag.Global.SettingsOver = 1;\r\n            }\r\n            else if (Settings.deviceInfos.Count == 0)\r\n            {\r\n                tag.Global.SettingsOver = 0;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// æ·é¡º1 ä¿¡å·å¤„理\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadJS1(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadJS1 æ·é¡º1 ä¿¡å·å¤„理 =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 2 && x.deviceName == \"Js捷顺1\");\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.Js1.D1212_LAST == 0 && TcpServer.GetBitdata(tag.Js1.D1212, 2) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[0]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js1.D1212_LAST = 1;\r\n                        RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js1.D1212_LAST == 1 && TcpServer.GetBitdata(tag.Js1.D1212, 2) == 0)\r\n                {\r\n                    //tag.Js1.D1212_LAST = 0; \r\n                    RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"0\", out string msg);\r\n                }\r\n                if (tag.Js1.D1213_LAST == 0 && TcpServer.GetBitdata(tag.Js1.D1212, 3) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[1]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js1.D1213_LAST = 1;\r\n                        RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js1.D1213_LAST == 1 && TcpServer.GetBitdata(tag.Js1.D1212, 3) == 0)\r\n                {\r\n                    //tag.Js1.D1213_LAST = 0;\r\n                    RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"0\", out string msg);\r\n                }\r\n            }\r\n        }\r\n        /// <summary>\r\n        /// æ·é¡º2 ä¿¡å·å¤„理\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadJS2(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadJS2 æ·é¡º2 ä¿¡å·å¤„理 =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 2 && x.deviceName == \"Js捷顺2\");\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.Js2.D1212_LAST == 0 && TcpServer.GetBitdata(tag.Js2.D1212, 2) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[0]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js2.D1212_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js2.D1212_LAST == 1 && TcpServer.GetBitdata(tag.Js2.D1212, 2) == 0)\r\n                {\r\n                    //tag.Js2.D1212_LAST = 0;\r\n\r\n                    RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"0\", out string msg);\r\n                }\r\n                if (tag.Js2.D1213_LAST == 0 && TcpServer.GetBitdata(tag.Js2.D1212, 3) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[1]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js2.D1213_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js2.D1213_LAST == 1 && TcpServer.GetBitdata(tag.Js2.D1213, 2) == 0)\r\n                {\r\n                    //tag.Js2.D1213_LAST = 0;\r\n\r\n                    RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"0\", out string msg);\r\n                }\r\n            }\r\n        }\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”1 å·¦\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr1L(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr1L ç»´å¸Œå°”1 å·¦ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"1\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr1.R44 && !tag.wxr1.R44_LAST && tag.wxr1.R10)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[0],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr1.R44_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    //TaskRepository ts = new TaskRepository();\r\n                    if (tag.wxr1.R10_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr1.R10)\r\n                        {\r\n                            tag.wxr1.R10_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr1.R10 = true;\r\n                                tag.wxr1.R44_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”1 å³\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr1R(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr1R ç»´å¸Œå°”1 å³ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"1\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr1.R46 && !tag.wxr1.R46_LAST && tag.wxr1.R11)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[1],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr1.R46_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr1.R11_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr1.R11)\r\n                        {\r\n                            tag.wxr1.R11_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr1.R11 = true;\r\n                                tag.wxr1.R46_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”2 å·¦\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr2L(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr2L ç»´å¸Œå°”2 å·¦ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"2\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr2.R44 && !tag.wxr2.R44_LAST && tag.wxr2.R10)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[0],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr2.R44_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr2.R10_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr2.R10)\r\n                        {\r\n                            tag.wxr2.R10_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr2.R10 = true;\r\n                                tag.wxr2.R44_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”2 å³\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr2R(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr2R ç»´å¸Œå°”2 å³ =================> \");\r\n\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"2\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr2.R46 && !tag.wxr2.R46_LAST && tag.wxr2.R11)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[1],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr2.R46_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[2], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr2.R11_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr2.R11)\r\n                        {\r\n                            tag.wxr2.R11_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr2.R11 = true;\r\n                                tag.wxr2.R46_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        public void ThreadTaskRun(Tag tag, Func<TaskEntity, bool> action)\r\n        {\r\n            Console.WriteLine($\"ThreadTaskRun ä»»åŠ¡ä¸‹å‘ =================> \");\r\n            LogHelper.Info(\"ThreadTaskRun ä»»åŠ¡ä¸‹å‘\");\r\n\r\n            ITaskRepository taskservice = new TaskRepository();\r\n            try\r\n            {\r\n                LogHelper.Info(\"任务下发  ARG ä»»åŠ¡ è¿›å…¥\");\r\n                #region AGV任务下发。\r\n\r\n                var tklist = taskservice.FindList(x => x.S_B_STATE == \"未执行\" && x.S_WORK_MODE == \"AGV\");\r\n                if (tklist.Any())\r\n                    foreach (var tk in tklist.GroupBy(item =>\r\n                    {\r\n                        var ticks = item.T_CREATE.Ticks;\r\n                        return new DateTime(ticks - ticks % (10 * TimeSpan.TicksPerMinute));\r\n                    }).OrderBy(x => x.Key))\r\n                    {\r\n                        var ts = tk.OrderByDescending(x => x.N_PRIORITY).ToList();\r\n                        foreach (var t in ts)\r\n                        {\r\n                            var b = false;\r\n                            b = action?.Invoke(t) ?? false; //new ViewModel().RunTask(t);\r\n\r\n                            if (b)\r\n                            {\r\n                                t.S_B_STATE = \"已推送\";\r\n                                taskservice.Update(t);\r\n                            }\r\n                        }\r\n                        break;\r\n                    }\r\n                //foreach (var tk in tklist.GroupBy(item =>\r\n                //{\r\n                //    var ticks = item.T_CREATE.Ticks;\r\n                //    return new DateTime(ticks - ticks % (10 * TimeSpan.TicksPerMinute));\r\n                //}).OrderBy(x => x.Key))\r\n                //if (tklist.Any())\r\n                //{\r\n\r\n                #endregion\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                LogHelper.Info(ex.Message + ex.StackTrace);\r\n            }\r\n            try\r\n            {\r\n                #region Rgv\r\n\r\n                LogHelper.Info($\"查看RGV ç”µé‡ï¼šã€{tag.RGV.R当前电量}】 å……电状态:【{tag.RGV.R充电状态}】 æ•…障代码:【{tag.RGV.RgvrunError}】\");\r\n\r\n                if (tag.RGV.taskend == 125)\r\n                {\r\n                    System.Threading.Thread.Sleep(3000);\r\n                    return;\r\n                }\r\n                LogHelper.Info(\"任务下发  Rgv ä»»åŠ¡ è¿›å…¥\");\r\n\r\n                var task1Isrun = false;\r\n                if (tag.RGV.ReadTask1No > 0 && tag.RGV.bit1taskOver != 1)\r\n                {\r\n                    task1Isrun = true;\r\n                    //if (tag.RGV.bit1taskOver_LAST == 1)\r\n                    //    RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                }\r\n                var task2Isrun = false;\r\n                if (tag.RGV.ReadTask2No > 0 && tag.RGV.bit2taskOver != 1)\r\n                {\r\n                    task2Isrun = true;\r\n                    //if (tag.RGV.bit2taskOver_LAST == 1)\r\n                    //    RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                }\r\n                if (task1Isrun || task2Isrun)\r\n                {\r\n                    string mes = \"\";\r\n                    if (task1Isrun)\r\n                        mes += tag.RGV.ReadTask1No + \"执行中...\";\r\n                    if (task2Isrun)\r\n                        mes += tag.RGV.ReadTask2No + \"执行中...\";\r\n                    LogHelper.Info($\"{mes} ä¸èƒ½ä¸‹å‘新任务。\");\r\n                    System.Threading.Thread.Sleep(3000);\r\n                    return; \r\n                }\r\n                var thisOver = 0;\r\n                TaskEntity task1 = null;\r\n                TaskEntity task2 = null;\r\n\r\n                LogHelper.Info($\"查看RGV 1工位任务》\");\r\n                if (tag.RGV.ReadTask1No > 0 && tag.RGV.bit1taskOver == 1)\r\n                {\r\n                    var taskno = tag.RGV.ReadTask1No;\r\n                    LogHelper.Info($\"RGV 1工位任务{tag.RGV.ReadTask1No}\");\r\n                    string tno = \"TN\" + (DateTime.Now.ToString(\"yy\")) + ((taskno.ToString()).PadLeft(8, '0'));\r\n                    task1 = taskservice.FindEntity(x => x.S_TASK_NO == tno);\r\n\r\n                    LogHelper.Info($\"RGV 1工位任务{JsonConvert.SerializeObject(task1)}.bit1taskOver_LAST:{tag.RGV.bit1taskOver_LAST}\");\r\n                    if (tag.RGV.bit1taskOver_LAST == 0 && task1 != null)\r\n                    {\r\n                        if (task1.S_B_STATE != \"完成\")\r\n                        {\r\n                            thisOver = 1;\r\n                            if (task1.S_B_STATE == \"取货完成\")\r\n                            {\r\n                                task1.S_B_STATE = \"完成\";\r\n                                tag.RGV.ReadTask1No = 0;\r\n                            }\r\n                            else\r\n                            {\r\n                                task1.S_B_STATE = \"取货完成\";\r\n                            }\r\n                            tag.RGV.bit1taskOver = 0;\r\n                            LogHelper.Info($\"RGV 1工位任务{task1.S_TASK_NO} çŠ¶æ€åˆ‡æ¢ä¸º{task1.S_B_STATE}\");\r\n                            //tag.RGV.bit1taskOver_LAST = 1;\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"1\", out string msg);\r\n                            LogHelper.Info($\"RGV 1工位任务写处理\");\r\n                            taskservice.Update(task1);\r\n                            LogHelper.Info($\"RGV 1工位任务更新。\");\r\n                        }\r\n                        else\r\n                        {\r\n                            LogHelper.Info(\"RGV1工位任务已经完成。\");\r\n                        }\r\n                    }\r\n                }\r\n                else if (tag.RGV.ReadTask1No == 0)\r\n                {\r\n                    LogHelper.Info($\"RGV 1工位没有任务》\");\r\n                }\r\n\r\n                LogHelper.Info($\"查看RGV 2工位任务》\");\r\n                if (tag.RGV.ReadTask2No > 0 && tag.RGV.bit2taskOver == 1)\r\n                {\r\n                    var taskno = tag.RGV.ReadTask2No;\r\n                    LogHelper.Info($\"RGV 2工位任务{tag.RGV.ReadTask2No}\");\r\n                    string tno = \"TN\" + (DateTime.Now.ToString(\"yy\")) + ((taskno.ToString()).PadLeft(8, '0'));\r\n                    task2 = taskservice.FindEntity(x => x.S_TASK_NO == tno);\r\n\r\n                    LogHelper.Info($\"RGV2工位任务{JsonConvert.SerializeObject(task2)}.bit2taskOver_LAST:{tag.RGV.bit2taskOver_LAST}\");\r\n                    if (tag.RGV.bit2taskOver_LAST == 0 && task2 != null)\r\n                    {\r\n                        if (task2.S_B_STATE != \"完成\")\r\n                        {\r\n                            thisOver = 2;\r\n                            if (task2.S_B_STATE == \"取货完成\")\r\n                            {\r\n                                task2.S_B_STATE = \"完成\";\r\n                                tag.RGV.ReadTask2No = 0;\r\n                            }\r\n                            else\r\n                            {\r\n                                task2.S_B_STATE = \"取货完成\";\r\n                            }\r\n                            tag.RGV.bit2taskOver = 0;\r\n                            LogHelper.Info($\"RGV 2工位任务{task2.S_TASK_NO} çŠ¶æ€åˆ‡æ¢ä¸º{task2.S_B_STATE}\");\r\n                            RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"1\", out string msg);\r\n                            LogHelper.Info($\"RGV 2工位任务写处理\");\r\n                            taskservice.Update(task2);\r\n                            LogHelper.Info($\"RGV 2工位任务更新。\");\r\n                        }\r\n                        else\r\n                        {\r\n                            LogHelper.Info(\"RGV2工位任务已经完成。\");\r\n                        }\r\n                    }\r\n                }\r\n                else if (tag.RGV.ReadTask2No == 0)\r\n                {\r\n                    LogHelper.Info($\"RGV 2工位没有任务》\");\r\n                }\r\n\r\n\r\n\r\n                //if (thisOver > 0)\r\n                //{\r\n                //    var v2 = RedisHelper.Get<WriteGroupEntity>(\"RGVQueue\", out string rev);\r\n                //    if (v2 != null)\r\n                //    {\r\n                //        LogHelper.Info($\"RGVQueue è¯»åˆ°ç»“æžœ-{JsonConvert.SerializeObject(v2)}  \\n ä¸‹å‘前进行清除。\");\r\n                //        var b = RedisHelper.Remove(\"RGVQueue\", out rev);\r\n                //    }\r\n                //}\r\n\r\n                ///1 æœ‰è´§  å°±2 å–。  1 æ²¡è´§ å°±2 å¸è´§ï¼Œ éƒ½æœ‰è´§  å°±1卸货。 éƒ½æ²¡è´§ å°±1卸\r\n                var tklist = taskservice.FindList(x => x.S_B_STATE == \"未执行\" && x.S_WORK_MODE == \"RGV\").OrderBy(x => x.T_CREATE).ToList();\r\n                if (task1 != null && task1.S_B_STATE != \"完成\") //1有任务\r\n                {\r\n                    if (task2 != null && task2.S_B_STATE != \"完成\")// 1 æœ‰ä»»åŠ¡  2 æœ‰ä»»åŠ¡ã€‚ \r\n                    {\r\n                        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 ä¹Ÿæœ‰ä»»åŠ¡{task2.S_TASK_NO}。 å¼€å§‹å·¥ä½1 å¸è´§ã€‚\");\r\n                        tag.RGV.workMod = 1;\r\n                        tag.RGV.taskmod = 2;\r\n                        tag.RGV.taskno1 = Convert.ToUInt32(task1.S_TASK_NO.Substring(4));\r\n                        tag.RGV.task1do = Convert.ToUInt16(task1.S_END_LOC);\r\n                        System.Threading.Thread.Sleep(750);\r\n                        //RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                        //tag.RGV.taskend = 125;\r\n                        //Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\");\r\n\r\n                        LogHelper.Info($\"{task1.S_TASK_NO}> bit1taskOver_LAST å†™ 0\");\r\n                        RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                        LogHelper.Info($\"{task1.S_TASK_NO}> end å†™ 125\");\r\n                        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                    }\r\n                    else //1有任务  2 æ²¡ä»»åŠ¡ã€‚  \r\n                    {\r\n\r\n                        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§å–货任务。\");\r\n\r\n                        var leftSide = new List<string> { \"1023\", \"1020\" };\r\n                        var RightSide = new List<string> { \"1002\", \"1008\", \"1010\", \"1016\" };\r\n                        bool creT2 = false;\r\n\r\n                        // 2号 ä¼˜å…ˆç»™ 1020  1008  1016\r\n                        var t2 = tklist.OrderBy(x => x.T_CREATE).ToList().Find(x => x.S_START_LOC == \"1020\" || x.S_START_LOC == \"1008\" || x.S_START_LOC == \"1016\");\r\n                        if (t2 != null)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾1020  1008  1016取货任务{t2.S_TASK_NO}。\");\r\n                            tag.RGV.workMod = 2;\r\n                            tag.RGV.taskmod = 1;\r\n                            tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                            tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                            t2.S_B_STATE = \"已推送\";\r\n                            taskservice.Update(t2);\r\n                            creT2 = true;\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                            RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                        ////2 å¦‚果有同侧取货任务。就取。没有\r\n                        //else if (leftSide.Contains(task1.S_START_LOC))\r\n                        //{\r\n                        //    leftSide.Remove(task1.S_START_LOC);\r\n                        //    var lsde = leftSide.FirstOrDefault();\r\n                        //    t2 = tklist.Find(x => x.S_START_LOC == lsde && x.S_END_LOC != \"1017\");\r\n                        //    if (t2 != null) //同侧取货任务。\r\n                        //    {\r\n                        //        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§å–货任务{t2.S_TASK_NO}。\");\r\n                        //        tag.RGV.workMod = 2;\r\n                        //        tag.RGV.taskmod = 1;\r\n                        //        tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                        //        tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                        //        t2.S_B_STATE = \"已推送\";\r\n                        //        taskservice.Update(t2);\r\n                        //        creT2 = true;\r\n                        //        System.Threading.Thread.Sleep(750);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                        //        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                        //        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        //    }\r\n                        //}\r\n                        //else if (RightSide.Contains(task1.S_START_LOC))\r\n                        //{\r\n                        //    RightSide.Remove(task1.S_START_LOC);\r\n                        //    t2 = tklist.Find(x => RightSide.Contains(x.S_START_LOC) && x.S_END_LOC != \"1017\");\r\n                        //    if (t2 != null) //同侧取货任务。\r\n                        //    {\r\n                        //        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§ 1002,1010 å–货任务{t2.S_TASK_NO}。\");\r\n                        //        tag.RGV.workMod = 2;\r\n                        //        tag.RGV.taskmod = 1;\r\n                        //        tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                        //        tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                        //        t2.S_B_STATE = \"已推送\";\r\n                        //        taskservice.Update(t2);\r\n                        //        creT2 = true;\r\n                        //        System.Threading.Thread.Sleep(750);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 125\");\r\n                        //        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                        //        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        //    }\r\n                        //}\r\n                        else //1 ç›´æŽ¥å¸è´§ã€‚ \r\n                        //if (!creT2)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ²¡æœ‰åŒä¾§å–货任务 1工位卸货。\");\r\n                            tag.RGV.workMod = 1;\r\n                            tag.RGV.taskmod = 2;\r\n                            tag.RGV.taskno1 = Convert.ToUInt32(task1.S_TASK_NO.Substring(4));\r\n                            tag.RGV.task1do = Convert.ToUInt16(task1.S_END_LOC);\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{task1.S_TASK_NO}> bit1taskOver_LAST å†™ 0\");\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{task1.S_TASK_NO}> taskend å†™ 0\");\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (task2 != null && task2.S_B_STATE != \"完成\")// 1 æ²¡ä»»åŠ¡  2 æœ‰ä»»åŠ¡ã€‚ \r\n                    {\r\n                        LogHelper.Info($\"查看RGV 1工位没任务,工位2 æœ‰ä»»åŠ¡{task2.S_TASK_NO}。工位2卸货。。\");\r\n                        //2 å¸è´§ã€‚\r\n                        tag.RGV.workMod = 2;\r\n                        tag.RGV.taskmod = 2;\r\n                        tag.RGV.taskno2 = Convert.ToUInt32(task2.S_TASK_NO.Substring(4));\r\n                        tag.RGV.task2do = Convert.ToUInt16(task2.S_END_LOC);\r\n                        System.Threading.Thread.Sleep(750);\r\n                        LogHelper.Info($\"{task2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //tag.RGV.taskend = 125;\r\n                        LogHelper.Info($\"{task2.S_TASK_NO}> taskend å†™125\");\r\n                        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                    }\r\n                    else if (tklist.Any()) //1mei ä»»åŠ¡  2 æ²¡ä»»åŠ¡ã€‚\r\n                    {\r\n                        LogHelper.Info($\"查看RGV 1工位没任务,工位2 ä¹Ÿæ²¡ä»»åŠ¡ã€‚ä¼˜å…ˆ1工位终点1017任务。。\");\r\n                        //、下 1017任务 ç»™1号工位。\r\n                        //var lss = tklist.Take(2).ToList();\r\n                        var e1017first = tklist.Find(x => x.S_START_LOC == \"1002\" || x.S_START_LOC == \"1010\" || x.S_START_LOC == \"1023\");\r\n                        //if (e1017first != null)\r\n                        //{\r\n                        //    e1017first = tklist.FirstOrDefault();\r\n                        //}\r\n                        if (e1017first != null)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 ä»»åŠ¡å·¥ä½2 æ²¡ä»»åŠ¡ã€‚ 1002  1010  1023取货任务{e1017first.S_TASK_NO}。\");\r\n                            tag.RGV.workMod = 1;\r\n                            tag.RGV.taskmod = 1;\r\n                            uint tno = Convert.ToUInt32(e1017first.S_TASK_NO.Substring(4));\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> è½¬æ¢åŽä»»åŠ¡å·{tno} å¼€å§‹å†™å…¥ã€‚\");\r\n                            tag.RGV.taskno1 = tno;\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}>开始写入 task1do>>{e1017first.S_START_LOC}。\");\r\n                            tag.RGV.task1do = Convert.ToUInt16(e1017first.S_START_LOC);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> æ›´æ–°ä»»åŠ¡ã€‚\");\r\n                            e1017first.S_B_STATE = \"已推送\";\r\n                            taskservice.Update(e1017first);\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> bit1taskOver_LAST å†™0\");\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> taskend å†™125\");\r\n                            //tag.RGV.taskend=125\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                        else\r\n                        {\r\n                            var t2 = tklist.OrderBy(x => x.T_CREATE).ToList().Find(x => x.S_START_LOC == \"1020\" || x.S_START_LOC == \"1008\" || x.S_START_LOC == \"1016\");\r\n                            if (tklist != null)\r\n                            {\r\n                                LogHelper.Info($\"查看RGV1 æ²¡ä»»åŠ¡å·¥ä½2 æ²¡ä»»åŠ¡ã€‚ æ‰¾1020  1008  1016取货任务{t2.S_TASK_NO}。\");\r\n                                tag.RGV.workMod = 2;\r\n                                tag.RGV.taskmod = 1;\r\n                                tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                                tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                                t2.S_B_STATE = \"已推送\";\r\n                                taskservice.Update(t2);\r\n                                System.Threading.Thread.Sleep(750);\r\n                                LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                                RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                                LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                                Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                LogHelper.Info($\"rgv å¤„理完成。taskend 125\");\r\n                #endregion\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                LogHelper.Info(ex.Message + ex.StackTrace);\r\n            }\r\n        }\r\n\r\n\r\n        public void ThreadGrats(Tag tag, Action<HaiKangOrderInfo> continueTask)\r\n        {\r\n            Console.WriteLine($\"ThreadGrats å…‰æ …处理 =================> \");\r\n            var taskCOdes = new List<string> { \"Sarrive\", \"Srelease\", \"Earrive\", \"Erelease\" };\r\n            TaskActRepository taskActRepository = new TaskActRepository();\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            var requires = taskActRepository.FindList(x => taskCOdes.Contains(x.S_ACTION_CODE) && x.N_CREATEMETHOD == 0);\r\n            foreach (var item in requires)\r\n            {\r\n                var tin = taskCOdes.IndexOf(item.S_ACTION_CODE);\r\n                if (tin == -1)\r\n                {\r\n                    item.N_CREATEMETHOD = -1;\r\n                    taskActRepository.Update(item);\r\n                    continue;\r\n                }\r\n                //var task = taskRepository.FindEntity(x => x.S_TASK_NO == item.S_TASK_NO);\r\n                string loc = \"\";\r\n                if (tin < 2)\r\n                {\r\n                    loc = item.S_START_LOC;\r\n                }\r\n                else\r\n                {\r\n                    loc = item.S_END_LOC;\r\n                }\r\n                if (loc == null) continue; else loc = loc.Trim();\r\n                bool goin = tin % 2 == 0;\r\n                bool continuuuuu = false;\r\n                var dev = Settings.deviceInfos.Find(x => x.location.Contains(loc));\r\n                if (dev != null)\r\n                {\r\n                    var V = dev.location.ToList().FindIndex(x => x == loc) == 0;\r\n                    //车走了  å¼€å…‰æ …\r\n                    if (!goin)\r\n                    {\r\n                        if (dev.deviceType == 1)\r\n                        {\r\n                            LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"R02\" : \"R04\"), \"true\", dev.deviceName + \"Queue\"));\r\n                            Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"R02\" : \"R04\"), \"true\", dev.deviceName + \"Queue\");\r\n\r\n                        }\r\n                        else if (dev.deviceType == 2)\r\n                        {\r\n                            LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"D1222\" : \"D1223\"), \"1\", dev.deviceName + \"Queue\"));\r\n                            Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"D1222\" : \"D1223\"), \"1\", dev.deviceName + \"Queue\");\r\n                        }\r\n\r\n                        item.N_CREATEMETHOD = 1;\r\n                        taskActRepository.Update(item);\r\n                    }\r\n                    //车要进入交互。\r\n                    else\r\n                    {\r\n                        if (dev.deviceType == 1)\r\n                        {\r\n                            var tf = Conn.默认Redis.GetValue(dev.deviceName + \".\" + (V ? \"R50\" : \"R52\"));//读关闭状态\r\n                            if (tf?.ToLower() == \"true\")\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚ å·²ç»å…³é—­ï¼\");\r\n                                continuuuuu = true;\r\n                            }\r\n                            else\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"R01\" : \"R03\"), \"true\", dev.deviceName + \"Queue\"));\r\n                                Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"R01\" : \"R03\"), \"true\", dev.deviceName + \"Queue\");\r\n                            }\r\n\r\n                        }\r\n                        else if (dev.deviceType == 2)\r\n                        {\r\n                            var tf = Conn.默认Redis.GetValue(dev.deviceName + \".D1202\");\r\n                            int numm = int.Parse(string.IsNullOrEmpty(tf) ? \"0\" : tf);\r\n                            if (TcpServer.GetBitdata(numm, (V ? 0 : 1)) == 1)\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚ å·²ç»å…³é—­ï¼\");\r\n                                continuuuuu = true;\r\n                            }\r\n                            else\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"D1220\" : \"D1221\"), dev.deviceName + \"Queue\"));\r\n                                Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"D1220\" : \"D1221\"), \"1\", dev.deviceName + \"Queue\");\r\n                            }\r\n                        }\r\n\r\n                    }\r\n\r\n                }\r\n                if (continuuuuu)\r\n                {\r\n                    LogHelper.Info($\"{item.S_TASK_NO}{item.S_ACTION_CODE} è½¦è¾†å‘送继续任务!\");\r\n                    continueTask?.Invoke(new HaiKangOrderInfo\r\n                    {\r\n                        reqCode = item.S_ID.Replace(\"-\", \"\"),\r\n                        taskCode = item.S_TASK_NO\r\n                    });\r\n                    item.N_CREATEMETHOD = 1;\r\n                    taskActRepository.Update(item);\r\n                }\r\n            }\r\n            System.Threading.Thread.Sleep(3000);\r\n            //重置信号\r\n            foreach (var dev in Settings.deviceInfos.FindAll(x => x.deviceType == 2))\r\n            {\r\n                var tf = Conn.默认Redis.GetValue(dev.deviceName + \".D1202\");\r\n                int numm = int.Parse(string.IsNullOrEmpty(tf) ? \"0\" : tf);\r\n                if (TcpServer.GetBitdata(numm, 0) == 0)\r\n                {\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1220\", \"0\", dev.deviceName + \"Queue\");\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1222\", \"0\", dev.deviceName + \"Queue\");\r\n                }\r\n                else if (TcpServer.GetBitdata(numm, 1) == 0)\r\n                {\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1221\", \"0\", dev.deviceName + \"Queue\");\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1223\", \"0\", dev.deviceName + \"Queue\");\r\n                }\r\n            }\r\n\r\n        }\r\n        /// <summary>\r\n        /// 1020  1023空框下线\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadEdown(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadEdown 20 23 = ç©ºä¸‹æ£€æµ‹ =================> \");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1020\", \"1023\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} ç©ºä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}  \");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n                    try\r\n                    {\r\n                        var listtep = new List<string>();\r\n                        if (Bssx == \"1020\")\r\n                        {\r\n                            if (tag.SF下料位.RArrive1003 == 1)\r\n                            {\r\n                                listtep = new List<string> { \"1012\", \"1004\" };\r\n                            }\r\n                            else\r\n                            {\r\n                                listtep = new List<string> { \"1004\", \"1012\" };\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            if (tag.SF下料位.RArrive1005 == 1)\r\n                            {\r\n                                listtep = new List<string> { \"1014\", \"1006\" };\r\n                            }\r\n                            else\r\n                            {\r\n                                listtep = new List<string> { \"1006\", \"1014\" };\r\n                            }\r\n                        }\r\n\r\n                        foreach (var item in listtep)//(Bssx == \"1020\" ? new string[] { \"1004\", \"1012\" } : new string[] { \"1006\", \"1014\" }))\r\n                        {\r\n                            var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                            var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                            if (R5 == 5 && R5空闲_LAST == 0 && task == null)\r\n                            {\r\n                                task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                                msg = \"\";\r\n                                if (task != null)\r\n                                {\r\n                                    Console.WriteLine($\" {item}有正在 [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                                    LogHelper.Info($\" {item}有正在 [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                                    continue;\r\n                                }\r\n\r\n                                var b = TaskProcess.CreateTask(\"\", Bssx, item, \"空上RGV\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                                if (b)\r\n                                {\r\n                                    LogHelper.Debug($\"输送线RGV空托任务 from:{Bssx}>to {item}开始创建成功\");\r\n                                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                                    RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out msg);\r\n                                    //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                                    break;\r\n                                }\r\n                            }\r\n                            else if (R5 != 5 && R5空闲_LAST == 1)\r\n                            {\r\n                                RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out msg);\r\n                                //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"0\", $\"S{item}ReadQueue\");\r\n                            }\r\n                        }\r\n                        System.Threading.Thread.Sleep(1000);\r\n                    }\r\n                    catch (Exception ex)\r\n                    {\r\n                        LogHelper.Error(ex.Message, ex);\r\n                        Console.WriteLine(ex.Message + ex.StackTrace);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"0\", $\"S{Bssx}ReadQueue\");\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n\r\n            foreach (var item in new string[] { \"1004\", \"1012\", \"1006\", \"1014\", \"1026\", \"1017\" })\r\n            {\r\n                var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                if (R5 != 5 && R5空闲_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"0\", $\"S{item}ReadQueue\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ThreadDdown(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadDdown 08 10 ==================> 1026\");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1008\", \"1016\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} æ»¡ä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}\");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n\r\n                    var item = \"1026\";\r\n                    var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                    var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                    if (R5 == 5 && R5空闲_LAST == 0)\r\n                    {\r\n                        task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                        msg = \"\";\r\n                        if (task != null)\r\n                        {\r\n                            Console.WriteLine($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            LogHelper.Info($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            continue;\r\n                        }\r\n                        var b = TaskProcess.CreateTask(\"\", Bssx, item, \"满转1026\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                        if (b)\r\n                        {\r\n                            RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                            RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out string msg2);\r\n                            //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                            //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                            break;\r\n                        }\r\n                    }\r\n                    else if (R5 != 5 && R5空闲_LAST == 1)\r\n                    {\r\n                        RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg2);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"0\", $\"S{Bssx}ReadQueue\");\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n        }\r\n\r\n        public void Thread0210Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Thread0210Down ==================>\");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1002\", \"1010\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} æ»¡ä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}\");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n                    var item = \"1017\";\r\n                    var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                    var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                    if (R5 == 5 && R5空闲_LAST == 0)\r\n                    {\r\n                        task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                        msg = \"\";\r\n                        if (task != null)\r\n                        {\r\n                            Console.WriteLine($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            LogHelper.Info($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            continue;\r\n                        }\r\n                        var b = TaskProcess.CreateTask(\"\", Bssx, item, \"满转1017\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                        if (b)\r\n                        {\r\n                            RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                            RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out string msg1);\r\n                            //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                            //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                            break;\r\n                        }\r\n                    }\r\n                    else if (R5 != 5 && R5空闲_LAST == 1)\r\n                    {\r\n                        RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg1);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n        }\r\n\r\n\r\n        public void Thread下料位检测(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Thread下料位检测    =====>\");\r\n            foreach (var ssx in new string[] { \"1003\", \"1005\", \"1011\", \"1013\" })\r\n            {\r\n                var RArrive = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"FNK1003051113.RArrive{ssx}\"), typeof(System.UInt16));\r\n                var RArriveLast = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"FNK1003051113.RArrive{ssx}_LAST\"), typeof(System.UInt16));\r\n                if (RArrive == 1 && RArriveLast == 0)\r\n                {\r\n                    if (ssx == \"1005\" && tag.SF下料位.WRelease1005 == 0)\r\n                    {\r\n                        tag.FNK1.D2215 = 1;\r\n                        //tag.SF下料位.RArrive1005_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1005_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1005 = 0;\r\n                        //tag.SF下料位.WSafe0305 = 0;\r\n                    }\r\n                    else if (ssx == \"1003\" && tag.SF下料位.WRelease1003 == 0)\r\n                    {\r\n                        tag.FNK1.D2210 = 1;\r\n                        //tag.SF下料位.RArrive1003_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1003_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1003 = 0;\r\n                        //tag.SF下料位.WSafe0305 = 0;\r\n                    }\r\n                    else if (ssx == \"1013\" && tag.SF下料位.WRelease1013 == 0)\r\n                    {\r\n                        tag.FNK2.D2215 = 1;\r\n                        //tag.SF下料位.RArrive1013_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1013_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1013 = 0;\r\n                        //tag.SF下料位.WSafe1113 = 0;\r\n                    }\r\n                    else if (ssx == \"1011\" && tag.SF下料位.WRelease1011 == 0)\r\n                    {\r\n                        tag.FNK2.D2210 = 1;\r\n                        //tag.SF下料位.RArrive1011_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1011_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1011 = 0;\r\n                        //tag.SF下料位.WSafe1113 = 0;\r\n                    }\r\n                }\r\n                else if (RArrive == 0 && RArriveLast == 1)\r\n                {\r\n                    RedisHelper.Add($\"FNK1003051113.RArrive{ssx}_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"FNK1003051113.RArrive{ssx}_LAST\", \"0\", $\"FNK1003051113Queue\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ThreadFNK1Over(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadFNK1Over    =====>\");\r\n            if (tag.FNK1.D2217 == 1 && tag.FNK1.D2217_LAST == 0)\r\n            {\r\n                tag.FNK1.D2215 = 0;\r\n                //tag.FNK1.D2212_LAST = 1;\r\n                RedisHelper.Add($\"p发那科1下线.D2217_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1005 = 1;\r\n                tag.SF下料位.WSafe0305 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1005_LAST\", \"0\", out msg);\r\n            }\r\n            if (tag.FNK1.D2216 == 1)\r\n                tag.FNK1.D2215 = 0;\r\n            else if (tag.FNK1.D2217 == 0 && tag.FNK1.D2217_LAST == 1)\r\n                //tag.FNK1.D2217_LAST = 0;\r\n                RedisHelper.Add($\"p发那科1下线.D2217_LAST\", \"0\", out string msg);\r\n\r\n            if (tag.FNK1.D2212 == 1 && tag.FNK1.D2212_LAST == 0)\r\n            {\r\n                tag.FNK1.D2210 = 0;\r\n                //tag.FNK1.D2217_LAST = 1;\r\n                RedisHelper.Add($\"p发那科1下线.D2212_LAST\", \"1\", out string msg);\r\n                tag.SF下料位.WRelease1003 = 1;\r\n                tag.SF下料位.WSafe0305 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1003_LAST\", \"0\", out msg);\r\n            }\r\n            //else if (tag.FNK1.D2211 == 1)\r\n            //    tag.FNK1.D2210 = 0;\r\n            else if (tag.FNK1.D2212 == 0 && tag.FNK1.D2212_LAST == 1)\r\n            {\r\n                //tag.FNK1.D2212_LAST = 0;\r\n                RedisHelper.Add($\"p发那科1下线.D2212_LAST\", \"0\", out string msg);\r\n            }\r\n            if (tag.FNK1.D2211 == 1)\r\n                tag.FNK1.D2210 = 0;\r\n\r\n        }\r\n        public void ThreadFNK2Over(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadFNK2Over    =====>\");\r\n            if (tag.FNK2.D2217 == 1 && tag.FNK2.D2217_LAST == 0)\r\n            {\r\n                tag.FNK2.D2215 = 0;\r\n                //tag.FNK2.D2212_LAST = 1;\r\n                RedisHelper.Add($\"p发那科2下线.D2217_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1013 = 1;\r\n                tag.SF下料位.WSafe1113 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1013_LAST\", \"0\", out msg);\r\n            }\r\n            else if (tag.FNK2.D2217 == 0 && tag.FNK2.D2217_LAST == 1)\r\n                //tag.FNK2.D2217_LAST = 0;\r\n                RedisHelper.Add($\"p发那科2下线.D2217_LAST\", \"0\", out string msg);\r\n\r\n            if (tag.FNK2.D2216 == 1)\r\n                tag.FNK2.D2215 = 0;\r\n\r\n            if (tag.FNK2.D2212 == 1 && tag.FNK2.D2212_LAST == 0)\r\n            {\r\n                tag.FNK2.D2210 = 0;\r\n                //tag.FNK2.D2217_LAST = 1;\r\n                RedisHelper.Add($\"p发那科2下线.D2212_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1011 = 1;\r\n                tag.SF下料位.WSafe1113 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1011_LAST\", \"0\", out msg);\r\n            }\r\n            else if (tag.FNK2.D2212 == 0 && tag.FNK2.D2212_LAST == 1)\r\n            {\r\n                //tag.FNK2.D2212_LAST = 0;\r\n                RedisHelper.Add($\"p发那科2下线.D2212_LAST\", \"0\", out string msg);\r\n            }\r\n            if (tag.FNK2.D2211 == 1)\r\n                tag.FNK2.D2210 = 0;\r\n\r\n        }\r\n\r\n        public void Thread1019Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"1019任务状态:   =====>\");\r\n            Console.WriteLine($\"1019任务状态:{tag.SA1019.RtaskState}- barcode:{tag.SA1019.R托盘码}- ç©ºé—²{tag.SA1019.R5空闲}\");\r\n        }\r\n        public void Thread1025Up(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1025 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA1025 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1025.RtaskState}- ç©ºé—²{tag.SA1025.R5空闲}\");\r\n        }\r\n        public void Thread1022Up(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1022    =====>\");\r\n            Console.WriteLine($\"SA1022 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1022.RtaskState}- ç©ºé—²{tag.SA1022.R5空闲}\");\r\n        }\r\n        public void Thread1030Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1030 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA1030 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1030.RtaskState}- ç©ºé—²{tag.SA1030.R5空闲}-->对应终点2001>空闲5:{tag.SA2001.R5空闲}\");\r\n        }\r\n        public void Thread2030Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA2030 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA2030 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA2030.RtaskState}- ç©ºé—²{tag.SA2030.R5空闲} - barcode:{tag.SA2030.R托盘码}\");\r\n        }\r\n\r\n\r\n    }\r\n}\r\n",
      "Code": "using Newtonsoft.Json;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.Concurrent;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing GZ.Modular.Redis;\r\nusing GZ.DB.Entity.OIDATABASE;\r\nusing GZ.DB.IRepository.OIDATABASE;\r\nusing GZ.DB.Repository.OIDATABASE;\r\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement;\r\nusing System.Windows.Interop;\r\nusing static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;\r\n\r\nnamespace GZ.Projects.AuxAllWCS\r\n{\r\n    public static class ExtendClass\r\n    {\r\n        public static void Disnull(this TaskRepository repository)\r\n        {\r\n            repository.dbcontext.Dispose();\r\n            repository = null;\r\n        }\r\n        public static void Disnull(this LocRepository repository)\r\n        {\r\n            repository.dbcontext.Dispose();\r\n            repository = null;\r\n        }\r\n        public static void Disnull(this TaskActRepository repository)\r\n        {\r\n            repository.dbcontext.Dispose();\r\n            repository = null;\r\n        }\r\n        public static void Disnull(this SYSRepository repository)\r\n        {\r\n            repository.dbcontext.Dispose();\r\n            repository = null;\r\n        }\r\n    }\r\n    public partial class AutoThread\r\n    {\r\n\r\n        private static AutoThread _instance;\r\n\r\n        // ç§æœ‰æž„造函数防止外部实例化\r\n        private AutoThread() { }\r\n\r\n        public static AutoThread Instance\r\n        {\r\n            get\r\n            {\r\n                if (_instance == null)\r\n                {\r\n                    _instance = new AutoThread();\r\n                }\r\n                return _instance;\r\n            }\r\n        }\r\n\r\n        // çº¿ç¨‹å®‰å…¨çš„委托缓存\r\n        private static readonly ConcurrentDictionary<string, Delegate> _methodCache = new ConcurrentDictionary<string, Delegate>();\r\n\r\n        // æ–¹æ³•执行器\r\n        public static object InvokeMethod(object instance, string methodName, params object[] args)\r\n        {\r\n            var cacheKey = $\"{instance.GetType().FullName}_{methodName}\";\r\n\r\n            if (!_methodCache.TryGetValue(cacheKey, out var methodDelegate))\r\n            {\r\n                // èŽ·å–æ–¹æ³•ä¿¡æ¯\r\n                var methodInfo = instance.GetType().GetMethod(\r\n                    methodName,\r\n                    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\r\n\r\n                if (methodInfo == null)\r\n                    throw new MissingMethodException($\"Method {methodName} not found\");\r\n\r\n                // åˆ›å»ºå§”托并缓存\r\n                methodDelegate = Delegate.CreateDelegate(\r\n                    GetDelegateType(methodInfo),\r\n                    instance,\r\n                    methodInfo);\r\n\r\n                _methodCache.TryAdd(cacheKey, methodDelegate);\r\n            }\r\n\r\n            // æ‰§è¡Œå§”托\r\n            return methodDelegate.DynamicInvoke(args);\r\n        }\r\n\r\n        // æ ¹æ®æ–¹æ³•签名生成对应的委托类型\r\n        private static Type GetDelegateType(MethodInfo methodInfo)\r\n        {\r\n            var parameterTypes = methodInfo.GetParameters()\r\n                .Select(p => p.ParameterType)\r\n                .ToList();\r\n\r\n            if (methodInfo.ReturnType == typeof(void))\r\n            {\r\n                return System.Linq.Expressions.Expression.GetActionType(parameterTypes.ToArray());\r\n            }\r\n            else\r\n            {\r\n                parameterTypes.Add(methodInfo.ReturnType);\r\n                return System.Linq.Expressions.Expression.GetFuncType(parameterTypes.ToArray());\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// é…ç½®åˆå§‹åŒ–。\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        /// <param name=\"action\"></param>\r\n        public void ThreadSettingInit(Tag tag, Action action)\r\n        {\r\n            Console.WriteLine(\"初始化配置 çº¿ç¨‹ run \" + tag.Global.SettingsOver);\r\n            if (tag.Global.SettingsOver == 0)\r\n            {\r\n                action?.Invoke();\r\n                tag.Global.SettingsOver = 1;\r\n            }\r\n            else if (Settings.deviceInfos.Count == 0)\r\n            {\r\n                tag.Global.SettingsOver = 0;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// æ·é¡º1 ä¿¡å·å¤„理\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadJS1(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadJS1 æ·é¡º1 ä¿¡å·å¤„理 =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 2 && x.deviceName == \"Js捷顺1\");\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.Js1.D1212_LAST == 0 && TcpServer.GetBitdata(tag.Js1.D1212, 2) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[0]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js1.D1212_LAST = 1;\r\n                        RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js1.D1212_LAST == 1 && TcpServer.GetBitdata(tag.Js1.D1212, 2) == 0)\r\n                {\r\n                    //tag.Js1.D1212_LAST = 0; \r\n                    RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"0\", out string msg);\r\n                }\r\n                if (tag.Js1.D1213_LAST == 0 && TcpServer.GetBitdata(tag.Js1.D1212, 3) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[1]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js1.D1213_LAST = 1;\r\n                        RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js1.D1213_LAST == 1 && TcpServer.GetBitdata(tag.Js1.D1212, 3) == 0)\r\n                {\r\n                    //tag.Js1.D1213_LAST = 0;\r\n                    RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"0\", out string msg);\r\n                }\r\n            }\r\n        }\r\n        /// <summary>\r\n        /// æ·é¡º2 ä¿¡å·å¤„理\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadJS2(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadJS2 æ·é¡º2 ä¿¡å·å¤„理 =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 2 && x.deviceName == \"Js捷顺2\");\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.Js2.D1212_LAST == 0 && TcpServer.GetBitdata(tag.Js2.D1212, 2) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[0]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js2.D1212_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js2.D1212_LAST == 1 && TcpServer.GetBitdata(tag.Js2.D1212, 2) == 0)\r\n                {\r\n                    //tag.Js2.D1212_LAST = 0;\r\n\r\n                    RedisHelper.Add($\"Js捷顺1.D1212_LAST\", \"0\", out string msg);\r\n                }\r\n                if (tag.Js2.D1213_LAST == 0 && TcpServer.GetBitdata(tag.Js2.D1212, 3) == 1)\r\n                {\r\n                    var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                    {\r\n                        requestType = 4,\r\n                        endBit = VERX.location[1]\r\n                    }));\r\n                    LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                    if (str.Contains(\"true\"))\r\n                    {\r\n                        //tag.Js2.D1213_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"1\", out string msg);\r\n                    }\r\n                }\r\n                if (tag.Js2.D1213_LAST == 1 && TcpServer.GetBitdata(tag.Js2.D1213, 2) == 0)\r\n                {\r\n                    //tag.Js2.D1213_LAST = 0;\r\n\r\n                    RedisHelper.Add($\"Js捷顺1.D1213_LAST\", \"0\", out string msg);\r\n                }\r\n            }\r\n        }\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”1 å·¦\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr1L(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr1L ç»´å¸Œå°”1 å·¦ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"1\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr1.R44 && !tag.wxr1.R44_LAST && tag.wxr1.R10)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[0],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr1.R44_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    //TaskRepository ts = new TaskRepository();\r\n                    if (tag.wxr1.R10_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr1.R10)\r\n                        {\r\n                            tag.wxr1.R10_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr1.R10 = true;\r\n                                tag.wxr1.R44_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”1 å³\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr1R(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr1R ç»´å¸Œå°”1 å³ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"1\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr1.R46 && !tag.wxr1.R46_LAST && tag.wxr1.R11)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[1],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr1.R46_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr1.R11_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr1.R11)\r\n                        {\r\n                            tag.wxr1.R11_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr1.R11 = true;\r\n                                tag.wxr1.R46_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”2 å·¦\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr2L(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr2L ç»´å¸Œå°”2 å·¦ =================> \");\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"2\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr2.R44 && !tag.wxr2.R44_LAST && tag.wxr2.R10)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[0],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[0]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr2.R44_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr2.R10_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr2.R10)\r\n                        {\r\n                            tag.wxr2.R10_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[0], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr2.R10 = true;\r\n                                tag.wxr2.R44_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[0], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// ç»´å¸Œå°”2 å³\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void Threadwxr2R(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Threadwxr2R ç»´å¸Œå°”2 å³ =================> \");\r\n\r\n            var VERX = Settings.deviceInfos?.Find(x => x.deviceType == 1 && x.deviceName.Contains(\"2\"));\r\n\r\n            if (VERX != null)\r\n            {\r\n                if (tag.wxr2.R46 && !tag.wxr2.R46_LAST && tag.wxr2.R11)\r\n                {\r\n                    if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                    {\r\n                        var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/200\", JsonConvert.SerializeObject(new\r\n                        {\r\n                            requestType = 1,\r\n                            cntrCode = traycode,\r\n                            startBit = VERX.location[1],\r\n                            endBit = \"\"\r\n                        }));\r\n                        LogHelper.Info($\"{VERX.location[1]}申请mes任务结果{str}\");\r\n                        if (str.Contains(\"true\"))\r\n                        {\r\n                            tag.wxr2.R46_LAST = true;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        TcpServer.TcpServerSend(VERX.deviceNo[2], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (tag.wxr2.R11_LAST) //托盘放置信号。。\r\n                    {\r\n                        if (tag.wxr2.R11)\r\n                        {\r\n                            tag.wxr2.R11_LAST = false;\r\n                        }\r\n                        else\r\n                        if (TcpServer.TrayIps.TryGetValue(VERX.deviceNo[1], out string traycode))\r\n                        {\r\n                            //上报校验。\r\n                            ///var str = Settings.apiHelper.Post(Settings.MESbaseUrl + \"mom-basic/dataTransmission/json/service/202\", requestJson);\r\n                            var str = Settings.apiHelper.Post(Settings.WMSbaseUrl + \"mom-basic/dataTransmission/json/service/202\", JsonConvert.SerializeObject(new\r\n                            {\r\n                                sceneType = 1,\r\n                                cntrCode = traycode,\r\n                            }));\r\n                            if (str.Contains(\"true\"))\r\n                            {\r\n                                //Conn.默认Redis.SetValue(\"维希尔抓臂1.R10\", \"true\", \"维希尔抓臂1Queue\");\r\n                                tag.wxr2.R11 = true;\r\n                                tag.wxr2.R46_LAST = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                //报警。\r\n                            }\r\n                        }\r\n                        else { TcpServer.TcpServerSend(VERX.deviceNo[1], GZ.Device.PLC.PlcHelper.Hex2Bin(\"544F4E\")); }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        public void ThreadTaskRun(Tag tag, Func<TaskEntity, bool> action)\r\n        {\r\n            Console.WriteLine($\"ThreadTaskRun ä»»åŠ¡ä¸‹å‘ =================> \");\r\n            LogHelper.Info(\"ThreadTaskRun ä»»åŠ¡ä¸‹å‘\");\r\n\r\n            ITaskRepository taskservice = new TaskRepository();\r\n            try\r\n            {\r\n                LogHelper.Info(\"任务下发  ARG ä»»åŠ¡ è¿›å…¥\");\r\n                #region AGV任务下发。\r\n\r\n                var tklist = taskservice.FindList(x => x.S_B_STATE == \"未执行\" && x.S_WORK_MODE == \"AGV\");\r\n                if (tklist.Any())\r\n                    foreach (var tk in tklist.GroupBy(item =>\r\n                    {\r\n                        var ticks = item.T_CREATE.Ticks;\r\n                        return new DateTime(ticks - ticks % (10 * TimeSpan.TicksPerMinute));\r\n                    }).OrderBy(x => x.Key))\r\n                    {\r\n                        var ts = tk.OrderByDescending(x => x.N_PRIORITY).ToList();\r\n                        foreach (var t in ts)\r\n                        {\r\n                            var b = false;\r\n                            b = action?.Invoke(t) ?? false; //new ViewModel().RunTask(t);\r\n\r\n                            if (b)\r\n                            {\r\n                                t.S_B_STATE = \"已推送\";\r\n                                taskservice.Update(t);\r\n                            }\r\n                        }\r\n                        break;\r\n                    }\r\n                //foreach (var tk in tklist.GroupBy(item =>\r\n                //{\r\n                //    var ticks = item.T_CREATE.Ticks;\r\n                //    return new DateTime(ticks - ticks % (10 * TimeSpan.TicksPerMinute));\r\n                //}).OrderBy(x => x.Key))\r\n                //if (tklist.Any())\r\n                //{\r\n\r\n                #endregion\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                LogHelper.Info(ex.Message + ex.StackTrace);\r\n            }\r\n            try\r\n            {\r\n                #region Rgv\r\n\r\n                LogHelper.Info($\"查看RGV ç”µé‡ï¼šã€{tag.RGV.R当前电量}】 å……电状态:【{tag.RGV.R充电状态}】 æ•…障代码:【{tag.RGV.RgvrunError}】\");\r\n\r\n                if (tag.RGV.taskend == 125)\r\n                {\r\n                    System.Threading.Thread.Sleep(3000);\r\n                    return;\r\n                }\r\n                LogHelper.Info(\"任务下发  Rgv ä»»åŠ¡ è¿›å…¥\");\r\n\r\n                var task1Isrun = false;\r\n                if (tag.RGV.ReadTask1No > 0 && tag.RGV.bit1taskOver != 1)\r\n                {\r\n                    task1Isrun = true;\r\n                    //if (tag.RGV.bit1taskOver_LAST == 1)\r\n                    //    RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                }\r\n                var task2Isrun = false;\r\n                if (tag.RGV.ReadTask2No > 0 && tag.RGV.bit2taskOver != 1)\r\n                {\r\n                    task2Isrun = true;\r\n                    //if (tag.RGV.bit2taskOver_LAST == 1)\r\n                    //    RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                }\r\n                if (task1Isrun || task2Isrun)\r\n                {\r\n                    string mes = \"\";\r\n                    if (task1Isrun)\r\n                        mes += tag.RGV.ReadTask1No + \"执行中...\";\r\n                    if (task2Isrun)\r\n                        mes += tag.RGV.ReadTask2No + \"执行中...\";\r\n                    LogHelper.Info($\"{mes} ä¸èƒ½ä¸‹å‘新任务。\");\r\n                    System.Threading.Thread.Sleep(3000);\r\n                    return; \r\n                }\r\n                var thisOver = 0;\r\n                TaskEntity task1 = null;\r\n                TaskEntity task2 = null;\r\n\r\n                LogHelper.Info($\"查看RGV 1工位任务》\");\r\n                if (tag.RGV.ReadTask1No > 0 && tag.RGV.bit1taskOver == 1)\r\n                {\r\n                    var taskno = tag.RGV.ReadTask1No;\r\n                    LogHelper.Info($\"RGV 1工位任务{tag.RGV.ReadTask1No}\");\r\n                    string tno = \"TN\" + (DateTime.Now.ToString(\"yy\")) + ((taskno.ToString()).PadLeft(8, '0'));\r\n                    task1 = taskservice.FindEntity(x => x.S_TASK_NO == tno);\r\n\r\n                    LogHelper.Info($\"RGV 1工位任务{JsonConvert.SerializeObject(task1)}.bit1taskOver_LAST:{tag.RGV.bit1taskOver_LAST}\");\r\n                    if (tag.RGV.bit1taskOver_LAST == 0 && task1 != null)\r\n                    {\r\n                        if (task1.S_B_STATE != \"完成\")\r\n                        {\r\n                            thisOver = 1;\r\n                            if (task1.S_B_STATE == \"取货完成\")\r\n                            {\r\n                                task1.S_B_STATE = \"完成\";\r\n                                tag.RGV.ReadTask1No = 0;\r\n                            }\r\n                            else\r\n                            {\r\n                                task1.S_B_STATE = \"取货完成\";\r\n                            }\r\n                            tag.RGV.bit1taskOver = 0;\r\n                            LogHelper.Info($\"RGV 1工位任务{task1.S_TASK_NO} çŠ¶æ€åˆ‡æ¢ä¸º{task1.S_B_STATE}\");\r\n                            //tag.RGV.bit1taskOver_LAST = 1;\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"1\", out string msg);\r\n                            LogHelper.Info($\"RGV 1工位任务写处理\");\r\n                            taskservice.Update(task1);\r\n                            LogHelper.Info($\"RGV 1工位任务更新。\");\r\n                        }\r\n                        else\r\n                        {\r\n                            LogHelper.Info(\"RGV1工位任务已经完成。\");\r\n                        }\r\n                    }\r\n                }\r\n                else if (tag.RGV.ReadTask1No == 0)\r\n                {\r\n                    LogHelper.Info($\"RGV 1工位没有任务》\");\r\n                }\r\n\r\n                LogHelper.Info($\"查看RGV 2工位任务》\");\r\n                if (tag.RGV.ReadTask2No > 0 && tag.RGV.bit2taskOver == 1)\r\n                {\r\n                    var taskno = tag.RGV.ReadTask2No;\r\n                    LogHelper.Info($\"RGV 2工位任务{tag.RGV.ReadTask2No}\");\r\n                    string tno = \"TN\" + (DateTime.Now.ToString(\"yy\")) + ((taskno.ToString()).PadLeft(8, '0'));\r\n                    task2 = taskservice.FindEntity(x => x.S_TASK_NO == tno);\r\n\r\n                    LogHelper.Info($\"RGV2工位任务{JsonConvert.SerializeObject(task2)}.bit2taskOver_LAST:{tag.RGV.bit2taskOver_LAST}\");\r\n                    if (tag.RGV.bit2taskOver_LAST == 0 && task2 != null)\r\n                    {\r\n                        if (task2.S_B_STATE != \"完成\")\r\n                        {\r\n                            thisOver = 2;\r\n                            if (task2.S_B_STATE == \"取货完成\")\r\n                            {\r\n                                task2.S_B_STATE = \"完成\";\r\n                                tag.RGV.ReadTask2No = 0;\r\n                            }\r\n                            else\r\n                            {\r\n                                task2.S_B_STATE = \"取货完成\";\r\n                            }\r\n                            tag.RGV.bit2taskOver = 0;\r\n                            LogHelper.Info($\"RGV 2工位任务{task2.S_TASK_NO} çŠ¶æ€åˆ‡æ¢ä¸º{task2.S_B_STATE}\");\r\n                            RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"1\", out string msg);\r\n                            LogHelper.Info($\"RGV 2工位任务写处理\");\r\n                            taskservice.Update(task2);\r\n                            LogHelper.Info($\"RGV 2工位任务更新。\");\r\n                        }\r\n                        else\r\n                        {\r\n                            LogHelper.Info(\"RGV2工位任务已经完成。\");\r\n                        }\r\n                    }\r\n                }\r\n                else if (tag.RGV.ReadTask2No == 0)\r\n                {\r\n                    LogHelper.Info($\"RGV 2工位没有任务》\");\r\n                }\r\n\r\n\r\n\r\n                //if (thisOver > 0)\r\n                //{\r\n                //    var v2 = RedisHelper.Get<WriteGroupEntity>(\"RGVQueue\", out string rev);\r\n                //    if (v2 != null)\r\n                //    {\r\n                //        LogHelper.Info($\"RGVQueue è¯»åˆ°ç»“æžœ-{JsonConvert.SerializeObject(v2)}  \\n ä¸‹å‘前进行清除。\");\r\n                //        var b = RedisHelper.Remove(\"RGVQueue\", out rev);\r\n                //    }\r\n                //}\r\n\r\n                ///1 æœ‰è´§  å°±2 å–。  1 æ²¡è´§ å°±2 å¸è´§ï¼Œ éƒ½æœ‰è´§  å°±1卸货。 éƒ½æ²¡è´§ å°±1卸\r\n                var tklist = taskservice.FindList(x => x.S_B_STATE == \"未执行\" && x.S_WORK_MODE == \"RGV\").OrderBy(x => x.T_CREATE).ToList();\r\n                if (task1 != null && task1.S_B_STATE != \"完成\") //1有任务\r\n                {\r\n                    if (task2 != null && task2.S_B_STATE != \"完成\")// 1 æœ‰ä»»åŠ¡  2 æœ‰ä»»åŠ¡ã€‚ \r\n                    {\r\n                        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 ä¹Ÿæœ‰ä»»åŠ¡{task2.S_TASK_NO}。 å¼€å§‹å·¥ä½1 å¸è´§ã€‚\");\r\n                        tag.RGV.workMod = 1;\r\n                        tag.RGV.taskmod = 2;\r\n                        tag.RGV.taskno1 = Convert.ToUInt32(task1.S_TASK_NO.Substring(4));\r\n                        tag.RGV.task1do = Convert.ToUInt16(task1.S_END_LOC);\r\n                        System.Threading.Thread.Sleep(750);\r\n                        //RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                        //tag.RGV.taskend = 125;\r\n                        //Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\");\r\n\r\n                        LogHelper.Info($\"{task1.S_TASK_NO}> bit1taskOver_LAST å†™ 0\");\r\n                        RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                        LogHelper.Info($\"{task1.S_TASK_NO}> end å†™ 125\");\r\n                        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                    }\r\n                    else //1有任务  2 æ²¡ä»»åŠ¡ã€‚  \r\n                    {\r\n\r\n                        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§å–货任务。\");\r\n\r\n                        var leftSide = new List<string> { \"1023\", \"1020\" };\r\n                        var RightSide = new List<string> { \"1002\", \"1008\", \"1010\", \"1016\" };\r\n                        bool creT2 = false;\r\n\r\n                        // 2号 ä¼˜å…ˆç»™ 1020  1008  1016\r\n                        var t2 = tklist.OrderBy(x => x.T_CREATE).ToList().Find(x => x.S_START_LOC == \"1020\" || x.S_START_LOC == \"1008\" || x.S_START_LOC == \"1016\");\r\n                        if (t2 != null)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾1020  1008  1016取货任务{t2.S_TASK_NO}。\");\r\n                            tag.RGV.workMod = 2;\r\n                            tag.RGV.taskmod = 1;\r\n                            tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                            tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                            t2.S_B_STATE = \"已推送\";\r\n                            taskservice.Update(t2);\r\n                            creT2 = true;\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                            RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                        ////2 å¦‚果有同侧取货任务。就取。没有\r\n                        //else if (leftSide.Contains(task1.S_START_LOC))\r\n                        //{\r\n                        //    leftSide.Remove(task1.S_START_LOC);\r\n                        //    var lsde = leftSide.FirstOrDefault();\r\n                        //    t2 = tklist.Find(x => x.S_START_LOC == lsde && x.S_END_LOC != \"1017\");\r\n                        //    if (t2 != null) //同侧取货任务。\r\n                        //    {\r\n                        //        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§å–货任务{t2.S_TASK_NO}。\");\r\n                        //        tag.RGV.workMod = 2;\r\n                        //        tag.RGV.taskmod = 1;\r\n                        //        tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                        //        tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                        //        t2.S_B_STATE = \"已推送\";\r\n                        //        taskservice.Update(t2);\r\n                        //        creT2 = true;\r\n                        //        System.Threading.Thread.Sleep(750);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                        //        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                        //        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        //    }\r\n                        //}\r\n                        //else if (RightSide.Contains(task1.S_START_LOC))\r\n                        //{\r\n                        //    RightSide.Remove(task1.S_START_LOC);\r\n                        //    t2 = tklist.Find(x => RightSide.Contains(x.S_START_LOC) && x.S_END_LOC != \"1017\");\r\n                        //    if (t2 != null) //同侧取货任务。\r\n                        //    {\r\n                        //        LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ‰¾åŒä¾§ 1002,1010 å–货任务{t2.S_TASK_NO}。\");\r\n                        //        tag.RGV.workMod = 2;\r\n                        //        tag.RGV.taskmod = 1;\r\n                        //        tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                        //        tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                        //        t2.S_B_STATE = \"已推送\";\r\n                        //        taskservice.Update(t2);\r\n                        //        creT2 = true;\r\n                        //        System.Threading.Thread.Sleep(750);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 125\");\r\n                        //        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //        LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                        //        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        //    }\r\n                        //}\r\n                        else //1 ç›´æŽ¥å¸è´§ã€‚ \r\n                        //if (!creT2)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 æœ‰ä»»åŠ¡{task1.S_TASK_NO},工位2 æ²¡ä»»åŠ¡ã€‚ æ²¡æœ‰åŒä¾§å–货任务 1工位卸货。\");\r\n                            tag.RGV.workMod = 1;\r\n                            tag.RGV.taskmod = 2;\r\n                            tag.RGV.taskno1 = Convert.ToUInt32(task1.S_TASK_NO.Substring(4));\r\n                            tag.RGV.task1do = Convert.ToUInt16(task1.S_END_LOC);\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{task1.S_TASK_NO}> bit1taskOver_LAST å†™ 0\");\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{task1.S_TASK_NO}> taskend å†™ 0\");\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (task2 != null && task2.S_B_STATE != \"完成\")// 1 æ²¡ä»»åŠ¡  2 æœ‰ä»»åŠ¡ã€‚ \r\n                    {\r\n                        LogHelper.Info($\"查看RGV 1工位没任务,工位2 æœ‰ä»»åŠ¡{task2.S_TASK_NO}。工位2卸货。。\");\r\n                        //2 å¸è´§ã€‚\r\n                        tag.RGV.workMod = 2;\r\n                        tag.RGV.taskmod = 2;\r\n                        tag.RGV.taskno2 = Convert.ToUInt32(task2.S_TASK_NO.Substring(4));\r\n                        tag.RGV.task2do = Convert.ToUInt16(task2.S_END_LOC);\r\n                        System.Threading.Thread.Sleep(750);\r\n                        LogHelper.Info($\"{task2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                        RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                        //tag.RGV.taskend = 125;\r\n                        LogHelper.Info($\"{task2.S_TASK_NO}> taskend å†™125\");\r\n                        Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                    }\r\n                    else if (tklist.Any()) //1mei ä»»åŠ¡  2 æ²¡ä»»åŠ¡ã€‚\r\n                    {\r\n                        LogHelper.Info($\"查看RGV 1工位没任务,工位2 ä¹Ÿæ²¡ä»»åŠ¡ã€‚ä¼˜å…ˆ1工位终点1017任务。。\");\r\n                        //、下 1017任务 ç»™1号工位。\r\n                        //var lss = tklist.Take(2).ToList();\r\n                        var e1017first = tklist.Find(x => x.S_START_LOC == \"1002\" || x.S_START_LOC == \"1010\" || x.S_START_LOC == \"1023\");\r\n                        //if (e1017first != null)\r\n                        //{\r\n                        //    e1017first = tklist.FirstOrDefault();\r\n                        //}\r\n                        if (e1017first != null)\r\n                        {\r\n                            LogHelper.Info($\"查看RGV1 ä»»åŠ¡å·¥ä½2 æ²¡ä»»åŠ¡ã€‚ 1002  1010  1023取货任务{e1017first.S_TASK_NO}。\");\r\n                            tag.RGV.workMod = 1;\r\n                            tag.RGV.taskmod = 1;\r\n                            uint tno = Convert.ToUInt32(e1017first.S_TASK_NO.Substring(4));\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> è½¬æ¢åŽä»»åŠ¡å·{tno} å¼€å§‹å†™å…¥ã€‚\");\r\n                            tag.RGV.taskno1 = tno;\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}>开始写入 task1do>>{e1017first.S_START_LOC}。\");\r\n                            tag.RGV.task1do = Convert.ToUInt16(e1017first.S_START_LOC);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> æ›´æ–°ä»»åŠ¡ã€‚\");\r\n                            e1017first.S_B_STATE = \"已推送\";\r\n                            taskservice.Update(e1017first);\r\n                            System.Threading.Thread.Sleep(750);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> bit1taskOver_LAST å†™0\");\r\n                            RedisHelper.Add($\"RGV.bit1taskOver_LAST\", \"0\", out string msg);\r\n                            LogHelper.Info($\"{e1017first.S_TASK_NO}> taskend å†™125\");\r\n                            //tag.RGV.taskend=125\r\n                            Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                        }\r\n                        else\r\n                        {\r\n                            var t2 = tklist.OrderBy(x => x.T_CREATE).ToList().Find(x => x.S_START_LOC == \"1020\" || x.S_START_LOC == \"1008\" || x.S_START_LOC == \"1016\");\r\n                            if (tklist != null)\r\n                            {\r\n                                LogHelper.Info($\"查看RGV1 æ²¡ä»»åŠ¡å·¥ä½2 æ²¡ä»»åŠ¡ã€‚ æ‰¾1020  1008  1016取货任务{t2.S_TASK_NO}。\");\r\n                                tag.RGV.workMod = 2;\r\n                                tag.RGV.taskmod = 1;\r\n                                tag.RGV.taskno2 = Convert.ToUInt32(t2.S_TASK_NO.Substring(4));\r\n                                tag.RGV.task2do = Convert.ToUInt16(t2.S_START_LOC);\r\n                                t2.S_B_STATE = \"已推送\";\r\n                                taskservice.Update(t2);\r\n                                System.Threading.Thread.Sleep(750);\r\n                                LogHelper.Info($\"{t2.S_TASK_NO}> bit2taskOver_LAST å†™ 0\");\r\n                                RedisHelper.Add($\"RGV.bit2taskOver_LAST\", \"0\", out string msg);\r\n                                LogHelper.Info($\"{t2.S_TASK_NO}> end å†™ 125\");\r\n                                Conn.默认Redis.SetValue(\"RGV.taskend\", \"125\", \"RGVQueue\", false);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                LogHelper.Info($\"rgv å¤„理完成。taskend 125\");\r\n                #endregion\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                LogHelper.Info(ex.Message + ex.StackTrace);\r\n            }\r\n        }\r\n\r\n\r\n        public void ThreadGrats(Tag tag, Action<HaiKangOrderInfo> continueTask)\r\n        {\r\n            Console.WriteLine($\"ThreadGrats å…‰æ …处理 =================> \");\r\n            var taskCOdes = new List<string> { \"Sarrive\", \"Srelease\", \"Earrive\", \"Erelease\" };\r\n            TaskActRepository taskActRepository = new TaskActRepository();\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            var requires = taskActRepository.FindList(x => taskCOdes.Contains(x.S_ACTION_CODE) && x.N_CREATEMETHOD == 0);\r\n            foreach (var item in requires)\r\n            {\r\n                var tin = taskCOdes.IndexOf(item.S_ACTION_CODE);\r\n                if (tin == -1)\r\n                {\r\n                    item.N_CREATEMETHOD = -1;\r\n                    taskActRepository.Update(item);\r\n                    continue;\r\n                }\r\n                //var task = taskRepository.FindEntity(x => x.S_TASK_NO == item.S_TASK_NO);\r\n                string loc = \"\";\r\n                if (tin < 2)\r\n                {\r\n                    loc = item.S_START_LOC;\r\n                }\r\n                else\r\n                {\r\n                    loc = item.S_END_LOC;\r\n                }\r\n                if (loc == null) continue; else loc = loc.Trim();\r\n                bool goin = tin % 2 == 0;\r\n                bool continuuuuu = false;\r\n                var dev = Settings.deviceInfos.Find(x => x.location.Contains(loc));\r\n                if (dev != null)\r\n                {\r\n                    var V = dev.location.ToList().FindIndex(x => x == loc) == 0;\r\n                    //车走了  å¼€å…‰æ …\r\n                    if (!goin)\r\n                    {\r\n                        if (dev.deviceType == 1)\r\n                        {\r\n                            LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"R02\" : \"R04\"), \"true\", dev.deviceName + \"Queue\"));\r\n                            Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"R02\" : \"R04\"), \"true\", dev.deviceName + \"Queue\");\r\n\r\n                        }\r\n                        else if (dev.deviceType == 2)\r\n                        {\r\n                            LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"D1222\" : \"D1223\"), \"1\", dev.deviceName + \"Queue\"));\r\n                            Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"D1222\" : \"D1223\"), \"1\", dev.deviceName + \"Queue\");\r\n                        }\r\n\r\n                        item.N_CREATEMETHOD = 1;\r\n                        taskActRepository.Update(item);\r\n                    }\r\n                    //车要进入交互。\r\n                    else\r\n                    {\r\n                        if (dev.deviceType == 1)\r\n                        {\r\n                            var tf = Conn.默认Redis.GetValue(dev.deviceName + \".\" + (V ? \"R50\" : \"R52\"));//读关闭状态\r\n                            if (tf?.ToLower() == \"true\")\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚ å·²ç»å…³é—­ï¼\");\r\n                                continuuuuu = true;\r\n                            }\r\n                            else\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"R01\" : \"R03\"), \"true\", dev.deviceName + \"Queue\"));\r\n                                Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"R01\" : \"R03\"), \"true\", dev.deviceName + \"Queue\");\r\n                            }\r\n\r\n                        }\r\n                        else if (dev.deviceType == 2)\r\n                        {\r\n                            var tf = Conn.默认Redis.GetValue(dev.deviceName + \".D1202\");\r\n                            int numm = int.Parse(string.IsNullOrEmpty(tf) ? \"0\" : tf);\r\n                            if (TcpServer.GetBitdata(numm, (V ? 0 : 1)) == 1)\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚ å·²ç»å…³é—­ï¼\");\r\n                                continuuuuu = true;\r\n                            }\r\n                            else\r\n                            {\r\n                                LogHelper.Info($\"{dev.deviceName}{(V ? \"å·¦\" : \"右\")} å…‰æ …{(goin ? \"关闭\" : \"开启\")} ç”³è¯·ã€‚\" + string.Format(\"{0}{1}{2}\", dev.deviceName + \".\" + (V ? \"D1220\" : \"D1221\"), dev.deviceName + \"Queue\"));\r\n                                Conn.默认Redis.SetValue(dev.deviceName + \".\" + (V ? \"D1220\" : \"D1221\"), \"1\", dev.deviceName + \"Queue\");\r\n                            }\r\n                        }\r\n\r\n                    }\r\n\r\n                }\r\n                if (continuuuuu)\r\n                {\r\n                    LogHelper.Info($\"{item.S_TASK_NO}{item.S_ACTION_CODE} è½¦è¾†å‘送继续任务!\");\r\n                    continueTask?.Invoke(new HaiKangOrderInfo\r\n                    {\r\n                        reqCode = item.S_ID.Replace(\"-\", \"\"),\r\n                        taskCode = item.S_TASK_NO\r\n                    });\r\n                    item.N_CREATEMETHOD = 1;\r\n                    taskActRepository.Update(item);\r\n                }\r\n            }\r\n            System.Threading.Thread.Sleep(3000);\r\n            //重置信号\r\n            foreach (var dev in Settings.deviceInfos.FindAll(x => x.deviceType == 2))\r\n            {\r\n                var tf = Conn.默认Redis.GetValue(dev.deviceName + \".D1202\");\r\n                int numm = int.Parse(string.IsNullOrEmpty(tf) ? \"0\" : tf);\r\n                if (TcpServer.GetBitdata(numm, 0) == 0)\r\n                {\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1220\", \"0\", dev.deviceName + \"Queue\");\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1222\", \"0\", dev.deviceName + \"Queue\");\r\n                }\r\n                else if (TcpServer.GetBitdata(numm, 1) == 0)\r\n                {\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1221\", \"0\", dev.deviceName + \"Queue\");\r\n                    Conn.默认Redis.SetValue(dev.deviceName + \".D1223\", \"0\", dev.deviceName + \"Queue\");\r\n                }\r\n            }\r\n\r\n        }\r\n        /// <summary>\r\n        /// 1020  1023空框下线\r\n        /// </summary>\r\n        /// <param name=\"tag\"></param>\r\n        public void ThreadEdown(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadEdown 20 23 = ç©ºä¸‹æ£€æµ‹ =================> \");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1020\", \"1023\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} ç©ºä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}  \");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n                    try\r\n                    {\r\n                        var listtep = new List<string>();\r\n                        if (Bssx == \"1020\")\r\n                        {\r\n                            if (tag.SF下料位.RArrive1003 == 1)\r\n                            {\r\n                                listtep = new List<string> { \"1012\", \"1004\" };\r\n                            }\r\n                            else\r\n                            {\r\n                                listtep = new List<string> { \"1004\", \"1012\" };\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            if (tag.SF下料位.RArrive1005 == 1)\r\n                            {\r\n                                listtep = new List<string> { \"1014\", \"1006\" };\r\n                            }\r\n                            else\r\n                            {\r\n                                listtep = new List<string> { \"1006\", \"1014\" };\r\n                            }\r\n                        }\r\n\r\n                        foreach (var item in listtep)//(Bssx == \"1020\" ? new string[] { \"1004\", \"1012\" } : new string[] { \"1006\", \"1014\" }))\r\n                        {\r\n                            var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                            var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                            if (R5 == 5 && R5空闲_LAST == 0 && task == null)\r\n                            {\r\n                                task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                                msg = \"\";\r\n                                if (task != null)\r\n                                {\r\n                                    Console.WriteLine($\" {item}有正在 [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                                    LogHelper.Info($\" {item}有正在 [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                                    continue;\r\n                                }\r\n\r\n                                var b = TaskProcess.CreateTask(\"\", Bssx, item, \"空上RGV\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                                if (b)\r\n                                {\r\n                                    LogHelper.Debug($\"输送线RGV空托任务 from:{Bssx}>to {item}开始创建成功\");\r\n                                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                                    RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out msg);\r\n                                    //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                                    break;\r\n                                }\r\n                            }\r\n                            else if (R5 != 5 && R5空闲_LAST == 1)\r\n                            {\r\n                                RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out msg);\r\n                                //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"0\", $\"S{item}ReadQueue\");\r\n                            }\r\n                        }\r\n                        System.Threading.Thread.Sleep(1000);\r\n                    }\r\n                    catch (Exception ex)\r\n                    {\r\n                        LogHelper.Error(ex.Message, ex);\r\n                        Console.WriteLine(ex.Message + ex.StackTrace);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"0\", $\"S{Bssx}ReadQueue\");\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n\r\n            foreach (var item in new string[] { \"1004\", \"1012\", \"1006\", \"1014\", \"1026\", \"1017\" })\r\n            {\r\n                var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                if (R5 != 5 && R5空闲_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"0\", $\"S{item}ReadQueue\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ThreadDdown(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadDdown 08 10 ==================> 1026\");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1008\", \"1016\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} æ»¡ä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}\");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n\r\n                    var item = \"1026\";\r\n                    var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                    var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                    if (R5 == 5 && R5空闲_LAST == 0)\r\n                    {\r\n                        task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                        msg = \"\";\r\n                        if (task != null)\r\n                        {\r\n                            Console.WriteLine($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            LogHelper.Info($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            continue;\r\n                        }\r\n                        var b = TaskProcess.CreateTask(\"\", Bssx, item, \"满转1026\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                        if (b)\r\n                        {\r\n                            RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                            RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out string msg2);\r\n                            //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                            //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                            break;\r\n                        }\r\n                    }\r\n                    else if (R5 != 5 && R5空闲_LAST == 1)\r\n                    {\r\n                        RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg2);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"0\", $\"S{Bssx}ReadQueue\");\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n        }\r\n\r\n        public void Thread0210Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Thread0210Down ==================>\");\r\n            TaskRepository taskRepository = new TaskRepository();\r\n            foreach (var Bssx in new string[] { \"1002\", \"1010\" })\r\n            {\r\n                var RtaskState = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState\"), typeof(System.UInt16));\r\n                var RtaskState_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.RtaskState_LAST\"), typeof(System.UInt16));\r\n                var R托盘码 = (System.String)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{Bssx}Read.R托盘码\"), typeof(System.String));\r\n                Console.WriteLine($\"{Bssx} æ»¡ä¸‹æ£€æµ‹ï¼šä»»åŠ¡ç”³è¯·ï¼š{RtaskState}- æ˜¯å¦å·²å¤„理:{RtaskState_LAST}- æ‰˜ç›˜ç ï¼š{R托盘码}\");\r\n                if (RtaskState == 3 && RtaskState_LAST == 0)\r\n                {\r\n                    var task = taskRepository.FindEntity(x => x.S_START_LOC == Bssx && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                    string msg = \"\";\r\n                    if (task != null)\r\n                    {\r\n                        Console.WriteLine($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        LogHelper.Info($\"{Bssx} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                        continue;\r\n                    }\r\n                    var item = \"1017\";\r\n                    var R5 = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲\"), typeof(System.UInt16));\r\n                    var R5空闲_LAST = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"S{item}Read.R5空闲_LAST\"), typeof(System.UInt16));\r\n                    if (R5 == 5 && R5空闲_LAST == 0)\r\n                    {\r\n                        task = taskRepository.FindEntity(x => x.S_END_LOC == item && x.S_B_STATE != \"完成\" && x.S_B_STATE != \"取消\");\r\n                        msg = \"\";\r\n                        if (task != null)\r\n                        {\r\n                            Console.WriteLine($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            LogHelper.Info($\"{item} æœ‰æ­£åœ¨ [{task.S_B_STATE}] ä¸­çš„{task.S_TASK_NO}任务\");\r\n                            continue;\r\n                        }\r\n                        var b = TaskProcess.CreateTask(\"\", Bssx, item, \"满转1017\", 5, new List<string> { R托盘码 }, \"RGV\");\r\n                        if (b)\r\n                        {\r\n                            RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"1\", out msg);\r\n                            RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"1\", out string msg1);\r\n                            //Conn.默认Redis.SetValue($\"S{Bssx}Read.RtaskState_LAST\", \"1\", $\"S{Bssx}ReadQueue\");\r\n                            //Conn.默认Redis.SetValue($\"S{item}Read.R5空闲_LAST\", \"1\", $\"S{item}ReadQueue\");\r\n                            break;\r\n                        }\r\n                    }\r\n                    else if (R5 != 5 && R5空闲_LAST == 1)\r\n                    {\r\n                        RedisHelper.Add($\"S{item}Read.R5空闲_LAST\", \"0\", out string msg1);\r\n                    }\r\n                }\r\n                else if (RtaskState != 3 && RtaskState_LAST == 1)\r\n                {\r\n                    RedisHelper.Add($\"S{Bssx}Read.RtaskState_LAST\", \"0\", out string msg);\r\n                }\r\n                System.Threading.Thread.Sleep(2000);\r\n            }\r\n        }\r\n\r\n\r\n        public void Thread下料位检测(Tag tag)\r\n        {\r\n            Console.WriteLine($\"Thread下料位检测    =====>\");\r\n            foreach (var ssx in new string[] { \"1003\", \"1005\", \"1011\", \"1013\" })\r\n            {\r\n                var RArrive = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"FNK1003051113.RArrive{ssx}\"), typeof(System.UInt16));\r\n                var RArriveLast = (System.UInt16)System.Convert.ChangeType(Conn.默认Redis.GetValue($\"FNK1003051113.RArrive{ssx}_LAST\"), typeof(System.UInt16));\r\n                if (RArrive == 1 && RArriveLast == 0)\r\n                {\r\n                    if (ssx == \"1005\" && tag.SF下料位.WRelease1005 == 0)\r\n                    {\r\n                        tag.FNK1.D2215 = 1;\r\n                        //tag.SF下料位.RArrive1005_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1005_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1005 = 0;\r\n                        //tag.SF下料位.WSafe0305 = 0;\r\n                    }\r\n                    else if (ssx == \"1003\" && tag.SF下料位.WRelease1003 == 0)\r\n                    {\r\n                        tag.FNK1.D2210 = 1;\r\n                        //tag.SF下料位.RArrive1003_LAST = 1;\r\n\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1003_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1003 = 0;\r\n                        //tag.SF下料位.WSafe0305 = 0;\r\n                    }\r\n                    else if (ssx == \"1013\" && tag.SF下料位.WRelease1013 == 0)\r\n                    {\r\n                        tag.FNK2.D2215 = 1;\r\n                        //tag.SF下料位.RArrive1013_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1013_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1013 = 0;\r\n                        //tag.SF下料位.WSafe1113 = 0;\r\n                    }\r\n                    else if (ssx == \"1011\" && tag.SF下料位.WRelease1011 == 0)\r\n                    {\r\n                        tag.FNK2.D2210 = 1;\r\n                        //tag.SF下料位.RArrive1011_LAST = 1;\r\n                        RedisHelper.Add($\"FNK1003051113.RArrive1011_LAST\", \"1\", out string msg);\r\n\r\n                        //tag.SF下料位.WRelease1011 = 0;\r\n                        //tag.SF下料位.WSafe1113 = 0;\r\n                    }\r\n                }\r\n                else if (RArrive == 0 && RArriveLast == 1)\r\n                {\r\n                    RedisHelper.Add($\"FNK1003051113.RArrive{ssx}_LAST\", \"0\", out string msg);\r\n                    //Conn.默认Redis.SetValue($\"FNK1003051113.RArrive{ssx}_LAST\", \"0\", $\"FNK1003051113Queue\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ThreadFNK1Over(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadFNK1Over    =====>\");\r\n            if (tag.FNK1.D2217 == 1 && tag.FNK1.D2217_LAST == 0)\r\n            {\r\n                tag.FNK1.D2215 = 0;\r\n                //tag.FNK1.D2212_LAST = 1;\r\n                RedisHelper.Add($\"p发那科1下线.D2217_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1005 = 1;\r\n                tag.SF下料位.WSafe0305 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1005_LAST\", \"0\", out msg);\r\n            }\r\n            if (tag.FNK1.D2216 == 1)\r\n                tag.FNK1.D2215 = 0;\r\n            else if (tag.FNK1.D2217 == 0 && tag.FNK1.D2217_LAST == 1)\r\n                //tag.FNK1.D2217_LAST = 0;\r\n                RedisHelper.Add($\"p发那科1下线.D2217_LAST\", \"0\", out string msg);\r\n\r\n            if (tag.FNK1.D2212 == 1 && tag.FNK1.D2212_LAST == 0)\r\n            {\r\n                tag.FNK1.D2210 = 0;\r\n                //tag.FNK1.D2217_LAST = 1;\r\n                RedisHelper.Add($\"p发那科1下线.D2212_LAST\", \"1\", out string msg);\r\n                tag.SF下料位.WRelease1003 = 1;\r\n                tag.SF下料位.WSafe0305 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1003_LAST\", \"0\", out msg);\r\n            }\r\n            //else if (tag.FNK1.D2211 == 1)\r\n            //    tag.FNK1.D2210 = 0;\r\n            else if (tag.FNK1.D2212 == 0 && tag.FNK1.D2212_LAST == 1)\r\n            {\r\n                //tag.FNK1.D2212_LAST = 0;\r\n                RedisHelper.Add($\"p发那科1下线.D2212_LAST\", \"0\", out string msg);\r\n            }\r\n            if (tag.FNK1.D2211 == 1)\r\n                tag.FNK1.D2210 = 0;\r\n\r\n        }\r\n        public void ThreadFNK2Over(Tag tag)\r\n        {\r\n            Console.WriteLine($\"ThreadFNK2Over    =====>\");\r\n            if (tag.FNK2.D2217 == 1 && tag.FNK2.D2217_LAST == 0)\r\n            {\r\n                tag.FNK2.D2215 = 0;\r\n                //tag.FNK2.D2212_LAST = 1;\r\n                RedisHelper.Add($\"p发那科2下线.D2217_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1013 = 1;\r\n                tag.SF下料位.WSafe1113 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1013_LAST\", \"0\", out msg);\r\n            }\r\n            else if (tag.FNK2.D2217 == 0 && tag.FNK2.D2217_LAST == 1)\r\n                //tag.FNK2.D2217_LAST = 0;\r\n                RedisHelper.Add($\"p发那科2下线.D2217_LAST\", \"0\", out string msg);\r\n\r\n            if (tag.FNK2.D2216 == 1)\r\n                tag.FNK2.D2215 = 0;\r\n\r\n            if (tag.FNK2.D2212 == 1 && tag.FNK2.D2212_LAST == 0)\r\n            {\r\n                tag.FNK2.D2210 = 0;\r\n                //tag.FNK2.D2217_LAST = 1;\r\n                RedisHelper.Add($\"p发那科2下线.D2212_LAST\", \"1\", out string msg);\r\n\r\n                tag.SF下料位.WRelease1011 = 1;\r\n                tag.SF下料位.WSafe1113 = 1;\r\n                System.Threading.Thread.Sleep(1000);\r\n                RedisHelper.Add($\"FNK1003051113.RArrive1011_LAST\", \"0\", out msg);\r\n            }\r\n            else if (tag.FNK2.D2212 == 0 && tag.FNK2.D2212_LAST == 1)\r\n            {\r\n                //tag.FNK2.D2212_LAST = 0;\r\n                RedisHelper.Add($\"p发那科2下线.D2212_LAST\", \"0\", out string msg);\r\n            }\r\n            if (tag.FNK2.D2211 == 1)\r\n                tag.FNK2.D2210 = 0;\r\n\r\n        }\r\n\r\n        public void Thread1019Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"1019任务状态:   =====>\");\r\n            Console.WriteLine($\"1019任务状态:{tag.SA1019.RtaskState}- barcode:{tag.SA1019.R托盘码}- ç©ºé—²{tag.SA1019.R5空闲}\");\r\n        }\r\n        public void Thread1025Up(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1025 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA1025 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1025.RtaskState}- ç©ºé—²{tag.SA1025.R5空闲}\");\r\n        }\r\n        public void Thread1022Up(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1022    =====>\");\r\n            Console.WriteLine($\"SA1022 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1022.RtaskState}- ç©ºé—²{tag.SA1022.R5空闲}\");\r\n        }\r\n        public void Thread1030Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA1030 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA1030 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA1030.RtaskState}- ç©ºé—²{tag.SA1030.R5空闲}-->对应终点2001>空闲5:{tag.SA2001.R5空闲}\");\r\n        }\r\n        public void Thread2030Down(Tag tag)\r\n        {\r\n            Console.WriteLine($\"SA2030 ä»»åŠ¡çŠ¶æ€ï¼š   =====>\");\r\n            Console.WriteLine($\"SA2030 ä»»åŠ¡çŠ¶æ€ï¼š{tag.SA2030.RtaskState}- ç©ºé—²{tag.SA2030.R5空闲} - barcode:{tag.SA2030.R托盘码}\");\r\n        }\r\n\r\n\r\n    }\r\n}\r\n",
      "CusMethod": {
        "Name": "",
        "Params": [],
@@ -713,6 +713,6 @@
    }
  ],
  "CreationTime": "2025-02-26 15:31:23",
  "LastWriteTime": "2025-07-09 11:37:29",
  "LastWriteTime": "2025-07-23 10:05:08",
  "HasSaved": true
}