Эх сурвалжийг харах

Merge branch 'master' of http://49.235.130.76/XXF_1122/DaisyNPILine

KWD 5 сар өмнө
parent
commit
e86a9b901c

+ 152 - 53
TeamAAS-VM/Core/Management.cs

@@ -977,7 +977,7 @@ namespace TeamAAS_VP.Core
                 try
                 {
                     await WriteSystemParameterToPlcAsync(_configService.GetSystemConfiguration());
-                    await WritePositionToPlcAsync();
+                    await WriteParameterToPlcExAsync();
                 }
                 catch (Exception ex)
                 {
@@ -1187,6 +1187,17 @@ namespace TeamAAS_VP.Core
             plc.SubscribeNodes("AutoSensor", monitorNodeIds, PlcCommandTrigger);
         }
 
+        /// <summary>
+        /// 将产品的参数统一写入PLC
+        /// </summary>
+        /// <returns></returns>
+        public async Task WriteParameterToPlcExAsync()
+        {
+            await WritePositionToPlcAsync();// 写入点位信息给PLC
+            //await WriteParameterToPlcAsync();// 写入组装上下限给PLC
+            await WriteProductLoadModeToPLC();//把当前产品型号,写入PLC
+        }
+
         /// <summary>
         /// 写入点位信息给PLC
         /// </summary>
@@ -1267,6 +1278,38 @@ namespace TeamAAS_VP.Core
             }
         }
 
+        /// <summary>
+        /// 将当前产品类型写入PLC
+        /// </summary>
+        /// <param name="mode"></param>
+        public async Task WriteProductLoadModeToPLC(int modeIndex)
+        {
+            var addressConfig = _configService.GetPlcAddresses();
+            var plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
+            if (plc == null || !plc.IsConnected) return;
+
+            await plc.WriteNodeAsync(addressConfig.Out_ProductLoadMode.Address, (Int16)modeIndex);
+        }
+
+        /// <summary>
+        /// 将当前产品类型写入PLC
+        /// </summary>
+        /// <param name="mode"></param>
+        public async Task WriteProductLoadModeToPLC()
+        {
+            var addressConfig = _configService.GetPlcAddresses();
+            var plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
+            if (plc == null || !plc.IsConnected) return;
+
+            var current = _productService.GetCurrentProduct();
+            if (current == null) return;
+
+            var qMes = await _systemDatabaseService.QueryProductFromMesAsync(current.Name);
+            if (qMes == null) return;
+
+            await plc.WriteNodeAsync(addressConfig.Out_ProductLoadMode.Address, (Int16)qMes.ProductLoadMode);
+        }
+
         PointF[] DowmCameraResults = new PointF[10];
         PointF[] UpCameraPutResults = new PointF[10];
 
@@ -1290,6 +1333,9 @@ namespace TeamAAS_VP.Core
         string[] model_num { get; set; } = new string[10];//产品model_num
         string[] wo { get; set; } = new string[10];//产品wo
         string[] color { get; set; } = new string[10];//产品color
+        string[] ppid { get; set; } = new string[10];//产品ppid
+        string[] revision { get; set; } = new string[10];//产品revision
+
         Dictionary<string, string> dataToMes = new Dictionary<string, string>();//上传mes的数据
         List<string> resultToMes = new List<string>();//上传mes的数据
         /// <summary>
@@ -2232,7 +2278,8 @@ namespace TeamAAS_VP.Core
                                             SendTaskMessage($"收到{i}过站检查请求(当站是否生产)...", MessageLevel.Debug);
                                         }
 
-                                        _LastMesCheckTime[i] = DateTime.Now;
+                                        //获取过站时间
+                                        _LastMesCheckTime[i] = (await _mesService.GetServerTimeAsync(i, code, 2)).Now;
                                         LogHelper.WriteLogMes($"【mes开始QUERY】");
                                         SendTaskMessage($"mes开始QUERY", MessageLevel.Info);
                                         dataToMes.Clear();
@@ -2245,12 +2292,13 @@ namespace TeamAAS_VP.Core
                                                 string ProductMainSN_Temp = "";
                                                 LogHelper.WriteLogMes($"询问mes成功");
                                                 SendTaskMessage($"询问mes成功:{response}", MessageLevel.Debug);
-
                                                 string[] item = response.Split('\n');
-                                                if (item[2].Contains("sn="))
+                                                //获取过度件sn
+                                                string snItem = item.FirstOrDefault(f => f.Contains("sn="));
+                                                if (snItem != null)
                                                 {
-                                                    ProductMainSN_Temp = item[2].Replace("sn=", "");
-                                                    SendTaskMessage($"流程sn:{ProductMainSN_Temp}", MessageLevel.Info);
+                                                    ProductMainSN_Temp = snItem.Replace("sn=", "").Trim();
+                                                    SendTaskMessage($"过度件sn:{ProductMainSN_Temp}", MessageLevel.Info);
                                                 }
 
                                                 LogHelper.WriteLogMes($"询问mes成功");
@@ -2264,28 +2312,43 @@ namespace TeamAAS_VP.Core
                                                     SendTaskMessage($"询问mes成功:{response2}", MessageLevel.Debug);
 
                                                     item = response2.Split('\n');
-
-                                                    if (item[1].Contains("color="))
+                                                    snItem = item.FirstOrDefault(f => f.Contains("sn="));
+                                                    if (snItem != null)
                                                     {
-                                                        color[i] = item[1].Replace("color=", "");
-                                                        SendTaskMessage($"产品color:{color[i]}", MessageLevel.Info);
+                                                        ProductMainSN[i] = snItem.Replace("sn=", "").Trim();
+                                                        _productService.CurrentProductCode = ProductMainSN[i];
+                                                        _eventAggregator.GetEvent<DelaySaveImageNotification>().Publish(true);//通知界面延迟保存图片,等待MES查询结果返回,避免图片和数据不同步
+                                                        SendTaskMessage($"产品主sn:{ProductMainSN[i]}", MessageLevel.Info);
                                                     }
-                                                    if (item[3].Contains("model_num="))
+                                                    string woItem = item.FirstOrDefault(f => f.Contains("wo="));
+                                                    if (woItem != null)
                                                     {
-                                                        model_num[i] = item[3].Replace("model_num=", "");
-                                                        SendTaskMessage($"产品model_num:{model_num[i]}", MessageLevel.Info);
+                                                        wo[i] = woItem.Replace("wo=", "").Trim();
+                                                        SendTaskMessage($"工单信息:{wo[i]}", MessageLevel.Info);
                                                     }
