본문으로 건너뛰기

PositionAxesMap

위치 변수와 모션 축 간의 매핑을 관리하여 위치 기반 모션 제어를 가능하게 합니다.

네임스페이스: ControlBee.Models

구현: IPositionAxesMap

개요

PositionAxesMap은 위치 변수(예: Position1D, Position3D)를 물리적 모션 축에 연결합니다. 이 매핑은 다음을 가능하게 합니다:

  • 위치 티칭 - 현재 축 위치를 위치 변수로 읽기
  • 위치 모션 - 여러 축을 저장된 위치로 이동
  • UI 생성 - 위치와 연결된 축 표시
  • 유효성 검사 - 모션 전에 축이 사용 가능한지 확인

각 액터는 Actor.PositionAxesMap 속성을 통해 액세스할 수 있는 자체 PositionAxesMap 인스턴스를 가집니다.

내부 저장소

private readonly Dictionary<string, IAxis[]> _map;
private readonly Dictionary<IVariable, IAxis[]> _variableMap;

클래스는 두 개의 딕셔너리를 유지합니다:

  • _variableMap - 액터 생성 중 임시 저장소
  • _map - 변수 항목 경로로 키가 지정된 최종 매핑

매핑은 프레임워크에서 UpdateMap()이 호출될 때 완료됩니다.

메서드

Add

public void Add(IVariable variable, IAxis[] axes)

위치 변수와 축 배열 간의 매핑을 추가합니다.

매개변수:

  • variable — 위치 변수(Position1D, Position2D, Position3D 등)
  • axes — 이 위치에 해당하는 축 배열

사용 예시:

public class StageActor : Actor
{
public Variable<Position1D> LoadPosX = new(VariableScope.Local);
public Variable<Position3D> PickPos = new(VariableScope.Local);

public IAxis X, Y, Z;

public StageActor(ActorConfig config) : base(config)
{
X = config.AxisFactory.Create();
Y = config.AxisFactory.Create();
Z = config.AxisFactory.Create();

// 위치 변수를 축에 매핑
PositionAxesMap.Add(LoadPosX, [X]); // 1D 위치는 X 축에 매핑
PositionAxesMap.Add(PickPos, [X, Y, Z]); // 3D 위치는 X, Y, Z 축에 매핑
}
}

Get

public IAxis[] Get(string itemPath)

항목 경로로 위치 변수와 연결된 축을 검색합니다.

매개변수:

  • itemPath — 위치 변수의 항목 경로

반환값: 이 위치에 매핑된 축 배열

예외: 항목 경로가 맵에서 발견되지 않으면 PlatformException

사용 예시:

// 위치에 대한 축 가져오기
var axes = PositionAxesMap.Get("PickPos");
foreach (var axis in axes)
{
Console.WriteLine($"Axis position: {axis.ActualPosition}");
}

참고: 이 메서드는 일반적으로 프레임워크에서 내부적으로 사용됩니다. 사용자 코드는 일반적으로 직접 호출하지 않습니다.

UpdateMap

public void UpdateMap()

_variableMap에서 _map으로 항목을 전송하여 매핑을 완료합니다. 액터 생성 후 프레임워크에서 호출됩니다.

참고: 프레임워크에서 자동으로 호출됩니다. 사용자 코드는 이 메서드를 호출해서는 안 됩니다.

사용 패턴

1. 단일 축 위치

public class LinearStageActor : Actor
{
public Variable<Position1D> LoadPos = new(VariableScope.Local);
public Variable<Position1D> UnloadPos = new(VariableScope.Local);

public IAxis X;

public LinearStageActor(ActorConfig config) : base(config)
{
X = config.AxisFactory.Create();

// 두 위치를 동일한 X 축에 매핑
PositionAxesMap.Add(LoadPos, [X]);
PositionAxesMap.Add(UnloadPos, [X]);
}

[Function]
public void MoveToLoad()
{
LoadPos.Value.MoveAndWait(); // X 축을 LoadPos 위치로 이동
}

[Function]
public void TeachLoadPos()
{
LoadPos.Value.TeachCurrent(); // X 축 위치를 LoadPos로 읽기
}
}

2. 다축 위치

public class PickerActor : Actor
{
public Variable<Position3D> PickPos = new(VariableScope.Local);
public Variable<Position3D> PlacePos = new(VariableScope.Local);

public IAxis X, Y, Z;

public PickerActor(ActorConfig config) : base(config)
{
X = config.AxisFactory.Create();
Y = config.AxisFactory.Create();
Z = config.AxisFactory.Create();

// 3D 위치를 세 축 모두에 매핑
PositionAxesMap.Add(PickPos, [X, Y, Z]);
PositionAxesMap.Add(PlacePos, [X, Y, Z]);
}

[Function]
public void MoveToPick()
{
// X, Y, Z 축을 PickPos로 동시에 이동
PickPos.Value.MoveAndWait();
}

[Function]
public void TeachPickPos()
{
// X, Y, Z 위치를 PickPos로 읽기
PickPos.Value.TeachCurrent();
}
}

3. 혼합 차원

