using Aurora.Api; using Aurora.Api.Devices; using Aurora.Api.Manager; using Aurora.View; using AuroraACS; using AuroraLaser; using AuroraLaser.Trumpf; using AuroraMassFlowMeter; using AuroraMotionBoard.Ajin; using AuroraOCT.Trumpf; using Hermes; using WeldingCommon.Alarm; using WeldingCommon.Device.ACS; using WeldingCommon.Process; using WeldingCommon.Recipes; using WeldingCommon.Sequences.SubSequence.StageA; using WeldingCommon.Settings; using WeldingCommon.Tools; using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using VisionCommon; using WeldingCommon; using WeldingCommon.Settings; using static AuroraOCT.Trumpf.OCT; using WeldingCommon.Devices.ACS; namespace WeldingCommon.Sequences { class SeqSplitLine { static readonly Logger Log = new Logger("SplitLineSequence"); const int SLEEP_TIME_MS = 50; const int SEQ_CHECK_TIMER = 100; const int SEQ_TIMEOUT = 30 * 1000; const int MOTION_TIMEOUT = 10 * 1000; const int MOTION_INTERVAL = 20; const int WELDING_TIMEOUT = 30 * 1000; const string SEQ_ENTER = "SEQ_ENTER"; const string SEQ_CHECK_INIT_CONDITION = "Check Init Condition"; const string SEQ_CHECK_LINE_COUNT = "Check Line Counting"; const string SEQ_Z_AXIS_MOVE = "X Axis Moving"; const string SEQ_ACS_PARAMETER_SET = "ACS Parameter Setting"; const string SEQ_WELDING_MOTION = "Welding Motion"; const string SEQ_MOTION_INTERLOCK = "Motion Interlock"; const string SEQ_LINE_PROCESS_COMPLETE = "SplitSequence Complete"; private static ManualLaserSetting _manual; private static ObservableCollection _data; private static bool _LaserIOUse; private static int LineInLinesCount; private static int LineInLinesIndex = 0; private static MainRecipe _mainRecipe; private static ScannerACS _acs; private static IScannerACS _acsMotion; private static Laser _laser; private static LaserTruFiber _laserCore; private static LaserPowerCalParam _laserCal; private static ACSMotor _AxisX, _AxisY, _AxisZ; private static AuroraACS.Speed _spd = AuroraACS.Speed.M; private static TeachingPositionSetting _setting; public static SequenceBuilder Builder() { SequenceBuilder sb = new SequenceBuilder(1000, true); sb.AddAction(SEQ_ENTER, Sequence_Enter); sb.AddAction(SEQ_CHECK_INIT_CONDITION, CheckInitCondition); sb.AddDecision(SEQ_CHECK_LINE_COUNT, CheckLineCount); sb.AddAction(SEQ_Z_AXIS_MOVE, ZAxisMove); sb.AddAction(SEQ_ACS_PARAMETER_SET, AcsParameterSetting); sb.AddAction(SEQ_WELDING_MOTION, WeldingMotion); sb.AddAction(SEQ_MOTION_INTERLOCK, MotionInterlock); sb.AddAction(SEQ_LINE_PROCESS_COMPLETE, LineProcessComplete); sb.OnStopped(OnStopped); sb.OnForceError(OnForceError); sb.Flows(sb.Init > sb[SEQ_ENTER] > sb[SEQ_CHECK_INIT_CONDITION] > sb[SEQ_CHECK_LINE_COUNT]); sb.Flows(sb[SEQ_CHECK_LINE_COUNT] > sb[SEQ_Z_AXIS_MOVE] > sb[SEQ_ACS_PARAMETER_SET] > sb[SEQ_WELDING_MOTION] > sb[SEQ_CHECK_LINE_COUNT]); sb.Flows(sb[SEQ_CHECK_LINE_COUNT] > sb[SEQ_MOTION_INTERLOCK] > sb[SEQ_LINE_PROCESS_COMPLETE] > sb.Final); //sb.Draw("SplitLineSequence.pdf"); return sb; } private static SequenceActionResult Sequence_Enter(SequenceContext context, string id, SequenceActionResult param) { context.RetryUntilSuccess(() => true, 1000 * 100, 100); //_data = (ObservableCollection)param.Param; _manual = (ManualLaserSetting)param.Param; _data = _manual.Lines; _LaserIOUse = _manual.LaserIOUse; if (_acsMotion is null) _acsMotion = _acs = context.Devices[CommonDeviceIds.ACS] as ScannerACS; //if (_laser is null) // _laser = context.Devices[CommonDeviceIds.Laser] as Laser; // _laserCore = _laser.getCore() as LaserTruFiber; // _laserCal = context.Settings[CommonSettingIds.LaserPowerCalParam] as LaserPowerCalParam; //if (_io is null) // _io = context.Devices[DeviceIds.IODevice] as PrismaticGunACSIO; if (_setting is null) _setting = context.Settings[CommonSettingIds.TeachingPos] as TeachingPositionSetting; //if (_stage == eStage.A) // _AxisX = context.Devices[MotorIds.ALineX] as ACSMotor; //else // _AxisX = context.Devices[MotorIds.BLineX] as ACSMotor; //if (_stage == eStage.A) // _AxisY = context.Devices[MotorIds.ALineY] as ACSMotor; //else // _AxisY = context.Devices[MotorIds.BLineY] as ACSMotor; LineInLinesCount = _data.Count; LineInLinesIndex = 0; _laserCal = context.Settings[CommonSettingIds.LaserPowerCalParam] as LaserPowerCalParam; _AxisX = context.Devices[CommonMotorIds.AxisX2] as ACSMotor; //_AxisZ = context.Devices[CommonMotorIds.AxisZ] as ACSMotor; //if (_data[LineInLinesIndex].YAxisType == (int)eYAxisType.Y1) { // _AxisY = context.Devices[CommonMotorIds.AxisY1] as ACSMotor; // _acsMotion.SetWeldingAxes((int)CommonMotorIds.eMotorIdx.AxisX2, (int)CommonMotorIds.eMotorIdx.AxisY1); //} //else { // _AxisY = context.Devices[CommonMotorIds.AxisY2] as ACSMotor; // _acsMotion.SetWeldingAxes((int)CommonMotorIds.eMotorIdx.AxisX2, (int)CommonMotorIds.eMotorIdx.AxisY2); //} if (Status.EquipmentStatus == eEqpStatus.Manual) _spd = AuroraACS.Speed.M; else _spd = AuroraACS.Speed.H; Thread.Sleep(SLEEP_TIME_MS); Log.V(">> SeqSplitLIne - Start"); return SequenceAction.Ok(); } private static SequenceActionResult CheckInitCondition(SequenceContext context, string id, SequenceActionResult param) { if (!_AxisX.IsActivated) { context.PutValue("AlarmCode", AlarmCode_PrismaticGun.DEVICE_STAGE_A_AXISX_DEACTIVATED); //26.04.13 잠시 주석 return null; } if (!_AxisY.IsActivated) { context.PutValue("AlarmCode", AlarmCode_PrismaticGun.DEVICE_STAGE_A_AXISY_DEACTIVATED); //26.04.13 잠시 주석 return null; } if (!((_acsMotion as ScannerACS).IsActivated)) { Log.E($"[ACS activated({(_acsMotion as ScannerACS).IsActivated})]"); context.PutValue("AlarmCode", AlarmCode_PrismaticGun.STAGE_A_DEACTIVATED_DISCONNECTED); // 26.04.13 잠시 주석 return null; } //if (!(_laser.IsActivated && _laser.GetConnected())) { // Log.E($"[Laser activated({_laser.IsActivated}) / connected({_laser.GetConnected()})]"); // context.PutValue("AlarmCode", AlarmCode_PrismaticGun.DEVICE_LASER_DEACTIVATED_DISCONNECTED); // return null; //} //if (!(_io.IsActivated && _io.IsConnected())) { // Log.E($"[IO activated({_io.IsActivated}) / connected({_io.IsConnected()})]"); // context.PutValue("AlarmCode", AlarmCode_PrismaticGun.DEVICE_ACSIO_DEACTIVATED_DISCONNECTED); // return null; //} return SequenceAction.Ok(); } private static string CheckLineCount(SequenceContext context, string id, ICollection branches, SequenceActionResult param) { if (LineInLinesCount > LineInLinesIndex){ Log.FuncV($">> LineShot Count ({LineInLinesIndex + 1} / {LineInLinesCount})"); return SEQ_Z_AXIS_MOVE; } Thread.Sleep(SLEEP_TIME_MS); return SEQ_MOTION_INTERLOCK; } private static SequenceActionResult ZAxisMove(SequenceContext context, string id, SequenceActionResult param) { _acsMotion.SetLaserIOUse(_LaserIOUse); var _zPos = _data[LineInLinesIndex].PositionZ; if (_AxisZ.IsReachedTargetPosition(_zPos)) { Log.V($"Already Z-Axis Process Position"); return SequenceAction.Ok(); } _AxisZ.SetTargetPos(_zPos, TargetPosType.ABS); _AxisZ.SetMoveVelocityImm(_spd); _AxisZ.AccelerationImm(_spd); _AxisZ.DecelerationImm(_spd); _AxisZ.JerkImm(_spd); _AxisZ.Move(); Log.V($"Move Z Position : {_zPos}"); var res = context.RetryUntilSuccess(() => _AxisZ.IsReachedTargetPosition(_zPos), MOTION_TIMEOUT, MOTION_INTERVAL, true); if (res == E2.TIMEOUT) { Log.FuncE($"Z-Axis Move Timeout!"); context.PutValue("AlarmCode", AlarmCode_PrismaticGun.STAGE_A_Z_MOVE_TIMEOUT); // 26.04.13 잠시 주석 return null; } else if (res == E2.CANCELLED) { Log.FuncE($"Z-Axis Move Cancel!"); context.PutValue("AlarmCode", 0); return null; } Log.V($"Move Z Position Complete :{_zPos}"); Log.V($"Z Move Complete"); return SequenceAction.Ok(); } private static SequenceActionResult AcsParameterSetting(SequenceContext context, string id, SequenceActionResult param) { var LineData = _data; LineData[LineInLinesIndex].State = "Working"; // 볼트 켈 정도를 가져오기 위해 10을 곱해서 검색한다 _laserCal.Initialize(_laserCal.PowerCalibrationCenterBeamCSVFile, _laserCal.PowerCalibrationRingBeamCSVFile); var RealCoreVoltage = (_laserCal.CalibrateWattToMeasuredVoltage(_data[LineInLinesIndex].Core, (uint)LaserPowerCalibrationParam.beamMode.Center)); var RealRingVoltage = (_laserCal.CalibrateWattToMeasuredVoltage(_data[LineInLinesIndex].Ring, (uint)LaserPowerCalibrationParam.beamMode.Ring)); if (double.IsNaN(RealCoreVoltage) || RealCoreVoltage < 0.0) RealCoreVoltage = 0.0; if (double.IsNaN(RealRingVoltage) || RealRingVoltage < 0.0) RealRingVoltage = 0.0; var _startX = _data[LineInLinesIndex].StartX; var _startY = _data[LineInLinesIndex].StartY; var _endX = _data[LineInLinesIndex].EndX; var _endY = _data[LineInLinesIndex].EndY; if (_data[LineInLinesIndex].YAxisType == (int)eYAxisType.Y1) { _startX += _manual.CamLaserPositionOffset.Y1UseOffsetX; _startY -= _manual.CamLaserPositionOffset.Y1UseOffsetY; _endX += _manual.CamLaserPositionOffset.Y1UseOffsetX; _endY -= _manual.CamLaserPositionOffset.Y1UseOffsetY; } else { _startX += _manual.CamLaserPositionOffset.Y2UseOffsetX; _startY -= _manual.CamLaserPositionOffset.Y2UseOffsetY; _endX += _manual.CamLaserPositionOffset.Y2UseOffsetX; _endY -= _manual.CamLaserPositionOffset.Y2UseOffsetY; } var _velocity = _data[LineInLinesIndex].Velocity; var _acc = _data[LineInLinesIndex].Acc; //SetLineShot(double corePower, double ringPower, double startPosX, double endPosX, double startPosY, double endPosY, double velocity, double acc) _acsMotion.SetLCILserOn(true); _acsMotion.SetLineShot(RealCoreVoltage, RealRingVoltage, _startX, _endX, _startY, _endY, _velocity, _acc); _acsMotion.SetLaserIOUse(_LaserIOUse); //레이저 출력 셋팅 Jeongin Log.V($"ACS Setting Complete"); return SequenceAction.Ok(); } private static SequenceActionResult WeldingMotion(SequenceContext context, string id, SequenceActionResult param) { if (_acsMotion.LineShotStart()) Log.V($">> {LineInLinesIndex} LineShot Start"); Thread.Sleep(500); var res = context.RetryUntilSuccess(() => _acsMotion.CheckLineShotComp(), SEQ_TIMEOUT, SEQ_CHECK_TIMER); if (res == E2.TIMEOUT) { Log.FuncV($">> {LineInLinesIndex} LineShot Fail"); return null; } else if(res == E2.CANCELLED) { Log.FuncV($">> {LineInLinesIndex} LineShot Cancel"); return null; } _data[LineInLinesIndex].State = "Done"; Log.V($"Laser Interlock Start"); _acsMotion.SetLCILserOn(false); //ProcessManager.Instance.EnableLaserUse(true); Log.FuncV($">> {LineInLinesIndex++} : LineShot Complete"); Thread.Sleep(SLEEP_TIME_MS); return SequenceAction.Ok(); } private static SequenceActionResult MotionInterlock(SequenceContext context, string id, SequenceActionResult param) { if (Status.EquipmentStatus == eEqpStatus.Manual) { //_laserCore.LaserOff(); Log.I("Manual Laser Off"); } return SequenceAction.Ok(); } private static SequenceActionResult LineProcessComplete(SequenceContext context, string id, SequenceActionResult param) { LineInLinesIndex = 0; //ProcessManager.Instance.EnableLaserUse(true); //_laser.LaserOff(); _acsMotion.SetLCILserOn(false); Log.FuncV(">> All LineShot Complete"); MessageUtil.ShowSuccessToast(">> All LineShot Complete"); return SequenceAction.Ok(); } private static void OnStopped(SequenceContext context) { LineInLinesIndex = 0; //ProcessManager.Instance.EnableLaserUse(true); //_laser.LaserOff(); _acsMotion.SetLCILserOn(false); Log.FuncV(">> All LineShot Fail"); MessageUtil.ShowWarningToast(">> Sequence Stop"); return; } private static void OnForceError(SequenceContext context, string arg2) { LineInLinesIndex = 0; //ProcessManager.Instance.EnableLaserUse(true); //_laser.LaserOff(); _acsMotion.SetLCILserOn(false); Log.FuncV(">> All LineShot Fail"); MessageUtil.ShowErrorToast(">> Sequence Fail"); return; } } }