|
|
@@ -21,6 +21,7 @@ using System.Collections;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Collections.ObjectModel;
|
|
|
using System.ComponentModel;
|
|
|
+using System.Diagnostics;
|
|
|
using System.Drawing;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
@@ -196,7 +197,7 @@ namespace TeamAAS_VP.Core
|
|
|
|
|
|
public Management(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IConfigService configService,
|
|
|
IRobotService robotService, ICameraService cameraService, IFeederService feederService, IPlcService plcService, IProductService productService,
|
|
|
- ICalibrationService calibrationService, IRemoteCommandService remoteCommandService, ISystemDatabaseService systemDatabaseService, ILightManagerService lightManagerService,
|
|
|
+ ICalibrationService calibrationService, IRemoteCommandService remoteCommandService, ISystemDatabaseService systemDatabaseService, ILightManagerService lightManagerService,
|
|
|
IMesService mesService)
|
|
|
{
|
|
|
_regionManager = regionManager;
|
|
|
@@ -352,7 +353,7 @@ namespace TeamAAS_VP.Core
|
|
|
|
|
|
try
|
|
|
{
|
|
|
- // Renders.Add(new ShowRender() { Id = item.Id, CameraName = item.CameraName });
|
|
|
+ // Renders.Add(new ShowRender() { Id = item.Id, CameraName = item.CameraName });
|
|
|
_cameraService.CreateCamera(item.Id, item);
|
|
|
var camera = _cameraService.GetCamera(item.Id);
|
|
|
Status.Add(new StatusInfo(item.Id, item.CameraName + $"{Lang.未连接}", new SolidColorBrush(Colors.Red)));
|
|
|
@@ -999,6 +1000,7 @@ namespace TeamAAS_VP.Core
|
|
|
addressConfig.In_FixedCameracheckExe.Address,
|
|
|
addressConfig.In_RequestPosition.Address,
|
|
|
addressConfig.In_ScrewTeachExe.Address,
|
|
|
+ addressConfig.In_QrCodePhotoRequest.Address,
|
|
|
addressConfig.In_PickINC.Address,
|
|
|
};
|
|
|
for (int i = 0; i < 10; i++)
|
|
|
@@ -1090,6 +1092,13 @@ namespace TeamAAS_VP.Core
|
|
|
await item.WriteToPlcAddress(addressConfig.Out_IndependentCamer, plc);
|
|
|
}
|
|
|
}
|
|
|
+ if (current.QrCodePoints != null && current.QrCodePoints.Count > 0)
|
|
|
+ {
|
|
|
+ foreach (var item in current.QrCodePoints)
|
|
|
+ {
|
|
|
+ await item.WriteToPlcAddress(addressConfig.Out_QrCodeCamera, plc);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public async Task WriteParameterToPlcAsync()
|
|
|
@@ -1142,8 +1151,10 @@ namespace TeamAAS_VP.Core
|
|
|
/// 零件SN
|
|
|
/// </summary>
|
|
|
string PartSN = "";
|
|
|
-
|
|
|
-
|
|
|
+ /// <summary>
|
|
|
+ /// 复检结果
|
|
|
+ /// </summary>
|
|
|
+ string gapString = "";
|
|
|
/// <summary>
|
|
|
/// 二次定位相机的工具坐标
|
|
|
/// </summary>
|
|
|
@@ -1160,10 +1171,11 @@ namespace TeamAAS_VP.Core
|
|
|
bool _LastFixedCameraPutExe = false;
|
|
|
bool _LastFixedCameracheckExe = false;
|
|
|
Int16[] _LastWorkStart = new Int16[7];
|
|
|
+ Int16 _LastQrCodePhotoRequest = 0;
|
|
|
Int16[] _LastWorkDone = new Int16[7];
|
|
|
Int16 _LastRequestPosition = 0;
|
|
|
Int16 _LastPickINC = 0;
|
|
|
- Int16[] _LastMesCheck=new Int16[10];
|
|
|
+ Int16[] _LastMesCheck = new Int16[10];
|
|
|
DateTime[] _LastMesCheckTime = new DateTime[10];
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -1687,7 +1699,7 @@ namespace TeamAAS_VP.Core
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
-
|
|
|
+
|
|
|
await plc.WriteNodeAsync(addressConfig.Out_UpCameraPutStatus.Address, (Int16)2);
|
|
|
return;
|
|
|
}
|
|
|
@@ -1960,16 +1972,16 @@ namespace TeamAAS_VP.Core
|
|
|
}
|
|
|
if (visionResults[0].IsSucceed && visionResults[1].IsSucceed && visionResults[2].IsSucceed && visionResults[3].IsSucceed)
|
|
|
{
|
|
|
-
|
|
|
- Vector<double> p1=Vector<double>.Build.Dense(new double[] { visionResults[1].X, visionResults[1].Y });
|
|
|
- Vector<double> p2=Vector<double>.Build.Dense(new double[] { visionResults[2].X, visionResults[2].Y });
|
|
|
- Vector<double> p3=Vector<double>.Build.Dense(new double[] { visionResults[3].X, visionResults[3].Y });
|
|
|
+
|
|
|
+ Vector<double> p1 = Vector<double>.Build.Dense(new double[] { visionResults[1].X, visionResults[1].Y });
|
|
|
+ Vector<double> p2 = Vector<double>.Build.Dense(new double[] { visionResults[2].X, visionResults[2].Y });
|
|
|
+ Vector<double> p3 = Vector<double>.Build.Dense(new double[] { visionResults[3].X, visionResults[3].Y });
|
|
|
Vector<double> p4 = Vector<double>.Build.Dense(new double[] { visionResults[0].X, visionResults[0].Y });
|
|
|
|
|
|
var center = RectangleCenterCalculator.CalculateByPCAWithKnownOrder(new List<Vector<double>> { p1, p2, p3, p4 });
|
|
|
UpCameraPutResults[0].X = (float)center.Center[0];
|
|
|
UpCameraPutResults[0].Y = (float)center.Center[1];
|
|
|
- UpCameraPutResults[0].Z= (float)center.MajorAxisAngle;
|
|
|
+ UpCameraPutResults[0].Z = (float)center.MajorAxisAngle;
|
|
|
SendTaskMessage($"产品拍照结果:X={UpCameraPutResults[0].X},Y={UpCameraPutResults[0].Y},Angle={UpCameraPutResults[0].Z}", MessageLevel.Info);
|
|
|
}
|
|
|
else
|
|
|
@@ -2034,12 +2046,12 @@ namespace TeamAAS_VP.Core
|
|
|
var process3 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer3CheckProcedureId);
|
|
|
var process4 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer4CheckProcedureId);
|
|
|
|
|
|
- // 执行视觉任务
|
|
|
+ // 执行视觉任务(复检结果gap)
|
|
|
var _cts = new CancellationTokenSource();
|
|
|
- var task1 = _remoteCommandService.ExecutePhotoGetSinglePoint(process1, null, null, _cts.Token, 1, null);
|
|
|
- var task2 = _remoteCommandService.ExecutePhotoGetSinglePoint(process2, null, null, _cts.Token, 2, null);
|
|
|
- var task3 = _remoteCommandService.ExecutePhotoGetSinglePoint(process3, null, null, _cts.Token, 3, null);
|
|
|
- var task4 = _remoteCommandService.ExecutePhotoGetSinglePoint(process4, null, null, _cts.Token, 4, null);
|
|
|
+ var task1 = _remoteCommandService.ExecutePhotoGetDistance(process1, null, null, _cts.Token, 1, null);
|
|
|
+ var task2 = _remoteCommandService.ExecutePhotoGetDistance(process2, null, null, _cts.Token, 2, null);
|
|
|
+ var task3 = _remoteCommandService.ExecutePhotoGetDistance(process3, null, null, _cts.Token, 3, null);
|
|
|
+ var task4 = _remoteCommandService.ExecutePhotoGetDistance(process4, null, null, _cts.Token, 4, null);
|
|
|
|
|
|
var visionResults = await Task.WhenAll(task1, task2, task3, task4);
|
|
|
if (isDryMode)
|
|
|
@@ -2050,12 +2062,14 @@ namespace TeamAAS_VP.Core
|
|
|
if (visionResults[0].IsSucceed && visionResults[1].IsSucceed && visionResults[2].IsSucceed && visionResults[3].IsSucceed)
|
|
|
{
|
|
|
SendTaskMessage($"固定相机检测OK", MessageLevel.Debug);
|
|
|
+ gapString = $"1-{visionResults[0].distance},2-{visionResults[1].distance},3-{visionResults[2].distance},4-{visionResults[3].distance}";
|
|
|
await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)1);
|
|
|
return;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
SendTaskMessage($"固定相机检测NG", MessageLevel.Error);
|
|
|
+ gapString = $"1-0,2-0,3-0,4-0";
|
|
|
await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)2);
|
|
|
return;
|
|
|
}
|
|
|
@@ -2110,9 +2124,9 @@ namespace TeamAAS_VP.Core
|
|
|
ToolCoord toolCoord = new ToolCoord();
|
|
|
toolCoord.ComputeTool(currentPosition.X, currentPosition.Y, currentPosition.U, UpCameraPutResults[1].X, UpCameraPutResults[1].Y);
|
|
|
|
|
|
-
|
|
|
+
|
|
|
//计算放料角度
|
|
|
- double angle= currentPosition.U - UpCameraPutResults[1].Z + UpCameraPutResults[0].Z;
|
|
|
+ double angle = currentPosition.U - UpCameraPutResults[1].Z + UpCameraPutResults[0].Z;
|
|
|
|
|
|
//将产品的中心点坐标转换为Tool0下的坐标
|
|
|
var point = currentProduct.ScrewPoints[0].Clone();
|
|
|
@@ -2155,6 +2169,73 @@ namespace TeamAAS_VP.Core
|
|
|
|
|
|
}
|
|
|
}
|
|
|
+ // PLC请求二维码拍照
|
|
|
+ else if (addressConfig.In_QrCodePhotoRequest.Address.Contains(tuple.nodeId))
|
|
|
+ {
|
|
|
+ if (tuple.value is Int16 state)
|
|
|
+ {
|
|
|
+ if (_LastQrCodePhotoRequest != state)
|
|
|
+ {
|
|
|
+ _LastQrCodePhotoRequest = state;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (state == 1)
|
|
|
+ {
|
|
|
+ //相机的编号
|
|
|
+ //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_QrCodeCamera_ScanNum.Address);
|
|
|
+ //SendTaskMessage(string.Format("扫码编号", cameraIndex), MessageLevel.Info);
|
|
|
+
|
|
|
+ Guid qrCodeProcedureId = currentProduct.QrCodeProcedureId;
|
|
|
+ //视觉流程ID
|
|
|
+ var qrCodeProcess = _productService.GetCurrentProductProcedureModelById(qrCodeProcedureId);
|
|
|
+ if (qrCodeProcess == null)
|
|
|
+ {
|
|
|
+ SendTaskMessage($"未找到二维码视觉流程,流程ID: {qrCodeProcedureId}", MessageLevel.Alarm);
|
|
|
+ await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)2);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ SendTaskMessage($"开始执行二维码扫码视觉流程", MessageLevel.Debug);
|
|
|
+ var _cts = new CancellationTokenSource();
|
|
|
+
|
|
|
+ await _remoteCommandService.SetLightBeforePhoto(qrCodeProcess);
|
|
|
+ var qrCodeResult = _remoteCommandService.ExecutePhoto(qrCodeProcess, out CogToolBlockTerminalCollection outputCollection);
|
|
|
+
|
|
|
+ if (qrCodeResult && outputCollection.Contains("QR"))
|
|
|
+ {
|
|
|
+ PartSN = outputCollection["QR"].Value as string;
|
|
|
+ if (!string.IsNullOrEmpty(PartSN))
|
|
|
+ {
|
|
|
+ SendTaskMessage($"二维码扫码成功:{PartSN}", MessageLevel.Info);
|
|
|
+ await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ PartSN = "";
|
|
|
+ SendTaskMessage("二维码扫码失败", MessageLevel.Alarm);
|
|
|
+ await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)2);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ PartSN = "";
|
|
|
+ SendTaskMessage("二维码扫码失败", MessageLevel.Alarm);
|
|
|
+ await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)2);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SendTaskMessage("二维码拍照点位发送信号已关闭", MessageLevel.Alarm);
|
|
|
+ await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
// 过站检查
|
|
|
@@ -2172,7 +2253,10 @@ namespace TeamAAS_VP.Core
|
|
|
{
|
|
|
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));
|
|
|
+ var code = "CN0NJTYVLXU0061W0001";
|
|
|
+ string comp = "110RNYV4123456789012345";
|
|
|
+ //询问mes
|
|
|
if (state == 1)
|
|
|
{
|
|
|
//这里缺少从MES获取产品配方的内容,需要补充
|
|
|
@@ -2181,7 +2265,7 @@ namespace TeamAAS_VP.Core
|
|
|
|
|
|
LogHelper.WriteLogMes($"【mes开始QUERY】");
|
|
|
SendTaskMessage($"mes开始QUERY", MessageLevel.Info);
|
|
|
- (bool isSuccess, string response) = await _mesService.StationGetAsync(code, "",2);
|
|
|
+ (bool isSuccess, string response) = await _mesService.StationGetAsync(code, comp, 2);
|
|
|
if (i == 0)
|
|
|
{
|
|
|
SendTaskMessage($"收到当前过站检查请求(当站是否生产)...", MessageLevel.Debug);
|
|
|
@@ -2230,7 +2314,8 @@ namespace TeamAAS_VP.Core
|
|
|
}
|
|
|
|
|
|
//读取产品结果
|
|
|
- Int16 resultIndex = plc.ReadNode<Int16>(string.Format(addressConfig.In_Result.Address,i));
|
|
|
+ Int16 resultIndex = plc.ReadNode<Int16>(string.Format(addressConfig.In_Result.Address, i));
|
|
|
+ resultIndex = 1;
|
|
|
//读取压力值
|
|
|
float pressure = plc.ReadNode<float>(string.Format(addressConfig.In_PressureValue.Address, i));
|
|
|
AssemblyRecord assemblyRecord = new AssemblyRecord();
|
|
|
@@ -2278,10 +2363,18 @@ namespace TeamAAS_VP.Core
|
|
|
}
|
|
|
|
|
|
await _systemDatabaseService.RecordAssemblyAsync(assemblyRecord);
|
|
|
+ var pressureParam = FileHelper.ReadJsonFile<List<PressureModel>>(FilePath.PressureParamterConfigPath);
|
|
|
+ var p1 = pressureParam[0];//组装压力
|
|
|
+ var p2 = pressureParam[1];//保压压力
|
|
|
|
|
|
LogHelper.WriteLogMes($"【mes开始ADD】");
|
|
|
SendTaskMessage($"mes开始ADD", MessageLevel.Info);
|
|
|
- (bool isSuccess, string response) = await _mesService.SubmitGetAsync(code,"", resultIndex == 1 ? true : false, _LastMesCheckTime[i], DateTime.UtcNow);
|
|
|
+ string gap = ""; string press = ""; string presstime = ""; string assypress = "";
|
|
|
+ gap = gapString;
|
|
|
+ press = p2.PressureNum.ToString();
|
|
|
+ presstime = p2.PressureTime.ToString();
|
|
|
+ assypress = assemblyRecord.AssemblyPressure.ToString();
|
|
|
+ (bool isSuccess, string response) = await _mesService.SubmitGetAsync(code, comp, gap, press, presstime, assypress, resultIndex == 1 ? true : false, _LastMesCheckTime[i], DateTime.UtcNow);
|
|
|
if (isSuccess)
|
|
|
{
|
|
|
LogHelper.WriteLogMes($"上传mes成功");
|