|
@@ -106,6 +106,12 @@ namespace TeamAAS_VP.Core
|
|
|
/// 超时自动停止秒数
|
|
/// 超时自动停止秒数
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
private int _pressureMaxDurationSeconds = 30; //超时自动停止秒数
|
|
private int _pressureMaxDurationSeconds = 30; //超时自动停止秒数
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 产品主sn
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ string ProductMainSN = "";
|
|
|
|
|
+ string wo = "";
|
|
|
|
|
+ DateTime StartCtqTime = DateTime.Now;//开始采集Ctq数据的时间
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
#region 属性
|
|
#region 属性
|
|
@@ -192,6 +198,16 @@ namespace TeamAAS_VP.Core
|
|
|
get { return _CTtime; }
|
|
get { return _CTtime; }
|
|
|
set { SetProperty(ref _CTtime, value); }
|
|
set { SetProperty(ref _CTtime, value); }
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ private ObservableCollection<DataFormCtq> _dfc = new ObservableCollection<DataFormCtq>();
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// CTQ数据集合
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ public ObservableCollection<DataFormCtq> DFC
|
|
|
|
|
+ {
|
|
|
|
|
+ get { return _dfc; }
|
|
|
|
|
+ set { SetProperty(ref _dfc, value); }
|
|
|
|
|
+ }
|
|
|
#endregion
|
|
#endregion
|
|
|
|
|
|
|
|
#region 命令
|
|
#region 命令
|
|
@@ -1123,7 +1139,7 @@ namespace TeamAAS_VP.Core
|
|
|
{
|
|
{
|
|
|
foreach (var item in current.PickPoints)
|
|
foreach (var item in current.PickPoints)
|
|
|
{
|
|
{
|
|
|
- await item.WriteToPlcAddress(addressConfig.Out_Pick, plc);
|
|
|
|
|
|
|
+ var res = await item.WriteToPlcAddress(addressConfig.Out_Pick, plc);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if (current.SecPosCameraPoints != null && current.SecPosCameraPoints.Count > 0)
|
|
if (current.SecPosCameraPoints != null && current.SecPosCameraPoints.Count > 0)
|
|
@@ -1846,22 +1862,38 @@ namespace TeamAAS_VP.Core
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 获取机器人当前坐标
|
|
|
|
|
+ var robot = _robotService.GetAllRobots().FirstOrDefault();
|
|
|
|
|
+ if (robot == null)
|
|
|
|
|
+ {
|
|
|
|
|
+ SendTaskMessage($"未找到机器人,无法执行上相机锁附/组装拍照视觉任务", MessageLevel.Alarm);
|
|
|
|
|
+ await plc.WriteNodeAsync(addressConfig.Out_UpCameraPutStatus.Address, (Int16)2);
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ var currentPosition = robot.GetRobotPos();
|
|
|
|
|
+
|
|
|
// 执行视觉任务
|
|
// 执行视觉任务
|
|
|
var _cts = new CancellationTokenSource();
|
|
var _cts = new CancellationTokenSource();
|
|
|
- var visionResult = await _remoteCommandService.ExecutePhotoGetDistance(process, null, null, _cts.Token, cameraIndex, null);
|
|
|
|
|
|
|
+ var visionResult = await _remoteCommandService.ExecutePhotoGetDistance(process, null, new double[] { currentPosition.X, currentPosition.Y, currentPosition.U }, _cts.Token, cameraIndex, null);
|
|
|
|
|
+ if (visionResult.distance.Split(',')[0] == "1")
|
|
|
|
|
+ {
|
|
|
|
|
+ mes_cc.Clear();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (visionResult.distance.Split(',')[0] == "2" && mes_cc.ContainsKey("2"))
|
|
|
|
|
+ {
|
|
|
|
|
+ mes_cc.Remove("2");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (visionResult.IsSucceed)
|
|
if (visionResult.IsSucceed)
|
|
|
{
|
|
{
|
|
|
- if (visionResult.distance.Split(',')[0] == "1")
|
|
|
|
|
- {
|
|
|
|
|
- mes_cc.Clear();
|
|
|
|
|
- }
|
|
|
|
|
mes_cc.Add(visionResult.distance.Split(',')[0], visionResult.distance.Split(',')[1]);
|
|
mes_cc.Add(visionResult.distance.Split(',')[0], visionResult.distance.Split(',')[1]);
|
|
|
await plc.WriteNodeAsync(addressConfig.Out_UPCameracheckStatus.Address, (Int16)1);
|
|
await plc.WriteNodeAsync(addressConfig.Out_UPCameracheckStatus.Address, (Int16)1);
|
|
|
SendTaskMessage($"点位{cameraIndex}检测OK", MessageLevel.Debug);
|
|
SendTaskMessage($"点位{cameraIndex}检测OK", MessageLevel.Debug);
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- mes_cc.Add($"{cameraIndex}","0");
|
|
|
|
|
|
|
+ mes_cc.Add($"{cameraIndex}", "0");
|
|
|
await plc.WriteNodeAsync(addressConfig.Out_UPCameracheckStatus.Address, (Int16)2);
|
|
await plc.WriteNodeAsync(addressConfig.Out_UPCameracheckStatus.Address, (Int16)2);
|
|
|
SendTaskMessage($"点位{cameraIndex}检测NG", MessageLevel.Error);
|
|
SendTaskMessage($"点位{cameraIndex}检测NG", MessageLevel.Error);
|
|
|
}
|
|
}
|
|
@@ -2191,6 +2223,8 @@ namespace TeamAAS_VP.Core
|
|
|
|
|
|
|
|
LogHelper.WriteLogMes($"【mes开始QUERY】");
|
|
LogHelper.WriteLogMes($"【mes开始QUERY】");
|
|
|
SendTaskMessage($"mes开始QUERY", MessageLevel.Info);
|
|
SendTaskMessage($"mes开始QUERY", MessageLevel.Info);
|
|
|
|
|
+
|
|
|
|
|
+ StartCtqTime = DateTime.Now;
|
|
|
(bool isSuccess, string response) = await _mesService.StationGetAsync(code, comp, 2);
|
|
(bool isSuccess, string response) = await _mesService.StationGetAsync(code, comp, 2);
|
|
|
if (i == 0)
|
|
if (i == 0)
|
|
|
{
|
|
{
|
|
@@ -2208,7 +2242,20 @@ namespace TeamAAS_VP.Core
|
|
|
|
|
|
|
|
LogHelper.WriteLogMes($"询问mes成功");
|
|
LogHelper.WriteLogMes($"询问mes成功");
|
|
|
SendTaskMessage($"询问mes成功", MessageLevel.Debug);
|
|
SendTaskMessage($"询问mes成功", MessageLevel.Debug);
|
|
|
-
|
|
|
|
|
|
|
+ if (response != "MES功能未启用!")
|
|
|
|
|
+ {
|
|
|
|
|
+ string[] items = response.Split('\n');
|
|
|
|
|
+ if (items[3].Contains("sn="))
|
|
|
|
|
+ {
|
|
|
|
|
+ ProductMainSN = items[3].Replace("sn=", "");
|
|
|
|
|
+ }
|
|
|
|
|
+ SendTaskMessage($"产品主sn:{ProductMainSN}", MessageLevel.Info);
|
|
|
|
|
+ if (items[5].Contains("wo="))
|
|
|
|
|
+ {
|
|
|
|
|
+ wo = items[5].Replace("wo=", "");
|
|
|
|
|
+ }
|
|
|
|
|
+ SendTaskMessage($"产品wo:{wo}", MessageLevel.Info);
|
|
|
|
|
+ }
|
|
|
LogHelper.WriteLogMes($"【mes结束QUERY】");
|
|
LogHelper.WriteLogMes($"【mes结束QUERY】");
|
|
|
SendTaskMessage($"mes结束QUERY", MessageLevel.Info);
|
|
SendTaskMessage($"mes结束QUERY", MessageLevel.Info);
|
|
|
return;
|
|
return;
|
|
@@ -2244,7 +2291,7 @@ namespace TeamAAS_VP.Core
|
|
|
//读取压力值
|
|
//读取压力值
|
|
|
float pressure = plc.ReadNode<float>(string.Format(addressConfig.In_PressureValue.Address, i));
|
|
float pressure = plc.ReadNode<float>(string.Format(addressConfig.In_PressureValue.Address, i));
|
|
|
AssemblyRecord assemblyRecord = new AssemblyRecord();
|
|
AssemblyRecord assemblyRecord = new AssemblyRecord();
|
|
|
- assemblyRecord.ProductSN = code;
|
|
|
|
|
|
|
+ assemblyRecord.ProductSN = ProductMainSN;
|
|
|
assemblyRecord.RecipeName = currentProduct.Name;
|
|
assemblyRecord.RecipeName = currentProduct.Name;
|
|
|
assemblyRecord.PartSN = PartSN;
|
|
assemblyRecord.PartSN = PartSN;
|
|
|
assemblyRecord.AssemblyDurationSeconds = ct;
|
|
assemblyRecord.AssemblyDurationSeconds = ct;
|
|
@@ -2270,7 +2317,7 @@ namespace TeamAAS_VP.Core
|
|
|
await _systemDatabaseService.RecordProductionAsync(new ProductionRecord()
|
|
await _systemDatabaseService.RecordProductionAsync(new ProductionRecord()
|
|
|
{
|
|
{
|
|
|
ProductName = currentProduct.Name,
|
|
ProductName = currentProduct.Name,
|
|
|
- ProductCode = code,
|
|
|
|
|
|
|
+ ProductCode = ProductMainSN,
|
|
|
DeviceId = i,
|
|
DeviceId = i,
|
|
|
DeviceName = "",
|
|
DeviceName = "",
|
|
|
Category = resultIndex == 1 ? "OK" : "NG",
|
|
Category = resultIndex == 1 ? "OK" : "NG",
|
|
@@ -2291,16 +2338,16 @@ namespace TeamAAS_VP.Core
|
|
|
await _systemDatabaseService.RecordAssemblyAsync(assemblyRecord);
|
|
await _systemDatabaseService.RecordAssemblyAsync(assemblyRecord);
|
|
|
LogHelper.WriteLogMes($"【mes开始ADD】");
|
|
LogHelper.WriteLogMes($"【mes开始ADD】");
|
|
|
SendTaskMessage($"mes开始ADD", MessageLevel.Info);
|
|
SendTaskMessage($"mes开始ADD", MessageLevel.Info);
|
|
|
- string assypress= "";string cc = "";
|
|
|
|
|
|
|
+ string assypress = ""; string cc = "";
|
|
|
cc = string.Join(",", mes_cc.OrderBy(kv => kv.Key, StringComparer.Ordinal).Select(kv => kv.Value));
|
|
cc = string.Join(",", mes_cc.OrderBy(kv => kv.Key, StringComparer.Ordinal).Select(kv => kv.Value));
|
|
|
assypress = currentPressure.ToString("F2");
|
|
assypress = currentPressure.ToString("F2");
|
|
|
var res = FileHelper.ReadJsonFile<PressureModel>(FilePath.PressureParamterConfigPath);
|
|
var res = FileHelper.ReadJsonFile<PressureModel>(FilePath.PressureParamterConfigPath);
|
|
|
- if (res.PressureUpLimit>0)
|
|
|
|
|
|
|
+ if (res.PressureUpLimit > 0)
|
|
|
{
|
|
{
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
//cc-复检cc,assypress-组装站压力
|
|
//cc-复检cc,assypress-组装站压力
|
|
|
- (bool isSuccess, string response) = await _mesService.SubmitGetAsync(code, comp, cc,assypress, resultIndex == 1 ? true : false, _LastMesCheckTime[i], DateTime.UtcNow);
|
|
|
|
|
|
|
+ (bool isSuccess, string response) = await _mesService.SubmitGetAsync(ProductMainSN, comp, cc, assypress, resultIndex == 1 ? true : false, _LastMesCheckTime[i], DateTime.UtcNow);
|
|
|
if (isSuccess)
|
|
if (isSuccess)
|
|
|
{
|
|
{
|
|
|
LogHelper.WriteLogMes($"上传mes成功");
|
|
LogHelper.WriteLogMes($"上传mes成功");
|
|
@@ -2315,6 +2362,46 @@ namespace TeamAAS_VP.Core
|
|
|
await plc.WriteNodeAsync(string.Format(addressConfig.Out_MesStatus.Address, i), (Int16)3);
|
|
await plc.WriteNodeAsync(string.Format(addressConfig.Out_MesStatus.Address, i), (Int16)3);
|
|
|
LogHelper.WriteLogMes($"【mes结束ADD】");
|
|
LogHelper.WriteLogMes($"【mes结束ADD】");
|
|
|
SendTaskMessage($"mes结束ADD", MessageLevel.Info);
|
|
SendTaskMessage($"mes结束ADD", MessageLevel.Info);
|
|
|
|
|
+ mes_cc.Clear();
|
|
|
|
|
+ try
|
|
|
|
|
+ {
|
|
|
|
|
+ #region 数据
|
|
|
|
|
+ var cdata = _configService.GetCTQDataInfo();//获取ctq数据参数
|
|
|
|
|
+ bool assyPress = true;
|
|
|
|
|
+ DFC.Clear();
|
|
|
|
|
+ DFC.Add(new DataFormCtq
|
|
|
|
|
+ {
|
|
|
|
|
+ PPID = ProductMainSN,
|
|
|
|
|
+ PROCESS_NAME = cdata.PROCESS_NAME,
|
|
|
|
|
+ PROCESS_START_TIME = StartCtqTime.ToString(),
|
|
|
|
|
+ CTQ_NAME = "CC",
|
|
|
|
|
+ CTQ_VALUE = cc.Replace(",", ";"),
|
|
|
|
|
+ //CTQ_VALUE = 0,
|
|
|
|
|
+ CTQ_LSL = 0,
|
|
|
|
|
+ CTQ_USL = 10,
|
|
|
|
|
+ PROCESS_END_TIME = DateTime.Now.ToString(),
|
|
|
|
|
+ SUPPLIER_NAME = cdata.SUPPLIER_NAME,
|
|
|
|
|
+ COMMODITY_TYPE = cdata.COMMODITY_TYPE,
|
|
|
|
|
+ REVISION = cdata.REVISION,
|
|
|
|
|
+ WO = wo,
|
|
|
|
|
+ MFG_LOT = cdata.MFG_LOT,
|
|
|
|
|
+ MFG_ASSY_LINE = cdata.MFG_ASSY_LINE,
|
|
|
|
|
+ PROCESS_OUTCOME = assyPress ? "PASS" : "FAIL",
|
|
|
|
|
+ PROCESS_MACHINE_ID = cdata.PROCESS_MACHINE_ID,
|
|
|
|
|
+ CTQ_UNIT_OF_MEASURE = "mm",
|
|
|
|
|
+ ERROR_MESSAGE = assyPress ? "" : "CC OOS"
|
|
|
|
|
+ });
|
|
|
|
|
+ foreach (var item in DFC)
|
|
|
|
|
+ {
|
|
|
|
|
+ FileHelper.WriteDataToCSV(item);
|
|
|
|
|
+ }
|
|
|
|
|
+ SendTaskMessage("CTQ数据存储完成", MessageLevel.Info);
|
|
|
|
|
+ #endregion
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (Exception ex)
|
|
|
|
|
+ {
|
|
|
|
|
+ SendTaskMessage("CTQ数据存储时出错" + ex.Message, MessageLevel.Error);
|
|
|
|
|
+ }
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
@@ -2343,7 +2430,7 @@ namespace TeamAAS_VP.Core
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
var code = plc.ReadNode<string>(string.Format(addressConfig.In_Code.Address, i));
|
|
var code = plc.ReadNode<string>(string.Format(addressConfig.In_Code.Address, i));
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
if (state == 1)
|
|
if (state == 1)
|
|
|
{
|
|
{
|
|
|
SendTaskMessage($"收到开始保压信号[{i}]...", MessageLevel.Debug);
|
|
SendTaskMessage($"收到开始保压信号[{i}]...", MessageLevel.Debug);
|