From 6db5849413c86ac0f75ec90a6eca2889372774ad Mon Sep 17 00:00:00 2001
From: cjs <2216046164@qq.com>
Date: 星期三, 28 五月 2025 09:29:50 +0800
Subject: [PATCH] ams

---
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/SqlHelper.cs                                              |  324 +
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Properties/AssemblyInfo.cs                                |   36 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/packages.config                                           |   11 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/AMSHelper.cs                                              |  310 +
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ApiController.cs                                          |  132 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/WebApiHelper.cs                                           |   94 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/MESHelper.cs                                              | 1435 ++++++
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ApiHelper.cs                                              |  565 ++
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ProtocolAnalysis.cs                                       |  627 ++
 ams/Hanhe.iWCS.TaizhouGEMTwoTCP/Properties/AssemblyInfo.cs                                     |   36 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/EnentListen.cs                                            |  390 +
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/XmlHelper.cs                                              |   39 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/PLCControl.cs                                             | 4092 +++++++++++++++++
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Hanhe.iWCS.TaizhouGEMTwoProtocol.csproj                   |  155 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/MoboxHelper.cs                                            |  367 +
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/TSHelper.cs                                               |  244 +
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Test.cs                                                   |   58 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/备注.txt                                                    |    0 
 ams/Hanhe.iWCS.TaizhouGEMTwoTCP/Hanhe.iWCS.TaizhouGEMTwoTCP.csproj                             |   83 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Startup.cs                                                |   25 
 ams/Hanhe.iWCS.TaizhouGEMTwoTCP/SessionInstance.cs                                             |  195 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Settings.cs                                               |  488 ++
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ProcessHelper.cs                                          | 1153 +++++
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ERPService.cs                                             | 1074 ++++
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/OITcpHelper.cs                                            |  494 ++
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/WMSHelper.cs                                              |  825 +++
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/app.config                                                |   28 
 ams/Hanhe.iWCS.TaizhouGEMTwoTCP/WCSServer.cs                                                   |  125 
 ams/Hanhe.iWCS.TaizhouGEMTwoTCP/WCSSession.cs                                                  |   69 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/TcpHelper.cs                                              |   37 
 ams/Hanhe.iWCS.TaizhouGEMTwoTCP/.vs/Hanhe.iWCS.TaizhouGEMTwoTCP.csproj.dtbcache.json           |    1 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/readme.txt                                                |    7 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/.vs/Hanhe.iWCS.TaizhouGEMTwoProtocol.csproj.dtbcache.json |    1 
 ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/settings.xml                                              |  278 +
 34 files changed, 13,798 insertions(+), 0 deletions(-)

diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/.vs/Hanhe.iWCS.TaizhouGEMTwoProtocol.csproj.dtbcache.json b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/.vs/Hanhe.iWCS.TaizhouGEMTwoProtocol.csproj.dtbcache.json
new file mode 100644
index 0000000..ba12c00
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/.vs/Hanhe.iWCS.TaizhouGEMTwoProtocol.csproj.dtbcache.json
@@ -0,0 +1 @@
+{"RootPath":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\娉板窞鏍兼灄缇庝簩鏈焅\Hanhe.iWCS.TaizhouGEMTwoProtocol","ProjectFileName":"Hanhe.iWCS.TaizhouGEMTwoProtocol.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"ApiHelper.cs"},{"SourceFile":"AMSHelper.cs"},{"SourceFile":"ERPService.cs"},{"SourceFile":"MESHelper.cs"},{"SourceFile":"MoboxHelper.cs"},{"SourceFile":"OITcpHelper.cs"},{"SourceFile":"Settings.cs"},{"SourceFile":"EnentListen.cs"},{"SourceFile":"ProcessHelper.cs"},{"SourceFile":"SqlHelper.cs"},{"SourceFile":"Test.cs"},{"SourceFile":"WMSHelper.cs"},{"SourceFile":"PLCControl.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"ProtocolAnalysis.cs"},{"SourceFile":"Startup.cs"},{"SourceFile":"TSHelper.cs"},{"SourceFile":"ApiController.cs"},{"SourceFile":"WebApiHelper.cs"},{"SourceFile":"XmlHelper.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.5.1.AssemblyAttributes.cs"}],"References":[{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\AGVProvider\\Hanhe.iWCS.AGVWebService\\bin\\Debug\\Hanhe.iWCS.AGVWebService.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\AGVProvider\\Hanhe.iWCS.AGVWebService\\bin\\Debug\\Hanhe.iWCS.AGVWebService.dll"},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\Hanhe.iWCS.Business\\bin\\Debug\\Hanhe.iWCS.Business.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\Hanhe.iWCS.Business\\bin\\Debug\\Hanhe.iWCS.Business.dll"},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.Common.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.DeviceDriver.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.Event.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.Factroy.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.Interface.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.MData.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.Model.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\娉板窞鏍兼灄缇庝簩鏈焅\Hanhe.iWCS.TaizhouGEMTwoTCP\\bin\\Debug\\Hanhe.iWCS.TaizhouGEMTwoTCP.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\log4net.2.0.5\\lib\\net45-full\\log4net.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\Microsoft.CSharp\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\Microsoft.Owin.4.1.1\\lib\\net45\\Microsoft.Owin.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\Microsoft.Owin.Host.HttpListener.4.1.1\\lib\\net45\\Microsoft.Owin.Host.HttpListener.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\Microsoft.Owin.Hosting.4.1.1\\lib\\net45\\Microsoft.Owin.Hosting.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\Microsoft.VisualBasic\\v4.0_10.0.0.0__b03f5f7f11d50a3a\\Microsoft.VisualBasic.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\MongoDB.Bson.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\MongoDB.Driver.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\MySql.Data.6.7.9\\lib\\net45\\MySql.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\Owin.1.0\\lib\\net40\\Owin.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\SqlSugar.5.0.1.7\\lib\\SqlSugar.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Configuration\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Configuration.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Data.DataSetExtensions\\v4.0_4.0.0.0__b77a5c561934e089\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_64\\System.Data\\v4.0_4.0.0.0__b77a5c561934e089\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System\\v4.0_4.0.0.0__b77a5c561934e089\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Net.Http\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\Microsoft.AspNet.WebApi.Client.5.2.7\\lib\\net45\\System.Net.Http.Formatting.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_64\\System.Web\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Web.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\Microsoft.AspNet.WebApi.Core.5.2.7\\lib\\net45\\System.Web.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\packages\\Microsoft.AspNet.WebApi.Owin.5.2.7\\lib\\net45\\System.Web.Http.Owin.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Xml\\v4.0_4.0.0.0__b77a5c561934e089\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Xml.Linq\\v4.0_4.0.0.0__b77a5c561934e089\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\娉板窞鏍兼灄缇庝簩鏈焅\Hanhe.iWCS.TaizhouGEMTwoProtocol\\bin\\Debug\\Hanhe.iWCS.TaizhouGEMTwoProtocol.dll","OutputItemRelativePath":"Hanhe.iWCS.TaizhouGEMTwoProtocol.dll"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
\ No newline at end of file
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/AMSHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/AMSHelper.cs
new file mode 100644
index 0000000..76d2e4a
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/AMSHelper.cs
@@ -0,0 +1,310 @@
+锘縰sing Hanhe.iWCS.Business;
+using Hanhe.iWCS.Common;
+using Hanhe.iWCS.DeviceDriver;
+using Hanhe.iWCS.MData;
+using Hanhe.iWCS.Model;
+using MongoDB.Bson;
+using MongoDB.Driver;
+using MongoDB.Driver.Builders;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class AMSHelper
+    {
+
+        public static HHAmsExecuteResult CreateTask(string taskNo, string locationFrom, string locationTo, string type, int priorityNo, string batchNo = "",string timeStamp = "") {
+            var result = new HHAmsExecuteResult();
+            List<HHAmsTaskEntity> entities = new List<HHAmsTaskEntity>();
+            HHAmsTaskEntity entity = new HHAmsTaskEntity();
+            entity.batchNo = batchNo;
+            entity.taskNo = taskNo;
+            entity.businessType = type;
+            entity.locationFrom = locationFrom;
+            entity.locationTo = locationTo;
+            entity.priority = priorityNo;
+            entity.ext2 = timeStamp;
+            entity.deviceName = "AMS";
+            entity.sysName = "AMS";
+            entities.Add(entity);
+
+            result = AddTask(entities);
+
+            return result;
+        }
+        public static HHAmsExecuteResult AddTask(List<HHAmsTaskEntity> data) {
+            HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_AMS);
+            //string url = "http://10.15.73.28:9435/api/AmsInf/"; //姝e紡鐜闇�鏀瑰洖鍘�+            string msg = "";
+            string feedback = "";
+
+            var param = JsonConvert.SerializeObject(data);
+            HHAmsExecuteResult amsResponse = new HHAmsExecuteResult() ;
+            if (hao != null) {
+            //if (string.IsNullOrEmpty(url)) {
+                try {
+                    string webAPIUrl = hao._WebApiClientInstance.WebApiUrl.Replace("AmsInf", "HHAms") + "AddTask";
+                    //string webAPIUrl = url.Replace("AmsInf", "HHAms") + "AddTask";
+                    Console.WriteLine(webAPIUrl);
+                    feedback = new WebApiHelper().WebPost(webAPIUrl, param);
+                    if (!string.IsNullOrEmpty(feedback)) {
+                        amsResponse = JsonConvert.DeserializeObject<HHAmsExecuteResult>(feedback);
+                        //var res = feedback.Replace("{", "").Replace("}", "").Replace(":", "=").Replace(",", ";").Replace('"', ' ');
+                        if (amsResponse.success == true) {
+                            msg = "銆恆ms create task銆憇uccess锛�WebUrl=" + hao.WebUrl + "AmsInf/AddTask;param=" + param;
+                        }
+                        else {
+                            string errMsg = amsResponse.errMsg;
+                            msg = "銆恆ms create task銆慺ail锛乪rr=" + errMsg + ";WebUrl=" + webAPIUrl + ";param=" + param;
+                        }
+                    }
+                    else {
+                        string errMsg = "can't find the address";
+                        msg = "銆恆ms create task銆慺ail锛乪rr=" + errMsg + ";WebUrl=" + webAPIUrl + ";param=" + param;
+                    }
+                }
+                catch (Exception e) {
+                    CMMLog.Error(string.Format("銆恆ms create task銆慺ail锛乪rr={0}", e.Message), e);
+                }
+            }
+            else {
+                msg = string.Format("ams create task fail锛宎ms workcenter not set锛�);
+            }
+            if (msg != "") {
+                CMMLog.Info(msg);
+            }
+            return amsResponse;
+
+            //{"Success":false,"ErrorCode":"1","FailList":[{"Agv_TaskNo":"sample string 5","Error_Code":"1","Err_Msg":"鏈厤缃浉鍏宠澶囩殑浜嬩欢瑙i噴锛�},{"Agv_TaskNo":"sample string 5","Error_Code":"1","Err_Msg":"鏈厤缃浉鍏宠澶囩殑浜嬩欢瑙i噴锛�},{"Agv_TaskNo":"sample string 5","Error_Code":"1","Err_Msg":"鏈厤缃浉鍏宠澶囩殑浜嬩欢瑙i噴锛�}]}
+        }
+
+        /// <summary>
+        /// 鍒涘缓浠诲姟
+        /// </summary>
+        /// <param name="jasonStr"></param>
+        /// <returns></returns>
+        private static bool CreateAMSTask(string jasonStr) {
+            bool bResult = false;
+            HardwareAccessObject AMSCreateHao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_AMS);
+            if (AMSCreateHao != null) {
+                try {
+                    string webAPIUrl = AMSCreateHao._WebApiClientInstance.WebApiUrl.Replace("AmsInf", "HHAms");
+                    string amsReturnValue = AMSCreateHao._WebApiClientInstance.GetWebRequest(webAPIUrl + "AddTask", jasonStr, "application/json");
+                    var dynamicObject = JsonConvert.DeserializeObject<dynamic>(amsReturnValue);
+                    if (dynamicObject.success == "True" || dynamicObject.success == "true") {
+                        bResult = true;
+                        CMMLog.Info("AMS浠诲姟鍒涘缓鎴愬姛;璇锋眰鍙傛暟=" + jasonStr + "");
+                    }
+                    else {
+                        CMMLog.Info("AMS浠诲姟鍒涘缓澶辫触;璇锋眰鍙傛暟=" + jasonStr + "");
+                    }
+                }
+                catch (Exception ex) {
+                    CMMLog.Info("AMS浠诲姟鍒涘缓寮傚父;璇锋眰鍙傛暟=" + jasonStr + ";Exception=" + ex.Message);
+                }
+            }
+            return bResult;
+        }
+
+        /// <summary>
+        /// 鍙樻洿浠诲姟鐩殑鍦�+        /// </summary>
+        /// <param name="jasonStr"></param>
+        /// <returns></returns>
+        public static bool ChangeTaskTargetBit(string jasonStr) {
+            bool bResult = false;
+            HardwareAccessObject AMSCreateHao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_AMS);
+            if (AMSCreateHao != null) {
+                try {
+                    string amsReturnValue = AMSCreateHao._WebApiClientInstance.GetWebRequest(AMSCreateHao._WebApiClientInstance.WebApiUrl + "ChangeTaskTargetBit", jasonStr, "application/json");
+                    var dynamicObject = JsonConvert.DeserializeObject<dynamic>(amsReturnValue);
+                    if (dynamicObject.Success == "True" || dynamicObject.Success == "true") {
+                        bResult = true;
+                        CMMLog.Info("AMS鍙樻洿浠诲姟鐩殑鍦版垚鍔�璇锋眰鍙傛暟=" + jasonStr + "");
+                    }
+                    else {
+                        CMMLog.Info("AMS鍙樻洿浠诲姟鐩殑鍦板け璐�璇锋眰鍙傛暟=" + jasonStr + "");
+                    }
+                }
+                catch (Exception ex) {
+                    CMMLog.Info("AMS鍙樻洿浠诲姟鐩殑鍦板紓甯�璇锋眰鍙傛暟=" + jasonStr + ";Exception=" + ex.Message);
+                }
+            }
+            return bResult;
+        }
+
+        /// <summary>
+        /// 鍙嶉AMS鐨勭姸鎬�+        /// </summary>
+        /// <param name="taskNo"></param>
+        /// <param name="orderNo"></param>
+        /// <param name="actionCode"></param>
+        public static void SetStatus(string taskNo, int orderNo, string actionCode, string forkliftNo, bool success = false) {
+            HardwareAccessObject AMSHao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_AMS);
+            if (AMSHao != null) {
+                //           if (actionCode == "2")
+                //           {
+                //actionCode = "瀹屾垚";
+                //           }
+                string data = "{\"TaskNo\":\"" + taskNo + "\",\"OrderIndex\":\"" + orderNo + "\",\"TaskStatus\":\"" + actionCode + "\",\"ForkliftNo\":\"" + forkliftNo + "\",\"Success\":\"" + success + "\",\"ErrorMsg\":\"\"}";
+                CMMLog.Debug(data);
+                //string resultCode = AMSHao._WebApiClientInstance.GetWebRequest(AMSHao._WebApiClientInstance.WebApiUrl + "SetStatus?jsonData=" + data);
+                WebApiHelper api = new WebApiHelper();
+                api.WebPost(AMSHao._WebApiClientInstance.WebApiUrl + "SetStatus?jsonData=" + data, "");
+            }
+        }
+
+        /// <summary>
+        /// 娑堟伅浜や簰鏃ュ織
+        /// </summary>
+        /// <param name="taskNo"></param>
+        /// <param name="orderNo"></param>
+        /// <param name="cmd"></param>
+        /// <param name="statusText"></param>
+        /// <param name="success"></param>
+        /// <param name="errMsg"></param>
+        /// <param name="createUser"></param>
+        /// <param name="createUserName"></param>
+        public static void TaskTrackLogMessage(string taskNo, string orderNo, string cmd, string statusText, string remark = "") {
+            HardwareAccessObject AMSHao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_AMS);
+            if (AMSHao != null) {
+                string data = "{\"CN_N_ORDER\":\"" + orderNo + "\",\"CN_S_CMD\":\"" + cmd + "\",\"CN_S_CREATOR\":\"wcs\",\"CN_S_CREATOR_NAME\":\"wcs\",\"CN_S_SUCCESS\":\"true\",\"CN_S_TASK_NO\":\"" + taskNo + "\",\"CN_S_TASK_STATUS\":\"" + statusText + "\",\"CN_S_ERROR\":\"" + remark + "\"}";
+                string resultCode = AMSHao._WebApiClientInstance.GetWebRequest(AMSHao._WebApiClientInstance.WebApiUrl + "TaskTrackLogMessage?jsonData=" + data);
+            }
+        }
+
+
+
+        public static void ChangeEndBitNew(TN_I_TASK_MST mstTask, out int agvBit) {
+            string newEndBitCode = mstTask.CN_S_END_BIT;
+            agvBit = StockInstance.Instance.GetAGVCodeForBitCode(newEndBitCode);
+            UpdateEndBit(mstTask, newEndBitCode, agvBit);
+        }
+        private static void UpdateEndBit(TN_I_TASK_MST mstTask, string newEndBitCode, int agvBit) {
+            var updateBuider = Update.Set("CN_S_END_BIT", newEndBitCode);//鏂扮洰鐨勫湴
+            updateBuider = updateBuider.Set("CN_N_END_AGV_BIT", agvBit);
+            MongoDBSingleton.Instance.Update<TN_I_TASK_DTL>(Query.EQ("CN_S_TASK_NO", mstTask.CN_S_TASK_NO), updateBuider, UpdateFlags.None);
+            var query = Query.EQ("_id", mstTask._id);
+            updateBuider = Update.Set("CN_S_END_BIT", newEndBitCode).Set("Ext3", "J2SSHB199");
+            updateBuider = updateBuider.Set("CN_S_END_AGVBIT", agvBit.ToString());
+            MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(query, updateBuider, UpdateFlags.None);
+        }
+
+
+        public class HHAmsTaskEntity
+        {
+            //public List<TransportInfo> transportInfo { get; set; }
+            public string batchNo { get; set; }
+            public string businessType { get; set; }
+            public string sysName { get; set; }
+            public string deviceName { get; set; }
+            public string taskNo { get; set; }
+            public string locationFrom { get; set; }
+            public string locationTo { get; set; }
+            public int priority { get; set; }
+            public string ext1 { get; set; }
+            public string ext2 { get; set; }
+            public string ext3 { get; set; }
+            //public class TransportInfo {
+            //	/// <summary>
+            //	/// 鐗╂枡缂栫爜
+            //	/// </summary>
+            //	public string itemCode { get; set; }
+
+            //	/// <summary>
+            //	/// 鐗╂枡鎵╁睍缂栫爜
+            //	/// </summary>
+            //	public string itemPCode { get; set; }
+
+            //	/// <summary>
+            //	/// 鐗╂枡鍚嶇О
+            //	/// </summary>
+            //	public string itemName { get; set; }
+
+            //	/// <summary>
+            //	/// 鎵樼洏鐮�+            //	/// </summary>
+            //	public string trayCode { get; set; }
+
+            //	/// <summary>
+            //	/// 鐗╂枡閲嶉噺
+            //	/// </summary>
+            //	public string itemWeight { get; set; }
+
+            //	/// <summary>
+            //	/// 鐗╂枡鐗瑰緛
+            //	/// </summary>
+            //	public string itemFeatures { get; set; }
+            //}
+
+        }
+        public class HHAmsExecuteResult
+        {
+            public bool success { get; set; }
+            /// <summary>
+            /// 0:鎴愬姛 1锛氭暟鎹紓甯�2锛氬凡瀛樺湪浠诲姟 3锛氱▼搴忓紓甯�+            /// </summary>
+            public string errCode { get; set; }
+            public string errMsg { get; set; }
+
+            private List<HHAmsAddTaskResult> _failList = new List<HHAmsAddTaskResult>();
+            public List<HHAmsAddTaskResult> failList {
+                get { return _failList; }
+                set { _failList = value; }
+            }
+        }
+        public class HHAmsAddTaskResult
+        {
+            public string taskNo { get; set; }
+            public string errCode { get; set; }
+            public string errMsg { get; set; }
+        }
+        public class WMSResponseModel
+        {
+            //{"success":false,"errCode":null,"errMsg":"绠楁硶杩斿洖缁撴灉搴撳瓨涓嶈冻","okList":[],"failList":[{"index":0,"errCode":null,"errMsg":"绠楁硶杩斿洖缁撴灉搴撳瓨涓嶈冻"}],"tasks":[]}
+            public bool success { get; set; }
+            public string errMsg { get; set; }
+            public string errCode { get; set; }
+            //public OKInfo[] tasks { get; set; }
+            //public FailInfo[] failList { get; set; }
+            public OKInfo[] okList { get; set; }
+            public class FailInfo
+            {
+                public int index { get; set; }
+                public string errCode { get; set; }
+                public string errMsg { get; set; }
+            }
+
+            public class OKInfo
+            {
+                public string taskNo { get; set; }
+                public string startStock { get; set; }
+                public string startArea { get; set; }
+                public string startBit { get; set; }
+                public string endStock { get; set; }
+                public string endArea { get; set; }
+                public string endBit { get; set; }
+            }
+        }
+
+
+
+
+        internal static void UpdatePriority(string taskNo, int priority) {
+            //http://localhost:60116/api/AmsInf/UpdatePriority?taskNo=12312313&priority=2
+            HardwareAccessObject AMSHao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_AMS);
+            if (AMSHao != null) {
+                string data = string.Format("taskNo={0}&priority={1}", taskNo, priority);
+                CMMLog.Debug(data);
+                //string resultCode = AMSHao._WebApiClientInstance.GetWebRequest(AMSHao._WebApiClientInstance.WebApiUrl + "UpdatePriority?" + data);
+                WebApiHelper api = new WebApiHelper();
+                api.WebPost(AMSHao._WebApiClientInstance.WebApiUrl + "UpdatePriority?" + data, "");
+            }
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ApiController.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ApiController.cs
new file mode 100644
index 0000000..72328af
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ApiController.cs
@@ -0,0 +1,132 @@
+锘縰sing Hanhe.iWCS.Common;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Http;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ApiHelper;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    [RoutePrefix("api")]
+    public class ApiController : System.Web.Http.ApiController
+    {
+		[HttpPost]
+		[Route("AddTask")]
+		public SimpleResult Post(AddTaskModel model) {
+			CMMLog.Debug("addTask Request锛� + JsonConvert.SerializeObject(model));
+			return ApiHelper.SendTask(model);
+		}
+
+		[HttpPost]
+		[Route("NgStopTask")]
+		public SimpleResult Ng(NgTaskModel model)
+		{
+			CMMLog.Debug("addTask Request锛� + JsonConvert.SerializeObject(model));
+			return ApiHelper.NgTask(model);
+		}
+
+		[HttpPost]
+		[Route("SecondResult")]
+		public SimpleResult SecondResult(secondResultCache model)
+		{
+			CMMLog.Debug("SecondResult Request锛� + JsonConvert.SerializeObject(model));
+            Console.WriteLine("SecondResult Request锛� + JsonConvert.SerializeObject(model));
+			return ApiHelper.SecondResult(model);
+		}
+
+		/// <summary>
+		/// MES鎺ュ彛璋冪敤娴嬭瘯
+		/// </summary>
+		/// <param name="model"></param>
+		/// <returns></returns>
+		[HttpPost]
+		[Route("MESTest")]
+		public MESData MES(MESSendData model)
+		{
+			CMMLog.Debug("MESTask Request锛� + JsonConvert.SerializeObject(model));
+			return ApiHelper.MESTest(model);
+		}
+
+		/// <summary>
+		/// Json鏁版嵁杈撳叆杈撳嚭涓棿琛ㄦ祴璇�+		/// </summary>
+		/// <param name="model"></param>
+		/// <returns></returns>
+		[HttpPost]
+		[Route("Json")]
+		public JsonData Json(JsonData model)
+		{
+			CMMLog.Debug("MESTask Request锛� + JsonConvert.SerializeObject(model));
+			return ApiHelper.Json(model);
+		}
+
+		[HttpPost]
+		//[Authorize]//涓嶈鍚峊oken楠岃瘉
+		//[BasicAuthentication]//鍩烘湰韬唤楠岃瘉 Authorization       Basic admin:123
+		[Route("AGVDeviceReceive")]
+		public ReturnResult AGVDeviceReceive(List<AgvDeviceStatus> models)
+		{
+			ReturnResult result = new ReturnResult();
+			models.ForEach(a =>
+			{
+				CMMLog.Info("AGVDeviceReceive Request锛� + JsonConvert.SerializeObject(a));
+				ApiHelper.AGVDeviceReceiveSet(a);
+			});
+
+			return result;
+		}
+
+		[HttpPost]
+		// SimpleResult
+		[Route("Item")]
+		public SimpleResult Item(ERPService.ERPItemTable itemTable)
+		{
+			CMMLog.Info($"Item Res:{JsonConvert.SerializeObject(itemTable)}");
+			SimpleResult result = new SimpleResult();
+			result = ERPService.Item(itemTable);
+			CMMLog.Info($"Item Req:{JsonConvert.SerializeObject(result)}");
+			return result;
+		}
+
+		[HttpPost]
+		// SimpleResult
+		[Route("Employee")]
+		public SimpleResult Employee(ERPService.ERPEmployeeTable itemTable)
+		{
+			CMMLog.Info($"Employee Res:{JsonConvert.SerializeObject(itemTable)}");
+			SimpleResult result = new SimpleResult();
+			result = ERPService.Employee(itemTable);
+			CMMLog.Info($"Employee Req:{JsonConvert.SerializeObject(result)}");
+			return result;
+		}
+
+
+		[HttpPost]
+		[Route("Test")]
+		public MESData Test()
+		{
+			CMMLog.Debug("MESTask Request锛�);
+			return new MESData { machineNo = "01"};
+		}
+
+        /// <summary>
+        /// 搴撲綅鐩告満鎺ュ彛
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("CameraMonitor")]
+        public SimpleResult CameraInfo(List<cameraModel> models)
+        {
+            SimpleResult result = new SimpleResult();
+            models.ForEach(a =>
+            {
+                CMMLog.Info("CameraInfo Request锛� + JsonConvert.SerializeObject(a));
+                ApiHelper.CameraInfo(a);
+            });
+            return result;
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ApiHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ApiHelper.cs
new file mode 100644
index 0000000..f29a7ca
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ApiHelper.cs
@@ -0,0 +1,565 @@
+锘縰sing Hanhe.iWCS.Business;
+using Hanhe.iWCS.Common;
+using Hanhe.iWCS.MData;
+using Hanhe.iWCS.Model;
+using MongoDB.Bson;
+using MongoDB.Driver;
+using MongoDB.Driver.Builders;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.PLCControl;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ProcessHelper;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    /// <summary>
+    /// ams鎺ュ彛杈呭姪绫�+    /// </summary>
+    public class ApiHelper
+    {
+        private static ICallTaskProcessing callTaskProcessing = new ICallTaskProcessing();
+        static ApiHelper()
+        {
+
+        }
+
+        internal static SimpleResult SendTask(AddTaskModel model)
+        {
+            SimpleResult result = new SimpleResult();
+            if (model.taskType == 1)
+            {
+                //PLan A.褰揥MS璋傾MS鐢熸垚绌烘墭鍑哄簱浠诲姟鏃讹紝鐩存帴鎷︽埅瀛樺叆涓棿琛紝寰呭埌绾跨▼寰幆璇诲彇鎺ㄩ�鐢垫涓�浠诲姟鏃讹紝浼樺厛鎺ㄩ�
+                //MongoDBSingleton.Instance.Insert<ElevatorTask>(new ElevatorTask { taskNo = DateTime.Now.ToString(), wmsTaskNo = DateTime.Now.ToString(), startBit = model.startBit, endBit = PLCControl.DeviceBit8(), wmsEndBit = model.endBit, startFloor = 1, endFloor = 3, sendFlag = 0, create = DateTime.Now.ToString() });
+
+                //Plan B.褰揥MS璋傾MS鐢熸垚绌烘墭鍑哄簱浠诲姟鏃讹紝鎺ュ彈骞跺垱寤虹┖鎵樺嚭搴撲换鍔★紝寰呭埌浠诲姟鎺ㄩ�鏃讹紝鏍规嵁浠诲姟绫诲瀷杩涜鎷︽埅
+                var r = AMSHelper.CreateTask(DateTime.Now.ToString(), model.startBit, model.endBit, "绌烘墭鍑哄簱", 1);
+                result.success = r.success;
+            }
+            else if (model.taskType == 2)
+            {
+                //1妤兼垚鍝佽揣鏋跺尯鍒�妤煎嚭搴撶紦瀛樹綅       --姝や换鍔¢渶瑕佹坊鍔犺櫄鎷熺粓鐐癸紝鏍规嵁1妤煎嚭搴撶紦瀛樹綅鐨勫箍鐢典俊鍙锋潵鍒嗛厤AGV涓�釜缁堢偣锛堝洓涓偣浣嶏紝绌虹殑鍒欏彲浠ュ叆锛�+                //WMS涓嶉渶瑕佷紶杈撶粓鐐癸紝缁堢偣鐢盇MS鏍规嵁鍏夌數PLC淇″彿锛屽垽鏂摢涓俊鍙锋槸绌虹殑锛屽啀閫氱煡AGV缁堢偣锛屽湪姝や箣鍓嶅厛浣跨敤铏氭嫙缁堢偣
+                var r = AMSHelper.CreateTask(DateTime.Now.ToString(), model.startBit, model.endBit, "鎴愬搧鍑哄簱", 1);
+                result.success = r.success;
+            }
+            else if (model.taskType == 3)
+            {
+                //PDA锛�妤肩┖鎵樼嚎杈瑰尯鍒�妤兼垚鍝佺┖鎵樹綅   鈥斺�搴旇鏈夎捣鐐瑰拰缁堢偣浣嶏紝鐩存帴鎺ㄩ�鈥斺�闇�弽棣圵MS浠诲姟鐘舵�
+                var r = AMSHelper.CreateTask(DateTime.Now.ToString(), model.startBit, model.endBit, "绌烘墭绾胯竟", 1);
+                result.success = r.success;
+            }
+            return result;
+        }
+        public class AddTaskModel
+        {
+            /// <summary>
+            /// 浠诲姟璧风偣
+            /// </summary>
+            public string startBit { get; set; }
+            /// <summary>
+            /// 浠诲姟缁堢偣
+            /// </summary>
+            public string endBit { get; set; }
+            /// <summary>
+            /// 浠诲姟绫诲埆    1.1妤兼垚鍝佺┖鎵樺尯鍒�妤艰ˉ缁欐垚鍝佺┖鎵樺尯
+            ///             2.1妤兼垚鍝佽揣鏋跺尯鍒�妤煎嚭搴撶紦瀛樹綅
+            ///             3.PDA锛�妤肩┖鎵樼嚎杈瑰尯鍒�妤兼垚鍝佺┖鎵樹綅
+            /// </summary>
+            public int taskType { get; set; }
+        }
+        public class SimpleResult
+        {
+            public bool success { get; set; }
+            public int errCode { get; set; }
+            public string errMsg { get; set; }
+        }
+
+        #region   NG浠诲姟璁惧鐘舵�
+
+        internal static SimpleResult NgTask(NgTaskModel model)
+        {
+            SimpleResult result = new SimpleResult();
+            if (model.fcBit == 0)
+            {
+                var setus = MongoDBSingleton.Instance.FindOne<NgTaskModel>(Query.EQ("bzBit", model.bzBit), "NgTaskModel");
+                if (setus == null)
+                {
+                    MongoDBSingleton.Instance.Insert<NgTaskModel>(new NgTaskModel { fcBit = model.fcBit, fcSetus = model.fcSetus, bzBit = model.bzBit, bzSetus = model.bzSetus });
+                }
+                else
+                {
+                    var updateBuider = Update.Set("fcBit", model.fcBit).Set("fcSetus", model.fcSetus).Set("bzBit", model.bzBit).Set("bzSetus", model.bzSetus);
+                    MongoDBSingleton.Instance.Update<NgTaskModel>(Query.EQ("bzBit", model.bzBit), updateBuider, UpdateFlags.None);
+                }
+            }
+            else
+            {
+                var setus = MongoDBSingleton.Instance.FindOne<NgTaskModel>(Query.EQ("fcBit", model.fcBit), "NgTaskModel");
+                if (setus == null)
+                {
+                    //SecondWeighState
+                    MongoDBSingleton.Instance.Insert<NgTaskModel>(new NgTaskModel { fcBit = model.fcBit, fcSetus = model.fcSetus, bzBit = model.bzBit, bzSetus = model.bzSetus });
+                    MongoDBSingleton.Instance.Update<SecondWeighState>(Query.EQ("location", GetSecondWeighBit()), Update.Set("ng", 2), UpdateFlags.None);
+                }
+                else
+                {
+                    var updateBuider = Update.Set("fcBit", model.fcBit).Set("fcSetus", model.fcSetus).Set("bzBit", model.bzBit).Set("bzSetus", model.bzSetus);
+                    MongoDBSingleton.Instance.Update<NgTaskModel>(Query.EQ("fcBit", model.fcBit), updateBuider, UpdateFlags.None);
+                    MongoDBSingleton.Instance.Update<SecondWeighState>(Query.EQ("location", GetSecondWeighBit()), Update.Set("ng", model.fcSetus), UpdateFlags.None);
+                }
+            }
+
+            return result;
+        }
+
+        public class NgTaskModel
+        {
+            /// <summary>
+            /// 榛樿鎯呭喌涓嬪叏閮介兘浼�
+            /// </summary>
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 澶嶇О骞冲彴鐐逛綅  澶嶇О骞冲彴鏈夐棶棰橈紝灏变紶鍊�
+            /// </summary>
+            public int fcBit { get; set; }
+            /// <summary>
+            /// 澶嶇О骞冲彴鐘舵�  澶嶇О骞冲彴鏈夐棶棰樼殑鎯呭喌涓嬶紝浼犲�2
+            /// </summary>
+            public int fcSetus { get; set; }
+            /// <summary>
+            /// 鍖呰鐐逛綅    鍖呰鏈烘湁闂锛屼紶鍖呰鏈烘暟瀛楃紪鍙凤紝渚嬪1~9
+            /// </summary>
+            public int bzBit { get; set; }
+            /// <summary>
+            /// 鍖呰鐘舵�    鍖呰鏈烘湁闂鐨勬儏鍐典笅锛屼紶鍊�
+            /// </summary>
+            public int bzSetus { get; set; }
+        }
+
+        #endregion
+
+        #region   MES鎺ュ彛妯℃嫙娴嬭瘯
+        internal static MESData MESTest(MESSendData model)
+        {
+            MESData result = new MESData();
+
+            var mesRequst = MongoDBSingleton.Instance.FindOne<MESReSult>(Query.EQ("machineNo", model.machineNo), "MESReSult");
+            if (mesRequst != null)
+            {
+                result.machineNo = mesRequst.machineNo;
+                result.lotNo = mesRequst.lotNo;
+                result.bagNo = mesRequst.bagNo;
+                result.productType = mesRequst.productType;
+                result.materialCode = mesRequst.materialCode;
+                result.overlappingLayers = mesRequst.overlappingLayers;
+            }
+            else
+            {
+                MongoDBSingleton.Instance.Insert<MESReSult>(new MESReSult { machineNo = "T1" });
+            }
+            return result;
+        }
+        public class MESSendData
+        {
+            /// <summary>
+            /// 鍖呰鏈哄彿
+            /// </summary>
+            public string machineNo { get; set; }
+        }
+        public class MESReSult
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勫寘瑁呮満鍙凤紙T1锛孴2锛�.....锛孴9锛�+            /// </summary>
+            public string machineNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勬垚鍝佹壒娆″彿
+            /// </summary>
+            public string lotNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勮鍙�+            /// </summary>
+            public string bagNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勪骇鍝佸瀷鍙�+            /// </summary>
+            public string productType { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勭墿鏂欑紪鐮�+            /// </summary>
+            public string materialCode { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勫彔鍖呭眰鏁� 锛堜緥1,2,3锛�浠h〃涓嶅彔鍖咃紝2浠h〃鍙�灞傦紝3浠h〃鍙�灞傦級
+            /// </summary>
+            public string overlappingLayers { get; set; }
+        }
+        public class MESData
+        {
+            /// <summary>
+            /// mes杩斿洖鐨勫寘瑁呮満鍙凤紙T1锛孴2锛�.....锛孴9锛�+            /// </summary>
+            public string machineNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勬垚鍝佹壒娆″彿
+            /// </summary>
+            public string lotNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勮鍙�+            /// </summary>
+            public string bagNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勪骇鍝佸瀷鍙�+            /// </summary>
+            public string productType { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勭墿鏂欑紪鐮�+            /// </summary>
+            public string materialCode { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勫彔鍖呭眰鏁� 锛堜緥1,2,3锛�浠h〃涓嶅彔鍖咃紝2浠h〃鍙�灞傦紝3浠h〃鍙�灞傦級
+            /// </summary>
+            public string overlappingLayers { get; set; }
+        }
+        #endregion
+
+        #region   Json鏁版嵁鍐欏叆鍐欏嚭涓棿琛ㄦ祴璇�+        public static int[] machinedown = new int[16];
+        internal static JsonData Json(JsonData model)
+        {
+            JsonData result = new JsonData();
+
+
+
+            for (int i = 0; i <= 15; i++)
+            {
+                machinedown[i] = i;
+            }
+            var json = JsonConvert.SerializeObject(machinedown);
+
+            Console.WriteLine("json鏁版嵁" + json);
+            var jsonMachine = MongoDBSingleton.Instance.FindOne<JsonDataMod>(Query.EQ("order", model.order), "JsonDataMod");
+            var arr = JsonConvert.DeserializeObject(jsonMachine.jsonOne);
+            Console.WriteLine("var鏁版嵁" + arr);
+            if (jsonMachine != null)
+            {
+                result.jsonOne = jsonMachine.jsonOne;
+                result.jsonTwo = jsonMachine.jsonTwo;
+                result.jsonThree = jsonMachine.jsonThree;
+            }
+            else
+            {
+                MongoDBSingleton.Instance.Insert<JsonDataMod>(new JsonDataMod { order = model.order, jsonOne = json });
+            }
+            var arr1 = JsonConvert.DeserializeObject<List<int>>(jsonMachine.jsonOne);
+            Console.WriteLine("鏁扮粍鏁版嵁锛� + arr1);
+            for (int i = 0; i <= 15; i++)
+            {
+                Console.WriteLine($"寰幆鎵撳嵃鏁扮粍鍗曚釜鏁版嵁{arr1[i]}");
+            }
+
+            return result;
+        }
+        public class JsonData
+        {
+            public int order { get; set; }
+            public string jsonOne { get; set; }
+            public JsonConverter jsonTwo { get; set; }
+            public JsonData jsonThree { get; set; }
+        }
+        public class JsonDataMod
+        {
+            public ObjectId _id { get; set; }
+            public int order { get; set; }
+            public string jsonOne { get; set; }
+            public JsonConverter jsonTwo { get; set; }
+            public JsonData jsonThree { get; set; }
+        }
+        #endregion
+
+        #region   鏁欑О娴佺▼锛屼汉宸DA杩斿洖澶嶇О骞冲彴锛屽寘瑁呮満澶嶇О淇℃伅
+
+        internal static SimpleResult SecondResult(secondResultCache model)
+        {
+            SimpleResult result = new SimpleResult();
+            var weigh = MongoDBSingleton.Instance.FindOne<secondResult>(Query.EQ("Bit", model.Bit), "secondResult");
+            if (weigh != null)
+            {
+                MongoDBSingleton.Instance.Update<secondResult>(Query.EQ("Bit", model.Bit), Update.Set("Bit", model.Bit).Set("Status", model.Status), UpdateFlags.None);
+                result.success = true;
+                CMMLog.Info($"杩斿洖鐘舵�鎺ュ彛璋冪敤鎴愬姛锛屽綋鍓嶇偣浣嶏細{model.Bit},鐐逛綅鐘舵�锛歿model.Status}");
+                Console.WriteLine($"杩斿洖鐘舵�鎺ュ彛璋冪敤鎴愬姛锛屽綋鍓嶇偣浣嶏細{model.Bit},鐐逛綅鐘舵�锛歿model.Status}");
+            }
+            else
+            {
+                MongoDBSingleton.Instance.Insert<secondResult>(new secondResult { Bit = model.Bit, Status = model.Status });
+                result.success = true;
+                CMMLog.Info($"杩斿洖鐘舵�鎺ュ彛璋冪敤鎴愬姛锛屽綋鍓嶇偣浣嶏細{model.Bit},鐐逛綅鐘舵�锛歿model.Status}");
+                Console.WriteLine($"杩斿洖鐘舵�鎺ュ彛璋冪敤鎴愬姛锛屽綋鍓嶇偣浣嶏細{model.Bit},鐐逛綅鐘舵�锛歿model.Status}");
+            }
+            if(model.Bit == GetSecondWeighBit())
+            {
+                int i = model.Status == "OK" ? 1 : 2;
+                MongoDBSingleton.Instance.Update<SecondWeighState>(Query.EQ("location", GetSecondWeighBit()), Update.Set("secondNg", i));
+            }
+            return result;
+        }
+        public class secondResultCache
+        {
+            /// <summary>
+            /// 鏁欑О鐐逛綅
+            /// </summary>
+            public string Bit { get; set; }
+            /// <summary>
+            /// 鏁欑О鐐逛綅鐘舵�
+            /// </summary>
+            public string Status { get; set; }
+        }
+        public class secondResult
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鏁欑О鐐逛綅
+            /// </summary>
+            public string Bit { get; set; }
+            /// <summary>
+            /// 鏁欑О鐐逛綅鐘舵�
+            /// </summary>
+            public string Status { get; set; }
+        }
+
+        #endregion
+
+
+        /// <summary>
+        /// AGV鐘舵�澶勭悊
+        /// </summary>
+        /// <param name="a"></param>
+        internal static void AGVDeviceReceiveSet(AgvDeviceStatus a)
+        {
+            if (!string.IsNullOrEmpty(a.forkliftNo))
+            {
+                a.xPos = string.IsNullOrEmpty(a.xPos) ? "0" : a.xPos;
+                a.yPos = string.IsNullOrEmpty(a.yPos) ? "0" : a.yPos;
+                a.Degree = string.IsNullOrEmpty(a.Degree) ? "0" : a.Degree;
+
+                var agvStateInfo = MongoDBSingleton.Instance.FindOne<AGV_STATE>(Query.EQ("forkliftNo", a.forkliftNo), "AGV_STATE");
+                if (agvStateInfo != null)
+                {
+                    var query1 = Query.EQ("forkliftNo", a.forkliftNo);
+                    UpdateBuilder updateBuider = Update.Set("forkliftNo", a.forkliftNo).
+                            Set("errCode", a.errCode).Set("errCode2", a.errCode2).
+                            Set("faildCode", a.faildCode).Set("xPos", a.xPos).
+                            Set("yPos", a.yPos).Set("battery", a.battery).Set("detail", a.detail).Set("goods_visible", a.goods_visible).
+                            Set("Degree", a.Degree);
+                    MongoDBSingleton.Instance.Update<AGV_STATE>(query1, updateBuider, "AGV_STATE", UpdateFlags.None);
+                }
+                else
+                {
+                    MongoDBSingleton.Instance.Insert<AGV_STATE>(new AGV_STATE 
+                    { 
+                        forkliftNo = a.forkliftNo, 
+                        errCode = a.errCode, 
+                        errCode2 = a.errCode2, 
+                        faildCode = a.faildCode, 
+                        xPos = a.xPos, 
+                        yPos = a.yPos, 
+                        battery = a.battery, 
+                        detail = a.detail, 
+                        goods_visible = a.goods_visible, 
+                        Degree = a.Degree 
+                    }, "AGV_STATE");
+                }
+            }
+        }
+
+        /// <summary>
+        /// 搴撲綅鐩告満澶勭悊
+        /// </summary>
+        /// <param name="a"></param>
+        internal static SimpleResult CameraInfo(cameraModel a)
+        {
+            SimpleResult result = new SimpleResult();
+
+            var cameraInfo = MongoDBSingleton.Instance.FindOne<CameraTable>(Query.EQ("site", a.PointCode), "CameraTable");
+            if (cameraInfo != null)
+            {
+                if (cameraInfo.site == a.PointCode && cameraInfo.state == a.PointStatus)
+                {
+                    cameraInfo.time += 1;
+                    MongoDBSingleton.Instance.Update<CameraTable>(Query.EQ("site", a.PointCode), Update.Set("time", cameraInfo.time), UpdateFlags.None);
+                }
+                else
+                {
+                    MongoDBSingleton.Instance.Remove<CameraTable>(Query.EQ("site", a.PointCode), RemoveFlags.Single);
+                }
+            }
+            else
+            {
+                if (a.PointStatus == 0)
+                {
+                    MongoDBSingleton.Instance.Insert<CameraTable>(new CameraTable
+                    {
+                        site = a.PointCode,
+                        state = a.PointStatus,
+                        time = 1
+                    }, "CameraTable");
+                }
+            }
+
+            try
+            {
+                var cameraInfoList = MongoDBSingleton.Instance.FindAll<CameraTable>("CameraTable");
+                if (cameraInfoList.Count > 0)
+                {
+                    cameraInfoList.ForEach(it => {
+                        if (it.time > 10)
+                        {
+                            CMMLog.Info("CameraTable琛ㄥぇ浜�0娆$殑鏁版嵁锛� + JsonConvert.SerializeObject(cameraInfoList));
+
+                            //璋冪敤wms瑙g粦鎺ュ彛
+                            result.success = WMSHelper.WMSEmptyUnbind(it.site);
+
+                            if (result.success)
+                            {
+                                MongoDBSingleton.Instance.Remove<CameraTable>(Query.EQ("site", it.site), RemoveFlags.Single);
+                                result.errCode = 0;
+                            }
+                            CMMLog.Info($"鍙戣揣璐ф灦瑙g粦鎴愬姛锛岃揣浣嶅彿锛歿it.site}");
+
+                        }
+                    });
+                }
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error(ex.Message, ex);
+            }
+
+            return result;
+        }
+
+        public class CameraTable
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鐐逛綅
+            /// </summary>
+            public string site { get; set; }
+            /// <summary>
+            /// 鐘舵�
+            /// </summary>
+            public int state { get; set; }
+            /// <summary>
+            /// 鎺ユ敹鍒颁簡鏁版嵁娆℃暟
+            /// </summary>
+            public int time { get; set; }
+        }
+
+        public class AGV_STATE
+        {
+            public ObjectId _id { get; set; }
+            public string forkliftNo { get; set; }
+            /// <summary>
+            /// 鍋滄鐘舵�鐮�+            /// </summary>
+            public string errCode { get; set; } = "";
+            /// <summary>
+            /// 鍋滄鐘舵�鐮�
+            /// </summary>
+            public string errCode2 { get; set; } = "";
+            /// <summary>
+            /// 澶辫触鐘舵�鐮�+            /// </summary>
+            public string faildCode { get; set; } = "";
+            /// <summary>
+            /// 杞﹁締X鍧愭爣锛圕M锛�+            /// </summary>
+            public string xPos { get; set; } = "0";
+            /// <summary>
+            /// 杞﹁締Y鍧愭爣锛圷锛�+            /// </summary>
+            public string yPos { get; set; } = "0";
+            /// <summary>
+            /// 鐢垫睜鐢甸噺
+            /// </summary>
+            public string battery { get; set; } = "";
+
+            public string detail { get; set; } = "";
+            /// <summary>
+            /// 鏄惁鏈夎揣鐘舵�鐮�+            /// </summary>
+            public string goods_visible { get; set; } = "";
+            /// <summary>
+            /// 鏂瑰悜
+            /// </summary>
+            public string Degree { get; set; } = "0";
+        }
+
+        /// <summary>
+        /// hosttoagv涓婃姤杞﹁締鐘舵�锛堝弬鏁板湪hosttoagv鏈嶅姟閰嶇疆锛屽彲淇敼锛�+        /// </summary>
+        public class AgvDeviceStatus
+        {
+            public string infoType { get; set; } = "";
+            public string inMapRoute { get; set; } = "";
+            //public string detail { get; set; }
+            public string CumInfo { get; set; } = "";
+            public string forkliftNo { get; set; } = "";
+            /// <summary>
+            /// 鍋滄鐘舵�鐮�+            /// </summary>
+            public string errCode { get; set; } = "";
+            /// <summary>
+            /// 鍋滄鐘舵�鐮�
+            /// </summary>
+            public string errCode2 { get; set; } = "";
+            /// <summary>
+            /// 澶辫触鐘舵�鐮�+            /// </summary>
+            public string faildCode { get; set; } = "";
+            /// <summary>
+            /// 杞﹁締X鍧愭爣锛圕M锛�+            /// </summary>
+            public string xPos { get; set; } = "0";
+            /// <summary>
+            /// 杞﹁締Y鍧愭爣锛圷锛�+            /// </summary>
+            public string yPos { get; set; } = "0";
+            /// <summary>
+            /// 鐢垫睜鐢甸噺
+            /// </summary>
+            public string battery { get; set; } = "";
+
+            public string detail { get; set; } = "";
+            /// <summary>
+            /// 鏄惁鏈夎揣鐘舵�鐮�+            /// </summary>
+            public string goods_visible { get; set; } = "";
+            /// <summary>
+            /// 鏂瑰悜
+            /// </summary>
+            public string Degree { get; set; } = "0";
+        }
+
+        public class ReturnResult
+        {
+            public int ResultCode { get; set; }
+            public string ResultMsg { get; set; }
+        }
+
+        public class cameraModel
+        {
+            /// <summary>
+            /// 鐐逛綅
+            /// </summary>
+            public string PointCode { get; set; }
+            /// <summary>
+            /// 鐘舵�  0 - 鏃犺揣 1 - 鏈夎揣 3 - 寮傚父
+            /// </summary>
+            public int PointStatus { get; set; }
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ERPService.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ERPService.cs
new file mode 100644
index 0000000..7493131
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ERPService.cs
@@ -0,0 +1,1074 @@
+锘縰sing Hanhe.iWCS.Common;
+using Hanhe.iWCS.MData;
+using Hanhe.iWCS.Model;
+using MongoDB.Bson;
+using MongoDB.Driver;
+using MongoDB.Driver.Builders;
+using Newtonsoft.Json;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ApiHelper;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.MESHelper;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class ERPService
+    {
+        /*
+         * 鍙樻洿浼樺寲鎿嶄綔锛�+         * 
+         * 娉ㄩ噴鍐呭锛�+         *      PLCControl.SecondWeightInCache6 鏂规硶
+         * 
+         * **/
+
+
+        static WebApiHelper api = new WebApiHelper();
+
+        public const string ERPSwitch01 = "1";// ERP鍙樻洿娴佺▼寮�叧
+        public static List<string> SendERPTaskType = Settings.SendERPTaskType.Split(',').ToList();//鍥炴姤浠诲姟绫诲瀷
+        public static List<string> LoginInfo = Settings.LoginInfo.Split(',').ToList();// ERP鐧诲綍鎺ュ彛浼犺緭淇℃伅
+
+        /// <summary>
+        /// ERP鐗╂枡涓嬪彂鎺ュ彛
+        /// </summary>
+        /// <param name="itemTable"></param>
+        /// <returns></returns>
+        public static SimpleResult Item(ERPItemTable itemTable)
+        {
+            SimpleResult result = new SimpleResult { success = false};
+
+            // 鏌ヨ涓棿琛ㄦ槸鍚﹀瓨鍦ㄦ暟鎹紝濡傛灉瀛樺湪锛屽垯杩涜鏇存柊锛涘鏋滀笉瀛樺湪锛屽垯鑾峰彇褰撳墠銆愮墿鏂欏簭鍙枫�锛屽苟杩涜绱姞鎻掑叆鏁版嵁
+            var query = Query.EQ("item_code", itemTable.item_code);
+            var erpItemInfo = MongoDBSingleton.Instance.FindOne<ERPItemTable>(query, "ERPItemTable");
+            if (erpItemInfo != null)
+            {
+                var update = Update.Set("item_name", itemTable.item_name).Set("item_spec", itemTable.item_spec)
+                    .Set("item_uom", itemTable.item_uom).Set("dateTime", DateTime.Now);
+                MongoDBSingleton.Instance.Update<ERPItemTable>(query, update, "ERPItemTable", MongoDB.Driver.UpdateFlags.None);
+                result.success = true;
+            }
+            else
+            {
+                int itemNo = 1;
+                // 鑾峰彇鏈�ぇ搴忓彿鐨勬暟鎹�+                var maxErpItemInfoList = MongoDBSingleton.Instance.FindAll<ERPItemTable>("ERPItemTable");
+                if (maxErpItemInfoList.Count > 0)
+                {
+                    var maxErpItemInfo = maxErpItemInfoList.OrderByDescending(it => it.item_no).First();
+                    if (maxErpItemInfo != null) itemNo = maxErpItemInfo.item_no + 1;
+                }
+                MongoDBSingleton.Instance.Insert<ERPItemTable>(new ERPItemTable
+                {
+                    item_no = itemNo,
+                    item_code = itemTable.item_code,
+                    item_name = itemTable.item_name,
+                    item_spec = itemTable.item_spec,
+                    item_uom = itemTable.item_uom,
+                    dateTime = DateTime.Now
+                }, "ERPItemTable");
+                result.success = true;
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// ERP鍛樺伐淇℃伅涓嬪彂鎺ュ彛
+        /// </summary>
+        /// <param name="itemTable"></param>
+        /// <returns></returns>
+        public static SimpleResult Employee(ERPEmployeeTable itemTable)
+        {
+            SimpleResult result = new SimpleResult { success = false };
+
+            // 鏌ヨ涓棿琛ㄦ槸鍚﹀瓨鍦ㄦ暟鎹紝濡傛灉瀛樺湪锛屽垯杩涜鏇存柊锛涘鏋滀笉瀛樺湪锛屽垯鑾峰彇褰撳墠銆愮墿鏂欏簭鍙枫�锛屽苟杩涜绱姞鎻掑叆鏁版嵁
+            var query = Query.EQ("employee_id", itemTable.employee_id);
+            var erpItemInfo = MongoDBSingleton.Instance.FindOne<ERPEmployeeTable>(query, "ERPEmployeeTable");
+            if (erpItemInfo != null)
+            {
+                var update = Update.Set("employee_name", itemTable.employee_name).Set("dateTime", DateTime.Now);
+                MongoDBSingleton.Instance.Update<ERPEmployeeTable>(query, update, "ERPEmployeeTable", MongoDB.Driver.UpdateFlags.None);
+                result.success = true;
+            }
+            else
+            {
+                int itemNo = 1;
+                // 鑾峰彇鏈�ぇ搴忓彿鐨勬暟鎹�+                var maxErpItemInfoList = MongoDBSingleton.Instance.FindAll<ERPEmployeeTable>("ERPEmployeeTable");
+                if (maxErpItemInfoList.Count > 0)
+                {
+                    var maxErpItemInfo = maxErpItemInfoList.OrderByDescending(it => it.item_no).First();
+                    if (maxErpItemInfo != null) itemNo = maxErpItemInfo.item_no + 1;
+                }
+                MongoDBSingleton.Instance.Insert<ERPEmployeeTable>(new ERPEmployeeTable
+                {
+                    item_no = itemNo,
+                    employee_id = itemTable.employee_id,
+                    employee_name = itemTable.employee_name,
+                    dateTime = DateTime.Now
+                }, "ERPEmployeeTable");
+                result.success = true;
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// ERP鐗╂枡涓棿琛�+        /// </summary>
+        public class ERPItemTable
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鐗╂枡搴忓彿(鍞竴)
+            /// </summary>
+            public int item_no { get; set; }
+            /// <summary>
+            /// 鐗╂枡缂栫爜(鍞竴)
+            /// </summary>
+            public string item_code { get; set; }
+            /// <summary>
+            /// 鐗╂枡鍚嶇О
+            /// </summary>
+            public string item_name { get; set; }
+            /// <summary>
+            /// 瑙勬牸鍨嬪彿
+            /// </summary>
+            public string item_spec { get; set; }
+            /// <summary>
+            /// 鍗曚綅
+            /// </summary>
+            public string item_uom { get; set; }
+            /// <summary>
+            /// 鎿嶄綔鏃堕棿
+            /// </summary>
+            public DateTime dateTime { get; set; }
+        }
+
+        /// <summary>
+        /// ERP鍛樺伐淇℃伅涓棿琛�+        /// </summary>
+        public class ERPEmployeeTable
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鐗╂枡搴忓彿(鍞竴)
+            /// </summary>
+            public int item_no { get; set; }
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            public string item_code { get; set; }
+            /// <summary>
+            /// 鐗╂枡鍚嶇О
+            /// </summary>
+            public string item_name { get; set; }
+            /// <summary>
+            /// 鍛樺伐宸ュ彿
+            /// </summary>
+            public string employee_id { get; set; }
+            /// <summary>
+            /// 鍛樺伐鍚嶇О
+            /// </summary>
+            public string employee_name { get; set; }
+            /// <summary>
+            /// 鎿嶄綔鏃堕棿
+            /// </summary>
+            public DateTime dateTime { get; set; }
+        }
+
+        public static void SendERPTaskInfo(TN_I_TASK_MST mst)
+        {
+            var sendERPTaskInfo = MongoDBSingleton.Instance.FindOne<SendErpTaskInfoTable>(Query.EQ("taskNo", mst.CN_S_TASK_NO), "SendErpTaskInfoTable");
+            if (sendERPTaskInfo == null)
+            {
+                //string timeStamp = "";
+                //if (mst.transportInfo.Count > 0) timeStamp = mst.transportInfo.First().itemPCode;
+                MongoDBSingleton.Instance.Insert<SendErpTaskInfoTable>(new SendErpTaskInfoTable
+                {
+                    taskNo = mst.CN_S_TASK_NO,
+                    timeStamp = mst.Ext2,// mst.CN_S_BATCH_NO
+                    dateTime = DateTime.Now.AddHours(8)
+                }, "SendErpTaskInfoTable");
+            }
+            else CMMLog.Error($"SendERPTaskInfo Error:褰撳墠浠诲姟鍙锋暟鎹凡瀛樺湪锛屼笉鍏佽鎻掑叆 SendErpTaskInfoTable 璁板綍琛ㄣ�浠诲姟鍙凤細{mst.CN_S_TASK_NO}");
+        }
+
+        public class SendErpTaskInfoTable
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 浠诲姟鍙�鍞竴)
+            /// </summary>
+            public string taskNo { get; set; }
+            /// <summary>
+            /// 鏃堕棿鎴�瀵瑰簲浠诲姟鏁版嵁 CN_S_BATCH_NO 瀛楁鍊�+            /// </summary>
+            public string timeStamp { get; set; }
+            public DateTime dateTime { get; set; }
+        }
+
+        /// <summary>
+        /// 鍏ュ簱浠诲姟瀹屾垚鍥炴姤ERP淇℃伅
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static void SendERPTaskCompleteFunc()
+        {
+            var sendERPTaskInfoList = MongoDBSingleton.Instance.FindAll<SendErpTaskInfoTable>();
+            if (sendERPTaskInfoList.Count > 0)
+            {
+                // 鍏堟牴鎹换鍔℃壒娆″彿瀛楁鑾峰彇鏃堕棿鎴充腑闂磋〃-TimeCuoInfoCom 鏁版嵁锛屽苟杩涜鍚庣画璋冪敤锛屽鐞嗘垚鍔熷垹闄ゆ椂闂存埑涓棿琛�TimeCuoInfoCom 鏁版嵁
+                sendERPTaskInfoList.ForEach(a =>
+                {
+                    bool result = ERPApiFuncTwo(a.timeStamp);
+                    if (result)
+                    {
+                        MongoDBSingleton.Instance.Remove<SendErpTaskInfoTable>(Query.EQ("_id", a._id), "SendErpTaskInfoTable", RemoveFlags.None);
+                        MongoDBSingleton.Instance.Remove<TimeCuoInfoCom>(Query.EQ("timeStamp", int.Parse(a.timeStamp)), "TimeCuoInfoCom", RemoveFlags.None);
+                    }
+                });
+            }
+        }
+
+        /// <summary>
+        /// ERP浜や簰鏂规硶:鎵撳寘涓嬬嚎浠诲姟鍒涘缓鍓�璋冪敤 鎵瑰彿涓绘。 鎺ュ彛
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public static bool ERPApiFunc(string timeStamp)
+        {
+            bool result = false;
+            try
+            {
+                var model = MongoDBSingleton.Instance.FindOne<TimeCuoInfoCom>(Query.EQ("timeStamp", int.Parse(timeStamp)), "TimeCuoInfoCom");
+                if (model != null)
+                {
+                    string userToken = ERPGetLogin();
+                    if (!string.IsNullOrEmpty(userToken))
+                    {
+                        // 鎵撳寘涓嬬嚎浠诲姟鍒涘缓鍓�璋冪敤 鎵瑰彿涓绘。 鎺ュ彛
+                        result = ERPBatchInfo(userToken, model);
+                    }
+                    else CMMLog.Error($"ERPApiFunc Error:鏈幏鍙栧埌userToken.");
+                }
+                else CMMLog.Error($"ERPApiFunc Error:褰撳墠浠诲姟鏈幏鍙栧埌瀵瑰簲鐨勬椂闂存埑鏁版嵁銆傛椂闂存埑锛歿timeStamp}锛屾椂闂存埑琛細TimeCuoInfoCom");
+            }
+            catch(Exception ex)
+            {
+                CMMLog.Error($"ERPApiFun Error:{ex.Message}");
+            }
+            
+
+            
+            return result;
+        }
+
+        /// <summary>
+        /// ERP浜や簰鏂规硶:浠诲姟瀹屾垚璋冪敤 鏉$爜涓绘。 鎺ュ彛
+        /// </summary>
+        /// <param name="timeStamp"></param>
+        /// <returns></returns>
+        public static bool ERPApiFuncTwo(string timeStamp)
+        {
+            bool result = false;
+            try
+            {
+                var model = MongoDBSingleton.Instance.FindOne<TimeCuoInfoCom>(Query.EQ("timeStamp", int.Parse(timeStamp)), "TimeCuoInfoCom");
+                if (model != null)
+                {
+                    string userToken = ERPGetLogin();
+                    if (!string.IsNullOrEmpty(userToken))
+                    {
+                        // 浠诲姟瀹屾垚璋冪敤 鏉$爜涓绘。 鎺ュ彛
+                        result = ERPBarCodeInfo(userToken, model);
+                    }
+                    else CMMLog.Error($"ERPApiFuncTwo Error:鏈幏鍙栧埌userToken.");
+                }
+                else CMMLog.Error($"ERPApiFuncTwo Error:褰撳墠浠诲姟鏈幏鍙栧埌瀵瑰簲鐨勬椂闂存埑鏁版嵁銆傛椂闂存埑锛歿timeStamp}锛屾椂闂存埑琛細TimeCuoInfoCom");
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error($"ERPApiFuncTwo Error:{ex.Message}");
+            }
+
+            return result;
+        }
+
+        public static string CooKie = "";
+        /// <summary>
+        /// ERP鐧诲綍鎺ュ彛
+        /// </summary>
+        public static string ERPGetLogin()
+        {
+            // 鑾峰彇閰嶇疆鏂囦欢鏁版嵁
+            string userToken = "";
+            try
+            {
+                string res = JsonConvert.SerializeObject(new
+                {
+                    parameters = new ArrayList { LoginInfo[0], LoginInfo[1], LoginInfo[2], int.Parse(LoginInfo[3]) }
+                });
+                string feedback = "";
+                string url = Settings.GetThirdUrlList().Where(a => a.UrlNo == "1" && a.enable == 1).FirstOrDefault().Url;
+                CMMLog.Info($"ERPGetLogin Res:{res},url:{url}");
+                feedback = api.WebPost(url, res,"","GetCooKie");
+                CMMLog.Info($"ERPGetLogin Req:{feedback}");
+                if (!string.IsNullOrEmpty(feedback))
+                {
+                    var response = JsonConvert.DeserializeObject<ERPGetLoginResModel>(feedback);
+                    if (response.IsSuccessByAPI && !string.IsNullOrEmpty(CooKie)) userToken = CooKie;
+                    else CMMLog.Info($"ERPGetLogin:璋冪敤鎺ュ彛澶辫触锛岃幏鍙朇ookie澶辫触銆�);
+                }
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error($"WMSPost WmsInTask Error:{ex.Message}");
+            }
+            CMMLog.Info($"ERPGetLogin userToken:{userToken}");
+            return userToken;
+        }
+        public class ERPGetLoginResModel
+        {
+            public string Message { get; set; }
+            public string MessageCode { get; set; }
+            public int LoginResultType { get; set; }
+            public ERPGetLoginResContextModel Context { get; set; }
+            public class ERPGetLoginResContextModel
+            {
+                public string UserToken { get; set; }
+            }
+
+            /// <summary>
+            /// 鎺ュ彛璋冪敤鐘舵� 鎴愬姛-true 澶辫触-false
+            /// </summary>
+            public bool IsSuccessByAPI { get; set; }
+        }
+
+        /// <summary>
+        /// 鍙戦�ERP鎵瑰彿涓绘。鏁版嵁
+        /// </summary>
+        /// <returns></returns>
+        public static bool ERPBatchInfo(string userToken, TimeCuoInfoCom model)
+        {
+            bool result = false;
+
+            try
+            {
+                ERPBatchInfoModel sendInfo = new ERPBatchInfoModel();
+                sendInfo.Model.FCreateOrgId.FNumber = model.createOrganization;
+                sendInfo.Model.FMaterialID.FNumber = model.materialCode;
+                sendInfo.Model.FNumber = model.batchNumber;
+                sendInfo.Model.FProduceDeptID.FNumber = model.workshopCode;
+                sendInfo.Model.FInStockDate = model.BusinessDate;
+
+                string res = JsonConvert.SerializeObject(new
+                {
+                    parameters = new ArrayList { "BD_BatchMainFile", JsonConvert.SerializeObject(sendInfo) }
+                });
+                string feedback = "";
+                string url = Settings.GetThirdUrlList().Where(a => a.UrlNo == "3" && a.enable == 1).FirstOrDefault().Url;
+                CMMLog.Info($"ERPBatchInfo Res:{res},Cookie:{userToken},url:{url}");
+                feedback = api.WebPost(url, res, userToken);
+                CMMLog.Info($"ERPBatchInfo Req:{feedback}");
+                if (!string.IsNullOrEmpty(feedback))
+                {
+                    var response = JsonConvert.DeserializeObject<ERPResModel>(feedback);
+                    result = response.Result.ResponseStatus.IsSuccess;
+                }
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error($"ERPBatchInfo WmsInTask Error:{ex.Message}");
+            }
+
+
+            return result;
+        }
+        public class ERPBatchInfoModel
+        {
+            public string Creator { get; set; } = "";
+            public Array NeedUpDateFields { get; set; } = new Array[0];
+            public Array NeedReturnFields { get; set; } = new Array[0];
+            public string IsDeleteEntry { get; set; } = "true";
+            public string SubSystemId { get; set; } = "";
+            public string IsVerifyBaseDataField { get; set; } = "false";
+            public string IsEntryBatchFill { get; set; } = "true";
+            public string ValidateFlag { get; set; } = "true";
+            public string NumberSearch { get; set; } = "true";
+            public string InterationFlags { get; set; } = "";
+            public string IsAutoSubmitAndAudit { get; set; } = "false";
+            public ModelModel Model { get; set; } = new ModelModel();
+            public class ModelModel
+            {
+                public int FLOTID { get; set; } = 0;
+
+                public FCreateOrgIdModel FCreateOrgId { get; set; } = new FCreateOrgIdModel();
+                public class FCreateOrgIdModel
+                {
+                    /// <summary>
+                        /// 鍒涘缓缁勭粐
+                        /// </summary>
+                    public string FNumber { get; set; }
+                }
+                public FMaterialIDModel FMaterialID { get; set; } = new FMaterialIDModel();
+                public class FMaterialIDModel
+                {
+                    /// <summary>
+                        /// 鐗╂枡缂栫爜
+                        /// </summary>
+                    public string FNumber { get; set; }
+                }
+                /// <summary>
+                /// 鎵瑰彿
+                /// </summary>
+                public string FNumber { get; set; }
+                public FProduceDeptIDModel FProduceDeptID { get; set; } = new FProduceDeptIDModel();
+                public class FProduceDeptIDModel
+                {
+                    /// <summary>
+                        /// 杞﹂棿缂栫爜
+                        /// </summary>
+                    public string FNumber { get; set; }
+                }
+                /// <summary>
+                    /// 涓氬姟鏃ユ湡
+                    /// </summary>
+                public string FInStockDate { get; set; }
+            }
+        }
+
+        /// <summary>
+        /// 鍙戦�ERP鏉$爜涓绘。鏁版嵁
+        /// </summary>
+        /// <returns></returns>
+        public static bool ERPBarCodeInfo(string userToken, TimeCuoInfoCom model)
+        {
+            bool result = false;
+
+            try
+            {
+                ERPBarCodeInfoModel sendInfo = new ERPBarCodeInfoModel();
+
+                sendInfo.Model.FBarCode = model.barcode;
+                sendInfo.Model.FBarCodeRule.FNumber = model.codeRules;
+                sendInfo.Model.FMaterialID.FNumber = model.materialCode;
+                sendInfo.Model.F_JY_CZZ.FStaffNumber = model.employeeId.ToString();
+                sendInfo.Model.FCreateOrgId.FNumber = model.createOrganization;
+                sendInfo.Model.FLot.FNumber = model.batchNumber;
+                sendInfo.Model.FUnitId.FNumber = model.measurementUnit;
+                sendInfo.Model.FQty = model.count;
+                sendInfo.Model.FStockId.FNumber = model.WarehouseCode;
+                sendInfo.Model.FDeptId.FNumber = model.workshopCode;
+                sendInfo.Model.FBillDate = model.BusinessDate;
+
+                string res = JsonConvert.SerializeObject(new
+                {
+                    parameters = new ArrayList { "BD_BarCodeMainFile", JsonConvert.SerializeObject(sendInfo) }
+                });
+                string feedback = "";
+                string url = Settings.GetThirdUrlList().Where(a => a.UrlNo == "2" && a.enable == 1).FirstOrDefault().Url;
+                CMMLog.Info($"ERPBarCodeInfo Res:{res},Cookie:{userToken},url:{url}");
+                feedback = api.WebPost(url, res, userToken);
+                CMMLog.Info($"ERPBarCodeInfo Req:{feedback}");
+                if (!string.IsNullOrEmpty(feedback))
+                {
+                    var response = JsonConvert.DeserializeObject<ERPResModel>(feedback);
+                    result = response.Result.ResponseStatus.IsSuccess;
+                }
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error($"ERPBarCodeInfo Error:{ex.Message}");
+            }
+
+
+            return result;
+        }
+        public class ERPBarCodeInfoModel
+        {
+            public string Creator { get; set; } = "";
+            public Array NeedUpDateFields { get; set; } = new Array[0];
+            public Array NeedReturnFields { get; set; } = new Array[0];
+            public string IsDeleteEntry { get; set; } = "true";
+            public string SubSystemId { get; set; } = "";
+            public string IsVerifyBaseDataField { get; set; } = "false";
+            public string IsEntryBatchFill { get; set; } = "true";
+            public string ValidateFlag { get; set; } = "true";
+            public string NumberSearch { get; set; } = "true";
+            public string InterationFlags { get; set; } = "";
+            public string IsAutoSubmitAndAudit { get; set; } = "false";
+            public ModelModel Model { get; set; } = new ModelModel();
+            public class ModelModel
+            {
+                public int FID { get; set; } = 0;
+                /// <summary>
+                    /// 鏉″舰鐮�+                    /// </summary>
+                public string FBarCode { get; set; }
+                public FBarCodeRuleModel FBarCodeRule { get; set; } = new FBarCodeRuleModel();
+                public class FBarCodeRuleModel
+                {
+                    /// <summary>
+                    /// 鏉$爜瑙勫垯
+                    /// </summary>
+                    public string FNumber { get; set; }
+                }
+                public FMaterialIDModel FMaterialID { get; set; } = new FMaterialIDModel();
+                public class FMaterialIDModel
+                {
+                    /// <summary>
+                        /// 鐗╂枡缂栫爜
+                        /// </summary>
+                    public string FNumber { get; set; }
+                }
+                public F_JY_CZZModel F_JY_CZZ { get; set; } = new F_JY_CZZModel();
+                public class F_JY_CZZModel
+                {
+                    /// <summary>
+                    /// 鍛樺伐缂栧彿  鍘熷厛锛欶Number  鐩墠锛欶StaffNumber
+                    /// </summary>
+                    public string FStaffNumber { get; set; }
+                }
+                public FCreateOrgIdModel FCreateOrgId { get; set; } = new FCreateOrgIdModel();
+                public class FCreateOrgIdModel
+                {
+                    /// <summary>
+                        /// 鍒涘缓缁勭粐
+                        /// </summary>
+                    public string FNumber { get; set; }
+                }
+                public FLotModel FLot { get; set; } = new FLotModel();
+                public class FLotModel
+                {
+                    /// <summary>
+                    /// 鎵瑰彿
+                    /// </summary>
+                    public string FNumber { get; set; }
+                }
+                public FUnitIdModel FUnitId { get; set; } = new FUnitIdModel();
+                public class FUnitIdModel
+                {
+                    /// <summary>
+                    /// 璁¢噺鍗曚綅
+                    /// </summary>
+                    public string FNumber { get; set; }
+                }
+                /// <summary>
+                /// 鏁伴噺
+                /// </summary>
+                public int FQty { get; set; }
+                public FStockIdModel FStockId { get; set; } = new FStockIdModel();
+                public class FStockIdModel
+                {
+                    /// <summary>
+                    /// 浠撳簱缂栫爜
+                    /// </summary>
+                    public string FNumber { get; set; }
+                }
+                public FDeptIdModel FDeptId { get; set; } = new FDeptIdModel();
+                public class FDeptIdModel
+                {
+                    /// <summary>
+                    /// 杞﹂棿缂栫爜
+                    /// </summary>
+                    public string FNumber { get; set; }
+                }
+                /// <summary>
+                /// 涓氬姟鏃ユ湡
+                /// </summary>
+                public string FBillDate { get; set; }
+            }
+        }
+
+        public class ERPResModel
+        {
+            public ResultModel Result { get; set; }
+
+            public class ResultModel
+            {
+                public ResponseStatusModel ResponseStatus { get; set; }
+
+                public class ResponseStatusModel
+                {
+                    public bool IsSuccess { get; set; }
+                    public int MsgCode { get; set; }
+                }
+            }
+        }
+
+
+        /// <summary>
+        /// 鍐欏叆鍖呰鏈虹墿鏂欎俊鎭�+        /// </summary>
+        /// <param name="plcInfo"></param>
+        public static void WriteItemInfo(Settings.PlcInfo plcInfo)
+        {
+            CMMLog.Debug($"WriteItemInfo:Start!");
+
+            try
+            {
+                //璇诲彇銆愮炕椤点�閫氶亾鏁版嵁
+                var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    addr = plcInfo.FyReadAddr,
+                    host = plcInfo.ip,
+                    port = plcInfo.port
+                });
+                CMMLog.Debug($"WriteItemInfo:璇诲彇銆愮炕椤点�閫氶亾鏁版嵁涓猴細{JsonConvert.SerializeObject(result)}!");
+                if (true) // result != null && result.errCode == 0
+                {
+                    // 绀轰緥锛氳鍑哄�涓� 鑾峰彇1~5缂栧彿鐨勭墿鏂欐暟鎹�璇诲嚭鍊间负2 鑾峰彇6~10缂栧彿鐨勭墿鏂欐暟鎹�瑙勫垯 result.result[0] * 5 - 4 璧峰缂栧彿
+                    //int startItemNo = 1;
+                    int startItemNo = result.result[0] * 5 - 4;
+                    CMMLog.Debug($"WriteItemInfo:缈婚〉鏁版嵁涓猴細{startItemNo}!");
+                    var reLocationTask = MongoDBSingleton.Instance.Find<ERPItemTable>(Query.And(Query.In("item_no", new List<MongoDB.Bson.BsonValue>() { startItemNo, startItemNo + 1, startItemNo + 2, startItemNo + 3, startItemNo + 4 })), "ERPItemTable").ToList();
+                    int reLocationTaskNum = reLocationTask != null ? reLocationTask.Count : 0;
+                    CMMLog.Debug($"WriteItemInfo:鏌ヨ鍑篍RP鐗╂枡琛ㄦ暟鎹暟閲忎负锛歿reLocationTaskNum}!澶囨敞锛氬彧鏈夋暟閲忎负5鎵嶄細鍐欏叆鏁版嵁");
+                    if (reLocationTaskNum == 5)
+                    {
+                        int no = 0;
+                        reLocationTask.ForEach(a =>
+                        {
+                            int writeAddr = plcInfo.FyWriteAddr + no * 100;
+                            no++;
+                            // 瑙f瀽鐗╂枡鏁版嵁骞跺啓鍏�鏈夋晥鏁版嵁閫氶亾 70,鍏�00(浜у搧鎵规鍙�20 浜у搧鍨嬪彿-10 鐗╂枡缂栫爜-20 鐗╂枡鍚嶇О-15 璁¢噺鍗曚綅-5 鍓╀綑30鏃犵敤閫氶亾)
+                            int[] num = new int[100];
+                            // 鍐呭瓨鍦板潃 0~19 鍗忚鍦板潃 1~20  鎵规鍙�浜哄伐杈撳叆,涓嶉渶瑕佺▼搴忓啓鍏�+                            for (int i = 0; i <= 19; i++) num[i] = 0;
+                            // 鍐呭瓨鍦板潃 20~29 鍗忚鍦板潃 21~30 浜у搧鍨嬪彿
+                            // HandleItemInfo(a.item_spec, 20, 29, num);
+                            HandleItemInfoChina(a.item_spec, 20, 29, num);
+                            CMMLog.Debug($"WriteItemInfo:鐗╂枡淇℃伅澶勭悊-2銆傚鐞嗘暟鎹細{a.item_spec},澶勭悊鍚庢暟鎹細{JsonConvert.SerializeObject(num)}");
+                            // 鍐呭瓨鍦板潃 30~49 鍗忚鍦板潃 31~50 鐗╂枡缂栫爜
+                            HandleItemInfo(a.item_code, 30, 49, num);
+                            CMMLog.Debug($"WriteItemInfo:鐗╂枡淇℃伅澶勭悊-2銆傚鐞嗘暟鎹細{a.item_code},澶勭悊鍚庢暟鎹細{JsonConvert.SerializeObject(num)}");
+                            // 鍐呭瓨鍦板潃 50~64 鍗忚鍦板潃 51~65 鐗╂枡鍚嶇О
+                            // HandleItemInfo(a.item_name, 50, 64, num);
+                            HandleItemInfoChina(a.item_name, 50, 64, num);// 涓枃澶勭悊
+                            CMMLog.Debug($"WriteItemInfo:鐗╂枡淇℃伅澶勭悊-2銆傚鐞嗘暟鎹細{a.item_name},澶勭悊鍚庢暟鎹細{JsonConvert.SerializeObject(num)}");
+                            // 鍐呭瓨鍦板潃 65~69 鍗忚鍦板潃 66~70 璁¢噺鍗曚綅
+                            HandleItemInfo(a.item_uom, 65, 69, num);
+                            CMMLog.Debug($"WriteItemInfo:鐗╂枡淇℃伅澶勭悊-2銆傚鐞嗘暟鎹細{a.item_uom},澶勭悊鍚庢暟鎹細{JsonConvert.SerializeObject(num)}");
+                            // 鍐呭瓨鍦板潃 70~79 鍗忚鍦板潃 71~100 绌轰綑鍦板潃
+                            for (int i = 70; i <= 99; i++) num[i] = 0;
+
+                            CMMLog.Debug($"WriteItemInfo:鍙戦�鐗╂枡淇℃伅銆傚簭鍙凤細{a.item_no},ip:{plcInfo.ip},port:{plcInfo.port},鍐欏叆璧峰鍦板潃:{writeAddr},鍐欏叆鏁版嵁:{JsonConvert.SerializeObject(num)}");
+
+                            var wirteall01 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                            {
+                                addr = writeAddr,
+                                host = plcInfo.ip,
+                                port = plcInfo.port,
+                                data = num
+                            });
+                            int writeResult = wirteall01 != null ? wirteall01.errCode : 1;
+                            CMMLog.Debug($"WriteItemInfo:鍙戦�鐗╂枡淇℃伅銆傚簭鍙凤細{a.item_no},鍐欏叆缁撴灉锛歿writeResult}銆俰p:{plcInfo.ip},port:{plcInfo.port},鍐欏叆璧峰鍦板潃:{writeAddr},鍐欏叆鏁版嵁:{JsonConvert.SerializeObject(num)}");
+                        });
+                    }
+                }
+                else CMMLog.Debug($"WriteItemInfo:鏈鍙栥�缈婚〉銆戦�閬撴暟鎹�");
+            }
+            catch(Exception ex)
+            {
+                CMMLog.Debug($"WriteItemInfo Error:{ex.Message}");
+            }
+
+            CMMLog.Debug($"WriteItemInfo:End!");
+        }
+
+        public static void HandleItemInfo(string itemInfo,int startIndex, int endIndex , int[] num)
+        {
+            string data = itemInfo;// 瑕佸啓鍏ョ殑澶勭悊鍚庢暟鎹�+            string dataHeader = "";// 鏁版嵁澶村鐞�+            int dataCutCont = 0;// 鏁版嵁鎴彇寮�叧
+            if (itemInfo.Length % 2 != 0)
+            {
+                data = "0" + itemInfo;
+                dataHeader = "" + itemInfo.Substring(0, 1);
+            }
+            int maxLength = startIndex - 1 + (data.Length / 2);// data.Length / 2 鑷冲皯涓�1
+            for (int i = startIndex; i <= maxLength; i++)
+            {
+                num[i] = int.Parse(PLCControl.AsciiToTen(data.Substring(dataCutCont, 2)));
+                dataCutCont = dataCutCont + 2;
+            }
+            if (!string.IsNullOrEmpty(dataHeader)) num[startIndex] = int.Parse(PLCControl.AsciiToTen(dataHeader));
+            for (int i = maxLength + 1; i <= endIndex; i++) num[i] = 0;//灏嗗綋鍓嶅鐞嗗畬鏁版嵁鐨勫叾浠栨棤鏁版嵁鐨勯�閬撳叏閮ㄧ疆涓�0
+            CMMLog.Debug($"WriteItemInfo:鐗╂枡淇℃伅澶勭悊-1銆傚鐞嗘暟鎹細{itemInfo},澶勭悊鍚庢暟鎹細{JsonConvert.SerializeObject(num)}");
+        }
+
+        public static void HandleItemInfoChina(string itemInfo, int startIndex, int endIndex, int[] num)
+        {
+            string data = itemInfo;// 瑕佸啓鍏ョ殑澶勭悊鍚庢暟鎹�+            int dataCutCont = 0;// 鏁版嵁鎴彇寮�叧
+            int maxLength = startIndex - 1 + data.Length;// data.Length / 2 鑷冲皯涓�1
+            for (int i = startIndex; i <= maxLength; i++)
+            {
+                num[i] = Test.ConvertToAscii(char.Parse(data.Substring(dataCutCont, 1)));
+                dataCutCont = dataCutCont + 1;
+            }
+            for (int i = maxLength + 1; i <= endIndex; i++) num[i] = 0;//灏嗗綋鍓嶅鐞嗗畬鏁版嵁鐨勫叾浠栨棤鏁版嵁鐨勯�閬撳叏閮ㄧ疆涓�0
+            CMMLog.Debug($"WriteItemInfo:鐗╂枡淇℃伅澶勭悊-1銆傚鐞嗘暟鎹細{itemInfo},澶勭悊鍚庢暟鎹細{JsonConvert.SerializeObject(num)}");
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍛樺伐缂栫爜
+        /// </summary>
+        /// <returns></returns>
+        public static string GetEmployeeId(int readAddr,string ip,int port)
+        {
+            string employeeId = "";
+            var employeeIdAction = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+            {
+                addr = readAddr,
+                host = ip,
+                port = port,
+                dataNum = 2
+            });
+            employeeId = Convert.ToInt32(PLCControl.Completion(employeeIdAction.result[0]) + PLCControl.Completion(employeeIdAction.result[1]), 2).ToString();
+
+            return employeeId;
+        }
+
+
+        public static string packageCont = "1";// 鍖呰鏈哄绉癠I鍙樻洿鍔熻兘寮�叧  1-寮�惎 0-鍏抽棴
+
+        /// <summary>
+        /// 鎻掑叆鍖呰鏈轰俊鎭〃
+        /// </summary>
+        public static void packageInfo(string machineNo, string trayCode, string lotNo, string oneTrayWeight)
+        {
+            if (packageCont == "1")
+            {
+                try
+                {
+                    MongoDBSingleton.Instance.Insert<packageInfoModel>(new packageInfoModel
+                    {
+                        machineNo = machineNo,
+                        trayCode = trayCode,
+                        batchNo = lotNo,
+                        time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+                        weight = oneTrayWeight,
+                        CreateTime = DateTime.Now.AddHours(8)
+                    }, "packageInfoModel");
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error($"packageInfo Error:{ex.Message}");
+                }
+            }
+
+        }
+
+        public static void updatePackageInfo(string machince, string trayCode, int[] result)
+        {
+            if (packageCont == "1")
+            {
+                try
+                {
+                    var queryList = MongoDBSingleton.Instance.Find<packageInfoModel>(Query.And(Query.EQ("machineNo", machince), Query.EQ("trayCode", trayCode), Query.EQ("weight2", "")), "packageInfoModel");
+                    if (queryList.Count > 0)
+                    {
+                        packageInfoModel query = queryList.OrderByDescending(a => a.time).First();
+                        if (query != null)
+                        {
+                            CMMLog.Debug($"updatePackageInfo:{query.machineNo},trayCode:{query.trayCode},weight:{query.weight}");
+                            //璇诲彇澶嶇О骞冲彴鐨勯噸閲�result[17]) + PLCControl.Completion(result[18]
+                            double x = (double)Convert.ToInt32(PLCControl.Completion(result[19]) + PLCControl.Completion(result[20]), 2) / 100;
+                            string weight = x.ToString();
+                            CMMLog.Debug($"updatePackageInfo:鍘熷澶嶇О閲嶉噺鏁版嵁锛歿result[19]},{result[20]};杞崲鍚庡绉伴噸閲忔暟鎹細{weight}");
+
+                            //閲嶉噺宸�
+                            //string weightDifference = (double.Parse(query.weight) - x).ToString();
+                            string weightDifference = Math.Round((double.Parse(query.weight) - x), 2).ToString();
+                            //CMMLog.Info($"weightDifference2:{weightDifference2}");
+
+                            //灏嗗绉板钩鍙伴噸閲忓啓鍏ヤ腑闂磋〃
+                            MongoDBSingleton.Instance.Update<packageInfoModel>(Query.And(Query.EQ("machineNo", machince), Query.EQ("time", query.time), Query.EQ("trayCode", query.trayCode), Query.EQ("weight2", "")), Update.Set("weight2", weight).Set("weightDifference", weightDifference), UpdateFlags.None);
+
+                        }
+                        else CMMLog.Debug($"鏁版嵁鏌ヨ澶辫触");
+                    }
+                    else CMMLog.Debug($"updatePackageInfo:packageInfoModel鏈壘鍒版暟鎹紝machineNo:{machince},trayCode:{trayCode}");
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error($"updatePackageInfo Error:{ex.Message}");
+                }
+            }
+        }
+
+        public static void deletePackageInfo()
+        {
+            if (packageCont == "1")
+            {
+                try
+                {
+                    var request = MongoDBSingleton.Instance.FindAll<packageInfoModel>();
+                    if (request.Count > 0)
+                    {
+                        request.ForEach(a =>
+                        {
+                            if (DateTime.Now.Subtract(a.CreateTime).TotalDays > 7)
+                            {
+                                MongoDBSingleton.Instance.Remove<packageInfoModel>(Query.EQ("_id", a._id), "packageInfoModel", RemoveFlags.None);
+                            }
+                        });
+                    }
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error($"deletePackageInfo Error:{ex.Message}");
+                }
+
+            }
+        }
+
+        internal static void insertMidTable()
+        {
+            var db = new SqlHelper<object>().GetInstance(false);
+            bool resul = false;
+
+            //CMMLog.Info($"鏌ヨ銆怲_JY_MATERIALSync銆戣〃锛屾煡璇㈡潯浠讹細a.FWorkShopNumber == BM000161 && a.FUseOrgNumber == 02");
+            var materInfo = db.Queryable<T_JY_MATERIALSync>().Where(a => a.FWorkShopNumber == "BM000161" && a.FUseOrgNumber == "02").ToList();
+            if (materInfo.Count > 0)
+            {
+                //CMMLog.Info($"鏌ヨ銆怲_JY_MATERIALSync銆戠殑鏁伴噺涓�{materInfo.Count}");
+                var itemList = MongoDBSingleton.Instance.FindAll<ERPItemTable>();
+                if (itemList.Count != materInfo.Count)
+                {
+                    MongoDBSingleton.Instance.RemoveAll<ERPItemTable>("ERPItemTable");
+                }
+
+                foreach (var a in materInfo)
+                {
+                    var itemInfo = MongoDBSingleton.Instance.FindOne<ERPItemTable>(Query.EQ("item_code", a.FNumber), "ERPItemTable");
+                    if (itemInfo == null)
+                    {
+                        CMMLog.Info($"涓棿琛ㄣ�ERPItemTable銆戞湭鏌ヨ鍒版暟鎹紝鐗╂枡缂栫爜锛歿a.FNumber}");
+                        int itemNo = 1;
+                        // 鑾峰彇鏈�ぇ搴忓彿鐨勬暟鎹�+                        var maxErpItemInfoList = MongoDBSingleton.Instance.FindAll<ERPItemTable>("ERPItemTable");
+                        if (maxErpItemInfoList.Count > 0)
+                        {
+                            var maxErpItemInfo = maxErpItemInfoList.OrderByDescending(it => it.item_no).First();
+                            if (maxErpItemInfo != null) itemNo = maxErpItemInfo.item_no + 1;
+                        }
+
+                        CMMLog.Info($"鑾峰彇鎻掑叆搴忓彿锛歿itemNo}");
+                        MongoDBSingleton.Instance.Insert<ERPItemTable>(new ERPItemTable
+                        {
+                            item_no = itemNo,
+                            item_code = a.FNumber,
+                            item_name = a.FName,
+                            item_spec = a.FSpecification,
+                            item_uom = a.FStoreUnit,
+                            dateTime = DateTime.Now
+                        }, "ERPItemTable");
+                        resul = true;
+                    }
+                    else
+                    {
+                        //鏌ヨ鏁版嵁鏄惁鐩稿悓
+                        if (itemInfo.item_name != a.FName || itemInfo.item_spec != a.FSpecification || itemInfo.item_uom != a.FStoreUnit)
+                        {
+                            var query = Query.EQ("item_code", a.FName);
+                            var update = Update.Set("item_name", a.FName).Set("item_spec", a.FSpecification)
+                            .Set("item_uom", a.FStoreUnit).Set("dateTime", DateTime.Now);
+                            MongoDBSingleton.Instance.Update<ERPItemTable>(query, update, "ERPItemTable", MongoDB.Driver.UpdateFlags.None);
+                            resul = true;
+                        }
+                    }
+                }
+            }
+
+            var empInfo = db.Queryable<T_JY_EMPINFOSync>().ToList();
+            if (empInfo.Count > 0)
+            {
+                var empList = MongoDBSingleton.Instance.FindAll<ERPEmployeeTable>();
+                if (empList.Count != empInfo.Count)
+                {
+                    MongoDBSingleton.Instance.RemoveAll<ERPEmployeeTable>("ERPEmployeeTable");
+                }
+                foreach (var a in empInfo)
+                {
+                    var erpEmpInfo = MongoDBSingleton.Instance.FindOne<ERPEmployeeTable>(Query.EQ("item_code", a.FNumber), "ERPEmployeeTable");
+                    if (erpEmpInfo == null)
+                    {
+                        CMMLog.Info($"涓棿琛ㄣ�ERPEmployeeTable銆戞湭鏌ヨ鍒版暟鎹紝鐗╂枡缂栫爜锛歿a.FNumber}");
+                        int itemNo = 1;
+                        // 鑾峰彇鏈�ぇ搴忓彿鐨勬暟鎹�+                        var maxErpEmpInfoList = MongoDBSingleton.Instance.FindAll<ERPEmployeeTable>("ERPEmployeeTable");
+                        if (maxErpEmpInfoList.Count > 0)
+                        {
+                            var maxErpEmpInfo = maxErpEmpInfoList.OrderByDescending(it => it.item_no).First();
+                            if (maxErpEmpInfo != null) itemNo = maxErpEmpInfo.item_no + 1;
+                        }
+
+                        CMMLog.Info($"鑾峰彇鎻掑叆搴忓彿锛歿itemNo}");
+                        MongoDBSingleton.Instance.Insert<ERPEmployeeTable>(new ERPEmployeeTable
+                        {
+                            item_no = itemNo,
+                            item_code = a.FNumber,
+                            item_name = a.FName,
+                            employee_id = a.FStaffNumber,
+                            dateTime = DateTime.Now
+                        }, "ERPEmployeeTable");
+
+                        resul = true;
+                    }
+                    else
+                    {
+                        if (erpEmpInfo.employee_id != a.FStaffNumber)
+                        {
+                            var query = Query.EQ("item_code", a.FNumber);
+                            var update = Update.Set("item_name", a.FName).Set("employee_id", a.FStaffNumber)
+                            .Set("dateTime", DateTime.Now);
+                            MongoDBSingleton.Instance.Update<ERPEmployeeTable>(query, update, "ERPEmployeeTable", MongoDB.Driver.UpdateFlags.None);
+
+                            resul = true;
+                        }
+                    }
+                }
+            }
+            if (resul)
+            {
+                if (!ERPService.WriteEmpAndItemInfoTwo())
+                {
+                    //娓呯┖琛ㄦ暟鎹�+                    MongoDBSingleton.Instance.RemoveAll<ERPItemTable>("ERPItemTable");
+                    MongoDBSingleton.Instance.RemoveAll<ERPEmployeeTable>("ERPEmployeeTable");
+                }
+            }
+        }
+
+        internal static bool WriteEmpAndItemInfoTwo()
+        {
+            try
+            {
+                TcpClient client = new TcpClient("10.50.65.30", 3001);
+
+                CMMLog.Info("WriteEmpAndItemInfoTwo 宸茶繛鎺ュ埌鏈嶅姟鍣�);
+                NetworkStream stream = client.GetStream();
+                List<byte> paddedData = new List<byte>();
+                var encode = Encoding.GetEncoding("GB2312");
+                int i = 0;
+                while (i < 150)
+                {
+                    if (i < 100)
+                    {
+                        //鍛樺伐缂栧彿
+                        var erpInfo = MongoDBSingleton.Instance.FindOne<ERPEmployeeTable>(Query.EQ("item_no", i + 1), "ERPEmployeeTable");
+                        if (erpInfo != null && !string.IsNullOrEmpty(erpInfo.employee_id))
+                        {
+                            // 鍐呭瓨鍦板潃 0~4 鍗忚鍦板潃 1~5 璁¢噺鍗曚綅
+                            byte[] data1 = encode.GetBytes(erpInfo.employee_id);
+                            byte[] paddedData1 = new byte[10];
+
+                            Array.Copy(data1, 0, paddedData1, 0, Math.Min(data1.Length, 10));
+
+                            // 灏嗘暟缁勮浆鎹负鍒楄〃
+                            paddedData.AddRange(paddedData1);
+                        }
+                        else
+                        {
+                            paddedData.AddRange(new byte[10]);
+                        }
+                    }
+                    else
+                    {
+                        int itemNo = i - 99;
+                        //鐗╂枡淇℃伅
+                        var itemInfo = MongoDBSingleton.Instance.FindOne<ERPItemTable>(Query.EQ("item_no", itemNo), "ERPItemTable");
+                        if (itemInfo != null)
+                        {
+                            // 灏嗘暟缁勮浆鎹负鍒楄〃
+                            paddedData.AddRange(getBuff(itemInfo.item_spec, 20, 2));
+
+                            paddedData.AddRange(getBuff(itemInfo.item_code, 40, 1));
+
+                            paddedData.AddRange(getBuff(itemInfo.item_name, 30, 3));
+
+                            paddedData.AddRange(getBuff(itemInfo.item_uom, 10, 1));
+
+                        }
+                        else
+                        {
+                            paddedData.AddRange(new byte[100]);
+                        }
+                    }
+                    i++;
+                }
+
+                byte[] combinedArray = paddedData.ToArray();
+
+                stream.Write(combinedArray, 0, combinedArray.Length);
+                CMMLog.Info("WriteEmpAndItemInfoTwo锛� + JsonConvert.SerializeObject(combinedArray));
+                //CMMLog.Info($"WriteEmpAndItemInfoTwo {combinedArray.Length}");
+
+                //CMMLog.Info($"Received: {encode.GetString(combinedArray, 0, 6000)}");
+                return true;
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Info("WriteEmpAndItemInfoTwo err:" + ex.Message);
+                return false;
+                //WriteEmpAndItemInfoTwo();
+            }
+        }
+
+        private static byte[] getBuff(string value, int bit, int result)
+        {
+            byte[] data1 = Encoding.GetEncoding("GB2312").GetBytes(value);
+            if (result == 2) data1 = Encoding.UTF8.GetBytes(value);
+            if (result == 3) data1 = Encoding.BigEndianUnicode.GetBytes(value);
+            byte[] paddedData1 = new byte[bit];
+            Array.Copy(data1, 0, paddedData1, 0, Math.Min(data1.Length, bit)); // 灏嗘暟鎹鍒跺埌6000瀛楄妭鐨勭紦鍐插尯涓�+            return paddedData1;
+        }
+
+        public class packageInfoModel
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿
+            /// </summary>
+            public string machineNo { get; set; } = "";
+            /// <summary>
+            /// 鎵樼洏鍙�+            /// </summary>
+            public string trayCode { get; set; } = "";
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            public string batchNo { get; set; } = "";
+            /// <summary>
+            /// 涓嬫枡鏃堕棿
+            /// </summary>
+            public string time { get; set; } = "";
+            /// <summary>
+            /// 閲嶉噺
+            /// </summary>
+            public string weight { get; set; } = "";
+            /// <summary>
+            /// 澶嶇О閲嶉噺
+            /// </summary>
+            public string weight2 { get; set; } = "";
+            /// <summary>
+            /// 閲嶉噺宸�
+            /// </summary>
+            public string weightDifference { get; set; } = "";
+            /// <summary>
+            /// 鍒涘缓鏃堕棿
+            /// </summary>
+            public DateTime CreateTime { get; set; }
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/EnentListen.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/EnentListen.cs
new file mode 100644
index 0000000..46bc41a
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/EnentListen.cs
@@ -0,0 +1,390 @@
+锘縰sing Hanhe.iWCS.Business;
+using Hanhe.iWCS.Common;
+using Hanhe.iWCS.Event;
+using Hanhe.iWCS.Interface;
+using Hanhe.iWCS.MData;
+using Hanhe.iWCS.Model;
+using MongoDB.Bson;
+using MongoDB.Driver;
+using MongoDB.Driver.Builders;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ERPService;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.PLCControl;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ProcessHelper;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    /// <summary>
+    /// 浜嬩欢鐩戝惉澶勭悊鍜岃Е鍙戜簨浠跺洖璋�+    /// </summary>
+    public class EnentListen : IEnentListen
+    {
+        private EquipmentCommandEQBLL CommandEQBLL = new EquipmentCommandEQBLL();
+        private ICallTaskProcessing iCallTask = new ICallTaskProcessing();
+        static object locker = new object();
+        static object lock1027 = new object();
+        static object lock10001 = new object();
+        static object lock10014 = new object();
+        static object lock10015 = new object();
+        static object lock10017 = new object();
+        static EnentListen() {
+        }
+        /// <summary>
+        /// 浜嬩欢璁㈤槄
+        /// </summary>
+        /// <param name="currActionModel">褰撳墠鍔ㄤ綔妯″瀷</param>
+        /// <returns></returns>
+        public bool EnentSubscribe(TN_I_TASK_DTL_ACTION currActionModel) {
+            try {
+                EventDelegate eventDelegate = new EventDelegate();
+                eventDelegate.CurrActionModel = currActionModel;
+                //eventDelegate.iSleep = 3000;
+                eventDelegate.StartListening();
+
+                return true;
+            }
+            catch (Exception ex) {
+                throw new Exception(ex.Message);
+            }
+        }
+
+        private SortByDocument sortBy = new SortByDocument { { "createTime", 1 } };
+        /// <summary>
+        /// 浜嬩欢鐩戝惉澶勭悊
+        /// </summary>
+        /// <param name="currActionModel">褰撳墠鍔ㄤ綔妯″瀷</param>
+        /// <returns>true:鏉′欢鎴愮珛 false:鏉′欢涓嶆垚绔�/returns>
+        public bool MonitorProcess(TN_I_TASK_DTL_ACTION currActionModel) {
+            bool bResult = false;
+            string msg = string.Empty;
+
+            #region   澶勭悊浠诲姟鐘舵�
+            if (currActionModel.CN_N_ACTION_CODE == 1027)
+            {
+                lock (lock1027)
+                {
+                    var request = MongoDBSingleton.Instance.FindAll<Mongo_AGV_TASK_STATE>();
+
+                    if (request.Count > 0)
+                    {
+                        request.ForEach(a =>
+                        {
+                            try
+                            {
+                                CMMLog.Info($"杩涘叆workflowToDeviceDriver,CN_S_TASK_NO:{a.TaskNo},CN_N_ACTION_CODE:{a.State},CN_S_DEVICE_CODE:{a.ForkliftNo},Ext2:{a.LockNo},Ext3:{a.ExtData}");
+                                new ProtocolAnalysis().workflowToDeviceDriver(new TN_I_TASK_DTL_ACTION { CN_S_TASK_NO = a.TaskNo, CN_N_ACTION_CODE = a.State, CN_S_DEVICE_CODE = a.ForkliftNo, Ext2 = a.LockNo, Ext3 = a.ExtData });
+                                MongoDBSingleton.Instance.Remove<Mongo_AGV_TASK_STATE>(Query.EQ("_id", a._id), RemoveFlags.Single);
+                            }
+                            catch (Exception ex)
+                            {
+                                CMMLog.Error(ex.Message, ex);
+                            }
+                        });
+                    }
+                    Thread.Sleep(1000);
+                }
+
+            }
+            #endregion
+
+            #region   3妤艰澶囦换鍔�+            #region 10001-璇诲彇鍖呰绾夸俊鍙�3妤煎寘瑁呭彇鏂�-宸插畬鎴�寰呮祴璇�
+            if (currActionModel.CN_N_ACTION_CODE == 10001)
+            {
+                lock (lock10001)
+                {
+                    var list = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "1").ToList();
+                    if (list.Count > 0)
+                    {
+                        list.ForEach(a =>
+                        {
+                            // 鍖呰鏈哄惎鍔ㄦ椂璇诲彇銆愮炕椤甸�閬撱�锛屾牴鎹〉鍙疯幏鍙栦簲鏉℃暟鎹紝鐒跺悗鍐欏叆鍖呰鏈�+                            ERPService.WriteItemInfo(a);
+
+                            PLCControl.CheckPackingMachine(a);
+                        });
+                    }
+
+                    Thread.Sleep(1500);
+                }
+            }
+            #endregion
+
+            #region 10002-璇诲彇鍖呰绾夸俊鍙�3妤煎绉板叆缂撳瓨鏋�-寮冪敤
+            //if (currActionModel.CN_N_ACTION_CODE == 10002)
+            //{
+            //    var list = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "2").ToList();
+            //    if (list.Count > 0)
+            //    {
+            //        list.ForEach(a =>
+            //        {
+            //            PLCControl.SecondWeightInCache(a);
+            //        });
+            //    }
+            //    //Thread.Sleep(3000);
+            //}
+            #endregion
+
+            #region   10003-璇诲彇鍙犲寘鏈轰俊鍙凤紙涓夋ゼ鍙屽眰缂撳瓨鏋跺叆鍙犵洏鏈烘祦绋嬶級-3妤肩紦瀛樻灦鍏ュ彔鎵�-宸插畬鎴�寰呮祴璇�
+            if (currActionModel.CN_N_ACTION_CODE == 10003)
+            {
+                var list = Settings.GetPlcInfo().Where(a => a.enable == 1 && (a.deviceType == "3" || a.deviceType == "23")).ToList();
+                if (list.Count > 0)
+                {
+                    list.ForEach(a =>
+                    {
+                        PLCControl.CacheStackingMouth(a);
+                    });
+                }
+                Thread.Sleep(1500);
+            }
+            #endregion
+
+            #region   10004-璇诲寘瑁呮満淇″彿锛堝寘瑁呮満琛ョ┖鎵樻祦绋嬶級-3妤煎寘瑁呰ˉ绌�-宸插畬鎴�寰呮祴璇�
+            if (currActionModel.CN_N_ACTION_CODE == 10004)
+            {
+                bool action = false; //2025/03/19 鍙樻洿寮�叧 鍖呰鏈鸿ˉ绌烘祦绋嬬敓鎴愪粠鍖呰鏈哄墠寰楁媶鐩樹綅鍒版寚瀹氬寘瑁呮満
+                if (action)
+                {
+                    var list = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "1").ToList();
+                    if (list.Count > 0)
+                    {
+                        list.ForEach(a =>
+                        {
+                            PLCControl.PickUpBlank(a);
+                        });
+                    }
+                }
+                else
+                {
+                    var list = Settings.GetPlcInfo().Where(a => a.enable == 1 && (a.deviceType == "1" || a.deviceType == "21")).ToList();
+                    if (list.Count > 0)
+                    {
+                        list.ForEach(a =>
+                        {
+                            PLCControl.PickUpBlankTwo(a);
+                        });
+                    }
+                }
+
+                Thread.Sleep(1500);
+            }
+            #endregion
+
+            #region 10005-鎵撳寘绾跨┖鎵樿ˉ鏂欒姹傦紙3妤兼媶鐩樻満琛ョ┖鎵橈級-3妤兼媶鐩樿ˉ绌�-宸插畬鎴�寰呮祴璇�
+            if (currActionModel.CN_N_ACTION_CODE == 10005)
+            {
+                var plc = Settings.GetPlcInfo().Where(a => a.enable == 1 && (a.deviceType == "6" || a.deviceType == "24")).FirstOrDefault();
+                if (plc != null)
+                {
+                    if (PickUpEndFree(plc.location))
+                    {
+                        PLCControl.CheckPackingLineEmpty(plc);
+                    }
+                }
+                //Thread.Sleep(500);
+            }
+            #endregion
+
+            #region 10006-鍙犵洏鏈烘弧鎵樹笅绾匡紙3妤煎彔鐩樹笅绾匡級-3妤煎彔鐩樹笅绾�-宸插畬鎴�寰呮祴璇�
+            if (currActionModel.CN_N_ACTION_CODE == 10006)
+            {
+                var plc = Settings.GetPlcInfo().Where(a => a.enable == 1 && (a.deviceType == "15" || a.deviceType == "25")).FirstOrDefault();
+                if (plc != null)
+                {
+                    if (PickUpStartFree(plc.location))
+                    {
+                        PLCControl.StackingLineEmpty(plc);
+                    }
+                }
+                //Thread.Sleep(500);
+            }
+            #endregion
+
+            #region 10007-鎵撳寘绾夸笅绾�3妤兼墦鍖呬笅绾�-宸插畬鎴�寰呮祴璇�
+            if (currActionModel.CN_N_ACTION_CODE == 10007)
+            {
+                var plc = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "4").FirstOrDefault();
+                if (plc != null)
+                {
+                    if (CheckStartFree(plc.location))
+                    {
+                        PLCControl.CheckPackingLineFull(plc);
+                    }
+                }
+                //Thread.Sleep(500);
+            }
+            #endregion
+            #endregion
+
+            #region 1000-鐢垫浠诲姟澶勭悊--寰呯‘璁�+            if (currActionModel.CN_N_ACTION_CODE == 1000)
+            {
+                ProcessHelper.CheckElevatorTask();
+                //Thread.Sleep(500);
+            }
+            #endregion
+
+            #region   2000-鍏呯數浠诲姟--鏃犻渶鏀瑰姩
+            if (currActionModel.CN_N_ACTION_CODE == 2000)
+            {
+                ProcessHelper.AGVBatteryTime();
+                Thread.Sleep(500);
+                ERPService.deletePackageInfo();
+            }
+            #endregion
+
+            #region   2001-鍖呰鏈哄啓鐢甸噺--宸插畬鎴�寰呮祴璇�
+            if (currActionModel.CN_N_ACTION_CODE == 2001)
+            {
+                PLCControl.WriteBattery();
+            }
+            #endregion
+
+            #region   10010-浠诲姟鍔ㄤ綔绾跨▼
+
+            if (currActionModel.CN_N_ACTION_CODE == 10010)
+            {
+                lock (locker)
+                {
+                    var request = MongoDBSingleton.Instance.FindAll<ActionControlModel>();
+
+                    if (request.Count > 0)
+                    {
+                        request.ForEach(a =>
+                        {
+                            try
+                            {
+                                if (a.actionNo == "1") SecondWeightActionOne(a);
+                            }
+                            catch (Exception ex)
+                            {
+                                CMMLog.Error($"10010" + ex.Message, ex);
+                            }
+                        });
+                    }
+                }
+                
+                Thread.Sleep(3000);
+            }
+
+            #endregion
+
+            #region 10012-鑽嗛棬鍙樻洿
+            if (currActionModel.CN_N_ACTION_CODE == 10012)
+            {
+                PLCControl.changeSignal();
+            }
+            #endregion
+
+            #region 10013-ERP鍙樻洿鍔熻兘
+            if (currActionModel.CN_N_ACTION_CODE == 10013)
+            {
+                ERPService.SendERPTaskCompleteFunc();
+            }
+            #endregion
+
+            #region 10017-缁欑數姊彂閫佸績璺虫寚浠�+            if (currActionModel.CN_N_ACTION_CODE == 10018)
+            {
+                lock (lock10017)
+                {
+                    PLCControl.SendHeartBeat();
+                }
+            }
+            #endregion
+
+            #region 鍥涢挻杞﹂棿
+
+            #region 10014-璇诲彇鍖呰绾夸俊鍙�3妤煎寘瑁呭彇鏂�-寮�彂涓�+            if (currActionModel.CN_N_ACTION_CODE == 10014)
+            {
+                lock (lock10014)
+                {
+                    var list = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "21").ToList();
+                    if (list.Count > 0)
+                    {
+                        list.ForEach(a =>
+                        {
+                            // 鍖呰鏈哄惎鍔ㄦ椂璇诲彇銆愮炕椤甸�閬撱�锛屾牴鎹〉鍙疯幏鍙栦簲鏉℃暟鎹紝鐒跺悗鍐欏叆鍖呰鏈�+                            //ERPService.WriteItemInfo(a);
+
+                            PLCControl.CheckPackingMachineTetracobalt(a);
+                        });
+                    }
+
+                    Thread.Sleep(1500);
+                }
+            }
+            #endregion
+
+            #region 10015-ERP鍙樻洿鍔熻兘 灏嗙墿鏂欒〃鏁版嵁鎻掑叆涓棿琛�+            if (currActionModel.CN_N_ACTION_CODE == 10015)
+            {
+                lock (lock10015)
+                {
+                    //ERPService.insertMidTable();
+                }
+            }
+            #endregion
+
+            #region 10016-鎵撳寘绾夸笅绾�3妤兼墦鍖呬笅绾�-宸插畬鎴�寰呮祴璇�
+            //鍥涢挻杞﹂棿鎵撳寘涓嬬嚎鐗╂枡淇℃伅闇�浠庝笅绾垮彛鑾峰彇
+            if (currActionModel.CN_N_ACTION_CODE == 10016)
+            {
+                var plc = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "26").FirstOrDefault();
+                if (plc != null)
+                {
+                    if (CheckStartFree(plc.location))
+                    {
+                        PLCControl.CheckPackingLineFullTwo(plc);
+                    }
+                }
+                //Thread.Sleep(500);
+            }
+            #endregion
+
+            #endregion
+            return bResult;
+        }
+
+
+
+        /// <summary>
+        /// 瑙﹀彂鍥炶皟澶勭悊
+        /// </summary>
+        /// <param name="currActionModel">褰撳墠鍔ㄤ綔妯″瀷</param>
+        /// <returns></returns>
+        public bool EventCallbacks(TN_I_TASK_DTL_ACTION currActionModel) {
+            bool bResult = true;
+            //娴嬭瘯鐮佹娴�+            if (currActionModel.CN_N_ACTION_CODE == 99999) {
+            }
+            return bResult;
+        }
+
+        private DateTime GetTime(int hour, int min = 0,int second = 0) {
+            var now = DateTime.Today;
+            var dt = new DateTime(now.Year, now.Month, now.Day, hour, min, second);
+            Console.WriteLine(dt.ToString());
+            return dt;
+        }
+        public class Mongo_AGV_TASK_STATE
+        {
+            public ObjectId _id { get; set; }
+            public int State { get; set; }
+            public string TaskNo { get; set; }
+            public string ForkliftNo { get; set; }
+            public string LockNo { get; set; }
+            /// <summary>
+            /// 鎵╁睍鍙傛暟 鍙帴鏀朵换浣曞彉閲忕洰鍓嶅搴攅xt3
+            /// </summary>
+            public string ExtData { get; set; }
+        }
+
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Hanhe.iWCS.TaizhouGEMTwoProtocol.csproj b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Hanhe.iWCS.TaizhouGEMTwoProtocol.csproj
new file mode 100644
index 0000000..38ed12b
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Hanhe.iWCS.TaizhouGEMTwoProtocol.csproj
@@ -0,0 +1,155 @@
+锘�?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{46FC3AD7-7788-446E-981D-2E2138A70F08}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Hanhe.iWCS.TaizhouGEMTwoProtocol</RootNamespace>
+    <AssemblyName>Hanhe.iWCS.TaizhouGEMTwoProtocol</AssemblyName>
+    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Hanhe.iWCS.Common">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.DeviceDriver">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.DeviceDriver.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.Event">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.Event.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.Factroy">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.Factroy.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.Interface">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.Interface.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.MData">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.MData.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.Model">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.Model.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.TaizhouGEMTwoTCP, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Hanhe.iWCS.TaizhouGEMTwoTCP\bin\Debug\Hanhe.iWCS.TaizhouGEMTwoTCP.dll</HintPath>
+    </Reference>
+    <Reference Include="log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\log4net.2.0.5\lib\net45-full\log4net.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Owin, Version=4.1.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\Microsoft.Owin.4.1.1\lib\net45\Microsoft.Owin.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Owin.Host.HttpListener">
+      <HintPath>..\..\packages\Microsoft.Owin.Host.HttpListener.4.1.1\lib\net45\Microsoft.Owin.Host.HttpListener.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Owin.Hosting, Version=4.1.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\Microsoft.Owin.Hosting.4.1.1\lib\net45\Microsoft.Owin.Hosting.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.VisualBasic" />
+    <Reference Include="MongoDB.Bson">
+      <HintPath>..\..\packages\MongoDB.Bson.dll</HintPath>
+    </Reference>
+    <Reference Include="MongoDB.Driver">
+      <HintPath>..\..\packages\MongoDB.Driver.dll</HintPath>
+    </Reference>
+    <Reference Include="MySql.Data, Version=6.7.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\MySql.Data.6.7.9\lib\net45\MySql.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\Newtonsoft.Json.6.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
+    </Reference>
+    <Reference Include="SqlSugar, Version=5.0.1.7, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\SqlSugar.5.0.1.7\lib\SqlSugar.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Net.Http.Formatting, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.7\lib\net45\System.Net.Http.Formatting.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web" />
+    <Reference Include="System.Web.Http, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\Microsoft.AspNet.WebApi.Core.5.2.7\lib\net45\System.Web.Http.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web.Http.Owin">
+      <HintPath>..\..\packages\Microsoft.AspNet.WebApi.Owin.5.2.7\lib\net45\System.Web.Http.Owin.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ApiHelper.cs" />
+    <Compile Include="AMSHelper.cs" />
+    <Compile Include="ERPService.cs" />
+    <Compile Include="MESHelper.cs" />
+    <Compile Include="MoboxHelper.cs" />
+    <Compile Include="OITcpHelper.cs" />
+    <Compile Include="TcpHelper.cs" />
+    <Compile Include="Settings.cs" />
+    <Compile Include="EnentListen.cs" />
+    <Compile Include="ProcessHelper.cs" />
+    <Compile Include="SqlHelper.cs" />
+    <Compile Include="Test.cs" />
+    <Compile Include="WMSHelper.cs" />
+    <Compile Include="PLCControl.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ProtocolAnalysis.cs" />
+    <Compile Include="Startup.cs" />
+    <Compile Include="TSHelper.cs" />
+    <Compile Include="ApiController.cs" />
+    <Compile Include="WebApiHelper.cs" />
+    <Compile Include="XmlHelper.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="readme.txt" />
+    <Content Include="settings.xml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\AGVProvider\Hanhe.iWCS.AGVWebService\Hanhe.iWCS.AGVWebService.csproj">
+      <Project>{55e55fbf-10ad-4275-b3fc-8ccb9fc17a69}</Project>
+      <Name>Hanhe.iWCS.AGVWebService</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Hanhe.iWCS.Business\Hanhe.iWCS.Business.csproj">
+      <Project>{733b341a-eddb-44e0-8749-6764aee699ed}</Project>
+      <Name>Hanhe.iWCS.Business</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/MESHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/MESHelper.cs
new file mode 100644
index 0000000..db55fe0
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/MESHelper.cs
@@ -0,0 +1,1435 @@
+锘縰sing Hanhe.iWCS.Common;
+using Hanhe.iWCS.MData;
+using MongoDB.Bson;
+using MongoDB.Driver;
+using MongoDB.Driver.Builders;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection.Emit;
+using System.Text;
+using System.Threading.Tasks;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.PLCControl;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ProcessHelper;
+using static System.Runtime.CompilerServices.RuntimeHelpers;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class MESHelper
+    {
+        private static string mesurl = Settings.MESUrl;
+        private static string timeurl = Settings.TimeCuo;
+        private static WebApiHelper helper = new WebApiHelper();
+        /// <summary>
+        /// 鏃堕棿鎴虫暟鎹鏁�+        /// </summary>
+        public static int total;
+
+        /// <summary>
+        /// 鍖呰鏈轰笅绾夸换鍔¤皟鐢ㄧ殑MES鎺ュ彛鈥斺�GlmTonBagFillInfo
+        /// </summary>
+        /// <param name="device">璁惧鍙�/param>
+        /// <returns></returns>
+        internal static MachineInfoCache GetPackingMachineInfo(string location) {
+
+            //mes 鍦板潃璇婚厤缃枃浠�+            MachineInfoCache result = new MachineInfoCache();
+            //闇�杩涗竴姝ョ‘璁ES鎺ュ彛浼犺緭鐨勬暟鎹�+            var param = new { machineNo = location };
+            CMMLog.Info($"鍚慚ES鍙戦�鏁版嵁{JsonConvert.SerializeObject(param)},鎺ュ彛鍦板潃涓猴細{mesurl}");
+            var res = helper.WebPost(mesurl, JsonConvert.SerializeObject(param));
+            if (!string.IsNullOrEmpty(res))
+            {
+                CMMLog.Info($"MES鑾峰彇鍒版暟鎹�{JsonConvert.DeserializeObject(res)}");
+                var req = JsonConvert.DeserializeObject<MachineInfoCache>(res);
+                if (req != null)
+                {
+                    if(location == req.machineNo)
+                    {
+                        CMMLog.Info($"杞崲鍚嶮ES鏁版嵁{req}");
+                        var machine = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.EQ("machineNo", req.machineNo), "MachineInfo");
+                        if (machine == null)
+                        {
+                            MongoDBSingleton.Instance.Insert<MachineInfo>(new MachineInfo
+                            {
+                                machineNo = req.machineNo,
+                                lotNo = req.lotNo,
+                                bagNo = req.bagNo,
+                                productType = req.productType,
+                                palletLayers = req.palletLayers,
+                                materialCode = req.materialCode,
+                                overlappingLayers = req.overlappingLayers
+                            });
+                        }
+                        else
+                        {
+                            CMMLog.Info($"褰撳墠<MachineInfo>涓棿琛ㄦ湁褰撳墠鍖呰鏈虹偣浣嶇殑淇℃伅瀛樺湪锛岃妫�煡MST涓昏〃鏄惁鏈変换鍔℃鍦ㄦ墽琛岋紒");
+                            Console.WriteLine($"褰撳墠<MachineInfo>涓棿琛ㄦ湁褰撳墠鍖呰鏈虹偣浣嶇殑淇℃伅瀛樺湪锛岃妫�煡MST涓昏〃鏄惁鏈変换鍔℃鍦ㄦ墽琛岋紒");
+                        }
+                        CMMLog.Info($"MES鎺ュ彛浼犺緭鏁版嵁淇℃伅锛歮achineNo:{req.machineNo},lotNo:{req.lotNo},bagNo:{req.bagNo},productType:{req.productType},materialCode:{req.materialCode},overlappingLayers:{req.overlappingLayers}");
+                        Console.WriteLine($"MES鎺ュ彛浼犺緭鏁版嵁淇℃伅锛歮achineNo:{req.machineNo},lotNo:{req.lotNo},bagNo:{req.bagNo},productType:{req.productType},materialCode:{req.materialCode},overlappingLayers:{req.overlappingLayers}");
+                        result = req;
+                    }
+                    else CMMLog.Info($"MES浼犺緭鐨勫寘瑁呮満鍙蜂笌褰撳墠鍖呰鏈哄彿涓嶇鍚堬細褰撳墠鍖呰鏈哄彿锛歿location},MES浼犺緭鐨勫寘瑁呮満鍙凤細{req.machineNo}");
+                }
+                else CMMLog.Info($"MES鎺ュ彛锛欽son杩斿洖鏁版嵁涓虹┖鍊硷紒鎺ュ彈鐨勬暟鎹负锛歿req}");
+            }
+            else CMMLog.Info($"MES鎺ュ彛锛氳繑鍥炴暟鎹负绌哄�锛佹帴鍙楃殑鏁版嵁涓猴細{res}");
+            return result;
+        }
+
+        /// <summary>
+        /// 3妤兼墦鍖呬笅绾垮彛鍒�妤兼垚鍝佽揣鏋跺彛鈥斺�璋冪敤鎵撳寘绾夸笅绾垮彛鎺ュ彈浼犺緭鐨勭収鐩告満鎺ュ彛鏁版嵁
+        /// </summary>
+        /// <param name="timeStamp">鏃堕棿鎴�/param>
+        /// <returns></returns>
+        internal static TimeChuoInfo TimeCuo(string timeStamp,ref string deviceNo)
+        {
+            //鏃堕棿鎴�鍦板潃璇婚厤缃枃浠�+            TimeChuoInfo result = new TimeChuoInfo();
+
+            var param = new { machineNo = timeStamp };
+            CMMLog.Info($"TimeCuo-01:SendMsg:{JsonConvert.SerializeObject(param)},url:{timeurl}");
+            //var res = helper.WebGet(timeurl, JsonConvert.SerializeObject(param));
+            var res = helper.WebGet(timeurl+"?timeStamp="+timeStamp);
+            CMMLog.Info($"TimeCuo-02:ReqMsg:{JsonConvert.SerializeObject(res)},url:{timeurl}");
+            try
+            {
+                if (!string.IsNullOrEmpty(res))
+                {
+                    CMMLog.Info("time 02");
+                    var req = JsonConvert.DeserializeObject<TimeChuoInfo>(res);
+                    if (req != null)
+                    {
+                        CMMLog.Info("time 03");
+                        //req.info = TransUTF8(req.info);//MES浼犺緭鐨刄TF-8鏍煎紡鍙傛暟锛孋#榛樿UniCode鏍煎紡锛屽嚭鐜拌В鏋愰敊璇紝浣嗘槸姝ゅ瓧娈垫棤鎰忎箟锛岀湅鎯呭喌鏇存柊
+                        //var time = req.data[req.data.Count];
+                        var timeReq = req.data.Where(a => a.timeStamp == int.Parse(timeStamp)).FirstOrDefault();
+                        CMMLog.Info("闇�澶勭悊鐨勫弬鏁帮細" + JsonConvert.SerializeObject(timeReq));
+                        if (timeReq != null && req.count == 1)
+                        {
+                            CMMLog.Info("time 04");
+                            total = timeReq.totalCount;
+
+                            if (timeReq.batchNumber.Length % 2 == 0 && timeReq.batchNumber.Substring(0, 1) == "0")
+                                timeReq.batchNumber = timeReq.batchNumber.Substring(1, timeReq.batchNumber.Length - 1);
+                            if (timeReq.productModel.Length % 2 == 0 && timeReq.productModel.Substring(0, 1) == "0")
+                                timeReq.productModel = timeReq.batchNumber.Substring(1, timeReq.productModel.Length - 1);
+
+                            CMMLog.Info("time 05");
+                            var timeCuo = MongoDBSingleton.Instance.FindOne<TimeCuoInfoCom>(Query.EQ("packingMachineNumber", timeReq.packingMachineNumber_1), "TimeCuoInfoCom");
+                            if (timeCuo == null)
+                            {
+                                MongoDBSingleton.Instance.Insert<TimeCuoInfoCom>(new TimeCuoInfoCom
+                                {
+                                    isFold = timeReq.isFold,
+                                    packingMachineNumber = timeReq.packingMachineNumber_1,
+                                    //bagNumber = timeReq.bagNumber_1+","+timeReq.bagNumber_2,
+                                    //needWeight = timeReq.needWeight_1,
+                                    realWeight = timeReq.realWeight_1,
+                                    totalWeight = timeReq.totalWeight,
+                                    batchNumber = timeReq.batchNumber,
+                                    productModel = timeReq.productModel,
+                                    isNeedTray = timeReq.isNeedTray,
+                                    //totalCount = timeReq.totalCount,
+                                    totalCount = timeReq.totalCount,
+                                    timeStamp = timeReq.timeStamp,
+                                    photoURL = timeReq.photoURL,
+                                    // ERP鍙樻洿-鐓х浉鏈烘柊澧炲瓧娈�+                                    materialCode = timeReq.materialCode,
+                                    materialName = timeReq.materialName,
+                                    measurementUnit = timeReq.measurementUnit,
+                                    createOrganization = timeReq.createOrganization,
+                                    count = timeReq.count,
+                                    WarehouseCode = timeReq.WarehouseCode,
+                                    workshopCode = timeReq.workshopCode,
+                                    BusinessDate = timeReq.BusinessDate,
+                                    barcode = timeReq.barcode,
+                                    codeRules = timeReq.codeRules,
+
+                                    employeeId = timeReq.employeeID1,
+                                    employeeID2 = timeReq.employeeID2,
+                                    employeeID3 = timeReq.employeeID3
+                                });
+                            }
+                            else
+                            {
+                                var query = Query.EQ("packingMachineNumber", timeReq.packingMachineNumber_1);
+                                UpdateBuilder update = Update.Set("isFold", timeReq.isFold).Set("totalWeight", timeReq.totalWeight)
+                                    .Set("batchNumber", timeReq.batchNumber).Set("productModel", timeReq.productModel).Set("isNeedTray", timeReq.isNeedTray)
+                                    .Set("totalCount", timeReq.totalCount).Set("timeStamp", timeReq.timeStamp).Set("photoURL", timeReq.photoURL)
+                                    .Set("materialCode", timeReq.materialCode).Set("materialName", timeReq.materialName).Set("measurementUnit", timeReq.measurementUnit)
+                                    .Set("createOrganization", timeReq.createOrganization).Set("count", timeReq.count).Set("WarehouseCode", timeReq.WarehouseCode)
+                                    .Set("workshopCode", timeReq.workshopCode).Set("BusinessDate", timeReq.BusinessDate).Set("barcode", timeReq.barcode)
+                                    .Set("codeRules", timeReq.codeRules);
+                                MongoDBSingleton.Instance.Update<TimeCuoInfoCom>(query, update, UpdateFlags.None);
+                            }
+
+                            CMMLog.Info($"鑾峰彇鍒扮殑鏃堕棿鎴虫帴鍙f暟鎹細鍖呰鏈哄彿packingMachineNumber锛歿timeReq.packingMachineNumber_1},鍙犳墭鍚庣殑瀹為檯閲嶉噺totalWeight:{timeReq.totalWeight},浜у搧鎵规鍙穊atchNumber锛歿timeReq.batchNumber}" +
+                                $",浜у搧鍨嬪彿productModel锛歿timeReq.productModel},totalCount:{timeReq.totalCount},timeStamp:{timeReq.timeStamp},photoURL:{timeReq.photoURL}");
+                            #region   鍒ゆ柇鍙犲寘灞傛暟
+
+                            if (timeReq.isFold == 1 || timeReq.isFold == 2 || timeReq.isFold == 3)
+                            {
+                                var query = Query.EQ("packingMachineNumber", timeReq.packingMachineNumber_1);
+                                UpdateBuilder update = null;
+                                if (timeReq.isFold == 1) update = Update.Set("bagNumber", timeReq.bagNumber_1).Set("realWeight", (timeReq.realWeight_1 / 100).ToString().Trim());
+                                else if (timeReq.isFold == 2) update = Update.Set("bagNumber", timeReq.bagNumber_1 + "," + timeReq.bagNumber_2);
+                                else if (timeReq.isFold == 3) update = Update.Set("bagNumber", timeReq.bagNumber_1 + "," + timeReq.bagNumber_2 + "," + timeReq.bagNumber_3);
+
+                                if (update != null)
+                                    MongoDBSingleton.Instance.Update<TimeCuoInfoCom>(query, update, "TimeCuoInfoCom", UpdateFlags.None);
+                            }
+                            else CMMLog.Error($"isFold:{timeReq.isFold}");
+
+                            #region
+                            // if (timeReq.isFold == 1)
+                            //     MongoDBSingleton.Instance.Update<TimeCuoInfoCom>(Query.EQ("packingMachineNumber", timeReq.packingMachineNumber_1), Update.Set("bagNumber", timeReq.bagNumber_1).Set("realWeight", (timeReq.realWeight_1 / 100).ToString().Trim()), UpdateFlags.None);
+                            // else if (timeReq.isFold == 2)
+                            //     //MongoDBSingleton.Instance.Update<TimeCuoInfoCom>(Query.EQ("packingMachineNumber", timeReq.packingMachineNumber_1), Update.Set("bagNumber", timeReq.bagNumber_1 + "," + timeReq.bagNumber_2).Set("realWeight", (timeReq.realWeight_1 / 100).ToString().Trim()+","+ (timeReq.realWeight_2 / 100).ToString().Trim()), UpdateFlags.None);
+                            //     MongoDBSingleton.Instance.Update<TimeCuoInfoCom>(Query.EQ("packingMachineNumber", timeReq.packingMachineNumber_1), Update.Set("bagNumber", timeReq.bagNumber_1 + "," + timeReq.bagNumber_2), UpdateFlags.None);
+                            // else if (timeReq.isFold == 3)
+                            //     //MongoDBSingleton.Instance.Update<TimeCuoInfoCom>(Query.EQ("packingMachineNumber", timeReq.packingMachineNumber_1), Update.Set("bagNumber", timeReq.bagNumber_1 + "," + timeReq.bagNumber_2 + "," + timeReq.bagNumber_3).Set("realWeight", (timeReq.realWeight_1 / 100).ToString().Trim() + "," + (timeReq.realWeight_2 / 100).ToString().Trim()+","+ (timeReq.realWeight_3 / 100).ToString().Trim()), UpdateFlags.None);
+                            //     MongoDBSingleton.Instance.Update<TimeCuoInfoCom>(Query.EQ("packingMachineNumber", timeReq.packingMachineNumber_1), Update.Set("bagNumber", timeReq.bagNumber_1 + "," + timeReq.bagNumber_2 + "," + timeReq.bagNumber_3), UpdateFlags.None);
+                            // else CMMLog.Error($"isFold:{timeReq.isFold}");
+                            #endregion
+
+                            #endregion
+                            //鍒ゆ柇鏄惁鍙犲簳鎵�+                            deviceNo = timeReq.isNeedTray == 2 ? "7" : "10";
+                            result = req;
+                        }
+                        else result = null;
+                    }
+                    else result = null;
+                    CMMLog.Info($"code:{req.code},count:{req.count},info:{req.info},info:{req.msg},info:{req.status}");
+                }
+                CMMLog.Info("time over!");
+            }
+            catch(Exception ex)
+            {
+                CMMLog.Error($"TimeCuo Error:{ex.Message}");
+            }
+            
+            return result;
+        }        
+        
+        /// <summary>
+        /// 鎵撳寘涓嬬嚎鍙e埌鎴愬搧璐ф灦鍙b�鈥旂洿鎺ユ煡璇笅绾垮彛閫氶亾鍐呮暟鎹紙鍥涢挻杞﹂棿锛�+        /// </summary>
+        /// <param name="timeStamp">鏃堕棿鎴�/param>
+        /// <returns></returns>
+        internal static TimeCuoInfoComTwo TimeCuoTwo(int[] result)
+        {
+            //鏃堕棿鎴�鍦板潃璇婚厤缃枃浠�+            string FCWeightTotal = GetTrayCode(result.Skip(96).Take(2).ToArray());//鎬诲绉伴噸閲�+            string timeCuo = GetTrayCode(result.Skip(98).Take(2).ToArray());//鏃堕棿鎴�+            var timeCuoInfo = MongoDBSingleton.Instance.FindOne<TimeCuoInfoComTwo>(Query.EQ("TimeCuo", timeCuo), "TimeCuoInfoComTwo");
+            if(timeCuoInfo == null)
+            {
+                MongoDBSingleton.Instance.Insert<TimeCuoInfoComTwo>(new TimeCuoInfoComTwo() { TimeCuo = timeCuo,FCWeightTotal = FCWeightTotal });
+            }
+
+            var infoPack = MongoDBSingleton.Instance.FindOne<TimeCuoInfoComTwo>(Query.And(Query.EQ("TimeCuo", timeCuo)), "TimeCuoInfoComTwo");
+            if(infoPack != null)
+            {
+                for (int i = 1; i <= 4; i++)
+                {
+                    string empCode = RemoveNull(GetTrayCode(result.Skip((i - 1) * 24).Take(5).ToArray()));//鍛樺伐缂栫爜
+                    string trayCode = RemoveNull(GetTrayCode(result.Skip((i - 1) * 24 + 5).Take(3).ToArray()));//鎵樼洏鐮�+                    string machineCode = RemoveNull(GetTrayCode(result.Skip((i - 1) * 24 + 8).Take(1).ToArray()));//鍖呰鏈哄彿
+                    int needWeight = Convert.ToInt32(Completion(result[((i - 1) * 24 + 9)]) + Completion(result[((i - 1) * 24 + 10)]), 2);//浜у搧闇�眰閲嶉噺
+                    int oneWeight = Convert.ToInt32(Completion(result[((i - 1) * 24 + 11)]) + Completion(result[((i - 1) * 24 + 12)]), 2);//鍗曟墭姣涢噸
+                    int readWeight = Convert.ToInt32(Completion(result[((i - 1) * 24 + 13)]) + Completion(result[((i - 1) * 24 + 14)]), 2);//鍗曟墭鍑�噸
+                    int fcWeight = Convert.ToInt32(Completion(result[((i - 1) * 24 + 15)]) + Completion(result[((i - 1) * 24 + 16)]), 2);//鍗曟墭澶嶇О閲嶉噺
+                    int trayType = Convert.ToInt32(Completion(result[((i - 1) * 24 + 17)]), 2);//鎵樼洏绫诲瀷
+                    int addState = Convert.ToInt32(Completion(result[((i - 1) * 24 + 18)]), 2);//鍙犲寘灞傛暟
+                    int bagNumber = Convert.ToInt32(Completion(result[((i - 1) * 24 + 19)]), 2);//琚嬪彿
+                    int productTime = Convert.ToInt32(Completion(result[(i - 1) * 24 + 20]) + Completion(result[(i - 1) * 24 + 21]), 2);//鐢熶骇鏃ユ湡
+                    string timeCuoTwo = Convert.ToInt32(Completion(result[(i - 1) * 24 + 22]) + Completion(result[(i - 1) * 24 + 23]), 2).ToString(); //鏃堕棿鎴�+
+                    //娉ㄦ剰锛氳繖閲岃祴鍊间腑闂磋〃鍙傛暟璇峰鐓т俊鎭氦浜掕〃鍏蜂綋閫氶亾鍊煎搴�+                    //UpdateBuilder update = Update.Set("employeeId" + i.ToString(), empCode).Set("trayCode" + i.ToString(), trayCode).Set("packingMachineNumber" + i.ToString(), machineCode).Set("needWeight" + i.ToString(), needWeight)
+                    //    .Set("oneWeight" + i.ToString(), oneWeight).Set("realWeight" + i.ToString(), readWeight).Set("FCWeight" + i.ToString(), fcWeight).Set("trayType" + i.ToString(), trayType)
+                    //    .Set("isFold" + i.ToString(), addState).Set("bagNumber" + i.ToString(), bagNumber).Set("productData" + i.ToString(), productTime).Set("timeCuo" + i.ToString(), timeCuoTwo);
+                    UpdateBuilder updateBuilder = Update.Set("employeeId" + i.ToString(), empCode).Set("trayCode" + i.ToString(), trayCode).Set("packingMachineNumber" + i.ToString(), machineCode).Set("needWeight" + i.ToString(), needWeight)
+                                            .Set("oneWeight" + i.ToString(), oneWeight).Set("realWeight" + i.ToString(), readWeight).Set("FCWeight" + i.ToString(), fcWeight).Set("trayType" + i.ToString(), trayType)
+                                            .Set("isFold" + i.ToString(), addState).Set("bagNumber" + i.ToString(), bagNumber).Set("productData" + i.ToString(), productTime).Set("timeCuo" + i.ToString(), timeCuoTwo);
+                    MongoDBSingleton.Instance.Update<TimeCuoInfoComTwo>(Query.EQ("TimeCuo", timeCuo), updateBuilder, UpdateFlags.None);
+                }
+                //浜у搧鎵规鍙� 浜у搧鍨嬪彿 鐗╂枡鍚嶇О 璁¢噺鍗曚綅鍧囧彲鍦╡rp琛ㄤ腑鏍规嵁鐗╂枡缂栫爜鑾峰彇
+
+                string materialCode = RemoveNull(GetTrayCode(result.Skip(130).Take(15).ToArray()).Trim().ToString());
+                UpdateBuilder update = Update.Set("materialCode", materialCode);
+                MongoDBSingleton.Instance.Update<TimeCuoInfoComTwo>(Query.EQ("TimeCuo", timeCuo), update, UpdateFlags.None);
+            }
+
+            return MongoDBSingleton.Instance.FindOne<TimeCuoInfoComTwo>(Query.EQ("TimeCuo", timeCuo), "TimeCuoInfoComTwo");
+        }
+
+        public static string TransUTF8(string text)
+        {
+            //澹版槑瀛楃闆�  
+            System.Text.Encoding utf8, gb2312;
+            //utf8   
+            utf8 = System.Text.Encoding.GetEncoding("utf-8");
+            //gb2312   
+            gb2312 = System.Text.Encoding.GetEncoding("gb2312");
+            byte[] utf;
+            utf = gb2312.GetBytes(text);
+            utf = System.Text.Encoding.Convert(gb2312, utf8, utf);
+            //杩斿洖杞崲鍚庣殑瀛楃   
+            return utf8.GetString(utf);
+        }
+        /// <summary>
+        /// 瀛樻斁浠嶮ES鎺ュ彈鐨勬暟鎹拰璁惧閫氶亾閲岄潰璇诲彇鐨勬暟鎹紙鍖呮嫭杞崲鍚庣殑鏁版嵁锛�+        /// </summary>
+        public class MachineInfo
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勫寘瑁呮満鍙凤紙T1锛孴2锛�.....锛孴9锛�+            /// </summary>
+            public string machineNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勬垚鍝佹壒娆″彿
+            /// </summary>
+            public string lotNo { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勮鍙�+            /// </summary>
+            public string bagNo { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勪骇鍝佸瀷鍙�+            /// </summary>
+            public string productType { get; set; } = "0";
+            /// <summary>
+            /// MES杩斿洖鐨勬槸鍚﹀彔搴曟墭锛�-涓嶅彔搴曟墭  2-鍙犲簳鎵橈級
+            /// </summary>
+            public string palletLayers { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勭墿鏂欑紪鐮�+            /// </summary>
+            public string materialCode { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勫彔鍖呭眰鏁� 锛堜緥1,2,3锛�浠h〃涓嶅彔鍖咃紝2浠h〃鍙�灞傦紝3浠h〃鍙�灞傦級
+            /// </summary>
+            public string overlappingLayers { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁3鈥斺�鎵樼洏鐮�         
+            /// </summary>
+            public string trayCode { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄彿        
+            /// </summary>
+            public string location { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�浜у搧闇�眰閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string productWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鎵樼洏閲嶉噺锛�2浣嶆暣鏁�ERP鍙樻洿锛氭牴鎹渶鏂颁俊鍙峰崗璁� trayCodeWeight 鍙樻洿涓�銆愬憳宸ョ紪鍙枫�閫氶亾
+            /// </summary>
+            public string trayCodeWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍗曟墭瀹為檯閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string oneTrayWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍙犲寘鍚庡疄闄呴噸閲忥細32浣嶆暣鏁�+            /// </summary>
+            public string addWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄嚭鍙gО閲嶇粨鏋滐細1:OK,2:NG
+            /// </summary>
+            public int packNg { get; set; } = 1;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�澶嶇О鍙gО閲嶇粨鏋滐細1:OK,2:NG
+            /// </summary>
+            public int secondNg { get; set; } = 1;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鏄惁闇�鍙犲寘锛�锛氬彔鍖咃紝2锛氫笉鍙犲寘
+            /// </summary>
+            public int addState { get; set; } = 0;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�琚嬪彿(001,002,003鈥�99)
+            /// </summary>
+            public string packageCode { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁鈥斺�鍏�6浣峴hort
+            /// </summary>
+            public int[] machinedown = new int[16];
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁鈥斺�鏁版嵁搴揓SON
+            /// </summary>
+            public string jsonData { get; set; } = "0";
+            public string occupy { get; set; } = "1";
+            public DateTime modify { get; set; }
+        }
+
+        public class MachineInfoTwo
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勫寘瑁呮満鍙凤紙T1锛孴2锛�.....锛孴9锛�+            /// </summary>
+            public string machineNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勬垚鍝佹壒娆″彿
+            /// </summary>
+            public string lotNo { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勮鍙�+            /// </summary>
+            public string bagNo { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勪骇鍝佸瀷鍙�+            /// </summary>
+            public string productType { get; set; } = "0";
+            /// <summary>
+            /// MES杩斿洖鐨勬槸鍚﹀彔搴曟墭锛�-涓嶅彔搴曟墭  2-鍙犲簳鎵橈級
+            /// </summary>
+            public string palletLayers { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勭墿鏂欑紪鐮�+            /// </summary>
+            public string materialCode { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勫彔鍖呭眰鏁� 锛堜緥1,2,3锛�浠h〃涓嶅彔鍖咃紝2浠h〃鍙�灞傦紝3浠h〃鍙�灞傦級
+            /// </summary>
+            public string overlappingLayers { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁3鈥斺�鎵樼洏鐮�         
+            /// </summary>
+            public string trayCode { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄彿        
+            /// </summary>
+            public string location { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�浜у搧闇�眰閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string productWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鎵樼洏閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string trayCodeWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍗曟墭瀹為檯閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string oneTrayWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍙犲寘鍚庡疄闄呴噸閲忥細32浣嶆暣鏁�+            /// </summary>
+            public string addWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄嚭鍙gО閲嶇粨鏋滐細1:OK,2:NG
+            /// </summary>
+            public int packNg { get; set; } = 1;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�澶嶇О鍙gО閲嶇粨鏋滐細1:OK,2:NG
+            /// </summary>
+            public int secondNg { get; set; } = 1;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鏄惁闇�鍙犲寘锛�锛氬彔鍖咃紝2锛氫笉鍙犲寘
+            /// </summary>
+            public int addState { get; set; } = 0;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�琚嬪彿(001,002,003鈥�99)
+            /// </summary>
+            public string packageCode { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁鈥斺�鍏�6浣峴hort
+            /// </summary>
+            public int[] machinedown = new int[16];
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁鈥斺�鏁版嵁搴揓SON
+            /// </summary>
+            public string jsonData { get; set; } = "0";
+            public string occupy { get; set; } = "1";
+            public DateTime modify { get; set; }
+        }        
+        
+        /// <summary>
+        /// 瀛樻斁浠嶮ES鎺ュ彈鐨勬暟鎹拰璁惧閫氶亾閲岄潰璇诲彇鐨勬暟鎹紙鍖呮嫭杞崲鍚庣殑鏁版嵁锛�+        /// </summary>
+        public class MachineInfoTetracobalt
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鍛樺伐缂栫爜
+            /// </summary>
+            public string empCode { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勫寘瑁呮満鍙凤紙T1锛孴2锛�.....锛孴9锛�+            /// </summary>
+            public string machineNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勬垚鍝佹壒娆″彿
+            /// </summary>
+            public string lotNo { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勮鍙�+            /// </summary>
+            public string bagNo { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勪骇鍝佸瀷鍙�+            /// </summary>
+            public string productType { get; set; } = "0";
+            /// <summary>
+            /// MES杩斿洖鐨勬槸鍚﹀彔搴曟墭锛�-涓嶅彔搴曟墭  2-鍙犲簳鎵橈級
+            /// </summary>
+            public string palletLayers { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勭墿鏂欑紪鐮�+            /// </summary>
+            public string materialCode { get; set; } = "0";
+            /// <summary>
+            /// MES杩斿洖鐨勭墿鏂欏悕绉�+            /// </summary>
+            public string materialName { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勮閲忓崟浣�+            /// </summary>
+            public string measurementUnit { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勫彔鍖呭眰鏁� 锛堜緥1,2,3锛�浠h〃涓嶅彔鍖咃紝2浠h〃鍙�灞傦紝3浠h〃鍙�灞傦級
+            /// </summary>
+            public string overlappingLayers { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁3鈥斺�鎵樼洏鐮�         
+            /// </summary>
+            public string trayCode { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄彿        
+            /// </summary>
+            public string location { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�浜у搧闇�眰閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string productWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍗曟墭姣涢噸
+            /// </summary>
+            public string trayCodeWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍗曟墭瀹為檯閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string oneTrayWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鎵樼洏绫诲瀷锛�2浣嶆暣鏁�+            /// </summary>
+            public string trayType { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍙犲寘鍚庡疄闄呴噸閲忥細32浣嶆暣鏁�+            /// </summary>
+            public string addWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄嚭鍙gО閲嶇粨鏋滐細1:OK,2:NG
+            /// </summary>
+            public int packNg { get; set; } = 1;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�澶嶇О鍙gО閲嶇粨鏋滐細1:OK,2:NG
+            /// </summary>
+            public int secondNg { get; set; } = 1;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鏄惁闇�鍙犲寘锛�锛氬彔鍖咃紝2锛氫笉鍙犲寘
+            /// </summary>
+            public int addState { get; set; } = 0;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�琚嬪彿(001,002,003鈥�99)
+            /// </summary>
+            public string packageCode { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鐢熶骇鏃ユ湡
+            /// </summary>
+            public string productTime { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁鈥斺�鍏�6浣峴hort
+            /// </summary>
+            public int[] machinedown = new int[22];
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁鈥斺�鏁版嵁搴揓SON
+            /// </summary>
+            public string jsonData { get; set; } = "0";
+            public string occupy { get; set; } = "1";
+            public DateTime modify { get; set; }
+        }
+
+        public class MachineInfoTwoTetracobalt
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鍛樺伐缂栫爜
+            /// </summary>
+            public string empCode { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勫寘瑁呮満鍙凤紙T1锛孴2锛�.....锛孴9锛�+            /// </summary>
+            public string machineNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勬垚鍝佹壒娆″彿
+            /// </summary>
+            public string lotNo { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勮鍙�+            /// </summary>
+            public string bagNo { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勪骇鍝佸瀷鍙�+            /// </summary>
+            public string productType { get; set; } = "0";
+            /// <summary>
+            /// MES杩斿洖鐨勬槸鍚﹀彔搴曟墭锛�-涓嶅彔搴曟墭  2-鍙犲簳鎵橈級
+            /// </summary>
+            public string palletLayers { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勭墿鏂欑紪鐮�+            /// </summary>
+            public string materialCode { get; set; } = "0";
+            /// <summary>
+            /// MES杩斿洖鐨勭墿鏂欏悕绉�+            /// </summary>
+            public string materialName { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勮閲忓崟浣�+            /// </summary>
+            public string measurementUnit { get; set; } = "0";
+            /// <summary>
+            /// mes杩斿洖鐨勫彔鍖呭眰鏁� 锛堜緥1,2,3锛�浠h〃涓嶅彔鍖咃紝2浠h〃鍙�灞傦紝3浠h〃鍙�灞傦級
+            /// </summary>
+            public string overlappingLayers { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁3鈥斺�鎵樼洏鐮�         
+            /// </summary>
+            public string trayCode { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄彿        
+            /// </summary>
+            public string location { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�浜у搧闇�眰閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string productWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍗曟墭姣涢噸
+            /// </summary>
+            public string trayCodeWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍗曟墭瀹為檯閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string oneTrayWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鎵樼洏绫诲瀷锛�2浣嶆暣鏁�+            /// </summary>
+            public string trayType { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍙犲寘鍚庡疄闄呴噸閲忥細32浣嶆暣鏁�+            /// </summary>
+            public string addWeight { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄嚭鍙gО閲嶇粨鏋滐細1:OK,2:NG
+            /// </summary>
+            public int packNg { get; set; } = 1;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�澶嶇О鍙gО閲嶇粨鏋滐細1:OK,2:NG
+            /// </summary>
+            public int secondNg { get; set; } = 1;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鏄惁闇�鍙犲寘锛�锛氬彔鍖咃紝2锛氫笉鍙犲寘
+            /// </summary>
+            public int addState { get; set; } = 0;
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�琚嬪彿(001,002,003鈥�99)
+            /// </summary>
+            public string packageCode { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鐢熶骇鏃ユ湡
+            /// </summary>
+            public string productTime { get; set; } = "0";
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁鈥斺�鍏�6浣峴hort
+            /// </summary>
+            public int[] machinedown = new int[22];
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁鈥斺�鏁版嵁搴揓SON
+            /// </summary>
+            public string jsonData { get; set; } = "0";
+            public string occupy { get; set; } = "1";
+            public DateTime modify { get; set; }
+        }
+        public class MachineInfoCache
+        {
+            /// <summary>
+            /// mes杩斿洖鐨勫寘瑁呮満鍙凤紙T1锛孴2锛�.....锛孴9锛�+            /// </summary>
+            public string machineNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勬垚鍝佹壒娆″彿
+            /// </summary>
+            public string lotNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勮鍙�+            /// </summary>
+            public string bagNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勪骇鍝佸瀷鍙�+            /// </summary>
+            public string productType { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勬槸鍚﹀彔搴曟墭淇″彿
+            /// </summary>
+            public string palletLayers { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勭墿鏂欑紪鐮�+            /// </summary>
+            public string materialCode { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勫彔鍖呭眰鏁� 锛堜緥1,2,3锛�浠h〃涓嶅彔鍖咃紝2浠h〃鍙�灞傦紝3浠h〃鍙�灞傦級
+            /// </summary>
+            public string overlappingLayers { get; set; }
+        }
+
+        /// <summary>
+        /// 鏃堕棿鎴斥�鈥旇皟鐢ㄧ収鐩告満璁惧鑾峰彇鐨勮繑鍥炰俊鎭�+        /// </summary>
+        public class TimeChuoInfo
+        {
+            public int code { get; set; }
+            public int count { get; set; }
+            public string info { get; set; }
+            public string msg { get; set; }
+            public int status { get; set; }
+            public List<TimeCuoInfo> data { get; set; }
+            public class TimeCuoInfo
+            {
+                public int isFold { get; set; }
+                /// <summary>
+                /// 鍛樺伐缂栧彿1
+                /// </summary>
+                public string employeeID1 { get; set; }
+                /// <summary>
+                /// 鍛樺伐缂栧彿2
+                /// </summary>
+                public string employeeID2 { get; set; }
+                /// <summary>
+                /// 鍛樺伐缂栧彿3
+                /// </summary>
+                public string employeeID3 { get; set; }
+                public string packingMachineNumber_1 { get; set; }
+                public string bagNumber_1 { get; set; }
+                public int needWeight_1 { get; set; }
+                public int realWeight_1 { get; set; }
+                public string packingMachineNumber_2 { get; set; }
+                public string bagNumber_2 { get; set; }
+                public int needWeight_2 { get; set; }
+                public int realWeight_2 { get; set; }
+                public string packingMachineNumber_3 { get; set; }
+                public string bagNumber_3 { get; set; }
+                public int needWeight_3 { get; set; }
+                public int realWeight_3 { get; set; }
+                public int totalWeight { get; set; }
+                public string batchNumber { get; set; }
+                public string productModel { get; set; }
+                public int totalCount { get; set; }
+                public int timeStamp { get; set; }
+                public string photoURL { get; set; }
+                /// <summary>
+                /// 鏄惁鍙犲簳鎵�ERP鍙樻洿鍔熻兘涔嬪悗涓嶅啀浣跨敤姝ゅ瓧娈�
+                /// </summary>
+                public int isNeedTray { get; set; }
+
+                /// <summary>
+                /// 鐗╂枡缂栫爜
+                /// </summary>
+                public string materialCode { get; set; } = "1";
+                /// <summary>
+                /// 鐗╂枡鍚嶇О
+                /// </summary>
+                public string materialName { get; set; }
+                /// <summary>
+                /// 璁¢噺鍗曚綅
+                /// </summary>
+                public string measurementUnit { get; set; }
+                /// <summary>
+                /// 鍒涘缓缁勭粐
+                /// </summary>
+                public string createOrganization { get; set; }
+                /// <summary>
+                /// 鏁伴噺
+                /// </summary>
+                public int count { get; set; }
+                /// <summary>
+                /// 浠撳簱缂栫爜
+                /// </summary>
+                public string WarehouseCode { get; set; }
+                /// <summary>
+                /// 杞﹂棿缂栫爜
+                /// </summary>
+                public string workshopCode { get; set; }
+                /// <summary>
+                /// 涓氬姟鏃ユ湡
+                /// </summary>
+                public string BusinessDate { get; set; }
+                /// <summary>
+                /// 鏉″舰鐮�+                /// </summary>
+                public string barcode { get; set; }
+                /// <summary>
+                /// 鏉$爜瑙勫垯
+                /// </summary>
+                public string codeRules { get; set; }
+            }
+        }
+        public class TimeCuoInfoCom
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鏄惁鍙犲寘锛�锛�锛�锛�+            /// </summary>
+            public int isFold { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿
+            /// </summary>
+            public string packingMachineNumber{ get; set; }
+            /// <summary>
+            /// 琚嬪彿(001,002,003鈥�99)1
+            /// </summary>
+            public string bagNumber { get; set; }
+            /// <summary>
+            /// 浜у搧闇�眰閲嶉噺1锛�2浣嶆暣鏁�+            /// </summary>
+            public int needWeight { get; set; }
+            /// <summary>
+            /// 鍗曟墭瀹為檯閲嶉噺1锛�2浣嶆暣鏁�+            /// </summary>
+            public int realWeight { get; set; }
+            /// <summary>
+            /// 鍙犳墭鍚庣殑瀹為檯閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public int totalWeight { get; set; }
+            /// <summary>
+            /// 浜у搧鎵规鍙�+            /// </summary>
+            public string batchNumber { get; set; }
+            /// <summary>
+            /// 浜у搧鍨嬪彿
+            /// </summary>
+            public string productModel { get; set; }
+            /// <summary>
+            /// 鏄惁鍙犲簳鎵橈紙1-涓嶅彔搴曟墭    2-鍙犲簳鎵橈級
+            /// </summary>
+            public int isNeedTray { get; set; }
+            /// <summary>
+            /// 璁℃暟(鍙湪鏁版嵁搴�
+            /// </summary>
+            public int totalCount { get; set; }
+            /// <summary>
+            /// 鏃堕棿鎴�+            /// </summary>
+            public int timeStamp { get; set; }
+            /// <summary>
+            /// 鐓х墖url
+            /// </summary>
+            public string photoURL { get; set; }
+
+
+
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            public string materialCode { get; set; }
+            /// <summary>
+            /// 鐗╂枡鍚嶇О
+            /// </summary>
+            public string materialName { get; set; }
+            /// <summary>
+            /// 璁¢噺鍗曚綅
+            /// </summary>
+            public string measurementUnit { get; set; }
+            /// <summary>
+            /// 鍒涘缓缁勭粐
+            /// </summary>
+            public string createOrganization { get; set; }
+            /// <summary>
+            /// 鏁伴噺
+            /// </summary>
+            public int count { get; set; }
+            /// <summary>
+            /// 浠撳簱缂栫爜
+            /// </summary>
+            public string WarehouseCode { get; set; }
+            /// <summary>
+            /// 杞﹂棿缂栫爜
+            /// </summary>
+            public string workshopCode { get; set; }
+            /// <summary>
+            /// 涓氬姟鏃ユ湡
+            /// </summary>
+            public string BusinessDate { get; set; }
+            /// <summary>
+            /// 鏉″舰鐮�+            /// </summary>
+            public string barcode { get; set; }
+            /// <summary>
+            /// 鏉$爜瑙勫垯
+            /// </summary>
+            public string codeRules { get; set; }
+
+
+            /// <summary>
+            /// 鍛樺伐缂栧彿
+            /// </summary>
+            public string employeeId { get; set; }
+            /// <summary>
+            /// 鍛樺伐缂栧彿2
+            /// </summary>
+            public string employeeID2 { get; set; }
+            /// <summary>
+            /// 鍛樺伐缂栧彿3
+            /// </summary>
+            public string employeeID3 { get; set; }
+        }
+        public class TimeCuoInfoTwo
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鍛樺伐缂栧彿1
+            /// </summary>
+            public string employeeId1 { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�
+            /// </summary>
+            public string trayCode1 { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿1
+            /// </summary>
+            public string packingMachineNumber1 { get; set; }
+            /// <summary>
+            /// 浜у搧闇�眰閲嶉噺1锛�2浣嶆暣鏁�+            /// </summary>
+            public int needWeight1 { get; set; }
+            /// <summary>
+            /// 鍗曟墭姣涢噸1锛�2浣嶆暣鏁�+            /// </summary>
+            public int oneWeight1 { get; set; }
+            /// <summary>
+            /// 鍗曟墭瀹為檯閲嶉噺1锛�2浣嶆暣鏁�+            /// </summary>
+            public int realWeight1 { get; set; }
+            /// <summary>
+            /// 鍗曟墭澶嶇О閲嶉噺1锛�2浣嶆暣鏁�+            /// </summary>
+            public int FCWeight1 { get; set; }
+            /// <summary>
+            /// 鎵樼洏绫诲瀷1
+            /// </summary>
+            public string trayType1 { get; set; }
+            /// <summary>
+            /// 鍙犲寘灞傛暟1
+            /// </summary>
+            public int isFold1 { get; set; }
+            /// <summary>
+            /// 鏈壒娆″唴琚嬪彿锛氾紙1锛�锛�鈥︹�10) 鏁存暟1
+            /// </summary>
+            public int bagNumber1 { get; set; }
+            /// <summary>
+            /// 鐢熶骇鏃ユ湡锛�2浣嶆暣鏁帮級1
+            /// </summary>
+            public string productData1 { get; set; }
+            /// <summary>
+            /// 鍗曞寘涓嬫枡鏃堕棿鎴�+            /// </summary>
+            public string timeCuo1 { get; set; }
+
+
+            /// <summary>
+            /// 鍛樺伐缂栧彿2
+            /// </summary>
+            public string employeeId2 { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�
+            /// </summary>
+            public string trayCode2 { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿2
+            /// </summary>
+            public string packingMachineNumber2 { get; set; }
+            /// <summary>
+            /// 浜у搧闇�眰閲嶉噺2锛�2浣嶆暣鏁�+            /// </summary>
+            public int needWeight2 { get; set; }
+            /// <summary>
+            /// 鍗曟墭姣涢噸2锛�2浣嶆暣鏁�+            /// </summary>
+            public int oneWeight2 { get; set; }
+            /// <summary>
+            /// 鍗曟墭瀹為檯閲嶉噺2锛�2浣嶆暣鏁�+            /// </summary>
+            public int realWeight2 { get; set; }
+            /// <summary>
+            /// 鍗曟墭澶嶇О閲嶉噺2锛�2浣嶆暣鏁�+            /// </summary>
+            public int FCWeight2 { get; set; }
+            /// <summary>
+            /// 鎵樼洏绫诲瀷2
+            /// </summary>
+            public string trayType2 { get; set; }
+            /// <summary>
+            /// 鍙犲寘灞傛暟2
+            /// </summary>
+            public int isFold2 { get; set; }
+            /// <summary>
+            /// 鏈壒娆″唴琚嬪彿锛氾紙1锛�锛�鈥︹�20) 鏁存暟2
+            /// </summary>
+            public int bagNumber2 { get; set; }
+            /// <summary>
+            /// 鐢熶骇鏃ユ湡锛�2浣嶆暣鏁帮級2
+            /// </summary>
+            public string productData2 { get; set; }
+            /// <summary>
+            /// 鍗曞寘涓嬫枡鏃堕棿鎴�+            /// </summary>
+            public string timeCuo2 { get; set; }
+
+
+            /// <summary>
+            /// 鍛樺伐缂栧彿3
+            /// </summary>
+            public string employeeId3 { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�
+            /// </summary>
+            public string trayCode3 { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿3
+            /// </summary>
+            public string packingMachineNumber3 { get; set; }
+            /// <summary>
+            /// 浜у搧闇�眰閲嶉噺3锛�3浣嶆暣鏁�+            /// </summary>
+            public int needWeight3 { get; set; }
+            /// <summary>
+            /// 鍗曟墭姣涢噸3锛�2浣嶆暣鏁�+            /// </summary>
+            public int oneWeight3 { get; set; }
+            /// <summary>
+            /// 鍗曟墭瀹為檯閲嶉噺3锛�2浣嶆暣鏁�+            /// </summary>
+            public int realWeight3 { get; set; }
+            /// <summary>
+            /// 鍗曟墭澶嶇О閲嶉噺3锛�2浣嶆暣鏁�+            /// </summary>
+            public int FCWeight3 { get; set; }
+            /// <summary>
+            /// 鎵樼洏绫诲瀷3
+            /// </summary>
+            public string trayType3 { get; set; }
+            /// <summary>
+            /// 鍙犲寘灞傛暟3
+            /// </summary>
+            public int isFold3 { get; set; }
+            /// <summary>
+            /// 鏈壒娆″唴琚嬪彿锛氾紙1锛�锛�鈥︹�30) 鏁存暟3
+            /// </summary>
+            public int bagNumber3 { get; set; }
+            /// <summary>
+            /// 鐢熶骇鏃ユ湡锛�2浣嶆暣鏁帮級3
+            /// </summary>
+            public string productData3 { get; set; }
+            /// <summary>
+            /// 鍗曞寘涓嬫枡鏃堕棿鎴�+            /// </summary>
+            public string timeCuo3 { get; set; }
+
+
+            /// <summary>
+            /// 鍛樺伐缂栧彿4
+            /// </summary>
+            public string employeeId4 { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�
+            /// </summary>
+            public string trayCode4 { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿4
+            /// </summary>
+            public string packingMachineNumber4 { get; set; }
+            /// <summary>
+            /// 浜у搧闇�眰閲嶉噺4锛�2浣嶆暣鏁�+            /// </summary>
+            public int needWeight4 { get; set; }
+            /// <summary>
+            /// 鍗曟墭姣涢噸4锛�2浣嶆暣鏁�+            /// </summary>
+            public int oneWeight4 { get; set; }
+            /// <summary>
+            /// 鍗曟墭瀹為檯閲嶉噺4锛�2浣嶆暣鏁�+            /// </summary>
+            public int realWeight4 { get; set; }
+            /// <summary>
+            /// 鍗曟墭澶嶇О閲嶉噺4锛�2浣嶆暣鏁�+            /// </summary>
+            public int FCWeight4 { get; set; }
+            /// <summary>
+            /// 鎵樼洏绫诲瀷4
+            /// </summary>
+            public string trayType4 { get; set; }
+            /// <summary>
+            /// 鍙犲寘灞傛暟4
+            /// </summary>
+            public int isFold4 { get; set; }
+            /// <summary>
+            /// 鏈壒娆″唴琚嬪彿锛氾紙1锛�锛�鈥︹�40) 鏁存暟4
+            /// </summary>
+            public int bagNumber4 { get; set; }
+            /// <summary>
+            /// 鐢熶骇鏃ユ湡锛�2浣嶆暣鏁帮級4
+            /// </summary>
+            public string productData4 { get; set; }
+            /// <summary>
+            /// 鍗曞寘涓嬫枡鏃堕棿鎴�+            /// </summary>
+            public string timeCuo4 { get; set; }
+
+            /// <summary>
+            /// 澶嶇О鎬婚噸閲�+            /// </summary>
+            public string FCWeightTotal { get; set; }
+            /// <summary>
+            /// 鏃堕棿鎴�+            /// </summary>
+            public string TimeCuo { get; set; }
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            public string lotNo { get; set; }
+            /// <summary>
+            /// 浜у搧鍨嬪彿
+            /// </summary>
+            public string productModel { get; set; }
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            public string materialCode { get; set; }
+            /// <summary>
+            /// 鐗╂枡鍚嶇О
+            /// </summary>
+            public string materialName { get; set; }
+            /// <summary>
+            /// 璁¢噺鍗曚綅
+            /// </summary>
+            public string measurementUnit { get; set; }
+        }
+        /// <summary>
+        /// 鍥涢挻杞﹂棿瀛樺偍涓嬬嚎鍙g墿鏂欎俊鎭�+        /// </summary>
+        public class TimeCuoInfoComTwo
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鍛樺伐缂栧彿1
+            /// </summary>
+            public string employeeId1 { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�
+            /// </summary>
+            public string trayCode1 { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿1
+            /// </summary>
+            public string packingMachineNumber1 { get; set; }
+            /// <summary>
+            /// 浜у搧闇�眰閲嶉噺1锛�2浣嶆暣鏁�+            /// </summary>
+            public int needWeight1 { get; set; }
+            /// <summary>
+            /// 鍗曟墭姣涢噸1锛�2浣嶆暣鏁�+            /// </summary>
+            public int oneWeight1 { get; set; }
+            /// <summary>
+            /// 鍗曟墭瀹為檯閲嶉噺1锛�2浣嶆暣鏁�+            /// </summary>
+            public int realWeight1 { get; set; }
+            /// <summary>
+            /// 鍗曟墭澶嶇О閲嶉噺1锛�2浣嶆暣鏁�+            /// </summary>
+            public int FCWeight1 { get; set; }
+            /// <summary>
+            /// 鎵樼洏绫诲瀷1
+            /// </summary>
+            public string trayType1 { get; set; }
+            /// <summary>
+            /// 鍙犲寘灞傛暟1
+            /// </summary>
+            public int isFold1 { get; set; }
+            /// <summary>
+            /// 鏈壒娆″唴琚嬪彿锛氾紙1锛�锛�鈥︹�10) 鏁存暟1
+            /// </summary>
+            public int bagNumber1 { get; set; }
+            /// <summary>
+            /// 鐢熶骇鏃ユ湡锛�2浣嶆暣鏁帮級1
+            /// </summary>
+            public string productData1 { get; set; }
+            /// <summary>
+            /// 鍗曞寘涓嬫枡鏃堕棿鎴�+            /// </summary>
+            public string timeCuo1 { get; set; }
+
+
+            /// <summary>
+            /// 鍛樺伐缂栧彿2
+            /// </summary>
+            public string employeeId2 { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�
+            /// </summary>
+            public string trayCode2 { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿2
+            /// </summary>
+            public string packingMachineNumber2 { get; set; }
+            /// <summary>
+            /// 浜у搧闇�眰閲嶉噺2锛�2浣嶆暣鏁�+            /// </summary>
+            public int needWeight2 { get; set; }
+            /// <summary>
+            /// 鍗曟墭姣涢噸2锛�2浣嶆暣鏁�+            /// </summary>
+            public int oneWeight2 { get; set; }
+            /// <summary>
+            /// 鍗曟墭瀹為檯閲嶉噺2锛�2浣嶆暣鏁�+            /// </summary>
+            public int realWeight2 { get; set; }
+            /// <summary>
+            /// 鍗曟墭澶嶇О閲嶉噺2锛�2浣嶆暣鏁�+            /// </summary>
+            public int FCWeight2 { get; set; }
+            /// <summary>
+            /// 鎵樼洏绫诲瀷2
+            /// </summary>
+            public string trayType2 { get; set; }
+            /// <summary>
+            /// 鍙犲寘灞傛暟2
+            /// </summary>
+            public int isFold2 { get; set; }
+            /// <summary>
+            /// 鏈壒娆″唴琚嬪彿锛氾紙1锛�锛�鈥︹�20) 鏁存暟2
+            /// </summary>
+            public int bagNumber2 { get; set; }
+            /// <summary>
+            /// 鐢熶骇鏃ユ湡锛�2浣嶆暣鏁帮級2
+            /// </summary>
+            public string productData2 { get; set; }
+            /// <summary>
+            /// 鍗曞寘涓嬫枡鏃堕棿鎴�+            /// </summary>
+            public string timeCuo2 { get; set; }
+
+
+            /// <summary>
+            /// 鍛樺伐缂栧彿3
+            /// </summary>
+            public string employeeId3 { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�
+            /// </summary>
+            public string trayCode3 { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿3
+            /// </summary>
+            public string packingMachineNumber3 { get; set; }
+            /// <summary>
+            /// 浜у搧闇�眰閲嶉噺3锛�3浣嶆暣鏁�+            /// </summary>
+            public int needWeight3 { get; set; }
+            /// <summary>
+            /// 鍗曟墭姣涢噸3锛�2浣嶆暣鏁�+            /// </summary>
+            public int oneWeight3 { get; set; }
+            /// <summary>
+            /// 鍗曟墭瀹為檯閲嶉噺3锛�2浣嶆暣鏁�+            /// </summary>
+            public int realWeight3 { get; set; }
+            /// <summary>
+            /// 鍗曟墭澶嶇О閲嶉噺3锛�2浣嶆暣鏁�+            /// </summary>
+            public int FCWeight3 { get; set; }
+            /// <summary>
+            /// 鎵樼洏绫诲瀷3
+            /// </summary>
+            public string trayType3 { get; set; }
+            /// <summary>
+            /// 鍙犲寘灞傛暟3
+            /// </summary>
+            public int isFold3 { get; set; }
+            /// <summary>
+            /// 鏈壒娆″唴琚嬪彿锛氾紙1锛�锛�鈥︹�30) 鏁存暟3
+            /// </summary>
+            public int bagNumber3 { get; set; }
+            /// <summary>
+            /// 鐢熶骇鏃ユ湡锛�2浣嶆暣鏁帮級3
+            /// </summary>
+            public string productData3 { get; set; }
+            /// <summary>
+            /// 鍗曞寘涓嬫枡鏃堕棿鎴�+            /// </summary>
+            public string timeCuo3 { get; set; }
+
+
+            /// <summary>
+            /// 鍛樺伐缂栧彿4
+            /// </summary>
+            public string employeeId4 { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�
+            /// </summary>
+            public string trayCode4 { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿4
+            /// </summary>
+            public string packingMachineNumber4 { get; set; }
+            /// <summary>
+            /// 浜у搧闇�眰閲嶉噺4锛�2浣嶆暣鏁�+            /// </summary>
+            public int needWeight4 { get; set; }
+            /// <summary>
+            /// 鍗曟墭姣涢噸4锛�2浣嶆暣鏁�+            /// </summary>
+            public int oneWeight4 { get; set; }
+            /// <summary>
+            /// 鍗曟墭瀹為檯閲嶉噺4锛�2浣嶆暣鏁�+            /// </summary>
+            public int realWeight4 { get; set; }
+            /// <summary>
+            /// 鍗曟墭澶嶇О閲嶉噺4锛�2浣嶆暣鏁�+            /// </summary>
+            public int FCWeight4 { get; set; }
+            /// <summary>
+            /// 鎵樼洏绫诲瀷4
+            /// </summary>
+            public string trayType4 { get; set; }
+            /// <summary>
+            /// 鍙犲寘灞傛暟4
+            /// </summary>
+            public int isFold4 { get; set; }
+            /// <summary>
+            /// 鏈壒娆″唴琚嬪彿锛氾紙1锛�锛�鈥︹�40) 鏁存暟4
+            /// </summary>
+            public int bagNumber4 { get; set; }
+            /// <summary>
+            /// 鐢熶骇鏃ユ湡锛�2浣嶆暣鏁帮級4
+            /// </summary>
+            public string productData4 { get; set; }
+            /// <summary>
+            /// 鍗曞寘涓嬫枡鏃堕棿鎴�+            /// </summary>
+            public string timeCuo4 { get; set; }
+
+            /// <summary>
+            /// 澶嶇О鎬婚噸閲�+            /// </summary>
+            public string FCWeightTotal { get; set; }
+            /// <summary>
+            /// 鏃堕棿鎴�+            /// </summary>
+            public string TimeCuo { get; set; }
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            public string lotNo { get; set; }
+            /// <summary>
+            /// 浜у搧鍨嬪彿
+            /// </summary>
+            public string productModel { get; set; }
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            public string materialCode { get; set; }
+            /// <summary>
+            /// 鐗╂枡鍚嶇О
+            /// </summary>
+            public string materialName { get; set; }
+            /// <summary>
+            /// 璁¢噺鍗曚綅
+            /// </summary>
+            public string measurementUnit { get; set; }
+        }
+
+        /// <summary>
+        /// 鐗╂枡琛�+        /// </summary>
+        public class T_JY_MATERIALSync
+        {
+            /// <summary>
+            /// 娴佹按鍙�+            /// </summary>
+            public int FID { get; set; }
+            /// <summary>
+            /// 鍚嶇О
+            /// </summary>
+            public string FName { get; set; }
+            /// <summary>
+            /// 缂栫爜
+            /// </summary>
+            public string FNumber { get; set; }
+            /// <summary>
+            /// 瑙勬牸鍨嬪彿
+            /// </summary>
+            public string FSpecification { get; set; }
+            /// <summary>
+            /// 浣跨敤缁勭粐缂栫爜
+            /// </summary>
+            public string FUseOrgNumber { get; set; }
+            /// <summary>
+            /// 杞﹂棿鍚嶇О
+            /// </summary>
+            public string FWorkShopNumber { get; set; }
+            /// <summary>
+            /// 淇濊川鏈�+            /// </summary>
+            public int FExpPeriod { get; set; }
+            /// <summary>
+            /// 淇濊川鏈熷崟浣�+            /// </summary>
+            public string FExpUnit { get; set; }
+            /// <summary>
+            /// 搴撳瓨鍗曚綅
+            /// </summary>
+            public string FStoreUnit { get; set; }
+            /// <summary>
+            /// 鐗╂枡鍒嗙粍鍚嶇О
+            /// </summary>
+            public string FMaterialGroupName { get; set; }
+            /// <summary>
+            /// 鐗╂枡鍒嗙粍缂栫爜
+            /// </summary>
+            public string FMaterialGroupNumber { get; set; }
+        }
+
+        /// <summary>
+        /// 鍛樺伐琛�+        /// </summary>
+        public class T_JY_EMPINFOSync
+        {
+            /// <summary>
+            /// 娴佹按鍙�+            /// </summary>
+            public int FID { get; set; }
+            /// <summary>
+            /// 缂栫爜
+            /// </summary>
+            public string FNumber { get; set; }
+            /// <summary>
+            /// 鍚嶇О
+            /// </summary>
+            public string FName { get; set; }
+            /// <summary>
+            /// 鍛樺伐缂栧彿
+            /// </summary>
+            public string FStaffNumber { get; set; }
+        }
+
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/MoboxHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/MoboxHelper.cs
new file mode 100644
index 0000000..ac30c05
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/MoboxHelper.cs
@@ -0,0 +1,367 @@
+锘縰sing SqlSugar;
+using System;
+using System.Collections.Generic;
+
+using Hanhe.iWCS.Common;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class MoboxHelper
+    {
+        static MoboxHelper() {
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏁版嵁
+        /// </summary>
+        /// <param name="lineNo"></param>
+        /// <returns></returns>
+        public WorkOrder GetWorkOrder(string lineNo) {
+            var order = new SqlHelper<WorkOrder>().Get(a => a.SQL_PLineNo == lineNo && (a.SQL_State == "鎵ц涓� || a.SQL_State == "宸插畬鎴�), a => a.T_CREATE);
+            if (order == null) Console.WriteLine($"SQLSERVER Error:鏈幏鍙栧埌褰撳墠鏉′欢鐨勭浉鍏虫暟鎹紒褰撳墠鏌ヨ鏉′欢锛歿lineNo}");
+            return order;
+        }
+        /// <summary>
+        /// 鎻掑叆鏁版嵁
+        /// </summary>
+        /// <param name="orderno"></param>
+        /// <returns></returns>
+        public bool AddNewData(string data)
+        {
+            var result = false;
+            new SqlHelper<WorkOrder>().ExecuteSql($"insert into dbo.TN_0004(S_ID,SQL_PLineNo) Values('{Guid.NewGuid()}','33333')");
+            return result;
+        }
+        /// <summary>
+        /// 鏇存柊杞﹀彿
+        /// </summary>
+        /// <param name="taskNo"></param>
+        /// <param name="endBit"></param>
+        public static bool UpdateEndBit(string taskNo, string agvNo)
+        {
+            var result = false;
+            try
+            {
+                CMMLog.Info($"SQLServer 鏇存柊浠诲姟杞﹀彿锛氫换鍔″彿锛歿taskNo},鏇存敼杞﹀彿锛歿agvNo}");
+                result = new SqlHelper<SQL_TN_I_TASK_MST>().ExecuteSql($"update dbo.tn_am_task_mst set CN_N_AGV_NO='{agvNo}' where CN_S_TASK_NO='{taskNo}'");
+            }
+            catch(Exception ex)
+            {
+                CMMLog.Error($"SQLServer 鏇存柊浠诲姟杞﹀彿寮傚父锛歿ex.Message}");
+            }
+            
+            return result;
+        }
+
+        public static bool UpdateTaskState(string taskNo, int state)
+        {
+            var result = false;
+            try
+            {
+                string taskState = state == 3 ? "寮�鍙栬揣" : state == 4 ? "鍙栬揣瀹屾垚" : state == 5 ? "寮�鍗歌揣" : state == 6 ? "鍗歌揣瀹屾垚" : "";
+                CMMLog.Info($"SQLServer 鏇存柊浠诲姟鐘舵�锛氫换鍔″彿锛歿taskNo},鏇存敼鐘舵�锛歿taskState}");
+                if (!string.IsNullOrEmpty(taskState)) result = new SqlHelper<SQL_TN_I_TASK_MST>().ExecuteSql($"update dbo.tn_am_task_mst set CN_S_STATUS='{taskState}' where CN_S_TASK_NO='{taskNo}'");
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error($"SQLServer 鏇存柊浠诲姟鐘舵�寮傚父锛歿ex.Message}");
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 鍒犻櫎鏁版嵁
+        /// </summary>
+        /// <param name="orderno"></param>
+        /// <returns></returns>
+        public bool DelData(string orderno)
+        {
+            var result = false;
+            new SqlHelper<WorkOrder>().ExecuteSql($"delete dbo.TN_0004 where SQL_PLineNo='2222222'");
+            return result;
+        }
+
+        public static void AddRecordNew(WorkOrder record)
+        {
+            var helper = new SqlHelper<WorkOrder>();
+            var old = helper.Get(a => a.SQL_PLineNo == record.SQL_PLineNo);
+            if (old != null)
+            {
+                helper.Deleteable(a => a.SQL_PLineNo == record.SQL_PLineNo);
+                helper.Insert(record);
+            }
+            else
+            {
+                //鏇存柊鏁版嵁
+                //if (old != null)
+                //{
+                //    old.TransportStatus = record.TransportStatus;
+                //    old.HasBeenReceived = record.HasBeenReceived;
+                //    var cols = new List<string>() { "TransportStatus", "HasBeenReceived" };
+                //    if (record.TransportStatus == 2)
+                //    {
+                //        cols.Add("ExecutionTime");
+                //        old.ExecutionTime = record.ExecutionTime;
+                //    }
+                //    if (record.TransportStatus == 4 || record.TransportStatus == 12 || record.TransportStatus == 13 || record.TransportStatus == 6)
+                //    {
+                //        cols.Add("CompleteTime");
+                //        old.CompleteTime = record.CompleteTime;
+                //    }
+                //    if (!string.IsNullOrEmpty(record.AgvNo))
+                //    {
+                //        cols.Add("AgvNo");
+                //        old.AgvNo = record.AgvNo;
+                //    }
+                //    helper.Update(old, cols.ToArray());
+                //}
+            }
+        }
+
+        /// <summary>
+        /// 宸ュ崟琛�+        /// 姊呭潽鐜板満宸ュ崟琛ㄥ悕锛�dbo.TN_0001"
+        /// 妯℃嫙娴嬭瘯宸ュ崟琛ㄥ悕锛�dbo.TN_0004"
+        /// </summary>
+        [SugarTable("dbo.TN_0004")]
+        public class WorkOrder
+        {
+            public string S_ID { get; set; } = "";
+            public string S_STATE { get; set; } = "";
+            public string S_CREATOR_ID { get; set; } = "";
+            public string S_CREATOR_NAME { get; set; } = "";
+            public DateTime T_CREATE { get; set; } = DateTime.MinValue;
+            public string S_DEPART_ID { get; set; } = "";
+            public string S_DEPART_NAME { get; set; } = "";
+            public string S_MODIFIER_ID { get; set; } = "";
+            public string S_MODIFIER_NAME { get; set; } = "";
+            public DateTime T_MODIFY { get; set; } = DateTime.MinValue;
+            public int N_CREATEMETHOD { get; set; } = 0;
+            public string G_SOURCE_OBJ { get; set; } = "";
+            /// <summary>
+            /// 宸ュ崟鍙�+            /// </summary>
+            public string SQL_WorkNo { get; set; } = "";
+            /// <summary>
+            /// 浜х嚎鍙�+            /// </summary>
+            public string SQL_PLineNo { get; set; } = "";
+            /// <summary>
+            /// 鍗充骇鍗崇敤
+            /// </summary>
+            public string SQL_UsingNo { get; set; } = "";
+            /// <summary>
+            /// 宸ュ崟绫诲瀷
+            /// </summary>
+            public string SQL_ORDER_TYPE { get; set; } = "";
+            /// <summary>
+            /// 宸ュ崟鐘舵�
+            /// </summary>
+            public string SQL_State { get; set; } = "";
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            public string SQL_BatchNo { get; set; } = "";
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            public string SQL_ItemCode { get; set; } = "";
+            /// <summary>
+            /// 鐗╂枡鍚嶇О
+            /// </summary>
+            public string SQL_ItemName { get; set; } = "";
+            /// <summary>
+            /// 鎬绘暟
+            /// </summary>
+            public string SQL_Total { get; set; } = "";
+            /// <summary>
+            /// 搴撳尯鎴栬�鍒楁垨鑰呮帓缂栧彿
+            /// </summary>
+            public string SQL_Area { get; set; } = "";
+            /// <summary>
+            /// 鍥哄畾姣忔壒杩愯緭鏁伴噺
+            /// </summary>
+            public string SQL_PCNumber { get; set; } = "";
+            /// <summary>
+            /// 璁℃暟锛堝凡鎵ц鏁伴噺锛�+            /// </summary>
+            public string SQL_Current { get; set; } = "";
+            /// <summary>
+            /// 褰撳墠宸ュ崟鎵ц鏃堕棿
+            /// </summary>
+            public string SQL_Modify { get; set; } = "";
+            /// <summary>
+            /// 褰撳墠宸ュ崟缁撴潫鏃堕棿
+            /// </summary>
+            public string SQL_PLAN_END { get; set; } = "";
+            /// <summary>
+            /// 杩炴帴浜х嚎鍙�+            /// </summary>
+            public string SQL_LinkLineNO { get; set; } = "";
+            /// <summary>
+            /// 鏄惁鏍堟澘
+            /// </summary>
+            public string SQL_PaperBox { get; set; } = "";
+        }
+        /// <summary>
+        /// SQL-AMS浠诲姟涓昏〃
+        /// </summary>
+        [SugarTable("dbo.tn_am_task_mst")]
+        public class SQL_TN_I_TASK_MST
+        {
+            public string CN_S_BATCH_NO { get; set; }
+            public int CN_S_ORDER_NO { get; set; }
+            public string CN_S_TASK_NO { get; set; }
+            public string CN_S_SOURCE_SYS { get; set; }
+            public string CN_S_SOURCE_NO { get; set; }
+            public string CN_S_PROCESS_CODE { get; set; }
+            public string CN_S_TASK_TYPE { get; set; }
+            public string CN_S_START_AREA { get; set; }
+            public string CN_S_START_AREA_NAME { get; set; }
+            public string CN_S_START_BIT { get; set; }
+            public int CN_N_START_AGVBIT { get; set; }
+            public string CN_S_END_AREA { get; set; }
+            public string CN_S_END_AREA_NAME { get; set; }
+            public string CN_S_END_BIT { get; set; }
+            public int CN_N_END_AGVBIT { get; set; }
+            public string CN_S_STATUS { get; set; }
+            public string CN_S_BEF_STATUS { get; set; }
+            public string CN_S_BEFORE_NO { get; set; }
+            public string CN_S_AFTER_NO { get; set; }
+            public string CN_T_START_WORKING { get; set; }
+            public string CN_T_END_WORKING { get; set; }
+            public int CN_N_PRIORITY { get; set; }
+            public int CN_N_CUR_STEP { get; set; }
+            public string CN_S_CREATOR { get; set; }
+            public string CN_S_CREATOR_NAME { get; set; }
+            public string CN_T_CREATE { get; set; }
+            public string CN_S_MENDER { get; set; }
+            public string CN_S_MODIFY_NAME { get; set; }
+            public string CN_T_MODIFY { get; set; }
+            public string CN_S_TASK_MODEL { get; set; }
+            public string CN_S_EXT1 { get; set; }
+            public string CN_S_EXT2 { get; set; }
+            public string CN_S_EXT3 { get; set; }
+            public string CN_N_AGV_NO { get; set; }
+            public string CN_S_TRANSPORT_INFO { get; set; }
+        }
+
+        /// <summary>
+        /// SQL-MOBOX浠诲姟涓昏〃
+        /// </summary>
+        [SugarTable("dbo.TN_0001")]
+        public class Mobox_MST_TASK
+        {
+            public string S_ID { get; set; }//g
+            public string S_STATE { get; set; }
+            public string S_CREATOR_ID { get; set; }
+            public string S_CREATOR_NAME { get; set; }
+            public DateTime T_CREATE { get; set; }
+            public string S_DEPART_ID { get; set; }//g
+            public string S_DEPART_NAME { get; set; }
+            public string S_MODIFIER_ID { get; set; }
+            public string S_MODIFIER_NAME { get; set; }
+            public DateTime T_MODIFY { get; set; }
+            public int N_CREATEMETHOD { get; set; }
+            public string G_SOURCE_OBJ { get; set; }//g
+
+
+            public string CN_S_BATCH_NO { get; set; }
+            public string CN_S_TASK_NO { get; set; }
+            public string CN_S_SOURCE_NO { get; set; }
+            public string CN_S_START_BIT { get; set; }
+            public string CN_S_END_BIT { get; set; }
+            public string CN_S_STATUS { get; set; }
+            public int CN_N_PRIORITY { get; set; }
+            public string CN_T_MODIFY { get; set; }
+        }
+
+
+        public class BaseModel
+        {
+            [SugarColumn(IsPrimaryKey = true)]
+            public string S_ID { get; set; } = Guid.NewGuid().ToString("D");
+            public string S_CREATOR_ID { get; set; } = "sa";
+            public string S_CREATOR_NAME { get; set; } = "瓒呯骇鐢ㄦ埛";
+            public DateTime T_CREATE { get; set; } = DateTime.Now;
+            public DateTime T_MODIFY { get; set; } = DateTime.Now;
+        }
+
+        /// <summary>
+        /// 璁惧鎶ヨ淇℃伅琛�+        /// </summary>
+        [SugarTable("dbo.TN_0081")]
+        public class CallWcsWarningTable : BaseModel
+        {
+            /// <summary>
+            /// 璇锋眰缂栧彿锛屾瘡涓姹傞兘瑕佷竴涓敮涓�紪鍙凤紝 鍚屼竴涓姹傞噸澶嶆彁浜わ紝 浣跨敤鍚屼竴缂栧彿銆傜敱涓婂眰绯荤粺鎻愪緵
+            /// </summary>
+            public string requestPK { get; set; }
+            /// <summary>
+            /// 鏁呴殰浠g爜
+            /// </summary>
+            public string errorNO { get; set; }
+            /// <summary>
+            /// 鏁呴殰鎻忚堪
+            /// </summary>
+            public string errorDes { get; set; }
+            /// <summary>
+            /// 浠诲姟缂栫爜
+            /// </summary>
+            public string taskCode { get; set; }
+            /// <summary>
+            /// 璁惧缂栫爜
+            /// </summary>
+            public string dvcNo { get; set; }
+            /// <summary>
+            /// 鎿嶄綔浜�+            /// </summary>
+            public string @operator { get; set; }
+            /// <summary>
+            /// 鎿嶄綔鏃堕棿
+            /// </summary>
+            public DateTime operationTime { get; set; }
+        }
+
+        /// <summary>
+        /// 娴峰悍鎶ヨ淇℃伅琛�+        /// </summary>
+        [SugarTable("dbo.TN_0082")]
+        public class WarnCallbackTable : BaseModel
+        {
+            /// <summary>
+            /// 璇锋眰缂栧彿锛屾瘡涓姹傞兘瑕佷竴涓敮涓�紪鍙凤紝鍚屼竴涓姹傞噸澶嶆彁浜わ紝浣跨敤鍚屼竴缂栧彿銆�+            /// </summary>
+            public string reqCode { get; set; }
+            /// <summary>
+            /// 璇锋眰鏃堕棿鎴筹紝鏍煎紡: 鈥測yyy-MM-dd HH:mm:ss鈥濄�
+            /// </summary>
+            public string reqTime { get; set; }
+            /// <summary>
+            /// 瀹㈡埛绔紪鍙凤紝濡�PDA锛孒CWMS 绛夈�
+            /// </summary>
+            public string clientCode { get; set; }
+            /// <summary>
+            /// 浠ょ墝鍙�鐢辫皟搴︾郴缁熼鍙戙�
+            /// </summary>
+            public string tokenCode { get; set; }
+            /// <summary>
+            /// 杞﹀彿
+            /// </summary>
+            public string robotCode { get; set; }
+            /// <summary>
+            /// 鍛婅寮�鏃堕棿
+            /// </summary>
+            public string beginTime { get; set; }
+            /// <summary>
+            /// 鍛婅鍐呭
+            /// </summary>
+            public string warnContent { get; set; }
+            /// <summary>
+            /// 浠诲姟鍙�+            /// </summary>
+            public string taskCode { get; set; }
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/OITcpHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/OITcpHelper.cs
new file mode 100644
index 0000000..7917ee4
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/OITcpHelper.cs
@@ -0,0 +1,494 @@
+锘縰sing Hanhe.iWCS.Common;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class OITcpHelper
+    {
+        private static string url = Settings.OITcpSeverUrl;
+        private static string token = "";
+        private static WebApiHelper apiHelper = new WebApiHelper();
+        public static string readip = "";
+        public static string writeip = "";
+        public static string writeAllIP = "";
+
+
+        #region 1.	涓浆璇锋眰鎿嶄綔
+        /// <summary>
+        /// 1.1.	璇锋眰 json鍐呭
+        /// </summary>
+        public static void JsonTransit() {
+            var req = JsonConvert.SerializeObject(new JsonTransitData());
+            var feedback = apiHelper.WebPost($"{url}/api/transit/json?access_token={token}", req);
+            if (feedback != "") {
+                var result = JsonConvert.DeserializeObject<JsonTransitResult>(feedback);
+            }
+        }
+        /// <summary>
+        /// 1.2.	璇锋眰 ascii鍐呭
+        /// </summary>
+        public static StrTransitResult AsciiTransit(StrTransitData model) {
+            StrTransitResult result = null;
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/transit/ascii?access_token={token}", req);
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<StrTransitResult>(feedback);
+            }
+            return result;
+        }
+        /// <summary>
+        /// 1.3.	璇锋眰 hex鍐呭
+        /// </summary>
+        public static void HexTransit() {
+            var req = JsonConvert.SerializeObject(new StrTransitData());
+            var feedback = apiHelper.WebPost($"{url}/api/transit/hex?access_token={token}", req);
+            if (feedback != "") {
+                var result = JsonConvert.DeserializeObject<StrTransitResult>(feedback);
+            }
+        }
+        public class BaseTransitData
+        {
+            public string host { get; set; }
+            public int port { get; set; }
+            public int timeout { get; set; }
+
+        }
+        public class JsonTransitData : BaseTransitData
+        {
+            public object data { get; set; }
+        }
+        public class JsonTransitResult : BaseResponseModel
+        {
+            public object result { get; set; }
+        }
+        public class StrTransitData : BaseTransitData
+        {
+            public string data { get; set; }
+        }
+        public class StrTransitResult : BaseResponseModel
+        {
+            public string result { get; set; }
+        }
+        #endregion
+
+        #region 2.	Modbus澶勭悊鎿嶄綔
+        #region 2.1.	璇诲彇杈撳嚭绾垮湀鐘舵� 01 鍔熻兘
+        /// <summary>
+        /// 2.1.	璇诲彇杈撳嚭绾垮湀鐘舵� 01 鍔熻兘
+        /// </summary>
+        public static RelayReadOutResult RelayReadOutPut(RelayReadOutPutModel model) {
+            RelayReadOutResult result = null;
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/relay/readoutput?access_token={token}", req);
+            Console.WriteLine($"璇诲彇杈撳嚭绾垮湀鐘舵� modbus/relay/readoutput req={req} res={feedback}");
+            CMMLog.Info($"璇诲彇杈撳嚭绾垮湀鐘舵� modbus/relay/readoutput req={req} res={feedback}");
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<RelayReadOutResult>(feedback);
+            }
+            return result;
+        }
+        public class RelayReadOutPutModel : BaseRequestModel
+        {
+            public int bitNum { get; set; }
+            //public object tcpModel { get; set; }
+            //public int msgNo { get; set; }
+        }
+        public class RelayReadOutResult : BaseResponseModel
+        {
+            public int[] result { get; set; }
+        }
+        #endregion
+
+        #region 2.2.	璇诲彇杈撳叆绂绘暎閲�02 鍔熻兘
+        /// <summary>
+        /// 2.2.	璇诲彇杈撳叆绂绘暎閲�02 鍔熻兘
+        /// </summary>
+        public static void RelayReadInPut(BaseRequestModel model) {
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/relay/readinput?access_token={token}", req);
+            if (feedback != "") {
+                var result = JsonConvert.DeserializeObject<RelayReadInPutResult>(feedback);
+            }
+        }
+        public class RelayReadInPutResult : BaseRequestModel
+        {
+            public int result { get; set; }
+        }
+        #endregion
+
+        #region 2.3.	璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�03 鍔熻兘
+        /// <summary>
+        /// 2.3.	璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�03 鍔熻兘
+        /// </summary>
+        public static RegisterReadOutPutResult RegisterReadOutPut(RegisterReadOutPutModel model) {
+            RegisterReadOutPutResult result = null;
+            //Settings.PlcInfo pmInfo = Settings.GetPlcInfo().Where(a => a.ip == model.host).FirstOrDefault();
+            //model.port = pmInfo.port;
+            var req = JsonConvert.SerializeObject(model);
+            #region   鎷︽埅鐩稿悓IP寤惰繜涓�鍙戦�
+            if (model.host == readip)
+            {
+                DateTime dateTime = DateTime.Now;
+                int z = 1;
+                while (z == 1)
+                {
+                    if (DateTime.Now.Subtract(dateTime).TotalSeconds > 1)
+                    {
+                        z = 2;
+                        readip = model.host;
+                    }
+                }
+            }
+            else
+            {
+                readip = model.host;
+            }
+            #endregion
+            CMMLog.Debug($"璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�3鍔熻兘:IP:{readip},URL锛歿url}/api/modbus/register/readoutput?access_token={token},鍐欏叆鏁版嵁锛歿req}");
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/register/readoutput?access_token={token}", req);
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<RegisterReadOutPutResult>(feedback);
+            }
+            else
+            {
+                CMMLog.Error($"璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�3鍔熻兘锛欼P:{readip},杩斿洖鍊糵eedback涓虹┖锛佽繑鍥炲�锛歿feedback}");
+            }
+            try
+            {
+                if (result != null)
+                {
+                    if (result.errCode == 0)
+                    {
+                        var packNo = Settings.GetPlcInfo().Where(a => a.ip == model.host && a.deviceType == "1").FirstOrDefault();
+                        if (packNo != null)
+                        {
+                            CMMLog.Debug($"璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�03 鍔熻兘MODBUS鍙傛暟:IP:{readip},鍖呰鏈哄彿锛歿packNo.location},閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},杩斿洖鍊納result.result[0]}");
+                            //Console.WriteLine($"璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�03 鍔熻兘MODBUS鍙傛暟:IP:{readip},鍖呰鏈哄彿锛歿packNo.location},閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},杩斿洖鍊納result.result[0]}");
+                        }
+                    }
+                    else if (result.errCode == 1025)
+                    {
+                        var packNo = Settings.GetPlcInfo().Where(a => a.ip == model.host && a.deviceType == "1").FirstOrDefault();
+                        if (packNo != null)
+                        {
+                            CMMLog.Debug($"銆�025寮傚父銆戣鍙栬緭鍑哄瘎瀛樺櫒鏁版嵁 03 鍔熻兘MODBUS鍙傛暟:IP:{readip},鍖呰鏈哄彿锛歿packNo.location}锛岄�閬撳湴鍧�负{model.addr},绔彛涓簕model.port},鍙戦�鍊納req}");
+                            //Console.WriteLine($"銆�025寮傚父銆戣鍙栬緭鍑哄瘎瀛樺櫒鏁版嵁 03 鍔熻兘MODBUS鍙傛暟:閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req}");
+                        }
+                    }
+                }
+                else Console.WriteLine($"璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�03 鍔熻兘MODBUS鍙傛暟涓虹┖:IP:{readip},閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req}");
+                #region   閲嶅彂鏈哄埗
+                //else if(result.errCode == 1125)
+                //{
+                //    int err = 0;
+                //    while (err == 0)
+                //    {
+                //        var req1 = JsonConvert.SerializeObject(model);
+                //        DateTime dateTime1 = DateTime.Now;
+                //        if (DateTime.Now.Subtract(dateTime1).TotalSeconds > 1)
+                //        {
+                //            var feedbackReset = apiHelper.WebPost($"{url}/api/modbus/register/readoutput?access_token={token}", req1);
+                //            CMMLog.Debug($"閲嶆柊璇诲彇杈撳嚭瀵勫瓨鍣�3鍔熻兘杈撳叆鏁版嵁:req:{req1},ip:{readip}");
+                //            CMMLog.Debug($"閲嶆柊璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�3鍔熻兘璇锋眰URL:readUrl:{url}/api/modbus/register/readoutput?access_token={token}");
+                //            if (feedbackReset != "")
+                //            {
+                //                result = JsonConvert.DeserializeObject<RegisterReadOutPutResult>(feedbackReset);
+                //                if(result.errCode == 0)
+                //                {
+                //                    err = 1;
+                //                    CMMLog.Debug($"璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�03 鍔熻兘MODBUS鍙傛暟:閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req},杩斿洖鍊納result.result[0]}");
+                //                    Console.WriteLine($"璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�03 鍔熻兘MODBUS鍙傛暟:閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req},杩斿洖鍊納result.result[0]}");
+                //                    readip = model.host;
+                //                }
+                //            }
+                //        }
+                //    }
+                //}
+                #endregion
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error($"璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�3鍔熻兘鎶涘嚭寮傚父,IP:{readip},閫氶亾涓�{model.addr},璇诲彇鏁伴噺涓猴細{model.dataNum},寮傚父淇℃伅锛歿ex.Message}");
+            }
+            //CMMLog.Debug($"璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�3鍔熻兘杩斿洖缁撴灉:{feedback}");
+            //Console.WriteLine($"璇诲彇杈撳嚭瀵勫瓨鍣ㄦ暟鎹�3鍔熻兘杩斿洖缁撴灉:{feedback}");
+            
+            return result;
+        }
+        public class RegisterReadOutPutModel : BaseRequestModel
+        {
+
+            public int dataNum { get; set; }
+            //public int msgNo { get; set; }
+        }
+        public class RegisterReadOutPutResult : BaseResponseModel
+        {
+            public int[] result { get; set; }
+        }
+        #endregion
+
+        #region  2.4.	璇诲彇杈撳叆瀵勫瓨鍣ㄦ暟鎹�04 鍔熻兘
+        /// <summary>
+        /// 2.4.	璇诲彇杈撳叆瀵勫瓨鍣ㄦ暟鎹�04 鍔熻兘
+        /// </summary>
+        public static RegisterReadOutPutResult RegisterReadInPut(RegisterReadOutPutModel model) {
+            RegisterReadOutPutResult result = null;
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/register/readinput?access_token={token}", req);
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<RegisterReadOutPutResult>(feedback);
+            }
+            //CMMLog.Debug($"璇诲彇杈撳叆瀵勫瓨鍣ㄦ暟鎹�04 鍔熻兘MODBUS鍙傛暟杩斿洖鍊间负锛歿result},鍙戦�鍊納req}");
+            //Console.WriteLine($"璇诲彇杈撳叆瀵勫瓨鍣ㄦ暟鎹�04 鍔熻兘MODBUS鍙傛暟杩斿洖鍊间负锛歿result},鍙戦�鍊納req}");
+            return result;
+        }
+       
+        #endregion
+
+        #region 2.5.	鍐欏崟涓緭鍑虹嚎鍦�05 鍔熻兘
+        /// <summary>
+        /// 2.5.	鍐欏崟涓緭鍑虹嚎鍦�05 鍔熻兘
+        /// </summary>
+        public static BaseResponseModel RelayWriteOutPut(RelayWriteOutPutModel model) {
+            BaseResponseModel result = null;
+            var req = JsonConvert.SerializeObject(model);
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/relay/writeoutput?access_token={token}", req);
+            Console.WriteLine($"鍐欏崟涓緭鍑虹嚎鍦�modbus/relay/writeoutput req={req} res={feedback}");
+            CMMLog.Info($"鍐欏崟涓緭鍑虹嚎鍦�modbus/relay/writeoutput req={req} res={feedback}");
+            if (feedback != "") {
+                result = JsonConvert.DeserializeObject<BaseResponseModel>(feedback);
+            }
+            return result;
+        }
+        public class RelayWriteOutPutModel : BaseRequestModel
+        {
+            public bool status { get; set; }
+        }
+        #endregion
+
+        #region 2.6.	鍐欏崟涓緭鍑哄瘎瀛樺櫒 06 鍔熻兘
+        public static BaseResponseModel RegisterWriteOutPut(RegisterWriteOutPutModel model) {
+            BaseResponseModel result = null;
+            //Settings.PlcInfo pmInfo = Settings.GetPlcInfo().Where(a => a.ip == model.host).FirstOrDefault();
+            //model.port = pmInfo.port;
+            var req = JsonConvert.SerializeObject(model);
+            #region   鎷︽埅鐩稿悓IP寤惰繜涓�鍙戦�
+            if (model.host == readip)
+            {
+                DateTime dateTime = DateTime.Now;
+                int z = 1;
+                while (z == 1)
+                {
+                    if (DateTime.Now.Subtract(dateTime).TotalSeconds > 1)
+                    {
+                        z = 2;
+                        readip = model.host;
+                    }
+                }
+            }
+            else
+            {
+                readip = model.host;
+            }
+            #endregion
+            CMMLog.Debug($"鍐欏崟涓緭鍑哄瘎瀛樺櫒06鍔熻兘鍐欏叆鍊硷細IP:{readip},URL锛歿url}/api/modbus/register/writeoutput?access_token={token},鍐欏叆鏁版嵁锛歿req}");
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/register/writeoutput?access_token={token}", req);
+            if (feedback != "") result = JsonConvert.DeserializeObject<BaseResponseModel>(feedback);
+            else CMMLog.Error($"鍐欏崟涓緭鍑哄瘎瀛樺櫒06鍔熻兘鍐欏叆鍊硷細寮傚父锛欼P:{readip},杩斿洖鍊糵eedback涓虹┖锛佽繑鍥炲�锛歿feedback}");
+            try
+            {
+                if (result != null && result.errCode == 0)
+                {
+                    CMMLog.Debug($"鍐欏崟涓緭鍑哄瘎瀛樺櫒 06 鍔熻兘MODBUS鍙傛暟锛欼P:{readip},閫氶亾鍦板潃涓簕model.addr},绔彛涓猴細{model.port},閿欒鐮侊細{result.errCode},杩斿洖淇℃伅锛歿result.errMsg}");
+                    //Console.WriteLine($"鍐欏崟涓緭鍑哄瘎瀛樺櫒 06 鍔熻兘MODBUS鍙傛暟锛氶�閬撳湴鍧�负{model.addr},绔彛涓猴細{model.port},閿欒鐮侊細{result.errCode},杩斿洖淇℃伅锛歿result.errMsg}");
+                }
+                else if (result.errCode == 1025)
+                {
+                    var packNo = Settings.GetPlcInfo().Where(a => a.ip == model.host && a.deviceType == "1").FirstOrDefault();
+                    if (packNo != null)
+                    {
+                        CMMLog.Error($"銆�025寮傚父銆戣鍙栬緭鍑哄瘎瀛樺櫒鏁版嵁 03 鍔熻兘MODBUS鍙傛暟:IP:{readip},褰撳墠鍖呰鏈哄彿锛歿packNo.location},閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req}");
+                        //Console.WriteLine($"銆�025寮傚父銆戣鍙栬緭鍑哄瘎瀛樺櫒鏁版嵁 03 鍔熻兘MODBUS鍙傛暟:褰撳墠鍖呰鏈哄彿锛歿packNo.location}閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req}");
+                    }
+                }
+                else if (result.errCode == 1125 || result.errCode != 0)
+                {
+                    DateTime dateTime = DateTime.Now;
+                    int err = 3;
+                    int num = 0;
+                    while (err > 0)
+                    {
+                        if(DateTime.Now.Subtract(dateTime).TotalMilliseconds >= 300)
+                        {
+                            var feedbackReset = apiHelper.WebPost($"{url}/api/modbus/register/writeoutput?access_token={token}", req);
+                            CMMLog.Debug($"銆�125寮傚父銆戦噸鏂拌鍙栧啓鍏ュ瘎瀛樺櫒鏁版嵁06-绗瑊num + 1}娆�IP:{readip},鍐欏叆鏁版嵁锛歿req}锛孶rl:{url}/api/modbus/register/readoutput?access_token={token}");
+                            if (feedbackReset != "")
+                            {
+                                result = JsonConvert.DeserializeObject<RegisterReadOutPutResult>(feedbackReset);
+                                if (result.errCode == 0)
+                                {
+                                    err = err - 1;
+                                    num = num + 1;
+                                    CMMLog.Debug($"銆�125寮傚父銆戝啓鍗曚釜杈撳嚭瀵勫瓨鍣�06 鍔熻兘MODBUS鍙傛暟-绗瑊num + 1}娆�IP:{readip},閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req},閿欒鐮侊細{result.errCode},杩斿洖淇℃伅锛歿result.errMsg}");
+                                    readip = model.host;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error($"鍐欏崟涓緭鍑哄瘎瀛樺櫒06鍔熻兘鍔熻兘鎶涘嚭寮傚父:IP:{readip},閫氶亾涓�{model.addr},鍐欏叆鍊间负锛歿model.data},寮傚父淇℃伅锛歿ex.Message}");
+            }
+            return result;
+        }
+        public class RegisterWriteOutPutModel : BaseRequestModel
+        {
+            public int data { get; set; }
+        }
+        #endregion
+
+        #region 2.7.	鍐欏涓緭鍑虹嚎鍦�15 鍔熻兘
+        public static void RelayWriteOutPutMulti() {
+            var req = JsonConvert.SerializeObject(new RelayWriteOutPutModelMulti());
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/relay/writeoutputmulti?access_token={token}", req);
+            if (feedback != "") {
+                var result = JsonConvert.DeserializeObject<BaseResponseModel>(feedback);
+            }
+        }
+        public class RelayWriteOutPutModelMulti : BaseRequestModel
+        {
+            public int bitNum { get; set; }
+            public int[] data { get; set; }
+        }
+        #endregion
+
+        #region 2.8.	鍐欏涓緭鍑哄瘎瀛樺櫒 16 鍔熻兘
+        public static void RegisterWriteOutPutMulti() {
+            var req = JsonConvert.SerializeObject(new RegisterWriteOutPutModelMulti());
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/register/writeoutputmulti?access_token={token}", req);
+            if (feedback != "") {
+                var result = JsonConvert.DeserializeObject<BaseResponseModel>(feedback);
+            }
+        }
+        public static BaseResponseModel RegisterWriteOutPutMulti(RegisterWriteOutPutModelMulti model)
+        {
+            BaseResponseModel result = null;
+            //Settings.PlcInfo pmInfo = Settings.GetPlcInfo().Where(a => a.ip == model.host).FirstOrDefault();
+            //model.port = pmInfo.port;
+            var req = JsonConvert.SerializeObject(model);
+            #region   鎷︽埅鐩稿悓IP寤惰繜涓�鍙戦�
+            if (model.host == readip)
+            {
+                DateTime dateTime = DateTime.Now;
+                int z = 1;
+                while (z == 1)
+                {
+                    if (DateTime.Now.Subtract(dateTime).TotalSeconds > 1)
+                    {
+                        z = 2;
+                        readip = model.host;
+                    }
+                }
+                readip = model.host;
+            }
+            else
+            {
+                readip = model.host;
+            }
+            #endregion
+            CMMLog.Debug($"鍐欏涓緭鍑哄瘎瀛樺櫒16鍔熻兘锛欼P:{readip},URL:{url}/api/modbus/register/writeoutputmulti?access_token={token},鍐欏叆鏁版嵁锛歿req}");
+            var feedback = apiHelper.WebPost($"{url}/api/modbus/register/writeoutputmulti?access_token={token}", req);
+            if (feedback != "")
+            {
+                result = JsonConvert.DeserializeObject<BaseResponseModel>(feedback);
+            }
+            else CMMLog.Error($"鍐欏涓緭鍑哄瘎瀛樺櫒16鍔熻兘锛氬紓甯革細IP:{readip},杩斿洖鍊糵eedback涓虹┖锛�);
+
+            try
+            {
+                if (result != null && result.errCode == 0)
+                {
+                    CMMLog.Debug($"鍐欏涓緭鍑哄瘎瀛樺櫒16鍔熻兘锛欼P:{readip},閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req},閿欒鐮侊細{result.errCode},閿欒淇℃伅锛歿result.errMsg}");
+                    //Console.WriteLine($"鍐欏涓緭鍑哄瘎瀛樺櫒 16 鍔熻兘MODBUS鍙傛暟,閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req},杩斿洖鍊納result.errCode},{result.errMsg}");
+                }
+                else if (result.errCode == 1025)
+                {
+                    var packNo = Settings.GetPlcInfo().Where(a => a.ip == model.host && a.deviceType == "1").FirstOrDefault();
+                    if (packNo != null)
+                    {
+                        CMMLog.Error($"銆�025寮傚父銆戝啓澶氫釜杈撳嚭瀵勫瓨鍣�6鍔熻兘:IP:{readip},鍖呰鏈哄彿锛歿packNo.location}锛岄�閬撳湴鍧�负{model.addr},绔彛涓簕model.port},鍙戦�鍊納req}");
+                        //Console.WriteLine($"銆�025寮傚父銆戣鍙栬緭鍑哄瘎瀛樺櫒鏁版嵁 03 鍔熻兘MODBUS鍙傛暟:閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req}");
+                    }
+                }
+                #region   閲嶅彂鏈哄埗
+                else if (result.errCode == 1125 || result.errCode != 0)
+                {
+                    int err = 3;
+                    int num = 0;
+                    while (err > 0)
+                    {
+                        var req1 = JsonConvert.SerializeObject(model);
+                        var feedbackReset = apiHelper.WebPost($"{url}/api/modbus/register/writeoutputmulti?access_token={token}", req);
+                        CMMLog.Debug($"閲嶆柊璇诲彇鍐欏叆澶氫釜瀵勫瓨鍣�6鍔熻兘杈撳叆鏁版嵁-绗瑊num + 1}娆�req:{req1},ip:{readip}");
+                        CMMLog.Debug($"閲嶆柊璇诲彇鍐欏叆澶氫釜瀵勫瓨鍣ㄦ暟鎹�6鍔熻兘璇锋眰URL-绗瑊num + 1}娆�readUrl:{url}/api/modbus/register/readoutput?access_token={token}");
+                        if (feedbackReset != "")
+                        {
+                            result = JsonConvert.DeserializeObject<RegisterReadOutPutResult>(feedbackReset);
+                            if (result.errCode == 0)
+                            {
+                                err = err - 1;
+                                num = num + 1;
+                                CMMLog.Debug($"鍐欏涓緭鍑哄瘎瀛樺櫒 16 鍔熻兘MODBUS鍙傛暟-绗瑊num + 1}娆�閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req},杩斿洖鍊納result.errCode},{result.errMsg}");
+                                Console.WriteLine($"鍐欏涓緭鍑哄瘎瀛樺櫒 16 鍔熻兘MODBUS鍙傛暟-绗瑊num + 1}娆�閫氶亾鍦板潃涓簕model.addr},绔彛涓簕model.port},鍙戦�鍊納req},杩斿洖鍊納result.errCode},{result.errMsg}");
+                                readip = model.host;
+                            }
+                        }
+                    }
+                }
+                #endregion
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error($"鍐欏涓緭鍑哄瘎瀛樺櫒16鍔熻兘:寮傚父锛欼P:{readip},閫氶亾涓�{model.addr},鍐欏叆鍊间负锛歿model.data}锛屽紓甯镐俊鎭細{ex.Message}");
+            }
+            //CMMLog.Debug($"鍐欏涓緭鍑哄瘎瀛樺櫒16鍔熻兘:{feedback}");
+            //Console.WriteLine($"鍐欏涓緭鍑哄瘎瀛樺櫒16鍔熻兘:{feedback}");
+            return result;
+        }
+        public class RegisterWriteOutPutModelMulti : BaseRequestModel
+        {
+            public int[] data { get; set; }
+        }
+        #endregion
+
+        #endregion
+
+
+        public class ReadInPutResult : BaseResponseModel
+        {
+            public int result { get; set; }
+        }
+        public class BaseResponseModel
+        {
+            public int errCode { get; set; }
+            public string errMsg { get; set; }
+        }
+        public class BaseRequestModel
+        {
+            public string host { get; set; }
+            public int port { get; set; } = 502;
+            public int timeout { get; set; } = 1000;
+            public int deviceNo { get; set; } = 1;
+            public int addr { get; set; }
+            public object tcpModel { get; set; } = new { msgNo = 1 };
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/PLCControl.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/PLCControl.cs
new file mode 100644
index 0000000..0b813b0
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/PLCControl.cs
@@ -0,0 +1,4092 @@
+锘縰sing Hanhe.iWCS.Business;
+using Hanhe.iWCS.Common;
+using Hanhe.iWCS.Interface;
+using Hanhe.iWCS.TaizhouGEMTwoTCP;
+using Hanhe.iWCS.Model;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Linq;
+using MongoDB.Bson;
+using Hanhe.iWCS.MData;
+using Newtonsoft.Json;
+using MongoDB.Driver.Builders;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.MESHelper;
+using MongoDB.Driver;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ProcessHelper;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ApiHelper;
+using System.Threading;
+using Hanhe.iWCS.Model.AMS;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ERPService;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.AMSHelper;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ProtocolAnalysis;
+using log4net.Appender;
+using System.Net.Configuration;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class PLCControl : IPLCControl
+    {
+        private EquipmentCommandEQBLL commandBLL = new EquipmentCommandEQBLL();
+
+        /// <summary>
+        /// PLC 鏁版嵁鍙戦�
+        /// </summary>
+        /// <param name="command"></param>
+        /// <returns></returns>
+        public void SendMessage(EquipmentCommandEQ command)
+        {
+            bool sended = SessionInstance.Instance.PLCSend(command.EquipmentIP, int.Parse(command.EquipmentPort), command.CommandText);
+            if (sended)
+            {
+                //CMMLog.Info("璁惧鎸囦护鍙戦�鎴愬姛;EquipmentCode=" + command.EquipmentCode + "-鎸囦护=" + command.CommandText);
+                commandBLL.UpdateCommandEQStatus(command._id, Constants.COMMANDEQ_STATUS_SENDED, command.SendCount);
+            }
+            else
+            {
+                //CMMLog.Info("璁惧鎸囦护鍙戦�澶辫触;EquipmentCode=" + command.EquipmentCode + "-鎸囦护=" + command.CommandText);
+                commandBLL.UpdateCommandEQStatus(command._id, Constants.COMMANDEQ_STATUS_SEND_ERRORS, command.SendCount);
+            }
+        }
+
+        /// <summary>
+        /// 澶勭悊鍏夌數淇℃伅
+        /// </summary>
+        /// <param name="data"></param>
+        public static void Analysis(string data) {
+            //3f 00 01 00 00 00 24 24
+        }
+
+        #region   绾�妤艰澶囦换鍔�+
+        #region   3妤煎寘瑁呮満鍙栨枡鑷冲绉板钩鍙版祦绋嬧�鈥旀棤闇�洖鎶MS浠诲姟鐘舵�鈥斺�3妤煎寘瑁呭彇鏂欌�鈥斿凡瀹屾垚锛堝緟娴嬭瘯锛屾椂闂存埑澶勭悊锛�+
+        #region   鏀跺埌鍖呰鏈轰笅鏂欎俊鍙�锛屽紑濮嬪垽鏂绉板钩鍙版槸鍚︽弧瓒虫潯浠讹紝閫夋嫨鎬т笅鍙戜换鍔�+
+        /// <summary>
+        /// 3妤煎寘瑁呮満鍙栨枡鑷冲绉板钩鍙版祦绋嬧�鈥斾换鍔″紑濮嬪墠锛屽垽鏂寘瑁呮満鏈夋病鏈変笅绾夸俊鍙凤紝骞跺垽鏂綋鍓嶅绉板钩鍙版槸鍚G浠ュ強鏈夋病鏈変换鍔″湪杩涜涓�+        /// </summary>
+        /// <param name="a"></param>
+        internal static void CheckPackingMachine(Settings.PlcInfo pmInfo)
+        {
+            //var count = MongoDBSingleton.Instance.FindOne<>//occupy
+            var count = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.EQ("occupy", "1"), "MachineInfo");
+
+            //妫�煡鍖呰鏈洪�閬�鏄惁鏈変笅鏂欎俊鍙凤紝濡傛灉鏈夌敓鎴愪笅鏂欎换鍔°�绾跨▼寰幆璇诲彇锛屾棤闇�缃惊鐜�鈥斺�閫氶亾0鍙傛暟涓�
+            if(count == null)
+            {
+                // var secondInfo = MongoDBSingleton.Instance.FindOne<secondResult>(Query.EQ("Bit", pmInfo.location), "secondResult");
+                // if(secondInfo == null || secondInfo.Status == "OK")
+                // {
+                if (PickUpStartFree(pmInfo.location) && PickUpEndFree(pmInfo.location))
+                {
+                    try
+                    {
+                        var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                        {
+                            dataNum = 1,
+                            addr = pmInfo.readAddr,
+                            host = pmInfo.ip,
+                            port = pmInfo.port
+                        });
+                        if (result != null && result.errCode == 0)
+                        {
+                            CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氳鍙栧寘瑁呮満閫氶亾鍙蜂负锛歿pmInfo.readAddr}閲岄潰鐨勫�涓簕result.result[0]}");
+                            //Console.WriteLine($"鍖呰涓嬬嚎娴佺▼锛氳鍙栧寘瑁呮満閫氶亾鍙蜂负锛歿pmInfo.readAddr}閲岄潰鐨勫�涓簕result.result[0]}");
+                            if (result != null && result.errCode == 0 && result.result.Count() > 0)
+                            {
+                                //1锛氬彇鏂�+                                if (result.result[0] == 1)
+                                {
+                                    string PlcBit02 = Settings.GetPlcInfo().Where(a => a.deviceType == "2").FirstOrDefault().location;
+                                    //鍖呰涓嬬嚎浠诲姟锛岀粓鐐逛负澶嶇О浣嶇疆锛堣繖閲屽垽鏂寘瑁呮満璧风偣锛屽绉拌捣鐐圭粓鐐瑰潎鏃犱换鍔★紝鍒欐帹閫佷换鍔★級
+                                    if (ProcessHelper.PickUpStartFree(pmInfo.location) && ProcessHelper.CheckEndFree(PlcBit02) && ProcessHelper.PickUpStartFree(PlcBit02))
+                                    {
+                                        //鍒ゆ柇澶嶇О浣嶇疆锛屾病鏈夎揣骞朵笖涓嶄负NG(ng鍙傛暟0锛�锛�鈥斺�0锛屼笉纭畾锛堝寘瑁呮満鍒氬紑濮嬪伐浣滄椂锛�锛宱k 2锛宯g)
+                                        var state = GetSecondWeighState(pmInfo.location);
+                                        CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氬垽鏂绉颁綅缃┖婊$姸鎬佷负:{state.full},ng鐘舵�涓猴細{state.ng}");
+                                        if (state.full == 0)
+                                        {
+                                            if (Settings.mesOpen == "0")
+                                            {
+                                                //鍙互鐢熸垚浠诲姟锛岃皟mes鎺ュ彛鑾峰彇鐢熶骇淇℃伅       2022.7.28   鍙樻洿  MES鍙兘闇�1~2骞存墠鑳戒笂绾匡紝鍏堟妸MES鍔熻兘娉ㄩ攢
+                                                var info = MESHelper.GetPackingMachineInfo(pmInfo.location);
+                                                if (info != null)
+                                                {
+                                                    CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼锛氳幏鍙朚ES涔嬪悗杩涘叆info鍒ゆ柇锛�);
+                                                    Console.WriteLine($"鍖呰涓嬬嚎娴佺▼锛氳幏鍙朚ES涔嬪悗杩涘叆info鍒ゆ柇锛�);
+                                                    var trayCode = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                                                    {
+                                                        addr = pmInfo.readAddr + 10,
+                                                        dataNum = 90,//ERP鍙樻洿锛�0  鍘熷厛锛�0
+                                                        host = pmInfo.ip,
+                                                        port = pmInfo.port
+                                                    });
+                                                    if (trayCode.errCode == 0 && trayCode.result.Length == 90)
+                                                    {
+                                                        //鑾峰彇鎵樼洏鐮佺瓑淇℃伅  璇诲彇閫氶亾 10銆�1銆�2鐨勬暟鎹綔涓烘墭鐩樼爜   璇诲彇鍏跺畠閫氶亾 閲嶉噺 鍙犲寘绛変俊鎭�鎵�湁鏁版嵁瀛樺叆MachineInfo琛�+                                                        string location = "";
+                                                        GetMachineData(trayCode.result,ref location);
+                                                        var tray = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.EQ("machineNo", pmInfo.location), "MachineInfo");
+                                                        if (tray != null)
+                                                        {
+                                                            if (tray.addState == 0)
+                                                            {
+                                                                MongoDBSingleton.Instance.Remove<MachineInfo>(Query.EQ("machineNo", pmInfo.location), "MachineInfo", RemoveFlags.None);
+                                                                if (ERPService.ERPSwitch01 == "0") MongoDBSingleton.Instance.Remove<MachineInfoTwo>(Query.EQ("machineNo", pmInfo.location), "MachineInfoTwo", RemoveFlags.Single);
+                                                                CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼锛氬彔鎵樺眰鏁颁负0锛屼笉鍏佽鐢熸垚浠诲姟");
+                                                            }
+                                                            else if (tray.trayCode != "0" && tray.trayCode != "" && tray.trayCode != null)
+                                                            {
+                                                                //AMSHelper.CreateTask(DateTime.Now.Ticks.ToString(), pmInfo.location, GetSecondWeighBit(), "3妤煎寘瑁呭彇鏂�, 1, JsonConvert.SerializeObject(info));
+                                                                int i = 1;
+                                                                while (i == 1)
+                                                                {
+                                                                    var amsResult = AMSHelper.CreateTask(DateTime.Now.Ticks.ToString(), pmInfo.location, PlcBit02, "3妤煎寘瑁呭彇鏂�, 0, tray.trayCode);
+                                                                    if (amsResult.success)
+                                                                    {
+                                                                        i = 2;
+                                                                        string weight = (int.Parse(tray.oneTrayWeight) / 100).ToString();
+                                                                        ERPService.packageInfo(tray.machineNo, tray.trayCode, "", weight);
+                                                                        CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼锛欰MS璋冪敤API鎴愬姛锛�);
+                                                                    }
+                                                                    else CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼锛欰MS璋冪敤API澶辫触锛屽紑濮嬮噸鏂拌皟鐢紒");
+                                                                }
+                                                                CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼锛氭帴鍙楀苟璇诲彇鍖呰鏈洪�閬撻噷闈㈢殑鐗╂枡淇℃伅锛屽苟灏嗗叾鍐欏叆MachineInfo涓棿琛ㄤ腑锛佹帴鏀跺埌鐨勪俊鎭細{JsonConvert.SerializeObject(trayCode.result)}");
+                                                            }
+                                                        }
+                                                        else
+                                                        {
+                                                            CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼锛歵ray==null!");
+                                                            Console.WriteLine($"鍖呰涓嬬嚎娴佺▼锛歵ray==null!");
+                                                        }
+                                                    }
+                                                    else
+                                                    {
+                                                        CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼锛�妤煎寘瑁呰嚦澶嶇О鑾峰彇MODBUS鍊奸敊璇紒trayCode.errCode:{trayCode.errCode},trayCode.result.Length:{trayCode.result.Length}");
+                                                        Console.WriteLine($"鍖呰涓嬬嚎娴佺▼锛�妤煎寘瑁呰嚦澶嶇О鑾峰彇MODBUS鍊奸敊璇紒trayCode.errCode:{trayCode.errCode},trayCode.result.Length:{trayCode.result.Length}");
+                                                    }
+                                                }
+                                                else CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼锛歁ES鎺ュ彛鏁版嵁杩斿洖绌哄�锛丮ES鎺ュ彛鏁版嵁:{info}");
+                                            }
+                                            else if (Settings.mesOpen == "1")
+                                            {
+                                                //鍙互鐢熸垚浠诲姟锛岃皟mes鎺ュ彛鑾峰彇鐢熶骇淇℃伅       2022.7.28   鍙樻洿  MES鍙兘闇�1~2骞存墠鑳戒笂绾匡紝鍏堟妸MES鍔熻兘娉ㄩ攢
+                                                CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氳幏鍙朚ES涔嬪悗杩涘叆info鍒ゆ柇锛�);
+                                                var trayCode = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                                                {
+                                                    addr = pmInfo.readAddr + 10,
+                                                    dataNum = 90,////ERP鍙樻洿锛�0  鍘熷厛锛�0
+                                                    host = pmInfo.ip,
+                                                    port = pmInfo.port
+                                                });
+                                                if (trayCode.errCode == 0 && trayCode.result.Length == 90)
+                                                {
+                                                    //鑾峰彇鎵樼洏鐮佺瓑淇℃伅  璇诲彇閫氶亾 11銆�2銆�3鐨勬暟鎹綔涓烘墭鐩樼爜   璇诲彇鍏跺畠閫氶亾 閲嶉噺 鍙犲寘绛変俊鎭�鎵�湁鏁版嵁瀛樺叆MachineInfo琛�+                                                    string location = "";
+                                                    string flLoc = "";
+                                                    GetMachineData(trayCode.result, ref location, false);
+                                                    if(pmInfo.location.Contains("FLZT"))
+                                                    {
+                                                        flLoc = pmInfo.location;
+                                                        pmInfo.location = location;
+                                                    }
+                                                    var tray = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.EQ("machineNo", pmInfo.location), "MachineInfo");
+                                                    if (tray != null)
+                                                    {
+                                                        bool IsContLaterCode = true;
+                                                        if (ERPService.ERPSwitch01 == "1")
+                                                        {
+                                                            string employeeId = "G" + tray.trayCodeWeight.PadLeft(7, '0');
+                                                            // 鍒ゆ柇褰撳墠銆愬憳宸ョ紪鍙枫�閫氶亾淇℃伅璇诲嚭鏉ョ殑鍛樺伐缂栧彿鏄惁宸茬粡瀛樺湪浜庢垜浠殑鍛樺伐淇℃伅琛�ERPEmployeeTable(鏌ヨ瀛楁-employee_id)
+                                                            var erpEmployeeInfo = MongoDBSingleton.Instance.FindOne<ERPEmployeeTable>(Query.EQ("employee_id", employeeId), "ERPEmployeeTable");
+                                                            if (erpEmployeeInfo == null) IsContLaterCode = false;
+                                                        }
+
+                                                        if (IsContLaterCode)
+                                                        {
+                                                            if (tray.addState == 0)
+                                                            {
+                                                                MongoDBSingleton.Instance.Remove<MachineInfo>(Query.EQ("machineNo", pmInfo.location), "MachineInfo", RemoveFlags.None);
+                                                                if (ERPService.ERPSwitch01 == "0") MongoDBSingleton.Instance.Remove<MachineInfoTwo>(Query.EQ("machineNo", pmInfo.location), "MachineInfoTwo", RemoveFlags.None);
+                                                                CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氬彔鎵樺眰鏁颁负0锛屼笉鍏佽鐢熸垚浠诲姟");
+                                                            }
+                                                            else if (tray.trayCode != "0" && !string.IsNullOrEmpty(tray.trayCode))
+                                                            {
+                                                                string timeStamp = ProcessHelper.GetTimeStamp(31, 1, 1);
+                                                                pmInfo.location = !string.IsNullOrEmpty(flLoc) ? flLoc : pmInfo.location;
+                                                                HHAmsExecuteResult req = AMSHelper.CreateTask(DateTime.Now.Ticks.ToString(), pmInfo.location, PlcBit02, "3妤煎寘瑁呭彇鏂�, 0, tray.trayCode, timeStamp);
+                                                                if (req.success)
+                                                                {
+                                                                    string weight = (double.Parse(tray.oneTrayWeight) / 100).ToString();
+                                                                    //int weight = int.Parse(tray.oneTrayWeight) / 100;
+                                                                    ERPService.packageInfo(tray.machineNo, tray.trayCode, tray.lotNo, weight);
+                                                                }
+                                                            }
+                                                        }
+                                                        else
+                                                        {
+                                                            CMMLog.Info($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氬憳宸ョ紪鐮佷笉瀛樺湪锛屽憳宸ョ紪鐮侊細G{tray.trayCodeWeight.PadLeft(7, '0')}");
+                                                            //妫�储鍛樺伐淇℃伅澶辫触鍐欏叆瀵规柟閫氶亾鍊� 璇诲彇鍦板潃+3 
+                                                            var wirteall01 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                                                            {
+                                                                addr = pmInfo.readAddr + 3,
+                                                                host = pmInfo.ip,
+                                                                port = pmInfo.port,
+                                                                data = 1
+                                                            });
+                                                        }
+                                                    }
+                                                    else CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛歵ray==null!");
+                                                }
+                                                else CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛�妤煎寘瑁呰嚦澶嶇О鑾峰彇MODBUS鍊奸敊璇紒trayCode.errCode:{trayCode.errCode},trayCode.result.Length:{trayCode.result.Length}");
+                                            }
+                                        }
+                                        else
+                                        {
+                                            var task = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.Or(Query.EQ("CN_S_START_BIT", PlcBit02), Query.EQ("CN_S_END_BIT", PlcBit02)), "TN_I_TASK_MST");
+                                            if (task != null) CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氭鏌ュ绉颁腑闂磋〃鏄惁涓虹┖锛屼笉涓虹┖鍒欐鏌ュ叾鏁版嵁full浠ュ強ng鏄惁涓�鍜�锛佷换鍔″彿涓猴細{task.CN_S_TASK_NO}");
+                                            else CMMLog.Debug("鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氭鏌ュ绉颁腑闂磋〃鏄惁涓虹┖锛屼笉涓虹┖鍒欐鏌ュ叾鏁版嵁full浠ュ強ng鏄惁涓�鍜�锛�);
+                                        }
+                                    }
+                                    else CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氬寘瑁呮満璧风偣鎴栬�澶嶇О璧风偣缁堢偣鏈変换鍔″湪鎵ц涓紒鍖呰鏈虹偣浣嶏細{pmInfo.location},澶嶇О鐐逛綅锛歿PlcBit02}");
+                                }
+                                else CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氬寘瑁呮満閫氶亾0閲岄潰鐨勬暟鎹笉涓�锛乺esult涓猴細{JsonConvert.SerializeObject(result)}");
+                            }
+                            else CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氭湭璇诲彇鍒板寘瑁呮満閫氶亾0閲岄潰鐨勬暟鎹紒锛侊紒result:{JsonConvert.SerializeObject(result)}");
+                        }
+                        else CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氭湭璇诲彇鍒板寘瑁呮満閫氶亾0閲岄潰鐨勬暟鎹紒锛侊紒result:{JsonConvert.SerializeObject(result)}");
+                    }
+                    catch (Exception ex)
+                    {
+                        CMMLog.Debug($"鍖呰涓嬬嚎娴佺▼-{pmInfo.location}:" +ex.Message);
+                    }
+                }
+                else
+                    {
+                        //var taskNo = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.Or(Query.EQ("CN_S_START_BIT", pmInfo.location), Query.EQ("CN_S_END_BIT", pmInfo.location)), "TN_I_TASK_MST");
+                        //string task = "", startbit = "", endbit = "";
+                        //if (taskNo != null)
+                        //{
+                        //    task = taskNo.CN_S_TASK_NO;
+                        //    startbit = taskNo.CN_S_START_BIT;
+                        //    endbit = taskNo.CN_S_END_BIT;
+                        //}
+                        CMMLog.Debug($"褰撳墠鍖呰鏈鸿捣鐐圭粓鐐规湁浠诲姟姝e湪鎵ц锛岃纭褰撳墠鍖呰鏈虹殑浠诲姟鏄惁鍙栬揣鍗歌揣瀹屾垚锛佸寘瑁呮満璐т綅缂栫爜锛歿pmInfo.location}");
+                    }
+                // }
+                // else CMMLog.Info($"褰撳墠鍖呰鏈哄嚭鐜版晠闅滐紝鏃犳硶鐢熸垚浠诲姟銆傚寘瑁呮満鍙凤細{pmInfo.location}");
+            }
+            else CMMLog.Debug($"褰撳墠machineInfo涓棿琛ㄥ凡瀛樺湪鏁版嵁锛歿JsonConvert.SerializeObject(count)}");
+        }
+
+        #endregion
+
+        #region   鍖呰鏈篗ODBUS浜や簰锛堝紑濮嬪彇鏂欙紝鍙栨枡瀹屾垚锛�+
+        /// 灏忚溅璇锋眰杩涙枡	1	AMS鍐欙紝PLC璇�1-璇锋眰杩涘叆锛�-鍒颁綅鍚庯紝璇锋眰鎺ラ┏婊氬姩锛�-鍙栬揣瀹屾垚锛�-绂诲紑瀹夊叏闂ㄥ锛屾竻闆堕�閬�+        /// 璁惧鍏佽鍑烘枡	1	PLC鍐欙紝AMS璇�1-XXXXXXXX锛�-鍏佽杩涘叆锛�-鎺ラ┏婊氬姩锛岄�鍑虹墿鏂� 锛�-缁撴潫锛�-瀹夊叏闂ㄥ叧闂�+
+        /// <summary>
+        /// 灏忚溅鍒拌揪鍖呰鏈哄畨鍏ㄩ棬鍙h姹傝繘鍏�+        /// </summary>
+        /// <param name="ips"></param>
+        internal static void PickUpFullDoorUnload(string ip, string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip).FirstOrDefault();
+            if(plc.device != "24")
+            {
+                //ASM鍐欏叆閫氶亾0灏忚溅鍔ㄤ綔锛�-鍙栨枡
+                int[] num = new int[2] { 1, 1 };
+                var writeRes0 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                {
+                    host = ip,
+                    addr = plc.writeAddr,
+                    data = num,//鍘熷厛鏄�,鍗曚釜鍐欏叆
+                    port = plc.port
+                });
+                DateTime dateTime = DateTime.Now;
+                if (writeRes0.errCode == 0)
+                {
+                    //灏忚溅璇锋眰杩涘叆瀹夊叏闂ㄤ氦浜�+                    //灏忚溅璇锋眰杩涙枡锛屽苟涓旀煡璇㈣澶囨槸鍚﹀厑璁窤GV杩涘叆
+                    //璇诲湴鍧�璁惧鏄惁  2-鍙互杩涘叆
+                    var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 1,
+                        host = ip,
+                        addr = plc.readAddr + 1,
+                        port = plc.port
+                    });
+                    CMMLog.Debug($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+                    Console.WriteLine($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+                    if (readRes != null && readRes.errCode == 0)
+                    {
+                        if (readRes.result[0] == 2)
+                        {
+                            //璁惧鍏佽杩涘叆锛屾敼鍙傛暟閫氱煡AGV
+                            WorkFlowAction.TrackLog(taskNo, 10, 1012, "success");
+                            TSHelper.GoToAGV(taskNo, 10, 1);
+                        }
+                    }
+                    else CMMLog.Debug($"鍖呰涓嬬嚎锛�012锛宺eadRes锛歿readRes},readRes.errCode:{readRes.errCode}");
+                }
+            }
+            else
+            {
+                var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                {
+                    host = plc.ip,
+                    port = plc.port,
+                    addr = plc.writeAddr + 1,
+                    data = 1
+                });
+
+                if (writeRes.errCode == 0)
+                {
+                    //灏忚溅璇锋眰杩涘叆瀹夊叏闂ㄤ氦浜�+                    //灏忚溅璇锋眰杩涙枡锛屽苟涓旀煡璇㈣澶囨槸鍚﹀厑璁窤GV杩涘叆
+                    //璇诲湴鍧�璁惧鏄惁  2-鍙互杩涘叆
+                    var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 1,
+                        host = ip,
+                        addr = plc.readAddr + 1,
+                        port = plc.port
+                    });
+                    CMMLog.Debug($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+                    Console.WriteLine($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+                    if (readRes != null && readRes.errCode == 0)
+                    {
+                        if (readRes.result[0] == 2)
+                        {
+                            //璁惧鍏佽杩涘叆锛屾敼鍙傛暟閫氱煡AGV
+                            WorkFlowAction.TrackLog(taskNo, 10, 1012, "success");
+                            TSHelper.GoToAGV(taskNo, 10, 1);
+                        }
+                    }
+                    else CMMLog.Debug($"鍖呰涓嬬嚎锛�012锛宺eadRes锛歿readRes},readRes.errCode:{readRes.errCode}");
+                }
+            }
+        }
+        /// <summary>
+        /// 灏忚溅璇锋眰鍙栬揣
+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="taskNo"></param>
+        internal static void PickUpFullUnload(string ip , string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip).FirstOrDefault();
+            if (ip != "")
+            {
+                //灏忚溅璇锋眰鍑烘枡锛屽苟涓旀煡璇㈣澶囨槸鍚﹀厑璁窤GV杩涘叆
+                //璇诲湴鍧�璁惧鏄惁  2-鍏佽杩涙枡  淇濋櫓璧疯锛屽彲浠ヤ笉璇�+                var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    host = ip,
+                    addr = plc.readAddr + 1,
+                    port = plc.port
+                });
+                CMMLog.Debug($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+                Console.WriteLine($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+                if (readRes != null && readRes.errCode == 0)
+                {
+                    if (readRes.result[0] == 2)
+                    {
+                        //TSHelper.GoToAGV(taskNo, 10, 2);//鍘熷厛鍏堟敼AGV鍙傛暟
+                        var writeRes1 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                        {
+                            host = ip,
+                            addr = plc.writeAddr + 1,
+                            data = 2,
+                            port = plc.port
+                        });
+                        if(writeRes1.errCode == 0) TSHelper.GoToAGV(taskNo, 10, 2);
+                        CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                        Console.WriteLine($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                    }
+                }
+                else CMMLog.Debug($"鍖呰涓嬬嚎锛�112锛宺eadRes={readRes}");
+            }
+            else CMMLog.Debug($"鍖呰涓嬬嚎锛�112锛宨p=null!");
+        }
+        /// <summary>
+        /// 灏忚溅鍙栬揣瀹屾垚--浜屾湡鍗忚鏃犳鎸囦护鍔ㄤ綔
+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="taskNo"></param>
+        internal static void PickUpFullComplete(string ip, string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip).FirstOrDefault();
+            if (ip != "")
+            {
+                //灏忚溅璇锋眰鍑烘枡锛屽苟涓旀煡璇㈣澶囨槸鍚﹀厑璁窤GV杩涘叆
+                //璇诲湴鍧�璁惧鏄惁  2-鍏佽杩涙枡
+                var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    host = ip,
+                    addr = plc.readAddr+1,
+                    port = plc.port
+                });
+                CMMLog.Debug($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+                Console.WriteLine($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+                DateTime dateTime = DateTime.Now;
+                if (readRes != null && readRes.errCode == 0)
+                {
+                    if (readRes.result[0] == 3)
+                    {
+                        var writeRes1 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                        {
+                            host = ip,
+                            addr = plc.writeAddr+1,
+                            data = 3,
+                            port = plc.port
+                        });
+                        CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                        Console.WriteLine($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                    }
+                    else if(readRes.result[0] == 4)
+                    {
+                        WorkFlowAction.TrackLog(taskNo, 10, 1212, "success");
+                        TSHelper.GoToAGV(taskNo, 10, 5);
+                    }
+                }
+                else CMMLog.Debug($"鍖呰涓嬬嚎锛�212锛宺eadRes={readRes}!");
+            }
+            else CMMLog.Debug($"鍖呰涓嬬嚎锛�212锛宨p=null!");
+        }
+        /// <summary>
+        /// 灏忚溅鍗歌揣瀹屾垚绂诲紑瀹夊叏闂ㄥ悗閫氱煡鍖呰鏈�+        /// </summary>
+        /// <param name="ips"></param>
+        /// <param name="taskNo"></param>
+        internal static void PickUpFullDoorComplete(string ip, string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip).FirstOrDefault();
+            if (plc != null && !plc.location.Contains("FLZT"))
+            {
+                //鍐欏叆鍖呰鏈�-瀹夊叏闂ㄥ叧闂ㄦ寚浠�+                var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                {
+                    host = ip,
+                    addr = plc.writeAddr + 1,
+                    data = 3,
+                    port = plc.port
+                });
+                CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                Console.WriteLine($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+            }
+            else CMMLog.Debug($"鍖呰涓嬬嚎锛�锛宨p=null!");
+        }
+        #endregion
+
+        #region   澶嶇О骞冲彴浜や簰
+
+        ///灏忚溅璇锋眰杩涙枡       1       AMS鍐欙紝PLC璇�      1-璇锋眰杩涘叆锛�-灏忚溅杩涙枡锛岃緭閫佹墭鐩橈紱3-XXXXXXX
+        ///璁惧鍏佽鍑烘枡       1       PLC鍐欙紝AMS璇�      1-XXXXXXXX锛�-鍏佽杩涙枡锛屽紑濮嬫粴鍔紱3-涓婃枡瀹屾垚
+        ///澶嶇О骞冲彴灏忚溅鍔ㄤ綔锛�   1锛氫笂鏂欏绉帮紱2锛氫笂鐮濈爜鏁欑О锛�锛氬彇澶嶇ОNG鎵樼洏锛�锛氬彇鐮濈爜鍒板寘瑁呮満
+
+        /// <summary>
+        ///澶嶇О骞冲彴瀹夊叏璇锋眰杩涘叆鈥斺�鍥犱负鐜板満闇�眰锛屾墍浠ラ澶栧鍔犱竴涓被浼煎畨鍏ㄩ棬鐨勪氦浜掞紝鐩存帴鏀瑰弬鏁板氨琛�+        /// </summary>
+        internal static void SecondWeightSafe(string ip,string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip).FirstOrDefault();
+            //ASM鍐欏叆灏忚溅鍔ㄤ綔锛�锛氫笂鏂欏绉帮紱2锛氫笂鐮濈爜鏁欑О锛�锛氬彇澶嶇ОNG鎵樼洏锛�锛氬彇鐮濈爜鍒板寘瑁呮満
+            int[] num = new int[2] { 1, 1 };
+            var writeRes0 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+            {
+                host = ip,
+                addr = plc.writeAddr,
+                data = num,//鍘熷厛鏄�,鍗曚釜鍐欏叆
+                port = plc.port
+            });
+            CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr}閲岄潰鏁版嵁涓�.");
+            Console.WriteLine($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr}閲岄潰鏁版嵁涓�.");
+            ///灏忚溅鍜屽绉颁綅瀵规帴
+            //灏忚溅璇锋眰杩涙枡锛屽苟涓旀煡璇㈣澶囨槸鍚﹀厑璁窤GV杩涘叆
+            var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+            {
+                dataNum = 1,
+                host = plc.ip,
+                addr = plc.readAddr + 1,
+                port = plc.port
+            });
+            CMMLog.Debug($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+            Console.WriteLine($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+            if (readRes != null && readRes.errCode == 0)
+            {
+                if(readRes.result[0] == 2)
+                {
+                    WorkFlowAction.TrackLog(taskNo, 10, 1013, "success");
+                    TSHelper.GoToAGV(taskNo, 10, 3);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 澶嶇О鍗歌揣
+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="cN_S_TASK_NO"></param> 
+        internal static void CheckUpReqUnload(string ip, string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.location == ip).FirstOrDefault();
+            ///灏忚溅鍜屽绉颁綅瀵规帴
+            if (plc != null)
+            {
+                //璁惧鍏佽杩涘叆锛屾敼鍙傛暟閫氱煡AGV
+                WorkFlowAction.TrackLog(taskNo, 10, 1113, "success");
+                TSHelper.GoToAGV(taskNo, 10, 4);
+                CMMLog.Debug($"鏀笰GV鍙傛暟锛�0锛�");
+                //鍒ゆ柇浠诲姟璧风偣锛屾壘鍒拌捣鐐瑰寘瑁呮満璁惧鍙凤紝鍦ㄤ腑闂磋〃MachineInfo涓煡鎵句笂涓�彴璁惧锛堝寘瑁呮満锛夌殑鏁版嵁锛岄�杩噈odbus閫氶亾浼犲叆锛堟暟鎹渶瑕佽浆鎹紝ASCII杞�6short锛屽彲鑳借繕闇�鏁版嵁鎷嗗垎锛�+                var taskInfo = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", taskNo), "TN_I_TASK_MST");
+                if (plc.deviceType == "21")
+                {
+                    //鍥涢挻杞﹂棿
+                    var machine = MongoDBSingleton.Instance.FindOne<MachineInfoTetracobalt>(Query.EQ("trayCode", taskInfo.CN_S_BATCH_NO), "MachineInfo");
+                    if (machine != null)
+                    {
+                        CMMLog.Debug("杩涘叆machine鍒ゆ柇");
+                        //鍚戝绉板嵏璐у绉帮紝骞跺皢浠庡寘瑁呮満鑾峰彇鍒扮殑鏁版嵁鍐欏叆閫氶亾涓�+                        #region   澶氫釜鏁版嵁鍐欏叆MODBUS
+
+                        var arr = JsonConvert.DeserializeObject<List<int>>(machine.jsonData);
+                        int[] num = new int[22];
+                        for (int i = 0; i <= 21; i++) num[i] = arr[i];
+
+                        // 14,15 鏇挎崲涓烘椂闂存埑锛屽悗缁鐞�+                        //num[14] = int.Parse(machine.overlappingLayers);
+                        //CMMLog.Debug($"machine.machinedown[14]:{num[14]}");
+                        //num[15] = int.Parse(machine.bagNo);
+                        //CMMLog.Debug($"machine.machinedown[15]:{num[15]}");
+                        //鏃堕棿鎴冲鐞�+                        //for (int b = 16; b <= 17; b++)
+                        //{
+                        //    int k = b % 2 == 0 ? 0 : 16;
+                        //    num[b] = Convert.ToInt32(Convert.ToString(int.Parse(taskInfo.Ext2), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+                        //}
+
+                        CMMLog.Debug($"{num}");
+                        Console.WriteLine(num);
+                        var wirteall = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                        {
+                            addr = plc.writeAddr + 5,
+                            host = plc.ip,
+                            data = num,
+                            port = plc.port
+                        });
+                        var writeRes1 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                        {
+                            host = plc.ip,
+                            addr = plc.writeAddr + 1,
+                            data = 2,
+                            port = plc.port
+                        });
+                        CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                        Console.WriteLine($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                        #endregion
+                    }
+                    else CMMLog.Debug($"machine鍒ゆ柇閿欒锛屼负null!");
+                }
+                else
+                {
+                    var machine = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.EQ("trayCode", taskInfo.CN_S_BATCH_NO), "MachineInfo");
+                    if (machine != null)
+                    {
+                        CMMLog.Debug("杩涘叆machine鍒ゆ柇");
+                        //鍚戝绉板嵏璐у绉帮紝骞跺皢浠庡寘瑁呮満鑾峰彇鍒扮殑鏁版嵁鍐欏叆閫氶亾涓�+                        #region   澶氫釜鏁版嵁鍐欏叆MODBUS
+
+                        var arr = JsonConvert.DeserializeObject<List<int>>(machine.jsonData);
+                        int[] num = new int[18];
+                        for (int i = 0; i <= 15; i++) num[i] = arr[i];
+
+                        // 14,15 鏇挎崲涓烘椂闂存埑锛屽悗缁鐞�+                        num[14] = int.Parse(machine.overlappingLayers);
+                        CMMLog.Debug($"machine.machinedown[14]:{num[14]}");
+                        num[15] = int.Parse(machine.bagNo);
+                        CMMLog.Debug($"machine.machinedown[15]:{num[15]}");
+                        //鏃堕棿鎴冲鐞�+                        for (int b = 16; b <= 17; b++)
+                        {
+                            int k = b % 2 == 0 ? 0 : 16;
+                            num[b] = Convert.ToInt32(Convert.ToString(int.Parse(taskInfo.Ext2), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+                        }
+
+                        CMMLog.Debug($"{num}");
+                        Console.WriteLine(num);
+                        var wirteall = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                        {
+                            addr = plc.writeAddr + 10,
+                            host = plc.ip,
+                            data = num,
+                            port = plc.port
+                        });
+                        var writeRes1 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                        {
+                            host = plc.ip,
+                            addr = plc.writeAddr + 1,
+                            data = 2,
+                            port = plc.port
+                        });
+                        CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                        Console.WriteLine($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                        #endregion
+                    }
+                    else CMMLog.Debug($"machine鍒ゆ柇閿欒锛屼负null!");
+                }
+                
+                
+            }
+            else CMMLog.Debug($"鍖呰涓嬬嚎锛�113锛宨p=null!");
+        }
+        /// <summary>
+        /// 澶嶇О鍗歌揣瀹屾垚
+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="cN_S_TASK_NO"></param>
+        /// <returns></returns>
+        internal static void CheckUpUnloadComplete(string ip, string cN_S_TASK_NO, int port)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip && a.port == port).FirstOrDefault();
+            int[] num = new int[1] { 2 };
+            var writeRes0 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+            {
+                host = ip,
+                addr = plc.writeAddr + 1,
+                data = num,//鍘熷厛鏄�,鍗曚釜鍐欏叆
+                port = plc.port
+            });
+
+            var tray = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", cN_S_TASK_NO), "TN_I_TASK_MST");
+
+            var query = Query.And(Query.EQ("actionNo", "1"), Query.EQ("ext1", ip), Query.EQ("ext2", tray.CN_S_BATCH_NO));
+            var ActionControlInfo = MongoDBSingleton.Instance.FindOne<ActionControlModel>(query, "ActionControlModel");
+            if (ActionControlInfo == null)
+            {
+                MongoDBSingleton.Instance.Insert<ActionControlModel>(new ActionControlModel
+                {
+                    actionNo = "1",
+                    ext1 = ip,
+                    ext2 = tray.CN_S_BATCH_NO,
+                    ext3 = tray.CN_S_START_BIT,
+                    ext4 = port,
+                    machince = tray.CN_S_START_BIT
+                }, "ActionControlModel");
+                string PlcBit02 = Settings.GetPlcInfo().Where(a => a.deviceType == "2").FirstOrDefault().location;
+                MongoDBSingleton.Instance.Update<SecondWeighState>(Query.EQ("location", PlcBit02), Update.Set("full",1), "SecondWeighState", UpdateFlags.None);
+            }
+        }
+        /// <summary>
+        /// 澶嶇О骞冲彴瀹夊叏閫�嚭锛堝凡閫�嚭锛�-浜屾湡鏃犻渶鎵ц姝ゆ寚浠ゅ姩浣�+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="cN_S_TASK_NO"></param>
+        /// <returns></returns>
+        internal static bool SecondWeightSafeComplete(string ip, string cN_S_TASK_NO)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip).FirstOrDefault();
+            bool result = true;
+            if(ip != "")
+            {
+                //var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                //{
+                //    addr = plc.writeAddr,
+                //    data = 0,
+                //    host = ip,
+                //    port = plc.port
+                //});
+                //CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr}閲岄潰鏁版嵁涓�.");
+                //Console.WriteLine($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr}閲岄潰鏁版嵁涓�.");
+                //var wirte1 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                //{
+                //    addr = plc.writeAddr + 1,
+                //    data = 0,
+                //    host = ip,
+                //    port = plc.port
+                //});
+                //CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                //Console.WriteLine($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 1}閲岄潰鏁版嵁涓�.");
+                result = true;
+            }
+            else
+            {
+                CMMLog.Debug($"鍖呰涓嬬嚎锛�锛宨p=null!");
+            }
+            return result;
+        }
+
+        internal static void SecondWeightActionOne(ActionControlModel model)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.ip == model.ext1 && a.port == model.ext4).FirstOrDefault();
+
+            if (plc != null)
+            {
+                bool req = false;
+                var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 28,
+                    addr = plc.readAddr + 1,
+                    host = plc.ip,
+                    port = plc.port
+                });
+                if (result.result.Length > 0)
+                {
+                    MongoDBSingleton.Instance.Update<MachineInfo>(Query.EQ("trayCode", model.ext2), Update.Set("secondNg", result.result[2]), UpdateFlags.None);
+                    //鑾峰彇浠庡绉板钩鍙拌鍑虹殑 鏃堕棿鎴筹紝骞惰浆鎹㈠鐞嗕负 string 瀛楃涓�+                    //string timeStamp = Convert.ToInt32(Completion(result.result[26]) + Completion(result.result[27]), 2).ToString();
+                    string timeStamp = Convert.ToInt32(Completion(result.result[25]) + Completion(result.result[26]), 2).ToString();
+                    string wmstaskno = "";
+                    string traycode = "";
+
+                    CMMLog.Info($"SecondWeightActionOne:readData:{JsonConvert.SerializeObject(result.result)},timeStamp:{timeStamp}");
+
+                    if (result.result[0] == 3)
+                    {
+                        int[] num = new int[1] { 0 };
+                        var writeRes0 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                        {
+                            host = plc.ip,
+                            addr = plc.writeAddr + 1,
+                            data = num,//鍘熷厛鏄�,鍗曚釜鍐欏叆
+                            port = plc.port
+                        });
+                    }
+
+                    if (result.result[0] == 3 && result.result[2] == 1)
+                    {
+                        CMMLog.Info($"SecondWeightActionOne:鍑嗗鐢熸垚澶嶇О鍏ョ紦瀛樻灦浠诲姟锛屽紑濮嬬‘瀹氭墭鐩樺彿:{model.ext2}");
+                        req = WMSHelper.WMSIn(plc.location, model.ext2, ref wmstaskno, ref traycode, timeStamp);
+                        ERPService.updatePackageInfo(model.machince, model.ext2, result.result);
+                        //if (req) TSHelper.GoToAGV(cN_S_TASK_NO, 10, 6);
+                        //else CMMLog.Debug($"WMS杩斿洖{req}");
+                        //var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                        //{
+                        //    addr = plc.writeAddr + 3,
+                        //    host = plc.ip,
+                        //    port = plc.port,
+                        //    data = 1
+                        //});
+                    }
+                    if (result.result[2] == 2)
+                    {
+                        //澶嶇О骞冲彴澶嶇О璐х墿NG鈥斺�杩涘叆NG澶嶇О娴佺▼  璋冪敤WMS鎺ュ彛鍒嗛厤璐ф灦搴撲綅
+                        //TSHelper.GoToAGV(cN_S_TASK_NO, 10, 6);
+                        req = WMSHelper.WMSIn(plc.location, model.ext2, ref wmstaskno, ref traycode, timeStamp);
+                        if (req) CMMLog.Info($"SecondWeightActionOne:澶嶇О鍏ョ紦瀛樻灦NG娴佺▼锛歐MS鐢熸垚浠诲姟鎴愬姛锛�);
+                        else CMMLog.Info($"SecondWeightActionOne:澶嶇О鍏ョ紦瀛樻灦NG娴佺▼锛歐MS鐢熸垚浠诲姟澶辫触锛�);
+                        var plcInfo = Settings.GetPlcInfo().Where(a => a.location == model.ext3).FirstOrDefault();
+                        if (plcInfo != null)
+                        {
+                            CMMLog.Info($"SecondWeightActionOne:澶嶇О鍏ョ紦瀛樻灦NG娴佺▼锛氬啓鍏ュ寘瑁呮満NG閫氶亾鏁版嵁1锛�);
+                            var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                addr = plcInfo.writeAddr + 29,
+                                host = plcInfo.ip,
+                                port = plcInfo.port,
+                                data = 1
+                            });
+                        }
+                    }
+                    string PlcBit02 = Settings.GetPlcInfo().Where(a => a.deviceType == "2").FirstOrDefault().location;
+                    UpdateBuilder update = Update.Set("ng", result.result[2]);
+                    MongoDBSingleton.Instance.Update<SecondWeighState>(Query.EQ("location", PlcBit02), update, "SecondWeighState", UpdateFlags.None);
+                    if (req) MongoDBSingleton.Instance.Remove<ActionControlModel>(Query.EQ("_id", model._id), "ActionControlModel", RemoveFlags.Single);
+                }
+            }
+            else CMMLog.Debug($"鍖呰涓嬬嚎锛�213锛宨p=null!");
+        }
+
+        #endregion
+
+        #endregion
+
+        #region   3妤煎绉板钩鍙板叆3妤煎弻灞傜紦瀛樻灦娴佺▼鈥斺�闇�洖鎶MS浠诲姟鐘舵�鈥斺�3妤煎绉板叆缂撳瓨鏋垛�鈥斿凡瀹屾垚(寰呮祴璇�
+
+        /// <summary>
+        /// 鍒ゆ柇澶嶇О閫氶亾3閲岄潰鐨勫�鏄惁涓�锛屽苟涓斿绉板钩鍙颁笂鏈夎揣锛岃皟WMS鐢熸垚鍏ョ紦瀛樻灦浠诲姟
+        /// </summary>
+        /// <param name="pmInfo"></param>
+        internal static void SecondWeightInCache(Settings.PlcInfo pmInfo)
+        {
+            //妫�煡澶嶇О骞冲彴閫氶亾3鏄惁鍊间负1锛屽苟涓斿绉板钩鍙颁笂鏈夎揣
+            if(ProcessHelper.CheckStartFree(GetSecondWeighBit()) && ProcessHelper.CheckEndFree(GetSecondWeighBit()))
+            {
+                try
+                {
+                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 1,
+                        addr = pmInfo.readAddr + 3,
+                        host = pmInfo.ip,
+                        port = pmInfo.port
+                    });
+                    if (result != null && result.errCode == 0)
+                    {
+                        //澶嶇О骞冲彴 閲嶆柊澶嶆牳绉伴噸鍚庯紝鍙戦�缁撴灉缁橝MS 1:OK锛�:NG锛屽綋妫�祴鍒伴�閬�鎴栬�4鐨勫�涓�+                        if (result.result[0] == 1)
+                        {
+                            //鍒ゆ柇涓�笅褰撳墠澶嶇О鐐规湁娌℃湁浠诲姟鍗犵敤涓�+                            if (ProcessHelper.CheckStartFree(GetSecondWeighBit()) && ProcessHelper.CheckEndFree(GetSecondWeighBit()))
+                            {
+                                //鍒ゆ柇澶嶇О浣嶇疆锛屼骇鍝丯G鍚堟牸鍊间负1骞朵笖澶嶇О涓婃湁璐�+                                //var state = GetSecondWeighState(pmInfo.location);
+                                //if (state.full == 1 && state.ng == 1)
+                                //{
+                                    //#region    鑾峰彇鎵樼洏鐮�+                                    //CMMLog.Info("澶嶇О鍏ョ紦瀛橈細鑾峰彇鎵樼洏,fc01");
+                                    //string traycode = GetMachineTrayCode();
+                                    //#endregion
+
+                                    //string wmstaskno = "";
+                                    //bool req = WMSHelper.WMSIn(pmInfo.location, traycode, ref wmstaskno, ref traycode);
+                                    //if (req)
+                                    //{
+                                    //    CMMLog.Info($"澶嶇О鍏ョ紦瀛樻灦锛歐MS鐢熸垚浠诲姟鎴愬姛锛�);
+                                    //}
+                                    //else
+                                    //{
+                                    //    CMMLog.Info($"澶嶇О鍏ョ紦瀛樻灦锛歐MS鐢熸垚浠诲姟澶辫触锛�);
+                                    //}
+                                //}
+                            }
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error(ex.Message, ex);
+                }
+            }
+        }
+
+        #region   澶嶇О浜や簰
+
+        public static int SecondRelax = 0;
+        /// <summary>
+        /// 璇锋眰杩涘叆澶嶇О鍙栬揣
+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="taskNo"></param>
+        internal static void SecondWeightInCache1012(string ip, string taskNo) 
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == ip).FirstOrDefault();
+            if(ip != null)
+            {
+                ///灏忚溅鍜屽绉颁綅瀵规帴
+                if (ip != "")
+                {
+                    //灏忚溅璇锋眰杩涙枡锛屽苟涓旀煡璇㈣澶囨槸鍚﹀厑璁窤GV杩涘叆
+                    WorkFlowAction.TrackLog(taskNo, 10, 1012, "success");
+                    TSHelper.GoToAGV(taskNo, 10, 1);
+                    SecondRelax = 0;
+                }
+                else CMMLog.Info($"澶嶇О鍏ョ紦瀛樻灦锛�012锛宨p=null!");
+            }
+        }
+        /// <summary>
+        /// 鍙栬揣瀹屾垚锛岀寮�绉帮紝澶嶄綅閫氶亾锛屽苟璇诲彇璁惧閫氶亾鏁版嵁
+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="cN_S_TASK_NO"></param>
+        internal static void SecondWeightInCache4(string ip, string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == ip).FirstOrDefault();
+
+            var trayCodeTask = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", taskNo), "TN_I_TASK_MST");
+            if(trayCodeTask != null)
+            {
+                string trayCodeNo = trayCodeTask.CN_S_BATCH_NO;
+                if(trayCodeNo != "")
+                {
+                    var status = MongoDBSingleton.Instance.FindOne<SecondWeighState>(Query.EQ("location", GetSecondWeighBit()), "SecondWeighState");
+                    //UpdateBuilder update = Update.Set("full", 0);
+                    //if (status.ng != 2)
+                    //{
+                    //    update = Update.Set("ng", 0).Set("full", 0);
+                    //}
+
+                    UpdateBuilder update = Update.Set("ng", 0).Set("full", 0);
+                    CMMLog.Debug($"寮�鏇存敼澶嶇О鐘舵�涓棿琛ㄧ姸鎬侊細full:0");
+                    CMMLog.Debug($"涓夋ゼ鍙屽眰缂撳瓨鏋跺嵏璐т氦浜掞細trayCode:{trayCodeTask.CN_S_BATCH_NO}");
+                    if (plc.deviceType =="22")
+                    {
+                        MongoDBSingleton.Instance.Remove<MachineInfoTetracobalt>(Query.EQ("trayCode", trayCodeTask.CN_S_BATCH_NO), "MachineInfo", RemoveFlags.Single);
+                        if (ERPService.ERPSwitch01 == "0") MongoDBSingleton.Instance.Remove<MachineInfoTetracobalt>(Query.EQ("trayCode", trayCodeTask.CN_S_BATCH_NO), "MachineInfoTetracobalt", RemoveFlags.Single);
+                    }
+                    else
+                    {
+                        MongoDBSingleton.Instance.Remove<MachineInfo>(Query.EQ("trayCode", trayCodeTask.CN_S_BATCH_NO), "MachineInfo", RemoveFlags.Single);
+                        if (ERPService.ERPSwitch01 == "0") MongoDBSingleton.Instance.Remove<MachineInfoTwo>(Query.EQ("trayCode", trayCodeTask.CN_S_BATCH_NO), "MachineInfoTwo", RemoveFlags.Single);
+                    }
+                    
+                    //MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", taskNo), Update.Set("CN_S_BATCH_NO", trayCodeNo), UpdateFlags.None);
+                    MongoDBSingleton.Instance.Update<SecondWeighState>(Query.EQ("location", GetSecondWeighBit()), update, "SecondWeighState", UpdateFlags.None);
+                    SecondRelax = 1;
+                }
+            }
+            if (plc != null)
+            {
+                var writeRes1 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                {
+                    host = plc.ip,
+                    addr = plc.writeAddr + 3,// + 4
+                    data = 1,
+                    port = plc.port
+                });
+                //var writeRes1 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                //{
+                //    host = plc.ip,
+                //    addr = plc.writeAddr + 3,
+                //    data = 1,
+                //    port = plc.port
+                //});
+            }
+        }
+
+        #endregion
+
+        #region  涓夋ゼ鍙屽眰缂撳瓨鏋朵氦浜�+
+        /// <summary>
+        /// 璇锋眰杩涘叆涓夋ゼ鍙屽眰缂撳瓨鏋�+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="taskNo"></param>
+        internal static void SecondWeightInCache1013(string taskNo)
+        {
+            TSHelper.GoToAGV(taskNo,10,3);
+        }
+        /// <summary>
+        /// 绂诲紑涓夋ゼ鍙屽眰缂撳瓨鏋跺洖鎶ヤ俊鎭�+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="taskNo"></param>
+        internal static bool SecondWeightInCache6(string ip, string cN_S_TASK_NO)
+        {
+            //CMMLog.Info($"涓夋ゼ鍙屽眰缂撳瓨鏋跺嵏璐т氦浜掞細trayCode:{trayCode}");
+
+            //var plc = Settings.GetPlcInfo().Where(a => a.deviceType == ip).FirstOrDefault();
+
+            //if (plc != null)
+            //{
+            //    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+            //    {
+            //        dataNum = 28,
+            //        addr = plc.readAddr + 1,
+            //        host = plc.ip,
+            //        port = plc.port
+            //    });
+            //    var tray = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", cN_S_TASK_NO), "TN_I_TASK_MST");
+            //    MongoDBSingleton.Instance.Update<MachineInfo>(Query.EQ("trayCode", tray.CN_S_BATCH_NO), Update.Set("secondNg", result.result[2]), UpdateFlags.None);
+            //    //鑾峰彇浠庡绉板钩鍙拌鍑虹殑 鏃堕棿鎴筹紝骞惰浆鎹㈠鐞嗕负 string 瀛楃涓�+            //    string timeStamp = Convert.ToInt32(Completion(result.result[26]) + Completion(result.result[27]), 2).ToString();
+            //    string wmstaskno = "";
+            //    string traycode = "";
+            //    if (result.result[0] == 3 && result.result[2] == 1)
+            //    {
+            //        CMMLog.Debug($"鍑嗗鐢熸垚澶嶇О鍏ョ紦瀛樻灦浠诲姟锛屽紑濮嬬‘瀹氭墭鐩樺彿:{tray.CN_S_BATCH_NO}");
+            //        bool req = WMSHelper.WMSIn(plc.location, tray.CN_S_BATCH_NO, ref wmstaskno, ref traycode, timeStamp);
+            //        if (req) TSHelper.GoToAGV(cN_S_TASK_NO, 10, 6);
+            //        else CMMLog.Debug($"WMS杩斿洖{req}");
+            //    }
+            //    if (result.result[2] == 2)
+            //    {
+            //        //澶嶇О骞冲彴澶嶇О璐х墿NG鈥斺�杩涘叆NG澶嶇О娴佺▼  璋冪敤WMS鎺ュ彛鍒嗛厤璐ф灦搴撲綅
+            //        TSHelper.GoToAGV(cN_S_TASK_NO, 10, 6);
+            //        bool req = WMSHelper.WMSIn(plc.location, tray.CN_S_BATCH_NO, ref wmstaskno, ref traycode, timeStamp);
+            //        if (req) CMMLog.Debug($"澶嶇О鍏ョ紦瀛樻灦NG娴佺▼锛歐MS鐢熸垚浠诲姟鎴愬姛锛�);
+            //        else CMMLog.Debug($"澶嶇О鍏ョ紦瀛樻灦NG娴佺▼锛歐MS鐢熸垚浠诲姟澶辫触锛�);
+            //    }
+            //    string PlcBit02 = Settings.GetPlcInfo().Where(a => a.deviceType == "2").FirstOrDefault().location;
+            //    UpdateBuilder update = Update.Set("ng", result.result[2]).Set("full", 1);
+            //    MongoDBSingleton.Instance.Update<SecondWeighState>(Query.EQ("location", PlcBit02), update, UpdateFlags.None);
+            //}
+            //else CMMLog.Debug($"鍖呰涓嬬嚎锛�213锛宨p=null!");
+
+
+            return true;
+        }
+
+        #endregion
+
+        #endregion
+
+        internal static void writeStackingMouth6(string loca, string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.location == loca && a.enable == 1).FirstOrDefault();
+            CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鏀跺埌淇″彿4锛屾煡璇㈣澶囦俊鎭細{JsonConvert.SerializeObject(plc)}銆�);
+            if (plc != null)
+            {
+                var task = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", taskNo), "TN_I_TASK_MST");
+                CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鏀跺埌淇″彿4锛屾煡璇换鍔′俊鎭細{JsonConvert.SerializeObject(task)}銆�);
+                var machine = MongoDBSingleton.Instance.FindOne<WMSInfo>(Query.EQ("trayCode", task.CN_S_BATCH_NO), "WMSInfo");
+                CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鏀跺埌淇″彿4锛屾煡璇MSInfo琛ㄤ俊鎭細{JsonConvert.SerializeObject(machine)}銆�);
+                if (machine != null)
+                {
+                    //int[] num = DiePan(machine);
+                    //CMMLog.Info($"send num:{JsonConvert.SerializeObject(num)}");
+                    //var wirteall01 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                    //{
+                    //    addr = plc.writeAddr + 10,
+                    //    host = plc.ip,
+                    //    port = plc.port,
+                    //    data = num
+                    //});
+
+                    WriteCacheStackingData(plc, task, machine);
+
+
+                    var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    {
+                        addr = plc.writeAddr + 1,
+                        host = plc.ip,
+                        port = plc.port,
+                        data = 2
+                    });
+                }
+            }
+        }
+
+        #region   3妤煎弻灞傜紦瀛樿揣鏋跺埌涓夋ゼ鍙犳墭鍙b�鈥旈渶鍥炴姤WMS浠诲姟鐘舵�鈥斺�3妤肩紦瀛樻灦鍏ュ彔鎵樷�鈥斿崐瀹屾垚锛堝緟娴嬭瘯锛�+
+        /// <summary>
+        /// 鍒ゆ柇涓夋ゼ鍙犳墭鍙f槸鍚︽湁鍏佽涓婃枡璇锋眰锛堥�閬�鍙傛暟1锛夛紝鏈夊氨璋僕MS鐢熸垚缂撳瓨鏋跺埌鍙犳墭鍙d换鍔�+        /// </summary>
+        /// <param name="pmInfo"></param>
+        internal static void CacheStackingMouth(Settings.PlcInfo pmInfo)
+        {
+            //闇�璁剧疆鏃堕棿寤惰繜
+            try
+            {
+                //璇诲彇閫氶亾1閲岄潰鍙傛暟鏄惁涓�锛屽垽鏂彔鐩樻満鏄惁闇�涓婃枡
+                var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    addr = pmInfo.readAddr + 1,
+                    host = pmInfo.ip,
+                    port = pmInfo.port
+                });
+                if (result != null && result.errCode == 0)
+                {
+                    //鍙傛暟1琛ㄧず鍙犳墭鐐圭敵璇峰叆鏂�+                    if (result.result[0] == 1)
+                    {
+                        var tasks = MongoDBSingleton.Instance.Find<TN_I_TASK_MST>(Query.EQ("CN_S_END_BIT", pmInfo.location), "TN_I_TASK_MST");
+                        //鍒ゆ柇涓�笅褰撳墠鍙犳墭鐐规槸鍚︽湁浠诲姟鍗犵敤
+                        if (ProcessHelper.CheckEndFree(pmInfo.location) && tasks.Count == 0)
+                        {
+                            //鍙互鐢熸垚浠诲姟锛岃皟WMS鎺ュ彛鑾峰彇浠诲姟淇℃伅
+                            bool req = WMSHelper.WMSOut(pmInfo.location, "");
+                            if (req) CMMLog.Debug($"璋冪敤WMS鑾峰彇纰熺洏鍑哄簱鐢熸垚浠诲姟鎴愬姛锛�);//鐜板湪浠诲姟鐢盬MS鑷繁涓嬪彂锛孉MS鍋氭嫤鎴鐞嗭紙鏌ヨext1閲岄潰瀵瑰簲鐨勪换鍔$被鍨嬶紝骞舵洿鏀逛换鍔$被鍨嬶級
+                            else CMMLog.Debug($"璋冪敤WMS鑾峰彇纰熺洏鍑哄簱鐢熸垚浠诲姟澶辫触锛�);
+                        }
+                        else CMMLog.Debug($"妫�煡褰撳墠鍙犳墭鐐规槸鍚︽湁浠诲姟鍗犵敤锛屾垨鑰匨ST涓昏〃涓湁缂撳瓨鏋跺叆鍙犵洏鏈虹殑浠诲姟锛�);
+                    }
+                }
+                else CMMLog.Debug($"缂撳瓨鍏ュ彔鐩樻満锛屽垱寤轰换鍔★紝result={result.errMsg}");
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error(ex.Message, ex);
+            }
+        }
+
+        #region   涓夋ゼ鍙犳墭鏈轰氦浜�+
+        /// <summary>
+        /// 璇锋眰杩涘叆涓夋ゼ鍙犳墭鏈�+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="taskNo"></param>
+        internal static void CacheStackingMouth1013(string ip,string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == ip).FirstOrDefault();
+            if(plc != null)
+            {
+                var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                {
+                    addr = plc.writeAddr + 1,
+                    host = plc.ip,
+                    port = plc.port,
+                    data = 2
+                });
+
+                var readres = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    addr = plc.readAddr + 1,
+                    host = plc.ip,
+                    port = plc.port
+                });
+                if (readres.result[0] == 0 || readres.result[0] == 1)
+                {
+                    wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    {
+                        addr = plc.writeAddr + 1,
+                        host = plc.ip,
+                        port = plc.port,
+                        data = 1
+                    });
+                }
+                else if (readres.result[0] == 2)
+                {
+                    TSHelper.GoToAGV(taskNo, 10, 3);
+                    //var task = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", taskNo), "TN_I_TASK_MST");
+                    //var machine = MongoDBSingleton.Instance.FindOne<WMSInfo>(Query.EQ("trayCode", task.CN_S_BATCH_NO), "WMSInfo");
+                    //if (machine != null)
+                    //{
+                    //    if (Settings.cacheStackWrite == "0")
+                    //    {
+                    //        int[] num = DiePan(machine);
+                    //
+                    //        var wirteall01 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                    //        {
+                    //            addr = plc.writeAddr + 10,
+                    //            host = plc.ip,
+                    //            port = plc.port,
+                    //            data = num
+                    //        });
+                    //    }
+                    //    else WriteCacheStackingData(plc, task, machine);
+                    //
+                    //    var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    //    {
+                    //        addr = plc.writeAddr + 1,
+                    //        host = plc.ip,
+                    //        port = plc.port,
+                    //        data = 2
+                    //    });
+                    //}
+                }
+            }
+            else CMMLog.Debug($"缂撳瓨鍏ュ彔鐩樻満锛�013锛宲lc=null!");
+        }
+
+        public static void WriteCacheStackingData(Settings.PlcInfo plc, TN_I_TASK_MST task, WMSInfo machine)
+        {
+            if (plc.deviceType == "23")
+            {
+                //鍥涢挻杞﹂棿
+                var machineTwo = MongoDBSingleton.Instance.FindOne<MachineInfoTwoTetracobalt>(Query.EQ("trayCode", task.CN_S_BATCH_NO), "MachineInfoTwo");
+                CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鏀跺埌淇″彿4锛屾煡璇achineInfoTwoTetracobalt琛ㄤ俊鎭細{JsonConvert.SerializeObject(machineTwo)}銆�);
+                if (machineTwo != null)
+                {
+                    CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鑾峰彇鏁版嵁锛歿JsonConvert.SerializeObject(machineTwo)},IPort:{plc.ip},{plc.port}");
+                    int[] num = DiePanTwoTetracobalt(machine, machineTwo);
+                    CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鍐欏叆鏁版嵁锛歿JsonConvert.SerializeObject(num)},IPort:{plc.ip},{plc.port}");
+                    var wirteall01 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                    {
+                        addr = plc.writeAddr + 10,
+                        host = plc.ip,
+                        port = plc.port,
+                        data = num
+                    });
+                    CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�杩斿洖鏁版嵁锛歿JsonConvert.SerializeObject(wirteall01)},IPort:{plc.ip},{plc.port}");
+                    if (wirteall01.errCode == 0)
+                    {
+                        MongoDBSingleton.Instance.Remove<MachineInfoTwoTetracobalt>(Query.EQ("trayCode", task.CN_S_BATCH_NO), "MachineInfoTwo", RemoveFlags.Single);
+                    }
+                }
+            }
+            else
+            {
+                var machineTwo = MongoDBSingleton.Instance.FindOne<MachineInfoTwo>(Query.EQ("trayCode", task.CN_S_BATCH_NO), "MachineInfoTwo");
+                CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鏀跺埌淇″彿4锛屾煡璇achineInfoTwo琛ㄤ俊鎭細{JsonConvert.SerializeObject(machineTwo)}銆�);
+                if (machineTwo != null)
+                {
+                    CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鑾峰彇鏁版嵁锛歿JsonConvert.SerializeObject(machineTwo)},IPort:{plc.ip},{plc.port}");
+                    int[] num = DiePanTwo(machine, machineTwo);
+                    CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鍐欏叆鏁版嵁锛歿JsonConvert.SerializeObject(num)},IPort:{plc.ip},{plc.port}");
+                    var wirteall01 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                    {
+                        addr = plc.writeAddr + 10,
+                        host = plc.ip,
+                        port = plc.port,
+                        data = num
+                    });
+                    CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�杩斿洖鏁版嵁锛歿JsonConvert.SerializeObject(wirteall01)},IPort:{plc.ip},{plc.port}");
+                    if (wirteall01.errCode == 0)
+                    {
+                        MongoDBSingleton.Instance.Remove<MachineInfoTwo>(Query.EQ("trayCode", task.CN_S_BATCH_NO), "MachineInfoTwo", RemoveFlags.Single);
+                    }
+                }
+            }
+        }
+
+        private static int[] DiePanTwoTetracobalt(WMSInfo machine, MachineInfoTwoTetracobalt machineInfoTwo)
+        {
+
+            var ErpItemInfo = MongoDBSingleton.Instance.FindOne<ERPItemTable>(Query.EQ("item_code", machineInfoTwo.materialCode), "ERPItemTable");
+            CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鏀跺埌淇″彿5锛屾煡璇achineInfoTwoTetracobalt琛ㄤ俊鎭細{JsonConvert.SerializeObject(ErpItemInfo)}銆�);
+
+            //鍋忕Щ閲�+11 閫氶亾鑼冨洿锛�40311 ~ 40390
+            CMMLog.Info($"鍙犵洏鏈烘暟鎹鐞�");
+            //10~19閫氶亾
+            int[] num = new int[105];//鎬婚暱搴︼細80
+
+            #region   0~23 => 6~29
+            int a = 0;//鍛樺伐缂栧彿澶勭悊
+            for (int b = 0; b <= 4; b++)
+            {
+                num[b] = int.Parse(AsciiToTen(machineInfoTwo.empCode.Substring(a, 2)));
+            }
+
+            a = 0;//鎵樼洏鐮佸鐞�+            for (int b = 5; b <= 7; b++)
+            {
+                num[b] = int.Parse(AsciiToTen(machine.trayCode.Substring(a, 2)));
+                a = a + 2;
+            }
+            num[8] = int.Parse(AsciiToTen(machine.location));//鍖呰鏈哄彿
+            for (int b = 9; b <= 10; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.productWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 11; b <= 12; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machineInfoTwo.trayCodeWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 13; b <= 14; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.oneTrayWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 15; b <= 16; b++) num[b] = 0;// 鍙犲寘鍚庡疄闄呴噸閲�&& 澶嶇О缁撴灉 榛樿锛�
+            num[17] = int.Parse(machineInfoTwo.trayType);
+
+            num[18] = machine.addState;//鏄惁闇�鍙犲寘
+            num[19] = int.Parse(machine.packageCode);//琚嬪彿
+            for (int b = 20; b <= 21; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machineInfoTwo.productTime), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+
+            //鏃堕棿鎴冲鐞�+            num[22] = 0;
+            num[23] = 0;
+            #endregion
+
+            string pcHead = "";
+            string cpHead = "";
+            string mtHead = "";// 璁惧鐨勭湡瀹炵墿鏂欑紪鐮�+
+            #region  35~54 => 41~60 浜у搧鎵规鍙�+
+            string data = machineInfoTwo.lotNo;
+            CMMLog.Info($"41~60data1_1:{data}");
+            if (data.Length % 2 != 0)
+            {
+                data = "0" + machineInfoTwo.lotNo;
+                pcHead = "" + machineInfoTwo.lotNo.Substring(0, 1);
+            }
+            CMMLog.Info($"41~60data1_2:{data}");
+            //瀛楃涓查暱搴�/ 2 = 鍐欏叆閫氶亾鏁伴噺(涓や綅涓�浆) 鍒楋細 3L0050 鍐欏叆涓変釜閫氶亾
+            int maxLength = 34 + (data.Length / 2);// data.Length / 2 鑷冲皯涓�1
+            int aa = 0;
+            for (int i = 35; i <= maxLength; i++)
+            {
+                num[i] = int.Parse(AsciiToTen(data.Substring(aa, 2)));
+                aa = aa + 2;
+            }
+            for (int x = maxLength + 1; x <= 54; x++) num[x] = 0;//灏嗕骇鍝佹壒娆″彿鏃犳暟鎹殑閫氶亾鍏ㄩ儴缃负 0
+            #endregion
+
+            #region   55~64 => 61~70 浜у搧鍨嬪彿
+
+            ERPService.HandleItemInfoChina(machine.itemCode, 55, 64, num);// 涓枃澶勭悊 55~64 61~70
+
+            //string data2 = machine.itemCode;
+            //CMMLog.Info($"51~50data2_1:{data2}");
+            //if (data2.Length % 2 != 0)
+            //{
+            //    data2 = "0" + machine.itemCode;
+            //    cpHead = "" + machine.itemCode.Substring(0, 1);
+            //}
+            //CMMLog.Info($"51~60data2_2:{data2}");
+            //maxLength = 39 + (data2.Length / 2);
+            //int aaa = 0;
+            //for (int i = 40; i <= maxLength; i++)
+            //{
+            //    num[i] = int.Parse(AsciiToTen(data2.Substring(aaa, 2)));
+            //    aaa = aaa + 2;
+            //}
+            //for (int x = maxLength + 1; x <= 49; x++) num[x] = 0;//灏嗕骇鍝佸瀷鍙锋棤鏁版嵁鐨勯�閬撳叏閮ㄧ疆涓�
+            #endregion
+
+            #region   65~79 => 71~85 鐗╂枡缂栫爜
+
+            string data3 = machineInfoTwo.materialCode;
+            CMMLog.Info($"71~85 data3_1:{data3}");
+            if (data3.Length % 2 != 0)
+            {
+                //data3 = "0" + machineInfoTwo.materialCode;
+                mtHead = "" + machineInfoTwo.materialCode.Substring(0, 1);
+            }
+            CMMLog.Info($"71~85 data3_2:{data3}");
+            maxLength = 64 + (data3.Length / 2);
+            int aaaa = 0;
+            for (int i = 65; i <= maxLength; i++)
+            {
+                num[i] = int.Parse(AsciiToTen(data3.Substring(aaaa, 2)));
+                aaaa = aaaa + 2;
+            }
+            for (int x = maxLength + 1; x <= 79; x++) num[x] = 0;//灏嗕骇鍝佸瀷鍙锋棤鏁版嵁鐨勯�閬撳叏閮ㄧ疆涓�
+            #endregion
+
+            ERPService.HandleItemInfoChina(ErpItemInfo.item_name, 80, 99, num);// 涓枃澶勭悊 80~99 86~105
+            ERPService.HandleItemInfo(ErpItemInfo.item_uom, 100, 104, num);// 100~104 106~110
+
+            // 濡傛灉 浜у搧鎵规鍙�鎴栬� 浜у搧鍨嬪彿 浣嶆暟 涓�濂囨暟锛屽垯灏嗘彁鍓嶅彇鍑虹殑 棣栧瓧绗�閲嶆柊杞爜 鍐欏叆 鍏舵墍瀵瑰簲閫氶亾鍖哄煙鐨�棣栭�閬�+            if (pcHead != "") num[35] = int.Parse(AsciiToTen(pcHead));
+            if (cpHead != "") num[55] = int.Parse(AsciiToTen(cpHead));
+            if (mtHead != "") num[65] = int.Parse(AsciiToTen(mtHead));
+            if (pcHead != "" || cpHead != "") CMMLog.Info($"浜у搧鍨嬪彿鎴栨壒娆″彿鏁伴噺涓哄鏁帮紝鐗瑰皢棣栦綅鍙栧嚭鍗曠嫭澶勭悊锛屼互涓嬩负鎵规鍙峰拰浜у搧鍨嬪彿鐨勫崄杩涘埗鏁板�{num[35]},{num[55]}");
+
+            CMMLog.Info($"鍙犵洏鏈烘暟鎹鐞嗗畬姣曪細{JsonConvert.SerializeObject(num)}");
+
+            return num;
+        }
+
+        /// <summary>
+        /// 涓夋ゼ鍙犳墭鏈烘壂鐮�+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="taskNo"></param>
+        internal static void CacheStackingMouth1313(string ip,string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == ip).FirstOrDefault();
+            if(plc != null)
+            {
+                OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                {
+                    addr = plc.writeAddr + 1,
+                    host = plc.ip,
+                    data = 2,//4
+                    port = plc.port
+                });
+                Thread.Sleep(100);
+                var readres = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 2,
+                    addr = plc.readAddr + 1,
+                    host = plc.ip,
+                    port = plc.port
+                });
+                if (readres != null)
+                {
+                    var taskInfo = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", taskNo), "TN_I_TASK_MST");
+                    if (readres.result[0] == 3 && readres.result[1] == 1)
+                    {
+                        CMMLog.Debug($"3妤肩紦瀛樻灦鍏ュ彔鎵極K锛歍askNo:{taskInfo.CN_S_TASK_NO},鍙犲寘OK鍐欏叆鍊�銆�);
+                        //璇荤爜淇℃伅姣斿缁撴灉锛歄K           璇诲埌閫氶亾2鍙傛暟涓�鏃�灏忚溅灏嗘墭鐩樻斁缃湪鍙犵洏鏈轰笂锛堟敼鍙傛暟10涓�锛�+                        var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                        {
+                            addr = plc.writeAddr + 1,
+                            host = plc.ip,
+                            data = 3,//4
+                            port = plc.port
+                        });
+                        if (wirte.errCode == 0)
+                        {
+                            //骞跺垹闄MSInfo涓棿琛ㄤ腑瀵瑰簲鎵樼洏鍙风殑鏁版嵁锛堜篃鍙湪灏忚溅绂诲紑鍙犵洏鏈轰箣鍚庡垹闄わ紝鏆傚畾閫氶亾2鍙傛暟1锛�+                            CMMLog.Debug($"璇荤爜淇℃伅姣斿缁撴灉锛歄K ,骞跺垹闄MSInfo涓棿琛ㄤ腑瀵瑰簲鎵樼洏鍙风殑鏁版嵁");
+                            MongoDBSingleton.Instance.Remove<WMSInfo>(Query.EQ("trayCode", taskInfo.CN_S_BATCH_NO), RemoveFlags.Single);
+                            CMMLog.Debug($"3妤肩紦瀛樻灦鍏ュ彔鎵極K锛歍askNo:{taskInfo.CN_S_TASK_NO},鍙犲寘OK鍐欏叆鍊�銆�);
+                            if (CacheStackingMouth8(plc))
+                            {
+                                CMMLog.Debug($"3妤肩紦瀛樻灦鍏ュ彔鎵極K锛歍askNo:{taskInfo.CN_S_TASK_NO},鍙犲寘OK鍐欏叆鍊兼垚鍔燂紝鏇存敼AGV鍙傛暟10涓�锛岃灏忚溅绂诲紑銆�);
+                                TSHelper.GoToAGV(taskNo, 10, 7);
+                            }
+                        }
+                    }
+                    else if (readres.result[0] == 3 && readres.result[1] == 2)
+                    {
+                        CMMLog.Debug($"璇荤爜淇℃伅姣斿缁撴灉锛氭潯鐮佷笌浼犻�鐨勬暟鎹笉涓�嚧");
+                        //浜屾湡--璋冪敤 WMS 鏀归亾鎺ュ彛 鑾峰彇 鐩爣鐐逛綅锛屽苟 鏇存敼 AGV 绔欑偣
+                        string ChangeBit = WMSHelper.WmsUpdateWay(taskInfo.CN_S_SOURCE_NO, plc.Extend);
+                        if (!string.IsNullOrEmpty(ChangeBit))
+                        {
+                            int[] parms = { StockInstance.Instance.GetAGVCodeForBitCode(taskInfo.CN_S_END_BIT), StockInstance.Instance.GetAGVCodeForBitCode(ChangeBit) };
+                            TSHelper.ChangeParam(taskNo, 1, parms);
+                            TSHelper.GoToAGV(taskNo, 3, 1);// 娉板窞鏍兼灄缇庢洿鏀硅捣鐐瑰眰鏁颁负1-鑽嗛棬涔熼渶瑕佹洿鏀�+
+                            //TSHelper.ChangeParam(taskNo, 1, StockInstance.Instance.GetAGVCodeForBitCode(taskInfo.CN_S_END_BIT));
+                            //TSHelper.ChangeParam(taskNo, 2, StockInstance.Instance.GetAGVCodeForBitCode(ChangeBit));
+                            TSHelper.GoToAGV(taskNo, 10, 8);
+                            MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", taskNo), Update.Set("CN_S_END_BIT", ChangeBit).Set("CN_S_START_BIT", taskInfo.CN_S_END_BIT), "TN_I_TASK_MST", UpdateFlags.None);
+                        }
+                        else CMMLog.Debug($"璋冪敤WMS鏀归亾鎺ュ彛锛屾湭鑾峰彇鍒板彲鐢ㄧ偣浣嶃�");
+                        Console.WriteLine($"璇荤爜淇℃伅姣斿缁撴灉锛氭潯鐮佷笌浼犻�鐨勬暟鎹笉涓�嚧");
+                    }
+                    //PLCControl.CacheStackingMouth6(plc);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鍙犳墭OK鍐欏叆4
+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="taskNo"></param>
+        internal static void CacheStackingMouth6(Settings.PlcInfo plc)
+        {
+            //var readres = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+            //{
+            //    dataNum = 2,
+            //    addr = plc.readAddr + 1,
+            //    host = plc.ip,
+            //    port = plc.port
+            //});
+            //if (readres != null)
+            //{
+
+            //}
+        }
+
+        /// <summary>
+        /// 鍗歌揣绂诲紑涓夋ゼ鍙犳墭鏈�-浜屾湡锛氶渶瑕佸拰TS瀵规帴锛岃灏忚溅 鍗歌揣瀹屾垚绛夊埌 灏忚溅绂诲紑涔嬪悗鍐嶅彂閫�+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="taskNo"></param>
+        internal static bool CacheStackingMouth8(Settings.PlcInfo plc)
+        {
+            bool result = false;
+            var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+            {
+                addr = plc.writeAddr + 1,
+                data = 4,
+                host = plc.ip,
+                port = plc.port
+            });
+            if (wirte.errCode == 0) result = true;
+            return result;
+        }
+        #endregion
+
+        #endregion
+
+        #region   3妤煎寘瑁呮満绌烘墭琛ョ粰3妤煎寘瑁呮満娴佺▼鈥斺�鏃犻渶鍥炴姤WMS浠诲姟鐘舵�鈥斺�3妤煎寘瑁呰ˉ绌衡�鈥斿凡瀹屾垚(寰呮祴璇�
+
+        /// <summary>
+        /// 3妤煎寘瑁呮満琛ョ┖鎵樻祦绋嬧�鈥斾换鍔″紑濮嬪墠锛屽垽鏂寘瑁呮満鏈夋病鏈変笅绾夸俊鍙凤紝骞跺垽鏂綋鍓嶅寘瑁呮満瀵瑰簲鐨勫湴鍫嗕綅鏄惁鏈変换鍔″崰鐢�+        /// </summary>
+        /// <param name="a"></param>
+        internal static void PickUpBlank(Settings.PlcInfo pmInfo)
+        {
+            /* 鍖呰琛ョ┖娴佺▼锛�+             * 璇诲彇 鍖呰鏈�鏄惁闇�琛ョ┖鎵橈紝濡傛灉鏈夎姹傦紝鍒欑户缁垽鏂綋鍓嶅寘瑁呮満鏃犱换鍔″崰鐢紝浠ュ強褰撳墠鍖呰鏈烘墍瀵瑰簲鐨�鍦板爢浣�鏃犱换鍔″崰鐢�+             * 浠诲姟鍒涘缓鏂瑰紡锛氳皟鐢╓MS锛屼紶杈�缁堢偣(褰撳墠鍖呰鏈烘墍瀵瑰簲鐨�鍦板爢浣�
+             * **/
+            try
+            {
+                //璇诲彇杈撳叆瀵勫瓨鍣ㄨ繕鏄緭鍑哄瘎瀛樺櫒寰呭畾,璇诲彇閫氶亾0鐨勬暟鎹�+                var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    addr = pmInfo.readAddr,
+                    host = pmInfo.ip,
+                    port = pmInfo.port
+                });
+                if (result != null && result.errCode == 0)
+                {
+                    //1锛氬彇鏂欙紱3锛氫汉宸ュ彨绌烘墭鐩�+                    if (result.result[0] == 3)
+                    {
+                        CMMLog.Info("鍖呰鏈鸿ˉ绌烘墭娴佺▼锛氬垽鏂寘瑁呮満閫氶亾0鍊间负3");
+                        //绌烘墭搴撳尯 -> 鍖呰鏈哄搴斿湴鍫嗙┖鎵樼紦瀛樹綅
+                        if (ProcessHelper.PickUpEndFree(pmInfo.Extend))
+                        {
+                            bool req = WMSHelper.WMSOut(pmInfo.Extend, "");
+                            if (req)
+                            {
+                                //浠诲姟瀹屾垚涔嬪悗锛岄渶瑕佸浣嶆閫氶亾鏁版嵁涓�0 
+                                var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                                {
+                                    host = pmInfo.ip,
+                                    addr = pmInfo.writeAddr + 2,
+                                    data = 1,
+                                    port = pmInfo.port
+                                });
+                            }
+                        }
+                    }
+                }
+                
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error(ex.Message, ex);
+            }
+        }
+
+        /// <summary>
+        /// 鍖呰琛ョ┖浠诲姟瀹屾垚--澶嶄綅 鏀跺埌涓婄┖淇″彿 涓�0
+        /// </summary>
+        /// <param name="PlcBitCache01"></param>
+        internal static void PickUpBlankComplete(string PlcBitCache01)
+        {
+            string PlcBit01 = PlcBitCache01;
+            var plcInfo = Settings.GetPlcInfo().Where(a => a.location == PlcBit01).FirstOrDefault();
+            var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+            {
+                host = plcInfo.ip,
+                addr = plcInfo.writeAddr + 2,
+                data = 0,
+                port = plcInfo.port
+            });
+        }
+
+        #endregion
+
+        #region   3妤艰ˉ缁欐垚鍝佺┖鎵樺尯鍒�妤兼媶鐩樻満娴佺▼鈥斺�闇�洖鎶MS浠诲姟鐘舵�鈥斺�3妤兼媶鐩樿ˉ绌衡�鈥斿凡瀹屾垚(寰呮祴璇�
+
+        /// <summary>
+        /// 绾跨▼寰幆鏌ヨ鎷嗙洏鏈烘槸鍚﹂渶瑕佽ˉ绌烘墭
+        /// </summary>
+        /// <param name="plc"></param>
+        internal static void CheckPackingLineEmpty(Settings.PlcInfo plc)
+        {
+            //璇籶lc淇″彿锛岀湅鏈夋病鏈夊彨鏂欒姹傦紝鍒ゆ柇鏄惁宸茬粡鏈変换鍔�+            //娌℃湁浠诲姟锛岃皟WMS鐢熸垚绌烘墭琛ュ厖浠诲姟
+            try
+            {
+                //RegisterReadInPut 璇诲彇杈撳叆瀵勫瓨鍣ㄨ繕鏄緭鍑哄瘎瀛樺櫒寰呭畾,璇诲彇閫氶亾1鐨勬暟鎹�+                var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    addr = plc.readAddr+1,
+                    host = plc.ip,
+                    port = plc.port
+                });
+                if (result != null && result.errCode == 0)
+                {
+                    //1.琛ョ┖鎵樼洏
+                    if (result.result[0] == 1)
+                    {
+                        //鍒ゆ柇3妤兼媶鐩樻満锛堣ˉ绌烘墭鐩樼偣浣嶏級缁堢偣鏄惁鏈変换鍔″崰鐢紝娌℃湁鍒欑敓鎴愪换鍔�+                        if (ProcessHelper.CheckEndFree(plc.location))
+                        {
+                            CMMLog.Debug("鎷嗙洏琛ョ┖娴佺▼璋冪敤銆傘�銆�);
+                            string wmstaskno = "";
+                            string traycode = "";
+                            string trayType = "";
+                            if (result.result[1] == 1) trayType = "鐢板瓧鎵�;
+                            else trayType = "宸濆瓧鎵�;
+                            bool req = WMSHelper.WMSEmptyOut(plc.location, "", ref wmstaskno, ref traycode, trayType);
+                            if (req) CMMLog.Debug($"璋冪敤WMS鑾峰彇涓夋ゼ鎷嗙洏鏈虹敓鎴愪换鍔℃垚鍔燂紒");
+                            else CMMLog.Debug($"璋冪敤WMS鑾峰彇涓夋ゼ鎷嗙洏鏈虹敓鎴愪换鍔″け璐ワ紒");
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error(ex.Message, ex);
+            }
+        }
+
+        #region   鎷嗙洏鏈轰氦浜�+
+        /// 灏忚溅璇锋眰鍑烘枡	1	AMS鍐欙紝PLC璇�1-璇锋眰鍑烘枡锛�-鍑烘枡杩涜涓紱3-鍔ㄤ綔瀹屾垚
+        /// 璁惧鍏佽杩涙枡	1	PLC鍐欙紝AMS璇�1-鍏佽杩涙枡锛�-杩涙枡杩涜涓紱3-鍔ㄤ綔瀹屾垚
+        /// <summary>
+        /// 鍚戞媶鐩樻満璇锋眰鍗歌揣
+        /// </summary>
+        /// <param name="ips"></param>
+        internal static void DiscRemoverReqUnload(string ip, string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == ip).FirstOrDefault();
+            if (plc != null)
+            {
+                var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    host = plc.ip,
+                    port = plc.port,
+                    addr = plc.readAddr + 1
+                });
+                if (readRes != null && readRes.errCode == 0)
+                {
+                    if (readRes.result[0] == 0 || readRes.result[0] == 1)
+                    {
+                        //涓嶅厑璁歌繘鏂欙紝ams鍐欏叆璇锋眰鍑烘枡
+                        var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                        {
+                            host = plc.ip,
+                            port = plc.port,
+                            addr = plc.writeAddr + 1,
+                            data = 1
+                        });
+                    }
+                    else if (readRes.result[0] == 2)
+                    {
+                        //璁惧鍏佽杩涙枡
+                        //鏀瑰弬鏁伴�鐭gv
+                        if (TSHelper.GoToAGV(taskNo, 10, 3))
+                        {
+                            WorkFlowAction.TrackLog(taskNo, 10, 1013, "success");
+                            //鏀规垚鍑烘枡杩涜涓�+                            CMMLog.Debug("涓夋ゼ鎷嗙洏鏈猴細灏忚溅姝e湪鍗哥┖鐩樹腑锛�);
+                            var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                host = plc.ip,
+                                port = plc.port,
+                                addr = plc.writeAddr + 1,
+                                data = 2
+                            });
+                        }
+                        else CMMLog.Debug($"涓夋ゼ鎷嗙洏琛ョ┖锛�013锛孴S,10,3,false锛�);
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 灏忚溅鍗歌揣瀹屾垚绂诲紑閫氱煡鎷嗙洏鏈�+        /// </summary>
+        /// <param name="ips"></param>
+        /// <param name="taskNo"></param>
+        internal static bool DiscRemoverUnloadComplete(string ip, string taskNo)
+        {
+            var result = false;
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == ip).FirstOrDefault();
+            if (plc != null)
+            {
+                //1.0 璇诲湴鍧�璁惧鏄惁鍔ㄤ綔瀹屾垚
+                var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    host = plc.ip,
+                    port = plc.port,
+                    addr = plc.readAddr + 1
+                });
+                if (readRes != null && readRes.errCode == 0)
+                {
+                    if (readRes.result[0] == 2)
+                    {
+                        var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                        {
+                            host = plc.ip,
+                            port = plc.port,
+                            addr = plc.writeAddr + 1,
+                            data = 3
+                        });
+                        result = true;
+                        CMMLog.Debug("璇诲彇璁惧銆愬弬鏁颁笉涓�銆戯紝AMS璁剧疆灏忚溅銆愬姩浣滃畬鎴愩�锛岀瓑寰呰澶囥�鍙傛暟涓�銆戞椂鍐嶆敼鍙傛暟閫氱煡agv");
+                    }
+                }
+            }
+            return result;
+        }
+
+        #endregion
+
+        #endregion
+
+        #region   3妤煎彔鐩樻満婊℃墭涓嬬嚎鍏ュ簱娴佺▼鈥斺�闇�洖鎶MS浠诲姟鐘舵�鈥斺�3妤煎彔鐩樹笅绾�-宸插畬鎴�寰呮祴璇�
+
+        /// <summary>
+        /// 绾跨▼寰幆鏌ヨ鍙犵洏鏈烘槸鍚﹂渶瑕佷笅婊℃墭
+        /// </summary>
+        /// <param name="plc"></param>
+        internal static void StackingLineEmpty(Settings.PlcInfo plc)
+        {
+            //璇籶lc淇″彿锛岀湅鏈夋病鏈夊彨鏂欒姹傦紝鍒ゆ柇鏄惁宸茬粡鏈変换鍔�+            //娌℃湁浠诲姟锛岃皟WMS鐢熸垚绌烘墭琛ュ厖浠诲姟
+            try
+            {
+                //RegisterReadInPut 璇诲彇杈撳叆瀵勫瓨鍣ㄨ繕鏄緭鍑哄瘎瀛樺櫒寰呭畾,璇诲彇閫氶亾1鐨勬暟鎹�+                var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 2,
+                    addr = plc.readAddr + 1,
+                    host = plc.ip,
+                    port = plc.port
+                });
+                if (result != null && result.errCode == 0)
+                {
+                    //1.婊℃墭涓嬬嚎
+                    if (result.result[0] == 1)
+                    {
+                        //鍒ゆ柇3妤煎彔鐩樿捣鐐规槸鍚︽湁浠诲姟鍗犵敤锛屾病鏈夊垯鐢熸垚浠诲姟
+                        if (ProcessHelper.CheckStartFree(plc.location))
+                        {
+                            string wmstaskno = "";
+                            string traycode = "";
+                            string trayType = result.result[1] == 1 ? "宸濆瓧鎵� : "鐢板瓧鎵�;
+                            bool req = WMSHelper.WMSIn(plc.location, "", ref wmstaskno, ref traycode,"","",false, trayType);
+                            if (req) CMMLog.Debug($"璋冪敤WMS鑾峰彇涓夋ゼ鍙犵洏鏈虹敓鎴愪换鍔℃垚鍔燂紒");
+                            else CMMLog.Debug($"璋冪敤WMS鑾峰彇涓夋ゼ鍙犵洏鏈虹敓鎴愪换鍔″け璐ワ紒");
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Error(ex.Message, ex);
+            }
+        }
+
+        #region   鍙犵洏鏈轰氦浜�+
+        /// 灏忚溅璇锋眰鍑烘枡	1	AMS鍐欙紝PLC璇�1-璇锋眰鍑烘枡锛�-鍑烘枡杩涜涓紱3-鍔ㄤ綔瀹屾垚
+        /// 璁惧鍏佽杩涙枡	1	PLC鍐欙紝AMS璇�1-鍏佽杩涙枡锛�-杩涙枡杩涜涓紱3-鍔ㄤ綔瀹屾垚
+        /// <summary>
+        /// 鍚戝彔鐩樻満璇锋眰鍙栬揣
+        /// </summary>
+        /// <param name="ips"></param>
+        internal static void StackingReqUnload(string ip, string taskNo)
+        {
+
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == ip).FirstOrDefault();
+            if (plc != null)
+            {
+                var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                {
+                    addr = plc.writeAddr + 1,
+                    host = plc.ip,
+                    port = plc.port,
+                    data = 1
+                });
+
+                var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    host = plc.ip,
+                    port = plc.port,
+                    addr = plc.readAddr + 1
+                });
+                if (readRes != null && readRes.errCode == 0)
+                {
+                    if (readRes.result[0] == 0 || readRes.result[0] == 1)
+                    {
+                        //涓嶅厑璁歌繘鏂欙紝ams鍐欏叆璇锋眰鍑烘枡
+                        var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                        {
+                            host = plc.ip,
+                            port = plc.port,
+                            addr = plc.writeAddr + 1,
+                            data = 1
+                        });
+                    }
+                    else if (readRes.result[0] == 2)
+                    {
+                        //璁惧鍏佽杩涙枡
+                        //鏀瑰弬鏁伴�鐭gv
+                        if (TSHelper.GoToAGV(taskNo, 10, 1))
+                        {
+                            WorkFlowAction.TrackLog(taskNo, 10, 1013, "success");
+                            //鏀规垚鍑烘枡杩涜涓�+                            CMMLog.Debug("涓夋ゼ鍙犵洏鏈猴細灏忚溅姝e湪鍙栨墭鐩樹腑锛�);
+                            var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                host = plc.ip,
+                                port = plc.port,
+                                addr = plc.writeAddr + 1,
+                                data = 2
+                            });
+                        }
+                        else CMMLog.Debug($"涓夋ゼ鍙犵洏鏈猴紝1013锛孴S,10,3,false锛�);
+                    }
+                }
+            }
+
+            #region
+            //var plc = Settings.GetPlcInfo().Where(a => a.deviceType == ip).FirstOrDefault();
+            //if (plc != null)
+            //{
+            //    var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+            //    {
+            //        dataNum = 1,
+            //        host = plc.ip,
+            //        port = plc.port,
+            //        addr = plc.readAddr + 1
+            //    });
+            //    if (readRes != null && readRes.errCode == 0)
+            //    {
+            //        if (readRes.result[0] == 0 || readRes.result[0] == 1)
+            //        {
+            //            //涓嶅厑璁歌繘鏂欙紝ams鍐欏叆璇锋眰鍑烘枡
+            //            var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+            //            {
+            //                host = plc.ip,
+            //                port = plc.port,
+            //                addr = plc.writeAddr + 1,
+            //                data = 1
+            //            });
+            //        }
+            //        else if (readRes.result[0] == 2)
+            //        {
+            //            //璁惧鍏佽杩涙枡
+            //            //鏀瑰弬鏁伴�鐭gv
+            //            if (TSHelper.GoToAGV(taskNo, 10, 3))
+            //            {
+            //                WorkFlowAction.TrackLog(taskNo, 10, 1013, "success");
+            //                //鏀规垚鍑烘枡杩涜涓�+            //                CMMLog.Debug("涓夋ゼ鍙犵洏鏈猴細灏忚溅姝e湪鍙栨墭鐩樹腑锛�);
+            //                var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+            //                {
+            //                    host = plc.ip,
+            //                    port = plc.port,
+            //                    addr = plc.writeAddr + 1,
+            //                    data = 2
+            //                });
+            //            }
+            //            else CMMLog.Debug($"涓夋ゼ鍙犵洏鏈猴紝1013锛孴S,10,3,false锛�);
+            //        }
+            //    }
+            //}
+            #endregion
+        }
+
+        /// <summary>
+        /// 灏忚溅鍙栬揣瀹屾垚绂诲紑閫氱煡鍙犵洏鏈�+        /// </summary>
+        /// <param name="ips"></param>
+        /// <param name="taskNo"></param>
+        internal static bool StackingComplete(string ip, string taskNo)
+        {
+            var result = false;
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == ip).FirstOrDefault();
+            if (plc != null)
+            {
+                //1.0 璇诲湴鍧�璁惧鏄惁鍔ㄤ綔瀹屾垚
+                var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                {
+                    host = plc.ip,
+                    port = plc.port,
+                    addr = plc.writeAddr + 1,
+                    data = 3
+                });
+                result = true;
+                CMMLog.Debug("璇诲彇璁惧銆愬弬鏁颁笉涓�銆戯紝AMS璁剧疆灏忚溅銆愬姩浣滃畬鎴愩�锛岀瓑寰呰澶囥�鍙傛暟涓�銆戞椂鍐嶆敼鍙傛暟閫氱煡agv");
+            }
+            return result;
+        }
+
+        #endregion
+
+        #endregion
+
+        #endregion
+
+        #region   璺ㄦゼ灞備换鍔�+
+        #region   璐х墿鍏ュ簱娴佺▼鈥斺�婊℃墭杞繍
+
+        #region   鏀跺埌鎵撳寘鏈轰笅绾夸俊鍙凤紝鍒ゆ柇鏉′欢鏄惁鍏佽锛岄�鎷╂�涓嬪彂浠诲姟
+        /// <summary>
+        /// 3妤兼墦鍖呮満涓嬬嚎锛屽垽鏂墦鍖呮満鏄惁鐢辩敓鎴愭墦鍖呬笅绾跨殑浠诲姟锛屽鏋滄湁锛岃嚜宸辩敓鎴愪袱鏉′换鍔�+        /// </summary>
+        /// <param name="plc"></param>
+        internal static void CheckPackingLineFull(Settings.PlcInfo plc)
+        {
+            //璇籶lc淇″彿锛岀湅鏈夋病鏈変笅绾胯姹傦紝鍒ゆ柇鏄惁宸茬粡鏈変换鍔�+            //娌℃湁浠诲姟锛岀户缁璸lc锛屽寘瑁呬笅绾跨殑鐗╂枡淇″彿
+            //妫�煡鎵撳寘鏈洪�閬�鏄惁鏈夊嚭鏂欎换鍔′俊鍙凤紝濡傛灉鏈夌敓鎴愬彇鏂欎换鍔°�
+            if (CheckStartFree(plc.location))
+            {
+                try
+                {
+                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 1,
+                        addr = plc.readAddr + 1,
+                        host = plc.ip,
+                        port = plc.port
+                    });
+                    if (result != null && result.errCode == 0)
+                    {
+                        if (result.result[0] == 1)
+                        {
+                            //鑾峰彇MODBUS閫氶亾閲岄潰瀛樻斁鐨勬椂闂存埑
+                            var resultTime = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                            {
+                                addr = plc.readAddr + 10,
+                                host = plc.ip,
+                                port = plc.port,
+                                dataNum = 2
+                            });
+                            if (resultTime.errCode == 0)
+                            {
+                                string wmstaskno = "";
+                                string traycode = "";
+                                if (Settings.packChange == "0")
+                                {
+                                    string timeCuoData = (resultTime.result[0] * 65536 + resultTime.result[1]).ToString();
+                                    CMMLog.Info($"鑾峰彇鍒扮殑MODBUS鏃堕棿鎴筹細{timeCuoData}");
+                                    Console.WriteLine($"鑾峰彇鍒扮殑MODBUS鏃堕棿鎴筹細{timeCuoData}");
+                                    //杩欓噷闇�璋冪敤鐓х浉鏈烘帴鍙o紝鑾峰彇鏁版嵁瀛樺叆涓棿琛紝绛夊埌鍏ュ簱娴佺▼瀹屾垚锛屽皢鏁版嵁浼犻�缁橶MS
+                                    string deviceNo = "";
+                                    var timecuo = TimeCuo(timeCuoData, ref deviceNo);
+                                    if (timecuo != null)
+                                    {
+                                        string timeStamp = timecuo.data.First().timeStamp.ToString();
+                                        string employeeId = timecuo.data.First().employeeID1.ToString();
+                                        // ERP鍙樻洿-璋冪敤ERP鎺ュ彛浼犺緭鐩稿叧鏁版嵁
+                                        if (ERPService.ERPSwitch01 == "1")
+                                        {
+                                            // string employeeId = ERPService.GetEmployeeId(plc.readAddr + 18, plc.ip, plc.port);
+                                            // MongoDBSingleton.Instance.Update<TimeCuoInfoCom>(Query.EQ("timeStamp", int.Parse(timeStamp)), Update.Set("employeeId", employeeId), "TimeCuoInfoCom", UpdateFlags.None);
+                                            
+                                            // if (ERPService.ERPApiFunc(timeStamp))
+                                            //     WMSHelper.WMSIn(plc.location, "time", ref wmstaskno, ref timeStamp, timeStamp, employeeId);
+
+                                            WMSHelper.WMSIn(plc.location, "time", ref wmstaskno, ref timeStamp, timeStamp, employeeId);
+                                        }
+                                        else WMSHelper.WMSIn(plc.location, "time", ref wmstaskno, ref timeStamp, timeStamp);
+                                    }
+                                    else CMMLog.Info($"鏃堕棿鎴虫帴鍙h繑鍥炲�涓虹┖锛�);
+                                }
+                                else if(Settings.packChange == "1")
+                                {
+                                    bool req = WMSHelper.WMSIn(plc.location, "", ref wmstaskno, ref traycode, "");
+                                }
+                            }
+                            else CMMLog.Info($"MODBUS鏃堕棿鎴虫暟鎹繑鍥炲�閿欒锛氳繑鍥炲�瑙f瀽锛歿JsonConvert.SerializeObject(result)}");
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error(ex.Message);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 3妤兼墦鍖呮満涓嬬嚎锛屽垽鏂墦鍖呮満鏄惁鐢辩敓鎴愭墦鍖呬笅绾跨殑浠诲姟锛堝洓閽磋溅闂达級
+        /// </summary>
+        /// <param name="plc"></param>
+        internal static void CheckPackingLineFullTwo(Settings.PlcInfo plc)
+        {
+            //璇籶lc淇″彿锛岀湅鏈夋病鏈変笅绾胯姹傦紝鍒ゆ柇鏄惁宸茬粡鏈変换鍔�+            //娌℃湁浠诲姟锛岀户缁璸lc锛屽寘瑁呬笅绾跨殑鐗╂枡淇″彿
+            //妫�煡鎵撳寘鏈洪�閬�鏄惁鏈夊嚭鏂欎换鍔′俊鍙凤紝濡傛灉鏈夌敓鎴愬彇鏂欎换鍔°�
+            if (CheckStartFree(plc.location))
+            {
+                try
+                {
+                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 1,
+                        addr = plc.readAddr + 1,
+                        host = plc.ip,
+                        port = plc.port
+                    });
+                    if (result != null && result.errCode == 0)
+                    {
+                        if (result.result[0] == 1)
+                        {
+                            //鑾峰彇MODBUS閫氶亾閲岄潰瀛樻斁鐨勬椂闂存埑
+                            var resultTime = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                            {
+                                addr = plc.readAddr + 10,
+                                host = plc.ip,
+                                port = plc.port,
+                                dataNum = 170
+                            });
+                            if (resultTime.errCode == 0)
+                            {
+                                string wmstaskno = "";
+                                TimeCuoInfoComTwo timecuo = TimeCuoTwo(resultTime.result);
+                                if (timecuo != null)
+                                {
+                                    string timeStamp = timecuo.TimeCuo;
+                                    string employeeId = timecuo.employeeId1;
+                                    // ERP鍙樻洿-璋冪敤ERP鎺ュ彛浼犺緭鐩稿叧鏁版嵁
+                                    WMSHelper.WMSIn(plc.location, "time", ref wmstaskno, ref timeStamp, timeStamp, employeeId,true);
+                                }
+                                else CMMLog.Info($"鏃堕棿鎴虫帴鍙h繑鍥炲�涓虹┖锛�);
+                            }
+                            else CMMLog.Info($"MODBUS鏃堕棿鎴虫暟鎹繑鍥炲�閿欒锛氳繑鍥炲�瑙f瀽锛歿JsonConvert.SerializeObject(result)}");
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error(ex.Message);
+                }
+            }
+        }
+        #endregion
+
+        #region   鎵撳寘鏈哄嚭鍙ODBUS浜や簰锛堝紑濮嬪彇鏂欙紝鍙栨枡瀹屾垚锛�+
+        /// 灏忚溅璇锋眰杩涙枡	1	AMS鍐欙紝PLC璇�1-AGV鍒颁綅淇″彿锛�-鍒颁綅鍚庯紝璇锋眰鎺ラ┏婊氬姩锛�-鍙栬揣瀹屾垚锛�+        /// 璁惧鍏佽鍑烘枡	1	PLC鍐欙紝AMS璇�1-璁惧璇锋眰鍑烘枡锛�-鍏佽杩涘叆锛�-纭璐х墿鍙栬蛋锛岄�鍑虹墿鏂欙紱
+
+        ///鎵撳寘绾夸笅绾库�鈥斿皬杞﹀紑濮嬪彇璐�+        internal static void PackingLineUnload1012(string ip, string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == "4").FirstOrDefault();
+            if (plc != null)
+            {
+                try
+                {
+                    var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 1,
+                        addr = plc.readAddr + 1,
+                        host = plc.ip,
+                        port = plc.port
+                    });
+                    if (readRes != null && readRes.errCode == 0)
+                    {
+                        if (readRes.result[0] == 1)
+                        {
+                            var write = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                addr = plc.writeAddr + 1,
+                                data = 1,
+                                host = plc.ip,
+                                port = plc.port
+                            });
+                        }
+                        else if (readRes.result[0] == 2)
+                        {
+                            TSHelper.GoToAGV(taskNo, 10, 1);
+                            var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                addr = plc.writeAddr + 1,
+                                data = 2,
+                                host = plc.ip,
+                                port = plc.port
+                            });
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Info(ex.Message);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鎵撳寘绾夸笅绾库�鈥斿皬杞﹀彇璐у畬鎴�+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="taskNo"></param>
+        internal static void PackingLineComplete4(string ip, string taskNo)
+        {
+            //鍙栬揣瀹屾垚鍚庨渶瑕佽鍙栬澶囨椂闂存埑閲岄潰鐨勬暟鎹紝骞跺皢鍏舵殏瀛樿嚦涓棿琛ㄧ瓑鍒板叆搴撲换鍔″畬鎴愪紶杈撶粰WMS
+            
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == "4").FirstOrDefault();
+            if (plc != null)
+            {
+                try
+                {
+                    var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 1,
+                        addr = plc.readAddr + 1,
+                        host = plc.ip,
+                        port = plc.port
+                    });
+                    if (readRes != null && readRes.errCode == 0)
+                    {
+                        if (readRes.result[0] == 3)
+                        {
+                            var write = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                addr = plc.writeAddr + 1,
+                                data = 3,
+                                host = plc.ip,
+                                port = plc.port
+                            });
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Info(ex.Message);
+                }
+            }
+        }
+        #endregion
+
+        #region   鐢垫瀹夊叏闂ㄥ鎺�+        /// <summary>
+        /// 鍏ュ簱涓�浠诲姟璇锋眰杩涘叆
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="startfloor"></param>
+        internal static void RuKuOne1013(TN_I_TASK_MST mst, int startfloor)
+        {
+            //瀵圭數姊殑modbus閫氶亾杩涜瀹夊叏寮�棬瀵规帴锛�+            //var pmInfo = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "8").FirstOrDefault();
+            var pmInfo = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.location == mst.Ext3).FirstOrDefault();
+            if (pmInfo != null)
+            {
+                try
+                {
+                    //杩涘叆Agv鐘舵�
+                    var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    {
+                        addr = pmInfo.writeAddr + 2,
+                        data = 1,
+                        host = pmInfo.ip,
+                        port = pmInfo.port
+                    });
+                    CMMLog.Debug($"鍐欏叆璁惧{pmInfo.location}閫氶亾{pmInfo.writeAddr + 2}閲岄潰鏁版嵁涓�.");
+                    var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 1,
+                        host = pmInfo.ip,
+                        port = pmInfo.port,
+                        addr = pmInfo.readAddr + 1
+                    });
+                    CMMLog.Debug($"璇诲彇璁惧{pmInfo.location}閫氶亾{pmInfo.readAddr + 1}閲岄潰鏁版嵁涓簕JsonConvert.SerializeObject(readRes)}.");
+                    if (readRes != null && readRes.errCode == 0)
+                    {
+                        //鍒ゆ柇鐢垫鐘舵�鏄惁鏄仠姊姸鎬侊紝鍋滄鐘舵�鍒欏彂瀵瑰簲鐨勪俊鍙�+                        if (readRes.result[0] == 0)
+                        {
+                            int num = startfloor == 1 ? 1 : startfloor == 2 ? 4 : startfloor == 3 ? 6 : 0;
+                            //鍐欏叆鐢垫妤煎眰
+                            wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                addr = pmInfo.writeAddr + 1,
+                                data = num,
+                                host = pmInfo.ip,
+                                port = pmInfo.port
+                            });
+                            CMMLog.Debug($"鍐欏叆璁惧{pmInfo.location}閫氶亾{pmInfo.writeAddr + 1}閲岄潰鏁版嵁涓簕num}.");
+                            //璇诲彇杈撳叆瀵勫瓨鍣ㄨ繕鏄緭鍑哄瘎瀛樺櫒寰呭畾,璇诲彇閫氶亾0鐨勬暟鎹�+                            var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                            {
+                                dataNum = 2,
+                                addr = pmInfo.readAddr + 2,
+                                host = pmInfo.ip,
+                                port = pmInfo.port
+                            });
+                            CMMLog.Debug($"璇诲彇璁惧{pmInfo.location}閫氶亾{pmInfo.readAddr + 2}閲岄潰鏁版嵁涓簕JsonConvert.SerializeObject(result)}.");
+                            if (result != null && result.errCode == 0)
+                            {
+                                if (result.result[0] == 2 && result.result[1] == num)
+                                {
+                                    var eleBit = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), "ElevatorTask");
+                                    //鏀圭粓鐐逛负寮�惎鐨勭數姊�+                                    TSHelper.GoToAGV(mst.CN_S_TASK_NO, 2, StockInstance.Instance.GetAGVCodeForBitCode(eleBit.endBit));
+                                }
+                            }
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error(ex.Message, ex);
+                }
+            }
+            else CMMLog.Info($"璇锋鏌ョ數姊厤缃腑蹇冩湁娌℃湁寮�惎锛屽綋鍓嶇數姊偣浣�{mst.Ext3}");
+        }
+
+        /// <summary>
+        /// 鍏ュ簱涓�浠诲姟璇锋眰閫�嚭
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="endfloor"></param>
+        internal static bool RuKuOne6(TN_I_TASK_MST mst, int endfloor)
+        {
+            bool req = false;
+            //瀵圭數姊殑modbus閫氶亾杩涜瀹夊叏寮�棬瀵规帴锛�+            var pmInfo = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.location == mst.Ext3).FirstOrDefault();
+            if (pmInfo != null)
+            {
+                try
+                {
+                    //鍐欏叆妤煎眰淇″彿鍜屽叧闂ㄤ俊鍙�+                    int floorNum = endfloor == 1 ? 1 : endfloor == 2 ? 4 : endfloor == 3 ? 6 : 0;
+                    int[] num = new int[2] { 4, floorNum };
+                    var writeRes0 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                    {
+                        host = pmInfo.ip,
+                        addr = pmInfo.writeAddr,
+                        data = num,//鍘熷厛鏄�,鍗曚釜鍐欏叆
+                        port = pmInfo.port
+                    });
+                    CMMLog.Debug($"鍐欏叆璁惧{pmInfo.location}閫氶亾{pmInfo.writeAddr}閲岄潰鏁版嵁涓簕JsonConvert.SerializeObject(num)}.");
+                    req = true;
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error(ex.Message, ex);
+                }
+            }
+            else CMMLog.Info($"璇锋鏌ョ數姊厤缃腑蹇冩湁娌℃湁寮�惎锛屽綋鍓嶇數姊偣浣�{mst.Ext3}");
+            return req;
+        }
+
+        /// <summary>
+        /// 鍏ュ簱浜屾浠诲姟璇锋眰杩涘叆
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="startfloor"></param>
+        internal static void RuKuOne1012(TN_I_TASK_MST mst, int endfloor)
+        {
+            //瀵圭數姊殑modbus閫氶亾杩涜瀹夊叏寮�棬瀵规帴锛�+            var eleBit = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), "ElevatorTask");
+            if(eleBit == null) CMMLog.Info($"褰撳墠浠诲姟鏉ユ簮鍙凤細{mst.CN_S_SOURCE_NO}锛岃鍦‥levatorTask琛ㄤ腑鏌ヨ瀛楁taskNo涓哄綋鍓嶄换鍔℃潵婧愬彿");
+            var pmInfo = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.location == eleBit.endBit02).FirstOrDefault();
+            CMMLog.Info($"浜屾浠诲姟 1312  1  bit:{eleBit.endBit02}  deivicetype:{pmInfo.deviceType}");
+            if (pmInfo != null)
+            {
+                try
+                {
+                    int num = endfloor == 1 ? 1 : endfloor == 2 ? 4 : endfloor == 3 ? 6 : 0;
+
+                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 3,
+                        addr = pmInfo.readAddr + 1,
+                        host = pmInfo.ip,
+                        port = pmInfo.port
+                    });
+                    CMMLog.Debug($"璇诲彇璁惧{pmInfo.location}閫氶亾{pmInfo.readAddr + 1}閲岄潰鏁版嵁涓簕JsonConvert.SerializeObject(result)}.");
+                    if (result != null && result.errCode == 0)
+                    {
+                        if (result.result[0] == 0 && result.result[1] == 2 && result.result[2] == num)
+                        {
+                            TSHelper.GoToAGV(mst.CN_S_TASK_NO, 1, StockInstance.Instance.GetAGVCodeForBitCode(eleBit.endBit02));
+                        }
+                    }
+
+                    #region
+                    //var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    //{
+                    //    dataNum = 1,
+                    //    addr = pmInfo.readAddr + 5,
+                    //    host = pmInfo.ip,
+                    //    port = pmInfo.port
+                    //});
+                    //var result2 = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    //{
+                    //    dataNum = 1,
+                    //    addr = pmInfo.readAddr + 6,
+                    //    host = pmInfo.ip,
+                    //    port = pmInfo.port
+                    //});
+                    //if (result != null && result2 != null)
+                    //{
+                    //    if (result.result[0] == 1 && result2.result[0] == endfloor)
+                    //    {
+                    //        //TSHelper.GoToAGV(mst.CN_S_TASK_NO, 10, 1);
+                    //        //鏀圭粓鐐逛负寮�惎鐨勭數姊�+                    //        TSHelper.GoToAGV(mst.CN_S_TASK_NO, 1, StockInstance.Instance.GetAGVCodeForBitCode(eleBit.endBit02));
+                    //    }
+                    //}
+                    #endregion
+
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error(ex.Message, ex);
+                }
+            }
+            else CMMLog.Info($"璇锋鏌ョ數姊厤缃腑蹇冩湁娌℃湁寮�惎锛屽綋鍓嶇數姊偣浣�{eleBit.endBit02}");
+        }
+
+        /// <summary>
+        /// 鍏ュ簱浜屾浠诲姟璇锋眰閫�嚭
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="startfloor"></param>
+        internal static bool RuKuOne4(TN_I_TASK_MST mst, int endfloor)
+        {
+            bool req = false;
+            var eleBit = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), "ElevatorTask");
+            if (eleBit == null) CMMLog.Info($"褰撳墠浠诲姟鏉ユ簮鍙凤細{mst.CN_S_SOURCE_NO}锛岃鍦‥levatorTask琛ㄤ腑鏌ヨ瀛楁taskNo涓哄綋鍓嶄换鍔℃潵婧愬彿");
+            var pmInfo = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.location == eleBit.endBit02).FirstOrDefault();
+            CMMLog.Info($"浜屾浠诲姟 1312  2  bit:{eleBit.endBit02}  deivicetype:{pmInfo.deviceType}");
+            if (pmInfo != null)
+            {
+                try
+                {
+                    int[] num = new int[4] { 4, 0,0,0 };
+                    var writeRes0 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                    {
+                        host = pmInfo.ip,
+                        addr = pmInfo.writeAddr,
+                        data = num,//鍘熷厛鏄�,鍗曚釜鍐欏叆
+                        port = pmInfo.port
+                    });
+                    CMMLog.Debug($"鍐欏叆璁惧{pmInfo.location}閫氶亾{pmInfo.writeAddr}閲岄潰鏁版嵁涓簕JsonConvert.SerializeObject(num)}.");
+                    //var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    //{
+                    //    addr = pmInfo.writeAddr + 1,
+                    //    data = 3,
+                    //    host = pmInfo.ip,
+                    //    port = pmInfo.port
+                    //});
+                    req = true;
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error(ex.Message, ex);
+                }
+            }
+            else CMMLog.Info($"璇锋鏌ョ數姊厤缃腑蹇冩湁娌℃湁寮�惎锛屽綋鍓嶇數姊偣浣�{eleBit.endBit02}");
+            return req;
+        }
+        #endregion
+
+        #endregion
+
+        #region   鐢垫閫夋嫨浠ュ強鐢垫鐐逛綅璧嬪�
+
+        /// <summary>
+        /// 璇诲彇MODBUS杩斿洖鍏佽浣跨敤鐨勭數姊偣浣嶏紝濡傛灉娌℃湁鐢垫鍙互浣跨敤锛岃繑鍥�
+        /// </summary>
+        /// <returns></returns>
+        internal static string ElevatorTaskBit(int bit)
+        {
+            Console.WriteLine("杩涘叆鐢垫閫夋嫨鍒ゆ柇锛�);
+            CMMLog.Info("杩涘叆鐢垫閫夋嫨鍒ゆ柇锛�);
+            string location = "";
+            CMMLog.Info("婊℃墭杞繍娴佺▼锛屽垽鏂笁妤间袱閮ㄧ數姊澶�);
+            //婊℃墭杞繍娴佺▼锛屽垽鏂笁妤间袱閮ㄧ數姊澶�鑾峰彇鍒板彲鐢ㄧ數姊箣鍚庯紝闇�鍒ゆ柇杩欓儴鐢垫鐨勪竴妤间互鍙婁笁妤兼槸鍚︽湁浠诲姟鍗犵敤锛屽鏋滄湁锛屽垯涓嶅彲鐢�
+            var plc = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "8").FirstOrDefault();
+            var plc2 = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "11").FirstOrDefault();
+
+            if(bit == 2)
+            {
+                plc = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "12").FirstOrDefault();
+                plc2 = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "13").FirstOrDefault();
+            }
+
+            if (plc != null || plc2 != null)
+            {
+                if (plc != null)
+                {
+                    CMMLog.Info("杩涘叆3妤肩數姊�鍒ゆ柇鏄惁寮�惎");
+
+                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        addr = plc.readAddr,
+                        dataNum = 1,//鏁版嵁涓暟瑕佸鍔�      addr浠ュ強dataNum鐨勫叿浣撴暟鎹负16涓�+                        host = plc.ip,
+                        port = plc.port
+                    });
+                    if (result != null && result.result.Length > 0)
+                    {
+                        if (result.result[0] == 3)
+                        {
+                            // 鍒ゆ柇褰撳墠鐢垫鐨�涓�ゼ浠ュ強涓夋ゼ 鍧囨病鏈変换鍔″崰鐢紝鍒欏彲浠ヤ娇鐢�+                            // (涓夋ゼ鐢垫涓嶈兘鏈変换鍔℃墽琛屼腑锛屼竴妤肩數姊彇璐у畬鎴愬彲浠ヤ娇鐢�
+                            var oneFloor = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "12").FirstOrDefault();
+                            if (bit == 2)
+                            {
+                                oneFloor = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "8").FirstOrDefault();
+                            }
+                            var startTask = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("Ext3",location), "TN_I_TASK_MST");
+                            bool endTaskState = false;
+                            var endTask = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_START_BIT", oneFloor.location), "TN_I_TASK_MST");
+                            if (endTask != null)
+                            {
+                                if (WorkFlowAction.ExistsTrackLogs(endTask.CN_S_TASK_NO, 1, 4)) endTaskState = true;
+                            }
+                            else endTaskState = true;
+                            if (startTask == null && endTaskState) location = plc.location;
+                        }
+                    }
+                }
+                if (string.IsNullOrEmpty(location) && plc2 != null)
+                {
+                    CMMLog.Info("杩涘叆涓夋ゼ鐢垫2鍒ゆ柇鏄惁寮�惎");
+
+                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        addr = plc2.readAddr,
+                        dataNum = 1,//鏁版嵁涓暟瑕佸鍔�      addr浠ュ強dataNum鐨勫叿浣撴暟鎹负16涓�+                        host = plc2.ip,
+                        port = plc2.port
+                    });
+                    CMMLog.Info($"鑾峰彇鐢垫鐘舵�锛歿JsonConvert.SerializeObject(result)}");
+                    if (result != null && result.result.Length > 0)
+                    {
+                        if (result.result[0] == 3)
+                        {
+                            // 鍒ゆ柇褰撳墠鐢垫鐨�涓�ゼ浠ュ強涓夋ゼ 鍧囨病鏈変换鍔″崰鐢紝鍒欏彲浠ヤ娇鐢�+                            var oneFloor = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "13").FirstOrDefault();
+                            if (bit == 2)
+                            {
+                                oneFloor = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "11").FirstOrDefault();
+                            }
+                            var startTask = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("Ext3", location), "TN_I_TASK_MST");
+                            bool endTaskState = false;
+                            var endTask = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_START_BIT", oneFloor.location), "TN_I_TASK_MST");
+                            if (endTask != null)
+                            {
+                                if (WorkFlowAction.ExistsTrackLogs(endTask.CN_S_TASK_NO, 1, 4)) endTaskState = true;
+                                
+                            }
+                            else endTaskState = true;
+                            if (startTask == null && endTaskState) location = plc2.location;
+                        }
+                    }
+                }
+                if (location == "")
+                {
+                    Console.WriteLine("鏃犵數姊紑鍚紒");
+                    CMMLog.Info("鏃犵數姊紑鍚紒");
+                    location = "0";
+                }
+            }
+            else
+            {
+                CMMLog.Info("妫�煡閰嶇疆鏂囦欢閲岄潰涓ら儴鐢垫鏄惁鏈夊紑鍚紒");
+                return "0";
+            }
+            Console.WriteLine("鐢垫閫夋嫨鍒ゆ柇缁撴潫锛�);
+            CMMLog.Info("鐢垫閫夋嫨鍒ゆ柇缁撴潫锛�);
+            return location;
+        }
+        /// <summary>
+        /// 鑾峰彇鐢垫鐐逛綅璧嬪�
+        /// </summary>
+        /// <param name="eleBit"></param>
+        /// <returns></returns>
+        internal static string ElevatorTaskBit02(string eleBit)
+        {
+            CMMLog.Info("璧嬪�闃舵2浠诲姟鐢垫璧风偣");
+            string bit = "";
+            if (eleBit != "")
+            {
+                CMMLog.Info("涓ら儴鐢垫锛屽洓涓厤缃潎闇�寮�惎");
+                //1鍙风數姊笁妤煎拰涓�ゼ鐢垫鐐逛綅
+                var plc = Settings.GetPlcInfo().Where(a => a.deviceType == "8").FirstOrDefault();
+                var plc2 = Settings.GetPlcInfo().Where(a => a.deviceType == "12").FirstOrDefault();
+                //2鍙风數姊笁妤煎拰涓�ゼ鐢垫鐐逛綅
+                var plc3 = Settings.GetPlcInfo().Where(a => a.deviceType == "11").FirstOrDefault();
+                var plc4 = Settings.GetPlcInfo().Where(a => a.deviceType == "13").FirstOrDefault();
+                if (eleBit == plc.location) bit = plc2.location;
+                else if(eleBit == plc2.location) bit = plc.location;
+                else if(eleBit == plc3.location) bit = plc4.location;
+                else if(eleBit == plc4.location) bit = plc3.location;
+            }
+            else CMMLog.Info("EleBit is  null!");
+            CMMLog.Info("鑾峰彇鐢垫浜屾浠诲姟鐢垫鐐逛綅锛�+bit);
+            return bit;
+        }
+        internal static void ElevatorTaskFloor(int startFloor,string bit)
+        {
+            CMMLog.Info($"缁堢偣瀹夊叏瀵规帴:鐢垫鍗歌揣:鍛煎彨妤煎眰:{startFloor},褰撳墠鐢垫鐐逛綅锛歿bit}");
+
+            var pmInfo = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.location == bit).FirstOrDefault();
+            if (pmInfo != null)
+            {
+                int[] num = new int[4] { startFloor, 0, 1, 1 };
+                var writeRes0 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                {
+                    host = pmInfo.ip,
+                    addr = pmInfo.writeAddr,
+                    data = num,//鍘熷厛鏄�,鍗曚釜鍐欏叆
+                    port = pmInfo.port
+                });
+            }
+            else CMMLog.Info($"缁堢偣瀹夊叏瀵规帴:鐢垫鍗歌揣:鏈綋鍓嶇數姊偣浣嶇殑閰嶇疆鏁版嵁锛歿bit}");
+
+
+
+            //var write = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+            //{
+            //    addr = pmInfo.writeAddr+2,
+            //    data = 1,
+            //    host = pmInfo.ip,
+            //    port = pmInfo.port
+            //});
+            //var write0 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+            //{
+            //    addr = pmInfo.writeAddr,
+            //    data = startFloor,
+            //    host = pmInfo.ip,
+            //    port = pmInfo.port
+            //});
+        }
+        #endregion
+
+        #endregion
+
+        public static DateTime TenMin = DateTime.MinValue;
+        /// <summary>
+        /// 姣忛殧鍗佸垎閽熷線鎵�湁寮�惎鐨勬墦鍖呬笅绾垮彛MODBUS閫氶亾閲岄潰鍐欏皬杞︾數閲�+        /// 鍏跺疄鍦板潃26锛岃繛缁線閲岄潰鍐欏叆鍥涗釜鍊�+        /// </summary>
+        internal static void WriteBattery()
+        {
+            CMMLog.Info("鍐欏叆灏忚溅鐢甸噺锛氳繘鍏ュ啓鍏ョ數閲忎俊鎭祦绋嬶紒");
+            //Console.WriteLine("鍐欏叆灏忚溅鐢甸噺锛氳繘鍏ュ啓鍏ョ數閲忎俊鎭祦绋嬶紒");
+            if(TenMin == DateTime.MinValue) TenMin = DateTime.Now;
+            else if (DateTime.Now.Subtract(TenMin).TotalMinutes >= 10)
+            {
+                Console.WriteLine("鍐欏叆灏忚溅鐢甸噺锛氬啓鍏ユ墍鏈夊紑鍚殑鎵撳寘涓嬬嚎鍙ODBUS閫氶亾鐢甸噺鍊�骞堕噸缃椂闂翠负褰撳墠鏃堕棿");
+                CMMLog.Info("鍐欏叆灏忚溅鐢甸噺锛氬啓鍏ユ墍鏈夊紑鍚殑鎵撳寘涓嬬嚎鍙ODBUS閫氶亾鐢甸噺鍊�骞堕噸缃椂闂翠负褰撳墠鏃堕棿");
+                //鍐欏叆鎵�湁寮�惎鐨勬墦鍖呬笅绾垮彛MODBUS閫氶亾鐢甸噺鍊�骞堕噸缃椂闂翠负褰撳墠鏃堕棿
+                //鑾峰彇鎵�湁鐢甸噺鍊�+                int[] num = ProcessHelper.GetBatteryHang();
+                CMMLog.Info($"鍐欏叆灏忚溅鐢甸噺锛氬啓鍏ユ暟鎹細{JsonConvert.SerializeObject(num)}");
+                Console.WriteLine($"鍐欏叆灏忚溅鐢甸噺锛氬啓鍏ユ暟鎹細{JsonConvert.SerializeObject(num)}");
+                var PlcInfo04 = Settings.GetPlcInfo().Where(a => a.enable == 1 && a.deviceType == "4").FirstOrDefault();//plcInfo
+                if (PlcInfo04 != null)
+                {
+                    var wirteall = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                    {
+                        addr = PlcInfo04.writeAddr + 5,
+                        host = PlcInfo04.ip,
+                        data = num,
+                        port = PlcInfo04.port
+                    });
+                }
+                TenMin = DateTime.Now;
+            }
+        }
+        #region   鏁版嵁澶勭悊涓氬姟
+
+        /// <summary>
+        /// 鑾峰彇璁惧鐨勫寘瑁呯墿鏂欎俊鎭�骞跺啓鍏ヤ腑闂磋〃)
+        /// </summary>
+        /// <param name="info"></param>
+        /// <param name="result"></param>
+        /// <param name="noPack">true : MES浜や簰鏂瑰紡  false : 鏃燤ES浜や簰鏂瑰紡</param>
+        private static void GetMachineData(int[] result, ref string loc, bool noPack = true)
+        {
+            CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氳繘鍏ユ暟鎹鐞嗘祦绋嬶紒");
+            
+            string trayCode = GetTrayCode(result.Take(3).ToArray());//鎵樼洏鐮�+            string location = GetTrayCode(result.Skip(3).Take(1).ToArray());//璁惧璐т綅缂栫爜
+            loc = location;
+            if(trayCode != null && location != null)
+            {
+                CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛歵rayCode:{trayCode},location:{location}");
+                var json = "";
+                if (!noPack)
+                {
+                    CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氬寘瑁呮満鏃燤ES鎯呭喌涓嬶紝鑷姩鐢熸垚浠ュ綋鍓嶅寘瑁呮満鍙穥location}涓洪鐨勬暟鎹�);
+                    var task = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.EQ("machineNo", location), "MachineInfo");
+                    if(task == null)
+                    {
+                        MongoDBSingleton.Instance.Insert<MachineInfo>(new MachineInfo
+                        {
+                            machineNo = location
+                        });
+                        MongoDBSingleton.Instance.Insert<MachineInfoTwo>(new MachineInfoTwo
+                        {
+                            machineNo = location,
+                            trayCode = trayCode
+                        });
+                    }
+                    else CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氬寘瑁呮満鏃燤ES鎯呭喌涓嬶紝妯℃嫙MES鏁版嵁锛屼腑闂磋〃<MachineInfo>涓凡鏈夊綋鍓嶅寘瑁呮満鍙穥location}涓洪鐨勬暟鎹�);
+                }
+                var info = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.EQ("machineNo", location), "MachineInfo");
+
+                if (info != null)
+                {
+                    CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛歩nfo:{info}");
+                    #region   鑾峰彇璁惧閫氶亾淇℃伅
+
+                    #region   杞崲鍚�+                    info.location = location;
+                    info.trayCode = trayCode;
+                    //鑾峰彇閲嶉噺 鍙犲寘绛夊叾瀹冧俊鎭�+                    info.productWeight = Convert.ToInt32(Completion(result[4]) + Completion(result[5]), 2).ToString();
+                    // ERP鍙樻洿锛氭牴鎹渶鏂颁俊鍙峰崗璁� trayCodeWeight 鍙樻洿涓�銆愬憳宸ョ紪鍙枫�閫氶亾
+                    info.trayCodeWeight = Convert.ToInt32(Completion(result[6]) + Completion(result[7]), 2).ToString();
+                    info.oneTrayWeight = Convert.ToInt32(Completion(result[8]) + Completion(result[9]), 2).ToString();
+                    info.addWeight = Convert.ToInt32(Completion(result[10]) + Completion(result[11]), 2).ToString();
+                    info.packNg = 1;//涓嶉渶瑕佹鍙傛暟 result[12]
+                    info.secondNg = Convert.ToInt32(Completion(result[13]), 2);
+                    info.addState = Convert.ToInt32(Completion(result[14]), 2);
+                    if (info.addState == 0) CMMLog.Error($"鏁版嵁澶勭悊娴佺▼锛氳幏鍙朚ODBUS淇℃伅寮傚父:鏄惁鍙犲寘鍊间负0.");
+                    info.packageCode = Convert.ToInt32(Completion(result[15]), 2).ToString();
+
+                    CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氳幏鍙朚ODBUS杞崲鍚庣殑鏁版嵁淇℃伅锛歭ocation:{info.location},trayCode:{info.trayCode},productWeight:{info.productWeight}" +
+                        $",trayCodeWeight:{info.trayCodeWeight},oneTrayWeight:{info.oneTrayWeight},addWeight:{info.addWeight}" +
+                        $",packNg:{info.packNg},secondNg:{info.secondNg},addState:{info.addState},packageCode:{info.packageCode}");
+
+                    #endregion
+
+                    #region   杞崲鍓�+                    for (int i = 0; i <= 15; i++)
+                    {
+                        info.machinedown[i] = result[i];
+                    }
+                    //灏嗘暟缁勬暟鎹帴鍙楄浆鎹负JSON鏁版嵁骞跺湪鍚庣画鏂规硶鍒ゆ柇涓瓨鍏ヤ腑闂磋〃
+                    json = JsonConvert.SerializeObject(info.machinedown);
+                    CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氳幏鍙朚ODBUS杞崲鍓嶇殑鏁版嵁淇℃伅锛歿json}");
+                    #endregion
+
+                    #endregion
+                }
+                else CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氳鏌ヨ<MachineInfo>琛ㄤ腑machineNo瀛楁鏄惁涓哄綋鍓嶅寘瑁呮満鍙凤紝骞朵笖trayCode鏄惁涓�");
+
+                var infoPack = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.And(Query.EQ("machineNo", location), Query.EQ("trayCode", "0")), "MachineInfo");
+
+                if (infoPack != null)
+                {
+                    //鍖呰鏈轰笅绾胯嚦澶嶇О锛岃鍙栧寘瑁呮満骞冲彴鏁版嵁
+                    CMMLog.Info("鏁版嵁澶勭悊娴佺▼锛氳繘鍏nfo鍒ゆ柇01");
+                    //AMS鍖呰鏈轰笅绾块鍏堣皟鐢∕ES锛屼箣鍚庤幏鍙栨柊鐨勮澶囨暟鎹瓨鍏ヤ腑闂磋〃
+                    //鏍规嵁鎵樼洏鍙疯幏鍙栨寚瀹氱殑閫氶亾鐨凧SON鏁版嵁锛屽皢鍏惰浆鎹负鏁扮粍绫诲瀷鈥斺�鍐欏叆閫氶亾鏁版嵁鏃朵細浣跨敤
+                    //var arr = JsonConvert.DeserializeObject<List<int>>(json);
+                    if(!noPack)
+                    {
+                        CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氬寘瑁呮満鏃燤ES鎯呭喌涓嬶紝鑾峰彇浠ュ線MES浼犺緭鐨勬暟鎹紝骞跺師鏍峰啓鍏ュ師鍏圡ES瀛楁涓�");
+
+                        //info.lotNo = RemoveNull(GetTrayCode(result.Skip(20).Take(30).ToArray()).Trim().ToString());
+                        //info.productType = RemoveNull(GetTrayCode(result.Skip(50).Take(10).ToArray()).Trim().ToString());
+                        //info.materialCode = RemoveNull(GetTrayCode(result.Skip(60).Take(20).ToArray()).Trim().ToString());
+
+                        info.lotNo = RemoveNull(GetTrayCode(result.Skip(20).Take(20).ToArray()).Trim().ToString());
+                        // info.productType = RemoveNull(GetTrayCode(result.Skip(40).Take(10).ToArray()).Trim().ToString());
+                        info.productType = "";
+                        info.materialCode = RemoveNull(GetTrayCode(result.Skip(50).Take(20).ToArray()).Trim().ToString());
+
+                        CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氬寘瑁呮満鏃燤ES鎯呭喌涓嬶紝鑾峰彇浠ュ線MES浼犺緭鐨勬暟鎹紝鏂拌幏寰楁暟鎹紝lotNo:{info.lotNo},productType:{info.productType},materialCode:{info.materialCode}");
+                        
+
+                        //娉ㄦ剰锛氳繖閲岃祴鍊间腑闂磋〃鍙傛暟璇峰鐓т俊鎭氦浜掕〃鍏蜂綋閫氶亾鍊煎搴�+                        UpdateBuilder update = Update.Set("palletLayers", info.secondNg.ToString()).Set("overlappingLayers", info.addState.ToString()).Set("bagNo", info.packageCode).
+                            Set("lotNo", info.lotNo).Set("productType", info.productType).Set("materialCode", info.materialCode);
+                        MongoDBSingleton.Instance.Update<MachineInfo>(Query.EQ("machineNo", location), update, "MachineInfo", UpdateFlags.None);
+                        MongoDBSingleton.Instance.Update<MachineInfoTwo>(Query.EQ("trayCode", trayCode), update, "MachineInfoTwo", UpdateFlags.None);
+                    }
+                    //鍦ㄤ腑闂磋〃涓壘鍒板垰鍒氭彃鍏ョ殑MES鏁版嵁锛堢洰鍓嶈繕娌℃湁璇诲彇骞跺啓鍏ヨ澶囨暟鎹級
+                    var query1 = Query.And(Query.EQ("machineNo", location), Query.EQ("trayCode", "0"));
+                    UpdateBuilder updateBuider = Update.Set("location", info.location).
+                        Set("trayCode", info.trayCode).Set("productWeight", info.productWeight).
+                        Set("trayCodeWeight", info.trayCodeWeight).Set("oneTrayWeight", info.oneTrayWeight).
+                        Set("addWeight", info.addWeight).Set("packNg", info.packNg).Set("secondNg", info.secondNg).Set("addState", info.addState).
+                        Set("packageCode", info.packageCode).Set("jsonData", json).Set("modify", DateTime.Now);
+                    MongoDBSingleton.Instance.Update<MachineInfo>(query1, updateBuider, "MachineInfo", UpdateFlags.None);
+                    MongoDBSingleton.Instance.Update<MachineInfoTwo>(Query.EQ("trayCode", trayCode), updateBuider, "MachineInfoTwo", UpdateFlags.None);
+                    CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氭洿鏂癕achineInfo涓棿琛ㄥ垰鍒氭彃鍏ョ殑MES鏁版嵁!璁惧鍙蜂负锛歿location},鎵樼洏鍙蜂负锛歿trayCode}");
+                }
+                else
+                {
+                    //澶嶇О鍏ョ紦瀛樻灦锛岃鍙栧绉板钩鍙版暟鎹�+                    CMMLog.Info("鏁版嵁澶勭悊娴佺▼锛氳繘鍏nfo鍒ゆ柇02");
+                    //璇诲彇闄ゅ寘瑁呮満澶栧叾浠栬澶囩殑淇℃伅锛屾洿鏂板寘瑁呮満涓嬬嚎鏃剁殑鏁版嵁
+                    var query2 = Query.And(Query.EQ("machineNo", location), Query.EQ("trayCode", trayCode));
+                    var info2 = MongoDBSingleton.Instance.FindOne<MachineInfo>(query2, "MachineInfo");
+                    if (info2 != null)
+                    {
+                        UpdateBuilder updateBuider = Update.Set("location", info.location).
+                        Set("trayCode", info.trayCode).Set("productWeight", info.productWeight).
+                        Set("trayCodeWeight", info.trayCodeWeight).Set("oneTrayWeight", info.oneTrayWeight).
+                        Set("addWeight", info.addWeight).Set("packNg", info.packNg).Set("secondNg", info.secondNg).Set("addState", info.addState).
+                        Set("packageCode", info.packageCode).Set("jsonData", json).Set("modify", DateTime.Now);
+                        MongoDBSingleton.Instance.Update<MachineInfo>(query2, updateBuider, "MachineInfo", UpdateFlags.None);
+                        MongoDBSingleton.Instance.Update<MachineInfoTwo>(Query.EQ("trayCode", trayCode), updateBuider, "MachineInfoTwo", UpdateFlags.None);
+                        CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氭洿鏂癕achineInfo涓棿琛ㄥ叾浠栬澶囩殑鏁版嵁!璁惧鍙蜂负锛歿location},鎵樼洏鍙蜂负锛歿trayCode}");
+                    }
+                    else CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氭棤娉曞湪MachineInfo涓棿琛ㄤ腑鎵惧埌褰撳墠璁惧缂栧彿鐨勬暟鎹紒褰撳墠璁惧缂栧彿涓猴細{location}锛屾墭鐩樼爜涓猴細{trayCode}");
+                }
+            }
+            else CMMLog.Error("鏁版嵁澶勭悊娴佺▼锛氭暟鎹祦绋嬪鐞嗘墭鐩樺彿鎴栧寘瑁呮満鍙蜂负绌哄�锛�);
+
+            CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氭暟鎹鐞嗘祦绋嬬粨鏉燂紒");
+        }
+
+        /// <summary>
+        /// 鑾峰彇璁惧鐨勫寘瑁呯墿鏂欎俊鎭�骞跺啓鍏ヤ腑闂磋〃)
+        /// </summary>
+        /// <param name="info"></param>
+        /// <param name="result"></param>
+        /// <param name="noPack">true : MES浜や簰鏂瑰紡  false : 鏃燤ES浜や簰鏂瑰紡</param>
+        private static void GetMachineDataTetracobalt(int[] result ,bool noPack = true)
+        {
+            CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氳繘鍏ユ暟鎹鐞嗘祦绋嬶紒");
+            
+            string empCode = GetTrayCode(result.Take(5).ToArray());//鍛樺伐缂栫爜
+            string trayCode = GetTrayCode(result.Skip(5).Take(3).ToArray());//鎵樼洏鐮�+            string location = GetTrayCode(result.Skip(8).Take(1).ToArray());//璁惧璐т綅缂栫爜
+            if(trayCode != null && location != null)
+            {
+                CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛歵rayCode:{trayCode},location:{location},empCode:{empCode}");
+                var json = "";
+                if (!noPack)
+                {
+                    CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氬寘瑁呮満鏃燤ES鎯呭喌涓嬶紝鑷姩鐢熸垚浠ュ綋鍓嶅寘瑁呮満鍙穥location}涓洪鐨勬暟鎹�);
+                    var task = MongoDBSingleton.Instance.FindOne<MachineInfoTetracobalt>(Query.EQ("machineNo", location), "MachineInfo");
+                    if(task == null)
+                    {
+                        MongoDBSingleton.Instance.Insert<MachineInfoTetracobalt>(new MachineInfoTetracobalt
+                        {
+                            machineNo = location
+                        });
+                        MongoDBSingleton.Instance.Insert<MachineInfoTwoTetracobalt>(new MachineInfoTwoTetracobalt
+                        {
+                            machineNo = location,
+                            trayCode = trayCode
+                        });
+                    }
+                    else CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氬寘瑁呮満鏃燤ES鎯呭喌涓嬶紝妯℃嫙MES鏁版嵁锛屼腑闂磋〃<MachineInfoTetracobalt>涓凡鏈夊綋鍓嶅寘瑁呮満鍙穥location}涓洪鐨勬暟鎹�);
+                }
+                var info = MongoDBSingleton.Instance.FindOne<MachineInfoTetracobalt>(Query.EQ("machineNo", location), "MachineInfo");
+
+                if (info != null)
+                {
+                    CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛歩nfo:{info}");
+                    #region   鑾峰彇璁惧閫氶亾淇℃伅
+
+                    #region   杞崲鍚�+                    info.empCode = empCode;
+                    info.location = location;
+                    info.trayCode = trayCode;
+                    //鑾峰彇閲嶉噺 鍙犲寘绛夊叾瀹冧俊鎭�+                    info.productWeight = Convert.ToInt32(Completion(result[9]) + Completion(result[10]), 2).ToString();
+                    // ERP鍙樻洿锛氭牴鎹渶鏂颁俊鍙峰崗璁� trayCodeWeight 鍙樻洿涓�銆愬憳宸ョ紪鍙枫�閫氶亾
+                    info.trayCodeWeight = Convert.ToInt32(Completion(result[11]) + Completion(result[12]), 2).ToString();
+                    info.oneTrayWeight = Convert.ToInt32(Completion(result[13]) + Completion(result[14]), 2).ToString();
+                    info.trayType = Convert.ToInt32(Completion(result[17]), 2).ToString();
+                    info.addState = Convert.ToInt32(Completion(result[18]), 2);
+                    if (info.addState == 0) CMMLog.Error($"鏁版嵁澶勭悊娴佺▼锛氳幏鍙朚ODBUS淇℃伅寮傚父:鏄惁鍙犲寘鍊间负0.");
+                    info.packageCode = Convert.ToInt32(Completion(result[19]), 2).ToString();
+                    info.productTime = Convert.ToInt32(Completion(result[21]) + Completion(result[22]), 2).ToString();
+
+                    //info.addWeight = Convert.ToInt32(Completion(result[10]) + Completion(result[11]), 2).ToString();
+                    //info.packNg = 1;//涓嶉渶瑕佹鍙傛暟 result[12]
+                    //info.secondNg = Convert.ToInt32(Completion(result[13]), 2);
+
+                    CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氳幏鍙朚ODBUS杞崲鍚庣殑鏁版嵁淇℃伅锛歟mpCoe:{info.empCode},location:{info.location},trayCode:{info.trayCode},productWeight:{info.productWeight}" +
+                        $",trayCodeWeight:{info.trayCodeWeight},oneTrayWeight:{info.oneTrayWeight},trayType:{info.trayType}" +
+                        $",productTime:{info.productTime},addState:{info.addState},packageCode:{info.packageCode}");
+
+                    #endregion
+
+                    #region   杞崲鍓�+                    for (int i = 0; i <= 21; i++)
+                    {
+                        info.machinedown[i] = result[i];
+                    }
+                    //灏嗘暟缁勬暟鎹帴鍙楄浆鎹负JSON鏁版嵁骞跺湪鍚庣画鏂规硶鍒ゆ柇涓瓨鍏ヤ腑闂磋〃
+                    json = JsonConvert.SerializeObject(info.machinedown);
+                    CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氳幏鍙朚ODBUS杞崲鍓嶇殑鏁版嵁淇℃伅锛歿json}");
+                    #endregion
+
+                    #endregion
+                }
+                else CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氳鏌ヨ<MachineInfoTetracobalt>琛ㄤ腑machineNo瀛楁鏄惁涓哄綋鍓嶅寘瑁呮満鍙凤紝骞朵笖trayCode鏄惁涓�");
+
+                var infoPack = MongoDBSingleton.Instance.FindOne<MachineInfoTetracobalt>(Query.And(Query.EQ("machineNo", location), Query.EQ("trayCode", "0")), "MachineInfo");
+
+                if (infoPack != null)
+                {
+                    //鍖呰鏈轰笅绾胯嚦澶嶇О锛岃鍙栧寘瑁呮満骞冲彴鏁版嵁
+                    CMMLog.Info("鏁版嵁澶勭悊娴佺▼锛氳繘鍏nfo鍒ゆ柇01");
+                    //AMS鍖呰鏈轰笅绾块鍏堣皟鐢∕ES锛屼箣鍚庤幏鍙栨柊鐨勮澶囨暟鎹瓨鍏ヤ腑闂磋〃
+                    //鏍规嵁鎵樼洏鍙疯幏鍙栨寚瀹氱殑閫氶亾鐨凧SON鏁版嵁锛屽皢鍏惰浆鎹负鏁扮粍绫诲瀷鈥斺�鍐欏叆閫氶亾鏁版嵁鏃朵細浣跨敤
+                    //var arr = JsonConvert.DeserializeObject<List<int>>(json);
+                    if(!noPack)
+                    {
+                        CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氬寘瑁呮満鏃燤ES鎯呭喌涓嬶紝鑾峰彇浠ュ線MES浼犺緭鐨勬暟鎹紝骞跺師鏍峰啓鍏ュ師鍏圡ES瀛楁涓�");
+
+                        //info.lotNo = RemoveNull(GetTrayCode(result.Skip(20).Take(30).ToArray()).Trim().ToString());
+                        //info.productType = RemoveNull(GetTrayCode(result.Skip(50).Take(10).ToArray()).Trim().ToString());
+                        //info.materialCode = RemoveNull(GetTrayCode(result.Skip(60).Take(20).ToArray()).Trim().ToString());
+
+                        info.lotNo = RemoveNull(GetTrayCode(result.Skip(35).Take(20).ToArray()).Trim().ToString());
+                        info.productType = RemoveNull(GetTrayCode(result.Skip(55).Take(10).ToArray()).Trim().ToString());
+                        info.materialCode = RemoveNull(GetTrayCode(result.Skip(65).Take(15).ToArray()).Trim().ToString());
+                        info.materialName = RemoveNull(GetTrayCode(result.Skip(80).Take(20).ToArray()).Trim().ToString());
+                        info.measurementUnit = RemoveNull(GetTrayCode(result.Skip(100).Take(5).ToArray()).Trim().ToString());
+
+                        CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氬寘瑁呮満鏃燤ES鎯呭喌涓嬶紝鑾峰彇浠ュ線MES浼犺緭鐨勬暟鎹紝鏂拌幏寰楁暟鎹紝lotNo:{info.lotNo},productType:{info.productType},materialCode:{info.materialCode},materialName:{info.materialName},measurementUnit:{info.measurementUnit}");
+                        
+
+                        //娉ㄦ剰锛氳繖閲岃祴鍊间腑闂磋〃鍙傛暟璇峰鐓т俊鎭氦浜掕〃鍏蜂綋閫氶亾鍊煎搴�+                        UpdateBuilder update = Update.Set("palletLayers", info.secondNg.ToString()).Set("overlappingLayers", info.addState.ToString()).Set("bagNo", info.packageCode).
+                            Set("lotNo", info.lotNo).Set("productType", info.productType).Set("materialCode", info.materialCode).Set("materialName", info.materialName).Set("measurementUnit", info.measurementUnit);
+                        MongoDBSingleton.Instance.Update<MachineInfoTetracobalt>(Query.EQ("machineNo", location), update, "MachineInfo", UpdateFlags.None);
+                        MongoDBSingleton.Instance.Update<MachineInfoTwoTetracobalt>(Query.EQ("trayCode", trayCode), update, "MachineInfoTwo", UpdateFlags.None);
+                    }
+                    //鍦ㄤ腑闂磋〃涓壘鍒板垰鍒氭彃鍏ョ殑MES鏁版嵁锛堢洰鍓嶈繕娌℃湁璇诲彇骞跺啓鍏ヨ澶囨暟鎹級
+                    var query1 = Query.And(Query.EQ("machineNo", location), Query.EQ("trayCode", "0"));
+                    UpdateBuilder updateBuider = Update.Set("empCode", info.empCode).Set("location", info.location).
+                        Set("trayCode", info.trayCode).Set("productWeight", info.productWeight).
+                        Set("trayCodeWeight", info.trayCodeWeight).Set("oneTrayWeight", info.oneTrayWeight).
+                        Set("addWeight", info.addWeight).Set("packNg", info.packNg).Set("secondNg", info.secondNg).Set("productTime", info.productTime).
+                        Set("jsonData", json).Set("modify", DateTime.Now);
+                    MongoDBSingleton.Instance.Update<MachineInfo>(query1, updateBuider, "MachineInfo", UpdateFlags.None);
+                    MongoDBSingleton.Instance.Update<MachineInfoTwoTetracobalt>(Query.EQ("trayCode", trayCode), updateBuider, "MachineInfoTwo", UpdateFlags.None);
+                    CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氭洿鏂癕achineInfoTetracobalt涓棿琛ㄥ垰鍒氭彃鍏ョ殑MES鏁版嵁!璁惧鍙蜂负锛歿location},鎵樼洏鍙蜂负锛歿trayCode}");
+                }
+                else
+                {
+                    //澶嶇О鍏ョ紦瀛樻灦锛岃鍙栧绉板钩鍙版暟鎹�+                    CMMLog.Info("鏁版嵁澶勭悊娴佺▼锛氳繘鍏nfo鍒ゆ柇02");
+                    //璇诲彇闄ゅ寘瑁呮満澶栧叾浠栬澶囩殑淇℃伅锛屾洿鏂板寘瑁呮満涓嬬嚎鏃剁殑鏁版嵁
+                    var query2 = Query.And(Query.EQ("machineNo", location), Query.EQ("trayCode", trayCode));
+                    var info2 = MongoDBSingleton.Instance.FindOne<MachineInfoTetracobalt>(query2, "MachineInfo");
+                    if (info2 != null)
+                    {
+                        UpdateBuilder updateBuider = Update.Set("empCode", info.empCode).Set("location", info.location).
+                        Set("trayCode", info.trayCode).Set("productWeight", info.productWeight).
+                        Set("trayCodeWeight", info.trayCodeWeight).Set("oneTrayWeight", info.oneTrayWeight).
+                        Set("addWeight", info.addWeight).Set("packNg", info.packNg).Set("secondNg", info.secondNg).Set("productTime", info.productTime).
+                        Set("jsonData", json).Set("modify", DateTime.Now);
+                        MongoDBSingleton.Instance.Update<MachineInfoTetracobalt>(query2, updateBuider, "MachineInfo", UpdateFlags.None);
+                        MongoDBSingleton.Instance.Update<MachineInfoTwoTetracobalt>(Query.EQ("trayCode", trayCode), updateBuider, "MachineInfoTwo", UpdateFlags.None);
+                        CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氭洿鏂癕achineInfoTetracobalt涓棿琛ㄥ叾浠栬澶囩殑鏁版嵁!璁惧鍙蜂负锛歿location},鎵樼洏鍙蜂负锛歿trayCode}");
+                    }
+                    else CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氭棤娉曞湪MachineInfoTetracobalt涓棿琛ㄤ腑鎵惧埌褰撳墠璁惧缂栧彿鐨勬暟鎹紒褰撳墠璁惧缂栧彿涓猴細{location}锛屾墭鐩樼爜涓猴細{trayCode}");
+                }
+            }
+            else CMMLog.Error("鏁版嵁澶勭悊娴佺▼锛氭暟鎹祦绋嬪鐞嗘墭鐩樺彿鎴栧寘瑁呮満鍙蜂负绌哄�锛�);
+
+            CMMLog.Info($"鏁版嵁澶勭悊娴佺▼锛氭暟鎹鐞嗘祦绋嬬粨鏉燂紒");
+        }
+
+        /// <summary>
+        /// 鑾峰彇澶嶇О鐐圭姸鎬佷俊鎭�+        /// </summary>
+        /// <returns></returns>
+        public static SecondWeighState GetSecondWeighState(string location)
+        {
+            //浼犲叆褰撳墠璁惧缂栧彿锛屽苟灏嗕紶鍏ョ殑璁惧缂栧彿鏀惧叆澶嶇О涓棿琛ㄧ殑鏉ユ簮鍙橀噺涓�+            string PlcBit02 = Settings.GetPlcInfo().Where(a => a.deviceType == "2").FirstOrDefault().location;
+            var query = Query.EQ("location", PlcBit02);
+            var model = MongoDBSingleton.Instance.FindOne<SecondWeighState>(query, "SecondWeighState");
+            if (model == null)
+            {
+                MongoDBSingleton.Instance.Insert<SecondWeighState>(new SecondWeighState { location = PlcBit02, from = location,full = 0,ng = 1 });
+                CMMLog.Debug($"鍒ゆ柇澶嶇О鐘舵�淇℃伅鏈嶅姟锛屽绉颁腑闂磋〃鏁版嵁涓虹┖锛屽紑濮嬫彃鍏ラ粯璁ゅ�锛�);
+            }
+            else MongoDBSingleton.Instance.Update<SecondWeighState>(query, Update.Set("from", location), "SecondWeighState", UpdateFlags.None);
+            return model;
+        }        
+        
+        /// <summary>
+        /// 鑾峰彇澶嶇О鐐圭姸鎬佷俊鎭紙鍥涢挻锛�+        /// </summary>
+        /// <returns></returns>
+        public static SecondWeighState GetSecondWeighStateTetracobalt(string location)
+        {
+            //浼犲叆褰撳墠璁惧缂栧彿锛屽苟灏嗕紶鍏ョ殑璁惧缂栧彿鏀惧叆澶嶇О涓棿琛ㄧ殑鏉ユ簮鍙橀噺涓�+            string PlcBit02 = Settings.GetPlcInfo().Where(a => a.deviceType == "22").FirstOrDefault().location;
+            var query = Query.EQ("location", PlcBit02);
+            var model = MongoDBSingleton.Instance.FindOne<SecondWeighState>(query, "SecondWeighState");
+            if (model == null)
+            {
+                MongoDBSingleton.Instance.Insert<SecondWeighState>(new SecondWeighState { location = PlcBit02, from = location,full = 0,ng = 1 });
+                CMMLog.Debug($"鍒ゆ柇澶嶇О鐘舵�淇℃伅鏈嶅姟锛屽绉颁腑闂磋〃鏁版嵁涓虹┖锛屽紑濮嬫彃鍏ラ粯璁ゅ�锛�);
+            }
+            else MongoDBSingleton.Instance.Update<SecondWeighState>(query, Update.Set("from", location), "SecondWeighState", UpdateFlags.None);
+            return model;
+        }
+
+        /// <summary>
+        /// 澶嶇О骞冲彴鏁版嵁
+        /// </summary>
+        public class SecondWeighState
+        {
+            public ObjectId _id { get; set; }
+            public string location { get; set; }
+            /// <summary>
+            /// 0鏈煡 1鍚堟牸 2涓嶅悎鏍�+            /// </summary>
+            public int ng { get; set; }
+            /// <summary>
+            /// 澶嶇О骞冲彴璐т粠鍝噷鏉ョ殑
+            /// </summary>
+            public string from { get; set; }
+            /// <summary>
+            /// 鎵规鍙�+            /// </summary>
+            public string batchNo { get; set; }
+            /// <summary>
+            /// 鍖呰鏈轰笅绾块噸閲�+            /// </summary>
+            public int weight { get; set; }
+            /// <summary>
+            /// 1 婊�0 绌�+            /// </summary>
+            public int full { get; set; }
+            public string mesInfo { get; set; }
+        }
+
+        /// <summary>
+        /// 鑾峰彇澶嶇О鐐逛綅浣嶇疆
+        /// </summary>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        public static string GetSecondWeighBit()
+        {
+            //鏀规垚璇籹ettings
+            var plc = Settings.GetPlcInfo().Where(a => a.deviceType == "2").FirstOrDefault();
+            return plc.location;
+        }
+
+        /// <summary>
+        /// 灏嗚澶囬�閬撻噷闈㈣鍙栫殑16浣峴hort杞垚ascii瀛楃涓�+        /// </summary>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        public static string GetTrayCode(int[] data)
+        {
+            StringBuilder sb = new StringBuilder();
+            data.ToList().ForEach(a => {
+                var bytes = BitConverter.GetBytes((short)a).Reverse().ToArray();
+                sb.Append(Encoding.ASCII.GetString(bytes));
+            });
+            return sb.ToString();
+        }
+
+        /// <summary>
+        /// 鍗佽繘鍒惰浆鎹负2杩涘埗锛堣嚜鍔ㄨˉ鍏�6浣嶏級
+        /// </summary>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        public static string Completion(int data)
+        {
+            var result = Convert.ToString(data, 2).PadLeft(16, '0');
+            return result;
+        }
+
+        /// <summary>
+        /// ascii杞�0杩涘埗锛堥�杩�6杩涘埗涓浆锛�+        /// </summary>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        public static string AsciiToTen(string data)
+        {
+            byte[] oneSixbad = System.Text.ASCIIEncoding.Default.GetBytes(data);
+            StringBuilder oneSixsb = new StringBuilder();
+            foreach (byte b in oneSixbad)
+            {
+                oneSixsb.Append(b.ToString("x"));
+            }
+            int oneSixA2 = Convert.ToInt32(oneSixsb.ToString(), 16);
+            return oneSixA2.ToString();
+        }
+
+        #region   鍙犵洏鏈烘壒閲忓啓鍏ユ暟鎹�+
+        #region   浜у搧鍨嬪彿鍒嗙澶勭悊鏂规硶
+        //public static int[] DiePan(WMSInfo machine)
+        //{
+        //    //鍋忕Щ閲�+11 閫氶亾鑼冨洿锛�40311 ~ 40370
+        //    CMMLog.Info($"杩涘叆DiePan鏁版嵁澶勭悊鏂规硶");
+        //    //10~19閫氶亾
+        //    int[] num = new int[60];
+        //    int[] num3 = new int[40];
+        //    int a = 0;//鎵樼洏鐮佸鐞�+        //    for (int b = 0; b <= 2; b++)
+        //    {
+        //        num[b] = int.Parse(AsciiToTen(machine.trayCode.Substring(a, 2)));
+        //        a = a + 2;
+        //    }
+        //    num[3] = int.Parse(AsciiToTen(machine.location));//鍖呰鏈哄彿
+        //    for (int b = 4; b <= 5; b++)
+        //    {
+        //        int k = b % 2 == 0 ? 0 : 16;
+        //        num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.productWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+        //    }
+        //    for (int b = 6; b <= 7; b++)
+        //    {
+        //        int k = b % 2 == 0 ? 0 : 16;
+        //        num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.trayCodeWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+        //    }
+        //    for (int b = 8; b <= 9; b++)
+        //    {
+        //        int k = b % 2 == 0 ? 0 : 16;
+        //        num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.oneTrayWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+        //    }
+        //    for (int b = 10; b <= 12; b++) num[b] = 0;// 鍙犲寘鍚庡疄闄呴噸閲�&& 澶嶇О缁撴灉 榛樿锛�
+        //    num[13] = string.IsNullOrEmpty(machine.palletLayers) ? 0 : int.Parse(machine.palletLayers);//鏄惁闇�鍙犳墭鐩�+        //    num[14] = machine.addState;//鏄惁闇�鍙犲寘
+        //    num[15] = int.Parse(machine.packageCode);//琚嬪彿
+        //    //鏃堕棿鎴冲鐞�+        //    string timeStamp = ProcessHelper.GetTimeStamp(32, 1, 1);
+        //    for (int b = 16; b <= 17; b++)
+        //    {
+        //        int k = b % 2 == 0 ? 0 : 16;
+        //        num[b] = Convert.ToInt32(Convert.ToString(int.Parse(timeStamp), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+        //    }
+        //    for (int b = 18; b <= 19; b++) num[b] = 0;//棰勭暀鐨勪袱涓�閬�榛樿锛�
+
+        //    //19 = 30  31 ~ 60 
+        //    //30~59閫氶亾  60~70閫氶亾
+        //    string pcHead = "";
+        //    string cpHead = "";
+        //    #region   31~60
+
+        //    string data = machine.itemPCode;
+        //    CMMLog.Info($"31~60data1_1:{data}");
+        //    if (data.Length % 2 != 0)
+        //    {
+        //        data = "0" + machine.itemPCode;
+        //        pcHead = "" + machine.itemPCode.Substring(0, 1);
+        //    }
+        //    CMMLog.Info($"31~60data1_2:{data}");
+        //    int x = data.Length / 2;
+        //    int aa = 0;
+        //    for (int i = 0; i <= x - 1; i++)
+        //    {
+        //        num3[i] = int.Parse(AsciiToTen(data.Substring(aa, 2)));
+        //        aa = aa + 2;
+        //    }
+        //    for (int m = x; m <= 29; m++) num3[m] = 0;//灏嗕骇鍝佹壒娆″彿鏃犳暟鎹殑閫氶亾鍏ㄩ儴缃负 0
+        //    CMMLog.Info($"itemPCode:" + JsonConvert.SerializeObject(num3));
+        //    #endregion
+
+        //    #region   61~70
+
+        //    string data2 = machine.itemCode;
+        //    CMMLog.Info($"61~70data2_1:{data2}");
+        //    if (data2.Length % 2 != 0)
+        //    {
+        //        data2 = "0" + machine.itemCode;
+        //        cpHead = "" + machine.itemCode.Substring(0, 1);
+        //    }
+        //    CMMLog.Info($"61~70data2_2:{data2}");
+        //    int y = data2.Length / 2;
+        //    CMMLog.Info($"{y}");
+        //    int aaa = 0;
+        //    //4 2 32 9 41 
+        //    for (int i = 30; i <= y + 29; i++)
+        //    {
+        //        num3[i] = int.Parse(AsciiToTen(data2.Substring(aaa, 2)));
+        //        CMMLog.Info(JsonConvert.SerializeObject(num3[i]));
+        //        aaa = aaa + 2;
+        //    }
+        //    int mm = y + 30;
+        //    CMMLog.Info($"mm:{mm}");
+        //    for (int mmm = mm; mmm <= 39; mmm++)
+        //    {
+        //        num3[mmm] = 0;
+        //        CMMLog.Info(JsonConvert.SerializeObject(num3[mmm]));
+        //    }
+        //    CMMLog.Info($"itemPCode+itemCode:{JsonConvert.SerializeObject(num3)}");
+        //    #endregion
+
+        //    for (int i = 20; i <= 60; i++) num[i] = num3[i - 20];
+
+        //    // 濡傛灉 浜у搧鎵规鍙�鎴栬� 浜у搧鍨嬪彿 浣嶆暟 涓�濂囨暟锛屽垯灏嗘彁鍓嶅彇鍑虹殑 棣栧瓧绗�閲嶆柊杞爜 鍐欏叆 鍏舵墍瀵瑰簲閫氶亾鍖哄煙鐨�棣栭�閬�+        //    if (pcHead != "" || cpHead != "")
+        //    {
+        //        if (pcHead != "") num[20] = int.Parse(AsciiToTen(pcHead));
+        //        if (cpHead != "") num[50] = int.Parse(AsciiToTen(cpHead));
+        //        CMMLog.Info($"浜у搧鍨嬪彿鎴栨壒娆″彿鏁伴噺涓哄鏁帮紝鐗瑰皢棣栦綅鍙栧嚭鍗曠嫭澶勭悊锛屼互涓嬩负鎵规鍙峰拰浜у搧鍨嬪彿鐨勫崄杩涘埗鏁板�{num[20]},{num[50]}");
+        //    }
+        //    CMMLog.Info($"DiePan鏁版嵁澶勭悊鏂规硶瀹屾瘯");
+
+        //    return num;
+        //}
+        #endregion
+
+        public static int[] DiePan(WMSInfo machine)
+        {
+            //鍋忕Щ閲�+11 閫氶亾鑼冨洿锛�40311 ~ 40370
+            CMMLog.Info($"鍙犵洏鏈烘暟鎹鐞�");
+            //10~19閫氶亾
+            int[] num = new int[50];//ERP鍙樻洿锛氬彉鏇村悗閫氶亾 50  鍙樻洿鍓嶏細60
+
+            #region   0~19 => 11~30
+
+            int a = 0;//鎵樼洏鐮佸鐞�+            for (int b = 0; b <= 2; b++)
+            {
+                num[b] = int.Parse(AsciiToTen(machine.trayCode.Substring(a, 2)));
+                a = a + 2;
+            }
+            num[3] = int.Parse(AsciiToTen(machine.location));//鍖呰鏈哄彿
+            for (int b = 4; b <= 5; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.productWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 6; b <= 7; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.trayCodeWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 8; b <= 9; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.oneTrayWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 10; b <= 12; b++) num[b] = 0;// 鍙犲寘鍚庡疄闄呴噸閲�&& 澶嶇О缁撴灉 榛樿锛�
+            num[13] = string.IsNullOrEmpty(machine.palletLayers) ? 0 : int.Parse(machine.palletLayers);//鏄惁闇�鍙犳墭鐩�+            num[14] = machine.addState;//鏄惁闇�鍙犲寘
+            num[15] = int.Parse(machine.packageCode);//琚嬪彿
+            //鏃堕棿鎴冲鐞�+            string timeStamp = ProcessHelper.GetTimeStamp(32, 1, 1);
+            for (int b = 16; b <= 17; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(timeStamp), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 18; b <= 19; b++) num[b] = 0;//棰勭暀鐨勪袱涓�閬�榛樿锛�
+
+            #endregion
+
+            string pcHead = "";
+            string cpHead = "";
+
+            #region  20~39 => 31~50 浜у搧鎵规鍙�+
+            string data = machine.itemPCode;
+            CMMLog.Info($"31~50data1_1:{data}");
+            if (data.Length % 2 != 0)
+            {
+                data = "0" + machine.itemPCode;
+                pcHead = "" + machine.itemPCode.Substring(0, 1);
+            }
+            CMMLog.Info($"31~50data1_2:{data}");
+            //瀛楃涓查暱搴�/ 2 = 鍐欏叆閫氶亾鏁伴噺(涓や綅涓�浆) 鍒楋細 3L0050 鍐欏叆涓変釜閫氶亾
+            int maxLength = 19 + (data.Length / 2);// data.Length / 2 鑷冲皯涓�1
+            int aa = 0;
+            for (int i = 20; i <= maxLength; i++)
+            {
+                num[i] = int.Parse(AsciiToTen(data.Substring(aa, 2)));
+                aa = aa + 2;
+            }
+            for (int x = maxLength + 1; x <= 39; x++) num[x] = 0;//灏嗕骇鍝佹壒娆″彿鏃犳暟鎹殑閫氶亾鍏ㄩ儴缃负 0
+            #endregion
+
+            #region   40~49 => 51~60 浜у搧鍨嬪彿
+
+            string data2 = machine.itemCode;
+            CMMLog.Info($"51~60data2_1:{data2}");
+            if (data2.Length % 2 != 0)
+            {
+                data2 = "0" + machine.itemCode;
+                cpHead = "" + machine.itemCode.Substring(0, 1);
+            }
+            CMMLog.Info($"51~60data2_2:{data2}");
+            maxLength = 39 + (data2.Length / 2);
+            int aaa = 0;
+            for (int i = 40; i <= maxLength; i++)
+            {
+                num[i] = int.Parse(AsciiToTen(data2.Substring(aaa, 2)));
+                aaa = aaa + 2;
+            }
+            for (int x = maxLength + 1; x <= 49; x++) num[x] = 0;//灏嗕骇鍝佸瀷鍙锋棤鏁版嵁鐨勯�閬撳叏閮ㄧ疆涓�
+            #endregion
+
+            // 濡傛灉 浜у搧鎵规鍙�鎴栬� 浜у搧鍨嬪彿 浣嶆暟 涓�濂囨暟锛屽垯灏嗘彁鍓嶅彇鍑虹殑 棣栧瓧绗�閲嶆柊杞爜 鍐欏叆 鍏舵墍瀵瑰簲閫氶亾鍖哄煙鐨�棣栭�閬�+            if (pcHead != "") num[20] = int.Parse(AsciiToTen(pcHead));
+            if (cpHead != "") num[40] = int.Parse(AsciiToTen(cpHead));
+            if (pcHead != "" || cpHead != "") CMMLog.Info($"浜у搧鍨嬪彿鎴栨壒娆″彿鏁伴噺涓哄鏁帮紝鐗瑰皢棣栦綅鍙栧嚭鍗曠嫭澶勭悊锛屼互涓嬩负鎵规鍙峰拰浜у搧鍨嬪彿鐨勫崄杩涘埗鏁板�{num[20]},{num[50]}");
+            
+            CMMLog.Info($"鍙犵洏鏈烘暟鎹鐞嗗畬姣曪細{JsonConvert.SerializeObject(num)}");
+
+            return num;
+        }
+
+        public static int[] DiePanTwo(WMSInfo machine, MachineInfoTwo machineInfoTwo)
+        {
+            var ErpItemInfo = MongoDBSingleton.Instance.FindOne<ERPItemTable>(Query.EQ("item_code", machineInfoTwo.materialCode), "ERPItemTable");
+            CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鏀跺埌淇″彿5锛屾煡璇achineInfoTwo琛ㄤ俊鎭細{JsonConvert.SerializeObject(ErpItemInfo)}銆�);
+
+            //鍋忕Щ閲�+11 閫氶亾鑼冨洿锛�40311 ~ 40390
+            CMMLog.Info($"鍙犵洏鏈烘暟鎹鐞�");
+            //10~19閫氶亾
+            int[] num = new int[90];//鎬婚暱搴︼細80
+
+            #region   0~19 => 11~30
+
+            int a = 0;//鎵樼洏鐮佸鐞�+            for (int b = 0; b <= 2; b++)
+            {
+                num[b] = int.Parse(AsciiToTen(machine.trayCode.Substring(a, 2)));
+                a = a + 2;
+            }
+            num[3] = int.Parse(AsciiToTen(machine.location));//鍖呰鏈哄彿
+            for (int b = 4; b <= 5; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.productWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 6; b <= 7; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.trayCodeWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 8; b <= 9; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.oneTrayWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 10; b <= 11; b++) num[b] = 0;// 鍙犲寘鍚庡疄闄呴噸閲�&& 澶嶇О缁撴灉 榛樿锛�
+            num[12] = 1;
+            num[13] = 2;//鏄惁闇�鍙犳墭鐩�// string.IsNullOrEmpty(machine.palletLayers) ? 0 : int.Parse(machine.palletLayers)
+            num[14] = machine.addState;//鏄惁闇�鍙犲寘
+            num[15] = int.Parse(machine.packageCode);//琚嬪彿
+            //鏃堕棿鎴冲鐞�+            string timeStamp = ProcessHelper.GetTimeStamp(32, 1, 1);
+            for (int b = 16; b <= 17; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(timeStamp), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 18; b <= 19; b++) num[b] = 0;//棰勭暀鐨勪袱涓�閬�榛樿锛�
+
+            #endregion
+
+            string pcHead = "";
+            string cpHead = "";
+            string mtHead = "";// 璁惧鐨勭湡瀹炵墿鏂欑紪鐮�+
+            #region  20~39 => 31~50 浜у搧鎵规鍙�+
+            string data = machineInfoTwo.lotNo;
+            CMMLog.Info($"31~50data1_1:{data}");
+            if (data.Length % 2 != 0)
+            {
+                data = "0" + machineInfoTwo.lotNo;
+                pcHead = "" + machineInfoTwo.lotNo.Substring(0, 1);
+            }
+            CMMLog.Info($"31~50data1_2:{data}");
+            //瀛楃涓查暱搴�/ 2 = 鍐欏叆閫氶亾鏁伴噺(涓や綅涓�浆) 鍒楋細 3L0050 鍐欏叆涓変釜閫氶亾
+            int maxLength = 19 + (data.Length / 2);// data.Length / 2 鑷冲皯涓�1
+            int aa = 0;
+            for (int i = 20; i <= maxLength; i++)
+            {
+                num[i] = int.Parse(AsciiToTen(data.Substring(aa, 2)));
+                aa = aa + 2;
+            }
+            for (int x = maxLength + 1; x <= 39; x++) num[x] = 0;//灏嗕骇鍝佹壒娆″彿鏃犳暟鎹殑閫氶亾鍏ㄩ儴缃负 0
+            #endregion
+
+            #region   40~49 => 51~60 浜у搧鍨嬪彿
+
+            ERPService.HandleItemInfoChina(machine.itemCode, 40, 49, num);// 涓枃澶勭悊 70~84 81~95
+
+            //string data2 = machine.itemCode;
+            //CMMLog.Info($"51~50data2_1:{data2}");
+            //if (data2.Length % 2 != 0)
+            //{
+            //    data2 = "0" + machine.itemCode;
+            //    cpHead = "" + machine.itemCode.Substring(0, 1);
+            //}
+            //CMMLog.Info($"51~60data2_2:{data2}");
+            //maxLength = 39 + (data2.Length / 2);
+            //int aaa = 0;
+            //for (int i = 40; i <= maxLength; i++)
+            //{
+            //    num[i] = int.Parse(AsciiToTen(data2.Substring(aaa, 2)));
+            //    aaa = aaa + 2;
+            //}
+            //for (int x = maxLength + 1; x <= 49; x++) num[x] = 0;//灏嗕骇鍝佸瀷鍙锋棤鏁版嵁鐨勯�閬撳叏閮ㄧ疆涓�
+            #endregion
+
+            #region   50~69 => 61~80 鐗╂枡缂栫爜
+
+            string data3 = machineInfoTwo.materialCode;
+            CMMLog.Info($"61~80data3_1:{data3}");
+            if (data3.Length % 2 != 0)
+            {
+                //data3 = "0" + machineInfoTwo.materialCode;
+                mtHead = "" + machineInfoTwo.materialCode.Substring(0, 1);
+            }
+            CMMLog.Info($"61~80data3_2:{data3}");
+            maxLength = 49 + (data3.Length / 2);
+            int aaaa = 0;
+            for (int i = 50; i <= maxLength; i++)
+            {
+                num[i] = int.Parse(AsciiToTen(data3.Substring(aaaa, 2)));
+                aaaa = aaaa + 2;
+            }
+            for (int x = maxLength + 1; x <= 69; x++) num[x] = 0;//灏嗕骇鍝佸瀷鍙锋棤鏁版嵁鐨勯�閬撳叏閮ㄧ疆涓�
+            #endregion
+
+            ERPService.HandleItemInfoChina(ErpItemInfo.item_name, 70, 84, num);// 涓枃澶勭悊 70~84 81~95
+            ERPService.HandleItemInfo(ErpItemInfo.item_uom, 85, 89, num);// 85~89 96~100
+
+            // 濡傛灉 浜у搧鎵规鍙�鎴栬� 浜у搧鍨嬪彿 浣嶆暟 涓�濂囨暟锛屽垯灏嗘彁鍓嶅彇鍑虹殑 棣栧瓧绗�閲嶆柊杞爜 鍐欏叆 鍏舵墍瀵瑰簲閫氶亾鍖哄煙鐨�棣栭�閬�+            if (pcHead != "") num[20] = int.Parse(AsciiToTen(pcHead));
+            if (cpHead != "") num[40] = int.Parse(AsciiToTen(cpHead));
+            if (mtHead != "") num[50] = int.Parse(AsciiToTen(mtHead));
+            if (pcHead != "" || cpHead != "") CMMLog.Info($"浜у搧鍨嬪彿鎴栨壒娆″彿鏁伴噺涓哄鏁帮紝鐗瑰皢棣栦綅鍙栧嚭鍗曠嫭澶勭悊锛屼互涓嬩负鎵规鍙峰拰浜у搧鍨嬪彿鐨勫崄杩涘埗鏁板�{num[20]},{num[50]}");
+
+            CMMLog.Info($"鍙犵洏鏈烘暟鎹鐞嗗畬姣曪細{JsonConvert.SerializeObject(num)}");
+
+            return num;
+        }
+
+
+        public static int[] DiePanThree(WMSInfo machine, MachineInfoTwo machineInfoTwo)
+        {
+            //鍋忕Щ閲�+11 閫氶亾鑼冨洿锛�40311 ~ 40390
+            CMMLog.Info($"鍙犵洏鏈烘暟鎹鐞�");
+            //10~19閫氶亾
+            int[] num = new int[80];//鎬婚暱搴︼細80
+
+            #region   0~19 => 11~30
+
+            int a = 0;//鎵樼洏鐮佸鐞�+            for (int b = 0; b <= 2; b++)
+            {
+                num[b] = int.Parse(AsciiToTen(machine.trayCode.Substring(a, 2)));
+                a = a + 2;
+            }
+            num[3] = int.Parse(AsciiToTen(machine.location));//鍖呰鏈哄彿
+            for (int b = 4; b <= 5; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.productWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 6; b <= 7; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.trayCodeWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 8; b <= 9; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(machine.oneTrayWeight), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 10; b <= 12; b++) num[b] = 0;// 鍙犲寘鍚庡疄闄呴噸閲�&& 澶嶇О缁撴灉 榛樿锛�
+            num[13] = string.IsNullOrEmpty(machine.palletLayers) ? 0 : int.Parse(machine.palletLayers);//鏄惁闇�鍙犳墭鐩�+            num[14] = machine.addState;//鏄惁闇�鍙犲寘
+            num[15] = int.Parse(machine.packageCode);//琚嬪彿
+            //鏃堕棿鎴冲鐞�+            string timeStamp = ProcessHelper.GetTimeStamp(32, 1, 1);
+            for (int b = 16; b <= 17; b++)
+            {
+                int k = b % 2 == 0 ? 0 : 16;
+                num[b] = Convert.ToInt32(Convert.ToString(int.Parse(timeStamp), 2).PadLeft(32, '0').ToString().Substring(k, 16), 2);
+            }
+            for (int b = 18; b <= 19; b++) num[b] = 0;//棰勭暀鐨勪袱涓�閬�榛樿锛�
+
+            #endregion
+
+            string pcHead = "";
+            string cpHead = "";
+            string mtHead = "";// 璁惧鐨勭湡瀹炵墿鏂欑紪鐮�+
+            #region  20~49 => 31~60 浜у搧鎵规鍙�+
+            string data = machine.itemPCode;
+            CMMLog.Info($"31~60data1_1:{data}");
+            if (data.Length % 2 != 0)
+            {
+                data = "0" + machine.itemPCode;
+                pcHead = "" + machine.itemPCode.Substring(0, 1);
+            }
+            CMMLog.Info($"31~60data1_2:{data}");
+            //瀛楃涓查暱搴�/ 2 = 鍐欏叆閫氶亾鏁伴噺(涓や綅涓�浆) 鍒楋細 3L0050 鍐欏叆涓変釜閫氶亾
+            int maxLength = 19 + (data.Length / 2);// data.Length / 2 鑷冲皯涓�1
+            int aa = 0;
+            for (int i = 20; i <= maxLength; i++)
+            {
+                num[i] = int.Parse(AsciiToTen(data.Substring(aa, 2)));
+                aa = aa + 2;
+            }
+            for (int x = maxLength + 1; x <= 49; x++) num[x] = 0;//灏嗕骇鍝佹壒娆″彿鏃犳暟鎹殑閫氶亾鍏ㄩ儴缃负 0
+            #endregion
+
+            #region   50~59 => 61~70 浜у搧鍨嬪彿
+
+            string data2 = machine.itemCode;
+            CMMLog.Info($"61~70data2_1:{data2}");
+            if (data2.Length % 2 != 0)
+            {
+                data2 = "0" + machine.itemCode;
+                cpHead = "" + machine.itemCode.Substring(0, 1);
+            }
+            CMMLog.Info($"61~70data2_2:{data2}");
+            maxLength = 49 + (data2.Length / 2);
+            int aaa = 0;
+            for (int i = 50; i <= maxLength; i++)
+            {
+                num[i] = int.Parse(AsciiToTen(data2.Substring(aaa, 2)));
+                aaa = aaa + 2;
+            }
+            for (int x = maxLength + 1; x <= 59; x++) num[x] = 0;//灏嗕骇鍝佸瀷鍙锋棤鏁版嵁鐨勯�閬撳叏閮ㄧ疆涓�
+            #endregion
+
+            #region   60~79 => 71~90 浜у搧鍨嬪彿
+
+            string data3 = machineInfoTwo.materialCode;
+            CMMLog.Info($"71~90data3_1:{data3}");
+            if (data3.Length % 2 != 0)
+            {
+                data3 = "0" + machineInfoTwo.materialCode;
+                mtHead = "" + machineInfoTwo.materialCode.Substring(0, 1);
+            }
+            CMMLog.Info($"71~90data3_2:{data3}");
+            maxLength = 59 + (data3.Length / 2);
+            int aaaa = 0;
+            for (int i = 60; i <= maxLength; i++)
+            {
+                num[i] = int.Parse(AsciiToTen(data3.Substring(aaaa, 2)));
+                aaaa = aaaa + 2;
+            }
+            for (int x = maxLength + 1; x <= 79; x++) num[x] = 0;//灏嗕骇鍝佸瀷鍙锋棤鏁版嵁鐨勯�閬撳叏閮ㄧ疆涓�
+            #endregion
+
+            // 濡傛灉 浜у搧鎵规鍙�鎴栬� 浜у搧鍨嬪彿 浣嶆暟 涓�濂囨暟锛屽垯灏嗘彁鍓嶅彇鍑虹殑 棣栧瓧绗�閲嶆柊杞爜 鍐欏叆 鍏舵墍瀵瑰簲閫氶亾鍖哄煙鐨�棣栭�閬�+            if (pcHead != "") num[20] = int.Parse(AsciiToTen(pcHead));
+            if (cpHead != "") num[50] = int.Parse(AsciiToTen(cpHead));
+            if (mtHead != "") num[60] = int.Parse(AsciiToTen(mtHead));
+            if (pcHead != "" || cpHead != "") CMMLog.Info($"浜у搧鍨嬪彿鎴栨壒娆″彿鏁伴噺涓哄鏁帮紝鐗瑰皢棣栦綅鍙栧嚭鍗曠嫭澶勭悊锛屼互涓嬩负鎵规鍙峰拰浜у搧鍨嬪彿鐨勫崄杩涘埗鏁板�{num[20]},{num[50]}");
+
+            CMMLog.Info($"鍙犵洏鏈烘暟鎹鐞嗗畬姣曪細{JsonConvert.SerializeObject(num)}");
+
+            return num;
+        }
+        #endregion
+
+        #endregion
+
+        public class Z_ChaiPanEmptyOrFull
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鎷嗙洏鐐逛綅
+            /// </summary>
+            public string ChaiPanBit { get; set; }
+            /// <summary>
+            /// 鎷嗙洏鐐逛綅绌烘弧鐘舵�--绌簗婊�+            /// </summary>
+            public string ChaiPanState { get; set; }
+        }
+
+
+        public class ActionControlModel
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 鍔熻兘鐮�- 1-鐢熸垚澶嶇О骞冲彴鍏ョ紦瀛樻灦浠诲姟
+            /// </summary>
+            public string actionNo { get; set; } = "0";
+            /// <summary>
+            /// 1-ip
+            /// </summary>
+            public string ext1 { get; set; } = "";
+            /// <summary>
+            /// 1-CN_S_BATCH_NO
+            /// </summary>
+            public string ext2 { get; set; } = "";
+            public string ext3 { get; set; } = "";
+            public int ext4 { get; set; } = 0;
+            public string machince { get; set; } = "";
+        }
+
+        internal static void changeSignal()
+        {
+            CMMLog.Info("杞﹁締鐘舵�澶勭悊锛氭墽琛屽紑濮嬶紒");
+            try
+            {
+                //鏌ヨ灏忚溅鐘舵�琛紝鍐欏叆灏忚溅鍧愭爣鍜屾柟鍚�骞跺啓鍏ヤ腑闂磋〃
+                var agvState = MongoDBSingleton.Instance.FindAll<AGV_STATE>();
+                if (agvState.Count > 0)
+                {
+                    agvState.ForEach(a =>
+                    {
+                        var stateInfo = Settings.GetAGVStateList().Where(it => it.AgvNo == a.forkliftNo).FirstOrDefault();
+                        if (stateInfo != null)
+                        {
+                            int[] num = new int[6];//鎬婚暱搴︼細6
+                            int divisor = 65536; // 闄ゆ暟
+                            int xPos = int.Parse(a.xPos) * 10;
+                            int yPos = int.Parse(a.yPos) * 10;
+
+                            int xquotient = xPos / divisor; // 璁$畻鍟嗘暟
+                            int xremainder = xPos % divisor; // 璁$畻浣欐暟
+                            num[0] = xquotient;
+                            num[1] = xremainder;
+
+                            int yquotient = yPos / divisor; // 璁$畻鍟嗘暟
+                            int yremainder = yPos % divisor; // 璁$畻浣欐暟
+                            num[2] = yquotient;
+                            num[3] = yremainder;
+
+                            #region
+                            //int m = 0;//鎵樼洏鐮佸鐞�+                            //for (int b = 0; b <= 1; b++)
+                            //{
+                            //    num[b] = int.Parse(AsciiToTen(a.xPos.Substring(m, 2)));
+                            //    m = m + 2;
+                            //}
+                            //m = 0;
+                            //for (int b = 2; b <= 3; b++)
+                            //{
+                            //    num[b] = int.Parse(AsciiToTen(a.yPos.Substring(m, 2)));
+                            //    m = m + 2;
+                            //}
+                            #endregion
+
+                            num[4] = string.IsNullOrEmpty(a.Degree) ? 0 : int.Parse(a.Degree);
+                            //num[4] = int.Parse(a.Degree);
+                            num[5] = a.errCode != "0" || a.errCode2 != "0" || a.faildCode != "0" ? 2 : 0;
+
+                            //if (a.errCode != "0" || a.errCode2 != "0" || a.faildCode != "0") num[5] = 2;
+
+                            CMMLog.Info($"杞﹁締鐘舵�澶勭悊锛氬啓鍏ヨ溅杈嗘暟鎹細杞﹀彿锛歿a.forkliftNo},ip:{stateInfo.ip},port:{stateInfo.port},data:{JsonConvert.SerializeObject(num)}");
+                            var wirteal = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                            {
+                                addr = stateInfo.writeAddr,
+                                host = stateInfo.ip,
+                                port = stateInfo.port,
+                                data = num
+                            });
+                        }
+                        else CMMLog.Info($"杞﹁締鐘舵�澶勭悊锛氬皬杞a.forkliftNo}鏈厤缃�);
+                    });
+                }
+                else CMMLog.Info("杞﹁締鐘舵�澶勭悊锛欰GV_STATE 杞﹁締鐘舵�琛ㄦ湭鑾峰彇鍒拌溅杈嗙姸鎬佹暟鎹紒");
+            }
+            catch(Exception ex)
+            {
+                CMMLog.Info($"杞﹁締鐘舵�澶勭悊-寮傚父锛歿ex.Message}锛�);
+            }
+            
+            CMMLog.Info("杞﹁締鐘舵�澶勭悊锛氭墽琛岀粨鏉燂紒");
+            Thread.Sleep(1000);
+        }
+
+        /// <summary>
+        /// 杩旀枡绔欏彴閫佺墿鏂�+        /// </summary>
+        /// <param name="device"></param>
+        internal static void LiftAction(Settings.PlcInfo plc, string taskNo, bool result)
+        {
+            if(plc.device == "24")
+            {
+                if (result)
+                {
+                    //杩旀枡绔欏彴浠诲姟
+                    //ASM鍐欏叆閫氶亾0灏忚溅鍔ㄤ綔锛�-鍙栨枡
+                    var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    {
+                        host = plc.ip,
+                        port = plc.port,
+                        addr = plc.writeAddr,
+                        data = 1
+                    });
+                    if (writeRes.errCode == 0)
+                    {
+                        //灏忚溅璇锋眰杩涘叆瀹夊叏闂ㄤ氦浜�+                        //灏忚溅璇锋眰杩涙枡锛屽苟涓旀煡璇㈣澶囨槸鍚﹀厑璁窤GV杩涘叆
+                        //璇诲湴鍧�璁惧鏄惁  2-鍙互杩涘叆
+                        var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                        {
+                            dataNum = 1,
+                            host = plc.ip,
+                            addr = plc.readAddr,
+                            port = plc.port
+                        });
+                        CMMLog.Debug($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+                        Console.WriteLine($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 1}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+                        if (readRes != null && readRes.errCode == 0)
+                        {
+                            if (readRes.result[0] == 2)
+                            {
+                                //璁惧鍏佽杩涘叆锛屾敼鍙傛暟閫氱煡AGV
+                                WorkFlowAction.TrackLog(taskNo, 10, 1013, "success");
+                                TSHelper.GoToAGV(taskNo, 10, 1);
+                            }
+                        }
+                        else CMMLog.Debug($"鍏ヨ繑鏂欑珯鍙帮細1013锛宺eadRes锛歿readRes},readRes.errCode:{readRes.errCode}");
+                    }
+                }
+                else
+                {
+                    var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    {
+                        host = plc.ip,
+                        port = plc.port,
+                        addr = plc.writeAddr,
+                        data = 3
+                    });
+                }
+            }
+        }
+
+        /// <summary>
+        /// 3妤煎寘瑁呮満鍙栨枡鑷冲绉板钩鍙版祦绋嬧�鈥斾换鍔″紑濮嬪墠锛屽垽鏂寘瑁呮満鏈夋病鏈変笅绾夸俊鍙凤紝骞跺垽鏂綋鍓嶅绉板钩鍙版槸鍚G浠ュ強鏈夋病鏈変换鍔″湪杩涜涓�鍥涢挻)
+        /// </summary>
+        /// <param name="a"></param>
+        internal static void CheckPackingMachineTetracobalt(Settings.PlcInfo pmInfo)
+        {
+            //var count = MongoDBSingleton.Instance.FindOne<>//occupy
+            var count = MongoDBSingleton.Instance.FindOne<MachineInfoTetracobalt>(Query.EQ("occupy", "1"), "MachineInfo");
+
+            //妫�煡鍖呰鏈洪�閬�鏄惁鏈変笅鏂欎俊鍙凤紝濡傛灉鏈夌敓鎴愪笅鏂欎换鍔°�绾跨▼寰幆璇诲彇锛屾棤闇�缃惊鐜�鈥斺�閫氶亾0鍙傛暟涓�
+            if (count == null)
+            {
+                // var secondInfo = MongoDBSingleton.Instance.FindOne<secondResult>(Query.EQ("Bit", pmInfo.location), "secondResult");
+                // if(secondInfo == null || secondInfo.Status == "OK")
+                // {
+                if (PickUpStartFree(pmInfo.location) && PickUpEndFree(pmInfo.location))
+                {
+                    try
+                    {
+                        var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                        {
+                            dataNum = 1,
+                            addr = pmInfo.readAddr,
+                            host = pmInfo.ip,
+                            port = pmInfo.port
+                        });
+                        if (result != null && result.errCode == 0)
+                        {
+                            CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氳鍙栧寘瑁呮満閫氶亾鍙蜂负锛歿pmInfo.readAddr}閲岄潰鐨勫�涓簕result.result[0]}");
+                            //Console.WriteLine($"鍖呰涓嬬嚎娴佺▼锛氳鍙栧寘瑁呮満閫氶亾鍙蜂负锛歿pmInfo.readAddr}閲岄潰鐨勫�涓簕result.result[0]}");
+                            if (result != null && result.errCode == 0 && result.result.Count() > 0)
+                            {
+                                //1锛氬彇鏂�+                                if (result.result[0] == 1)
+                                {
+                                    string PlcBit02 = Settings.GetPlcInfo().Where(a => a.deviceType == "22").FirstOrDefault().location;
+                                    //鍖呰涓嬬嚎浠诲姟锛岀粓鐐逛负澶嶇О浣嶇疆锛堣繖閲屽垽鏂寘瑁呮満璧风偣锛屽绉拌捣鐐圭粓鐐瑰潎鏃犱换鍔★紝鍒欐帹閫佷换鍔★級
+                                    if (ProcessHelper.PickUpStartFree(pmInfo.location) && ProcessHelper.CheckEndFree(PlcBit02) && ProcessHelper.PickUpStartFree(PlcBit02))
+                                    {
+                                        //鍒ゆ柇澶嶇О浣嶇疆锛屾病鏈夎揣骞朵笖涓嶄负NG(ng鍙傛暟0锛�锛�鈥斺�0锛屼笉纭畾锛堝寘瑁呮満鍒氬紑濮嬪伐浣滄椂锛�锛宱k 2锛宯g)
+                                        var state = GetSecondWeighStateTetracobalt(pmInfo.location);
+                                        CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氬垽鏂绉颁綅缃┖婊$姸鎬佷负:{state.full},ng鐘舵�涓猴細{state.ng}");
+                                        if (state.full == 0)
+                                        {
+                                            if (Settings.mesOpen == "1")
+                                            {
+                                                //鍙互鐢熸垚浠诲姟锛岃皟mes鎺ュ彛鑾峰彇鐢熶骇淇℃伅       2022.7.28   鍙樻洿  MES鍙兘闇�1~2骞存墠鑳戒笂绾匡紝鍏堟妸MES鍔熻兘娉ㄩ攢
+                                                CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氳幏鍙朚ES涔嬪悗杩涘叆info鍒ゆ柇锛�);
+                                                var trayCode = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                                                {
+                                                    addr = pmInfo.readAddr + 5,
+                                                    dataNum = 105,////ERP鍙樻洿锛�0  鍘熷厛锛�0
+                                                    host = pmInfo.ip,
+                                                    port = pmInfo.port
+                                                });
+                                                if (trayCode.errCode == 0 && trayCode.result.Length == 105)
+                                                {
+                                                    //鑾峰彇鎵樼洏鐮佺瓑淇℃伅  璇诲彇閫氶亾 11銆�2銆�3鐨勬暟鎹綔涓烘墭鐩樼爜   璇诲彇鍏跺畠閫氶亾 閲嶉噺 鍙犲寘绛変俊鎭�鎵�湁鏁版嵁瀛樺叆MachineInfo琛�+                                                    GetMachineDataTetracobalt(trayCode.result, false);
+                                                    var tray = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.EQ("machineNo", pmInfo.location), "MachineInfo");
+                                                    if (tray != null)
+                                                    {
+                                                        bool IsContLaterCode = true;
+                                                        if (ERPService.ERPSwitch01 == "1")
+                                                        {
+                                                            string employeeId = "G" + tray.trayCodeWeight.PadLeft(7, '0');
+                                                            // 鍒ゆ柇褰撳墠銆愬憳宸ョ紪鍙枫�閫氶亾淇℃伅璇诲嚭鏉ョ殑鍛樺伐缂栧彿鏄惁宸茬粡瀛樺湪浜庢垜浠殑鍛樺伐淇℃伅琛�ERPEmployeeTable(鏌ヨ瀛楁-employee_id)
+                                                            var erpEmployeeInfo = MongoDBSingleton.Instance.FindOne<ERPEmployeeTable>(Query.EQ("employee_id", employeeId), "ERPEmployeeTable");
+                                                            if (erpEmployeeInfo == null) IsContLaterCode = false;
+                                                        }
+
+                                                        if (IsContLaterCode)
+                                                        {
+                                                            if (tray.addState == 0)
+                                                            {
+                                                                MongoDBSingleton.Instance.Remove<MachineInfoTetracobalt>(Query.EQ("machineNo", pmInfo.location), "MachineInfo", RemoveFlags.None);
+                                                                if (ERPService.ERPSwitch01 == "0") MongoDBSingleton.Instance.Remove<MachineInfoTetracobalt>(Query.EQ("machineNo", pmInfo.location), "MachineInfoTwo", RemoveFlags.None);
+                                                                CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氬彔鎵樺眰鏁颁负0锛屼笉鍏佽鐢熸垚浠诲姟");
+                                                            }
+                                                            else if (tray.trayCode != "0" && !string.IsNullOrEmpty(tray.trayCode))
+                                                            {
+                                                                string timeStamp = ProcessHelper.GetTimeStamp(31, 1, 1);
+                                                                HHAmsExecuteResult req = AMSHelper.CreateTask(DateTime.Now.Ticks.ToString(), pmInfo.location, PlcBit02, "3妤煎寘瑁呭彇鏂�鍥涢挻)", 0, tray.trayCode, timeStamp);
+                                                                if (req.success)
+                                                                {
+                                                                    string weight = (double.Parse(tray.oneTrayWeight) / 100).ToString();
+                                                                    //int weight = int.Parse(tray.oneTrayWeight) / 100;
+                                                                    ERPService.packageInfo(tray.machineNo, tray.trayCode, tray.lotNo, weight);
+                                                                }
+                                                            }
+                                                        }
+                                                        else
+                                                        {
+                                                            //妫�储鍛樺伐淇℃伅澶辫触鍐欏叆瀵规柟閫氶亾鍊� 璇诲彇鍦板潃+3 
+                                                            var wirteall01 = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                                                            {
+                                                                addr = pmInfo.readAddr + 3,
+                                                                host = pmInfo.ip,
+                                                                port = pmInfo.port,
+                                                                data = 1
+                                                            });
+                                                        }
+                                                    }
+                                                    else CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛歵ray==null!");
+                                                }
+                                                else CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛�妤煎寘瑁呰嚦澶嶇О鑾峰彇MODBUS鍊奸敊璇紒trayCode.errCode:{trayCode.errCode},trayCode.result.Length:{trayCode.result.Length}");
+                                            }
+                                        }
+                                        else
+                                        {
+                                            var task = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.Or(Query.EQ("CN_S_START_BIT", PlcBit02), Query.EQ("CN_S_END_BIT", PlcBit02)), "TN_I_TASK_MST");
+                                            if (task != null) CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氭鏌ュ绉颁腑闂磋〃鏄惁涓虹┖锛屼笉涓虹┖鍒欐鏌ュ叾鏁版嵁full浠ュ強ng鏄惁涓�鍜�锛佷换鍔″彿涓猴細{task.CN_S_TASK_NO}");
+                                            else CMMLog.Debug("锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氭鏌ュ绉颁腑闂磋〃鏄惁涓虹┖锛屼笉涓虹┖鍒欐鏌ュ叾鏁版嵁full浠ュ強ng鏄惁涓�鍜�锛�);
+                                        }
+                                    }
+                                    else CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氬寘瑁呮満璧风偣鎴栬�澶嶇О璧风偣缁堢偣鏈変换鍔″湪鎵ц涓紒鍖呰鏈虹偣浣嶏細{pmInfo.location},澶嶇О鐐逛綅锛歿PlcBit02}");
+                                }
+                                else CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氬寘瑁呮満閫氶亾0閲岄潰鐨勬暟鎹笉涓�锛乺esult涓猴細{JsonConvert.SerializeObject(result)}");
+                            }
+                            else CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氭湭璇诲彇鍒板寘瑁呮満閫氶亾0閲岄潰鐨勬暟鎹紒锛侊紒result:{JsonConvert.SerializeObject(result)}");
+                        }
+                        else CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}锛氭湭璇诲彇鍒板寘瑁呮満閫氶亾0閲岄潰鐨勬暟鎹紒锛侊紒result:{JsonConvert.SerializeObject(result)}");
+                    }
+                    catch (Exception ex)
+                    {
+                        CMMLog.Debug($"锛堝洓閽磋溅闂达級鍖呰涓嬬嚎娴佺▼-{pmInfo.location}:" + ex.Message);
+                    }
+                }
+                else
+                {
+                    //var taskNo = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.Or(Query.EQ("CN_S_START_BIT", pmInfo.location), Query.EQ("CN_S_END_BIT", pmInfo.location)), "TN_I_TASK_MST");
+                    //string task = "", startbit = "", endbit = "";
+                    //if (taskNo != null)
+                    //{
+                    //    task = taskNo.CN_S_TASK_NO;
+                    //    startbit = taskNo.CN_S_START_BIT;
+                    //    endbit = taskNo.CN_S_END_BIT;
+                    //}
+                    CMMLog.Debug($"褰撳墠鍖呰鏈鸿捣鐐圭粓鐐规湁浠诲姟姝e湪鎵ц锛岃纭褰撳墠鍖呰鏈虹殑浠诲姟鏄惁鍙栬揣鍗歌揣瀹屾垚锛佸寘瑁呮満璐т綅缂栫爜锛歿pmInfo.location}");
+                }
+                // }
+                // else CMMLog.Info($"褰撳墠鍖呰鏈哄嚭鐜版晠闅滐紝鏃犳硶鐢熸垚浠诲姟銆傚寘瑁呮満鍙凤細{pmInfo.location}");
+            }
+            else CMMLog.Debug($"褰撳墠machineInfo涓棿琛ㄥ凡瀛樺湪鏁版嵁锛歿JsonConvert.SerializeObject(count)}");
+        }
+
+
+        static object PickUpBlankCompleteLock = new object();
+        internal static void PickUpBlankCompleteTetracobalt(string PlcBitCache01, string Extend = "")
+        {
+            lock (PickUpBlankCompleteLock)
+            {
+                CMMLog.Info("鍖呰绾胯ˉ绌烘祦绋嬩换鍔″鐞�);
+                try
+                {
+                    if (Extend != "")
+                    {
+                        CMMLog.Info($"褰撳墠鍛ㄨ浆鎵樼洏浣�{Extend}");
+                        int addr = 0;
+                        int qun = 0;
+                        //淇敼涓棿琛ㄧ殑鍊硷紝鑻ヤ腑闂磋〃鐨勬暟閲忎负0锛屽垯璋冪敤瑙g粦鏂规硶
+                        var bzEmp = MongoDBSingleton.Instance.FindOne<BZEmptyPoint>(Query.EQ("Bit", Extend), "BZEmptyPoint");
+                        if (bzEmp != null)
+                        {
+                            CMMLog.Info($"褰撳墠璐т綅鐨勬暟閲�{bzEmp.Quantity}");
+                            if (bzEmp.Quantity == 1)
+                            {
+                                CMMLog.Info($"璋冪敤瑙g粦鎺ュ彛");
+                                //瑙g粦
+                                if (WMSHelper.WMSEmptyUnbind(Extend))
+                                {
+                                    //鍒犻櫎涓棿琛ㄦ暟鎹�+                                    MongoDBSingleton.Instance.Remove<BZEmptyPoint>(Query.EQ("Bit", Extend), RemoveFlags.Single);
+                                }
+                            }
+                            else
+                            {
+                                var quantity = bzEmp.Quantity - 1;
+                                var updateBuider = Update.Set("Quantity", quantity);
+                                MongoDBSingleton.Instance.Update<BZEmptyPoint>(Query.EQ("Bit", Extend), updateBuider, UpdateFlags.None);
+                                CMMLog.Info($"鍑忓幓褰撳墠鍛ㄨ浆鎵樼洏浣嶆暟閲忎箣鍚庯紝鏁伴噺涓猴細{quantity}");
+                                qun = quantity;
+                            }
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    CMMLog.Error($"PickUpBlankComplete Error:" + ex.Message);
+                }
+            }
+        }
+
+        #region 鍖呰绾胯ˉ绌轰换鍔�+        internal static void PackingLine(string ip, string taskNo)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip).FirstOrDefault();
+            //ASM鍐欏叆灏忚溅鍔ㄤ綔锛�锛氫笂鏂欏绉帮紱2锛氫笂鐮濈爜鏁欑О锛�锛氬彇澶嶇ОNG鎵樼洏锛�锛氬彇鐮濈爜鍒板寘瑁呮満
+            int[] num = new int[3] { 3, 0, 1 };
+            var writeRes0 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+            {
+                host = ip,
+                addr = plc.writeAddr,
+                data = num,//鍘熷厛鏄�,鍗曚釜鍐欏叆
+                port = plc.port
+            });
+            CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 2}閲岄潰鏁版嵁涓簕JsonConvert.SerializeObject(num)}.");
+            //Console.WriteLine($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 2}閲岄潰鏁版嵁涓�.");
+            ///灏忚溅鍜屽绉颁綅瀵规帴
+            //灏忚溅璇锋眰杩涙枡锛屽苟涓旀煡璇㈣澶囨槸鍚﹀厑璁窤GV杩涘叆
+            var readRes = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+            {
+                dataNum = 1,
+                host = plc.ip,
+                addr = plc.readAddr + 2,
+                port = plc.port
+            });
+            CMMLog.Debug($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 2}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+            //Console.WriteLine($"璇诲彇璁惧{plc.location}閫氶亾{plc.readAddr + 2}閲岄潰鏁版嵁涓簕readRes.result[0]}.");
+            if (readRes != null && readRes.errCode == 0)
+            {
+                if (readRes.result[0] == 2)
+                {
+                    var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    {
+                        host = ip,
+                        addr = plc.writeAddr + 2,
+                        data = 2,
+                        port = plc.port
+                    });
+                    CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 2}閲岄潰鏁版嵁涓�.");
+                    //Console.WriteLine($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 2}閲岄潰鏁版嵁涓�.");
+
+                    WorkFlowAction.TrackLog(taskNo, 10, 1013, "success");
+                    TSHelper.GoToAGV(taskNo, 10, 3);
+                }
+            }
+        }
+
+        internal static void PackingLineComplete(string ip)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.ip == ip).FirstOrDefault();
+            if (plc != null)
+            {
+                //鍐欏叆鍖呰鏈�-瀹夊叏闂ㄥ叧闂ㄦ寚浠�+                var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                {
+                    host = ip,
+                    addr = plc.writeAddr + 2,
+                    data = 3,
+                    port = plc.port
+                });
+                CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 2}閲岄潰鏁版嵁涓�.");
+            }
+            else CMMLog.Debug($"鍖呰绾跨┖鎵樹笂绾匡紝3锛宨p=null!");
+        }
+
+        internal static void PickUpBlankTwo(Settings.PlcInfo pmInfo)
+        {
+            //鍥涢挻杞﹂棿 浠庡湴鍫嗙紦瀛樹綅鑾峰彇绌烘墭
+            if (ProcessHelper.PickUpEndFree(pmInfo.location))
+            {
+                CMMLog.Info($"鍖呰鏈鸿ˉ绌烘墭娴佺▼锛氭煡璇㈠寘瑁呮満锛歿pmInfo.location}");
+                //璇诲彇杈撳叆瀵勫瓨鍣ㄨ繕鏄緭鍑哄瘎瀛樺櫒寰呭畾,璇诲彇閫氶亾0鐨勬暟鎹�+                var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                {
+                    dataNum = 1,
+                    addr = pmInfo.readAddr,
+                    host = pmInfo.ip,
+                    port = pmInfo.port
+                });
+
+                CMMLog.Info($"鍖呰鏈鸿ˉ绌烘墭娴佺▼锛氬垽鏂寘瑁呮満閫氶亾{pmInfo.readAddr}鍊间负{JsonConvert.SerializeObject(result)},ip:{pmInfo.ip}");
+                if (result != null && result.errCode == 0)
+                {
+                    //3锛氫汉宸ュ彨绌烘墭鐩�宸濆瓧)  4:浜哄伐鍙┖鎵樼洏(鐢板瓧)
+                    if (result.result[0] == 3 || result.result[0] == 4)
+                    {
+                        //鍖呰绾胯ˉ绌烘祦绋�+                        //鍒ゆ柇绌烘墭缂撳瓨鐐癸紙5 瀵�2锛夋槸鍚︽湁绌烘墭锛屾湁绌烘墭鍒ゆ柇鏄惁鏈変换鍔★紝鏈変换鍔″垯鍒ゆ柇鍙︿竴涓偣浣�+
+                        var locInfo = Settings.GetAGVLocationList().Where(b => b.machineLoc.Contains(pmInfo.location) && b.Enabel == 1).First();
+                        if (locInfo != null)
+                        {
+                            CMMLog.Info($"鍖呰鏈虹偣浣嶏細{pmInfo.location}");
+                            foreach (var a in locInfo.ddLoc)
+                            {
+                                CMMLog.Info($"鍛ㄨ浆鎵樼洏浣嶏細{a}");
+                                var ddInfo = Settings.GetDDSiteList().Where(b => b.ddLoc == a && b.Enable == 1).FirstOrDefault();
+                                if(ddInfo != null)
+                                {
+                                    if(ddInfo.trayType == result.result[0] - 2)
+                                    {
+                                        if (ProcessHelper.PickUpEndFree(pmInfo.location) && ProcessHelper.PickUpStartFree(a))
+                                        {
+                                            var empInfo = MongoDBSingleton.Instance.FindOne<BZEmptyPoint>(Query.EQ("Bit", a), "BZEmptyPoint");
+                                            if (empInfo != null && empInfo.Quantity > 0)
+                                            {
+                                                CMMLog.Info($"鍖呰绾胯ˉ绌轰换鍔★紝鍖呰鏈虹偣浣嶏細{pmInfo.location}锛屽懆杞墭鐩樹綅锛歿a}锛屽懆杞墭鐩樹綅鏁伴噺锛歿empInfo.Quantity}");
+                                                HHAmsExecuteResult amsResult = AMSHelper.CreateTask(DateTime.Now.Ticks.ToString(), a, pmInfo.location, "鍖呰绾胯ˉ绌�, 0, "");
+                                                if (amsResult.success)
+                                                {
+                                                    CMMLog.Info($"鍖呰绾胯ˉ绌轰换鍔$敓鎴愭垚鍔�);
+                                                    break;
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            CMMLog.Info("閰嶇疆鏂囦欢鏈厤缃寘瑁呮満绌烘墭缂撳瓨鐐�);
+                        }
+                    }
+                    //娴佺▼鏈鎺ュソ锛屾槸鍚﹁繖鏍蜂娇鐢�寰呭畾
+                    //if (result.result[0] == 4)
+                    //{
+                    //    //璋冪敤wms鍑哄簱鎺ュ彛
+                    //    var tasks = MongoDBSingleton.Instance.Find<TN_I_TASK_MST>(Query.EQ("CN_S_END_BIT", pmInfo.location), "TN_I_TASK_MST");
+                    //    //鍒ゆ柇涓�笅褰撳墠鍙犳墭鐐规槸鍚︽湁浠诲姟鍗犵敤
+                    //    if (ProcessHelper.CheckEndFree(pmInfo.location) && tasks.Count == 0)
+                    //    {
+                    //        //鍙互鐢熸垚浠诲姟锛岃皟WMS鎺ュ彛鑾峰彇浠诲姟淇℃伅
+                    //        bool req = WMSHelper.WMSOut(pmInfo.location, "");
+                    //        if (req) CMMLog.Debug($"璋冪敤WMS鑾峰彇杈呮潗鍑哄簱鐢熸垚浠诲姟鎴愬姛锛�);//鐜板湪浠诲姟鐢盬MS鑷繁涓嬪彂锛孉MS鍋氭嫤鎴鐞嗭紙鏌ヨext1閲岄潰瀵瑰簲鐨勪换鍔$被鍨嬶紝骞舵洿鏀逛换鍔$被鍨嬶級
+                    //        else CMMLog.Debug($"璋冪敤WMS鑾峰彇杈呮潗鍑哄簱鐢熸垚浠诲姟澶辫触锛�);
+                    //    }
+                    //    else CMMLog.Debug($"妫�煡褰撳墠鍙犳墭鐐规槸鍚︽湁浠诲姟鍗犵敤锛屾垨鑰匨ST涓昏〃涓湁缂撳瓨鏋跺叆鍙犵洏鏈虹殑浠诲姟锛�);
+                    //}
+                }
+                else
+                {
+                    CMMLog.Info($"err  鍖呰鏈洪�閬搟pmInfo.readAddr}  ip:{pmInfo.ip}");
+                }
+            }
+        }
+
+        internal static void productOutWare(string endBit, string taskNo, bool action)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.location == endBit).FirstOrDefault();
+            if (plc != null)
+            {
+                if (action)
+                {
+                    int[] num = new int[3] {1,1,1};
+                    var writeRes = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                    {
+                        host = plc.ip,
+                        addr = plc.writeAddr,
+                        data = num,
+                        port = plc.port
+                    });
+                    CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr}閲岄潰鏁版嵁涓簕JsonConvert.SerializeObject(num)}.");
+
+                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 3,
+                        addr = plc.readAddr,
+                        host = plc.ip,
+                        port = plc.port
+                    });
+                    CMMLog.Debug($"鏌ヨ璁惧{plc.location}閫氶亾{plc.readAddr}閲岄潰鏁版嵁涓簕result.result[0]}銆亄result.result[1]}銆亄result.result[2]}.");
+                    if (result != null && result.errCode == 0)
+                    {
+                        if (result.result[0] == 1 && result.result[1] == 1 && result.result[2] == 2)
+                        {
+                            //鎺ㄩ�灏忚溅杩涘叆
+                            TSHelper.GoToAGV(taskNo, 10, 3);
+                            writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                host = plc.ip,
+                                addr = plc.writeAddr + 2,
+                                data = 2,
+                                port = plc.port
+                            });
+                            CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 2}閲岄潰鏁版嵁涓�.");
+                        }
+                    }
+                }
+                else
+                {
+                    var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    {
+                        host = plc.ip,
+                        addr = plc.writeAddr + 2,
+                        data = 3,
+                        port = plc.port
+                    });
+                    CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 2}閲岄潰鏁版嵁涓�.");
+                }
+            }
+        }
+
+        internal static void productInWare(string startBit, string taskNo, bool action)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.location == startBit).FirstOrDefault();
+            if (plc != null)
+            {
+                if (action)
+                {
+                    int[] num = new int[4] { 2, 0, 1, 1 };
+                    var writeRes = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                    {
+                        host = plc.ip,
+                        addr = plc.writeAddr,
+                        data = num,
+                        port = plc.port
+                    });
+                    CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr}閲岄潰鏁版嵁涓簕JsonConvert.SerializeObject(num)}.");
+
+                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 4,
+                        addr = plc.readAddr,
+                        host = plc.ip,
+                        port = plc.port
+                    });
+                    CMMLog.Debug($"鏌ヨ璁惧{plc.location}閫氶亾{plc.readAddr}閲岄潰鏁版嵁涓簕result.result[0]}銆亄result.result[1]}銆亄result.result[3]}.");
+                    if (result != null && result.errCode == 0)
+                    {
+                        if (result.result[0] == 2 && result.result[1] == 2 && result.result[2] == 2)
+                        {
+                            //鎺ㄩ�灏忚溅杩涘叆
+                            TSHelper.GoToAGV(taskNo, 10, 3);
+                            writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                host = plc.ip,
+                                addr = plc.writeAddr + 3,
+                                data = 2,
+                                port = plc.port
+                            });
+                            CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 3}閲岄潰鏁版嵁涓�.");
+                        }
+                    }
+                }
+                else
+                {
+                    var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    {
+                        host = plc.ip,
+                        addr = plc.writeAddr + 3,
+                        data = 3,
+                        port = plc.port
+                    });
+                    CMMLog.Debug($"鍐欏叆璁惧{plc.location}閫氶亾{plc.writeAddr + 3}閲岄潰鏁版嵁涓�.");
+                }
+            }
+        }
+
+        internal static void SendHeartBeat()
+        {
+            var taskInfo = MongoDBSingleton.Instance.Find<TN_I_TASK_MST>(Query.Or(Query.EQ("CN_S_BUSS_TYPE", "鐢垫鍙栬揣"), Query.EQ("CN_S_BUSS_TYPE", "鐢垫鍗歌揣")), "TN_I_TASK_MST");
+            if (taskInfo.Count > 0)
+            {
+                foreach (var item in taskInfo)
+                {
+                    if (item.CN_S_BUSS_TYPE == "鐢垫鍗歌揣" || (item.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" && !WorkFlowAction.ExistsTrackLogs(item.CN_S_TASK_NO, 1, 4)))
+                    {
+                        //鍙戦�蹇冭烦淇″彿
+                        string DTBit = item.CN_S_BUSS_TYPE == "鐢垫鍗歌揣" ? item.CN_S_END_BIT : item.CN_S_START_BIT;
+                        var plcInfo = Settings.GetPlcInfo().Where(a => a.Extend == DTBit).FirstOrDefault();
+                        if(plcInfo != null)
+                        {
+                            var wirte = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                addr = plcInfo.writeAddr + 12,
+                                data = 1,
+                                host = plcInfo.ip,
+                                port = plcInfo.port
+                            });
+                        }
+                        else
+                        {
+                            CMMLog.Info($"{DTBit}鐢垫鏈厤缃�);
+                        }
+                    }
+                }
+            }
+            Thread.Sleep(100000);
+        }
+        #endregion
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ProcessHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ProcessHelper.cs
new file mode 100644
index 0000000..16352e4
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ProcessHelper.cs
@@ -0,0 +1,1153 @@
+锘縰sing Hanhe.iWCS.Business;
+using Hanhe.iWCS.Common;
+using Hanhe.iWCS.DeviceDriver;
+using Hanhe.iWCS.MData;
+using Hanhe.iWCS.Model;
+using Hanhe.iWCS.Model.AMS;
+using MongoDB.Bson;
+using MongoDB.Driver;
+using MongoDB.Driver.Builders;
+using MongoDB.Driver.Linq;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Policy;
+using System.Text;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ApiHelper;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.EnentListen;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.MESHelper;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.PLCControl;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ProtocolAnalysis;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class ProcessHelper
+    {
+        private static ICallTaskProcessing callTaskProcessing = new ICallTaskProcessing();
+        private static WebApiHelper webApiHelper = new WebApiHelper();
+
+        public static bool CheckStartFree(string bit) {
+            var result = false;
+            var tasks = MongoDBSingleton.Instance.Find<TN_I_TASK_MST>(Query.EQ("CN_S_START_BIT", bit), "TN_I_TASK_MST");
+            if (tasks.Count == 0) {
+                result = true;
+            }
+            else {
+                for (int i = 0; i < tasks.Count; i++) {
+                    if (!WorkFlowAction.ExistsTrackLogs(tasks[i].CN_S_TASK_NO, 1, 4)) {
+                        break;
+                    }
+                }
+            }
+            return result;
+        }
+
+        public static bool CheckStartFreeTwo(string bit)
+        {
+            var result = false;
+            var tasks = MongoDBSingleton.Instance.Find<TN_I_TASK_MST>(Query.EQ("CN_S_START_BIT", bit), "TN_I_TASK_MST");
+            if (tasks.Count == 0)
+            {
+                result = true;
+            }
+            else
+            {
+                result = true;
+                for (int i = 0; i < tasks.Count; i++)
+                {
+                    if (!WorkFlowAction.ExistsTrackLogs(tasks[i].CN_S_TASK_NO, 1, 4))
+                    {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+            return result;
+        }
+
+        public static bool PickUpStartFree(string bit)
+        {
+            var result = false;
+            var tasks = MongoDBSingleton.Instance.Find<TN_I_TASK_MST>(Query.EQ("CN_S_START_BIT", bit), "TN_I_TASK_MST");
+            if (tasks.Count == 0)
+            {
+                result = true;
+            }
+            else
+            {
+                result = true;
+                for (int i = 0; i < tasks.Count; i++)
+                {
+                    if (!WorkFlowAction.ExistsTrackLogs(tasks[i].CN_S_TASK_NO, 1, 4))
+                    {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+            return result;
+        }
+
+        public static bool PickUpEndFree(string bit)
+        {
+            var result = false;
+            var tasks = MongoDBSingleton.Instance.Find<TN_I_TASK_MST>(Query.EQ("CN_S_END_BIT", bit), "TN_I_TASK_MST");
+            if (tasks.Count == 0)
+            {
+                result = true;
+            }
+            else
+            {
+                result = true;
+                for (int i = 0; i < tasks.Count; i++)
+                {
+                    if (!WorkFlowAction.ExistsTrackLogs(tasks[i].CN_S_TASK_NO, 1, 6))
+                    {
+                        result = false;
+                        break;
+                    }
+                }
+            }
+            return result;
+        }
+
+        internal static bool CheckEndFree(string bit) {
+            var count = MongoDBSingleton.Instance.FindCount<TN_I_TASK_MST>(Query.EQ("CN_S_END_BIT", bit), "TN_I_TASK_MST");
+            return count == 0;
+        }
+
+        /// <summary>
+        /// 鍙戦�浠诲姟鈥斺�宸插鍔犺捣鐐圭粓鐐瑰眰鏁帮紝鐗规畩AGV绔欑偣鎺ㄩ�
+        /// </summary>
+        /// <param name="mst"></param>
+        internal static void SendTask(TN_I_TASK_MST mst)
+        {
+            if(mst.CN_S_STATUS=="鏈墽琛� || mst.CN_S_STATUS == "寰呮帹閫�)
+            {
+                StringBuilder sbMsg = new StringBuilder();
+                var start = StockInstance.Instance.GetLocationInfoTwo(mst.CN_S_START_BIT);
+                var end = StockInstance.Instance.GetLocationInfoTwo(mst.CN_S_END_BIT);
+                string FRow = string.IsNullOrEmpty(start.CN_S_FLOOR) ? "1" : start.CN_S_FLOOR;
+                string TRow = string.IsNullOrEmpty(end.CN_S_FLOOR) ? "1" : end.CN_S_FLOOR;
+                CMMLog.Info($"浠诲姟鎺ㄩ�锛氳揣浣嶇紪鐮侊細璧风偣淇℃伅:{JsonConvert.SerializeObject(start)},缁堢偣淇℃伅:{JsonConvert.SerializeObject(end)}锛涗换鍔′俊鎭細{JsonConvert.SerializeObject(mst)}");
+
+                if (mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋�)
+                {
+                    CMMLog.Info($"浠诲姟鎺ㄩ�鐗规畩浠诲姟澶勭悊-3妤煎绉板叆缂撳瓨鏋讹細浠诲姟鍙凤細{mst.CN_S_TASK_NO},鍑嗗鑾峰彇 sendBit 閰嶇疆鏁版嵁銆傚娉細姝や换鍔$被鍨嬩粎鑾峰彇璧风偣銆�);
+                    var plc = Settings.GetSendBit().Where(a => a.taskType == mst.CN_S_BUSS_TYPE && a.bit == mst.CN_S_START_BIT).FirstOrDefault();
+                    if (plc != null)
+                    {
+                        start.CN_N_AGV_LOCATION = plc.agv;
+                        FRow = string.IsNullOrEmpty(plc.floor) ? "1" : plc.floor;
+                        CMMLog.Info($"浠诲姟鎺ㄩ�鐗规畩浠诲姟澶勭悊-3妤煎绉板叆缂撳瓨鏋�鎴愬姛锛氳幏鍙栨暟鎹垚鍔燂紝鑾峰彇鍚庣殑鐐逛綅锛歿start.CN_N_AGV_LOCATION},FRow 鍙傛暟锛歿FRow}");
+                    }
+                    else CMMLog.Info($"浠诲姟鎺ㄩ�鐗规畩浠诲姟澶勭悊-3妤煎绉板叆缂撳瓨鏋�澶辫触锛氭湭鑾峰彇鍒�settings 閰嶇疆鏂囦欢涓殑鐩稿叧鏁版嵁锛岃鏍规嵁鏃ュ織鎻愪緵鐨勭浉鍏虫暟鎹姣�sendBit 閰嶇疆鏁版嵁銆�);
+                }
+                if (mst.CN_S_BUSS_TYPE == "鍖呰绾胯ˉ绌�)
+                {
+                    CMMLog.Info($"浠诲姟鎺ㄩ�鐗规畩浠诲姟澶勭悊-鍖呰绾胯ˉ绌猴細浠诲姟鍙凤細{mst.CN_S_TASK_NO},鍑嗗鑾峰彇 AGVLocationList 閰嶇疆鏁版嵁銆傚娉細姝や换鍔$被鍨嬩粎鑾峰彇璧风偣銆�);
+                    var agvLoc = Settings.GetDDSiteList().Where(a => a.ddLoc == mst.CN_S_START_BIT).FirstOrDefault();
+                    if (agvLoc != null)
+                    {
+                        var emp = MongoDBSingleton.Instance.FindOne<BZEmptyPoint>(Query.EQ("Bit", mst.CN_S_START_BIT), "BZEmptyPoint");
+                        if (emp != null)
+                        {
+                            start.CN_N_AGV_LOCATION = agvLoc.Site[emp.Quantity - 1];
+                        }
+                    }
+                }
+                try
+                {
+                    var req = $"<Req><Order  TS='1'  Pri='{mst.CN_N_PRIORITY}' From='{start.CN_N_AGV_LOCATION}' To='{end.CN_N_AGV_LOCATION}'  No='{mst.CN_S_TASK_NO}_1' Ext1='1' Ext2='CALLADDAGV'  Ext3='' FRow='{FRow}' TRow='{TRow}'/></Req>";
+                    CMMLog.Info($"浠诲姟鎺ㄩ�锛氫笅鍙�Hosttoagv 鏁版嵁锛歿req}.");
+                    HardwareAccessObject AGVHao = HardwareAccessHelper.Instance.GetEquipmentsHAO("1");
+                    if (AGVHao != null)
+                    {
+                        object[] args = new object[1];
+                        args[0] = req;
+                        object xmlData = AGVHao._WebServiceInstance.Invoke("AddNewOrder", args);
+                        string errMsg = string.Empty;
+                        int errCode = -1;
+                        if (xmlData != null)
+                        {
+                            errCode = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)xmlData, out errMsg);
+                        }
+                        var msg = "WCS To AGV send task; errcode=" + errCode + "锛乨ata=" + sbMsg.ToString() + ";url=" + AGVHao.WebUrl;
+                        CMMLog.Info($"浠诲姟鎺ㄩ�锛氭帴鏀�Hosttoagv 鏁版嵁锛歿msg}.");
+                        if (errCode == Constants.WCS_AGV_ERRCode || errCode == 99999)
+                        {
+                            MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("_id", mst._id), Update.Set("CN_S_STATUS", "鏈墽琛�), UpdateFlags.None);
+                            AMSHelper.TaskTrackLogMessage(mst.CN_S_TASK_NO, "1", "1027", "AGV浠诲姟鎷︽埅鎺ㄩ�澶辫触", errCode.ToString());
+                            Console.WriteLine(mst.CN_S_TASK_NO + ", \"1\", \"1027\", \"AGV浠诲姟鎷︽埅鎺ㄩ�澶辫触\"," + errCode.ToString());
+                            CMMLog.Info(mst.CN_S_TASK_NO + ", \"1\", \"1027\", \"AGV浠诲姟鎷︽埅鎺ㄩ�澶辫触\"," + errCode.ToString());
+                        }
+                        else
+                        {
+                            if (errCode == 0 || errCode == 50009)
+                            {
+                                MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("_id", mst._id), Update.Set("CN_S_STATUS", "宸叉帹閫�), UpdateFlags.None);
+                            }
+                            AMSHelper.TaskTrackLogMessage(mst.CN_S_TASK_NO, "1", "1027", "AGV浠诲姟涓嬭揪鎴愬姛");
+                            Console.WriteLine(mst.CN_S_TASK_NO + "\"1\", \"1027\", \"AGV浠诲姟涓嬭揪鎴愬姛\"");
+                            CMMLog.Info(mst.CN_S_TASK_NO + "\"1\", \"1027\", \"AGV浠诲姟涓嬭揪鎴愬姛\"");
+                        }
+                    }
+                    else
+                    {
+                        Console.WriteLine("WCS To AGV send task fail; ts1 not set in ams work center");
+                        CMMLog.Info("WCS To AGV send task fail; ts1 not set in ams work center");
+                    }
+                }
+                catch (Exception ex)
+                {
+                    MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("_id", mst._id), Update.Set("CN_S_STATUS", "鏈墽琛�), UpdateFlags.None);
+                    CMMLog.Error("WCS To AGV send task fail;param=" + mst.CN_S_TASK_NO + ";err=" + ex.Message);
+                    AMSHelper.TaskTrackLogMessage(mst.CN_S_TASK_NO, "1", "1027", "AGV浠诲姟鎷︽埅鎺ㄩ�澶辫触");
+                }
+            }
+        }
+
+        #region   3妤艰澶囦换鍔�+
+        /// <summary>
+        /// 缁堢偣瀹夊叏瀵规帴锛�013瀹夊叏璇锋眰杩涘叆锛�瀹夊叏璇锋眰閫�嚭
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="code"></param>
+        internal static void EndPickUpDoorSafe(TN_I_TASK_MST mst, int code)
+        {
+            //3妤煎寘瑁呰ˉ绌猴細鍖呰鏈鸿ˉ绌烘墭娴佺▼鈥斺�3妤煎寘瑁呮満瀹夊叏闂ㄤ氦浜�+            var plc = Settings.GetPlcInfo().Where(a => a.location == mst.CN_S_END_BIT).FirstOrDefault();
+            if (plc != null || mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋�)
+            {
+                if (code == 1013)
+                {
+                    //鍗歌揣鐢宠锛屽厛鍒ゆ柇璁惧鏄惁鍏佽杩涙枡锛屽鏋滄槸鐩存帴鏀瑰弬鏁帮紝骞堕�鐭ヨ澶�+                    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) PLCControl.SecondWeightSafe(plc.ip, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋�) PLCControl.SecondWeightInCache1013(mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "3妤肩紦瀛樻灦鍏ュ彔鎵�) PLCControl.CacheStackingMouth1013(plc.deviceType, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "3妤兼媶鐩樿ˉ绌�) PLCControl.DiscRemoverReqUnload(plc.deviceType, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "鍖呰绾胯ˉ绌�) PLCControl.PackingLine(plc.ip, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣") PLCControl.LiftAction(plc,mst.CN_S_TASK_NO,true);
+                    if (mst.CN_S_BUSS_TYPE == "鍥涢挻鎴愬搧鍑哄簱" || mst.CN_S_BUSS_TYPE == "鍥涢挻杈呮潗鍑哄簱") PLCControl.productOutWare(mst.CN_S_END_BIT, mst.CN_S_TASK_NO, true);
+                }
+                if (code == 6)
+                {
+                    //鍗歌揣瀹屾垚鐢宠锛屽垽鏂澶囬偅杈硅繘鏂欏畬鎴愶紝鏀瑰弬鏁伴�鐭gv绂诲紑
+                    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) PLCControl.CheckUpUnloadComplete(plc.ip, mst.CN_S_TASK_NO,plc.port);
+                    //if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) PLCControl.SecondWeightSafeComplete(plc.ip, mst.CN_S_TASK_NO);
+                    //if (mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋�) PLCControl.SecondWeightInCache6(plc.ip, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "3妤兼媶鐩樿ˉ绌�) PLCControl.DiscRemoverUnloadComplete(plc.deviceType, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "鍖呰绾胯ˉ绌�) PLCControl.PackingLineComplete(plc.ip);
+                    if (mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣") PLCControl.LiftAction(plc, mst.CN_S_TASK_NO,false);
+                    if (mst.CN_S_BUSS_TYPE == "鍥涢挻鎴愬搧鍑哄簱" || mst.CN_S_BUSS_TYPE == "鍥涢挻杈呮潗鍑哄簱") PLCControl.productOutWare(mst.CN_S_END_BIT, mst.CN_S_TASK_NO, false);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 婊氱瓛杞︾粓鐐瑰埌浣嶄俊鍙凤細1113     鍙栬揣瀹屾垚锛�213
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="code"></param>
+        internal static void DiscRemoverEmptySupport(TN_I_TASK_MST mst, int code)
+        {
+            var plc = Settings.GetPlcInfo().Where(a => a.location == mst.CN_S_END_BIT).FirstOrDefault();
+            if (plc != null)
+            {
+                if (code == 1113)
+                {
+                    //鍗歌揣鐢宠锛屽厛鍒ゆ柇璁惧鏄惁鍏佽杩涙枡锛屽鏋滄槸鐩存帴鏀瑰弬鏁帮紝骞堕�鐭ヨ澶�+                    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) PLCControl.CheckUpReqUnload(plc.ip, mst.CN_S_TASK_NO);
+                }
+                //if (code == 1213)
+                //{
+                //    //鍗歌揣瀹屾垚鐢宠锛屽垽鏂澶囬偅杈硅繘鏂欏畬鎴愶紝鏀瑰弬鏁伴�鐭gv绂诲紑
+                //    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) PLCControl.CheckUpUnloadComplete(plc.ip, mst.CN_S_TASK_NO);
+                //}
+            }
+        }
+
+        /// <summary>
+        /// 璧风偣瀹夊叏瀵规帴锛�012瀹夊叏璇锋眰杩涘叆锛�瀹夊叏璇锋眰閫�嚭
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="code"></param>
+        internal static void StartPickUpDoorSafe(TN_I_TASK_MST mst, int code)
+        {
+            //3妤煎寘瑁呰ˉ绌猴細鍖呰鏈鸿ˉ绌烘墭娴佺▼鈥斺�3妤煎寘瑁呮満瀹夊叏闂ㄤ氦浜�+            var plc = Settings.GetPlcInfo().Where(a => a.location == mst.CN_S_START_BIT).FirstOrDefault();
+            if (plc != null)
+            {
+                if (code == 1012)
+                {
+                    //鍗歌揣鐢宠锛屽厛鍒ゆ柇璁惧鏄惁鍏佽杩涙枡锛屽鏋滄槸鐩存帴鏀瑰弬鏁帮紝骞堕�鐭ヨ澶�+                    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) PLCControl.PickUpFullDoorUnload(plc.ip, mst.CN_S_TASK_NO);//杩涘叆3妤煎寘瑁呭彇鏂欐祦绋�012,ip:{plc.ip},task:{mst.CN_S_TASK_NO}
+                    if (mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋� || mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋禢G") PLCControl.SecondWeightInCache1012(plc.deviceType, mst.CN_S_TASK_NO);//浜屾湡锛氱洿鎺ユ敼鍙傛暟
+                    //if (mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋�) PLCControl.SecondWeightInCache1012(plc.deviceType, mst.CN_S_TASK_NO);//浜屾湡锛氱洿鎺ユ敼鍙傛暟
+                    if (mst.CN_S_BUSS_TYPE == "3妤肩紦瀛樻灦鍏ュ彔鎵�) TSHelper.GoToAGV(mst.CN_S_TASK_NO, 10, 1);
+                    if (mst.CN_S_BUSS_TYPE == "3妤煎彔鐩樹笅绾�) PLCControl.StackingReqUnload(plc.deviceType, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "3妤兼墦鍖呬笅绾�) PLCControl.PackingLineUnload1012(plc.ip, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "鍥涢挻杈呮潗鍏ュ簱") PLCControl.productInWare(mst.CN_S_START_BIT, mst.CN_S_TASK_NO, true);
+                }
+                if (code == 4)
+                {
+                    //鍗歌揣瀹屾垚鐢宠锛屽垽鏂澶囬偅杈硅繘鏂欏畬鎴愶紝鏀瑰弬鏁伴�鐭gv绂诲紑
+                    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) PLCControl.PickUpFullDoorComplete(plc.ip, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋� || mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋禢G") PLCControl.SecondWeightInCache4(plc.deviceType, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "3妤煎彔鐩樹笅绾�) PLCControl.StackingComplete(plc.deviceType, mst.CN_S_TASK_NO);
+                    if (mst.CN_S_BUSS_TYPE == "3妤兼墦鍖呬笅绾�) PLCControl.PackingLineComplete4(plc.ip, mst.CN_S_SOURCE_NO);
+                    if (mst.CN_S_BUSS_TYPE != "3妤煎寘瑁呭彇鏂�) WMSHelper.ExecuteState(mst.CN_S_SOURCE_NO, 4);
+                    if (mst.CN_S_BUSS_TYPE == "鍥涢挻杈呮潗鍏ュ簱") PLCControl.productInWare(mst.CN_S_START_BIT, mst.CN_S_TASK_NO, false);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 婊氱瓛杞﹁捣鐐瑰埌浣嶄俊鍙凤細1112     鍙栬揣瀹屾垚锛�212
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="code"></param>
+        internal static void PickupAndUnload(TN_I_TASK_MST mst,int code)
+        {
+            //3妤煎寘瑁呰ˉ绌猴細鍖呰鏈鸿ˉ绌烘墭娴佺▼鈥斺�绌烘墭杈撻�绾夸氦浜掞紙鍙栫┖鎵橈紝鍙栫┖鎵樺畬鎴愶級
+            //3妤煎寘瑁呭彇鏂欙細3妤煎寘瑁呮満鍙栨枡鍘诲绉板钩鍙版祦绋嬧�鈥旇繘鍏ュ寘瑁呮満瀹夊叏闂ㄥ悗鍙栨枡
+            var plc = Settings.GetPlcInfo().Where(a => a.location == mst.CN_S_START_BIT).FirstOrDefault();
+            if (plc != null)
+            {
+                if (code == 1112)
+                {
+                    //涓夋ゼ鍖呰鏈鸿繘瀹夊叏闂ㄥ唴瀵规帴
+                    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) PLCControl.PickUpFullUnload(plc.ip, mst.CN_S_TASK_NO);
+                }
+                if (code == 1212)
+                {
+                    //涓夋ゼ鍖呰鏈哄畨鍏ㄩ棬鍐呭鎺�  浜屾湡娌℃湁婊氱瓛杞︼紝鍥犳鏃犻渶鍚�鍖呰鏈�鍐欏叆 婊氱瓛鍋滄鎸囦护
+                    //if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) PLCControl.PickUpFullComplete(plc.ip, mst.CN_S_TASK_NO);
+                }
+            }
+        }
+
+        #endregion
+
+        #region   浠诲姟澶勭悊鈥斺�鎷︽埅浠诲姟-鐢垫浠诲姟-鍙栨秷浠诲姟
+
+        /// <summary>
+        /// 鎷︽埅WMS鍙戦�鐨勪换鍔★紝鍥犱负WCS闇�瀵逛换鍔$被鍨嬭繘琛屽垎绫诲鐞�+        /// </summary>
+        /// <param name="mst"></param>
+        /// <returns></returns>
+        internal static bool Intercept(TN_I_TASK_MST mst)
+        {
+            bool result = false;// false:鐩存帴鎺ㄩ� true:鎷︽埅涓嶆帹閫�+
+            //瀵筗MS涓嬪彂鐨勪换鍔¤繘琛屾嫤鎴紝鍥犱负AMS闇�瀵逛换鍔$被鍨嬭繘琛屽尯鍒嗗鐞嗭紙璋冭瘯閫氳繃鍚庯紝鍙互鑰冭檻灏佽涓烘柟娉曪級
+
+            Console.WriteLine("浠诲姟鎷︽埅澶勭悊锛氭墽琛屽紑濮嬶紒");
+            CMMLog.Info("浠诲姟鎷︽埅澶勭悊锛氭墽琛屽紑濮嬶紒");
+            if (mst.CN_S_BUSS_TYPE == "鐢垫鍗歌揣" || mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣") return result;//涓嶆嫤鎴紝鐩存帴鎺ㄩ�
+            //婊℃墭杞繍浠诲姟锛氶渶瑕佹嫤鎴垱寤�鐢垫涓�浠诲姟锛岀劧鍚庢洿鏀逛换鍔$姸鎬佷负鎵ц涓紝涓嶈繘琛屾帹閫�+            if (mst.CN_S_BUSS_TYPE == "婊℃墭杞繍")
+            {
+                //鎻掑叆鐢垫浠诲姟涓棿琛�ElevatorTask ,淇敼 mst琛ㄤ换鍔℃潵婧愬彿 鍚庨潰 鍔燺1 琛ㄧず鐢垫涓�浠诲姟
+                //婊℃墭杞繍 浠诲姟 锛岀洰鍓嶅彧闇�鐩存帴閫佸叆搴撳尯涓紝鍙栨秷涓�ゼ鎷嗙洏鏈轰氦浜掍唬鐮�2023.10.10
+                var task = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("wmsTaskNo", mst.CN_S_TASK_NO), "ElevatorTask");
+                if (task == null)
+                {
+                    MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("_id", mst._id), Update.Set("Ext1", mst.Ext1 + "婊℃墭杞繍").Set("CN_S_STATUS", "鎵ц涓�), UpdateFlags.None);
+                    MongoDBSingleton.Instance.Insert<ElevatorTask>(new ElevatorTask { taskNo = mst.CN_S_TASK_NO, wmsTaskNo = mst.CN_S_TASK_NO, startBit = mst.CN_S_START_BIT, endBit = "", endBit02 = "", wmsEndBit = mst.CN_S_END_BIT, startFloor = 2, endFloor = 1, sendFlag = 0, create = DateTime.Now.ToString(), wmsSourceNo = mst.CN_S_SOURCE_NO, timeStramp = mst.CN_S_BATCH_NO });
+                }
+                return result = true;
+            }
+            //杈呮潗鍏ュ簱浠诲姟锛氶渶瑕佹嫤鎴垱寤�鐢垫涓�浠诲姟锛岀劧鍚庢洿鏀逛换鍔$姸鎬佷负鎵ц涓紝涓嶈繘琛屾帹閫�+            if (mst.CN_S_BUSS_TYPE == "杈呮潗鍏ュ簱")
+            {
+                CMMLog.Info("杈呮潗鍏ュ簱浠诲姟澶勭悊");
+                //鎻掑叆鐢垫浠诲姟涓棿琛�ElevatorTask ,淇敼 mst琛ㄤ换鍔℃潵婧愬彿 鍚庨潰 鍔燺1 琛ㄧず鐢垫涓�浠诲姟
+                //杈呮潗鍏ュ簱 浠诲姟
+                var task = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("wmsTaskNo", mst.CN_S_TASK_NO), "ElevatorTask");
+                if (task == null)
+                {
+                    CMMLog.Info("涓棿琛ㄦ棤鐢垫浠诲姟");
+                    MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("_id", mst._id), Update.Set("Ext1", mst.Ext1 + "杈呮潗鍏ュ簱").Set("CN_S_STATUS", "鎵ц涓�), UpdateFlags.None);
+                    MongoDBSingleton.Instance.Insert<ElevatorTask>(new ElevatorTask { taskNo = mst.CN_S_TASK_NO, wmsTaskNo = mst.CN_S_TASK_NO, startBit = mst.CN_S_START_BIT, endBit = "", endBit02 = "", wmsEndBit = mst.CN_S_END_BIT, startFloor = 1, endFloor = 2, sendFlag = 0, create = DateTime.Now.ToString(), wmsSourceNo = mst.CN_S_SOURCE_NO, timeStramp = mst.CN_S_BATCH_NO });
+                }
+                return result = true;
+
+            }
+            if (mst.CN_S_BUSS_TYPE == "鍥涢挻鎴愬搧鍑哄簱" || mst.CN_S_BUSS_TYPE == "鍥涢挻杈呮潗鍑哄簱" )
+            {
+                //3妤兼垚鍝佸嚭搴撲换鍔℃嫤鎴�+                if (!OutWareTask(mst))
+                {
+                    CMMLog.Info($"{mst.CN_S_BUSS_TYPE}娴佺▼锛屼换鍔℃洿鏀逛负true");
+                    result = true;
+                }
+            }
+            if (mst.CN_S_BUSS_TYPE == "鍥涢挻杈呮潗鍏ュ簱")
+            {
+                //3妤兼垚鍝佸嚭搴撲换鍔℃嫤鎴�+                if (!InWareTask(mst))
+                {
+                    CMMLog.Info($"{mst.CN_S_BUSS_TYPE}娴佺▼锛屼换鍔℃洿鏀逛负true");
+                    result = true;
+                }
+            }
+            var bussTypeInfo = Settings.GetHouWeiCodeo().Where(a => a.location == mst.Ext1).FirstOrDefault();
+            if (bussTypeInfo != null)
+            {
+                if (bussTypeInfo.task != "5" && bussTypeInfo.task != "15")
+                    MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("_id", mst._id), Update.Set("CN_S_BUSS_TYPE", bussTypeInfo.taskType).Set("Ext1", mst.Ext1 + bussTypeInfo.taskType), "TN_I_TASK_MST", UpdateFlags.None);
+                else
+                {
+                    var wmsinfo = MongoDBSingleton.Instance.FindOne<WMSInfo>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), "WMSInfo");
+                    if (wmsinfo == null)
+                    {
+                        MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("_id", mst._id), Update.Set("CN_S_BUSS_TYPE", bussTypeInfo.taskType).Set("Ext1", mst.Ext1 + bussTypeInfo.taskType), "TN_I_TASK_MST", UpdateFlags.None);
+                        var transInfo = mst.transportInfo.First();
+                        List<string> list = new List<string>(transInfo.itemWeight.Split(','));
+                        // trayCode 鎵樼洏鐮�濡傛灉鎵樼洏鐮佷负锛歏WT 寮�ご锛岃〃绀鸿繖涓彔鍖呭嚭鐨勪换鍔℃槸 銆愬皬鏂欍�浠诲姟锛屾彃鍏ユ暟鎹椂锛岄渶瑕佹彃鍏ュ鏉℃暟鎹紝鍐欏叆璁惧淇℃伅鏃讹紝涓嶉渶瑕佸啓鍏ユ墭鐩樼爜涓旇澶囨椂闂存埑瀛楁閮戒竴鑷�
+                        // itemWeight [浜у搧闇�眰閲嶉噺,鍛樺伐缂栧彿,鍗曟墭姣涢噸,鏄惁鍙犲簳鎵榏
+                        MongoDBSingleton.Instance.Insert<WMSInfo>(new WMSInfo
+                        {
+                            trayCode = mst.CN_S_BATCH_NO,
+                            itemCode = transInfo.itemCode,
+                            itemPCode = transInfo.itemPCode,
+                            location = transInfo.itemName,
+                            productWeight = list[0],
+                            trayCodeWeight = list[1],
+                            oneTrayWeight = list[2],
+                            palletLayers = list[3],
+                            addState = int.Parse(transInfo.itemFeatures),
+                            packageCode = transInfo.trayCode,
+                            TaskNo = mst.CN_S_TASK_NO,
+                            dateTime = DateTime.Now
+                        });
+                    }
+                    else
+                    {
+                        Console.WriteLine("浠诲姟鎷︽埅澶勭悊锛歐MSINFO涓棿琛ㄧ洰鍓嶆鍦ㄦ湁缂撳瓨鏋跺叆鍙犳墭鐨勪换鍔″湪鎵ц锛�);
+                        CMMLog.Info("浠诲姟鎷︽埅澶勭悊锛歐MSINFO涓棿琛ㄧ洰鍓嶆鍦ㄦ湁缂撳瓨鏋跺叆鍙犳墭鐨勪换鍔″湪鎵ц锛�);
+                    }
+                }
+                result = true;
+            }
+            MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("_id", mst._id), Update.Set("CN_S_STATUS", "鏈墽琛�), "TN_I_TASK_MST", UpdateFlags.None);
+            Console.WriteLine("浠诲姟鎷︽埅澶勭悊锛氭墽琛屽畬姣曪紒");
+            CMMLog.Info("浠诲姟鎷︽埅澶勭悊锛氭墽琛屽畬姣曪紒");
+            return result;
+        }
+
+        internal static bool OutWareTask(TN_I_TASK_MST mst)
+        {
+            bool result = false;
+            CMMLog.Info($"OutWareTask {mst.CN_S_BUSS_TYPE}浠诲姟娴佺▼澶勭悊寮� ,result:{result}");
+            //3妤兼垚鍝佸嚭搴撴祦绋�+            //鎴愬搧鍑哄彛杈撻�绾夸笂鏈変袱涓緭閫佸彛 姣忔潯杈撻�鍙e彲浠ョ敓鎴愪袱鏉′换鍔★紝浠诲姟鎺ㄩ�浜嗕箣鍚庣粰杈撻�绾挎暟閲忓姞涓�紝涓ゆ潯杈撻�鍙h疆娴佹帹閫佷换鍔�+
+            //鍒ゆ柇杈撻�绾挎ā寮忓拰涓棿琛ㄦā寮忛兘鏄嚭搴撴ā寮�+
+            try
+            {
+                string endMachLoc = "";
+                string endLoc = "";
+                //1銆佸垽鏂笂鏂欏钩鍙版槸鍚︾┖闂诧紝鑻ョ┖闂叉洿鏀圭粓鐐瑰埌涓婃枡骞冲彴
+                var plc = Settings.GetPlcInfo().Where(a => a.deviceType == "18" && a.enable == 1).ToList();
+                if (plc.Count > 0)
+                {
+                    #region 鍒ゆ柇杈撻�绾挎ā寮�鍙樻洿娉ㄩ噴
+                    bool action = true;
+                    plc.ForEach(a =>
+                    {
+                        var modeResult = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                        {
+                            dataNum = 1,
+                            addr = a.readAddr,
+                            host = a.ip,
+                            port = a.port
+                        });
+                        if (modeResult != null && modeResult.errCode == 0)
+                        {
+                            CMMLog.Debug($"OutWareTask锛氳鍙栨粴绛掓満{a.ip}閫氶亾鍙蜂负锛歿a.readAddr}鐨勫�涓猴細{modeResult.result[0]}");
+                            if (modeResult.result[0] == 2)
+                            {
+                                action = false;
+                                CMMLog.Debug($"OutWareTask:杈撻�绾夸负 鍏ュ簱妯″紡锛岃緭閫佺嚎鐐逛綅锛歿a.location}");
+                            }
+                            else
+                            {
+                                //璇诲彇涓棿琛ㄦā寮�+                                var modelInfo = MongoDBSingleton.Instance.FindOne<ModeList>("ModeList");
+                                if (modelInfo != null)
+                                {
+                                    if (modelInfo.Mode == "鍏ュ簱妯″紡")
+                                    {
+                                        action = false;
+                                        CMMLog.Debug($"OutWareTask:涓棿琛�ModeList涓�鍏ュ簱妯″紡");
+                                    }
+                                }
+                                else
+                                {
+                                    action = false;
+                                    CMMLog.Debug("OutWareTask:涓棿琛�ModeList 涓虹┖");
+                                }
+                            }
+                        }
+                    });
+                    if (!action)
+                    {
+                        return false;
+                    }
+                    #endregion
+
+                    CMMLog.Info($"OutWareTask 11111");
+                    string ssx01 = plc[0].location;
+                    string ssx02 = plc[1].location;
+                    //CMMLog.Info($"鏌ヨ杈撻�绾垮綋鍓嶇偣浣嶏細{a.location}");
+                    var slptInfo1 = MongoDBSingleton.Instance.FindOne<SLPTLoc>(Query.EQ("locCode", ssx01), "SLPTLoc");
+                    if (slptInfo1 == null)
+                    {
+                        CMMLog.Info($"OutWareTask 222222");
+                        endMachLoc = ssx01;
+                        slptInfo1 = new SLPTLoc
+                        {
+                            locCode = ssx01,
+                            taskNum = 1
+                        };
+                        MongoDBSingleton.Instance.Insert(slptInfo1);
+                    }
+                    else
+                    {
+                        CMMLog.Info($"OutWareTask 3333333");
+                        var slptInfo2 = MongoDBSingleton.Instance.FindOne<SLPTLoc>(Query.EQ("locCode", ssx02), "SLPTLoc");
+                        if (slptInfo2 == null)
+                        {
+                            endMachLoc = ssx02;
+                            slptInfo2 = new SLPTLoc
+                            {
+                                locCode = ssx02,
+                                taskNum = 1
+                            };
+                            MongoDBSingleton.Instance.Insert(slptInfo2);
+                        }
+                        else
+                        {
+                            CMMLog.Info($"OutWareTask 44444444444");
+                            var loc = slptInfo1.taskNum <= slptInfo2.taskNum ? slptInfo1 : slptInfo2;
+                            CMMLog.Info("OutWareTask :" + JsonConvert.SerializeObject(loc));
+                            if (loc.taskNum < 2)
+                            {
+                                endMachLoc = loc.locCode;
+                                int num = loc.taskNum + 1;
+                                MongoDBSingleton.Instance.Update<SLPTLoc>(Query.EQ("locCode", endMachLoc), Update.Set("taskNum", num), UpdateFlags.None);
+                            }
+                        }
+                    }
+                    
+                    if (!string.IsNullOrEmpty(endMachLoc))
+                    {
+                        CMMLog.Info($"OutWareTask 55555");
+                        //璁惧闈炵┖闂诧紝璁$畻缁堢偣鍒拌揣鏋�+                    
+                        //鏀逛换鍔$殑缁堢偣
+                        MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", mst.CN_S_TASK_NO), Update.Set("CN_S_END_BIT", endMachLoc), UpdateFlags.None);
+                    
+                        new SqlHelper<object>().ExecuteSql($"update dbo.tn_am_task_mst set CN_S_END_BIE='{endMachLoc}',CN_S_END_AGVBIT = '{StockInstance.Instance.GetAGVCodeForBitCode(endMachLoc)}' where CN_S_TASK_NO = '{mst.CN_S_TASK_NO}'");
+                        result = true;
+                    }
+                    else CMMLog.Info("OutWareTask 杈撻�绾夸笉鍙敤");
+                }
+                else
+                {
+                    CMMLog.Info("涓婃枡骞冲彴璁惧鏈厤缃�);
+                }
+            }
+            catch (Exception ex)
+            {
+
+                CMMLog.Info($"OutWareTask err:" + ex.Message);
+            }
+
+            CMMLog.Info($"OutWareTask result:{result}");
+            return result;
+        }
+
+        internal static bool InWareTask(TN_I_TASK_MST mst)
+        {
+            bool result = false;
+            CMMLog.Info($"InWareTask {mst.CN_S_BUSS_TYPE}浠诲姟娴佺▼澶勭悊寮� ,result:{result}");
+            //3妤艰緟鏉愬叆搴撴祦绋�+            //鍏ュ簱杈撻�绾夸笂鏈変袱涓緭閫佸彛
+
+            //鍒ゆ柇杈撻�绾挎ā寮忓拰涓棿琛ㄦā寮忛兘鏄叆搴撴ā寮�+
+            try
+            {
+                string endMachLoc = "";
+                string endLoc = "";
+                //1銆佸垽鏂笂鏂欏钩鍙版槸鍚︾┖闂诧紝鑻ョ┖闂叉洿鏀圭粓鐐瑰埌涓婃枡骞冲彴
+                var plc = Settings.GetPlcInfo().Where(a => a.location == mst.CN_S_START_BIT && a.enable == 1).First();
+                if (plc != null)
+                {
+                    bool action = true;
+                    var modeResult = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 1,
+                        addr = plc.readAddr,
+                        host = plc.ip,
+                        port = plc.port
+                    });
+                    if (modeResult != null && modeResult.errCode == 0)
+                    {
+                        CMMLog.Debug($"InWareTask锛氳鍙栨粴绛掓満{plc.ip}閫氶亾鍙蜂负锛歿plc.readAddr}鐨勫�涓猴細{modeResult.result[0]}");
+                        if (modeResult.result[0] == 1)
+                        {
+                            action = false;
+                            CMMLog.Debug($"InWareTask:杈撻�绾夸负 鍑哄簱妯″紡锛岃緭閫佺嚎鐐逛綅锛歿plc.location}");
+                        }
+                        else
+                        {
+                            //璇诲彇涓棿琛ㄦā寮�+                            var modelInfo = MongoDBSingleton.Instance.FindOne<ModeList>("ModeList");
+                            if (modelInfo != null)
+                            {
+                                if (modelInfo.Mode == "鍑哄簱妯″紡")
+                                {
+                                    action = false;
+                                    CMMLog.Debug($"InWareTask:涓棿琛�ModeList涓�鍑哄簱妯″紡");
+                                }
+                                else
+                                {
+                                    return true;
+                                }
+                            }
+                            else
+                            {
+                                action = false;
+                                CMMLog.Debug("InWareTask:涓棿琛�ModeList 涓虹┖");
+                            }
+                        }
+                    }
+                    if (!action)
+                    {
+                        return false;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+
+                CMMLog.Info($"InWareTask err:" + ex.Message);
+            }
+
+            CMMLog.Info($"InWareTask result:{result}");
+            return result;
+        }
+
+        public class ModeList
+        {
+            public ObjectId id { get; set; }
+            /// <summary>
+            /// 妯″紡
+            /// </summary>
+            public string Mode { get; set; }
+        }
+
+        /// <summary>
+        /// 3妤兼垚鍝佸嚭搴撲换鍔′腑闂磋〃
+        /// </summary>
+        public class SLPTLoc
+        {
+            public ObjectId _id { get; set; }
+            public string locCode { get; set; }
+            public int taskNum { get; set; }
+            public int count { get; set; } = 0;
+        }
+
+        /// <summary>
+        /// 绾跨▼璇诲彇鐢垫浠诲姟涓棿琛紝鎺ㄩ�涓�潯鐢垫浠诲姟        寰呯‘璁わ細杩欓噷鎺ㄩ�搴旇鏍规嵁浠诲姟鍙峰悗缂��_2鈥濆垽鏂槸鍚︿负绗簩娈典换鍔★紝棣栧厛鎺ㄩ�绗簩娈典换鍔★紝鍏舵锛屾帹閫佹渶鏃╃殑绗竴娈典换鍔�+        /// </summary>
+        internal static void CheckElevatorTask()
+        {
+            CMMLog.Info("鐢垫浠诲姟绾跨▼锛氭墽琛屽紑濮嬶紒");
+            //璇诲彇mongo ElevatorTask 琛ㄤ换鍔★紝鍏堝垽鏂湁娌℃湁 宸茬粡鎺ㄩ�鐨勶紝濡傛灉娌℃湁
+            try
+            {
+                bool isCreateTask = false;// 鏄惁鍙互鍒涘缓鐢垫浠诲姟
+                var eleTask = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_BUSS_TYPE", "鐢垫鍗歌揣"), "TN_I_TASK_MST");
+                if (eleTask != null)
+                {
+                    if (WorkFlowAction.ExistsTrackLogs(eleTask.CN_S_TASK_NO, 1, 6)) isCreateTask = true;
+                }
+                else isCreateTask = true;
+                if (isCreateTask)
+                {
+                    var taskInfo = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("sendFlag", 0), "ElevatorTask");
+                    if (taskInfo != null)
+                    {
+                        CMMLog.Info("鐢垫浠诲姟绾跨▼锛氬垱寤轰竴鏉′粠褰撳墠璧风偣鍓嶅線褰撳墠妤煎眰绛夊緟鐐圭殑浠诲姟");
+                        //鍒涘缓涓�潯浠庡綋鍓嶈捣鐐瑰墠寰�綋鍓嶆ゼ灞傜瓑寰呯偣鐨勪换鍔★紝绛夋敹鍒板皬杞﹀湪绛夊緟鐐瑰彂閫佺殑淇″彿涔嬪悗锛�+                        //鍒ゆ柇涓ら儴鐢垫鍝釜鍙互浣跨敤锛屽湪鍒涘缓涓�浜屾鐢垫浠诲姟锛屽洖褰掑師濮嬫祦绋�+                        var mst = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", taskInfo.taskNo), "TN_I_TASK_MST");
+                        if (mst != null && mst.CN_S_BUSS_TYPE == "婊℃墭杞繍")//taskInfo.startBit == location
+                        {
+                            CMMLog.Info($"鐢垫浠诲姟绾跨▼锛氭弧鎵樿浆杩愮瓑寰呯偣{Settings.Wait02}");
+                            //婊℃墭杞繍
+                            AMSHelper.CreateTask(taskInfo.wmsTaskNo + "_1", taskInfo.startBit, Settings.Wait02, "鐢垫鍗歌揣", 10, taskInfo.timeStramp);
+                        }
+                        else
+                        {
+                            CMMLog.Info($"鐢垫浠诲姟绾跨▼锛氱┖鎵樺嚭搴撶瓑寰呯偣{Settings.Wait01}");
+                            //绌烘墭鍑哄簱
+                            AMSHelper.CreateTask(taskInfo.wmsTaskNo + "_1", taskInfo.startBit, Settings.Wait01, "鐢垫鍗歌揣", 10, taskInfo.timeStramp);
+                        }
+                        //鏍规嵁 taskNo 鏌ヨ浠诲姟锛屾帹閫侊紝淇敼ams浠诲姟鐨勭粓鐐规槸 鐢垫浠诲姟鐨勮捣鐐�sendTask
+                        MongoDBSingleton.Instance.Update<ElevatorTask>(Query.EQ("taskNo", taskInfo.taskNo), Update.Set("sendFlag", 1).Set("taskNo", taskInfo.wmsTaskNo + "_1"), "ElevatorTask", UpdateFlags.None);
+                    }
+                    else CMMLog.Info("鐢垫浠诲姟绾跨▼锛氬綋鍓嶇數姊腑闂磋〃鏃犱换鍔★紒");
+                }
+                else Console.WriteLine($"鐢垫浠诲姟绾跨▼锛氬綋鍓嶇數姊换鍔″凡鏈変袱鏉″浜庢墽琛屼腑锛屼笉鍏佽鍐嶅垱寤�鐢垫鍗歌揣 浠诲姟銆�);
+            }
+            catch(Exception ex)
+            {
+                Console.WriteLine($"鐢垫浠诲姟绾跨▼鎵ц寮傚父锛歿ex.Message}");
+            }
+
+            
+            CMMLog.Info("鐢垫浠诲姟绾跨▼锛氭墽琛岀粨鏉燂紒");
+        }
+
+        /// <summary>
+        /// 鐢垫寮�棬鍏抽棬鏈嶅姟
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="v">true 寮�棬璇锋眰  false鍏抽棬璇锋眰</param>
+        /// <exception cref="NotImplementedException"></exception>
+        internal static void OperateDoor(TN_I_TASK_MST mst, int code)
+        {
+            //鐩墠浠呭瓨鍦�鍏ュ簱浠诲姟(涓夋ゼ鑷充竴妤� 2023.10.10 鏇存柊
+            //1012-4(浜屾浠诲姟璧风偣)    1013-6锛堜竴娈典换鍔$粓鐐癸級
+            //鏍规嵁浠诲姟绫诲瀷鎴栬�璧风偣缁堢偣鍒ゆ柇        杩欓噷鍒ゆ柇灏忚溅鏄幓鍗歌揣杩樻槸鍙栬揣
+            var query = Query.EQ("taskNo",mst.CN_S_SOURCE_NO);
+            //浠诲姟鍙锋煡璇� ElevatorTask
+            ElevatorTask task = MongoDBSingleton.Instance.FindOne<ElevatorTask>(query, "ElevatorTask");
+            // string PlcBit04 = Settings.GetPlcInfo().Where(a => a.deviceType == "4").FirstOrDefault().location;//鎵撳寘绾夸笅绾垮彛
+            // string PlcBit07 = Settings.GetPlcInfo().Where(a => a.deviceType == "7").FirstOrDefault().location;//涓�ゼ鎷嗙洏鏈虹偣浣�+            if (code == 1312 || code == 6)
+            {
+                //鍗歌揣-璇锋眰寮�棬   鍗歌揣瀹屾垚    缁檖lc鍙戞秷鎭紝鍗歌揣浠诲姟 璁﹑lc startFloor 寮�棬锛屽彇璐т换鍔�璁﹑lc endFloor寮�棬
+                //鍏ュ簱浠诲姟涓�浠诲姟缁堢偣璐ф杩涘叆
+                if (code == 1312) PLCControl.RuKuOne1013(mst, task.startFloor);// && task.startBit == PlcBit04 && task.wmsEndBit == PlcBit07
+                else
+                {
+                    //if (task.startBit == PlcBit04 && task.wmsEndBit == PlcBit07)
+                    //{
+                        //鍏ュ簱浠诲姟涓�浠诲姟缁堢偣璐ф閫�嚭
+                        //濡傛灉鏄�鍗歌揣浠诲姟 鍏抽棬
+                        //缁欑數姊痯lc鍙戜俊鍙凤紝璁╀粬浠巗tartfloor 鍒癳ndfloor 
+                        if (PLCControl.RuKuOne6(mst, task.endFloor)) 
+                        {
+                            //鍏抽棬鍚屾椂鐢熸垚涓�潯瀵瑰簲妤煎眰鐨勫彇璐т换鍔★紙浜屾浠诲姟锛�+                            AMSHelper.SetStatus(mst.CN_S_TASK_NO, 1, "2", "0", true);
+                            string startBit = (mst.CN_S_START_BIT == Settings.Wait01 || mst.CN_S_END_BIT == Settings.Wait01) ? Settings.Wait02 : Settings.Wait01;
+                            AMSHelper.CreateTask(task.wmsTaskNo + "_2", startBit, task.wmsEndBit, "鐢垫鍙栬揣", 10, mst.CN_S_BATCH_NO);
+                            //鏌ヨ鏇存柊鐢垫浠诲姟涓棿琛ㄧ殑浠诲姟鍙蜂负浜屾浠诲姟
+                            MongoDBSingleton.Instance.Update<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), Update.Set("taskNo", task.wmsTaskNo + "_2"), UpdateFlags.None);
+                        }
+                    //}
+                }
+            }
+            else if(code == 1012 || code == 4)
+            {
+                // && task.startBit == PlcBit04 && task.wmsEndBit == PlcBit07
+                //  if (task.startBit == PlcBit04 && task.wmsEndBit == PlcBit07) 
+                //鍙栬揣-璇锋眰寮�棬   鍙栬揣瀹屾垚    4_6    灏忚溅绂诲紑璐ф锛屼竴娈典换鍔″畬鎴愶紝缁撴潫涓�浠诲姟锛屽紑濮嬫帹閫佷簩娈典换鍔�+                if (code == 1012) PLCControl.RuKuOne1012(mst, task.endFloor);//鍏ュ簱浠诲姟浜屾浠诲姟璧风偣璐ф璇锋眰寮�棬
+                else PLCControl.RuKuOne4(mst, task.endFloor);//鍏ュ簱浠诲姟浜屾浠诲姟璧风偣璐ф璇锋眰鍏抽棬
+            }
+        }
+        /// <summary>
+        /// 鍙栨秷浠诲姟澶勭悊
+        /// </summary>
+        /// <param name="mst"></param>
+        public static void TaskCancel(TN_I_TASK_MST mst)
+        {
+            CMMLog.Info($"杩涘叆鍙栨秷浠诲姟娴佺▼锛佷换鍔$被鍨嬶細{mst.CN_S_BUSS_TYPE}");
+            if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�))
+            {
+                CMMLog.Info($"浠诲姟绫诲瀷锛歿mst.CN_S_BUSS_TYPE},浠诲姟鎿嶄綔锛氭煡璇�MachineInfo>琛ㄤ腑宸插綋鍓嶈捣鐐逛负鍖呰鏈哄彿鐨勬暟鎹甿achineNo锛屼笉涓虹┖锛屽垹闄わ紒浠诲姟鍙凤細{mst.CN_S_TASK_NO},浠诲姟璧风偣锛歿mst.CN_S_START_BIT},浠诲姟缁堢偣锛歿mst.CN_S_END_BIT}");
+                if (mst.CN_S_BUSS_TYPE.Contains("鍥涢挻"))
+                {
+                    var tray = MongoDBSingleton.Instance.FindOne<MachineInfoTetracobalt>(Query.EQ("machineNo", mst.CN_S_START_BIT), "MachineInfo");
+                    if (tray != null)
+                    {
+                        MongoDBSingleton.Instance.Remove<MachineInfoTetracobalt>(Query.EQ("machineNo", mst.CN_S_START_BIT), RemoveFlags.Single);
+                        if (ERPService.ERPSwitch01 == "0") MongoDBSingleton.Instance.Remove<MachineInfoTetracobalt>(Query.EQ("machineNo", mst.CN_S_START_BIT), "MachineInfoTetracobalt", RemoveFlags.Single);
+                    }
+                }
+                else
+                {
+                    var tray = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.EQ("machineNo", mst.CN_S_START_BIT), "MachineInfo");
+                    if (tray != null)
+                    {
+                        MongoDBSingleton.Instance.Remove<MachineInfo>(Query.EQ("machineNo", mst.CN_S_START_BIT), RemoveFlags.Single);
+                        if (ERPService.ERPSwitch01 == "0") MongoDBSingleton.Instance.Remove<MachineInfoTwo>(Query.EQ("machineNo", mst.CN_S_START_BIT), "MachineInfoTwo", RemoveFlags.Single);
+                    }
+                }
+                
+            }
+            if (mst.CN_S_BUSS_TYPE == "3妤肩紦瀛樻灦鍏ュ彔鎵�)
+            {
+                var plc = Settings.GetPlcInfo().Where(a => a.deviceType == "3").FirstOrDefault();
+                if (plc != null)
+                {
+                    var machine = MongoDBSingleton.Instance.FindOne<WMSInfo>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), "WMSInfo");
+                    if (machine != null)
+                    {
+                        #region   鍐欏涓狹ODBUS鏁版嵁
+                        if (Settings.cacheStackWrite == "0")
+                        {
+                            int[] num = DiePan(machine);
+
+                            CMMLog.Info($"send num:");
+                            CMMLog.Info(JsonConvert.SerializeObject(num));
+                            var wirteall01 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                            {
+                                addr = plc.writeAddr + 10,
+                                host = plc.ip,
+                                port = plc.port,
+                                data = num
+                            });
+                        }
+                        else WriteCacheStackingData(plc, mst, machine);
+                        
+                        #endregion
+                        MongoDBSingleton.Instance.Remove<WMSInfo>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), "WMSInfo", RemoveFlags.Single);
+                    }
+                }
+            }
+            if (mst.CN_S_BUSS_TYPE == "鐢垫鍗歌揣" || mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" || mst.CN_S_BUSS_TYPE == "婊℃墭杞繍")
+            {
+                CMMLog.Info($"浠诲姟绫诲瀷锛歿mst.CN_S_BUSS_TYPE},浠诲姟鎿嶄綔锛氭煡璇�ElevatorTask>琛ㄤ腑浠ュ綋鍓嶄换鍔″彿鎴栨潵婧愬彿涓轰换鍔″彿taskNo琛ㄥ瓧娈电殑鏁版嵁锛屼笉涓虹┖锛屽垹闄わ紒");
+                CMMLog.Info($"濡傛灉鏄瓙浠诲姟鍒犻櫎锛岃繕闇�缃富浠诲姟锛屼篃灏辨槸褰撳墠浠诲姟瀵瑰簲鐨刣aintiness涓棿琛ㄤ腑wmsSourceNo瀛楁鎵�搴旂殑浠诲姟");
+                var query = Query.Or(Query.EQ("taskNo", mst.CN_S_TASK_NO), Query.EQ("taskNo", mst.CN_S_SOURCE_NO));
+                var cancel = MongoDBSingleton.Instance.FindOne<ElevatorTask>(query, "ElevatorTask");
+                if (cancel != null)
+                {
+                    CMMLog.Info($"鏌ヨ涓昏〃涓互鐢垫浠诲姟褰撳墠浠诲姟涓棿琛ㄤ腑wmsSource涓烘潵婧愬彿鐨勪换鍔�);
+                    var master = MongoDBSingleton.Instance.FindOne<TN_I_TASK_MST>(Query.EQ("CN_S_SOURCE_NO", cancel.wmsSourceNo), "TN_I_TASK_MST");
+                    if (master != null)
+                    {
+                        callTaskProcessing.CancelTask(master.CN_S_TASK_NO, "1");
+                        AMSHelper.SetStatus(master.CN_S_TASK_NO, 1, "7", "0", true);
+                        WMSHelper.ExecuteState(master.CN_S_TASK_NO,7);
+                        callTaskProcessing.DeleteTask(master.CN_S_TASK_NO);
+                    }
+                    MongoDBSingleton.Instance.Remove<ElevatorTask>(query, RemoveFlags.Single);
+                }
+            }
+            MongoDBSingleton.Instance.Remove<Mongo_AGV_TASK_STATE>(Query.EQ("TaskNo", mst.CN_S_TASK_NO), RemoveFlags.None);
+            CMMLog.Info($"鍙栨秷浠诲姟娴佺▼缁撴潫锛�);
+        }
+        /// <summary>
+        /// 寮哄埗瀹屾垚浠诲姟澶勭悊
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="action"></param>
+        public static void ForceComplete(TN_I_TASK_MST mst, TN_I_TASK_DTL_ACTION action)
+        {
+            CMMLog.Info($"寮哄埗瀹屾垚浠诲姟澶勭悊锛氭敹鍒�淇″彿涔嬪悗鐗规畩浠诲姟绫诲瀷澶勭悊锛氫换鍔″彿锛歿mst.CN_S_TASK_NO},浠诲姟绫诲瀷锛歿mst.CN_S_BUSS_TYPE}");
+            if (mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" || mst.CN_S_BUSS_TYPE == "鐢垫鍗歌揣" || mst.CN_S_BUSS_TYPE == "婊℃墭杞繍" || mst.CN_S_BUSS_TYPE == "绌烘墭鍑哄簱")
+            {
+                var ele = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), "ElevatorTask");
+                if (ele != null)
+                {
+                    AMSHelper.SetStatus(ele.wmsTaskNo, 1, "2", action.CN_S_DEVICE_CODE, true);
+                    WMSHelper.ExecuteState(ele.wmsSourceNo, 2);
+                    MongoDBSingleton.Instance.Remove<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), RemoveFlags.Single);
+                    MongoDBSingleton.Instance.Remove<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", ele.wmsTaskNo), RemoveFlags.Single);
+                }
+            }
+            if(mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�))
+            {
+                MongoDBSingleton.Instance.Remove<MachineInfo>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), RemoveFlags.Single);
+                if (ERPService.ERPSwitch01 == "0") MongoDBSingleton.Instance.Remove<MachineInfoTwo>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), "MachineInfoTwo", RemoveFlags.Single);
+            }
+        }
+        /// <summary>
+        /// 鐢垫鍙栨秷鍒犻櫎浠诲姟
+        /// </summary>
+        /// <param name="mst"></param>
+        /// <param name="action"></param>
+        public static void ForceCancel(TN_I_TASK_MST mst, TN_I_TASK_DTL_ACTION action)
+        {
+            CMMLog.Info($"鍙栨秷浠诲姟澶勭悊锛氭敹鍒�淇″彿涔嬪悗鐗规畩浠诲姟绫诲瀷澶勭悊锛氫换鍔″彿锛歿mst.CN_S_TASK_NO},浠诲姟绫诲瀷锛歿mst.CN_S_BUSS_TYPE}");
+            if (mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" || mst.CN_S_BUSS_TYPE == "鐢垫鍗歌揣" || mst.CN_S_BUSS_TYPE == "婊℃墭杞繍" || mst.CN_S_BUSS_TYPE == "绌烘墭鍑哄簱")
+            {
+                var ele = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), "ElevatorTask");
+                if (ele != null)
+                {
+                    AMSHelper.SetStatus(ele.wmsTaskNo, 1, "7", "0", true);
+                    WMSHelper.ExecuteState(ele.wmsSourceNo, 7);
+                    MongoDBSingleton.Instance.Remove<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), "ElevatorTask", RemoveFlags.Single);
+                    MongoDBSingleton.Instance.Remove<TN_I_TASK_MST>(Query.EQ("CN_S_TASK_NO", ele.wmsTaskNo), "TN_I_TASK_MST", RemoveFlags.Single);
+                }
+            }
+            if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�))
+            {
+                if (mst.CN_S_BUSS_TYPE.Contains("鍥涢挻"))
+                {
+                    MongoDBSingleton.Instance.Remove<MachineInfoTetracobalt>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), RemoveFlags.Single);
+                    if (ERPService.ERPSwitch01 == "0") MongoDBSingleton.Instance.Remove<MachineInfoTetracobalt>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), "MachineInfoTetracobalt", RemoveFlags.Single);
+                }
+                else
+                {
+                    MongoDBSingleton.Instance.Remove<MachineInfo>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), RemoveFlags.Single);
+                    if (ERPService.ERPSwitch01 == "0") MongoDBSingleton.Instance.Remove<MachineInfoTwo>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), "MachineInfoTwo", RemoveFlags.Single);
+                }
+                
+            }
+        }
+        #endregion
+
+        #region   鍏呯數浠诲姟
+        public static string battery = Settings.BatteryTime;
+        internal static void AGVBatteryTime()
+        {
+            CMMLog.Info("杩涘叆鍏呯數浠诲姟娴佺▼鍒ゆ柇锛氭墽琛屽紑濮嬶紒");
+            var now = DateTime.Today;
+            string date = now.Year.ToString() + "-" + now.Month.ToString() + "-" + now.Day.ToString() + " " + battery;
+            DateTime dt = Convert.ToDateTime(date);
+            //鍗佸垎閽熶互鍐呭垽鏂綋鍓嶅厖鐢垫々鏄惁鏈夊皬杞﹀湪鍏呯數锛屾病鏈夊垯鎺ㄩ�褰撳墠鍏呯數妗╃數閲忔渶浣庣殑涓�締灏忚溅鍘诲厖鐢碉紝骞跺啓鍏ュ厖鐢垫々鐘舵�
+            CMMLog.Info("杩涘叆鍏呯數浠诲姟娴佺▼:鑾峰彇閰嶇疆鏂囦欢鏃堕棿锛屽苟鍒ゆ柇褰撳墠鏃堕棿鍑忓幓閰嶇疆鏂囦欢鏃堕棿鏄惁鍦�0鍒嗛挓浠ュ唴锛�);
+            if (DateTime.Now.Subtract(dt).TotalMinutes <= 20 && DateTime.Now.Subtract(dt).TotalMinutes > 0)
+            {
+                //鍏堝垽鏂腑闂磋〃鏄惁鏈夊綋鍓嶅厖鐢垫々鐨勭姸鎬侊紝鏈夊垯涓嶆搷浣滐紝鍙嶄箣杩涘叆灏忚溅鐢甸噺鏌ヨ
+                CMMLog.Info("杩涘叆鍏呯數浠诲姟娴佺▼:褰撳墠鏃堕棿婊¤冻鐢熸垚鍏呯數浠诲姟鍩烘湰瑕佹眰锛屽紑濮嬪垽鏂瑿hargingPile閰嶇疆椤逛腑褰撳墠鍏呯數妗╃姸鎬佹槸鍚﹀紑鍚�);//ChargingPile
+                var list = Settings.GetChargingPile().Where(a => a.enable == "1").ToList();
+                if (list.Count > 0)
+                {
+                    //CMMLog.Info("04");
+                    list.ForEach(a => {
+                        //CMMLog.Info("05");
+                        var margin = MongoDBSingleton.Instance.FindOne<MarginAGV>(Query.EQ("marginGroup", int.Parse(a.charginGroup)), "MarginAGV");
+                        int agvBattery = 1000, agvNo = 0, marginGroup = 0;
+                        if (margin == null)
+                        {
+                            CMMLog.Info($"杩涘叆鍏呯數浠诲姟娴佺▼锛氬垽鏂綋鍓嶅厖鐢垫々鍒嗙粍{a.charginGroup}鑳藉惁鍦–hargingPile閰嶇疆椤逛腑鏌ユ壘鍒颁笖enable涓哄紑鍚姸鎬侊紒");
+                            var list2 = Settings.GetChargingPile().Where(b => b.charginGroup == a.charginGroup && b.enable == "1").ToList();
+                            list2.ForEach(b =>
+                            {
+                                CMMLog.Info($"杩涘叆鍏呯數浠诲姟娴佺▼锛氬垽鏂綋鍓嶈溅鍙疯兘鍚﹀湪<HangChaAGV>灏忚溅杞﹁韩鐘舵�琛ㄤ腑鏌ヨ鍒版暟鎹紝杞﹀彿agvNo:{b.agvNo}");
+                                var battery = MongoDBSingleton.Instance.FindOne<HangChaAGV>(Query.EQ("agvNo", b.agvNo), "HangChaAGV");
+                                if(battery != null)
+                                {
+                                    if (int.Parse(battery.agvBattery) < agvBattery)
+                                    {
+                                        //CMMLog.Info($"杩涘叆鍏呯數浠诲姟娴佺▼锛�6 ");
+                                        agvBattery = int.Parse(battery.agvBattery);
+                                        agvNo = int.Parse(b.agvNo);
+                                        marginGroup = int.Parse(b.charginGroup);
+                                    }
+                                }
+                                else CMMLog.Info($"杩涘叆鍏呯數浠诲姟娴佺▼锛歟rror:褰撳墠杞﹀彿鍦℉angChaAgv涓棿琛ㄤ腑鏌ヨ涓嶅埌鏁版嵁锛佽溅鍙凤細{b.agvNo},鎵�睘鍏呯數妗╋細{b.charginGroup}");
+                            });
+                            //鎺ㄩ�灏忚溅鍓嶅線鎸囧畾鍏呯數妗╋紝骞舵彃鍏ヤ腑闂磋〃鐘舵�
+                            var agv = MongoDBSingleton.Instance.FindOne<MarginAGV>(Query.And(Query.EQ("agvNo", agvNo),Query.EQ("marginGroup", marginGroup)), "MarginAGV");
+                            if(agv == null && agvNo != 0)
+                            {
+                                TSHelper.SendChargeTask(agvNo.ToString(), true);
+                                //澧炲姞鏃堕棿
+                                MongoDBSingleton.Instance.Insert<MarginAGV>(new MarginAGV { agvNo = agvNo, marginGroup = marginGroup ,dateTime = DateTime.Now});
+                            }
+                        }
+                    });
+                }
+            }
+            else
+            {
+                CMMLog.Info("杩涘叆鍏呯數浠诲姟娴佺▼锛氳秴杩囧崄鍒嗛挓锛屽垹闄や腑闂磋〃");
+                //瓒呰繃鍗佸垎閽燂紝鍒犻櫎涓棿琛�+                MongoDBSingleton.Instance.ReomveAll<MarginAGV>();
+            }
+            CMMLog.Info("杩涘叆鍏呯數浠诲姟娴佺▼鍒ゆ柇锛氭墽琛岀粨鏉燂紒");
+        }
+        #endregion
+
+        /// <summary>
+        /// 鑾峰彇鏉弶AGV<HangChaAGV>琛ㄩ噷灏忚溅鐢甸噺锛屽苟灏嗗叾鍐欏叆MODBUS涓�+        /// </summary>
+        public static int[] GetBatteryHang() 
+        {
+            int[] num = new int[5];
+            var bits = Settings.GetChargingAgvNo();
+            CMMLog.Info($"鑾峰彇灏忚溅杞﹀彿淇℃伅锛歿JsonConvert.SerializeObject(bits)}");//6723
+            for (int i = 0; i < num.Length; i++)
+            {
+                var battery = MongoDBSingleton.Instance.FindOne<HangChaAGV>(Query.EQ("agvNo", bits[i]), "HangChaAGV");
+                num[i] = battery == null ? 0 : int.Parse(battery.agvBattery);
+            }
+            CMMLog.Info($"鑾峰彇灏忚溅鐢甸噺锛歿JsonConvert.SerializeObject(num)}");
+            return num;
+        }
+
+        /// <summary>
+        /// 鐢垫浠诲姟涓棿琛紝閫氳繃绾跨▼鍒涘缓鐨勮法妤煎眰浠诲姟閮戒細琚嫤鎴斁鍏ユ琛ㄤ腑
+        /// </summary>
+        public class ElevatorTask
+        {
+            public ObjectId _id { get; set; }
+            public string taskNo { get; set; }
+            public string wmsTaskNo { get; set; }
+            /// <summary>
+            /// WMS鏉ユ簮鍙�+            /// </summary>
+            public string wmsSourceNo { get; set; }
+            /// <summary>
+            /// 浜屾鐢垫浠诲姟缁堢偣 璇婚厤缃枃浠�+            /// </summary>
+            public string wmsEndBit { get; set; }
+            /// <summary>
+            /// 涓�浠诲姟鐢垫瑕佸埌杈剧殑妤煎眰
+            /// </summary>
+            public int startFloor { get; set; }
+            /// <summary>
+            /// 涓�鐢垫浠诲姟璧风偣 璇婚厤缃枃浠�+            /// </summary> 
+            public string startBit { get; set; }
+            /// <summary>
+            /// 浜屾浠诲姟鐢垫瑕佸埌杈剧殑妤煎眰
+            /// </summary>
+            public int endFloor { get; set; }
+            /// <summary>
+            /// 涓�鐢垫浠诲姟缁堢偣/浜屾鐢垫浠诲姟璧风偣 璇婚厤缃枃浠�+            /// </summary>
+            public string endBit { get; set; }
+            /// <summary>
+            /// 浜屾鐢垫浠诲姟璧风偣
+            /// </summary>
+            public string endBit02 { get; set; }
+            /// <summary>
+            /// 浠诲姟鍙戦�鐘舵�  0锛氳〃绀轰换鍔℃湭鍚姩   1锛氳〃绀轰换鍔℃墽琛屼腑
+            /// </summary>
+            public int sendFlag { get; set; }
+            public string occupy { get; set; } = "";
+            /// <summary>
+            /// 鏃堕棿鎴�-婊℃墭涓嬬嚎鏃跺瓨鍦ㄦ暟鎹紝瀛樺叆ext1瀛楁涓�+            /// </summary>
+            public string timeStramp { get; set; }
+            /// <summary>
+            /// 浠诲姟鍒涘缓鏃堕棿
+            /// </summary>
+            public string create { get; set; }
+        }
+
+        /// <summary>
+        /// WMS鍙犵洏鏈轰换鍔′腑瀛樺偍淇℃伅
+        /// </summary>
+        public class WMSInfo
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 浜у搧鍨嬪彿 11 60
+            /// </summary>
+            public string itemCode { get; set; }
+            /// <summary>
+            /// 鎵规鍙� 30 30
+            /// </summary>
+            public string itemPCode { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁3鈥斺�鎵樼洏鐮�         
+            /// </summary>
+            public string trayCode { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄彿        
+            /// </summary>
+            public string location { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�浜у搧闇�眰閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string productWeight { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鎵樼洏閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string trayCodeWeight { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍗曟墭瀹為檯閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string oneTrayWeight { get; set; }
+            /// <summary>
+            /// 鏄惁鍙犲簳鎵橈紙1-涓嶅彔搴曟墭锛�-鍙犲簳鎵橈級
+            /// </summary>
+            public string palletLayers { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鏄惁闇�鍙犲寘锛�锛氬彔鍖咃紝2锛氫笉鍙犲寘
+            /// </summary>
+            public int addState { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�琚嬪彿(001,002,003鈥�99)
+            /// </summary>
+            public string packageCode { get; set; }
+            public DateTime dateTime { get; set; }
+            public string TaskNo { get; set; }
+        }
+        /// <summary>
+        /// 鍏呯數浠诲姟涓棿琛�+        /// </summary>
+        public class MarginAGV
+        {
+            public ObjectId id { get; set; }
+            public int agvNo { get; set; }
+            public int marginGroup { get; set; }
+            public DateTime dateTime { get; set; }
+        }
+        /// <summary>
+        /// 鍘婚櫎瀛楃涓蹭腑NULL瀛楃涓�+        /// </summary>
+        internal static string RemoveNull(string str)
+        {
+            CMMLog.Info($"remove:{str}");
+            string result = "";
+            string empty = null;
+            for(int i = 0; i <= str.Length-1; i++)
+            {
+                if(str.Substring(i,1) != empty && str.Substring(i, 1) != "" && str.Substring(i, 1) != " " && str.Substring(i,1) != "\0")
+                {
+                    //CMMLog.Debug($"str.substring:{i},{str.Substring(i, 1)}");
+                    result = result + str.Substring(i, 1);
+                }
+                //else
+                //{
+                //    return result;
+                //}
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏃堕棿鎴�+        /// </summary>
+        /// <param name="DataBitType">鏁版嵁浣嶆暟锛氬�锛�2|64  鍚箟锛�2浣峾64浣�/param>
+        /// <param name="TimeType">鑾峰彇鏃堕棿绫诲瀷锛氬�锛�|2   鍚箟锛�-绉掔骇   2-姣绾�/param>
+        /// <param name="TimeUtcType">鑾峰彇鏃堕棿Utc绫诲瀷锛氬�锛�|2   鍚箟锛�-鏈湴鏃堕棿   2-Utc鏃堕棿</param>
+        /// <returns></returns>
+        public static string GetTimeStamp(int DataBitType, int TimeType, int TimeUtcType)
+        {
+            string timeStamp = "";
+
+            //鏃堕棿鎴虫墦鍗�+            DateTime dateTime = TimeUtcType == 1 ? DateTime.Now : DateTime.UtcNow;//鏈湴鏃堕棿|Utc鏃堕棿鑾峰彇
+            TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0);//鏃堕棿鎴宠幏鍙�+            double tsTime = TimeType == 1 ? ts.TotalSeconds : ts.TotalMilliseconds;//绉掔骇|姣绾ф椂闂磋幏鍙�+
+            string TimeTypeInfo = TimeType == 1 ? "绉掔骇" : "姣绾�;
+            string TimeUtcTypeInfo = TimeUtcType == 1 ? "鏈湴鏃堕棿" : "Utc鏃堕棿";
+            timeStamp = DataBitType == 32 ? Convert.ToInt32(tsTime).ToString() : Convert.ToInt64(tsTime).ToString();
+
+            Console.WriteLine($"鏃堕棿鎴虫墦鍗帮細{DataBitType}浣嶏紝{TimeTypeInfo}锛寋TimeUtcTypeInfo}锛屾椂闂存埑锛歿timeStamp}");
+
+            return timeStamp;
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Properties/AssemblyInfo.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..80dcb59
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑涓�埇淇℃伅鐢变互涓�+// 鎺у埗銆傛洿鏀硅繖浜涚壒鎬у�鍙慨鏀�+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭�
+[assembly: AssemblyTitle("Hanhe.iWCS.TaizhouGEMTwoProtocol")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Hanhe.iWCS.TaizhouGEMTwoProtocol")]
+[assembly: AssemblyCopyright("Copyright 漏  2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏�ComVisible 璁剧疆涓�false 浼氫娇姝ょ▼搴忛泦涓殑绫诲瀷
+//瀵�COM 缁勪欢涓嶅彲瑙併�濡傛灉闇�浠�COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷
+//璇峰皢姝ょ被鍨嬬殑 ComVisible 鐗规�璁剧疆涓�true銆�+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("657c05ba-13f3-4f7c-8a39-862d5d8d078e")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅鍒楀洓涓�缁勬垚: 
+//
+//      涓荤増鏈�+//      娆$増鏈�+//      鐢熸垚鍙�+//      淇鍙�+//
+//鍙互鎸囧畾鎵�湁杩欎簺鍊硷紝涔熷彲浠ヤ娇鐢ㄢ�鐢熸垚鍙封�鍜屸�淇鍙封�鐨勯粯璁ゅ�
+//閫氳繃浣跨敤 "*"锛屽涓嬫墍绀�
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ProtocolAnalysis.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ProtocolAnalysis.cs
new file mode 100644
index 0000000..e425a79
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/ProtocolAnalysis.cs
@@ -0,0 +1,627 @@
+锘�+using Hanhe.iWCS.Business;
+using Hanhe.iWCS.Common;
+using Hanhe.iWCS.Interface;
+using Hanhe.iWCS.MData;
+using Hanhe.iWCS.Model;
+using Hanhe.iWCS.Model.AMS;
+using Microsoft.Owin.Hosting;
+using MongoDB.Bson;
+using MongoDB.Driver;
+using MongoDB.Driver.Builders;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.EnentListen;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.MESHelper;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.PLCControl;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ProcessHelper;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    /// <summary>
+    /// 璁惧鍗忚瑙f瀽绫�+    /// </summary>
+    public class ProtocolAnalysis : IProtocolAnalysis
+    {
+        private EquipmentCommandEQBLL CommandEQBLL = new EquipmentCommandEQBLL();
+        private ICallTaskProcessing iCallTask = new ICallTaskProcessing();
+        private Logger AMSLoggerAPI = new Logger();
+
+        public void StringRequestInfo(string protocolMsg, string address, int port) {
+        }
+
+        public void StringRequestInfo(string protocolMsg, string address, int port, string sessionID) {
+            //16杩涘埗鎺ユ敹
+            protocolMsg = protocolMsg.Trim();//3f 00 11 20 30 40 50 60 70 80 90 A0 24 24
+            if (protocolMsg != "") {
+            }
+            #region 鎻℃墜鍙嶉鎸囦护
+            //UpdateHandshakeFeedbackCode(protocolMsg);
+            PLCControl.Analysis(protocolMsg);
+
+            #endregion
+        }
+        
+        public void UpdateHandshakeFeedbackCode(string commandText) {
+            var query = Query.And(Query.EQ("CommandText", commandText + "$$"), Query.EQ("Status", Constants.COMMANDEQ_STATUS_SENDED));
+            EquipmentCommandEQ eq = MongoDBSingleton.Instance.FindOne<EquipmentCommandEQ>(query, typeof(EquipmentCommandEQ).Name);
+            if (eq != null) {
+                UpdateBuilder updateBuider = Update.Set("isHandshake", 1).Set("FeedbackCode", commandText);
+                MongoDBSingleton.Instance.Update<EquipmentCommandEQ>(query, updateBuider, UpdateFlags.None);
+            }
+        }
+
+        private static bool api = false;
+        public ProtocolAnalysis() {
+            if (!api) {
+                Startup();
+                api = true;
+            }
+        }
+        public static void Startup() {
+            Console.WriteLine("Startup ApiController");
+            Task.Run(() => {
+                var url = "http://+:8801";
+                using (WebApp.Start<Startup>(url)) {
+                    Console.WriteLine("Running on {0}", url);
+                    Console.ReadLine();
+                }
+            });
+        }
+
+        public int workflowToDeviceDriver(TN_I_TASK_DTL_ACTION action) {
+            int iResult = 0;
+            CMMLog.Info($"浠诲姟澶勭悊:Action Code:{action.CN_N_ACTION_CODE},TaskNo:{action.CN_S_TASK_NO}");
+
+            switch (action.CN_N_ACTION_CODE)
+            {
+                case 1012: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "璧风偣鐢宠杩涘叆"); break;
+                case 1312: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "鐢垫瀹夊叏瀵规帴"); break;
+                case 1112: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "婊氱瓛杞﹁捣鐐瑰埌浣�); break;
+                case 1212: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "婊氱瓛杞﹀彇璐у畬鎴愰�鐭LC"); break;
+                case 1013: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "缁堢偣鐢宠杩涘叆"); break;
+                case 1113: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "婊氱瓛杞︾粓鐐瑰埌浣�); break;
+                case 1213: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "婊氱瓛杞﹀嵏璐у畬鎴愰�鐭LC"); break;
+                case 1313: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "鎷嶇収鎵爜"); break;
+            }
+
+            if (action.CN_N_ACTION_CODE == 1027) {
+                var mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                if (mst != null ) {
+                    if (ProcessHelper.Intercept(mst)) iResult = 1027;//鎷︽埅鏇存敼 WCS 浠诲姟绫诲瀷(灏�WMS 浠诲姟绫诲瀷鏇存敼涓�WCS 浠诲姟绫诲瀷锛屽洜涓�WCS 闇�鏍规嵁浠诲姟绫诲瀷杩涜瀵瑰簲浠诲姟娴佺▼澶勭悊)
+                    else
+                    {
+                        CMMLog.Info($"鎺ㄩ�浠诲姟锛氫换鍔″彿{mst.CN_S_TASK_NO},浠诲姟绫诲瀷锛歿mst.CN_S_BUSS_TYPE}");
+                        bool IsSendTask = true;
+                        // 3妤肩紦瀛樻灦鍏ュ彔鎵�浠诲姟 鍙栬揣瀹屾垚鎵嶅厑璁告帹閫佷笅涓�潯 
+                        if (mst.CN_S_BUSS_TYPE == "3妤肩紦瀛樻灦鍏ュ彔鎵�)
+                        {
+                            var taskInfoList = MongoDBSingleton.Instance.Find<TN_I_TASK_MST>(Query.And(Query.NotIn("CN_S_STATUS", new List<MongoDB.Bson.BsonValue>() { "鏈墽琛�, "寰呮帹閫� }), Query.EQ("CN_S_END_BIT", mst.CN_S_END_BIT)), "TN_I_TASK_MST");
+                            if (taskInfoList.Count > 0)
+                            {
+                                // 閬嶅巻鏌ヨ鎵ц涓殑杩欎簺浠诲姟鏄惁閮藉凡缁忓彇璐у畬鎴愶紝濡傛灉閮藉彇璐у畬鎴愶紝鍒欏彲浠ユ帹閫佹浠诲姟
+                                for (int i = 0; i < taskInfoList.Count; i++)
+                                {
+                                    //2024-12-18 鍙樻洿 鍙犲寘浠诲姟鎺ㄩ�鐜颁笅鍙戠殑浠诲姟鍏堟帹锛學CS闇�鏂板姞涓�釜姣绾ф帹閫佸垽鏂�
+                                    if (taskInfoList[i].CN_T_CREATE < mst.CN_T_CREATE)
+                                    {
+                                        IsSendTask = false;
+                                        break;
+                                    }
+
+                                    if (!ProcessHelper.CheckStartFreeTwo(taskInfoList[i].CN_S_START_BIT))
+                                    {
+                                        IsSendTask = false;
+                                        Console.WriteLine($"3妤肩紦瀛樻灦鍏ュ彔鎵�浠诲姟鎷︽埅锛氳浠诲姟 锛歿taskInfoList[i].CN_S_TASK_NO} 鏈彇璐у畬鎴愶紝涓嶅厑璁告帹閫佸綋鍓嶄换鍔★細{mst.CN_S_TASK_NO}");
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                        if (IsSendTask) ProcessHelper.SendTask(mst);
+                    }
+                }
+                iResult = 1027;
+            }
+
+            #region 鍙栨秷
+            if (action.CN_N_ACTION_CODE == 7) {
+                TN_I_TASK_MST mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                string agvNo = action.CN_S_DEVICE_CODE;
+                if (mst != null) {
+                    //璇锋眰鍓�+                    if (action.CN_N_ORDER == 0)
+                    {
+                        WorkFlowAction.TrackLog(action.CN_S_TASK_NO, 0, 7, "鏀跺埌ams鍙栨秷璇锋眰");
+                    }
+
+                    if (action.CN_N_ORDER == 1 || action.CN_N_ORDER == 0) {
+                        ProcessHelper.TaskCancel(mst);
+                        iCallTask.CancelTask(mst.CN_S_TASK_NO, "1");
+                        AMSHelper.SetStatus(action.CN_S_TASK_NO, 1, "7", "0", true);
+                        if (mst.CN_S_BUSS_TYPE != "鐢垫鍙栬揣" && mst.CN_S_BUSS_TYPE != "鐢垫鍗歌揣" && mst.CN_S_BUSS_TYPE != "3妤煎寘瑁呭彇鏂�) 
+                            WMSHelper.ExecuteState(mst.CN_S_SOURCE_NO, action.CN_N_ACTION_CODE);
+                        iCallTask.DeleteTask(mst.CN_S_TASK_NO);
+                    }
+                    if (mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" || mst.CN_S_BUSS_TYPE == "鐢垫鍗歌揣" || mst.CN_S_BUSS_TYPE == "婊℃墭杞繍" || mst.CN_S_BUSS_TYPE == "绌烘墭鍑哄簱")
+                    {
+                        ProcessHelper.ForceCancel(mst, action);
+                        MongoDBSingleton.Instance.Remove<TimeCuoInfoCom>(Query.EQ("timeStamp", mst.CN_S_BATCH_NO), "TimeCuoInfoCom", RemoveFlags.None);
+                    }
+                    if (mst.CN_S_BUSS_TYPE == "3妤煎寘瑁呰ˉ绌�) PLCControl.PickUpBlankComplete(mst.CN_S_END_BIT);
+                }
+            }
+
+            #endregion
+
+            #region 寮哄埗瀹屾垚
+            if (action.CN_N_ACTION_CODE == 1022) {
+                TN_I_TASK_MST mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                if (mst != null) {
+                    ProcessHelper.ForceComplete(mst, action);
+                    if (mst.CN_S_BUSS_TYPE == "3妤肩紦瀛樻灦鍏ュ彔鎵�)
+                    {
+                        var plc = Settings.GetPlcInfo().Where(a => a.deviceType == "3").FirstOrDefault();
+                        if (plc != null)
+                        {
+                            var machine = MongoDBSingleton.Instance.FindOne<WMSInfo>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), "WMSInfo");
+                            if (machine != null)
+                            {
+                                #region   鍐欏涓狹ODBUS鏁版嵁
+                                if (Settings.cacheStackWrite == "0")
+                                {
+                                    int[] num = DiePan(machine);
+
+                                    CMMLog.Info($"send num:" + JsonConvert.SerializeObject(num));
+                                    var wirteall01 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
+                                    {
+                                        addr = plc.writeAddr + 10,
+                                        host = plc.ip,
+                                        port = plc.port,
+                                        data = num
+                                    });
+                                }
+                                else WriteCacheStackingData(plc, mst, machine);
+                                #endregion
+                                MongoDBSingleton.Instance.Remove<WMSInfo>(Query.EQ("trayCode", mst.CN_S_BATCH_NO), "WMSInfo", RemoveFlags.Single);
+                            }
+                        }
+                    }
+                    MongoDBSingleton.Instance.Remove<Mongo_AGV_TASK_STATE>(Query.EQ("TaskNo", mst.CN_S_TASK_NO), RemoveFlags.Single);
+                    WorkFlowAction.TrackLog(mst.CN_S_TASK_NO, 1, 1022, "鏀跺埌ams寮哄埗瀹屾垚璇锋眰");
+                    AMSHelper.SetStatus(action.CN_S_TASK_NO, 1, "1022", "0", true);
+                    iCallTask.CancelTask(mst.CN_S_TASK_NO, "1");
+                    if (mst.CN_S_BUSS_TYPE != "鐢垫鍙栬揣" && mst.CN_S_BUSS_TYPE != "鐢垫鍗歌揣" && mst.CN_S_BUSS_TYPE != "3妤煎寘瑁呭彇鏂�) 
+                        WMSHelper.ExecuteState(mst.CN_S_SOURCE_NO, action.CN_N_ACTION_CODE);
+                    //if (mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" && mst.CN_S_BUSS_TYPE == "鐢垫鍗歌揣") 
+                    //    MongoDBSingleton.Instance.ReomveAll<TimeCuoInfoCom>();
+                    if (mst.CN_S_BUSS_TYPE == "鍖呰绾胯ˉ绌�) PLCControl.PickUpBlankCompleteTetracobalt(mst.CN_S_END_BIT);
+                    if (mst.CN_S_BUSS_TYPE == "3妤煎寘瑁呰ˉ绌�) PLCControl.PickUpBlankComplete(mst.CN_S_END_BIT);
+
+                    if (ERPService.SendERPTaskType.Contains(mst.CN_S_BUSS_TYPE) && ERPService.ERPSwitch01 == "1") ERPService.SendERPTaskInfo(mst);
+
+                    iCallTask.DeleteTask(mst.CN_S_TASK_NO);
+                }
+            }
+            #endregion
+
+            if (action.CN_N_ACTION_CODE == 13) {
+                var task = iCallTask.FindTask(action.CN_S_TASK_NO);
+                AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), "", "AGV璋冩暣浠诲姟浼樺厛绾ф垚鍔� + action.Ext1);
+            }
+
+            #region 浠诲姟鐘舵�濮旀墭(1-寮�;3-寮�鍙栬揣;4-鍙栬揣瀹屾垚;5-寮�鍗歌揣;6-鍗歌揣瀹屾垚;2-瀹屾垚)
+            if (action.CN_N_ACTION_CODE == 1 || action.CN_N_ACTION_CODE == 3 || action.CN_N_ACTION_CODE == 2 || action.CN_N_ACTION_CODE == 4 || action.CN_N_ACTION_CODE == 5 || action.CN_N_ACTION_CODE == 6) {
+                WorkFlowAction.TrackLog(action.CN_S_TASK_NO, 1, action.CN_N_ACTION_CODE, "");
+                TN_I_TASK_MST mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                if (mst != null) {
+                    if (!string.IsNullOrEmpty(action.CN_S_DEVICE_CODE))
+                    {
+                        // 鍥犺皟鐢ˋMSAPI鏃犳硶鍦ㄥ紑濮嬪彇璐ф椂鏇存柊杞﹀彿锛屽洜姝ゆ澶勭洿鎺ヨ繛鎺MS鏁版嵁搴撹繘琛屾洿鏂�+                        MoboxHelper.UpdateEndBit(mst.CN_S_TASK_NO, action.CN_S_DEVICE_CODE);
+                        if (action.CN_N_ACTION_CODE != 1 && action.CN_N_ACTION_CODE != 2) MoboxHelper.UpdateTaskState(mst.CN_S_TASK_NO, action.CN_N_ACTION_CODE);
+                    }
+                    if (action.CN_N_ACTION_CODE == 1)
+                    {
+                        AMSHelper.SetStatus(action.CN_S_TASK_NO, 1, "1", action.CN_S_DEVICE_CODE, true);
+                        if (mst.CN_S_BUSS_TYPE != "鐢垫鍙栬揣" && mst.CN_S_BUSS_TYPE != "鐢垫鍗歌揣" && mst.CN_S_BUSS_TYPE != "3妤煎寘瑁呭彇鏂�) 
+                            WMSHelper.ExecuteState(mst.CN_S_SOURCE_NO, action.CN_N_ACTION_CODE);
+                    }
+                    if (action.CN_N_ACTION_CODE == 4)
+                    {
+                        AMSHelper.SetStatus(action.CN_S_TASK_NO, 1, "4", action.CN_S_DEVICE_CODE, true);
+                        if (mst.CN_S_BUSS_TYPE == "3妤煎寘瑁呰ˉ绌�) PLCControl.PickUpBlankComplete(mst.CN_S_END_BIT);
+                        if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) PLCControl.CheckUpReqUnload(mst.CN_S_END_BIT, mst.CN_S_TASK_NO);
+                        if (mst.CN_S_BUSS_TYPE == "3妤肩紦瀛樻灦鍏ュ彔鎵�) WMSHelper.ExecuteState(mst.CN_S_SOURCE_NO, action.CN_N_ACTION_CODE);
+                        if (mst.CN_S_BUSS_TYPE == "3妤肩紦瀛樻灦鍏ュ彔鎵�) PLCControl.writeStackingMouth6(mst.CN_S_END_BIT, mst.CN_S_TASK_NO);
+                        if (mst.CN_S_BUSS_TYPE == "鍖呰绾胯ˉ绌�) PLCControl.PickUpBlankCompleteTetracobalt(mst.CN_S_END_BIT, mst.CN_S_START_BIT);
+                    }
+                    if (action.CN_N_ACTION_CODE == 6)
+                    {
+                        if (mst.CN_S_BUSS_TYPE == "3妤煎寘瑁呰ˉ绌�)
+                        {
+                            //灏嗘暟鎹褰曞埌涓棿琛�+                            var agvloc = Settings.GetDDSiteList().Where(a => a.ddLoc == mst.CN_S_END_BIT).First();
+                            if (agvloc != null)
+                            {
+                                var quantity = agvloc.quantity;
+                                CMMLog.Info($"3妤煎寘瑁呰ˉ绌猴紝缁堢偣{mst.CN_S_END_BIT}绔欑偣涓暟锛歿quantity}");
+                                var emptyInfo = MongoDBSingleton.Instance.FindOne<BZEmptyPoint>(Query.EQ("Bit", mst.CN_S_END_BIT), "BZEmptyPoint");
+                                if (emptyInfo != null)
+                                {
+                                    MongoDBSingleton.Instance.Update<BZEmptyPoint>(Query.EQ("Bit", mst.CN_S_END_BIT), Update.Set("Quantity", quantity), UpdateFlags.None);
+                                }
+                                else
+                                {
+                                    MongoDBSingleton.Instance.Insert(new BZEmptyPoint { Bit = mst.CN_S_END_BIT, Quantity = quantity });
+                                }
+                            }
+                        }
+                        if (mst.CN_S_BUSS_TYPE == "鍥涢挻鎴愬搧鍑哄簱" || mst.CN_S_BUSS_TYPE == "鍥涢挻杈呮潗鍑哄簱")
+                        {
+                            //3妤兼垚鍝佸嚭搴撴敹鍒�涔嬪悗锛岀粓鐐硅揣浣嶆暟閲忓噺1锛岋紙娉細6淇″彿浼氬彂澶氭锛�+                            var slptInfo = MongoDBSingleton.Instance.FindOne<SLPTLoc>(Query.And(Query.EQ("locCode", mst.CN_S_END_BIT), Query.EQ("count", 0)), "SLPTLoc");
+                            if (slptInfo != null)
+                            {
+                                MongoDBSingleton.Instance.Update<SLPTLoc>(Query.EQ("locCode", mst.CN_S_END_BIT), Update.Set("taskNum", slptInfo.taskNum - 1).Set("count", slptInfo.count + 1), UpdateFlags.None);
+                            }
+                        }
+                    }
+                    if (action.CN_N_ACTION_CODE == 2) {
+                        AMSHelper.SetStatus(action.CN_S_TASK_NO, 1, "2", action.CN_S_DEVICE_CODE, true);
+                        CMMLog.Info($"瀹屾垚浠诲姟澶勭悊锛氭敹鍒�淇″彿涔嬪悗鐗规畩浠诲姟绫诲瀷澶勭悊锛氫换鍔″彿锛歿mst.CN_S_TASK_NO},浠诲姟绫诲瀷锛歿mst.CN_S_BUSS_TYPE}");
+                        if (mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣")
+                        {
+                            var ele = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), "ElevatorTask");
+                            if (ele != null)
+                            {
+                                AMSHelper.SetStatus(ele.wmsTaskNo, 1, "2", action.CN_S_DEVICE_CODE, true);
+                                WMSHelper.ExecuteState(ele.wmsSourceNo, action.CN_N_ACTION_CODE);
+                                MongoDBSingleton.Instance.Remove<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), RemoveFlags.Single);
+                            }
+                        }
+                        if (mst.CN_S_BUSS_TYPE != "鐢垫鍙栬揣" && mst.CN_S_BUSS_TYPE != "鐢垫鍗歌揣" && mst.CN_S_BUSS_TYPE != "3妤煎寘瑁呭彇鏂�) 
+                            WMSHelper.ExecuteState(mst.CN_S_SOURCE_NO, action.CN_N_ACTION_CODE);
+                        //if (mst.CN_S_BUSS_TYPE == "3妤煎寘瑁呰ˉ绌�) PLCControl.PickUpBlankComplete(mst.CN_S_END_BIT);
+                        if (mst.CN_S_BUSS_TYPE == "鍥涢挻鎴愬搧鍑哄簱" || mst.CN_S_BUSS_TYPE == "鍥涢挻杈呮潗鍑哄簱")
+                        {
+                            //3妤兼垚鍝佸嚭搴撴敹鍒�淇″彿涔嬪悗 灏嗕腑闂磋〃count鏁伴噺娓呴櫎
+                            var slptInfo = MongoDBSingleton.Instance.FindOne<SLPTLoc>(Query.EQ("locCode", mst.CN_S_END_BIT), "SLPTLoc");
+                            if (slptInfo != null)
+                            {
+                                MongoDBSingleton.Instance.Update<SLPTLoc>(Query.EQ("locCode", mst.CN_S_END_BIT), Update.Set("count", 0), UpdateFlags.None);
+                            }
+                        }
+
+                        if (ERPService.SendERPTaskType.Contains(mst.CN_S_BUSS_TYPE) && ERPService.ERPSwitch01 == "1") ERPService.SendERPTaskInfo(mst);
+
+                        iCallTask.DeleteTask(mst.CN_S_TASK_NO);
+                    }
+                    //if (action.CN_N_ACTION_CODE == 5)
+                    //{
+                    //    CMMLog.Info($"3妤肩紦瀛樻灦鍏ュ彔鎵�鏀跺埌淇″彿5锛屽紑濮嬪噯澶囧啓鍏ュ彔鐩樻満鏁版嵁銆�);
+                    //}
+                }
+            }
+            #endregion
+
+            #region 灏忚溅鐘舵�鍐欏叆閫氶亾 (1-寮�;2-瀹屾垚 4-鍙栬揣瀹屾垚 6-鍗歌揣瀹屾垚)
+            if (action.CN_N_ACTION_CODE == 1 || action.CN_N_ACTION_CODE == 2 || action.CN_N_ACTION_CODE == 4 || action.CN_N_ACTION_CODE == 6)
+            {
+                WorkFlowAction.TrackLog(action.CN_S_TASK_NO, 1, action.CN_N_ACTION_CODE, "");
+                TN_I_TASK_MST mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                CMMLog.Info($"灏忚溅鐘舵�鍐欏叆閫氶亾澶勭悊寮�");
+                if (mst != null)
+                {
+                    CMMLog.Info($"杞﹀彿锛歿mst.CN_S_ForkliftNo}");
+                    var stateInfo = Settings.GetAGVStateList().Where(a => a.AgvNo == mst.CN_S_ForkliftNo && a.enable == 1).FirstOrDefault();
+                    if (stateInfo != null)
+                    {
+                        if (action.CN_N_ACTION_CODE == 1)
+                        {
+                            //寮�锛屽線閫氶亾鍐欏叆1
+                            var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                host = stateInfo.ip,
+                                port = stateInfo.port,
+                                addr = stateInfo.writeAddr + 5,
+                                data = 1
+                            });
+                            CMMLog.Info($"鍦ㄩ�閬搟stateInfo.writeAddr + 5}涓啓鍏�锛宨p锛歿stateInfo.ip}锛岀鍙o細{stateInfo.port}");
+                        }
+                        if (action.CN_N_ACTION_CODE == 2)
+                        {
+                            //瀹屾垚锛屽線閫氶亾鍐欏叆0
+                            var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                host = stateInfo.ip,
+                                port = stateInfo.port,
+                                addr = stateInfo.writeAddr + 5,
+                                data = 0
+                            });
+                            CMMLog.Info($"鍦ㄩ�閬搟stateInfo.writeAddr + 5}涓啓鍏�锛宨p锛歿stateInfo.ip}锛岀鍙o細{stateInfo.port}");
+                        }
+                        if (action.CN_N_ACTION_CODE == 4)
+                        {
+                            //鍙栬揣瀹屾垚锛屽線閫氶亾鍐欏叆1
+                            var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                host = stateInfo.ip,
+                                port = stateInfo.port,
+                                addr = stateInfo.writeAddr + 6,
+                                data = 1
+                            });
+                            CMMLog.Info($"鍦ㄩ�閬搟stateInfo.writeAddr + 6}涓啓鍏�锛宨p锛歿stateInfo.ip}锛岀鍙o細{stateInfo.port}");
+                        }
+                        if (action.CN_N_ACTION_CODE == 6)
+                        {
+                            //鍗歌揣瀹屾垚锛屽線閫氶亾鍐欏叆0
+                            var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                host = stateInfo.ip,
+                                port = stateInfo.port,
+                                addr = stateInfo.writeAddr + 6,
+                                data = 0
+                            });
+                            CMMLog.Info($"鍦ㄩ�閬搟stateInfo.writeAddr + 6}涓啓鍏�锛宨p锛歿stateInfo.ip}锛岀鍙o細{stateInfo.port}");
+                        }
+                    }
+                    else CMMLog.Info($"灏忚溅{mst.CN_S_ForkliftNo}淇″彿鏈厤缃�);
+                }
+
+            }
+            #endregion
+
+            #region   3妤艰澶囦换鍔�+
+            //璧风偣瀹夊叏瀵规帴      1012锛氬畨鍏ㄨ姹傝繘鍏�    4锛氬畨鍏ㄨ姹傞�鍑�+            if (action.CN_N_ACTION_CODE == 1012 || action.CN_N_ACTION_CODE == 4 || action.CN_N_ACTION_CODE == 1312)
+            {
+                CMMLog.Info($"璧风偣瀹夊叏瀵规帴:鏀跺埌淇″彿锛歿action.CN_N_ACTION_CODE},浠诲姟鍙凤細{action.CN_S_TASK_NO}锛屽紑濮嬫牴鎹换鍔″彿鏌ヨ涓昏〃涓搴旀暟鎹紒");
+                var mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                if (mst != null)
+                {
+                    CMMLog.Info($"璧风偣瀹夊叏瀵规帴锛氭敹鍒颁换鍔″彿锛歿mst.CN_S_TASK_NO},浠诲姟绫诲瀷锛歿mst.CN_S_BUSS_TYPE},浠诲姟淇″彿锛歿action.CN_N_ACTION_CODE}");
+                    //3妤兼媶鐩樿ˉ绌猴細鎷嗙洏鏈鸿ˉ绌烘墭鐩�           3妤煎寘瑁呰ˉ绌猴細鍖呰鏈鸿ˉ绌烘墭
+                    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�) || mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋� || mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋禢G" || mst.CN_S_BUSS_TYPE == "3妤肩紦瀛樻灦鍏ュ彔鎵� || mst.CN_S_BUSS_TYPE == "3妤煎彔鐩樹笅绾� || mst.CN_S_BUSS_TYPE == "3妤兼墦鍖呬笅绾� || mst.CN_S_BUSS_TYPE == "鍥涢挻杈呮潗鍏ュ簱")
+                    {
+                        CMMLog.Info($"璧风偣瀹夊叏瀵规帴锛氬嵆灏嗚繘鍏ヤ换鍔℃祦绋嬶細{mst.CN_S_BUSS_TYPE},鐘舵�鍙蜂负:{action.CN_N_ACTION_CODE}");
+                        ProcessHelper.StartPickUpDoorSafe(mst, action.CN_N_ACTION_CODE);
+                    }
+                    else if (mst.CN_S_BUSS_TYPE == "鐢垫鍗歌揣" || mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" || mst.CN_S_BUSS_TYPE == "婊℃墭杞繍") 
+                    {
+                        if(mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" && action.CN_N_ACTION_CODE != 1012)
+                        {
+                            ProcessHelper.OperateDoor(mst, action.CN_N_ACTION_CODE == 1312 ? 1012 : 4);
+                        }
+                    }
+                }
+            }
+
+            //婊氱瓛杞﹁捣鐐瑰埌浣嶄俊鍙枫�鍙栬揣瀹屾垚淇″彿    1112        1212     3銆�          鍙婊氱瓛杞﹀鎺�+            if (action.CN_N_ACTION_CODE == 1112 || action.CN_N_ACTION_CODE == 1212)
+            {
+                var mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                if (mst != null)
+                {
+                    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�))
+                    {
+                        ProcessHelper.PickupAndUnload(mst, action.CN_N_ACTION_CODE);
+                    }
+                }
+            }
+
+            if (action.CN_N_ACTION_CODE == 8)
+            {
+                var mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                if (mst != null)
+                {
+                    var plc = Settings.GetPlcInfo().Where(a => a.location == mst.CN_S_START_BIT).FirstOrDefault();
+
+                    if (mst.CN_S_BUSS_TYPE == "3妤肩紦瀛樻灦鍏ュ彔鎵�)
+                    {
+                        CMMLog.Debug($"3妤肩紦瀛樻灦鍏ュ彔鎵楴G锛歍askNo:{action.CN_S_TASK_NO},鍙犲寘NG鍐欏叆鍊�銆�);
+                        PLCControl.CacheStackingMouth8(plc);
+                    }
+                }
+            }
+
+            //缁堢偣瀹夊叏瀵规帴      1013锛氬畨鍏ㄨ姹傝繘鍏�    6锛氬畨鍏ㄨ姹傞�鍑�+            if (action.CN_N_ACTION_CODE == 1013 || action.CN_N_ACTION_CODE == 6 || action.CN_N_ACTION_CODE == 1312)
+            {
+                CMMLog.Info($"缁堢偣瀹夊叏瀵规帴:鏀跺埌淇″彿锛歿action.CN_N_ACTION_CODE},浠诲姟鍙凤細{action.CN_S_TASK_NO}锛屽紑濮嬫牴鎹换鍔″彿鏌ヨ涓昏〃涓搴旀暟鎹紒");
+                TN_I_TASK_MST mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                if (mst != null)
+                {
+                    CMMLog.Info($"缁堢偣瀹夊叏瀵规帴锛氭敹鍒颁换鍔″彿锛歿mst.CN_S_TASK_NO},浠诲姟绫诲瀷锛歿mst.CN_S_BUSS_TYPE},浠诲姟淇″彿锛歿action.CN_N_ACTION_CODE}");
+                    //3妤兼媶鐩樿ˉ绌猴細鎷嗙洏鏈鸿ˉ绌烘墭鐩�           3妤煎寘瑁呰ˉ绌猴細鍖呰鏈鸿ˉ绌烘墭
+                    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�) || mst.CN_S_BUSS_TYPE == "3妤煎绉板叆缂撳瓨鏋� || mst.CN_S_BUSS_TYPE == "3妤肩紦瀛樻灦鍏ュ彔鎵� || mst.CN_S_BUSS_TYPE == "3妤兼媶鐩樿ˉ绌� || mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" || mst.CN_S_BUSS_TYPE == "鍖呰绾胯ˉ绌� || mst.CN_S_BUSS_TYPE == "鍥涢挻鎴愬搧鍑哄簱" || mst.CN_S_BUSS_TYPE == "鍥涢挻杈呮潗鍑哄簱")
+                    {
+                        ProcessHelper.EndPickUpDoorSafe(mst, action.CN_N_ACTION_CODE);
+                    }
+                    if (mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" || mst.CN_S_BUSS_TYPE == "鐢垫鍗歌揣" || mst.CN_S_BUSS_TYPE == "婊℃墭杞繍")
+                    {
+                        //浜屾鐢垫浠诲姟缁堢偣浜や簰
+                        if (mst.CN_S_BUSS_TYPE == "鐢垫鍙栬揣" && action.CN_N_ACTION_CODE != 1312)
+                        {
+                            //鐢垫鍙栬揣浠诲姟 缁堢偣涓嶉渶瑕佽繘琛屽畨鍏ㄤ氦浜�+                        }
+                        else if (mst.CN_S_BUSS_TYPE == "鐢垫鍗歌揣")
+                        {
+                            //灏忚溅鍒拌揪绛夊緟鐐逛箣鍚庡彂閫佷俊鍙凤紝鍒ゆ柇鍝儴鐢垫鍙互浣跨敤锛岀劧鍚庡垱寤虹數姊敓鎴愪换鍔�+                            //寮傚父鎯呭喌闇�鎵撳嵃锛�.涓ら儴鐢垫閮戒笉鍙互浣跨敤锛�.涓ら儴鐢垫閮藉彲浠ヤ娇鐢紝榛樿浣跨敤绗竴鍙扮數姊澶�+                            CMMLog.Info($"缁堢偣瀹夊叏瀵规帴:鐢垫鍗歌揣:鏀跺埌淇″彿{action.CN_N_ACTION_CODE}");
+                            if (action.CN_N_ACTION_CODE == 1312 || action.CN_N_ACTION_CODE == 6)
+                            {
+                                var taskBit = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), "ElevatorTask");
+                                CMMLog.Info($"缁堢偣瀹夊叏瀵规帴:鐢垫鍗歌揣:taskno:{mst.CN_S_TASK_NO}锛宱ccupy:{taskBit.occupy}");
+                                if (taskBit.occupy == "")
+                                {
+                                    string eleBit = PLCControl.ElevatorTaskBit(taskBit.startFloor);
+                                    CMMLog.Info("缁堢偣瀹夊叏瀵规帴:鐢垫鍗歌揣:鑾峰彇鐢垫鐐逛綅elebit" + eleBit);
+                                    if (eleBit == "0")
+                                    {
+                                        CMMLog.Info("缁堢偣瀹夊叏瀵规帴:鐢垫鍗歌揣:褰撳墠鏃犵數姊彲浠ヤ娇鐢紒");
+                                        Console.WriteLine("缁堢偣瀹夊叏瀵规帴:鐢垫鍗歌揣:褰撳墠鏃犵數姊彲浠ヤ娇鐢紒");
+                                    }
+                                    else
+                                    {
+                                        //鏀圭粓鐐逛负寮�惎鐨勭數姊�+                                        //TSHelper.GoToAGV(mst.CN_S_TASK_NO, 1, StockInstance.Instance.GetAGVCodeForBitCode(eleBit));
+                                    
+                                        //TSHelper.GoToAGV(mst.CN_S_TASK_NO, 2, StockInstance.Instance.GetAGVCodeForBitCode(eleBit));
+                                        //AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "淇敼缁堢偣");
+                                        var taskInfo = MongoDBSingleton.Instance.FindOne<ElevatorTask>(Query.EQ("taskNo", mst.CN_S_SOURCE_NO), "ElevatorTask");
+                                        //璧嬪� 浜屾鐢垫鐐逛綅
+                                        MongoDBSingleton.Instance.Update<TN_I_TASK_MST>(Query.EQ("_id", mst._id), Update.Set("Ext3",eleBit), UpdateFlags.None);
+                                        string endBit02 = PLCControl.ElevatorTaskBit02(eleBit);
+                                        MongoDBSingleton.Instance.Update<ElevatorTask>(Query.EQ("taskNo", taskInfo.taskNo), Update.Set("taskNo", taskInfo.wmsTaskNo + "_1").Set("endBit02", endBit02).Set("occupy", eleBit).Set("endBit",eleBit), UpdateFlags.None);
+                                        CMMLog.Info("缁堢偣瀹夊叏瀵规帴:鐢垫鍗歌揣:elebit:" + eleBit);
+                                        //鍐欏叆褰撳墠妤煎眰--鍛煎彨鐢垫
+                                        PLCControl.ElevatorTaskFloor(taskInfo.startFloor, eleBit);
+                                    }
+                                }
+                                else
+                                {
+                                    CMMLog.Info("缁堢偣瀹夊叏瀵规帴:鐢垫鍗歌揣:鐢垫occupy鍗犵敤瀛楁涓嶄负绌猴紝杩涘叆鐢垫寮�棬鍏抽棬鏈嶅姟锛�);
+                                    ProcessHelper.OperateDoor(mst, action.CN_N_ACTION_CODE);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            //婊氱瓛杞︾粓鐐瑰埌浣嶄俊鍙枫�鍗歌揣瀹屾垚淇″彿     1113        1213        5銆�      鍙婊氱瓛杞﹀鎺�+            if (action.CN_N_ACTION_CODE == 1113 || action.CN_N_ACTION_CODE == 1213)
+            {
+                var mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                if (mst != null)
+                {
+                    //3妤兼媶鐩樿ˉ绌猴細鎷嗙洏鏈鸿ˉ绌烘墭鐩�           3妤煎寘瑁呰ˉ绌猴細鍖呰鏈鸿ˉ绌烘墭
+                    if (mst.CN_S_BUSS_TYPE.Contains("3妤煎寘瑁呭彇鏂�)) ProcessHelper.DiscRemoverEmptySupport(mst, action.CN_N_ACTION_CODE);
+                }
+            }
+
+            //缂撳瓨鏋跺叆鍙犳墭锛屽皬杞︽壂鐮�+            if(action.CN_N_ACTION_CODE == 1313)
+            {
+                TN_I_TASK_MST mst = iCallTask.FindTask(action.CN_S_TASK_NO);
+                var plc = Settings.GetPlcInfo().Where(a => a.location == mst.CN_S_END_BIT).FirstOrDefault();
+                if(plc != null)
+                {
+                    PLCControl.CacheStackingMouth1313(plc.deviceType, mst.CN_S_TASK_NO);
+                    //AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "灏忚溅鎵爜");
+                }
+            }
+
+
+            #region 鐢靛姩闂ˋ闂ㄤ氦绠′俊鍙�1023-寮�棬 1025-鍏抽棬)  B闂ㄤ氦绠′俊鍙�1013-寮�棬 6--鍏抽棬)
+            if (action.CN_N_ACTION_CODE == 1023)
+            {
+                CMMLog.Info($"鏀跺埌淇″彿{action.CN_N_ACTION_CODE},闂ㄥ彿锛歿action.Ext2}");
+                //鐢靛姩闂ㄥ紑闂�+                var doorInfo = Settings.GetPlcInfo().Where(a => a.Extend == action.Ext2 && a.enable == 1).FirstOrDefault();
+                if (doorInfo != null)
+                {
+                    //鐢靛姩闂ㄥ紑闂ㄦ楠わ細
+                    //1銆佸湪閫氶亾銆�0101銆戜腑鍐欏叆1锛屽彂閫佸紑闂ㄤ俊鍙�+                    //2銆佽鍙栭�閬撱�40001銆戜腑鐨勫�锛屽鏋滀负1锛岃〃绀哄紑闂ㄥ埌浣嶏紝閫氱煡灏忚溅杩涘幓
+                    var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    {
+                        host = doorInfo.ip,
+                        port = doorInfo.port,
+                        addr = doorInfo.writeAddr,
+                        data = 1
+                    });
+                    CMMLog.Info($"鍙戦�寮�棬淇″彿锛屽湪閫氶亾{doorInfo.writeAddr}涓啓鍏�锛宨p锛歿doorInfo.ip}锛岀鍙o細{doorInfo.port}");
+
+                    var result = OITcpHelper.RegisterReadOutPut(new OITcpHelper.RegisterReadOutPutModel
+                    {
+                        dataNum = 1,
+                        addr = doorInfo.readAddr,
+                        host = doorInfo.ip,
+                        port = doorInfo.port
+                    });
+
+                    if (result != null && result.errCode == 0)
+                    {
+                        CMMLog.Info($"鐢靛姩闂ㄥ紑闂ㄦ祦绋嬶細璇诲彇鐢靛姩闂ㄩ�閬撳彿涓猴細{doorInfo.readAddr}閲岄潰鐨勫�涓簕result.result[0]}");
+                        //Console.WriteLine($"鐢靛姩闂ㄥ紑闂ㄦ祦绋嬶細璇诲彇鐢靛姩闂ㄩ�閬撳彿涓猴細{doorInfo.readAddr}閲岄潰鐨勫�涓簕result.result[0]},{doorInfo.readAddr + 1}閲岄潰鐨勫�涓簕result.result[1]}");
+                        if (result.result[0] == 2)
+                        {
+                            //鎺ㄩ�灏忚溅杩涘幓
+                            CMMLog.Info($"鐢靛姩闂ㄥ凡缁忔墦寮�紝闂ㄥ彿锛歿action.Ext2}");
+
+                            writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                            {
+                                host = doorInfo.ip,
+                                port = doorInfo.port,
+                                addr = doorInfo.writeAddr,
+                                data = 2
+                            });
+                            CMMLog.Info($"鍦ㄩ�閬搟doorInfo.writeAddr}涓啓鍏�锛宨p锛歿doorInfo.ip}锛岀鍙o細{doorInfo.port}");
+
+                            TSHelper.Traffic(action.Ext2);
+                        }
+                    }
+                    else CMMLog.Info($"鐢靛姩闂ㄥ紑闂ㄦ祦绋嬶細鏈鍙栧埌鍖呰鏈洪�閬搟doorInfo.readAddr}閲岄潰鐨勬暟鎹紒锛侊紒result:{JsonConvert.SerializeObject(result)}");
+                }
+                else CMMLog.Info($"闂ㄥ彿涓恒�{action.Ext2}銆戠殑闂ㄦ湭鍦ㄩ厤缃枃浠堕厤缃垨鑰呮湭鍚敤");
+            }
+            else if (action.CN_N_ACTION_CODE == 1025)
+            {
+                //鐢靛姩闂ㄥ叧闂�+                var doorInfo = Settings.GetPlcInfo().Where(a => a.Extend == action.Ext2 && a.enable == 1).FirstOrDefault();
+                if (doorInfo != null)
+                {
+                    //鐢靛姩闂ㄥ叧闂ㄦ楠�+                    //1銆佸皬杞﹂�杩囩數鍔ㄩ棬鍚庯紝鍦ㄩ�閬撱�40101銆戜腑鍐欏叆2
+                    var writeRes = OITcpHelper.RegisterWriteOutPut(new OITcpHelper.RegisterWriteOutPutModel
+                    {
+                        host = doorInfo.ip,
+                        port = doorInfo.port,
+                        addr = doorInfo.writeAddr,
+                        data = 3
+                    });
+                    CMMLog.Info($"鐢靛姩闂ㄥ叧闂ㄦ祦绋嬶紝鍦ㄩ�閬搟doorInfo.writeAddr}涓啓鍏�锛宨p锛歿doorInfo.ip}锛岀鍙o細{doorInfo.port}");
+                }
+                else CMMLog.Info($"闂ㄥ彿涓恒�{action.Ext2}銆戠殑闂ㄦ湭鍦ㄩ厤缃枃浠堕厤缃垨鑰呮湭鍚敤");
+            }
+            #endregion
+
+            #endregion
+
+            return iResult;
+        }
+
+        #region AGV杞︿綋鐘舵�淇℃伅
+        public void HangChaAGVEvent(HangChaAGV _hangChaAGV) {
+        }
+        public void HangChaAGVEvent(List<HangChaAGV> agvs) {
+
+        }
+
+        #endregion
+
+        /// <summary>
+        /// 鍛ㄨ浆鎵樼洏浣�+        /// </summary>
+        public class BZEmptyPoint
+        {
+            public ObjectId _id { get; set; }
+            /// <summary>
+            /// 绌烘墭缂撳瓨鐐�+            /// </summary>
+            public string Bit { get; set; }
+            /// <summary>
+            /// 鎵樼洏鏁伴噺
+            /// </summary>
+            public int Quantity { get; set; }
+        }
+
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Settings.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Settings.cs
new file mode 100644
index 0000000..6daca4c
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Settings.cs
@@ -0,0 +1,488 @@
+锘縰sing Hanhe.iWCS.Common;
+using Hanhe.iWCS.MData;
+using MongoDB.Bson;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+
+    public class Settings
+    {
+
+        #region 璁惧淇℃伅
+        private static string _plcInfo = "";
+        private static string plcInfo {
+            get {
+                if (_plcInfo == "") {
+                    _plcInfo = XmlHelper.GetElementValue("plcInfo");
+                }
+                return _plcInfo;
+            }
+        }
+        public static List<PlcInfo> GetPlcInfo() {
+            return JsonConvert.DeserializeObject<List<PlcInfo>>(plcInfo);
+        }
+        public class PlcInfo
+        {
+            public string device { get; set; }
+            public string deviceType { get; set; }
+            public string ip { get; set; }
+            public int readAddr { get; set; }
+            public int writeAddr { get; set; }
+            public int FyReadAddr { get; set; }
+            public int FyWriteAddr { get; set; }
+            public string location { get; set; }
+            public string Extend { get; set; }
+            public int enable { get; set; }
+            public int port { get; set; }
+        }
+        #endregion
+
+        #region _OITcpServerUrl
+        private static string _OITcpServerUrl = "";
+        public static string OITcpSeverUrl {
+            get {
+                if (_OITcpServerUrl == "") {
+                    _OITcpServerUrl = XmlHelper.GetElementValue("OITcpServerUrl");
+                }
+                return _OITcpServerUrl;
+            }
+        }
+        #endregion
+
+        #region   MESUrl
+        private static string _MESUrl = "";
+        public static string MESUrl
+        {
+            get
+            {
+                if (_MESUrl == "")
+                {
+                    _MESUrl = XmlHelper.GetElementValue("mesurl");
+                }
+                return _MESUrl;
+            }
+        }
+        #endregion
+
+        #region   mesOpen
+        private static string _mesOpen = "";
+        public static string mesOpen
+        {
+            get
+            {
+                if (_mesOpen == "")
+                {
+                    _mesOpen = XmlHelper.GetElementValue("mesOpen");
+                }
+                return _mesOpen;
+            }
+        }
+        #endregion
+
+        #region   packChange
+        private static string _packChange = "";
+        public static string packChange
+        {
+            get
+            {
+                if (_packChange == "")
+                {
+                    _packChange = XmlHelper.GetElementValue("packChange");
+                }
+                return _packChange;
+            }
+        }
+        #endregion
+
+        #region   Wait01
+        private static string _Wait01 = "";
+        public static string Wait01
+        {
+            get
+            {
+                if (_Wait01 == "")
+                {
+                    _Wait01 = XmlHelper.GetElementValue("Wait01");
+                }
+                return _Wait01;
+            }
+        }
+        #endregion
+
+        #region   Wait02
+        private static string _Wait02 = "";
+        public static string Wait02
+        {
+            get
+            {
+                if (_Wait02 == "")
+                {
+                    _Wait02 = XmlHelper.GetElementValue("Wait02");
+                }
+                return _Wait02;
+            }
+        }
+        #endregion
+
+        #region   timecuo
+        private static string _TimeCuo = "";
+        public static string TimeCuo
+        {
+            get
+            {
+                if (_TimeCuo == "")
+                {
+                    _TimeCuo = XmlHelper.GetElementValue("timecuo");
+                }
+                return _TimeCuo;
+            }
+        }
+        #endregion
+
+        #region   SendERPTaskType
+        private static string _SendERPTaskType = "";
+        public static string SendERPTaskType
+        {
+            get
+            {
+                if (_SendERPTaskType == "")
+                {
+                    _SendERPTaskType = XmlHelper.GetElementValue("SendERPTaskType");
+                }
+                return _SendERPTaskType;
+            }
+        }
+        #endregion
+
+        #region   LoginInfo
+        private static string _LoginInfo = "";
+        public static string LoginInfo
+        {
+            get
+            {
+                if (_LoginInfo == "")
+                {
+                    _LoginInfo = XmlHelper.GetElementValue("LoginInfo");
+                }
+                return _LoginInfo;
+            }
+        }
+        #endregion
+
+        #region   huoWeiCode
+        private static string _HouWeiCode = "";
+        public static string houWeiCode
+        {
+            get
+            {
+                if (_HouWeiCode == "")
+                {
+                    _HouWeiCode = XmlHelper.GetElementValue("huoWeiCode");
+                }
+                return _HouWeiCode;
+            }
+        }
+
+        public static List<HuoWeiCode> GetHouWeiCodeo()
+        {
+            return JsonConvert.DeserializeObject<List<HuoWeiCode>>(houWeiCode);
+        }
+
+        /// <summary>
+        ///  {"device":"1"ip:"192.168.1.100","readAddr":100,"writeAddr":101,"location":"AAA"},
+        /// </summary>
+        public class HuoWeiCode
+        {
+            public string task { get; set; }
+            public string taskType { get; set; }
+            public string location { get; set; }
+        }
+        #endregion
+
+        #region   sendBit
+        private static string _SendBit = "";
+        public static string sendBit
+        {
+            get
+            {
+                if (_SendBit == "")
+                {
+                    _SendBit = XmlHelper.GetElementValue("sendBit");
+                }
+                return _SendBit;
+            }
+        }
+
+        public static List<SendBit> GetSendBit()
+        {
+            return JsonConvert.DeserializeObject<List<SendBit>>(sendBit);
+        }
+
+        /// <summary>
+        ///  {"device":"1"ip:"192.168.1.100","readAddr":100,"writeAddr":101,"location":"AAA"},
+        /// </summary>
+        public class SendBit
+        {
+            public string task { get; set; }
+            public string taskType { get; set; }
+            public string bit { get; set; }
+            public int agv { get; set; }
+            public string floor { get; set; }
+        }
+        #endregion
+
+        #region   BatteryTime
+        private static string _BatteryTime = "";
+        public static string BatteryTime
+        {
+            get
+            {
+                if (_BatteryTime == "")
+                {
+                    _BatteryTime = XmlHelper.GetElementValue("BatteryTime");
+                }
+                return _BatteryTime;
+            }
+        }
+        #endregion
+
+        #region 灏忚溅淇℃伅
+        private static string _ChargingPile = "";
+        private static string ChargingPile
+        {
+            get
+            {
+                if (_ChargingPile == "")
+                {
+                    _ChargingPile = XmlHelper.GetElementValue("ChargingPile");
+                }
+                return _ChargingPile;
+            }
+        }
+        public static List<ChargingPileInfo> GetChargingPile()
+        {
+            return JsonConvert.DeserializeObject<List<ChargingPileInfo>>(ChargingPile);
+        }
+        public class ChargingPileInfo
+        {
+            public string agvNo { get; set; }
+            public string agvType { get; set; }
+            public string charginGroup { get; set; }
+            public string charginIP { get; set; }
+            public string agvBit { get; set; }
+            public string enable { get; set; }
+        }
+        #endregion
+
+        #region 鍐欏叆鐢甸噺杞﹀彿
+        private static string _ChargingAgvNo = "";
+        private static string ChargingAgvNo
+        {
+            get
+            {
+                if (_ChargingAgvNo == "")
+                {
+                    _ChargingAgvNo = XmlHelper.GetElementValue("ChargingAgvNo");
+                }
+                return _ChargingAgvNo;
+            }
+        }
+        public static string[] GetChargingAgvNo()
+        {
+            return JsonConvert.DeserializeObject<List<string>>(ChargingAgvNo).ToArray();
+        }
+        #endregion
+
+        #region   cacheStackWrite
+        private static string _cacheStackWrite = "";
+        public static string cacheStackWrite
+        {
+            get
+            {
+                if (_cacheStackWrite == "")
+                {
+                    _cacheStackWrite = XmlHelper.GetElementValue("cacheStackWrite");
+                }
+                return _cacheStackWrite;
+            }
+        }
+        #endregion
+
+        #region AGVState
+        private static string _AGVState = "";
+        private static string AGVStateList
+        {
+            get
+            {
+                if (_AGVState == "")
+                {
+                    _AGVState = XmlHelper.GetElementValue("AGVState");
+                }
+                return _AGVState;
+            }
+        }
+
+        private static List<AGVState> AGVStates = new List<AGVState>();
+        public static List<AGVState> GetAGVStateList()
+        {
+            if (AGVStates.Count == 0 && AGVStateList != "")
+            {
+                AGVStates = Newtonsoft.Json.JsonConvert.DeserializeObject<List<AGVState>>(AGVStateList);
+            }
+            return AGVStates;
+        }
+
+        public class AGVState
+        {
+
+            public string AgvNo { get; set; }
+            public string ip { get; set; }
+            public int port { get; set; }
+            public int readAddr { get; set; }
+            public int writeAddr { get; set; }
+            public int enable { get; set; }
+        }
+        #endregion
+
+        #region _SqlServer
+        private static string _SqlServer = "";
+        public static string SqlServer
+        {
+            get
+            {
+                if (_SqlServer == "")
+                {
+                    _SqlServer = XmlHelper.GetElementValue("SqlServer");
+                }
+                return _SqlServer;
+            }
+        }
+        #endregion        
+        
+        #region _SqlServer1
+        private static string _SqlServer1 = "";
+        public static string SqlServer1
+        {
+            get
+            {
+                if (_SqlServer1 == "")
+                {
+                    _SqlServer1 = XmlHelper.GetElementValue("SqlServer1");
+                }
+                return _SqlServer1;
+            }
+        }
+        #endregion
+
+
+        #region ThirdUrl
+        private static string _ThirdUrl = "";
+        private static string ThirdUrlList
+        {
+            get
+            {
+                if (_ThirdUrl == "")
+                {
+                    _ThirdUrl = XmlHelper.GetElementValue("ThirdUrl");
+                }
+                return _ThirdUrl;
+            }
+        }
+
+        private static List<ThirdUrl> ThirdUrls = new List<ThirdUrl>();
+        public static List<ThirdUrl> GetThirdUrlList()
+        {
+            if (ThirdUrls.Count == 0 && ThirdUrlList != "")
+            {
+                ThirdUrls = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ThirdUrl>>(ThirdUrlList);
+            }
+            return ThirdUrls;
+        }
+
+        public class ThirdUrl
+        {
+
+            public string UrlNo { get; set; }
+            public string UrlSign { get; set; }
+            public string Url { get; set; }
+            public int enable { get; set; }
+        }
+        #endregion
+
+        #region AGVLocation
+        private static string _AGVLocation = "";
+        private static string AGVLocationList
+        {
+            get
+            {
+                if (_AGVLocation == "")
+                {
+                    _AGVLocation = XmlHelper.GetElementValue("AGVLocation");
+                }
+                return _AGVLocation;
+            }
+        }
+
+        private static List<AGVLocation> AGVLocations = new List<AGVLocation>();
+        public static List<AGVLocation> GetAGVLocationList()
+        {
+            if (AGVLocations.Count == 0 && AGVLocationList != "")
+            {
+                AGVLocations = Newtonsoft.Json.JsonConvert.DeserializeObject<List<AGVLocation>>(AGVLocationList);
+            }
+            return AGVLocations;
+        }
+
+        public class AGVLocation
+        {
+
+            public string machineLoc { get; set; }
+            public string[] ddLoc { get; set; }
+            public int Enabel { get; set; }
+        }
+
+        #endregion
+
+        #region DDSite
+        private static string _DDSite = "";
+        private static string DDSiteList
+        {
+            get
+            {
+                if (_DDSite == "")
+                {
+                    _DDSite = XmlHelper.GetElementValue("DDSite");
+                }
+                return _DDSite;
+            }
+        }
+
+        private static List<DDSiteModel> DDSites = new List<DDSiteModel>();
+        public static List<DDSiteModel> GetDDSiteList()
+        {
+            if (DDSites.Count == 0 && DDSiteList != "")
+            {
+                DDSites = Newtonsoft.Json.JsonConvert.DeserializeObject<List<DDSiteModel>>(DDSiteList);
+            }
+            return DDSites;
+        }
+
+        public class DDSiteModel
+        {
+
+            public string ddLoc { get; set; }
+            public int[] Site { get; set; }
+            public int quantity { get; set; }
+            public int Enable { get; set; }
+            public int trayType { get; set; }
+        }
+
+        #endregion
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/SqlHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/SqlHelper.cs
new file mode 100644
index 0000000..f18f492
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/SqlHelper.cs
@@ -0,0 +1,324 @@
+锘縰sing Newtonsoft.Json;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class SqlHelper<T> where T : class, new()
+    {
+        public bool ExecuteSql(string sql) {
+            try {
+                var code = GetInstance().Ado.ExecuteCommand(sql);
+                return code > 1;
+            }
+            catch (Exception ex) {
+                return false;
+            }
+        }
+
+        public bool Update(T model, string[] cols) {
+            var db = GetInstance();
+            return db.Updateable<T>(model).UpdateColumns(cols).ExecuteCommand() > 0;
+        }
+        public List<T> GetList(Expression<Func<T, bool>> where = null) {
+            var db = GetInstance();
+            if (where == null) {
+                return db.Queryable<T>().ToList();
+            }
+            else 
+            {
+                return db.Queryable<T>().Where(where).ToList();
+            }
+        }
+        public T Get(Expression<Func<T, bool>> where, Expression<Func<T, object>> orderBy = null) {
+            try {
+                var db = GetInstance();
+                T model = null;
+                if (orderBy != null) {
+                    model = db.Queryable<T>().Where(where).OrderBy(orderBy, OrderByType.Desc).First();//鏌ヨ琛ㄧ殑鎵�湁
+                }
+                else {
+                    model = db.Queryable<T>().Where(where).First();
+                }
+                return model;
+            }
+            catch (Exception ex) {
+                Console.WriteLine($"璇诲彇SQLSERVER鏁版嵁搴撳紓甯革紒寮傚父锛歿ex}");
+                return default(T);
+            }
+        }
+        public bool Update(T model) {
+            var db = GetInstance();
+            return db.Updateable<T>(model).ExecuteCommand() > 0;
+        }
+        public bool Insert(T model) {
+            try {
+                var db = GetInstance();
+                return db.Insertable<T>(model).ExecuteCommand() > 0;
+            }
+            catch (Exception ex) {
+                Console.WriteLine("鍐欏叆淇℃伅寮傚父锛� + ex.Message);
+                return false;
+            }
+        }
+
+        //鍒犻櫎鎸囧畾鏉′欢鏁版嵁
+        public bool Deleteable(Expression<Func<T, bool>> where) {
+            try {
+                var db = GetInstance();
+                return db.Deleteable<T>().Where(where).ExecuteCommand() > 0;
+            }
+            catch (Exception ex) {
+                return false;
+            }
+        }
+
+
+        //鍒涘缓SqlSugarClient 
+        public SqlSugarClient GetInstance(bool action = true) {
+            if (action)
+            {
+                //鍒涘缓鏁版嵁搴撳璞�+                SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
+                {
+                    //ConnectionString = "Server=192.168.1.233;Database=ams;Uid=root;Pwd=123456;",//杩炴帴绗﹀瓧涓�+                    //ConnectionString = "Data Source=192.168.1.199;Initial Catalog=JD_AMS;User ID=sa;Password=test?123;",//鍐欐SqlServer
+                    ConnectionString = Settings.SqlServer,//杩炴帴绗﹀瓧涓�+                    DbType = DbType.SqlServer,//DbType.MySql
+                    IsAutoCloseConnection = true,
+                    InitKeyType = InitKeyType.Attribute//浠庣壒鎬ц鍙栦富閿嚜澧炰俊鎭�+                });
+
+                //娣诲姞Sql鎵撳嵃浜嬩欢锛屽紑鍙戜腑鍙互鍒犳帀杩欎釜浠g爜
+                //db.Aop.OnLogExecuting = (sql, pars) => {
+                //    Console.WriteLine(db.CurrentConnectionConfig.ConnectionString);
+                //    Console.WriteLine("sql"+sql+",pars"+ JsonConvert.SerializeObject(pars));
+                //    //Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
+                //    Console.WriteLine();
+                //};
+                return db;
+            }
+            else
+            {
+                //鍒涘缓鏁版嵁搴撳璞�+                SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
+                {
+                    //ConnectionString = "Server=192.168.1.233;Database=ams;Uid=root;Pwd=123456;",//杩炴帴绗﹀瓧涓�+                    //ConnectionString = "Data Source=192.168.1.199;Initial Catalog=JD_AMS;User ID=sa;Password=test?123;",//鍐欐SqlServer
+                    ConnectionString = Settings.SqlServer1,//杩炴帴绗﹀瓧涓�+                    DbType = DbType.SqlServer,//DbType.MySql
+                    IsAutoCloseConnection = true,
+                    InitKeyType = InitKeyType.Attribute//浠庣壒鎬ц鍙栦富閿嚜澧炰俊鎭�+                });
+
+                //娣诲姞Sql鎵撳嵃浜嬩欢锛屽紑鍙戜腑鍙互鍒犳帀杩欎釜浠g爜
+                //db.Aop.OnLogExecuting = (sql, pars) => {
+                //    Console.WriteLine(db.CurrentConnectionConfig.ConnectionString);
+                //    Console.WriteLine("sql"+sql+",pars"+ JsonConvert.SerializeObject(pars));
+                //    //Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
+                //    Console.WriteLine();
+                //};
+                return db;
+            }
+            
+        }
+        //瀹炰綋涓庢暟鎹簱缁撴瀯涓�牱
+        public static string AMS_MSSQL = ConfigurationManager.ConnectionStrings["AMS_MSSQL"].ToString();
+    }
+
+    public class SqlTwoHelper<T> where T : class, new()
+    {
+        public bool ExecuteSql(string sql)
+        {
+            try
+            {
+                var code = GetInstance().Ado.ExecuteCommand(sql);
+                return code > 1;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                return false;
+            }
+        }
+
+        public bool Update(T model, string[] cols)
+        {
+            var db = GetInstance();
+            return db.Updateable<T>(model).UpdateColumns(cols).ExecuteCommand() > 0;
+        }
+        public List<T> GetList(Expression<Func<T, bool>> where = null)
+        {
+            var db = GetInstance();
+            if (where == null)
+            {
+                return db.Queryable<T>().ToList();
+            }
+            else
+            {
+                return db.Queryable<T>().Where(where).ToList();
+            }
+        }
+        public T Get(Expression<Func<T, bool>> where, Expression<Func<T, object>> order, bool asc = false)
+        {
+            SqlSugarClient db = GetInstance();
+            if (order == null)
+            {
+                return db.Queryable<T>().Where(where).Single();
+            }
+            else
+            {
+                return db.Queryable<T>().Where(where).OrderBy(order, asc ? OrderByType.Asc : OrderByType.Desc).First();
+            }
+        }
+        public T Get(Expression<Func<T, bool>> where, Expression<Func<T, object>> orderBy = null)
+        {
+            try
+            {
+                var db = GetInstance();
+                T model = null;
+                if (orderBy != null)
+                {
+                    model = db.Queryable<T>().Where(where).OrderBy(orderBy, OrderByType.Desc).First();//鏌ヨ琛ㄧ殑鎵�湁
+                }
+                else
+                {
+                    model = db.Queryable<T>().Where(where).First();
+                }
+                return model;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                return default(T);
+            }
+        }
+        public bool Update(T model)
+        {
+            var db = GetInstance();
+            return db.Updateable<T>(model).ExecuteCommand() > 0;
+        }
+        public bool Insert(T model)
+        {
+            try
+            {
+                var db = GetInstance();
+                return db.Insertable<T>(model).ExecuteCommand() > 0;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                return false;
+            }
+        }
+
+        //鍒犻櫎鎸囧畾鏉′欢鏁版嵁
+        public bool Deleteable(Expression<Func<T, bool>> where)
+        {
+            try
+            {
+                var db = GetInstance();
+                return db.Deleteable<T>().Where(where).ExecuteCommand() > 0;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+                return false;
+            }
+        }
+
+        public bool CreateTable()
+        {
+            bool result = false;
+            var db = GetInstance();
+
+            //瀹氫箟SQL璇彞
+            //string sql = "create table student" + "(num varchar(50),name varchar(255),age int)";
+
+            try
+            {
+
+                // 鍒涘缓鏁版嵁搴�+                //db.Context.DbMaintenance.CreateDatabase();
+                // 鍒涘缓琛�+                db.Context.CodeFirst.InitTables(
+                    typeof(T)
+                );
+                //Console.WriteLine("鏁版嵁琛ㄥ垱寤烘垚鍔熴�");
+            }
+            catch (Exception ae)
+            {
+                Console.WriteLine("鏁版嵁琛ㄥ垱寤哄け璐ャ�" + ae.Message.ToString());
+            }
+            finally
+            {
+                //db.Close();//瀵规暟鎹簱鎿嶄綔瀹屾垚鍚庯紝闇�鍏抽棴鏁版嵁搴擄紝閲婃斁鍐呭瓨
+            }
+            return result;
+        }
+
+
+        //鍒涘缓SqlSugarClient 
+        public SqlSugarClient GetInstance()
+        {
+            //鍒涘缓鏁版嵁搴撳璞�+            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
+            {
+                ConnectionString = Settings.SqlServer,
+                DbType = DbType.SqlServer,
+                IsAutoCloseConnection = true,
+                InitKeyType = InitKeyType.Attribute//浠庣壒鎬ц鍙栦富閿嚜澧炰俊鎭�+            });
+            //db.MappingTables.Add("","");
+
+            //娣诲姞Sql鎵撳嵃浜嬩欢锛屽紑鍙戜腑鍙互鍒犳帀杩欎釜浠g爜
+            //db.Aop.OnLogExecuting = (sql, pars) => {
+            //    Console.WriteLine(db.CurrentConnectionConfig.ConnectionString);
+            //    Console.WriteLine("sql"+sql+",pars"+ JsonConvert.SerializeObject(pars));
+            //    //Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
+            //    Console.WriteLine();
+            //};
+
+            return db;
+        }
+    }
+
+    public class AMSSqlHelper
+    {
+
+        public bool ExecuteSql(string sql) {
+            try {
+                var code = GetInstance().Ado.ExecuteCommand(sql);
+                return code > 1;
+            }
+            catch (Exception ex) {
+                return false;
+            }
+        }
+
+        private SqlSugarClient GetInstance() {
+            //鍒涘缓鏁版嵁搴撳璞�+            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() {
+                //ConnectionString = "Server=192.168.1.233;Database=ams;Uid=root;Pwd=123456;",//杩炴帴绗﹀瓧涓�+                ConnectionString = AMS_MSSQL,//杩炴帴绗﹀瓧涓�+                DbType = DbType.SqlServer,//DbType.MySql
+                IsAutoCloseConnection = true,
+                InitKeyType = InitKeyType.Attribute//浠庣壒鎬ц鍙栦富閿嚜澧炰俊鎭�+            });
+
+            //娣诲姞Sql鎵撳嵃浜嬩欢锛屽紑鍙戜腑鍙互鍒犳帀杩欎釜浠g爜
+            //db.Aop.OnLogExecuting = (sql, pars) => {
+            //    Console.WriteLine(db.CurrentConnectionConfig.ConnectionString);
+            //    Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
+            //    Console.WriteLine();
+            //};
+            return db;
+        }
+        //瀹炰綋涓庢暟鎹簱缁撴瀯涓�牱
+        public static string AMS_MSSQL = ConfigurationManager.ConnectionStrings["AMS_MSSQL"].ToString();
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Startup.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Startup.cs
new file mode 100644
index 0000000..d817cd3
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Startup.cs
@@ -0,0 +1,25 @@
+锘縰sing System;
+using System.Threading.Tasks;
+using System.Web.Http;
+using Microsoft.Owin;
+using Owin;
+
+[assembly: OwinStartup(typeof(Hanhe.iWCS.TaizhouGEMTwoProtocol.Startup))]
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class Startup
+    {
+        public void Configuration(IAppBuilder app) {
+            // 鏈夊叧濡備綍閰嶇疆搴旂敤绋嬪簭鐨勮缁嗕俊鎭紝璇疯闂�https://go.microsoft.com/fwlink/?LinkID=316888
+            HttpConfiguration config = new HttpConfiguration();
+
+            // Web API routes
+            config.MapHttpAttributeRoutes();
+
+            //WebApiConfig.Register(config);
+
+            app.UseWebApi(config);
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/TSHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/TSHelper.cs
new file mode 100644
index 0000000..4c186cc
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/TSHelper.cs
@@ -0,0 +1,244 @@
+锘縰sing Hanhe.iWCS.Business;
+using Hanhe.iWCS.Common;
+using Hanhe.iWCS.DeviceDriver;
+using Hanhe.iWCS.Model;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class TSHelper
+    {
+        /// <summary>
+        /// AGV杩涘叆
+        /// </summary>
+        /// <param name="taskNo">浠诲姟鍙�/param>
+        /// <param name="orderNo">搴忓彿</param>
+        /// <param name="param1">鏂扮殑agv缁堢偣</param>
+        //public static bool GoToAGV(string taskNo, int orderNo, int param1 = 1) {
+        public static bool GoToAGV(string taskNo, int orderNo, int param1)
+        {
+            bool bResult = false;
+            //TN_I_TASK_DTL_ACTION GoToAction = WorkFlowAction.GetActionNode(taskNo, orderNo, 0);
+            TN_I_TASK_DTL_ACTION GoToAction = WorkFlowAction.GetActionNode(taskNo, 1, 0);
+            if (GoToAction != null) {
+                HardwareAccessObject GoToAGVHao = HardwareAccessHelper.Instance.GetEquipmentsHAO(GoToAction.CN_S_PROGRAM_CODE);
+                if (GoToAGVHao != null) {
+                    //鍙戦�琛岃蛋鎸囦护 鍒癆GV
+                    CMMLog.Info($"銆愭澀鍙堿GV銆慓oToAGVHao:{GoToAGVHao}");
+                    Console.WriteLine($"銆愭澀鍙堿GV銆慓oToAGVHao:{GoToAGVHao}");
+                    StringBuilder sbMsg = new StringBuilder();
+                    sbMsg.Append("<Req>");
+                    sbMsg.Append("<Order No='" + taskNo + "_" + "1" + "' Param1='" + param1 + "' ParamNo='" + orderNo + "' />");
+                    sbMsg.Append("</Req>");
+                    try {
+                        object[] args = new object[1];
+                        args[0] = sbMsg.ToString();
+                        object errObject = GoToAGVHao._WebServiceInstance.Invoke("ChangeOrder", args);
+                        string errMsg = string.Empty;
+                        int errCode = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)errObject, out errMsg);
+                        if (errCode == 0) {
+                            CMMLog.Info("銆愭澀鍙堿GV銆戦�鐭GV琛岃蛋鎴愬姛锛佽姹傚弬鏁�" + sbMsg.ToString());
+                            Console.WriteLine("銆愭澀鍙堿GV銆戦�鐭GV琛岃蛋鎴愬姛锛佽姹傚弬鏁�" + sbMsg.ToString());
+                            bResult = true;
+                        }
+                        else {
+                            CMMLog.Info("銆愭澀鍙堿GV銆戝崰鐢ㄥけ璐�閫氱煡AGV琛岃蛋澶辫触锛乪rrCode=" + errCode + ";璇锋眰鍙傛暟=" + sbMsg.ToString());
+                            Console.WriteLine("銆愭澀鍙堿GV銆戝崰鐢ㄥけ璐�閫氱煡AGV琛岃蛋澶辫触锛乪rrCode=" + errCode + ";璇锋眰鍙傛暟=" + sbMsg.ToString());
+                        }
+                    }
+                    catch (Exception ex) {
+                        CMMLog.Info("銆愭澀鍙堿GV銆戦�鐭GV寮傚父锛丒xception=" + ex.Message + ";璇锋眰鍙傛暟=" + sbMsg.ToString());
+                        Console.WriteLine("銆愭澀鍙堿GV銆戦�鐭GV寮傚父锛丒xception=" + ex.Message + ";璇锋眰鍙傛暟=" + sbMsg.ToString());
+                    }
+                }
+                else
+                {
+                    CMMLog.Info($"銆愭澀鍙堿GV銆慓oToAGVHao==null!");
+                    Console.WriteLine($"銆愭澀鍙堿GV銆慓oToAGVHao==null!");
+                }
+            }
+            else
+            {
+                CMMLog.Info($"銆愭澀鍙堿GV銆慓oToAction==null!");
+                Console.WriteLine($"銆愭澀鍙堿GV銆慓oToAction==null!");
+            }
+            return bResult;
+        }
+
+        //ams涓嬪彂鍏呯數浠诲姟锛孴S99锛屽弬鏁�濉啓杞﹀彿鍗冲彲銆�+        //褰撳厖鐢靛紑濮嬫椂锛屼細鍙戦�s娑堟伅锛屽甫鐨勪笁涓弬鏁板垎鍒负锛�杞﹀彿锛�1锛�9
+        //褰撳厖鐢电粨鏉熸垨鑰呬换鍔¤鍙栨秷锛屼細鍙戦�s娑堟伅锛屼笁涓弬鏁板垎鍒负锛�杞﹀彿锛�2锛�9
+        internal static int SendChargeTask(string agvNo, bool charge, bool full = false)
+        {
+            CMMLog.Info("鎺ㄩ�鍏呯數浠诲姟锛氭墽琛屽紑濮嬶紒");
+            Console.WriteLine("鎺ㄩ�鍏呯數浠诲姟锛氭墽琛屽紑濮嬶紒");
+            var command = charge ? "AddNewOrder" : "CancelOrder";
+            int code = -1;
+            try
+            {
+                CMMLog.Info("鎺ㄩ�鍏呯數浠诲姟锛歠ull=" + full);
+                int to = full ? 1000 : 0;
+                StringBuilder sbMsg = new StringBuilder();
+                sbMsg.Append("<Req>");
+                if (charge)
+                {
+                    sbMsg.Append("<Order  TS='99' Pri='20' ExtDeviceNo='" + agvNo + "' FRow='' TRow='' No='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff") + "' />");
+                    CMMLog.Info($"鎺ㄩ�鍏呯數浠诲姟锛歿sbMsg}");
+                }
+                else
+                {
+                    sbMsg.Append("<Order Pri='20' TS='101' IsForce='1' ExtDeviceNo='" + agvNo + "' IsForce='1' From='" + agvNo + "' To='4'  />");
+                    CMMLog.Info($"鎺ㄩ�鍏呯數浠诲姟锛歿sbMsg}");
+                }
+                sbMsg.Append("</Req>");
+                HardwareAccessObject AGVHao = HardwareAccessHelper.Instance.GetEquipmentsHAO("1");
+                if (AGVHao != null)
+                {
+                    object[] args = new object[1];
+                    string errMsg = string.Empty;
+                    args[0] = sbMsg.ToString();
+                    object xmlData = AGVHao._WebServiceInstance.Invoke(command, args);
+                    code = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)xmlData, out errMsg);
+                    CMMLog.Info("鎺ㄩ�鍏呯數浠诲姟锛歱aram=" + sbMsg.ToString() + ";cmd=" + command + ";code=" + code + ";errMsg=" + errMsg);
+                    if (code == 60050)
+                    {
+                        code = 0;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Info("鎺ㄩ�鍏呯數浠诲姟锛氬紓甯革細銆恆gv=" + agvNo + ";cmd=" + command + "銆慶harge task err锛� + ex.Message.ToString());
+            }
+            CMMLog.Info("鎺ㄩ�鍏呯數浠诲姟锛氭墽琛岀粨鏉燂紒");
+            return code;
+        }
+
+        /// <summary>
+        /// 灏忚溅瀹夊叏闂ㄤ氦浜�+        /// </summary>
+        /// <param name="lockNo"></param>
+        /// <returns></returns>
+        public static bool Traffic(string lockNo)
+        {
+            bool bResult = false;
+            HardwareAccessObject AGVhao = HardwareAccessHelper.Instance.GetEquipmentsHAO("1");
+            if (AGVhao != null)
+            {
+                //鍙戦�琛岃蛋鎸囦护 鍒癆GV
+                StringBuilder sbMsg = new StringBuilder();
+                sbMsg.Append("<Req>");
+                //sbMsg.Append("<Order TS='164' From='2' To='2' ExtDeviceNo='" + lockNo + "' No='" + DateTime.Now.Ticks.ToString() + "' />");
+                sbMsg.Append("<Order TS='164' ExtDeviceNo='" + lockNo + "' No='" + DateTime.Now.Ticks.ToString() + "' />");
+                sbMsg.Append("</Req>");
+
+                var msg = string.Empty;
+                try
+                {
+                    object[] args = new object[1];
+                    args[0] = sbMsg.ToString();
+                    object errObject = AGVhao._WebServiceInstance.Invoke("StartNewOrderWithQCmd", args);
+                    string errMsg = string.Empty;
+                    int errCode = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)errObject, out errMsg);
+                    if (errCode == 0)
+                    {
+                        bResult = true;
+                    }
+                    msg = string.Format($"銆愭帹閫佸皬杞﹁繘鍏ュ畨鍏ㄩ棬銆戯細" + "notice agv go errCode={0} errMsg={1} request={2}", errCode, errMsg, sbMsg.ToString());
+                    //Console.WriteLine(msg);
+                    CMMLog.Debug(msg);
+                }
+                catch (Exception ex)
+                {
+                    msg = string.Format($"銆愭帹閫佸皬杞﹁繘鍏ュ畨鍏ㄩ棬锛氬紓甯搞�锛� + "notice agv go errMsg={0} request={1}", ex.Message, sbMsg.ToString());
+                    //Console.WriteLine(msg);
+                    CMMLog.Debug(msg);
+                }
+            }
+            return bResult;
+        }
+
+
+        /// <summary>
+        /// 鍙戦�鍜屽彇娑堝厖鐢典换鍔�+        /// </summary>
+        /// <param name="taskNo">浠诲姟鍙�/param>
+        /// <param name="agvNo">杞﹀彿</param>
+        /// <param name="command">鎸囦护鏂规硶</param>
+        /// <returns></returns>
+        //internal static int SendChargeTask(string taskNo, string agvNo, bool charge, bool full = false) {
+        //    Console.WriteLine("SendChargeTask");
+        //    var command = charge ? "AddNewOrder" : "CancelOrder";
+        //    //	int code = SendAGVTaskInfo(taskNo, agvNo, "AddNewOrder");
+        //    //  int code = SendAGVTaskInfo(taskNo, agvNo, "CancelOrder");
+        //    int code = -1;
+        //    try {
+        //        CMMLog.Info("full=" + full);
+        //        int to = full ? 1000 : 0;
+        //        StringBuilder sbMsg = new StringBuilder();
+        //        sbMsg.Append("<Req>");
+        //        if (charge) {
+        //            sbMsg.Append("<Order Pri='15' TS='99' No='" + taskNo + "' From='" + agvNo + "'  />");
+        //        }
+        //        else {
+        //            sbMsg.Append("<Order Pri='15' TS='101' IsForce='1' No='" + taskNo + "' IsForce='1' From='" + agvNo + "' To='4'  />");
+        //        }
+        //        sbMsg.Append("</Req>");
+        //        HardwareAccessObject AGVHao = HardwareAccessHelper.Instance.GetEquipmentsHAO("1");
+        //        if (AGVHao != null) {
+        //            object[] args = new object[1];
+        //            string errMsg = string.Empty;
+        //            args[0] = sbMsg.ToString();
+        //            object xmlData = AGVHao._WebServiceInstance.Invoke(command, args);
+        //            code = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)xmlData, out errMsg);
+        //            CMMLog.Info("send charge task锛歱aram=" + sbMsg.ToString() + ";cmd=" + command + ";code=" + code + ";errMsg=" + errMsg);
+        //            if (code == 60050) {
+        //                code = 0;
+        //            }
+        //        }
+        //    }
+        //    catch (Exception ex) {
+        //        CMMLog.Info("銆恆gv=" + agvNo + ";cmd=" + command + "銆慶harge task err锛� + ex.Message.ToString());
+        //    }
+        //    return code;
+        //}
+
+        public static bool ChangeParam(string taskNo, int paramNo, params int[] param) {
+            bool bResult = false;
+            TN_I_TASK_DTL_ACTION GoToAction = WorkFlowAction.GetActionNode(taskNo, 1, 0);
+            if (GoToAction != null) {
+                HardwareAccessObject GoToAGVHao = HardwareAccessHelper.Instance.GetEquipmentsHAO(GoToAction.CN_S_PROGRAM_CODE);
+                if (GoToAGVHao != null) {
+                    //鍙戦�琛岃蛋鎸囦护 鍒癆GV
+                    var req = $"<Req><Order No = '{taskNo}_1' ParamNo = '{paramNo}' Param1='{param[0]}'/></Req> ";
+                    if (param.Length > 1) {
+                        req = $"<Req><Order No = '{taskNo}_1' ParamNo = '{paramNo}' Param1='{param[0]}' Param2='{param[1]}'/></Req> ";
+                    }
+                    try 
+                    {
+                        object[] args = new object[1];
+                        args[0] = req;
+                        object errObject = GoToAGVHao._WebServiceInstance.Invoke("ChangeOrder", args);
+                        string errMsg = string.Empty;
+                        int errCode = Hanhe.iWCS.AGVWebService.AGVHelper.Instance.AGVXmlResult((string)errObject, out errMsg);
+                        if (errCode == 0) {
+                            CMMLog.Info("銆愭澀鍙堿GV銆戦�鐭GV琛岃蛋鎴愬姛锛佽姹傚弬鏁�" + req);
+                            bResult = true;
+                        }
+                        else {
+                            CMMLog.Info("銆愭澀鍙堿GV銆戝崰鐢ㄥけ璐�閫氱煡AGV琛岃蛋澶辫触锛乪rrCode=" + errCode + ";璇锋眰鍙傛暟=" + req);
+                        }
+                    }
+                    catch (Exception ex) {
+                        CMMLog.Info("銆愭澀鍙堿GV銆戦�鐭GV寮傚父锛丒xception=" + ex.Message + ";璇锋眰鍙傛暟=" + req);
+                    }
+                }
+            }
+            return bResult;
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/TcpHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/TcpHelper.cs
new file mode 100644
index 0000000..c407db6
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/TcpHelper.cs
@@ -0,0 +1,37 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+using Hanhe.iWCS.Common;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    internal class TcpHelper
+    {
+        public static bool Write(string ip,int port,int startAddr, byte[] dataToSend)
+        {
+            try
+            {
+                // 鍒涘缓TCP瀹㈡埛绔苟杩炴帴鍒扮洰鏍囪澶�+                using (TcpClient client = new TcpClient(ip, port))
+                {
+
+                    // 鑾峰彇缃戠粶娴�+                    NetworkStream stream = client.GetStream();
+
+                    // 鍙戦�鏁版嵁
+                    stream.Write(dataToSend, startAddr, dataToSend.Length);
+                    return true;
+                }
+            }
+            catch(Exception ex)
+            {
+                CMMLog.Error("鏁版嵁鍐欏叆澶辫触锛�+ex.Message);
+            }
+            return false;
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Test.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Test.cs
new file mode 100644
index 0000000..06b1c68
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/Test.cs
@@ -0,0 +1,58 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.VisualBasic;
+using System.Collections;
+using System.Data;
+using System.Diagnostics;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    
+    public static class Test
+    {
+        public static int ConvertToAscii(char c)
+        {
+            return Strings.AscW(c);
+        }
+
+        public static char ConvertFromAscii(int n)
+        {
+            return Strings.ChrW(n);
+        }
+        public static void Main()
+        {
+            //娴嬭瘯
+            string s = "鎴戠埍鍖椾含澶╁畨闂�;
+            Console.WriteLine(s.Length);
+            int dataCutCont = 0;
+            for (int i = 1; i <= 7; i++)
+            {
+                //Console.WriteLine(Test.ConvertToAscii(char.Parse(s.Substring(dataCutCont, 1))));
+                dataCutCont = dataCutCont + 1;
+            }
+
+            //foreach (char c in s)
+            //{
+            //    Console.Write(ConvertToAscii(c).ToString() + "   ");
+            //}
+            Console.WriteLine();
+            int[] n = new int[] {
+            25105,
+            29233,
+            21271,
+            20140,
+            22825,
+            23433,
+            38376
+        };
+            foreach (int num in n)
+            {
+                Console.Write(ConvertFromAscii(num).ToString() + "      ");
+            }
+
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/WMSHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/WMSHelper.cs
new file mode 100644
index 0000000..e566c2f
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/WMSHelper.cs
@@ -0,0 +1,825 @@
+锘縰sing Hanhe.iWCS.Common;
+using Hanhe.iWCS.DeviceDriver;
+using Hanhe.iWCS.MData;
+using Hanhe.iWCS.Model;
+using Hanhe.iWCS.TaizhouGEMTwoProtocol;
+using MongoDB.Driver;
+using MongoDB.Driver.Builders;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ApiHelper;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.ERPService;
+using static Hanhe.iWCS.TaizhouGEMTwoProtocol.MESHelper;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class WMSHelper
+    {
+        private static WebApiHelper helper = new WebApiHelper();
+        private static T WmsRequest<T>(string name, string param) where T : BaseResponse {
+            HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS);
+            string msg = "";
+            string feedback = "";
+            T response = default(T);
+            if (hao != null) {
+                try {
+                    //http://[IP]:[绔彛]/api/ApiTask/
+                    string webAPIUrl = hao.WebUrl + name;
+                    //Console.WriteLine(webAPIUrl);
+                    //Console.WriteLine(param);
+                    feedback = new WebApiHelper().WebPost(webAPIUrl, param).Replace(@"\", "").Trim();
+                    //feedback = "{\"success\":false,\"errCode\":\"5001\",\"errMsg\":\"鎵樼洏鍙蜂笉瀛樺湪121锛乗"}";
+                    //feedback = "{\"success\":true,\"errCode\":\"0\",\"task\":{\"taskNo\":\"RWH2103300000013\",\"warehouse\":\"CK002\",\"warehouseArea\":\"BCPLK01\",\"bit\":\"P01-02-06-08\"}}";
+                    if (!string.IsNullOrEmpty(feedback)) {
+                        feedback = feedback.Substring(1, feedback.Length - 2);
+                        Console.WriteLine(feedback);
+                        response = JsonConvert.DeserializeObject<T>(feedback);
+                        if (response.success == true) {
+                            msg = $"銆恮ms {name}銆憇uccess锛�WebUrl=" + webAPIUrl + ";param=" + param + ";feedback=" + feedback;
+                        }
+                        else {
+                            string errMsg = response.errMsg;
+                            msg = $"銆恮ms {name}銆慺ail锛乪rr=" + errMsg + ";WebUrl=" + webAPIUrl + ";param=" + param + ";feedback=" + feedback;
+                        }
+                    }
+                    else {
+                        string errMsg = "can't find the address";
+                        msg = $"銆恮ms {name}銆慺ail锛乪rr=" + errMsg + ";WebUrl=" + webAPIUrl + ";param=" + param;
+                    }
+                    //Console.WriteLine(msg);
+                    CMMLog.Info(msg);
+                }
+                catch (Exception e) {
+                    CMMLog.Error($"銆恮ms {name}銆慺ail锛乪rr={e.Message}", e);
+                }
+            }
+            else {
+                msg = string.Format($"wms {name} fail锛宎ms workcenter not set锛�);
+            }
+
+            return response;
+        }
+
+        internal static void ExecuteState(string taskNo, int state, string bit = "") {
+            var param = new { taskNo = taskNo, stateNo = state };
+            WmsRequest<BaseResponse>("ExecuteState", JsonConvert.SerializeObject(param));
+        }
+        
+
+        public class BaseResponse
+        {
+            public bool success { get; set; }
+            public string errCode { get; set; }
+            public string errMsg { get; set; }
+        }
+        public class WMSInModel
+        {
+            public string taskNo { get; set; }
+            public string startStock { get; set; }
+            public string startArea { get; set; }
+            public string startBit { get; set; }
+            public string trayDimension { get; set; }
+            public string isTransport { get; set; }
+            public string needCreateAMSTask { get; set; }
+            public int priority { get; set; }
+            public int isFull { get; set; }
+            public string projectCode { get; set; }
+            /// <summary>
+            /// 鎵樼洏鐮�+            /// </summary>
+            public string trayCode { get; set; }
+            public string locationGear { get; set; }
+            public string trayType { get; set; }
+            public List<ItemData> data { get; set; }
+            //public List<TimeData> TimeData { get; set; }
+        }
+
+        public class WMSOutModel
+        {
+            //public string taskNo { get; set; }
+            //public string endStock { get; set; }
+            //public string endArea { get; set; }
+            public string endBit { get; set; }
+            public string trayDimension { get; set; }
+            public string needCreateAMSTask { get; set; }
+            public int priority { get; set; }
+            //public int isFull { get; set; }
+            public string projectCode { get; set; }
+            //public List<ItemData> Data { get; set; }
+        }
+        public class WMSEmptyOutModel
+        {
+            //public string taskNo { get; set; }
+            //public string endStock { get; set; }
+            //public string endArea { get; set; }
+            public string endBit { get; set; }
+            public string trayDimension { get; set; }
+            public string needCreateAMSTask { get; set; }
+            public int priority { get; set; }
+            //public int isFull { get; set; }
+            public string projectCode { get; set; }
+            public string trayType { get; set; }
+        }
+        public class WMSResponseModel
+        {
+            //"{\"Success\":false,\"ErrCode\":null,\"ErrMsg\":\"\",\"OkList\":[],\"FailList\":[{\"Index\":0,\"ErrCode\":null,\"ErrMsg\":\"鏈壘鍒癮aa浣嶇疆鐨勬墍灞炰粨搴揬"}],\"Tasks\":[]}"
+            // "{\"Success\":true,\"ErrCode\":null,\"ErrMsg\":null,\"OkList\":[{\"Index\":0,\"TaskNo\":\"RKT00032\",\"StartStock\":\"XMZ001\",\"StartArea\":\"XMZ001005\",\"StartBit\":\"XMZ001Q71-1\",\"EndStock\":\"XMZ001\",\"EndArea\":\"XMZ001001\",\"EndBit\":\"XMZ001B61-2\",\"Priority\":0}],\"FailList\":[],\"Tasks\":[]}"
+            public int Status { get; set; }
+            public string Code { get; set; }
+            public string Msg { get; set; }
+            public List<TaskInfo> Data { get; set; }
+            public int AffectedRows { get; set; }
+
+            public bool Success { get; set; }
+            //public List<TaskInfo> failList { get; set; }
+            //public List<TaskInfo> tasks { get; set; }
+            //{"taskNo":"浠诲姟鍙�,"startStock":"璧峰浠撳簱","startArea":"璧峰搴撳尯","startBit":"璧峰璐т綅","endStock":"鐩殑浠撳簱","endArea":"鐩殑搴撳尯","endBit":"鐩殑璐т綅"}
+            public class TaskInfo
+            {
+                public string taskNo { get; set; }
+                public string startStock { get; set; }
+                public string startArea { get; set; }
+                public string startBit { get; set; }
+                public string endStock { get; set; }
+                public string endArea { get; set; }
+                public string endBit { get; set; }
+                #region   璁惧閫氶亾淇℃伅
+
+                /// <summary>
+                /// 璁惧閫氶亾鏁版嵁3鈥斺�鎵樼洏鐮�         
+                /// </summary>
+                public string trayCode { get; set; }
+
+                #endregion
+            }
+        }
+        public class ItemData
+        {
+            //鎵樼洏灏哄锛歵rayDimension
+            //鐗╂枡缂栧彿锛歩temCode
+            //鐗╂枡鏁伴噺锛歲ty
+            public string itemCode { get; set; }
+            //public string itemFeature { get; set; }
+            //public string itemState { get; set; }
+            //public string ProductionDate { get; set; }
+            //public string ColourNumber { get; set; }
+            //public string Specification { get; set; }
+            //public string BatchNumber { get; set; }
+            //public int qty { get; set; }
+
+            /// <summary>
+            /// 鏄惁鍙犲簳鎵橈紙1-涓嶅彔搴曟墭    2-鍙犲簳鎵橈級
+            /// </summary>
+            public string palletLayers { get; set; }
+
+            #region   MES浼犺緭鐨勬暟鎹�+            //浼犺緭MES淇℃伅浠ュ強璁惧淇℃伅缁橶MS
+            /// <summary>
+            /// mes杩斿洖鐨勫寘瑁呮満鍙凤紙T1锛孴2锛�.....锛孴9锛�+            /// </summary>
+            public string machineNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勬垚鍝佹壒娆″彿
+            /// </summary>
+            public string lotNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勮鍙�+            /// </summary>
+            //public string bagNo { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勪骇鍝佸瀷鍙�+            /// </summary>
+            //public string productType { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勭墿鏂欑紪鐮�+            /// </summary>
+            //public string materialCode { get; set; }
+            /// <summary>
+            /// mes杩斿洖鐨勫彔鍖呭眰鏁� 锛堜緥1,2,3锛�浠h〃涓嶅彔鍖咃紝2浠h〃鍙�灞傦紝3浠h〃鍙�灞傦級
+            /// </summary>
+            public string foldingbag { get; set; }
+            #endregion
+
+            #region   璁惧閫氶亾淇℃伅
+
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁3鈥斺�鎵樼洏鐮�         
+            /// </summary>
+            //public string trayCode { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄彿        
+            /// </summary>
+            //public string location { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�浜у搧闇�眰閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string productWeight { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鎵樼洏閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string trayCodeWeight { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍗曟墭瀹為檯閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public string oneTrayWeight { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁2鈥斺�鍙犲寘鍚庡疄闄呴噸閲忥細32浣嶆暣鏁�+            /// </summary>
+            //public string addWeight { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鍖呰鏈哄嚭鍙gО閲嶇粨鏋滐細1:OK,2:NG
+            /// </summary>
+            //public int packNg { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�澶嶇О鍙gО閲嶇粨鏋滐細1:OK,2:NG
+            /// </summary>
+            public int itemState { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�鏄惁闇�鍙犲寘锛�锛氬彔鍖咃紝2锛氫笉鍙犲寘
+            /// </summary>
+            //public int addState { get; set; }
+            /// <summary>
+            /// 璁惧閫氶亾鏁版嵁1鈥斺�琚嬪彿(001,002,003鈥�99)
+            /// </summary>
+            public string packageCode { get; set; }
+
+            #endregion
+
+            #region   鏃堕棿鎴充俊鎭�+            /// <summary>
+            /// 鏄惁鍙犲寘锛�锛�锛�锛�+            /// </summary>
+            public int isFold { get; set; }
+            /// <summary>
+            /// 鍖呰鏈哄彿
+            /// </summary>
+            public int packingMachineNumber { get; set; }
+            /// <summary>
+            /// 琚嬪彿(001,002,003鈥�99)1
+            /// </summary>
+            public string bagNumber { get; set; }
+            /// <summary>
+            /// 浜у搧闇�眰閲嶉噺1锛�2浣嶆暣鏁�+            /// </summary>
+            public int needWeight { get; set; }
+            /// <summary>
+            /// 鍗曟墭瀹為檯閲嶉噺1锛�2浣嶆暣鏁�+            /// </summary>
+            public int realWeight { get; set; }
+            /// <summary>
+            /// 鍙犳墭鍚庣殑瀹為檯閲嶉噺锛�2浣嶆暣鏁�+            /// </summary>
+            public int totalWeight { get; set; }
+            /// <summary>
+            /// 浜у搧鎵规鍙�+            /// </summary>
+            public string batchNumber { get; set; }
+            /// <summary>
+            /// 浜у搧鍨嬪彿
+            /// </summary>
+            public string productModel { get; set; }
+            /// <summary>
+            /// 璁℃暟(鍙湪鏁版嵁搴�
+            /// </summary>
+            public int totalCount { get; set; }
+            /// <summary>
+            /// 鏃堕棿鎴�+            /// </summary>
+            public int timeStamp { get; set; }
+            /// <summary>
+            /// 鐓х墖url
+            /// </summary>
+            public string photoURL { get; set; }
+            #endregion
+
+            #region   WMS鏄剧ず淇℃伅
+            /// <summary>
+            /// 鐗╂枡缂栫爜
+            /// </summary>
+            public string Jm_Item_Code { get; set; }
+            /// <summary>
+            /// 鐗╂枡鍚嶇О
+            /// </summary>
+            public string Jm_Item_Name { get; set; }
+            /// <summary>
+            /// 瑙勬牸鍨嬪彿
+            /// </summary>
+            public string Jm_Item_Model { get; set; }
+            /// <summary>
+            /// 鍗曚綅 
+            /// </summary>
+            public string Jm_Item_Unit { get; set; }
+            /// <summary>
+            /// 鍛樺伐
+            /// </summary>
+            public string Jm_Item_Staff { get; set; }
+            #endregion
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="startBit"></param>
+        /// <param name="ItemCode"></param>
+        /// <param name="taskNo"></param>
+        /// <param name="trayCode"></param>
+        /// <param name="timeStamp"></param>
+        /// <param name="employee_id">鍛樺伐缂栫爜</param>
+        /// <returns></returns>
+        public static bool WMSIn(string startBit, string ItemCode, ref string taskNo,ref string trayCode,string timeStamp = "",string employee_id = "",bool isTwo = false,string trayType = "") {
+            //XMZ001A11-1
+            //startBit = startBit.Substring(0, 9);
+            bool result = false;
+            HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS);
+            string msg = "";
+            if (hao != null) {
+                //http://192.168.1.199:9001/api/wmsapi/InWorkArea
+                WMSInModel model = new WMSInModel();
+                model.startBit = startBit;
+                model.isTransport = "N";
+                model.needCreateAMSTask = "Y";
+                model.projectCode = "glm";
+                model.trayType = trayType;
+                model.data = new List<ItemData>();
+                CMMLog.Info($"WMSIn-{startBit}:ItemCode绫诲瀷涓猴細{ItemCode}");
+                if (!string.IsNullOrEmpty(ItemCode)) {
+                    //var time = MongoDBSingleton.Instance.FindOne<TimeCuoInfoCom>(Query.Or(Query.EQ("isNeedTray", 1), Query.EQ("isNeedTray", 2)), "TimeCuoInfoCom");
+                    if (ItemCode == "time" || ItemCode == "鎷嗙洏鍙樻洿")
+                    {
+                        if (!isTwo)
+                        {
+                            int timeInt = int.Parse(trayCode);
+                            var time = MongoDBSingleton.Instance.FindOne<TimeCuoInfoCom>(Query.EQ("timeStamp", timeInt), "TimeCuoInfoCom");
+                            CMMLog.Info($"WMSIn-{startBit}:{ItemCode}锛氭煡璇㈡潯浠讹細timeStamp={timeInt},璇诲嚭 TimeCuoInfoCom 琛ㄦ暟鎹负锛歿JsonConvert.SerializeObject(time)}");
+                            if (ItemCode == "time" && time != null)
+                            {
+                                int TimeStamp = string.IsNullOrEmpty(timeStamp) ? time.timeStamp : int.Parse(timeStamp);
+                                CMMLog.Info($"WMSIn-{startBit}:time鑾峰彇鏃堕棿鎴虫暟鎹负锛歿TimeStamp}锛�);
+                                model.data.Add(new ItemData()
+                                {
+                                    //1妤兼媶鐩樻満璋僕MS鑾峰彇鍏ュ簱缁堢偣锛屼紶杈撴椂闂存埑鏁版嵁锛堟殏瀹氾級
+                                    //isFold = time.isFold,
+                                    //packingMachineNumber = time.packingMachineNumber,
+                                    itemCode = time.productModel,
+                                    lotNo = time.batchNumber,
+                                    machineNo = time.packingMachineNumber.ToString(),
+                                    packageCode = time.bagNumber,
+                                    palletLayers = time.isNeedTray.ToString(),
+                                    foldingbag = time.isFold.ToString(),
+                                    //totalWeight = time.totalWeight,
+                                    timeStamp = TimeStamp,
+                                    photoURL = time.photoURL,
+                                    //productType = time.productModel,
+                                    //bagNumber = time.bagNumber,
+                                    //needWeight = time.needWeight,
+                                    realWeight = time.realWeight,
+                                    //batchNumber = time.batchNumber,
+                                    //totalCount = time.totalCount,
+
+                                    Jm_Item_Code = time.materialCode,
+                                    Jm_Item_Name = time.materialName,
+                                    Jm_Item_Model = time.productModel,
+                                    Jm_Item_Unit = time.measurementUnit,
+                                    Jm_Item_Staff = employee_id
+                                });
+
+                                // 闈濫RP鍙樻洿娴佺▼鍙互鐩存帴鍒犻櫎 TimeCuoInfoCom 琛�+                                if (ERPService.ERPSwitch01 == "0")
+                                {
+                                    CMMLog.Info($"WMSIn-{startBit}:鏌ヨ鏉′欢锛歵imeStamp={timeInt},闈濫RP鍙樻洿娴佺▼鐩存帴鍒犻櫎 TimeCuoInfoCom 琛紒");
+                                    MongoDBSingleton.Instance.Remove<TimeCuoInfoCom>(Query.EQ("timeStamp", timeInt), RemoveFlags.Single);
+                                }
+                            }
+                            else if (ItemCode == "鎷嗙洏鍙樻洿")
+                            {
+                                model.data.Add(new ItemData()
+                                {
+                                    //1妤兼媶鐩樻満璋僕MS鑾峰彇鍏ュ簱缁堢偣锛屼紶杈撴椂闂存埑鏁版嵁锛堟殏瀹氾級
+                                    //isFold = time.isFold,
+                                    //packingMachineNumber = time.packingMachineNumber,
+                                    itemCode = "1",
+                                    lotNo = "1",
+                                    machineNo = "1",
+                                    packageCode = "1",
+                                    palletLayers = "1",
+
+                                    foldingbag = "1",
+                                    //totalWeight = time.totalWeight,
+                                    timeStamp = 1,
+                                    photoURL = "1",
+                                    //productType = time.productModel,
+                                    //bagNumber = time.bagNumber,
+                                    //needWeight = time.needWeight,
+                                    realWeight = 1,
+                                    //batchNumber = time.batchNumber,
+                                    //totalCount = time.totalCount,
+                                });
+                            }
+                        }
+                        else
+                        {
+                            var time = MongoDBSingleton.Instance.FindOne<TimeCuoInfoComTwo>(Query.EQ("timeStamp", timeStamp), "TimeCuoInfoCom");
+                            CMMLog.Info($"WMSIn-{startBit}:{ItemCode}锛氭煡璇㈡潯浠讹細timeStamp={timeStamp},璇诲嚭 TimeCuoInfoComTwo 琛ㄦ暟鎹负锛歿JsonConvert.SerializeObject(time)}");
+                            if (ItemCode == "time" && time != null)
+                            {
+                                CMMLog.Info($"WMSIn-{startBit}:time鑾峰彇鏃堕棿鎴虫暟鎹负锛歿time.TimeCuo}锛�);
+                                model.data.Add(new ItemData()
+                                {
+                                    //1妤兼媶鐩樻満璋僕MS鑾峰彇鍏ュ簱缁堢偣锛屼紶杈撴椂闂存埑鏁版嵁锛堟殏瀹氾級
+                                    //isFold = time.isFold,
+                                    //packingMachineNumber = time.packingMachineNumber,
+                                    itemCode = time.productModel,
+                                    lotNo = time.lotNo,
+                                    machineNo = time.packingMachineNumber1.ToString(),
+                                    packageCode = time.bagNumber1.ToString(),
+                                    //palletLayers = time.bagNumber1.ToString(),
+                                    foldingbag = time.isFold1.ToString(),
+                                    //totalWeight = time.totalWeight,
+                                    timeStamp = int.Parse(time.TimeCuo),
+                                    //productType = time.productModel,
+                                    //bagNumber = time.bagNumber,
+                                    //needWeight = time.needWeight,
+                                    realWeight = time.realWeight1,
+                                    //batchNumber = time.batchNumber,
+                                    //totalCount = time.totalCount,
+
+                                    Jm_Item_Code = time.materialCode,
+                                    Jm_Item_Name = time.materialName,
+                                    Jm_Item_Model = time.productModel,
+                                    Jm_Item_Unit = time.measurementUnit,
+                                    Jm_Item_Staff = employee_id
+                                });
+                            }
+                        }
+                        
+                    }
+                    else
+                    {
+                        var info = MongoDBSingleton.Instance.FindOne<MachineInfo>(Query.EQ("trayCode", ItemCode), "MachineInfo");
+                        // ERP鍙樻洿鏂板鏁版嵁鐩存帴浠� ERP鐗╂枡涓棿琛�ERPItemTable 鑾峰彇(鏍规嵁鐗╂枡缂栫爜)
+                        CMMLog.Info($"WMSIn-{startBit}:鏌ヨ鏉′欢锛歵rayCode={ItemCode},璇诲嚭 MachineInfo 琛ㄦ暟鎹负锛歿JsonConvert.SerializeObject(info)}");
+                        if (info != null)
+                        {
+                            var erpItemTableInfo = MongoDBSingleton.Instance.FindOne<ERPItemTable>(Query.EQ("item_code", info.materialCode), "ERPItemTable");
+                            CMMLog.Info($"WMSIn-{startBit}:鏌ヨ鏉′欢锛歩tem_code={info.materialCode},璇诲嚭 ERPItemTable 琛ㄦ暟鎹负锛歿JsonConvert.SerializeObject(erpItemTableInfo)}");
+                            model.locationGear = info.secondNg.ToString();
+                            model.trayCode = info.trayCode;
+                            string product = !string.IsNullOrEmpty(info.productType) ? info.productType : erpItemTableInfo.item_spec;
+                            model.data.Add(new ItemData()
+                            {
+                                itemCode = product,
+                                lotNo = info.lotNo,
+                                machineNo = info.machineNo,
+                                packageCode = info.packageCode,
+                                palletLayers = info.palletLayers,
+                                foldingbag = info.overlappingLayers,
+                                itemState = info.secondNg,
+                                productWeight = info.productWeight,
+                                trayCodeWeight = info.trayCodeWeight,
+                                oneTrayWeight = info.oneTrayWeight,
+                                //bagNo = info.bagNo,
+                                //productType = info.productType,
+                                //materialCode = info.materialCode,
+                                //location = info.location,
+                                //addWeight = info.addWeight,
+                                //packNg = info.packNg,
+                                //addState = info.addState,
+
+                                Jm_Item_Code = info.materialCode,
+                                Jm_Item_Name = erpItemTableInfo.item_name,
+                                Jm_Item_Model = erpItemTableInfo.item_spec,
+                                Jm_Item_Unit = erpItemTableInfo.item_uom,
+                                Jm_Item_Staff = info.trayCodeWeight
+                            });
+                        }
+                    }
+                }
+                string msgData = JsonConvert.SerializeObject(model);
+                string reqStr = "鐗╂枡鍚�" + ItemCode + ";鏁伴噺";
+                string feedback = "";
+
+                CMMLog.Info($"WMSIn-{startBit}:銆愯皟鐢╳ms鑾峰彇鍏ュ簱璐т綅銆�鍙戦�鏁版嵁锛歿JsonConvert.SerializeObject(msgData)}锛岀墿鏂欐潯浠讹細ItemCode锛歿ItemCode},trayCode锛歿trayCode}");
+                var url = hao.WebUrl + "GlmInSendTask";
+                try {
+                    //hao.WebUrl = "http://192.168.1.199:9001/api/";
+                    feedback = helper.WebPost(url, msgData).Replace(@"\", "").Trim();
+                    Console.WriteLine(feedback);
+                    CMMLog.Info($"WMSIn-{startBit}:銆愯皟鐢╳ms鑾峰彇鍏ュ簱璐т綅銆�鎺ユ敹鏁版嵁锛� + feedback);
+                    if (!string.IsNullOrEmpty(feedback)) {
+                        //var wmsResponse = JsonConvert.DeserializeObject<WMSResponseModel>(feedback.Substring(1, feedback.Length - 2));
+                        var wmsResponse = JsonConvert.DeserializeObject<WMSResponseModel>(feedback);
+                        //var res = feedback.Replace("{", "").Replace("}", "").Replace(":", "=").Replace(",", ";").Replace('"', ' ');
+                        if (wmsResponse.Success == true) {
+                            msg = $"WMSIn-{startBit}:銆愯皟鐢╳ms鑾峰彇鍏ュ簱璐т綅銆戞垚鍔燂紒杩斿洖缁撴灉=" + wmsResponse.Success + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                        }
+                        else {
+                            string errMsg = wmsResponse.Code + "-" + wmsResponse.Msg;
+                            msg = $"WMSIn-{startBit}:銆愯皟鐢╳ms鑾峰彇鍏ュ簱璐т綅銆戝け璐ワ紒閿欒鍘熷洜=" + errMsg + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                        }
+                        result = wmsResponse.Success;
+                    }
+                    else {
+                        string errMsg = "鍙傛暟鍙嶉绌哄�";
+                        msg = $"WMSIn-{startBit}:銆愯皟鐢╳ms鑾峰彇鍏ュ簱璐т綅銆戝け璐ワ紒閿欒鍘熷洜=" + errMsg + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                    }
+                }
+                catch (Exception e) {
+                    CMMLog.Error(string.Format($"WMSIn-{startBit}:銆愯皟鐢╳ms鑾峰彇鍏ュ簱璐т綅澶辫触銆戝紓甯竰0}", e.Message), e);
+                    msg = $"WMSIn-{startBit}:銆愯皟鐢╳ms鑾峰彇鍏ュ簱璐т綅銆戝け璐ワ紒瑙f瀽杩斿洖鍊煎嚭閿�" + feedback + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                }
+            }
+            else msg = string.Format($"WMSIn-{startBit}:璋冪敤wms澶辫触锛宎ms宸ヤ綔涓績娌℃湁璁剧疆锛�);
+            CMMLog.Info(msg);
+            Console.WriteLine(msg);
+            return result;
+        }
+
+        public static bool WMSOut(string endBit, string ItemCode) {
+            //endBit = endBit.Substring(0, 9);
+            bool result = false;
+            HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS);
+            string msg = "";
+            if (hao != null) {
+                //http://192.168.1.199:9001/api/wmsapi/InWorkArea
+                WMSOutModel model = new WMSOutModel();
+                model.endBit = endBit;
+                model.projectCode = "glm";
+                model.needCreateAMSTask = "Y";
+                //model.Data = new List<ItemData>();
+                //if (!string.IsNullOrEmpty(ItemCode))
+                //{
+                //    model.Data.Add(new ItemData()
+                //    {
+                //        itemCode = ItemCode
+                //    });
+                //}
+                string msgData = JsonConvert.SerializeObject(model);
+                string reqStr = "鐗╂枡鍚�" + ItemCode + ";";
+                string feedback = "";
+
+                var url = hao.WebUrl + "GlmOutSendAmsTask";
+                try {
+                    //hao.WebUrl = "http://192.168.1.199:9001/api/";
+                    feedback = helper.WebPost(url, msgData).Replace(@"\", "").Trim();
+                    CMMLog.Info($"WMSOut-{endBit}:WMS鍑哄簱鎺ュ彛鍥炴姤鏁版嵁锛歿feedback}");
+                    if (!string.IsNullOrEmpty(feedback)) 
+                    {
+                        //var wmsResponse = JsonConvert.DeserializeObject<WMSResponseModel>(feedback.Substring(1, feedback.Length - 2));
+                        var wmsResponse = JsonConvert.DeserializeObject<WMSResponseModel>(feedback);
+                        CMMLog.Info($"WMSOut-{endBit}:{wmsResponse.Success}");
+                        if (wmsResponse.Success == true) msg = $"WMSOut-{endBit}:銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅銆戞垚鍔燂紒杩斿洖缁撴灉=" + wmsResponse.Success + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                        else msg = $"WMSOut-{endBit}:銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅銆戝け璐ワ紒閿欒鍘熷洜=" + wmsResponse.Code + "-" + wmsResponse.Msg + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                        result = wmsResponse.Success;
+                    }
+                    else msg = $"WMSOut-{endBit}:銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅銆戝け璐ワ紒閿欒鍘熷洜=鍙傛暟鍙嶉绌哄�;璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                }
+                catch (Exception e) {
+                    CMMLog.Error(string.Format($"WMSOut-{endBit}:銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅澶辫触銆戝紓甯竰0}", e.Message), e);
+                    msg = $"WMSOut-{endBit}:銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅銆戝け璐ワ紒瑙f瀽杩斿洖鍊煎嚭閿�" + feedback + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                }
+            }
+            else msg = string.Format($"WMSOut-{endBit}:璋冪敤wms澶辫触锛宎ms宸ヤ綔涓績娌℃湁璁剧疆锛�);
+            CMMLog.Info(msg);
+            Console.WriteLine(msg);
+            return result;
+        }
+
+        public static bool WMSEmptyOut(string endBit, string ItemCode,ref string taskNo, ref string trayCode,string trayType = "")
+        {
+            bool result = false;
+            HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS);
+            string msg = "";
+            if (hao != null)
+            {
+                //http://192.168.1.199:9001/api/wmsapi/InWorkArea
+                WMSEmptyOutModel model = new WMSEmptyOutModel();
+                model.endBit = endBit;
+                model.projectCode = "glm";
+                model.needCreateAMSTask = "Y";
+                model.trayType = trayType;
+                //model.trayType = trayType;
+                string msgData = JsonConvert.SerializeObject(model);
+                string reqStr = "鐗╂枡鍚�" + ItemCode + ";";
+                string feedback = "";
+
+                var url = hao.WebUrl + "TrayOutCallTask";
+                try
+                {
+                    //hao.WebUrl = "http://192.168.1.199:9001/api/";
+                    feedback = helper.WebPost(url, msgData).Replace(@"\", "").Trim();
+                    CMMLog.Info($"WMS鍥炴姤鏁版嵁:{feedback}");
+                    if (!string.IsNullOrEmpty(feedback))
+                    {
+                        //var wmsResponse = JsonConvert.DeserializeObject<WMSResponseModel>(feedback.Substring(1, feedback.Length - 2));
+                        var wmsResponse = JsonConvert.DeserializeObject<WMSResponseModel>(feedback);
+
+                        CMMLog.Info($"{wmsResponse.Success}");
+                        if (wmsResponse.Success == true)
+                        {
+                            //var ok = wmsResponse.Data[0];
+                            //taskNo = ok.taskNo;
+                            //trayCode = ok.trayCode;
+                            msg = "銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅銆戞垚鍔燂紒杩斿洖缁撴灉=" + wmsResponse.Success + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                        }
+                        else
+                        {
+                            string errMsg = wmsResponse.Code + "-" + wmsResponse.Msg;
+                            msg = "銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅銆戝け璐ワ紒閿欒鍘熷洜=" + errMsg + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                        }
+                        result = wmsResponse.Success;
+                    }
+                    else
+                    {
+                        string errMsg = "鍙傛暟鍙嶉绌哄�";
+                        msg = "銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅銆戝け璐ワ紒閿欒鍘熷洜=" + errMsg + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                    }
+                }
+                catch (Exception e)
+                {
+                    CMMLog.Error(string.Format("銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅澶辫触銆戝紓甯竰0}", e.Message), e);
+                    msg = "銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅銆戝け璐ワ紒瑙f瀽杩斿洖鍊煎嚭閿�" + feedback + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                }
+            }
+            else msg = string.Format("璋冪敤wms澶辫触锛宎ms宸ヤ綔涓績娌℃湁璁剧疆锛�);
+            CMMLog.Info(msg);
+            Console.WriteLine(msg);
+            return result;
+        }
+
+
+        /// <summary>
+        /// 鏀归亾鎺ュ彛
+        /// </summary>
+        /// <param name="taskNo">WMS浠诲姟鍙�/param>
+        /// <param name="changeArea">鏀归亾搴撳尯</param>
+        /// <returns></returns>
+        internal static string WmsUpdateWay(string taskNo, string changeArea)
+        {
+            string result = "";
+            string param = JsonConvert.SerializeObject(new
+            {
+                taskNo = taskNo,
+                updateType = "缁堢偣",
+                changeArea = changeArea
+            });
+            var req = WmsWebPost(param, "UpdateWay");
+            if (req != null && req.success) result = req.location;
+            return result;
+        }
+
+        /// <summary>
+        /// WebPost
+        /// </summary>
+        /// <param name="param">鍙戦�鍐呭</param>
+        /// <param name="postName">鎺ュ彛鍚嶇О</param>
+        /// <param name="Par1">鎵╁睍鍙傛暟</param>
+        /// <returns></returns>
+        private static WmsResModel WmsWebPost(string param, string postName, string Par1 = "")
+        {
+            string msg = ""; string feedback = "";
+            WmsResModel response = new WmsResModel();
+            response.success = false;
+            try
+            {
+                HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS);
+                if (hao != null)
+                {
+                    string webAPIUrl = hao.WebUrl + postName;
+                    feedback = new WebApiHelper().WebPost(webAPIUrl, param);
+                    if (!string.IsNullOrEmpty(feedback))
+                    {
+                        msg = $"銆怶MS Post {postName}銆慦ebUrl={webAPIUrl} ;param={param} ;return={feedback}";
+                        response = JsonConvert.DeserializeObject<WmsResModel>(feedback.Substring(1, feedback.Length - 2).Replace(@"\", ""));
+                        //response = JsonConvert.DeserializeObject<WmsResModel>(feedback);
+
+                        if (response.success == true) msg = $"銆怶MS Post {postName}銆憇uccess锛�WebUrl={ webAPIUrl};param={param} ;return={feedback}";
+                        else msg = $"銆怶MS Post {postName}銆慺ail锛乄ebUrl={ webAPIUrl} ;param={param} ;return={feedback}";
+                    }
+                    else
+                    {
+                        string errMsg = "can't find the address";
+                        msg = $"銆怶MS Post {postName}銆慺ail锛乪rr={errMsg};WebUrl={ webAPIUrl} ;param={param}";
+                    }
+                }
+                else msg = $"璋冪敤wms澶辫触锛宎ms宸ヤ綔涓績娌℃湁璁剧疆锛�;
+                CMMLog.Info(msg);
+            }
+            catch (Exception ex)
+            {
+                CMMLog.Info($"銆怶MS Post {postName}銆慺ail锛乪rr={ex.Message}");
+            }
+            return response;
+        }
+
+        internal static bool WMSEmptyUnbind(string extend)
+        {
+            bool result = false;
+            string feedback = "";
+            HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS);
+            string msg = "";
+            if (hao != null)
+            {
+                //http://192.168.1.199:9001/api/wmsapi/UnbindLocation
+                WMSEmptyUnbindModel model = new WMSEmptyUnbindModel();
+                model.locationCode = extend;
+                string msgData = JsonConvert.SerializeObject(model);
+
+                var url = hao.WebUrl + "UnbindLocation";
+                try
+                {
+                    //hao.WebUrl = "http://192.168.1.199:9001/api/";
+                    feedback = helper.WebGet(url + "?locationCode=" + extend).Replace(@"\", "").Trim();
+                    CMMLog.Info($"璋冪敤瑙g粦鎺ュ彛WMS鍥炴姤鏁版嵁:{feedback}");
+                    if (!string.IsNullOrEmpty(feedback))
+                    {
+                        //var wmsResponse = JsonConvert.DeserializeObject<WMSResponseModel>(feedback.Substring(1, feedback.Length - 2));
+
+                        var wmsResponse = JsonConvert.DeserializeObject<WMSResponseModel1>(feedback);
+
+                        CMMLog.Info($"{wmsResponse.Success}");
+                        if (wmsResponse.Success == true)
+                        {
+                            //var ok = wmsResponse.Data[0];
+                            msg = "銆愯皟鐢╳ms瑙g粦绌烘墭缂撳瓨浣嶃�鎴愬姛锛佽繑鍥炵粨鏋�" + wmsResponse.Success + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                        }
+                        else
+                        {
+                            string errMsg = wmsResponse.Msg;
+                            msg = "銆愯皟鐢╳ms瑙g粦绌烘墭缂撳瓨浣嶃�澶辫触锛侀敊璇師鍥�" + errMsg + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                        }
+                        result = wmsResponse.Success;
+                    }
+                    else
+                    {
+                        string errMsg = "鍙傛暟鍙嶉绌哄�";
+                        msg = "銆愯皟鐢╳ms瑙g粦绌烘墭缂撳瓨浣嶃�澶辫触锛侀敊璇師鍥�" + errMsg + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                    }
+                }
+                catch (Exception e)
+                {
+                    CMMLog.Error(string.Format("銆愯皟鐢╳ms鑾峰彇鍑哄簱璐т綅澶辫触銆戝紓甯竰0}", e.Message), e);
+                    msg = "銆愯皟鐢╳ms瑙g粦绌烘墭缂撳瓨浣嶃�澶辫触锛佽В鏋愯繑鍥炲�鍑洪敊=" + feedback + ";璋冪敤WebUrl=" + url + ";杈撳叆鍙傛暟=" + msgData;
+                }
+            }
+            else msg = string.Format("璋冪敤wms澶辫触锛宎ms宸ヤ綔涓績娌℃湁璁剧疆锛�);
+            CMMLog.Info(msg);
+            //Console.WriteLine(msg);
+            return result;
+        }
+
+        public class WMSEmptyUnbindModel
+        {
+            //public string taskNo { get; set; }
+            //public string endStock { get; set; }
+            //public string endArea { get; set; }
+            public string locationCode { get; set; }
+        }
+
+        public class WMSResponseModel1
+        {
+            //"{\"Success\":false,\"ErrCode\":null,\"ErrMsg\":\"\",\"OkList\":[],\"FailList\":[{\"Index\":0,\"ErrCode\":null,\"ErrMsg\":\"鏈壘鍒癮aa浣嶇疆鐨勬墍灞炰粨搴揬"}],\"Tasks\":[]}"
+            // "{\"Success\":true,\"ErrCode\":null,\"ErrMsg\":null,\"OkList\":[{\"Index\":0,\"TaskNo\":\"RKT00032\",\"StartStock\":\"XMZ001\",\"StartArea\":\"XMZ001005\",\"StartBit\":\"XMZ001Q71-1\",\"EndStock\":\"XMZ001\",\"EndArea\":\"XMZ001001\",\"EndBit\":\"XMZ001B61-2\",\"Priority\":0}],\"FailList\":[],\"Tasks\":[]}"
+            public int Status { get; set; }
+            //public string Code { get; set; }
+            public string Msg { get; set; }
+            public List<TaskInfo> Data { get; set; }
+            public int AffectedRows { get; set; }
+
+            public bool Success { get; set; }
+            //public List<TaskInfo> failList { get; set; }
+            //public List<TaskInfo> tasks { get; set; }
+            //{"taskNo":"浠诲姟鍙�,"startStock":"璧峰浠撳簱","startArea":"璧峰搴撳尯","startBit":"璧峰璐т綅","endStock":"鐩殑浠撳簱","endArea":"鐩殑搴撳尯","endBit":"鐩殑璐т綅"}
+            public class TaskInfo
+            {
+                public string taskNo { get; set; }
+                public string startStock { get; set; }
+                public string startArea { get; set; }
+                public string startBit { get; set; }
+                public string endStock { get; set; }
+                public string endArea { get; set; }
+                public string endBit { get; set; }
+                #region   璁惧閫氶亾淇℃伅
+
+                /// <summary>
+                /// 璁惧閫氶亾鏁版嵁3鈥斺�鎵樼洏鐮�         
+                /// </summary>
+                public string trayCode { get; set; }
+
+                #endregion
+            }
+        }
+
+        public class WmsResModel
+        {
+            public bool success { get; set; }
+            public string errCode { get; set; }
+            public string location { get; set; }
+
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/WebApiHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/WebApiHelper.cs
new file mode 100644
index 0000000..2c8cb81
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/WebApiHelper.cs
@@ -0,0 +1,94 @@
+锘縰sing Hanhe.iWCS.Common;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class WebApiHelper
+    {
+        public string WebPost(string url, string postData,string token = "",string isCookie = "", string cotentType = "application/json") {
+            //Console.WriteLine(url);
+            //CMMLog.Info($"url:{url}");
+            WebRequest request = WebRequest.Create(url);
+            request.Method = "POST";
+            //string postData = JsonConvert.SerializeObject(data); 
+            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
+            request.ContentType = cotentType;
+            request.ContentLength = byteArray.Length;
+
+            if (!string.IsNullOrEmpty(token)) request.Headers.Set("Cookie", token);//MD5鍔犲瘑鍚嶵oken鍊�+
+            CMMLog.Debug($"WebPost:URL锛歿url},SendData:{postData}");
+            //request.Timeout = 5000;
+            request.Timeout = 30000;
+
+            try
+            {
+                Stream dataStream = request.GetRequestStream();
+                dataStream.Write(byteArray, 0, byteArray.Length);
+                dataStream.Close();
+                WebResponse response = request.GetResponse();
+                // "kdservice-sessionid=3ec0afdd-3cc2-4573-ae35-62f1751f6b0e; path=/,ASP.NET_SessionId=eokqkml3mdy0gmfroig5cpr3; path=/; HttpOnly"
+                if (!string.IsNullOrEmpty(isCookie))
+                {
+                    ERPService.CooKie = response.Headers.Get("Set-Cookie").Replace("HttpOnly","");
+                    Console.WriteLine($"WebPost:URL锛歿url},GetCookie锛歿ERPService.CooKie}");
+                    CMMLog.Debug($"WebPost:URL锛歿url},GetCookie锛歿ERPService.CooKie}");
+                }
+                //CMMLog.Info($"{((HttpWebResponse)response).StatusDescription}");
+                //Console.WriteLine(((HttpWebResponse)response).StatusDescription);
+
+                dataStream = response.GetResponseStream();
+                StreamReader reader = new StreamReader(dataStream, Encoding.UTF8);
+                string responseFromServer = reader.ReadToEnd();
+                reader.Close();
+                dataStream.Close();
+                response.Close();
+                CMMLog.Debug($"WebPost:ResData is {responseFromServer}");
+                return responseFromServer;
+            }
+            catch (Exception e) {
+                CMMLog.Error($"WebPost:璋冪敤鎺ュ彛寮傚父锛歎RL锛歿url},SendData:{postData},ErrorMsg: {e.Message}");
+                return "";
+            }
+        }
+
+        public string WebGet(string url) {
+            //using (var client = new HttpClient()) {
+            //	//璇锋眰缁撴灉
+            //	string result = client.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
+
+            //	Console.WriteLine(result);
+            //	return result;
+
+            //}
+            //Console.WriteLine(url);
+            WebRequest request = WebRequest.Create(url);
+            request.Method = "GET";
+            //CMMLog.Info("url:"+url+"method:"+request.Method);
+            try {
+                WebResponse response = request.GetResponse();
+                Stream dataStream = response.GetResponseStream();
+                StreamReader reader = new StreamReader(dataStream);
+                string responseFromServer = reader.ReadToEnd();
+
+                reader.Close();
+                dataStream.Close();
+                response.Close();
+                Console.WriteLine(responseFromServer);
+                CMMLog.Info($"get res:{responseFromServer}");
+                return responseFromServer;
+            }
+            catch (Exception e) {
+                CMMLog.Error(e.Message, e);
+                return "";
+            }
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/XmlHelper.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/XmlHelper.cs
new file mode 100644
index 0000000..07c2660
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/XmlHelper.cs
@@ -0,0 +1,39 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoProtocol
+{
+    public class XmlHelper
+    {
+        public static string xmlPath = "";
+        public static string xmlFileName = "settings.xml";
+        public static XmlDocument xmldoc = new XmlDocument();
+        static XmlHelper()
+        {
+            xmlPath = System.IO.Directory.GetCurrentDirectory();
+            xmlPath += "/" + xmlFileName;
+            xmldoc.Load(xmlPath);
+        }
+
+		public static string GetElementValue(string name) {
+			string result = string.Empty;
+			XmlNode xn = xmldoc.SelectSingleNode("Custom");
+			XmlNodeList xnl = xn.ChildNodes;
+			foreach (object node in xnl) {
+				XmlElement xe = node as XmlElement;
+				if (xe == null)
+					continue;
+
+				if (xe.Name == name) {
+					result = xe.InnerText;
+					break;
+				}
+			}
+			return result;
+		}
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/app.config b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/app.config
new file mode 100644
index 0000000..bacb56b
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/app.config
@@ -0,0 +1,28 @@
+锘�?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="SuperSocket.SocketBase" publicKeyToken="6c80000676988ebb" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-1.6.7.0" newVersion="1.6.7.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.7.9.0" newVersion="6.7.9.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+<system.data>
+    <DbProviderFactories>
+      <remove invariant="MySql.Data.MySqlClient" />
+      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.7.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
+    </DbProviderFactories>
+  </system.data></configuration>
\ No newline at end of file
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/packages.config b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/packages.config
new file mode 100644
index 0000000..01f4945
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/packages.config
@@ -0,0 +1,11 @@
+锘�?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.7" targetFramework="net451" />
+  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.7" targetFramework="net451" />
+  <package id="Microsoft.Owin" version="4.1.1" targetFramework="net451" />
+  <package id="Microsoft.Owin.Hosting" version="4.1.1" targetFramework="net451" />
+  <package id="MySql.Data" version="6.7.9" targetFramework="net451" />
+  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net451" />
+  <package id="Owin" version="1.0" targetFramework="net451" />
+  <package id="SqlSugar" version="5.0.1.7" targetFramework="net451" />
+</packages>
\ No newline at end of file
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/readme.txt b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/readme.txt
new file mode 100644
index 0000000..fc3ff77
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/readme.txt
@@ -0,0 +1,7 @@
+锘块」鐩鏄�+涓��鍖呰鏈轰笅绾垮埌澶嶇О骞冲彴锛岀О閲嶇‘璁ゅ悗杞埌绾胯竟搴擄紝闇�璋僿ms鍏ュ簱銆傚悓鏃跺皢绌烘墭杩愬洖鍖呰绾裤�
+9鏉¤緭閫佺嚎涓嬬嚎銆�涓嚎绋嬪幓璇诲彇杈撻�绾跨姸鎬侊紝鑾峰彇涓嬬嚎淇″彿鐢熸垚浠诲姟銆傝鍐�+
+
+
+浜屻�
\ No newline at end of file
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/settings.xml b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/settings.xml
new file mode 100644
index 0000000..08f33c7
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/settings.xml
@@ -0,0 +1,278 @@
+锘�?xml version="1.0" encoding="utf-8" ?>
+<Custom>
+
+	<SqlServer>Data Source=192.168.1.146;Initial Catalog=OIMobox2;User ID=sa;Password=test?123;</SqlServer>
+	
+	<!--鏃堕棿鎴虫帴鍙�->
+	<timecuo>http://10.1.141.236:5000</timecuo>
+	<SendERPTaskType>闇�鍥炴姤ERP鐨勪换鍔$被鍨嬶紝澶氫釜浣跨敤鑻辨枃閫楀彿闅斿紑</SendERPTaskType>
+	<!--ERP鐧诲綍鎺ュ彛浼犺緭淇℃伅锛屽涓娇鐢ㄨ嫳鏂囬�鍙烽殧寮�紝绀轰緥鏁版嵁 -->
+	<LoginInfo>64c226e170a9a0,鏉滄枃姝�123456,2052</LoginInfo>
+	
+	<!--MES鎺ュ彛鍦板潃-->
+	<mesurl>http://10.1.141.236:2222/api/WmsApi/GlmTonBagFillInfo</mesurl>
+	<!--鏄惁鍚敤Mes鎺ュ彛鑾峰彇鏁版嵁		0 榛樿寮�惎	1 涓嶉�杩嘙ES鑾峰彇鏁版嵁-->
+	<mesOpen>0</mesOpen>
+	<!--221118鎵撳寘鏈轰笅绾挎祦绋嬪彉鏇�	0 浣跨敤鍘熸湁娴佺▼	1 浣跨敤鍙樻洿娴佺▼-->
+	<packChange>0</packChange>
+	<!--鍙犵洏鏈哄啓鍏ユ暟鎹�0锛氬師鍏堟ā寮忥紝涓嶅啓鍏ョ墿鏂欑紪鐮�1锛氭爣鍑嗘枃妗e崗璁紝鍐欏叆鐗╂枡缂栫爜-->
+	<cacheStackWrite>0</cacheStackWrite>
+	<!--MODBUS鍦板潃-->
+	<OITcpServerUrl>http://192.168.1.199:5102</OITcpServerUrl>
+	<!--涓�ゼ绛夊緟鐐�->
+	<Wait01>CK001-3F-FC01</Wait01>
+	<!--浜屾ゼ绛夊緟鐐�->
+	<Wait02>CK001-3F-FC01</Wait02>
+	<!--AGV瀹氭椂鍏呯數鏃堕棿锛堟牸寮忥細鏃�鍒�绉掞級 澶滈棿鍗佷簩鐐规椂闂存牸寮忥細00:00:00	鐧藉ぉ鍗佷簩鐐瑰墠鏍煎紡锛�1:00:00-->
+	<BatteryTime>00:44:00</BatteryTime>
+	<!--鍏呯數妗�->
+	<!--鍙傛暟璇存槑锛歛gvNo:杞﹀彿	agvType:杞﹀瀷	charginGroup:鍏呯數妗╁垎缁�	charginIP:鍏呯數妗㊣P		agvBit:agv绔欑偣鍙�enable:鏄惁鍚敤-->
+	<ChargingPile>
+		<![CDATA[
+		[
+			{"agvNo":"1","agvType":"鍫嗗灈","charginGroup":"1","charginIP":"10.15.73.13","agvBit":"378","enable":"1"},
+			{"agvNo":"4","agvType":"鍓嶇Щ","charginGroup":"2","charginIP":"10.15.73.14","agvBit":"379","enable":"1"},
+			{"agvNo":"5","agvType":"鍓嶇Щ","charginGroup":"3","charginIP":"10.15.73.14","agvBit":"379","enable":"1"},
+			{"agvNo":"6","agvType":"鍓嶇Щ","charginGroup":"4","charginIP":"10.15.73.14","agvBit":"379","enable":"1"}
+		]]]>
+	</ChargingPile>
+	<!--鐢甸噺杞﹀彿-->
+	<ChargingAgvNo>
+		<![CDATA[
+        [
+          "6","7","2","3"
+        ]]]>
+	</ChargingAgvNo>
+	<!--
+		plc閰嶇疆淇℃伅锛宔nable=1鍚敤锛屾墦鍖呯嚎澶氫釜璁惧鍏辩敤涓�釜ip閫氳							鍙橀噺淇℃伅锛�	  device		璁惧鍙�+		deviceType:1	3妤�鍖呰鏈�																	  deviceType	璁惧绫诲瀷
+		deviceType:2	3妤�鎵撳寘绾�澶嶇О骞冲彴																  ip			璁惧鍦板潃
+		deviceType:3	3妤�鎵撳寘绾�婊℃墭鍏ワ紙鍙犲寘鏈猴級														  readAddr		璇诲彇璁惧鍐呬俊鎭殑鍦板潃
+		deviceType:4	3妤�鎵撳寘绾�婊℃墭鍑猴紙涓嬬嚎锛�													  writeAddr     鍐欏叆璁惧鍐呬俊鎭殑鍦板潃
+		deviceType:5	3妤�鎵撳寘绾�绌烘墭鍑猴紙澶嶇О骞冲彴涓嬫柟锛�											  location      璁惧缂栧彿
+		deviceType:6	3妤�鎵撳寘绾�鎷嗙洏鏈猴紙琛ョ┖鎵樼洏锛�												  enable        璁惧褰撳墠鏄惁宸茬粡鍚敤
+		deviceType:7	1妤�鍙犳墭(鐢垫涓嬫斁)								鈥斺�鈥斺�寮冪敤					  port			MODBUS璇诲彇绔彛鍙�
+		deviceType:8	1鍙疯揣姊�涓夋ゼ													鏂板鍙傛暟锛�+																										  Extend		
+																										  鍖呰鏈虹敤浜庯細瀵瑰簲 鍦板爢缂撳瓨浣嶏紝鍏朵粬璁惧鏃犲彲浠ヤ负绌�+																										  鍙犲寘鏈虹敤浜庯細WMS 鏀归亾鎺ュ彛 浼犺緭鐨�鏀归亾搴撳尯缂栫爜
+																										  FyReadAddr	缈婚〉閫氶亾璇诲彇璧峰鍊�鍖呰鏈鸿澶囬厤缃�
+																										  FyWriteAddr	缈婚〉閫氶亾鍐欏叆璧峰鍊�鍖呰鏈鸿澶囬厤缃�
+		鍚庣画鍔犲叆
+		deviceType:9	1妤�鎷嗙洏鏈�鎷嗙洏琛ョ┖)							鈥斺�鈥斺�寮冪敤
+		deviceType:10	1妤�鍙犳墭锛堢數姊笅鏀锯�鈥旀棤闇�彔鎵橈級				鈥斺�鈥斺�寮冪敤
+								锛堜綔搴燂紝涓嶉渶瑕侊紝鍙犳墭鐐逛负涓�釜浣嶇疆锛�+								浠呬粎鏄嚭浜庢槸鍚﹀彔搴曟墭鏃禔GV绔欑偣涓嶄竴鏍凤紝
+								璇ラ厤缃」宸查厤缃湪sendBit閲岄潰锛�+		deviceType:11	2鍙疯揣姊�涓夋ゼ
+		deviceType:12	1鍙疯揣姊�涓�ゼ
+		deviceType:13	2鍙疯揣姊�涓�ゼ
+		
+		deviceType:14	鍐欏叆5鍙峰寘瑁呮満鐩稿叧淇℃伅  221115鏂板閰嶇疆鍐呭		鈥斺�鈥斺�寮冪敤
+		
+		浜屾湡鏂板璁惧
+		deviceType:15	3妤�鍙犵洏鏈�婊℃墭涓嬬嚎鍏ュ簱
+		
+		
+		鍥涢挻杞﹂棿
+		plc閰嶇疆淇℃伅锛宔nable=1鍚敤锛屾墦鍖呯嚎澶氫釜璁惧鍏辩敤涓�釜ip閫氳
+		deviceType:21	3妤�鍖呰鏈�+		deviceType:22	3妤�鎵撳寘绾�澶嶇О骞冲彴
+		deviceType:23	3妤�鎵撳寘绾�婊℃墭鍏ワ紙鍙犲寘鏈猴級
+		deviceType:24	3妤�鎵撳寘绾�鎷嗙洏鏈猴紙琛ョ┖鎵樼洏锛�+		deviceType:25	3妤�鍙犵洏鏈�婊℃墭涓嬬嚎鍏ュ簱
+		deviceType:26	3妤�鎵撳寘绾�婊℃墭鍑猴紙涓嬬嚎锛�+	-->
+	<plcInfo>
+		<![CDATA[
+        [
+         {"device":"1","deviceType":"1",ip:"192.168.1.199","port":502,"readAddr":0,"writeAddr":50,"location":"T1","Extend":"","FyReadAddr":601,"FyWriteAddr":1,"enable":1},
+		 {"device":"2","deviceType":"1",ip:"192.168.1.101","port":502,"readAddr":0,"writeAddr":50,"location":"T2","Extend":"","enable":0},
+		 {"device":"3","deviceType":"1",ip:"192.168.1.102","port":502,"readAddr":0,"writeAddr":100,"location":"T3","Extend":"","enable":0},
+		 {"device":"4","deviceType":"1",ip:"192.168.1.103","port":502,"readAddr":0,"writeAddr":100,"location":"T4","Extend":"","enable":0},
+		 {"device":"5","deviceType":"1",ip:"192.168.1.104","port":502,"readAddr":0,"writeAddr":100,"location":"T5","Extend":"","enable":0},
+		 {"device":"6","deviceType":"1",ip:"192.168.1.105","port":502,"readAddr":0,"writeAddr":100,"location":"T6","Extend":"","enable":0},
+		 {"device":"7","deviceType":"1",ip:"192.168.1.106","port":502,"readAddr":0,"writeAddr":100,"location":"T7","Extend":"","enable":0},
+		 {"device":"8","deviceType":"1",ip:"192.168.1.107","port":502,"readAddr":0,"writeAddr":100,"location":"T8","Extend":"","enable":0},
+		 {"device":"9","deviceType":"1",ip:"192.168.1.108","port":502,"readAddr":0,"writeAddr":100,"location":"T9","Extend":"","enable":0},
+		 {"device":"24","deviceType":"1",ip:"192.168.1.108","port":502,"readAddr":0,"writeAddr":100,"location":"T9","Extend":"","enable":0},
+         
+		 {"device":"10","deviceType":"2",ip:"192.168.1.127","port":502,"readAddr":0,"writeAddr":50,"location":"CK001-3F-FC01","Extend":"","enable":0},
+		 {"device":"11","deviceType":"3",ip:"192.168.1.127","port":502,"readAddr":200,"writeAddr":300,"location":"CK001-3F-DT01","Extend":"","enable":0},
+		 {"device":"12","deviceType":"4",ip:"192.168.1.127","port":502,"readAddr":400,"writeAddr":500,"location":"CK001-3F-DBXX01","Extend":"","enable":1},
+		 {"device":"13","deviceType":"5",ip:"192.168.1.127","port":502,"readAddr":600,"writeAddr":620,"location":"CK001-3F-KT01","Extend":"","enable":0},
+		 {"device":"14","deviceType":"6",ip:"192.168.1.127","port":502,"readAddr":640,"writeAddr":660,"location":"CK001-3F-KTRK01","Extend":"","enable":0},
+		 {"device":"15","deviceType":"7",ip:"192.168.1.127","port":502,"readAddr":680,"writeAddr":700,"location":"CK001-1F-DT01","Extend":"","enable":1},
+		 {"device":"18","deviceType":"10",ip:"192.168.1.110","port":502,"readAddr":0,"writeAddr":100,"location":"AAA","Extend":"","enable":0},
+		 
+		 {"device":"16","deviceType":"8",ip:"192.168.1.110","port":502,"readAddr":0,"writeAddr":100,"location":"CK001-3F-LIFT01","Extend":"","enable":1},
+		 {"device":"19","deviceType":"11",ip:"192.168.1.110","port":502,"readAddr":0,"writeAddr":100,"location":"CK001-1F-LIFT01","Extend":"","enable":0},
+		 {"device":"20","deviceType":"12",ip:"192.168.1.110","port":502,"readAddr":0,"writeAddr":100,"location":"AAA","Extend":"","enable":1},
+		 
+		 {"device":"17","deviceType":"9",ip:"192.168.1.109","port":0,"readAddr":680,"writeAddr":700,"location":"AAA","Extend":"","enable":0},
+		 
+		 {"device":"21","deviceType":"13",ip:"192.168.1.110","port":502,"readAddr":0,"writeAddr":100,"location":"AAA","Extend":"","enable":0},
+		 {"device":"22","deviceType":"14",ip:"192.168.1.104","port":5000,"readAddr":1,"writeAddr":1,"location":"AAA","Extend":"","enable":0},
+		 {"device":"23","deviceType":"15",ip:"192.168.1.104","port":5000,"readAddr":1,"writeAddr":1,"location":"AAA","Extend":"","enable":0},
+		 {"device":"24","deviceType":"15",ip:"192.168.1.104","port":5000,"readAddr":1,"writeAddr":1,"location":"AAA","Extend":"","enable":0},
+		 {"device":"25","deviceType":"15",ip:"192.168.1.104","port":5000,"readAddr":1,"writeAddr":1,"location":"AAA","Extend":"","enable":0},
+		 {"device":"26","deviceType":"15",ip:"192.168.1.104","port":5000,"readAddr":1,"writeAddr":1,"location":"AAA","Extend":"","enable":0}
+	
+		 
+        ]]]>
+	</plcInfo>
+
+	<!--
+		plc璐т綅缂栫爜锛�												鍙傛暟鍚箟锛�
+		鍘熷厛																task:闇�鎷︽埅鐨勪换鍔″簭鍙凤紙鏍囪鎺掑簭浣滅敤锛�+		taskType:1	绌烘墭鍑哄簱				鈥斺�鈥斺�璋冪敤鎺ュ彛涓嬪彂锛堝純鐢級	taskType:AMS浠诲姟绫诲瀷     
+		taskType:2	鎴愬搧鍑哄簱				鈥斺�鈥斺�璋冪敤鎺ュ彛涓嬪彂			location:WMS浠诲姟绫诲瀷		姣斿锛�F_BJCPKT		娉細璇籩xt1鐨勫�
+		taskType:3	绌烘墭绾胯竟1				鈥斺�鈥斺�鏈煡锛堜笉鍋氬鐞嗭級				
+		taskType:4	绌烘墭绾胯竟2				鈥斺�鈥斺�鏈煡锛堜笉鍋氬鐞嗭級	
+		
+		鍚庣画娣诲姞
+		taskType:5	3妤肩紦瀛樻灦鍏ュ彔鎵�					  
+		taskType:6	3妤兼媶鐩樿ˉ绌�						  
+		taskType:7	1妤兼媶鐩樿ˉ绌�			鈥斺�鈥斺�寮冪敤
+		
+		taskType:8  3妤煎绉板叆缂撳瓨鏋�+		taskType:9  婊℃墭杞繍				鈥斺�鈥斺�鐢盬MS鍒涘缓浠诲姟鐢ㄤ簬鎷︽埅鐢熸垚鐢垫浠诲姟(鍘熷厛涓�涓夋ゼ鎵撳寘涓嬬嚎鍙�鑷�涓�ゼ鍙犳墭鍙o紝鐜板湪鐩存帴 浠�涓夋ゼ婊℃墭搴撳尯 閫佸線 涓�ゼ缁堢偣搴撳尯鍗冲彲)
+		
+		浜屾娣诲姞
+		taskType:10 3妤煎绉板叆缂撳瓨鏋禢G
+		
+		鏁欑О娴佺▼
+		taskType:11 3妤肩牆鐮佸叆澶嶇ОNG			鈥斺�鈥斺�寮冪敤
+		taskType:12 3妤煎绉板叆鍖呰鏈篘G		鈥斺�鈥斺�寮冪敤
+		taskType:13 3妤煎寘瑁呮満鍏ュ绉癗G		鈥斺�鈥斺�寮冪敤
+		taskType:14 3妤煎绉板叆鐮濈爜NG			鈥斺�鈥斺�寮冪敤
+		
+		鏁欑О鍚庡鐞嗘祦绋�+		taskType:15 3妤肩紦瀛樻灦鍏ュ彔鎵楴G
+		taskType:16 3妤肩紦瀛樻灦鍏ュ寘瑁呮満NG		鈥斺�鈥斺�寮冪敤
+		
+		浜屾湡鏇存敼涓庢柊澧炴祦绋�闇�澧炲姞鐨勬柊閰嶇疆椤�
+		taskType:17 3妤煎寘瑁呰ˉ绌�			鈥斺�鈥斺�浜屾湡锛氱敱 AMS 鑷缓浠诲姟鏀逛负 鐢�WMS 鍒涘缓涓嬪彂锛屽洜姝ら渶瑕侀厤缃浠诲姟鏁版嵁
+		taskType:18 3妤煎彔鐩樹笅绾�			鈥斺�鈥斺�浜屾湡锛氫笁妤煎彔鐩樻満绌烘墭鐩樻弧鎵樹笅绾垮叆搴�+		taskType:19 3妤兼墦鍖呬笅绾�			鈥斺�鈥斺�浜屾湡锛氫笁妤兼墦鍖呬笅绾垮彛婊℃墭鐩樻弧鎵樹笅绾垮叆搴�+		
+		AMS鑷缓浠诲姟绫诲瀷
+		NG缂撳瓨涓�							鈥斺�鈥斺�寮冪敤
+		NG缂撳瓨浜屾							鈥斺�鈥斺�寮冪敤
+		鐢垫鍙栬揣
+		鐢垫鍗歌揣
+		3妤煎寘瑁呭彇鏂�+	-->
+	<huoWeiCode>
+		<![CDATA[
+        [
+         {"task":"1","taskType":"绌烘墭鍑哄簱","location":"3F_BJCPKT"},
+		 {"task":"2","taskType":"鎴愬搧鍑哄簱","location":"1F_HJ_CKHC"},
+		 {"task":"3","taskType":"绌烘墭绾胯竟1","location":"PDA01"},
+		 {"task":"4","taskType":"绌烘墭绾胯竟2","location":"PDA02"},
+		 
+		 {"task":"5","taskType":"3妤肩紦瀛樻灦鍏ュ彔鎵�,"location":"3F_HC_DB"},
+		 {"task":"6","taskType":"3妤兼媶鐩樿ˉ绌�,"location":"3F_BJ_BZRK"},
+		 {"task":"7","taskType":"1妤兼媶鐩樿ˉ绌�,"location":"1F_DTKT_CPJ"},
+		 
+		 {"task":"8","taskType":"3妤煎绉板叆缂撳瓨鏋�,"location":"3F_FC_HC"},
+		 {"task":"9","taskType":"婊℃墭杞繍","location":"1F_DT_HJ"},
+		 
+		 {"task":"10","taskType":"3妤煎绉板叆缂撳瓨鏋禢G","location":"NG_HJ"},
+		 
+		 {"task":"11","taskType":"3妤肩牆鐮佸叆澶嶇ОNG","location":"NG_FM_FC"},
+		 {"task":"12","taskType":"3妤煎绉板叆鍖呰鏈篘G","location":"NG_FC_BZJ"},
+		 {"task":"13","taskType":"3妤煎寘瑁呮満鍏ュ绉癗G","location":"NG_BZJ_FC"},
+		 {"task":"14","taskType":"3妤煎绉板叆鐮濈爜NG","location":"NG_FC_FM"},
+		 
+		 {"task":"15","taskType":"3妤肩紦瀛樻灦鍏ュ彔鎵楴G","location":"3F_NG_DB"},
+		 
+		 {"task":"16","taskType":"3妤肩紦瀛樻灦鍏ュ寘瑁呮満NG","location":"3F_NG_DB"},
+		 
+		 {"task":"17","taskType":"3妤煎寘瑁呰ˉ绌�,"location":"3F_NG_DB"},
+		 
+		 {"task":"18","taskType":"3妤煎彔鐩樹笅绾�,"location":"3F_NG_DB"},
+		 
+        ]]]>
+	</huoWeiCode>
+
+	<!--
+		鐗规畩鐐逛綅浠诲姟鎺ㄩ�澶勭悊锛�                             鍙傛暟鍚箟锛�瀵瑰簲<MongoTN_AB_STOCK_LOCATION>琛�+		task:1	3妤煎绉板叆缂撳瓨鏋�								task:鐗规畩浠诲姟搴忓彿锛堟爣璁版帓搴忎綔鐢級
+		task:2	鐗规畩浠诲姟绫诲瀷2锛堜繚鐣欑被鍨嬶紝渚夸簬鍚庢湡娣诲姞锛�		taskType:鍏锋湁鐗规畩鐐圭殑浠诲姟绫诲瀷(鐢盇MS鑷畾涔�
+																bit:褰撳墠鐗规畩浠诲姟绫诲瀷鐨勪换鍔$偣浣嶏紙瀵瑰簲涓昏〃 CN_S_START_BIT 鎴栬�涓昏〃 CN_S_END_BIT 锛�+																agv:褰撳墠鐗规畩鐐逛綅瀵瑰簲鐨刟gv鍙凤紙瀵瑰簲鏍囬琛�CN_N_AGV_LOCATION 锛�+																锛堝凡浣滃簾锛塮loor:褰撳墠鐗规畩浠诲姟绫诲瀷鐨勭壒娈婄偣浣嶅眰鏁帮紙瀵瑰簲鏍囬琛�CN_S_FLOOR 锛�+																floor:褰撳墠鐗规畩浠诲姟绫诲瀷鐨勭壒娈婄偣浣嶅眰鏁帮紙鐩存帴鍘籑ongo閲岄潰鏌ヨ锛岀洰鍓嶅叆搴撶殑缁堢偣灞傛暟鍧囨槸鐩存帴璇籑ongo锛屽皬杞︽槸鍚屼竴杈�锛�+																		鏈夊叧floor澶囨敞锛氫竴妤煎眰鏁伴兘鏄�锛岃�涓嶆槸灏唂loor璧嬪�缁橣Row
+																
+																
+																
+		鐗规畩鎯呭喌澶囨敞锛�+			taskType涓烘弧鎵樿浆杩愮殑鏃跺�锛岃捣鐐瑰簲涓轰竴妤煎彔鐩樻満锛岀粓鐐圭敱WMS鎸囧畾锛屼换鍔$敱WMS涓嬪彂
+	-->
+	<sendBit>
+		<![CDATA[
+        [
+         {"task":"1","taskType":"3妤煎绉板叆缂撳瓨鏋�,"bit":"CK001-3F-FC01","agv":999,"floor":"1"},
+		 
+		 {"task":"2","taskType":"婊℃墭杞繍","bit":"CK001-1F-DT01","agv":2,"floor":"2"},
+		 {"task":"2","taskType":"婊℃墭杞繍","bit":"CK001-1F-DT01","agv":1,"floor":"1"}
+        ]]]>
+	</sendBit>
+
+	<!--鍙傛暟璇存槑锛�+		AgvNo:杞﹀彿
+	-->
+	<AGVState>
+		<![CDATA[
+        [
+		 {"AgvNo":"1","ip":"10.50.65.30","port":502,"readAddr":0,"writeAddr":0,"enable":0},
+		 {"AgvNo":"1","ip":"10.50.65.30","port":502,"readAddr":0,"writeAddr":7,"enable":0}
+        ]]]>
+	</AGVState>
+
+
+	<!--
+		绗笁鏂规帴鍙RL閰嶇疆椤�+		鍙傛暟璇存槑锛�+		UrlNo锛歎RL鏍囪瘑(鍞竴锛屽紑鍙戞寚瀹氾紝涓嶅厑璁镐慨鏀�
+		UrlSign锛歎RL涓枃鍚箟
+		Url锛歎RL璋冪敤鍦板潃
+		Enable锛氭槸鍚﹀惎鐢�+	-->
+	<ThirdUrl>
+		<![CDATA[
+        [
+		 {"UrlNo":"1","UrlSign":"ERP鐧诲綍鎺ュ彛","Url":"http://113.105.66.24:89/k3cloud/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc","Enable":1},
+		 {"UrlNo":"2","UrlSign":"ERP鏉$爜涓绘。鎺ュ彛","Url":"http://113.105.66.24:89/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc","Enable":1},
+		 {"UrlNo":"3","UrlSign":"ERP鎵瑰彿鎺ュ彛","Url":"http://113.105.66.24:89/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc","Enable":1}
+        ]]]>
+	</ThirdUrl>
+
+	<!--鍙傛暟璇存槑锛�+		machineLoc:鍖呰鏈鸿揣浣�+		ddLoc:鍦板爢缂撳瓨鐐�+		quantity:鏁伴噺
+	-->
+	<AGVLocation>
+		<![CDATA[
+        [
+		 {"machineLoc":"loc1,loc2","ddLoc",["loc1","loc2"],"Enabel":1},
+		 {"machineLoc":"loc1,loc2","ddLoc",["loc1","loc2"],"Enabel":1}
+        ]]]>
+	</AGVLocation>
+
+	<!--鍙傛暟璇存槑锛�+		ddLoc:鍦板爢缂撳瓨鐐�+		Site:agv绔欑偣 浠庡乏鍒板彸涓�鏄竴灞傚埌鍏眰鐨勭珯鐐�+		trayType:鎵樼洏绫诲瀷 1锛氬窛瀛楁墭 2锛氱敯瀛楁墭
+	-->
+	<DDSite>
+		<![CDATA[
+        [
+		 {"ddLoc":"loc1","Site":[1,2,3],quantity:6,trayType:1,"Enable":1}
+        ]]]>
+	</DDSite>
+	
+</Custom>
diff --git "a/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/\345\244\207\346\263\250.txt" "b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/\345\244\207\346\263\250.txt"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/ams/Hanhe.iWCS.TaizhouGEMTwoProtocol/\345\244\207\346\263\250.txt"
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/.vs/Hanhe.iWCS.TaizhouGEMTwoTCP.csproj.dtbcache.json b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/.vs/Hanhe.iWCS.TaizhouGEMTwoTCP.csproj.dtbcache.json
new file mode 100644
index 0000000..360fa84
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/.vs/Hanhe.iWCS.TaizhouGEMTwoTCP.csproj.dtbcache.json
@@ -0,0 +1 @@
+{"RootPath":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\娉板窞鏍兼灄缇庝簩鏈焅\Hanhe.iWCS.TaizhouGEMTwoTCP","ProjectFileName":"Hanhe.iWCS.TaizhouGEMTwoTCP.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"SessionInstance.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"WCSServer.cs"},{"SourceFile":"WCSSession.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.5.1.AssemblyAttributes.cs"}],"References":[{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\Hanhe.iWCS.Business\\bin\\Debug\\Hanhe.iWCS.Business.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\Hanhe.iWCS.Business\\bin\\Debug\\Hanhe.iWCS.Business.dll"},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.Common.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.DeviceDriver.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.Factroy.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.Interface.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\Hanhe.iWCS.Model.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\Microsoft.CSharp\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.NET\\Framework\\v4.0.30319\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\SuperSocket1.6.7\\SuperSocket.Common.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\SuperSocket1.6.7\\SuperSocket.Facility.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\SuperSocket1.6.7\\SuperSocket.SocketBase.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\姹夊拰鏅鸿兘浜屾寮�彂鍖匼\SuperSocket1.6.7\\SuperSocket.SocketEngine.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Core\\v4.0_4.0.0.0__b77a5c561934e089\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Data.DataSetExtensions\\v4.0_4.0.0.0__b77a5c561934e089\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_64\\System.Data\\v4.0_4.0.0.0__b77a5c561934e089\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System\\v4.0_4.0.0.0__b77a5c561934e089\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Net.Http\\v4.0_4.0.0.0__b03f5f7f11d50a3a\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Xml\\v4.0_4.0.0.0__b77a5c561934e089\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\WINDOWS\\Microsoft.Net\\assembly\\GAC_MSIL\\System.Xml.Linq\\v4.0_4.0.0.0__b77a5c561934e089\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"C:\\software\\A-宸ヤ綔\\婧愮爜\\WCS\\Hanhe.iWCS.3.3\\娉板窞鏍兼灄缇庝簩鏈焅\Hanhe.iWCS.TaizhouGEMTwoTCP\\bin\\Debug\\Hanhe.iWCS.TaizhouGEMTwoTCP.dll","OutputItemRelativePath":"Hanhe.iWCS.TaizhouGEMTwoTCP.dll"},{"OutputItemFullPath":"","OutputItemRelativePath":""}],"CopyToOutputEntries":[]}
\ No newline at end of file
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/Hanhe.iWCS.TaizhouGEMTwoTCP.csproj b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/Hanhe.iWCS.TaizhouGEMTwoTCP.csproj
new file mode 100644
index 0000000..464b477
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/Hanhe.iWCS.TaizhouGEMTwoTCP.csproj
@@ -0,0 +1,83 @@
+锘�?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{4F1FB9D4-758C-4C66-9CA9-6D3EC3DED6C7}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Hanhe.iWCS.TaizhouGEMTwoTCP</RootNamespace>
+    <AssemblyName>Hanhe.iWCS.TaizhouGEMTwoTCP</AssemblyName>
+    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Hanhe.iWCS.Common">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.DeviceDriver">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.DeviceDriver.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.Factroy">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.Factroy.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.Interface">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.Interface.dll</HintPath>
+    </Reference>
+    <Reference Include="Hanhe.iWCS.Model">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼Hanhe.iWCS.Model.dll</HintPath>
+    </Reference>
+    <Reference Include="SuperSocket.Common">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼SuperSocket1.6.7\SuperSocket.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="SuperSocket.Facility">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼SuperSocket1.6.7\SuperSocket.Facility.dll</HintPath>
+    </Reference>
+    <Reference Include="SuperSocket.SocketBase">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼SuperSocket1.6.7\SuperSocket.SocketBase.dll</HintPath>
+    </Reference>
+    <Reference Include="SuperSocket.SocketEngine">
+      <HintPath>..\..\姹夊拰鏅鸿兘浜屾寮�彂鍖匼SuperSocket1.6.7\SuperSocket.SocketEngine.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="SessionInstance.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="WCSServer.cs" />
+    <Compile Include="WCSSession.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Hanhe.iWCS.Business\Hanhe.iWCS.Business.csproj">
+      <Project>{733b341a-eddb-44e0-8749-6764aee699ed}</Project>
+      <Name>Hanhe.iWCS.Business</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/Properties/AssemblyInfo.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..5996fb8
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑涓�埇淇℃伅鐢变互涓�+// 鎺у埗銆傛洿鏀硅繖浜涚壒鎬у�鍙慨鏀�+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭�
+[assembly: AssemblyTitle("Hanhe.iWCS.TaizhouGEMTwoTCP")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Hanhe.iWCS.TaizhouGEMTwoTCP")]
+[assembly: AssemblyCopyright("Copyright 漏  2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏�ComVisible 璁剧疆涓�false 浼氫娇姝ょ▼搴忛泦涓殑绫诲瀷
+//瀵�COM 缁勪欢涓嶅彲瑙併�濡傛灉闇�浠�COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷
+//璇峰皢姝ょ被鍨嬬殑 ComVisible 鐗规�璁剧疆涓�true銆�+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("681eb23c-6036-4e37-8acf-46b37c17f7af")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅鍒楀洓涓�缁勬垚: 
+//
+//      涓荤増鏈�+//      娆$増鏈�+//      鐢熸垚鍙�+//      淇鍙�+//
+//鍙互鎸囧畾鎵�湁杩欎簺鍊硷紝涔熷彲浠ヤ娇鐢ㄢ�鐢熸垚鍙封�鍜屸�淇鍙封�鐨勯粯璁ゅ�
+//閫氳繃浣跨敤 "*"锛屽涓嬫墍绀�
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/SessionInstance.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/SessionInstance.cs
new file mode 100644
index 0000000..67a3c72
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/SessionInstance.cs
@@ -0,0 +1,195 @@
+锘縰sing Hanhe.iWCS.Factroy;
+using Hanhe.iWCS.Interface;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoTCP
+{
+    public class SessionInstance
+    {
+        private static readonly SessionInstance instance = new SessionInstance();
+
+        public List<WCSSession> WCSSessionList = new List<WCSSession>();
+
+        /// <summary>
+        /// 璁惧鎺堟潈鏁伴噺
+        /// </summary>
+        private const int DeviceAuthNumber = 100;
+
+        /// <summary>
+        /// 璁惧鍗忚鎺ュ彛瀹炰緥鍖�+        /// </summary>
+        public IProtocolAnalysis _IProtocolAnalysis;
+
+
+        /// <summary>
+        /// 鑾峰彇鍗曞疄渚�+        /// </summary>
+        public static SessionInstance Instance {
+            get {
+                return instance;
+            }
+        }
+
+        /// <summary>
+        /// 鏋勯�鍑芥暟
+        /// </summary>
+        public SessionInstance() {
+
+        }
+
+        /// <summary>
+        /// 鍒濆鍖�+        /// </summary>
+        public void Initialize() {
+            _IProtocolAnalysis = DataAccess.CreateProtocolAnalysis();
+        }
+
+        /// <summary>
+        /// 澧炲姞浼氳瘽鍒板唴瀛橀槦鍒�+        /// </summary>
+        /// <param name="session"></param>
+        public void AddSession(WCSSession session) {
+            if (!WCSSessionList.Exists(p => p.SessionID == session.SessionID)) {
+                WCSSessionList.RemoveAll(a => a.RemoteEndPoint.Address == session.RemoteEndPoint.Address);
+                var _wcsSession = WCSSessionList.Where(p => p.RemoteEndPoint.Address == session.RemoteEndPoint.Address);
+                foreach (var sessionIns in _wcsSession) {
+
+                    WCSSessionList.Remove(sessionIns);
+                }
+                if (WCSSessionList.Count <= DeviceAuthNumber) {
+                    WCSSessionList.Add(session);
+                }
+            }
+        }
+        private void PrintSession() {
+            WCSSessionList.ForEach(a => Console.WriteLine($"{a.RemoteEndPoint.Address}:{a.RemoteEndPoint.Port}"));
+        }
+        /// <summary>
+        /// 缁欐寚瀹氬鎴风鍙戦�娑堟伅(鍙尮閰岻P鍦板潃)
+        /// </summary>
+        /// <param name="ip"></param>
+        /// <param name="port"></param>
+        /// <param name="msg"></param>
+        /// <returns></returns>
+        public bool PLCSend(string ip, int port, string msg) {
+            bool iRtn = false;
+            //PrintSession();
+            //瀵瑰綋鍓嶅凡杩炴帴鐨勬墍鏈変細璇濊繘琛屽箍鎾�+            WCSSession wcsSession = WCSSessionList.Find(p => p.RemoteEndPoint.Address.ToString() == ip && p.RemoteEndPoint.Port == port);
+            if (wcsSession != null) {
+                var data = Encoding.UTF8.GetBytes(msg);
+                wcsSession.Send(data, 0, data.Length);
+                //Console.WriteLine($"{ip}:{port} 鍙戦�娑堟伅{msg}");
+                iRtn = true;
+            }
+            else {
+                Console.WriteLine($"{ip}:{port}杩炴帴涓嶅瓨鍦�);
+            }
+            return iRtn;
+        }
+
+        public bool PLCSend(string ip, int port, byte[] data) {
+            bool iRtn = false;
+            //PrintSession();
+            //瀵瑰綋鍓嶅凡杩炴帴鐨勬墍鏈変細璇濊繘琛屽箍鎾�+            
+            WCSSession wcsSession = WCSSessionList.Find(p => p.RemoteEndPoint.Address.ToString() == ip && p.RemoteEndPoint.Port == port);
+            if (wcsSession != null) {
+                wcsSession.Send(data, 0, data.Length);
+                //Console.WriteLine($"{ip}:{port} 鍙戦�娑堟伅{msg}");
+                iRtn = true;
+            }
+            else {
+                Console.WriteLine($"{ip}:{port}杩炴帴涓嶅瓨鍦�);
+            }
+            return iRtn;
+        }
+        /// <summary>
+        /// 缁欐寚瀹氬鎴风鍙戦�娑堟伅(鍖归厤IP鍦板潃)
+        /// </summary>
+        /// <param name="ip">IP鍦板潃</param>
+        /// <param name="msg"></param>
+        /// <returns></returns>
+        public bool PLCSend(string ip, string msg) {
+            bool iRtn = false;
+            //瀵瑰綋鍓嶅凡杩炴帴鐨勬墍鏈変細璇濊繘琛屽箍鎾�+            WCSSession wcsSession = WCSSessionList.Find(p => p.RemoteEndPoint.Address.ToString() == ip);
+            if (wcsSession != null) {
+                //var data = Encoding.Default.GetBytes(msg);
+                var data = Encoding.UTF8.GetBytes(msg);
+                wcsSession.Send(data, 0, data.Length);
+                iRtn = true;
+            }
+            return iRtn;
+        }
+
+        /// <summary>
+        /// 閫氳繃浼氳瘽鍙ユ焺ID鎵惧埌瀹㈡埛绔璞″彂閫佹暟鎹�+        /// </summary>
+        /// <param name="sessionID">浼氳瘽鍙ユ焺ID</param>
+        /// <param name="msg">鍙戦�鏁版嵁</param>
+        /// <returns></returns>
+        public bool PLCSendForSessionID(string sessionID, string msg) {
+            bool iRtn = false;
+            WCSSession wcsSession = WCSSessionList.Find(p => p.SessionID == sessionID);
+            if (wcsSession != null) {
+                Hanhe.iWCS.Common.CMMLog.Info("PLC IP=" + wcsSession.RemoteEndPoint.Address.ToString());
+                var data = Encoding.UTF8.GetBytes(msg);
+                wcsSession.Send(data, 0, data.Length);
+                iRtn = true;
+            }
+            return iRtn;
+        }
+
+
+        /// <summary>
+        /// 鍒犻櫎涓�釜浼氳瘽
+        /// </summary>
+        /// <param name="sessionID">浼氳瘽ID</param>
+        public void SessionRemove(string sessionID) {
+            if (WCSSessionList.Count > 0) {
+                WCSSession wcsSession = WCSSessionList.Find(p => p.SessionID == sessionID);
+                if (wcsSession != null) WCSSessionList.Remove(wcsSession);
+            }
+        }
+
+        /// <summary>
+        /// 绉婚櫎閲嶅鐨勪細璇濓紙鍚屼竴涓澶囩紪鍙峰湪Session閲嶅锛�+        /// </summary>
+        /// <param name="sessionID">浼氳瘽SessionID</param>
+        /// <param name="deviceCode">璁惧缂栧彿</param>
+        public void RemoveRepeatDeviceCodeForSession(string sessionID, string deviceCode) {
+            IEnumerable<WCSSession> wcsSessionList = WCSSessionList.Where(p => p.SessionID != sessionID && p.deviceCode == deviceCode);
+            foreach (var wcsSession in wcsSessionList) {
+                WCSSessionList.Remove(wcsSession);
+            }
+        }
+
+        /// <summary>
+        /// 绉婚櫎浼氳瘽
+        /// </summary>
+        /// <param name="ip">浼氳瘽ip</param>
+        public void RemoveSessionExcludeFromIP(string ip) {
+            IEnumerable<WCSSession> wcsSessionList = WCSSessionList.Where(p => p.RemoteEndPoint.Address.ToString() != ip);
+            foreach (var wcsSession in wcsSessionList) {
+                WCSSessionList.Remove(wcsSession);
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁蹇冭烦浼氳瘽锛屾洿鏂颁細璇濅笌璁惧缂栧彿鐨勫搴斿叧绯�+        /// </summary>
+        /// <param name="sessionID">浼氳瘽ID</param>
+        /// <param name="deviceCode">璁惧缂栧彿</param>
+        public void UpdateDeviceCodeForSessionID(string sessionID, string deviceCode) {
+            WCSSession wcsSession = WCSSessionList.Find(p => p.SessionID == sessionID);
+            if (wcsSession != null) {
+                wcsSession.deviceCode = deviceCode;
+            }
+        }
+    }
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/WCSServer.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/WCSServer.cs
new file mode 100644
index 0000000..85b1739
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/WCSServer.cs
@@ -0,0 +1,125 @@
+锘�+using Hanhe.iWCS.Business;
+using Hanhe.iWCS.DeviceDriver;
+using Hanhe.iWCS.Factroy;
+using Hanhe.iWCS.Interface;
+using Hanhe.iWCS.Model;
+using SuperSocket.SocketBase;
+using SuperSocket.SocketBase.Protocol;
+using System;
+using System.Configuration;
+using System.Linq;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoTCP
+{
+	public class WCSServer : AppServer<WCSSession, BinaryRequestInfo> {
+		/// <summary>
+		/// 鍏煎CommandLine  鍛戒护琛屾柟寮忕殑鍗忚 鍜�绾瓧绗︿覆鐨勫崗璁�閮芥槸浠�$涓虹粨鏉熺
+		/// </summary>
+		public WCSServer()
+			: base(new YourReceiveFilter()) {
+			//: base(new CommandLineReceiveFilterFactory("$$", Encoding.UTF8, new BasicRequestInfoParser(",", "&"))) {
+			//璁惧鍒濆鍖�+			HardwareAccessHelper.Instance.Initialize();
+			HardwareAccessHelper.Instance.ProgramDataInit();
+			HardwareAccessHelper.Instance.ArchivesInit();
+			SessionInstance.Instance.Initialize();
+			Console.WriteLine("amswcs service CopyRight haninfo.cc " + DateTime.Now.Year);
+			StockInstance.Instance.Initialize();
+
+            //娣诲姞寮�惎绾跨▼
+
+            //浠诲姟鎷︽埅
+            IEnentListen agvStateListen = DataAccess.CreateEnentListen();
+            agvStateListen.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 1027 });
+
+            //10001-璇诲彇鍖呰绾夸俊鍙�3妤煎寘瑁呭彇鏂�+            IEnentListen CheckPackingMachine = DataAccess.CreateEnentListen();
+            CheckPackingMachine.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10001 });
+
+            ////10002-璇诲彇澶嶇О骞冲彴淇″彿-澶嶇О鍏ョ紦瀛樻灦
+            //IEnentListen FuChengInCache = DataAccess.CreateEnentListen();
+            //FuChengInCache.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10002 });
+
+            //10003-璇诲彇鍙犲寘鏈轰俊鍙凤紙涓夋ゼ鍙屽眰缂撳瓨鏋跺叆鍙犵洏鏈烘祦绋嬶級-3妤肩紦瀛樻灦鍏ュ彔鎵�+            IEnentListen CacheStackingMouth = DataAccess.CreateEnentListen();
+            CacheStackingMouth.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10003 });
+
+            //10004-璇诲寘瑁呮満淇″彿锛堝寘瑁呮満琛ョ┖鎵樻祦绋嬶級-3妤煎寘瑁呰ˉ绌�+            IEnentListen PickUpBlank = DataAccess.CreateEnentListen();
+            PickUpBlank.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10004 });
+
+            //10005-鎵撳寘绾跨┖鎵樿ˉ鏂欒姹傦紙3妤兼媶鐩樻満琛ョ┖鎵橈級-3妤兼媶鐩樿ˉ绌�+            IEnentListen CheckPackingLineEmpty = DataAccess.CreateEnentListen();
+            CheckPackingLineEmpty.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10005 });
+
+			//10006 - 涓夋ゼ鍙犵洏鏈鸿姹�- 3妤煎彔鐩樹笅绾�- 浜屾湡鏂板浠诲姟娴佺▼
+			IEnentListen CheckLineEmtpy = DataAccess.CreateEnentListen();
+			CheckLineEmtpy.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10006 });
+
+			//10007-鎵撳寘绾夸笅绾�婊℃墭鍏ュ簱
+			IEnentListen CheckPackingLineFull = DataAccess.CreateEnentListen();
+            CheckPackingLineFull.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10007 });
+
+            //鐢垫浠诲姟
+            IEnentListen plcListen = DataAccess.CreateEnentListen();
+            plcListen.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 1000 });
+
+            //MODBUS閫氶亾浠诲姟涓棿琛ㄥ鐞�+            IEnentListen ModBusTask = DataAccess.CreateEnentListen();
+            ModBusTask.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 1001 });
+
+            //鍏呯數浠诲姟
+            IEnentListen BatteryTime = DataAccess.CreateEnentListen();
+			BatteryTime.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 2000 });
+
+			//鍐欑數閲忎换鍔�+			IEnentListen WirteBattery = DataAccess.CreateEnentListen();
+			WirteBattery.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 2001 });
+
+			//浠诲姟鍔ㄤ綔绾跨▼
+			IEnentListen ActionControl = DataAccess.CreateEnentListen();
+			ActionControl.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10010 });
+
+			//鍐欏叆灏忚溅鐘舵�
+			IEnentListen changeSingal = DataAccess.CreateEnentListen();
+			ActionControl.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10012 });
+
+			//鍏ュ簱浠诲姟瀹屾垚鍙戦�ERP鎵瑰彿绛変俊鎭�+			IEnentListen sendErpMsg = DataAccess.CreateEnentListen();
+			sendErpMsg.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10013 });
+
+            //璇诲彇鍖呰绾夸俊鍙�3妤煎寘瑁呭彇鏂�+            IEnentListen CheckPackingMachineTetracobalt = DataAccess.CreateEnentListen();
+            CheckPackingMachineTetracobalt.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10014 });
+
+            //ERP鍙樻洿鍔熻兘 灏嗙墿鏂欒〃鏁版嵁鎻掑叆涓棿琛�+            IEnentListen insertMidTable = DataAccess.CreateEnentListen();
+            insertMidTable.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10015 });
+
+            //鎵撳寘绾夸笅绾�3妤兼墦鍖呬笅绾�-宸插畬鎴�+            IEnentListen CheckPackingLineFullTwo = DataAccess.CreateEnentListen();
+            CheckPackingLineFullTwo.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10016 });
+
+            //缁欑數姊彂閫佸績璺虫寚浠�-宸插畬鎴�+            IEnentListen SendHeartBeat = DataAccess.CreateEnentListen();
+            SendHeartBeat.EnentSubscribe(new TN_I_TASK_DTL_ACTION() { CN_N_ACTION_CODE = 10017 });
+		}
+		public class YourReceiveFilter : IReceiveFilterFactory<BinaryRequestInfo> {
+			public IReceiveFilter<BinaryRequestInfo> CreateFilter(IAppServer appServer, IAppSession appSession, System.Net.IPEndPoint remoteEndPoint) {
+				return new MsgPackReceiveFilter();
+			}
+		}
+		public class MsgPackReceiveFilter : TerminatorReceiveFilter<BinaryRequestInfo> {
+			public MsgPackReceiveFilter()
+				: base(new byte[] { 36, 36 }) {
+			}
+			public override BinaryRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest) {
+				return base.Filter(readBuffer, offset, length, toBeCopied, out rest);
+			}
+			protected override BinaryRequestInfo ProcessMatchedRequest(byte[] data, int offset, int length) {
+				return new BinaryRequestInfo("", data.Skip(offset).Take(length).ToArray());
+			}
+		}
+	}
+}
diff --git a/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/WCSSession.cs b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/WCSSession.cs
new file mode 100644
index 0000000..84e2fa2
--- /dev/null
+++ b/ams/Hanhe.iWCS.TaizhouGEMTwoTCP/WCSSession.cs
@@ -0,0 +1,69 @@
+锘縰sing Hanhe.iWCS.Common;
+using SuperSocket.SocketBase;
+using SuperSocket.SocketBase.Protocol;
+using System;
+using System.Linq;
+using System.Text;
+
+namespace Hanhe.iWCS.TaizhouGEMTwoTCP
+{
+    public class WCSSession : AppSession<WCSSession, BinaryRequestInfo>
+    {
+        /// <summary>
+        /// 璁惧缂栧彿
+        /// </summary>
+        public string deviceCode { get; set; }
+        protected override void OnSessionStarted()
+        {
+            SessionInstance.Instance.AddSession(this.AppServer.GetSessionByID(this.SessionID));
+            string msg = DateTime.Now.ToString() + "-a new Session connectioned,new Client Ip=" + this.RemoteEndPoint.Address + " and Port=" + this.RemoteEndPoint.Port + "";
+            Console.WriteLine(msg);
+        }
+
+        /// <summary>
+        /// PLC淇″彿鎸囦护
+        /// </summary>
+        /// <param name="requestInfo"></param>
+        protected override void HandleUnknownRequest(BinaryRequestInfo requestInfo)
+        {
+            var hex = BitConverter.ToString(requestInfo.Body, 0).Replace("-", string.Empty).ToLower();
+            WCSSession currSession = this.AppServer.GetSessionByID(this.SessionID);
+            var ip = currSession.RemoteEndPoint.Address.ToString();
+            var port = currSession.RemoteEndPoint.Port;
+            //Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "--receive:" + hex + "--length:" + hex.Length);
+            SessionInstance.Instance._IProtocolAnalysis.StringRequestInfo(hex, ip, port, currSession.SessionID);
+            SessionInstance.Instance._IProtocolAnalysis.StringRequestInfo(hexToStr(hex), ip, port);
+
+            var res = requestInfo.Body.ToList();res.Add(36);res.Add(36);
+            SessionInstance.Instance.PLCSend(ip, port, res.ToArray());
+
+        }
+        private static string hexToStr(string hexString)
+        {
+            hexString = hexString.Replace(" ", "");
+            if ((hexString.Length % 2) != 0)
+                hexString += " ";
+            byte[] returnBytes = new byte[hexString.Length / 2];
+            for (int i = 0; i < returnBytes.Length; i++)
+                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
+
+            return Encoding.ASCII.GetString(returnBytes);
+        }
+        protected override void HandleException(Exception e)
+        {
+            this.Send("Application error: {0}", e.Message);
+        }
+
+        protected override void OnSessionClosed(CloseReason reason)
+        {
+            //add you logics which will be executed after the session is closed
+            SessionInstance.Instance.SessionRemove(this.SessionID);
+            base.OnSessionClosed(reason);
+            string msg = DateTime.Now.ToString() + "-a connection Client Ip=" + this.RemoteEndPoint.Address + " and Port=" + this.RemoteEndPoint.Port + " is SocketClosed";
+            Console.WriteLine(msg);
+            CMMLog.Debug(msg);
+            //ProtocolAnalysis.Instance._Logger.DeleteOnline(this.RemoteEndPoint.Address.ToString(), this.RemoteEndPoint.Port);
+
+        }
+    }
+}

--
Gitblit v1.9.1