-                                                    if (item[4].Contains("sn="))
+                                                    string modelItem = item.FirstOrDefault(f => f.Contains("model_num="));
+                                                    if (modelItem != null)
                                                     {
-                                                        ProductMainSN[i] = item[4].Replace("sn=", "");
-                                                        SendTaskMessage($"产品主sn:{ProductMainSN[i]}", MessageLevel.Info);
-                                                        _productService.CurrentProductCode = ProductMainSN[i];
-                                                        _eventAggregator.GetEvent<DelaySaveImageNotification>().Publish(true);//通知界面延迟保存图片,等待MES查询结果返回,避免图片和数据不同步
+                                                        model_num[i] = modelItem.Replace("model_num=", "").Trim();
+                                                        SendTaskMessage($"model_num:{model_num[i]}", MessageLevel.Info);
+                                                    }
+                                                    string colorItem = item.FirstOrDefault(f => f.Contains("color="));
+                                                    if (colorItem != null)
+                                                    {
+                                                        color[i] = colorItem.Replace("color=", "").Trim();
+                                                        SendTaskMessage($"color:{color[i]}", MessageLevel.Info);
+                                                    }
+                                                    string ppidItem = item.FirstOrDefault(f => f.Contains("ppid="));
+                                                    if (ppidItem != null)
+                                                    {
+                                                        ppid[i] = ppidItem.Replace("ppid=", "").Trim();
+                                                        SendTaskMessage($"ppid:{ppid[i]}", MessageLevel.Info);
                                                     }
-                                                    if (item[5].Contains("wo="))
+                                                    string revisionItem = item.FirstOrDefault(f => f.Contains("revision="));
+                                                    if (revisionItem != null)
                                                     {
-                                                        wo[i] = item[5].Replace("wo=", "");
-                                                        SendTaskMessage($"产品主wo:{wo[i]}", MessageLevel.Info);
+                                                        revision[i] = revisionItem.Replace("revision=", "").Trim();
+                                                        SendTaskMessage($"revision:{revision[i]}", MessageLevel.Info);
                                                     }
 
                                                     LogHelper.WriteLogMes($"第二次询问mes成功");
@@ -2295,13 +2358,13 @@ namespace TeamAAS_VP.Core
                                                     if (i == 0)//i=0时才会切换产品
                                                     {
                                                         var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num[i], color[i]);
