2026-01-26 18:56:53 +09:00

120 lines
4.8 KiB
C#

using Aurora.Api;
using System.Collections.Generic;
using VisionCommon;
namespace WeldingCommon.Vision.Device {
/// <summary>
/// 각 서브 시스템마다 SeqAdapter를 설정한다.
/// </summary>
public class EquipSeqManager : MachineSeqManager {
/// <summary>
/// 생성자
/// </summary>
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());
}
}
}
}
/// <summary>
/// 장비 시퀀스 어댑터 정의를 위한 베이스 클래스
/// 각 서브 시스템 별로 사용되는 Action, Decision 노드를 정의한다.
/// AuroraVision 고정부에서 노드 탐색을 위한 맵을 구성한다.
/// </summary>
public abstract class MachineSeqAdapter : SeqAdapter {
/// <summary>
/// MachineSeqAdapter 생성자
/// </summary>
/// <param name="logTag">log Tag</param>
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<string> branches, SequenceActionResult param);
#endregion
}
#region 샘플 시퀀스 어댑터
// 서브 시스템 별로 SeqAdapter를 정의하여 동작을 다르게 구성한다.
// 모든 서브 시스템의 동작이 동일하다면 1개의 SeqAdapter만 사용할 수 있다.
/// <summary>
/// 샘풀 - 프리얼라인 시퀀스 어댑터
/// </summary>
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<string> branches, SequenceActionResult param) {
_logger.I("Test Decision");
// 조건에 따라 SEQ_ID 분기
return "SEQ_ID_NEXT";
}
}
/// <summary>
/// 샘풀 - 메인얼라인 시퀀스 어댑터
/// </summary>
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<string> branches, SequenceActionResult param) {
_logger.I("Test Decision");
// 조건에 따라 SEQ_ID 분기
return "SEQ_ID_NEXT";
}
}
#endregion
}