using Aurora.Api; using System.Collections.Generic; using VisionCommon; namespace WeldingCommon.Vision.Device { /// /// 각 서브 시스템마다 SeqAdapter를 설정한다. /// public class EquipSeqManager : MachineSeqManager { /// /// 생성자 /// public EquipSeqManager() { SetAdapters(); } // 장비 환경에 맞게 수정해야 한다. private void SetAdapters() { // 각 서브 시스템에 맞는 SeqAdapter를 설정한다. var subSysInfoPreAlign = VisionRecipeManager.GetSubSysInfo(eUnitId.Unit1, eSubSysId.SubSys2); SetAdapter(subSysInfoPreAlign, new MainAlignSeqAdapter()); // 위에서 이미 설정된 서브시스템의 SeqAdapter는 Skip 된다. // 공통으로 적용할 SeqAdapter를 일괄적으로 설정할 때 사용한다. foreach (var unitId in VisionRecipeManager.GetUnitIds()) { foreach (var subSysInfo in VisionRecipeManager.GetSubSysInfos(unitId)) { SetAdapter(subSysInfo, new PreAlignSeqAdapter()); } } } } /// /// 장비 시퀀스 어댑터 정의를 위한 베이스 클래스 /// 각 서브 시스템 별로 사용되는 Action, Decision 노드를 정의한다. /// AuroraVision 고정부에서 노드 탐색을 위한 맵을 구성한다. /// public abstract class MachineSeqAdapter : SeqAdapter { /// /// MachineSeqAdapter 생성자 /// /// log Tag public MachineSeqAdapter(string logTag) : base(logTag) { // 장비마다 사용될 노드의 개수가 다르기 때문에 맵을 작성해야 한다. // AuroraVision 고정부에서 Action 노드 탐색을 위한 맵 구성 SetActionNode("TestActionNode", TestActionNode); SetActionNode("NgTestActionNode", NgTestActionNode); // AuroraVision 고정부에서 Decision 노드 탐색을 위한 맵 구성 SetDeicisionNode("TestDecisionNode", TestDecisionNode); } #region Action 노드 정의 public abstract SequenceActionResult TestActionNode( SequenceContext context, string id, SequenceActionResult param); public abstract SequenceActionResult NgTestActionNode( SequenceContext context, string id, SequenceActionResult param); #endregion #region Decision 노드 정의 public abstract string TestDecisionNode( SequenceContext context, string id, ICollection branches, SequenceActionResult param); #endregion } #region 샘플 시퀀스 어댑터 // 서브 시스템 별로 SeqAdapter를 정의하여 동작을 다르게 구성한다. // 모든 서브 시스템의 동작이 동일하다면 1개의 SeqAdapter만 사용할 수 있다. /// /// 샘풀 - 프리얼라인 시퀀스 어댑터 /// public class PreAlignSeqAdapter : MachineSeqAdapter { public PreAlignSeqAdapter() : base(typeof(PreAlignSeqAdapter).Name) { } public override SequenceActionResult TestActionNode(SequenceContext context, string id, SequenceActionResult param) { _logger.I("Test Action"); return SequenceAction.Ok(); } public override SequenceActionResult NgTestActionNode(SequenceContext context, string id, SequenceActionResult param) { _logger.I("Ng Test Action"); return SequenceAction.Ok(); } public override string TestDecisionNode(SequenceContext context, string id, ICollection branches, SequenceActionResult param) { _logger.I("Test Decision"); // 조건에 따라 SEQ_ID 분기 return "SEQ_ID_NEXT"; } } /// /// 샘풀 - 메인얼라인 시퀀스 어댑터 /// public class MainAlignSeqAdapter : MachineSeqAdapter { public MainAlignSeqAdapter() : base(typeof(MainAlignSeqAdapter).Name) { } public override SequenceActionResult TestActionNode(SequenceContext context, string id, SequenceActionResult param) { _logger.I("Test Action"); return SequenceAction.Ok(); } public override SequenceActionResult NgTestActionNode(SequenceContext context, string id, SequenceActionResult param) { _logger.I("Ng Test Action"); return SequenceAction.Ok(); } public override string TestDecisionNode(SequenceContext context, string id, ICollection branches, SequenceActionResult param) { _logger.I("Test Decision"); // 조건에 따라 SEQ_ID 분기 return "SEQ_ID_NEXT"; } } #endregion }