NohDoyeon241104 f5d68248c9 feat: [대면적 MOTF] 레시피 저장/로드 및 페이지 자동 생성 기반 구현 (26.04.10)
- [Line.cs] LargeMOTFPositionX/Y 프로퍼티 추가 ([XmlSerializable])
- [DrawingLayer.cs] LargeMOTFOffsetX/Y 프로퍼티 추가 ([XmlSerializable])
- [RecipeWeldingLines.cs] UseLargeMOTF, LargeMOTFPageCount 프로퍼티 추가 ([XmlSerializable])
  - Load() 에 XmlUtil.ParseProperties() 추가하여 로드 시 반영
- [MainPage.cs]
  - UpdateLargeMOTFPosition() 추가: 저장 직전 Layer별 마지막 Line PF2를 LargeMOTFPositionX/Y에 자동 SET
  - OnRecipeReloaded 이벤트 추가: 레시피 로드 완료 시 콜백
  - GenerateFlippedPages() 추가: EndSet 시 Page3(P2 Y플립), Page4(P1 Y플립) 자동 생성
- [UCScannerObjectTeachingViewModel.cs]
  - OnSaved(): UpdateLargeMOTFPosition, UseLargeMOTF/LargeMOTFPageCount 저장 직전 반영
  - OnChanged(), Reloaded(): 레시피 로드 시 IsUseLargeMOTF, LargeMOTFPageCount UI 반영
  - 생성자: OnRecipeReloaded 이벤트 등록하여 프로그램 시작 시 UI 반영
- [UCScannerObjectTeachingControlBoxViewModel.cs]
  - PerformCmdLargeMOTFEndSet(): LargeMOTFOffsetX 계산 후 GenerateFlippedPages() 호출
  - OnRecipeReloaded 시 LargeMOTFOffsetX UI 반영 (Layer[1] 기준)
2026-04-10 17:31:31 +09:00

205 lines
8.7 KiB
C#