public class ComplexStageActor : Actor
{
public Variable<Position1D> LoadPosX = new(VariableScope.Local);
public Variable<Position2D> ScanPosXY = new(VariableScope.Local);
public Variable<Position3D> PickPosXYZ = new(VariableScope.Local);

public IAxis X, Y, Z;

public ComplexStageActor(ActorConfig config) : base(config)
{
X = config.AxisFactory.Create();
Y = config.AxisFactory.Create();
Z = config.AxisFactory.Create();

// 다양한 차원의 위치
PositionAxesMap.Add(LoadPosX, [X]); // 1D - X만
PositionAxesMap.Add(ScanPosXY, [X, Y]); // 2D - X와 Y
PositionAxesMap.Add(PickPosXYZ, [X, Y, Z]); // 3D - X, Y, Z
}
}

4. 축 재사용

public class DualArmActor : Actor
{
// 왼쪽 팔 위치
public Variable<Position3D> LeftPickPos = new(VariableScope.Local);
public Variable<Position3D> LeftPlacePos = new(VariableScope.Local);

// 오른쪽 팔 위치
public Variable<Position3D> RightPickPos = new(VariableScope.Local);
public Variable<Position3D> RightPlacePos = new(VariableScope.Local);

public IAxis LeftX, LeftY, LeftZ;
public IAxis RightX, RightY, RightZ;

public DualArmActor(ActorConfig config) : base(config)
{
// 두 팔에 대한 축 생성
LeftX = config.AxisFactory.Create();
LeftY = config.AxisFactory.Create();
LeftZ = config.AxisFactory.Create();

RightX = config.AxisFactory.Create();
RightY = config.AxisFactory.Create();
RightZ = config.AxisFactory.Create();

// 왼쪽 팔 위치를 왼쪽 축에 매핑
PositionAxesMap.Add(LeftPickPos, [LeftX, LeftY, LeftZ]);
PositionAxesMap.Add(LeftPlacePos, [LeftX, LeftY, LeftZ]);

// 오른쪽 팔 위치를 오른쪽 축에 매핑
PositionAxesMap.Add(RightPickPos, [RightX, RightY, RightZ]);
PositionAxesMap.Add(RightPlacePos, [RightX, RightY, RightZ]);
}
}

오류 처리

매핑 누락

try
{
var axes = PositionAxesMap.Get("UnmappedPosition");
}
catch (PlatformException ex)
{
Console.WriteLine($"Position not mapped: {ex.Message}");
}

일반적인 원인:

  • 생성자에서 PositionAxesMap.Add() 호출을 잊음
  • 항목 경로의 오타
  • 변수가 제대로 초기화되지 않음

해결책:

public MyActor(ActorConfig config) : base(config)
{
X = config.AxisFactory.Create();

// 매핑 추가를 잊지 마세요!
PositionAxesMap.Add(MyPosition, [X]);
}

모범 사례

1. 생성자에서 매핑 추가

// ✅ 좋음 - 생성자에서 매핑 추가
public MyActor(ActorConfig config) : base(config)
{
X = config.AxisFactory.Create();
PositionAxesMap.Add(LoadPos, [X]);
}

// ❌ 나쁨 - 나중에 매핑 추가(작동하지 않음)
public MyActor(ActorConfig config) : base(config)
{
X = config.AxisFactory.Create();
}

public override void Start()
{
base.Start();
PositionAxesMap.Add(LoadPos, [X]); // 너무 늦음!
}

2. 모든 위치 변수 매핑

// ✅ 좋음 - 모든 위치 매핑됨
public MyActor(ActorConfig config) : base(config)
{
X = config.AxisFactory.Create();

PositionAxesMap.Add(LoadPos, [X]);
PositionAxesMap.Add(UnloadPos, [X]);
PositionAxesMap.Add(ProcessPos, [X]);
}

// ❌ 나쁨 - 매핑 누락
public MyActor(ActorConfig config) : base(config)
{
X = config.AxisFactory.Create();

PositionAxesMap.Add(LoadPos, [X]);
// UnloadPos가 매핑되지 않음 - 사용할 때 예외가 발생합니다!
}

3. 올바른 축 순서

// ✅ 좋음 - 올바른 축 순서(X, Y, Z)
PositionAxesMap.Add(PickPos, [X, Y, Z]);

// ❌ 나쁨 - 잘못된 축 순서
PositionAxesMap.Add(PickPos, [Z, Y, X]); // 잘못된 위치로 이동합니다!

4. 차원 일치

// ✅ 좋음 - 3개 축이 있는 3D 위치
Variable<Position3D> Pos = new(VariableScope.Local);
PositionAxesMap.Add(Pos, [X, Y, Z]);

// ❌ 나쁨 - 차원 불일치
Variable<Position3D> Pos = new(VariableScope.Local);
PositionAxesMap.Add(Pos, [X, Y]); // Z 축 누락!

위치 변수와의 통합

위치 변수는 내부적으로 PositionAxesMap을 사용합니다:

// 위치를 티칭할 때
LoadPos.Value.TeachCurrent();
// 내부적으로:
// 1. PositionAxesMap에서 축 가져오기
// 2. 각 축의 ActualPosition 읽기
// 3. 위치 변수에 저장

// 위치로 이동할 때
LoadPos.Value.MoveAndWait();
// 내부적으로:
// 1. PositionAxesMap에서 축 가져오기
// 2. 각 축이 이동하도록 명령
// 3. 모든 축이 완료될 때까지 대기

참고