-                                                        if (!string.IsNullOrEmpty(q))
+                                                        if (q != null && !string.IsNullOrEmpty(q.ProductName))
                                                         {
                                                             ProductList = new ObservableCollection<ProductModel>(_productService.GetAllProducts());
                                                             Guid productId = Guid.Empty;
                                                             foreach (var itt in ProductList)
                                                             {
-                                                                if (itt.Name == q)
+                                                                if (itt.Name == q.ProductName)
                                                                 {
                                                                     productId = itt.ID;
                                                                     break;
@@ -2310,9 +2373,9 @@ namespace TeamAAS_VP.Core
                                                             if (currentProduct.ID != productId)
                                                             {
                                                                 //切换产品
-                                                                _productService.LoadProduct(productId);
+                                                                await _productService.LoadProductAsync(productId);
                                                                 _productService.SetCurrentProduct(productId);
-                                                                await WritePositionToPlcAsync();
+                                                                await WriteParameterToPlcExAsync();
                                                                 SendTaskMessage($"切换产品成功", MessageLevel.Debug);
                                                             }
                                                         }
@@ -2353,41 +2416,56 @@ namespace TeamAAS_VP.Core
                                                 SendTaskMessage($"询问mes成功:{response}", MessageLevel.Debug);
 
                                                 var item = response.Split('\n');
-
-                                                if (item[1].Contains("color="))
+                                                string snItem = item.FirstOrDefault(f => f.Contains("sn="));
+                                                if (snItem != null)
                                                 {
-                                                    color[i] = item[1].Replace("color=", "");
-                                                    SendTaskMessage($"产品color:{color[i]}", MessageLevel.Info);
+                                                    ProductMainSN[i] = snItem.Replace("sn=", "").Trim();
+                                                    _productService.CurrentProductCode = ProductMainSN[i];
+                                                    _eventAggregator.GetEvent<DelaySaveImageNotification>().Publish(true);//通知界面延迟保存图片,等待MES查询结果返回,避免图片和数据不同步
+                                                    SendTaskMessage($"产品主sn:{ProductMainSN[i]}", MessageLevel.Info);
                                                 }
-                                                if (item[3].Contains("model_num="))
+                                                string woItem = item.FirstOrDefault(f => f.Contains("wo="));
+                                                if (woItem != null)
                                                 {
-                                                    model_num[i] = item[3].Replace("model_num=", "");
-                                                    SendTaskMessage($"产品model_num:{model_num[i]}", MessageLevel.Info);
+                                                    wo[i] = woItem.Replace("wo=", "").Trim();
+                                                    SendTaskMessage($"工单信息:{wo[i]}", MessageLevel.Info);
                                                 }
-                                                if (item[4].Contains("sn="))
+                                                string modelItem = item.FirstOrDefault(f => f.Contains("model_num="));
+                                                if (modelItem != null)
                                                 {
-                                                    ProductMainSN[i] = item[4].Replace("sn=", "");
-                                                    SendTaskMessage($"产品主sn:{ProductMainSN[i]}", MessageLevel.Info);
-                                                    _productService.CurrentProductCode = ProductMainSN[i];
-                                                    _eventAggregator.GetEvent<DelaySaveImageNotification>().Publish(true);//通知界面延迟保存图片,等待MES查询结果返回,避免图片和数据不同步
+                                                    model_num[i] = modelItem.Replace("model_num=", "").Trim();
+                                                    SendTaskMessage($"model_num:{model_num[i]}", MessageLevel.Info);
+                                                }
+                                                string colorItem = item.FirstOrDefault(f => f.Contains("color="));
+                                                if (colorItem != null)
+                                                {
+                                                    color[i] = colorItem.Replace("color=", "").Trim();
+                                                    SendTaskMessage($"color:{color[i]}", MessageLevel.Info);
                                                 }
-                                                if (item[5].Contains("wo="))
+                                                string ppidItem = item.FirstOrDefault(f => f.Contains("ppid="));
+                                                if (ppidItem != null)
                                                 {
-                                                    wo[i] = item[5].Replace("wo=", "");
-                                                    SendTaskMessage($"产品主wo:{wo[i]}", MessageLevel.Info);
+                                                    ppid[i] = ppidItem.Replace("ppid=", "").Trim();
+                                                    SendTaskMessage($"ppid:{ppid[i]}", MessageLevel.Info);
+                                                }
+                                                string revisionItem = item.FirstOrDefault(f => f.Contains("revision="));
+                                                if (revisionItem != null)
+                                                {
+                                                    revision[i] = revisionItem.Replace("revision=", "").Trim();
+                                                    SendTaskMessage($"revision:{revision[i]}", MessageLevel.Info);
                                                 }
 
                                                 //切换产品
                                                 if (i == 0)//i=0时才会切换产品
                                                 {
                                                     var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num[i], color[i]);
-                                                    if (!string.IsNullOrEmpty(q))
+                                                    if (q != null && !string.IsNullOrEmpty(q.ProductName))
                                                     {
                                                         ProductList = new ObservableCollection<ProductModel>(_productService.GetAllProducts());
                                                         Guid productId = Guid.Empty;
                                                         foreach (var itt in ProductList)
                                                         {
-                                                            if (itt.Name == q)
+                                                            if (itt.Name == q.ProductName)
                                                             {
                                                                 productId = itt.ID;
                                                                 break;
@@ -2396,9 +2474,9 @@ namespace TeamAAS_VP.Core
                                                         if (currentProduct.ID != productId)
                                                         {
                                                             //切换产品
-                                                            _productService.LoadProduct(productId);
+                                                            await _productService.LoadProductAsync(productId);
                                                             _productService.SetCurrentProduct(productId);
-                                                            await WritePositionToPlcAsync();
+                                                            await WriteParameterToPlcExAsync();
                                                             SendTaskMessage($"切换产品成功", MessageLevel.Debug);
                                                         }
                                                     }
@@ -2441,7 +2519,7 @@ namespace TeamAAS_VP.Core
                                 {
                                     if (_configService.GetDeviceInfo().EnableMES == true)
                                     {
-                                        DFC.Clear();
+                                        DFC.Clear();//CTQ数据集合
 
                                         //获取当前工位的配置
                                         var stationConfig = _configService.GetDeviceInfo(0);
@@ -2520,9 +2598,13 @@ namespace TeamAAS_VP.Core
                                                             turnRes = true;
                                                         }
                                                         else turnRes = false;
+
+                                                        string midValue = "", saveppid = "";
+                                                        if (stationConfig.SaveCsvPPID) saveppid = ppid[i];
+                                                        midValue = ((lockResult.TargetTorqueLowerLimit + lockResult.TargetTorqueUpperLimit) / 2).ToString("F3");
                                                         DFC.Add(new DataFormCtq
                                                         {
-                                                            PPID = ProductMainSN[i],
+                                                            PPID = saveppid,
                                                             ScrewNum = lockResult.Number,
                                                             PROCESS_NAME = stationConfig.DataInfo.PROCESS_NAME,
                                                             PROCESS_START_TIME = _LastMesCheckTime[i].ToString("yyyy-MM-ddTHH:mm:ss.fffffff") + "+08:00",
@@ -2540,11 +2622,17 @@ namespace TeamAAS_VP.Core
                                                             PROCESS_OUTCOME = torqueRes ? "PASS" : "FAIL",
                                                             PROCESS_MACHINE_ID = stationConfig.DataInfo.PROCESS_MACHINE_ID,
                                                             CTQ_UNIT_OF_MEASURE = "kgf.cm",
-                                                            ERROR_MESSAGE = torqueRes ? "" : "Torque_Spec OOS"
+                                                            ERROR_MESSAGE = torqueRes ? "" : "Torque_Spec OOS",
+                                                            PD_ATTR_01 = midValue,
+                                                            PD_ATTR_02 = ProductMainSN[i],
+                                                            PD_ATTR_03 = "",
+                                                            PD_ATTR_04 = "",
+                                                            PD_ATTR_05 = "",
                                                         });
+                                                        midValue = ((lockResult.TargetTurnsLowerLimit + lockResult.TargetTurnsUpperLimit) / 2).ToString("F3");
                                                         DFC.Add(new DataFormCtq
                                                         {
-                                                            PPID = ProductMainSN[i],
+                                                            PPID = saveppid,
                                                             ScrewNum = lockResult.Number,
                                                             PROCESS_NAME = stationConfig.DataInfo.PROCESS_NAME,
                                                             PROCESS_START_TIME = _LastMesCheckTime[i].ToString("yyyy-MM-ddTHH:mm:ss.fffffff") + "+08:00",
@@ -2562,11 +2650,17 @@ namespace TeamAAS_VP.Core
                                                             PROCESS_OUTCOME = turnRes ? "PASS" : "FAIL",
                                                             PROCESS_MACHINE_ID = stationConfig.DataInfo.PROCESS_MACHINE_ID,
                                                             CTQ_UNIT_OF_MEASURE = "圈",
-                                                            ERROR_MESSAGE = turnRes ? "" : "Turn_Spec OOS"
+                                                            ERROR_MESSAGE = turnRes ? "" : "Turn_Spec OOS",
+                                                            PD_ATTR_01 = midValue,
+                                                            PD_ATTR_02 = ProductMainSN[i],
+                                                            PD_ATTR_03 = "",
+                                                            PD_ATTR_04 = "",
+                                                            PD_ATTR_05 = "",
                                                         });
+                                                        midValue = ((stationConfig.DataInfo.CTQ_LSL_Pressure + stationConfig.DataInfo.CTQ_USL_Pressure) / 2).ToString("F3");
                                                         DFC.Add(new DataFormCtq
                                                         {
-                                                            PPID = ProductMainSN[i],
+                                                            PPID = saveppid,
                                                             ScrewNum = lockResult.Number,
                                                             PROCESS_NAME = stationConfig.DataInfo.PROCESS_NAME,
                                                             PROCESS_START_TIME = _LastMesCheckTime[i].ToString("yyyy-MM-ddTHH:mm:ss.fffffff") + "+08:00",
@@ -2584,7 +2678,12 @@ namespace TeamAAS_VP.Core
                                                             PROCESS_OUTCOME = pressureRes ? "PASS" : "FAIL",
                                                             PROCESS_MACHINE_ID = stationConfig.DataInfo.PROCESS_MACHINE_ID,
                                                             CTQ_UNIT_OF_MEASURE = "N",
-                                                            ERROR_MESSAGE = pressureRes ? "" : "Pressure_Spec OOS"
+                                                            ERROR_MESSAGE = pressureRes ? "" : "Pressure_Spec OOS",
+                                                            PD_ATTR_01 = midValue,
+                                                            PD_ATTR_02 = ProductMainSN[i],
+                                                            PD_ATTR_03 = "",
+                                                            PD_ATTR_04 = "",
+                                                            PD_ATTR_05 = "",
                                                         });
                                                     }
                                                 }
@@ -3280,7 +3379,7 @@ namespace TeamAAS_VP.Core
                 if (!File.Exists(fullPath))
                 {
                     sb.Append("PPID,Screw_Number,PROCESS_NAME,PROCESS_START_TIME,CTQ_NAME,CTQ_VALUE,CTQ_LSL,CTQ_USL,PROCESS_END_TIME,SUPPLIER_NAME,COMMODITY_TYPE,REVISION,WO#,MFG_LOT#," +
-                        "MFG_ASSY_LINE,PROCESS_OUTCOME,PROCESS_MACHINE_ID,CTQ_UNIT_OF_MEASURE,ERROR_MESSAGE");
+                        "MFG_ASSY_LINE,PROCESS_OUTCOME,PROCESS_MACHINE_ID,CTQ_UNIT_OF_MEASURE,ERROR_MESSAGE,PD_ATTR_01,PD_ATTR_02,PD_ATTR_03,PD_ATTR_04,PD_ATTR_05");
                     sb.AppendLine();
                 }
                 if (dfcs == null || dfcs.Count() == 0)
@@ -3289,7 +3388,7 @@ namespace TeamAAS_VP.Core
                 }
                 foreach (var dfc in dfcs)
                 {
-                    sb.Append($"{dfc.PPID},{dfc.ScrewNum},{dfc.PROCESS_NAME},{dfc.PROCESS_START_TIME},{dfc.CTQ_NAME},{dfc.CTQ_VALUE:F3},{dfc.CTQ_LSL:F3},{dfc.CTQ_USL:F3},{dfc.PROCESS_END_TIME},{dfc.SUPPLIER_NAME},{dfc.COMMODITY_TYPE},{dfc.REVISION},{dfc.WO},{dfc.MFG_LOT},{dfc.MFG_ASSY_LINE},{dfc.PROCESS_OUTCOME},{dfc.PROCESS_MACHINE_ID},{dfc.CTQ_UNIT_OF_MEASURE},{dfc.ERROR_MESSAGE}");
+                    sb.Append($"{dfc.PPID},{dfc.ScrewNum},{dfc.PROCESS_NAME},{dfc.PROCESS_START_TIME},{dfc.CTQ_NAME},{dfc.CTQ_VALUE:F3},{dfc.CTQ_LSL:F3},{dfc.CTQ_USL:F3},{dfc.PROCESS_END_TIME},{dfc.SUPPLIER_NAME},{dfc.COMMODITY_TYPE},{dfc.REVISION},{dfc.WO},{dfc.MFG_LOT},{dfc.MFG_ASSY_LINE},{dfc.PROCESS_OUTCOME},{dfc.PROCESS_MACHINE_ID},{dfc.CTQ_UNIT_OF_MEASURE},{dfc.ERROR_MESSAGE},{dfc.PD_ATTR_01},{dfc.PD_ATTR_02},{dfc.PD_ATTR_03},{dfc.PD_ATTR_04},{dfc.PD_ATTR_05}");
                     sb.AppendLine();
                 }
                 // 使用 StreamWriter 以追加模式打开文件

+ 46 - 39
TeamAAS-VM/Data/SystemDatabaseService.cs

@@ -130,7 +130,7 @@ namespace TeamAAS_VP.Data
             {
                 UserId = userId,
                 Success = true,
-                Time = DateTime.Now,
+                Time = DateTime.UtcNow,
                 Message = "Set as current user"
             };
 
@@ -150,7 +150,7 @@ namespace TeamAAS_VP.Data
             {
                 UserId = user.Id,
                 Success = true,
-                Time = DateTime.Now,
+                Time = DateTime.UtcNow,
                 Message = user.UserName
             };
             await RecordUserLoginAsync(rec);
@@ -194,7 +194,7 @@ namespace TeamAAS_VP.Data
         public async Task RecordUserLoginAsync(UserLoginRecord record)
         {
             if (record == null) throw new ArgumentNullException(nameof(record));
-            if (record.Time == default(DateTime)) record.Time = DateTime.Now;
+            if (record.Time == default(DateTime)) record.Time = DateTime.UtcNow;
             await _db.Insertable(record).ExecuteCommandAsync();
         }
 
@@ -401,9 +401,9 @@ namespace TeamAAS_VP.Data
         public async Task<int> GetTodayProductionAsync(string productName)
         {
             //今天的起始时间
-            var todayStart = DateTime.Now.Date;
+            var todayStart = DateTime.UtcNow.Date;
             //今天的结束时间
-            var todayEnd = DateTime.Now.Date;
+            var todayEnd = DateTime.UtcNow.Date;
             todayEnd = todayEnd.AddDays(1);
             //按照产品名称和时间范围查询生产记录的总数
             var total = await _db.Queryable<ProductionRecord>()
@@ -419,8 +419,8 @@ namespace TeamAAS_VP.Data
         /// <returns></returns>
         public async Task<int> GetLastHourProductionAsync(string productName)
         {
-            var lastHourStart = DateTime.Now.AddHours(-1);
-            var lastHourEnd = DateTime.Now;
+            var lastHourStart = DateTime.UtcNow.AddHours(-1);
+            var lastHourEnd = DateTime.UtcNow;
             //按照产品名称和时间范围查询生产记录的总数
             var total = await _db.Queryable<ProductionRecord>()
                 .Where(r => r.ProductName == productName && r.Timestamp >= lastHourStart && r.Timestamp < lastHourEnd)
@@ -436,9 +436,9 @@ namespace TeamAAS_VP.Data
         public async Task<int> GetNGProductionAsync(string productName)
         {
             //今天的起始时间
-            var todayStart = DateTime.Now.Date;
+            var todayStart = DateTime.UtcNow.Date;
             //今天的结束时间
-            var todayEnd = DateTime.Now.Date;
+            var todayEnd = DateTime.UtcNow.Date;
             todayEnd = todayEnd.AddDays(1);
             //按照产品名称和时间范围查询生产记录的总数
             var total = await _db.Queryable<ProductionRecord>()
@@ -455,7 +455,7 @@ namespace TeamAAS_VP.Data
         public Task<int> GetCurrentMonthProductionAsync(string productName)
         {
 
-            var now = DateTime.Now;
+            var now = DateTime.UtcNow;
             var monthStart = new DateTime(now.Year, now.Month, 1);
             var monthEnd = monthStart.AddMonths(1);
             //按照产品名称和时间范围查询生产记录的总数
@@ -472,7 +472,7 @@ namespace TeamAAS_VP.Data
         /// <returns></returns>
         public Task<int> GetCurrentWeekProductionAsync(string productName)
         {
-            var now = DateTime.Now;
+            var now = DateTime.UtcNow;
             var weekStart = FirstDayOfWeek(now);
             var weekEnd = weekStart.AddDays(7);
             //按照产品名称和时间范围查询生产记录的总数
@@ -545,7 +545,7 @@ namespace TeamAAS_VP.Data
         /// <returns></returns>
         public async Task<Dictionary<DateTime, Dictionary<string, int>>> GetMonthlyProductionByDayAndCategoryAsync(string productName)
         {
-            var now = DateTime.Now;
+            var now = DateTime.UtcNow;
             var monthStart = new DateTime(now.Year, now.Month, 1);
             var monthEnd = monthStart.AddMonths(1);
             var list = await _db.Queryable<ProductionRecord>()
@@ -570,7 +570,7 @@ namespace TeamAAS_VP.Data
         /// <returns></returns>
         public async Task<Dictionary<int, Dictionary<string, int>>> GetWeeklyProductionByDayAndCategoryAsync(string productName)
         {
-            var now = DateTime.Now;
+            var now = DateTime.UtcNow;
             var weekStart = FirstDayOfWeek(now);
             var weekEnd = weekStart.AddDays(7);
             var list = await _db.Queryable<ProductionRecord>()
@@ -594,7 +594,7 @@ namespace TeamAAS_VP.Data
         /// <returns></returns>
         public async Task<Dictionary<int, Dictionary<string, int>>> GetDailyProductionByHourAndCategoryAsync(string productName)
         {
-            var now = DateTime.Now;
+            var now = DateTime.UtcNow;
             var dayStart = now.Date;
             var dayEnd = dayStart.AddDays(1);
             var list = await _db.Queryable<ProductionRecord>()
@@ -637,7 +637,7 @@ namespace TeamAAS_VP.Data
         public async Task RecordAlarmAsync(AlarmRecord alarm)
         {
             if (alarm == null) throw new ArgumentNullException(nameof(alarm));
-            if (alarm.Time == default(DateTime)) alarm.Time = DateTime.Now;
+            if (alarm.Time == default(DateTime)) alarm.Time = DateTime.UtcNow;
             await _db.Insertable(alarm).ExecuteCommandAsync();
         }
 
@@ -670,7 +670,7 @@ namespace TeamAAS_VP.Data
             try
             {
                 if (result == null) throw new ArgumentNullException(nameof(result));
-                if (result.Timestamp == default(DateTime)) result.Timestamp = DateTime.Now;
+                if (result.Timestamp == default(DateTime)) result.Timestamp = DateTime.UtcNow;
                 await _db.Insertable(result).ExecuteCommandAsync();
             }
             catch (Exception)
@@ -724,7 +724,7 @@ namespace TeamAAS_VP.Data
         public async Task RecordScrewFeederBatchAsync(ScrewFeederBatchRecord record)
         {
             if (record == null) throw new ArgumentNullException(nameof(record));
-            if (record.ChangeTime == default(DateTime)) record.ChangeTime = DateTime.Now;
+            if (record.ChangeTime == default(DateTime)) record.ChangeTime = DateTime.UtcNow;
             record.Id = record.Id == Guid.Empty ? Guid.NewGuid() : record.Id;
             await _db.Insertable(record).ExecuteCommandAsync();
         }
@@ -798,7 +798,7 @@ namespace TeamAAS_VP.Data
         public async Task RecordPhotoCaptureAsync(PhotoCaptureRecord record)
         {
             if (record == null) throw new ArgumentNullException(nameof(record));
-            if (record.CaptureTime == default(DateTime)) record.CaptureTime = DateTime.Now;
+            if (record.CaptureTime == default(DateTime)) record.CaptureTime = DateTime.UtcNow;
             record.Id = record.Id == Guid.Empty ? Guid.NewGuid() : record.Id;
             await _db.Insertable(record).ExecuteCommandAsync();
         }
@@ -852,7 +852,7 @@ namespace TeamAAS_VP.Data
         public async Task RecordHeadChangeAsync(HeadChangeRecord record)
         {
             if (record == null) throw new ArgumentNullException(nameof(record));
-            if (record.ChangeTime == default(DateTime)) record.ChangeTime = DateTime.Now;
+            if (record.ChangeTime == default(DateTime)) record.ChangeTime = DateTime.UtcNow;
             record.Id = record.Id == Guid.Empty ? Guid.NewGuid() : record.Id;
             await _db.Insertable(record).ExecuteCommandAsync();
         }
@@ -916,7 +916,7 @@ namespace TeamAAS_VP.Data
                 {
                     var newRec = new HeadChangeRecord
                     {
-                        ChangeTime = DateTime.Now,
+                        ChangeTime = DateTime.UtcNow,
                         HeadBatchNumber = string.Empty,
                         CurrentLockCount = 1,
                         OperatorName = operatorName
@@ -949,7 +949,7 @@ namespace TeamAAS_VP.Data
         public async Task RecordNozzleChangeAsync(NozzleChangeRecord record)
         {
             if (record == null) throw new ArgumentNullException(nameof(record));
-            if (record.ChangeTime == default(DateTime)) record.ChangeTime = DateTime.Now;
+            if (record.ChangeTime == default(DateTime)) record.ChangeTime = DateTime.UtcNow;
             record.Id = record.Id == Guid.Empty ? Guid.NewGuid() : record.Id;
             await _db.Insertable(record).ExecuteCommandAsync();
         }
@@ -996,7 +996,7 @@ namespace TeamAAS_VP.Data
                 {
                     var newRec = new NozzleChangeRecord
                     {
-                        ChangeTime = DateTime.Now,
+                        ChangeTime = DateTime.UtcNow,
                         NozzleBatchNumber = string.Empty,
                         CurrentLockCount = 1,
                         OperatorName = operatorName
@@ -1046,7 +1046,7 @@ namespace TeamAAS_VP.Data
             {
                 var record = new NozzleChangeRecord
                 {
-                    ChangeTime = DateTime.Now.AddMinutes(-i * 10),
+                    ChangeTime = DateTime.UtcNow.AddMinutes(-i * 10),
                     NozzleBatchNumber = $"Batch-{i}",
                     CurrentLockCount = i,
                     OperatorName = $"Operator-{i}"
@@ -1059,7 +1059,7 @@ namespace TeamAAS_VP.Data
             {
                 var record = new HeadChangeRecord
                 {
-                    ChangeTime = DateTime.Now.AddMinutes(-i * 15),
+                    ChangeTime = DateTime.UtcNow.AddMinutes(-i * 15),
                     HeadBatchNumber = $"HeadBatch-{i}",
                     CurrentLockCount = i,
                     OperatorName = $"HeadOperator-{i}"
@@ -1072,7 +1072,7 @@ namespace TeamAAS_VP.Data
             {
                 var record = new ScrewFeederBatchRecord
                 {
-                    ChangeTime = DateTime.Now.AddMinutes(-i * 20),
+                    ChangeTime = DateTime.UtcNow.AddMinutes(-i * 20),
                     BatchNumber = $"ScrewBatch-{i}",
                     FeederNumber = i + 1
                 };
@@ -1088,7 +1088,7 @@ namespace TeamAAS_VP.Data
                     ProductName = "产品1",
                     Category = (i % 2 == 0) ? "OK" : "NG",
                     Quantity = 1,
-                    Timestamp = DateTime.Now.AddMinutes(-i * 5),
+                    Timestamp = DateTime.UtcNow.AddMinutes(-i * 5),
                     UserName = "TestUser",
                     Remark = $"TotalSeconds:1.10"
                 };
@@ -1101,7 +1101,7 @@ namespace TeamAAS_VP.Data
                 var result = new LockResult(i % 4, $"PN-{i % 5}", 10.5f, 0.3f, (i % 3 != 0))
                 {
                     ProductName = "产品1",
-                    Timestamp = DateTime.Now.AddMinutes(-i * 3),
+                    Timestamp = DateTime.UtcNow.AddMinutes(-i * 3),
                 };
                 await RecordLockResultAsync(result);
             }
@@ -1118,7 +1118,7 @@ namespace TeamAAS_VP.Data
                         CameraName = $"下相机",
                         ProductSN = $"SN-{i}",
                         IsSuccess = (i % 2 == 0),
-                        CaptureTime = DateTime.Now.AddMinutes(-i * 7),
+                        CaptureTime = DateTime.UtcNow.AddMinutes(-i * 7),
                         ImagePath = $"/images/photo_{i}.jpg"
                     };
                     await RecordPhotoCaptureAsync(record);
@@ -1155,9 +1155,9 @@ namespace TeamAAS_VP.Data
         public async Task<int> GetThrowNumberAsync()
         {
             //今天的起始时间
-            var todayStart = DateTime.Now.Date;
+            var todayStart = DateTime.UtcNow.Date;
             //今天的结束时间
-            var todayEnd = DateTime.Now.Date;
+            var todayEnd = DateTime.UtcNow.Date;
             todayEnd = todayEnd.AddDays(1);
             //按照时间范围查询抛料的总数
             var total = await _db.Queryable<ThrowRecord>()
@@ -1173,9 +1173,9 @@ namespace TeamAAS_VP.Data
         public async Task ResetThrowNumberAsync()
         {
             //今天的起始时间
-            var todayStart = DateTime.Now.Date;
+            var todayStart = DateTime.UtcNow.Date;
             //今天的结束时间
-            var todayEnd = DateTime.Now.Date;
+            var todayEnd = DateTime.UtcNow.Date;
             todayEnd = todayEnd.AddDays(1);
             await _db.Deleteable<ThrowRecord>().Where(r => r.DayTime >= todayStart && r.DayTime < todayEnd).ExecuteCommandAsync();
         }
@@ -1245,18 +1245,25 @@ namespace TeamAAS_VP.Data
         }
 
         /// <summary>
-        /// 通过产品的编码和颜色查询产品的名称
+        /// 通过产品的编码和颜色查询产品
         /// </summary>
         /// <param name="code"></param>
         /// <returns></returns>
-        public async Task<string> QueryProductFromMesAsync(string code, string color)
+        public async Task<ProductWithMes> QueryProductFromMesAsync(string code, string color)
         {
             var v = await _db.Queryable<ProductWithMes>().Where(r => r.ProductCode == code && r.ProductColor == color).FirstAsync();
-            if (v == null || v.ProductName == null)
-            {
-                return "";
-            }
-            return v.ProductName;
+            return v;
+        }
+
+        /// <summary>
+        /// 通过产品名称的查询产品
+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public async Task<ProductWithMes> QueryProductFromMesAsync(string name)
+        {
+            var v = await _db.Queryable<ProductWithMes>().Where(r => r.ProductName == name).FirstAsync();
+            return v;
         }
         #endregion
     }

+ 9 - 2
TeamAAS-VM/Interfaces/ISystemDatabaseService.cs

@@ -554,11 +554,18 @@ namespace TeamAAS_VP.Interfaces
         Task<List<ProductWithMes>> QueryProductWithMesALLAsync();
 
         /// <summary>
-        /// 通过产品的编码和颜色查询产品的id
+        /// 通过产品的编码和颜色查询产品
         /// </summary>
         /// <param name="code"></param>
         /// <returns></returns>
-        Task<string> QueryProductFromMesAsync(string code, string color);
+        Task<ProductWithMes> QueryProductFromMesAsync(string code, string color);
+
+        /// <summary>
+        /// 通过产品名称的查询产品
+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        Task<ProductWithMes> QueryProductFromMesAsync(string name);
         #endregion
     }
 }

+ 30 - 0
TeamAAS-VM/Models/DataFormCtq.cs

@@ -111,6 +111,36 @@ namespace TeamAAS_VP.Models
         /// </summary>
         public string ERROR_MESSAGE { get => _ERROR_MESSAGE; set => SetProperty(ref _ERROR_MESSAGE, value); }
 
+        private string _PD_ATTR_01;
+        /// <summary>
+        /// 附加信息1--中值
+        /// </summary>
+        public string PD_ATTR_01 { get => _PD_ATTR_01; set => SetProperty(ref _PD_ATTR_01, value); }
+
+        private string _PD_ATTR_02;
+        /// <summary>
+        /// 附加信息2--物料SN
+        /// </summary>
+        public string PD_ATTR_02 { get => _PD_ATTR_02; set => SetProperty(ref _PD_ATTR_02, value); }
+
+        private string _PD_ATTR_03;
+        /// <summary>
+        /// 附加信息3--小件SN
+        /// </summary>
+        public string PD_ATTR_03 { get => _PD_ATTR_03; set => SetProperty(ref _PD_ATTR_03, value); }
+
+        private string _PD_ATTR_04;
+        /// <summary>
+        /// 附加信息4
+        /// </summary>
+        public string PD_ATTR_04 { get => _PD_ATTR_04; set => SetProperty(ref _PD_ATTR_04, value); }
+
+        private string _PD_ATTR_05;
+        /// <summary>
+        /// 附加信息5
+        /// </summary>
+        public string PD_ATTR_05 { get => _PD_ATTR_05; set => SetProperty(ref _PD_ATTR_05, value); }
+
     }
 
 }

+ 8 - 0
TeamAAS-VM/Models/DeviceInfo.cs

@@ -89,6 +89,13 @@ namespace TeamAAS_VP.Models
         /// </summary>
         public bool SaveCsv { get => _saveCsv; set => SetProperty(ref _saveCsv, value); }
 
+        private bool _saveCsvPPID;
+        /// <summary>
+        /// 是否保存CSV文件的PPID,默认不保存
+        /// </summary>
+        public bool SaveCsvPPID { get => _saveCsvPPID; set => SetProperty(ref _saveCsvPPID, value); }
+
+
         private string _saveCsvPath;
         /// <summary>
         /// 保存的CSV文件路径
@@ -120,6 +127,7 @@ namespace TeamAAS_VP.Models
             LogUrl = string.Empty;
             ApiKey = string.Empty;
             EnableMES = false;
+            SaveCsvPPID = true;
         }
 
         public DeviceInfo Copy()

+ 18 - 3
TeamAAS-VM/Models/PLC/PlcAddressConfig.cs

@@ -19,14 +19,24 @@ namespace TeamAAS_VP.Models.PLC
             set { SetProperty(ref _PlcNo, value); }
         }
 
-        private PlcAddress _WorkMode = new PlcAddress();
+        private PlcAddress _Out_ProductLoadMode;
+        /// <summary>
+        /// 产品切换类型
+        /// </summary>
+        public PlcAddress Out_ProductLoadMode
+        {
+            get { return _Out_ProductLoadMode; }
+            set { SetProperty(ref _Out_ProductLoadMode, value); }
+        }
+
+        private PlcAddress _Out_WorkMode = new PlcAddress();
         /// <summary>
         /// 工作模式 =1 拍1打1 =2 拍1打所有
         /// </summary>
         public PlcAddress Out_WorkMode
         {
-            get { return _WorkMode; }
-            set { SetProperty(ref _WorkMode, value); }
+            get { return _Out_WorkMode; }
+            set { SetProperty(ref _Out_WorkMode, value); }
         }
 
         private PlcAddress _PickPointNum = new PlcAddress();
@@ -742,6 +752,11 @@ namespace TeamAAS_VP.Models.PLC
             }
 
             // 2. 按 JSON 提供的数据设置默认值(以当前属性名为准)
+            Out_ProductLoadMode = Ensure(Out_ProductLoadMode);
+            Out_ProductLoadMode.Address = "ns=4;s=DB_Communication|FromPC.ProductLoadMode";
+            Out_ProductLoadMode.DataType = "int16";
+            Out_ProductLoadMode.Description = "产品切换类型";
+
             Out_WorkMode = Ensure(Out_WorkMode);
             Out_WorkMode.Address = "ns=4;s=DB_Communication|FromPC.WorkMode";
             Out_WorkMode.DataType = "int16";

+ 12 - 3
TeamAAS-VM/Models/ProductWithMes.cs

@@ -14,7 +14,7 @@ namespace TeamAAS_VP.Models
         //[SugarColumn(IsPrimaryKey = true)]
         //public Guid Id { get; set; } = Guid.NewGuid();
 
-        
+
         private string _ProductName;
         [SugarColumn(IsPrimaryKey = true)]
         /// <summary>
@@ -37,7 +37,7 @@ namespace TeamAAS_VP.Models
             set { SetProperty(ref _ProductCode, value); }
         }
 
-       
+
         private string _ProductColor = "";
         /// <summary>
         /// 产品颜色
@@ -47,6 +47,15 @@ namespace TeamAAS_VP.Models
             get { return _ProductColor; }
             set { SetProperty(ref _ProductColor, value); }
         }
-    }
 
+        private int _ProductLoadMode;
+        /// <summary>
+        /// 产品加载编号
+        /// </summary>
+        public int ProductLoadMode
+        {
+            get { return _ProductLoadMode; }
+            set { SetProperty(ref _ProductLoadMode, value); }
+        }
+    }
 }

+ 2 - 2
TeamAAS-VM/Services/MesService.cs

@@ -106,11 +106,11 @@ namespace TeamAAS_VP.Services
             string url = "";
             if (device.F == "PTL")
             {
-                url = $"{device.MesUrl}?c=QUERY_RECORD&line={device.Line}&station={device.Station}&fixtureid={device.FixtureId}&sn={sn}&comp={device.comp}:{comp}&p=message,sn,wo,model_num,color";
+                url = $"{device.MesUrl}?c=QUERY_RECORD&line={device.Line}&station={device.Station}&fixtureid={device.FixtureId}&sn={sn}&comp={device.comp}:{comp}&p=message,sn,wo,model_num,color,ppid,revision";
             }
             else
             {
-                url = $"{device.MesUrl}?c=QUERY_RECORD&line={device.Line}&station={device.Station}&fixtureid={device.FixtureId}&sn={sn}&p=message,sn,wo,model_num,color";
+                url = $"{device.MesUrl}?c=QUERY_RECORD&line={device.Line}&station={device.Station}&fixtureid={device.FixtureId}&sn={sn}&p=message,sn,wo,model_num,color,ppid,revision";
             }
 
             LogHelper.WriteLogMes($"¡¾Ñ¯ÎÊURL¡¿{url}");

+ 2 - 2
TeamAAS-VM/ViewModels/HomeViewModel.cs

@@ -280,9 +280,9 @@ namespace TeamAAS_VP.ViewModels
                     var waiting = new WaitingControl();
                     //show the dialog
                     var task = DialogHost.Show(waiting, "RootDialog", null, null, null);
-                    _productService.LoadProduct(product.ID);
+                    await _productService.LoadProductAsync(product.ID);
                     _productService.SetCurrentProduct(product.ID);
-                    await management.WritePositionToPlcAsync();
+                    await management.WriteParameterToPlcExAsync();
                     if (DialogHost.IsDialogOpen("RootDialog"))
                     {
                         DialogHost.Close("RootDialog");

+ 1 - 1
TeamAAS-VM/ViewModels/MainWindowViewModel.cs

@@ -384,7 +384,7 @@ namespace TeamAAS_VP.ViewModels
                     }
                 }
                 _container.Resolve<ShowVisionRenderViewModel>().Renders = management.Renders;
-                await management.WritePositionToPlcAsync();
+                await management.WriteParameterToPlcExAsync();
 
             }
             var homeviewmodel = _container.Resolve<HomeViewModel>();