using Aurora;
using Aurora.Api;
using ILSOS_PrismaticScanner.Sequences;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WeldingCommon;
using WeldingCommon.Devices;
using WeldingCommon.RMS;
using WeldingCommon.Sequences;
using WeldingCommon.Sequences.Main;
using WeldingCommon.Settings;
namespace ILSOS_PrismaticScanner.Sequences
{
public class SequenceManager : CommonSequenceManager
{
private static readonly SequenceManager _SequenceManager;
internal static SequenceManager Instance { get => _SequenceManager; }
// Calibration Sequence
SeqMarkGrid _SeqMarkGrid;
SeqScannerCalibration _SeqScannerCalibration;
// MainProcess Sequence
SeqReceiveCellInfo _SeqReceiveCellInfo;
SeqReportCellResult _SeqReportCellResult;
SeqScoutFlyingVision _SeqScoutFlyingVision;
SeqScoutNormal _SeqScoutNormal;
SeqExecutePlcBitInterface _SeqExecutePlcBitInterface;
SeqExecutePlcBitInterface _SeqExecutePlcBitInterfaceForStatusChange;
SeqCheckWeldingComplete _SeqCheckWeldingComplete;
SeqWaitWeldOrChangePage _SeqWaitWeldOrChangePage;
// Manual Sequence
SeqTeachingRun _SeqTeachingRun;
SeqComponentTeachingRun _SeqComponentTeachingRun;
#region 26.04.09 NDY - ACS MOTF AutoRun Sequence
// 기존 SeqAutoRunPrismaticScanner와 별개로 추가
// ACS 모션(Stage X 등) + 갈바노 스캐너 MOTF 자동운전 전용
SeqAutoRunPrismaticScannerACS _SeqAutoRunPrismaticScannerACS;
#endregion
private static Dictionary<string, SequenceBuilder> mapSequenceBuilders = new Dictionary<string, SequenceBuilder>();
static SequenceManager()
{
_SequenceManager = new SequenceManager();
}
internal void UpdateSequenceStatus(SequenceSetting sequenceSetting, ISequenceEntry sequenceEntry)
{
ChangeRunState(sequenceEntry, CommonSequenceIds.PLCMonitor, true);
//ChangeRunState(sequenceEntry, CommonSequenceIds.AlarmMonitor, sequenceSetting.AlarmMonitor);
//ChangeRunState(sequenceEntry, CommonSequenceIds.AlarmMonitor, true);
//ChangeRunState(sequenceEntry, SequenceIds.DeviceMonitor, sequenceSetting.DeviceMonitor);
//ChangeRunState(sequenceEntry, SequenceIds.MESMonitor, sequenceSetting.MESMonitor);
}
private void ChangeRunState(ISequenceEntry sequenceEntry, string sequenceId, bool isRunning, object param = null)
{
if (isRunning)
{
if (sequenceEntry[sequenceId].RunState != SequenceRunState.Running)
{
sequenceEntry[sequenceId].Start(param);
}
}
else
{
if (sequenceEntry[sequenceId].RunState == SequenceRunState.Running)
{
sequenceEntry[sequenceId].Stop();
}
}
}
internal static void RegisterSequence(IAuroraEnvironment aurora, SequenceRegister register)
{
_SequenceManager.Register(aurora, register);
}
public static void RegisterSequenceBuilder(SequenceRegister register, string seqId, SequenceBuilder builder)
{
mapSequenceBuilders.Add(seqId, builder);
}
public override void Register(IAuroraEnvironment aurora, SequenceRegister register)
{
register(CommonSequenceIds.PLCMonitor, PLCMonitor.Builder());
//register(CommonSequenceIds.AlarmMonitor, AlarmMonitoring.Builder());
//register(CommonSequenceIds.DeviceMonitor, DeviceMonitoring.Builder());
base.Register(aurora, register);
if (_SeqMarkGrid == null)
{
_SeqMarkGrid = new SeqMarkGrid();
}
register(CommonSequenceIds.SeqMarkGrid, _SeqMarkGrid.Builder());
if (_SeqScannerCalibration == null)
{
_SeqScannerCalibration = new SeqScannerCalibration();
}
register(CommonSequenceIds.SeqScannerCalibration, _SeqScannerCalibration.Builder());
if (_SeqReceiveCellInfo == null)
{
_SeqReceiveCellInfo = new SeqReceiveCellInfo();
}
register(CommonSequenceIds.SeqReceiveCellInfo, _SeqReceiveCellInfo.Builder());
if (_SeqReportCellResult == null)
{
_SeqReportCellResult = new SeqReportCellResult();
}
register(CommonSequenceIds.SeqReportCellResult, _SeqReportCellResult.Builder());
if (_SeqScoutFlyingVision == null)
{
_SeqScoutFlyingVision = new SeqScoutFlyingVision();
}
register(CommonSequenceIds.SeqScoutFlyingVision, _SeqScoutFlyingVision.Builder());
if (_SeqScoutNormal == null)
{
_SeqScoutNormal = new SeqScoutNormal();
}
register(CommonSequenceIds.SeqScoutNormal, _SeqScoutNormal.Builder());
if (_SeqExecutePlcBitInterface == null)
{
_SeqExecutePlcBitInterface = new SeqExecutePlcBitInterface();
}
register(CommonSequenceIds.SeqExecutePlcBitInterface, _SeqExecutePlcBitInterface.Builder());
if (_SeqExecutePlcBitInterfaceForStatusChange == null)
{
_SeqExecutePlcBitInterfaceForStatusChange = new SeqExecutePlcBitInterface();
}
register(CommonSequenceIds.SeqExecutePlcBitInterfaceForStatusChange, _SeqExecutePlcBitInterfaceForStatusChange.Builder());
if (_SeqCheckWeldingComplete == null)
{
_SeqCheckWeldingComplete = new SeqCheckWeldingComplete();
}
register(CommonSequenceIds.SeqCheckWeldingComplete, _SeqCheckWeldingComplete.Builder());
if (_SeqTeachingRun == null)
{
_SeqTeachingRun = new SeqTeachingRun();
}
register(CommonSequenceIds.SeqTeachingRun, _SeqTeachingRun.Builder());
if (_SeqComponentTeachingRun == null)
{
_SeqComponentTeachingRun = new SeqComponentTeachingRun();
}
register(CommonSequenceIds.SeqComponentTeachingRun, _SeqComponentTeachingRun.Builder());
if (_SeqWaitWeldOrChangePage == null)
{
_SeqWaitWeldOrChangePage = new SeqWaitWeldOrChangePage();
}
register(CommonSequenceIds.SeqWaitWeldOrChangePage, _SeqWaitWeldOrChangePage.Builder());
#region 26.04.09 NDY - ACS MOTF AutoRun Sequence 등록
// 기존 SeqAutoRun(SeqAutoRunPrismaticScanner)은 건드리지 않고
// ACS MOTF 전용 시퀀스를 별도 ID(SeqAutoRunACS)로 등록
if (_SeqAutoRunPrismaticScannerACS == null)
{
_SeqAutoRunPrismaticScannerACS = new SeqAutoRunPrismaticScannerACS();
}
register(SequenceIds.SeqAutoRunACS, _SeqAutoRunPrismaticScannerACS.Builder());
#endregion
}
// MainProcess Sequence
public static SequenceBuilder GetSeqBuilder_SeqReceiveCellInfo() { return Instance._SeqReceiveCellInfo.Builder(); }
public static SequenceBuilder GetSeqBuilder_SeqReportCellResult() { return Instance._SeqReportCellResult.Builder(); }
public static SequenceBuilder GetSeqBuilder_SeqScoutFlyingVision() { return Instance._SeqScoutFlyingVision.Builder(); }
public static SequenceBuilder GetSeqBuilder_SeqScoutNormal() { return Instance._SeqScoutNormal.Builder(); }
public static SequenceBuilder GetSeqBuilder_SeqExecutePlcBitInterface() { return Instance._SeqExecutePlcBitInterface.Builder(); }
public static SequenceBuilder GetSeqBuilder_SeqExecutePlcBitInterfaceForStatusChange() { return Instance._SeqExecutePlcBitInterfaceForStatusChange.Builder(); }
public static SequenceBuilder GetSeqBuilder_SeqCheckWeldingComplete() { return Instance._SeqCheckWeldingComplete.Builder(); }
public static SequenceBuilder GetSeqBuilder_SeqWaitWeldOrChangePage() { return Instance._SeqWaitWeldOrChangePage.Builder(); }
// Manual Sequence
public static SequenceBuilder GetSeqBuilder_SeqTeachingRun() { return Instance._SeqTeachingRun.Builder(); }
public static SequenceBuilder GetSeqBuilder_SeqComponentTeachingRun() { return Instance._SeqComponentTeachingRun.Builder(); }
#region 26.04.09 NDY - ACS MOTF AutoRun Sequence GetSeqBuilder
public static SequenceBuilder GetSeqBuilder_SeqAutoRunPrismaticScannerACS() { return Instance._SeqAutoRunPrismaticScannerACS.Builder(); }
#endregion
public virtual void Terminate()
{
}
}
}