From b476476833d77a274d3e81e65fd8c95f11c47e7c Mon Sep 17 00:00:00 2001 From: NohDoyeon241104 Date: Mon, 6 Apr 2026 18:03:24 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20ACS=20Stage=20Manual=20View=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20Motor=20=EC=B6=95=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WeldingCommon/Views/ACS/ UCStageManual, UCMotorAxses, UCStageMotorMoving 추가 (Scanner X축 전용, WeldingCommon 공통 View로 등록) - EquipmentSetup.cs ACS, AxisX2, AxisY1, AxisY2, AxisZ 등록 및 Initialized 확인 - Manual 메뉴에 Stage Manual 서브메뉴 추가 - AddInterlockCheck 주석 처리 (ACSMotor 지원 여부 이정인 선임 확인 필요) --- .../ILSOS_PrismaticScanner/EquipmentSetup.cs | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/Machines/ILSOS_PrismaticScanner/EquipmentSetup.cs b/Machines/ILSOS_PrismaticScanner/EquipmentSetup.cs index 74d4756..9c9ce87 100644 --- a/Machines/ILSOS_PrismaticScanner/EquipmentSetup.cs +++ b/Machines/ILSOS_PrismaticScanner/EquipmentSetup.cs @@ -159,6 +159,8 @@ namespace ILSOS_PrismaticScanner () => _plc, PLCMxComponentConfig.GetDefaultConfig(), device => new UCPLCDevice() { DataContext = new UCPLCDeviceViewModel(AuroraEnv, _plc) }); + + AlarmManager.Init(AuroraEnv); #region Common에 있는 Device를 등록한다. 26.04.06 @@ -186,10 +188,62 @@ namespace ILSOS_PrismaticScanner registry.Register(MotorIds.AxisZ, () => motorZ, new ACSMotorConfig(MotorIds.AxisZ), motor => new UCACSMotor(AuroraEnv.DeviceManager, motor.DeviceId)); + + // ── 26.04.06 NDY 추가: DevGroup 적용 ────────────────────────────── + foreach (var device in registry.GetDevices()) + { + if (device.DeviceId == DeviceIds.ACS || + device.DeviceId == MotorIds.AxisX2 || + device.DeviceId == MotorIds.AxisY1 || + device.DeviceId == MotorIds.AxisY2 || + device.DeviceId == MotorIds.AxisZ) + { + device.DevGroup = "ACS"; + } + } + // ────────────────────────────────────────────────────────────────── + + // ── 26.04.06 NDY 추가: 인터락 ───────────────────────────────────── + // TODO: PLCControllerPrismaticScanner에 IsDoorOpen, IsEMO 있는지 확인 필요 - 없는 것 확인 완료 + //PLC_DOOR_INTERLOCK = 6, // ← 도어 인터락 + //PLC_EMO_STATUS = 7, // ← EMO + AddMotionInterlockCheck(_plc); + // ────────────────────────────────────────────────────────────────── #endregion } + // 인터락 + private void AddMotionInterlockCheck(PLCControllerPrismaticScanner plc) + { + var motorIds = new[] { + MotorIds.AxisX2, + MotorIds.AxisY1, + MotorIds.AxisY2, + MotorIds.AxisZ + }; + foreach (var motorId in motorIds) + { + try + { + var motor = AuroraEnv.DeviceManager[motorId] as ACSMotor; + if (motor == null) continue; + + //motor.AddInterlockCheck(("MotorInPos", + // () => !motor.ReadInposition())); + //motor.AddInterlockCheck(("IsDoorOpen", + // () => plc.ReadBit(PLCControllerPrismaticScanner.eBitInput.PLC_DOOR_INTERLOCK).data)); + //motor.AddInterlockCheck(("IsEMO", + // () => plc.ReadBit(PLCControllerPrismaticScanner.eBitInput.PLC_EMO_STATUS).data)); + + //*** 인터락은 이정인 선임께 ACSMotor에 AddInterlockCheck가 있는지 확인 후 진행 + } + catch (Exception ex) + { + Log.W($"AddMotionInterlockCheck [{motorId}] 실패: {ex.Message}"); + } + } + } public override void RegisterRecipes(RecipeRegister register) { register(CommonRecipeIds.ScannerObjectTeaching, new ScannerObjectTeachingRecipe(),