+ 1 - 1
TeamAAS-VM/ViewModels/Product/ProductParamsViewModel.cs

@@ -208,7 +208,7 @@ namespace TeamAAS_VP.ViewModels.Product
                 var current = _productService.GetCurrentProduct();
                 if (current != null && current.IsLoad)
                 {
-                    await management.WritePositionToPlcAsync();
+                    await management.WriteParameterToPlcExAsync();
                 }
                 if (DialogHost.IsDialogOpen("RootDialog"))
                 {

+ 3 - 0
TeamAAS-VM/ViewModels/SettingViewModel.cs

@@ -1926,11 +1926,13 @@ namespace TeamAAS_VP.ViewModels
             {
                 ProMesInfo.ProductCode = "";
                 ProMesInfo.ProductColor = "";
+                ProMesInfo.ProductLoadMode = 0;
             }
             else
             {
                 ProMesInfo.ProductCode = v.ProductCode;
                 ProMesInfo.ProductColor = v.ProductColor;
+                ProMesInfo.ProductLoadMode = v.ProductLoadMode;
             }
         }
 
@@ -1945,6 +1947,7 @@ namespace TeamAAS_VP.ViewModels
                 {
                     ProMesInfo.ProductCode = "";
                     ProMesInfo.ProductColor = "";
+                    ProMesInfo.ProductLoadMode = 0;
                 }
             }
         }

+ 34 - 7
TeamAAS-VM/Views/SettingView.xaml

@@ -484,11 +484,16 @@
                                           Content="是否启用两次产品编号"
                                           IsChecked="{Binding SelectDeviceInfo.EnableDoubleMes, Mode=TwoWay}"
                                           Margin="6,2" />-->
-                                <CheckBox Grid.Row="13"
-                                          Grid.Column="1"
-                                          Content="是否保存CSV文件"
-                                          IsChecked="{Binding SelectDeviceInfo.SaveCsv, Mode=TwoWay}"
-                                          Margin="6,2" />
+                                <StackPanel Grid.Row="13"
+                                            Grid.Column="1"
+                                            Orientation="Horizontal">
+                                    <CheckBox Content="是否保存CSV文件"
+                                              IsChecked="{Binding SelectDeviceInfo.SaveCsv, Mode=TwoWay}"
+                                              Margin="6,2" />
+                                    <CheckBox Content="是否保存ppid"
+                                              IsChecked="{Binding SelectDeviceInfo.SaveCsvPPID, Mode=TwoWay}"
+                                              Margin="6,2" />
+                                </StackPanel>
                                 <TextBlock Grid.Row="14"
                                            Grid.Column="0"
                                            Text="保存的CSV文件路径:"
@@ -2913,7 +2918,8 @@
                                 <ColumnDefinition Width="auto" />
                             </Grid.ColumnDefinitions>
                             <Grid.RowDefinitions>
-                                <RowDefinition Height="auto" />
+                                <RowDefinition Height=" auto" />
+                                <RowDefinition Height=" auto" />
                                 <RowDefinition Height=" auto" />
                                 <RowDefinition Height=" auto" />
                                 <RowDefinition Height=" auto" />
@@ -2993,7 +2999,28 @@
                                 </TextBox.Text>
                             </TextBox>
 
-                            <StackPanel Grid.Row="5"
+                            <TextBlock Margin="0,0,0,8"
+                                       Grid.Row="3"
+                                       VerticalAlignment="Center"
+                                       Text="产品类型:"
+                                       FontSize="{DynamicResource Font.Size.Body3}"
+                                       HorizontalAlignment="Right" />
+                            <TextBox Grid.Row="3"
+                                     Grid.Column="1"
+                                     Margin="10,4"
+                                     MinWidth="100"
+                                     FontSize="{DynamicResource Font.Size.Body3}"
+                                     TextAlignment="Center"
+                                     HorizontalAlignment="Left"
+                                     VerticalAlignment="Center">
+                                <TextBox.Text>
+                                    <Binding Path="ProMesInfo.ProductLoadMode"
+                                             Mode="TwoWay">
+                                    </Binding>
+                                </TextBox.Text>
+                            </TextBox>
+
+                            <StackPanel Grid.Row="6"
                                         Grid.ColumnSpan="2"
                                         Margin="0,6"
                                         Orientation="Horizontal"