본문으로 건너뛰기

Position 타입

다축 모션 위치를 저장하고 제어하기 위한 위치 변수 타입입니다.

네임스페이스: ControlBee.Variables

개요

Position 타입은 물리적 모션 축에 매핑되는 다차원 모션 좌표를 나타냅니다. 다음을 제공합니다:

  • 축 매핑 저장소 - 위치가 자동으로 모션 축에 연결됨
  • 모션 제어 - 저장된 위치로 축을 이동시키는 내장 메서드
  • 위치 티칭 - 현재 축 위치 캡처
  • 변경 추적 - 위치 값이 변경될 때 알림
  • 인덱스 액세스 - 개별 축 값에 직접 액세스

ControlBee는 네 가지 위치 타입을 제공합니다:

  • Position1D - 단일 축 위치(1개 값)
  • Position2D - 2축 위치(2개 값)
  • Position3D - 3축 위치(3개 값)
  • Position4D - 4축 위치(4개 값)

위치 타입 선택

제어할 축의 수에 따라 위치 타입을 선택하세요:

public class MyActor : Actor
{
// 단일 축(X만)
public Variable<Position1D> LoadPosX = new(VariableScope.Local);
public IAxis X;

// 2축(X, Y)
public Variable<Position2D> ScanPosXY = new(VariableScope.Local);
public IAxis X, Y;

// 3축(X, Y, Z)
public Variable<Position3D> PickPosXYZ = new(VariableScope.Local);
public IAxis X, Y, Z;

// 4축(X, Y, Z, R)
public Variable<Position4D> AlignPosXYZR = new(VariableScope.Local);
public IAxis X, Y, Z, R;

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

// 위치를 축에 매핑(순서대로!)
PositionAxesMap.Add(LoadPosX, [X]);
PositionAxesMap.Add(ScanPosXY, [X, Y]);
PositionAxesMap.Add(PickPosXYZ, [X, Y, Z]);
PositionAxesMap.Add(AlignPosXYZR, [X, Y, Z, R]);
}
}

속성

Values

public double[] Values { get; set; }

모든 축에 대한 위치 값의 배열입니다.

사용 예시:

// 모든 값 가져오기
double[] values = pickPos.Value.Values; // [100.5, 200.3, 50.0]

// 모든 값을 한 번에 설정
pickPos.Value.Values = new double[] { 150.0, 250.0, 75.0 };

인덱서

public double this[int i] { get; set; }

인덱스로 개별 축 값에 액세스합니다.

사용 예시:

// 개별 값 가져오기
double x = pickPos.Value[0];
double y = pickPos.Value[1];
double z = pickPos.Value[2];

// 개별 값 설정
pickPos.Value[0] = 100.0; // X 위치
pickPos.Value[1] = 200.0; // Y 위치
pickPos.Value[2] = 50.0; // Z 위치

Axes

public IAxis[] Axes { get; }

이 위치에 매핑된 축의 배열입니다. PositionAxesMap에서 자동으로 검색됩니다.

사용 예시:

// 매핑된 축 확인
foreach (var axis in pickPos.Value.Axes)
{
Console.WriteLine($"Axis position: {axis.ActualPosition}");
Console.WriteLine($"Axis moving: {axis.IsMoving}");
}

Size

public int Size { get; }

이 위치의 축/차원 수입니다.

사용 예시:

var size = pickPos.Value.Size;  // Position3D의 경우 3

모션 메서드

Move

public void Move()
public void Move(bool override)
public void Move(IAxis[] axes)
public void Move(IAxis[] axes, bool override)

저장된 위치로 이동하도록 축에 명령합니다.

매개변수:

  • override — true이면 안전 검사를 우회하고 직접 이동
  • axes — 이동할 특정 축의 하위 집합

사용 예시:

// 매핑된 모든 축을 저장된 위치로 이동
pickPos.Value.Move();

// 재정의하여 이동(안전 검사 건너뛰기)
pickPos.Value.Move(override: true);

// X 및 Y 축만 이동
pickPos.Value.Move([X, Y]);

Wait

public void Wait()
public void Wait(IAxis[] axes)

모든(또는 지정된) 축이 모션을 완료할 때까지 대기합니다.

사용 예시:

// 모든 축 대기
pickPos.Value.Wait();

// 특정 축 대기
pickPos.Value.Wait([X, Y]);

MoveAndWait

public void MoveAndWait()
public void MoveAndWait(IAxis[] axes)

모션을 명령하고 완료를 대기합니다.

사용 예시:

// 모든 축을 이동하고 대기
pickPos.Value.MoveAndWait();

// 특정 축을 이동하고 대기
pickPos.Value.MoveAndWait([X, Z]);

Stop

public void Stop()

매핑된 모든 축을 즉시 정지합니다.

사용 예시:

// 비상 정지
pickPos.Value.Stop();

위치 티칭

SetPos (TeachCurrent)

public void SetPos()

매핑된 모든 축을 읽어 현재 위치를 티칭합니다.

사용 예시:

[Function]
public void TeachPickPos()
{
// 현재 축 위치를 변수로 읽기
PickPos.Value.SetPos();
Console.WriteLine($"Taught position: X={PickPos.Value[0]}, Y={PickPos.Value[1]}, Z={PickPos.Value[2]}");
}

MoveToSavedPos

public void MoveToSavedPos(ActorItemMessage? message = null)

선택적 사용자 지정 속도 프로필을 사용하여 저장된 위치로 이동합니다.

사용 예시:

// 기본 속도로 이동
PickPos.Value.MoveToSavedPos();

// 사용자 지정 속도로 이동
var message = new ActorItemMessage(this, "PickPos", "MoveToSavedPos", new Dict
{
["Speed"] = new double[] { 100.0, 120.0, 80.0 } // 각 축에 대한 사용자 지정 속도
});
PickPos.Value.MoveToSavedPos(message);

MoveToHomePos

public void MoveToHomePos()

모든 축을 홈 위치로 이동합니다(안전을 위해 역순으로).

사용 예시:

[Function]
public void GoHome()
{
PickPos.Value.MoveToHomePos();
}

위치 비교

IsNear

public bool IsNear(double range)

모든 축이 목표 위치의 지정된 범위 내에 있는지 확인합니다.

사용 예시:

// 목표의 0.1mm 이내인지 확인
if (pickPos.Value.IsNear(0.1))
{
Console.WriteLine("Position reached");
}

WaitForPosition

public void WaitForPosition(PositionComparisonType type)

비교 타입에 따라 모든 축이 목표 위치에 도달할 때까지 대기합니다.

사용 예시:

pickPos.Value.Move();
pickPos.Value.WaitForPosition(PositionComparisonType.InPosition);

변경 알림

Position 타입은 변경 사항 추적을 위해 INotifyValueChanged를 구현합니다:

public event EventHandler<ValueChangedArgs>? ValueChanged;
public event EventHandler<ValueChangedArgs>? ValueChanging;

사용 예시:

public MyActor(ActorConfig config) : base(config)
{
// ...

PickPos.ValueChanged += (s, e) =>
{
Console.WriteLine($"Position changed: {PickPos.Value[0]}, {PickPos.Value[1]}, {PickPos.Value[2]}");
};
}

사용 패턴

1. 기본 위치 티칭 및 모션

public class StageActor : Actor
{
public Variable<Position3D> LoadPos = new(VariableScope.Local);
public Variable<Position3D> UnloadPos = 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(LoadPos, [X, Y, Z]);
PositionAxesMap.Add(UnloadPos, [X, Y, Z]);
}

[Function]
public void TeachLoadPosition()
{
LoadPos.Value.SetPos();
}

[Function]
public void TeachUnloadPosition()
{
UnloadPos.Value.SetPos();
}

public void TransferMaterial()
{
// 로드 위치로 이동
LoadPos.Value.MoveAndWait();
PickUpMaterial();

// 언로드 위치로 이동
UnloadPos.Value.MoveAndWait();
PlaceMaterial();
}
}

2. 검증이 있는 순차 모션

public void PickSequence()
{
// Z를 안전한 높이로 올림
SafeHeightPos.Value.MoveAndWait([Z]);

// XY를 위치로 이동
PickPos.Value.MoveAndWait([X, Y]);

// Z를 픽 높이로 내림
PickPos.Value.MoveAndWait([Z]);

// 위치 확인
if (!PickPos.Value.IsNear(0.1))
{
throw new Exception("Position error");
}

// 픽 작업
Vacuum.TurnOn();
Thread.Sleep(500);

// Z 올림
SafeHeightPos.Value.MoveAndWait([Z]);
}

3. 위치 오프셋

public void PickWithOffset(double xOffset, double yOffset)
{
// 위치 복제 및 수정
var offsetPos = (Position3D)PickPos.Value.Clone();
offsetPos[0] += xOffset; // X 오프셋 추가
offsetPos[1] += yOffset; // Y 오프셋 추가

// 오프셋 위치로 이동
offsetPos.MoveAndWait();
}

4. 그리드 위치 계산

public class TrayActor : Actor
{
public Variable<Position3D> GridStartPos = new(VariableScope.Local);
public Variable<double> GridSpacingX = new(VariableScope.Local, 10.0);
public Variable<double> GridSpacingY = new(VariableScope.Local, 10.0);

public void MoveToGridCell(int row, int col)
{
var pos = (Position3D)GridStartPos.Value.Clone();
pos[0] += col * GridSpacingX.Value; // X 오프셋
pos[1] += row * GridSpacingY.Value; // Y 오프셋

pos.MoveAndWait();
}
}

모범 사례

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();
// 매핑 추가를 잊음 - 예외가 발생합니다!
}

2. 올바른 축 순서 사용

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

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

3. 중요한 작업 전에 위치 확인

// ✅ 좋음 - 위치 확인
PickPos.Value.MoveAndWait();
if (!PickPos.Value.IsNear(0.1))
{
throw new Exception("Position error - cannot pick");
}
PickMaterial();

// ❌ 나쁨 - 확인 없음
PickPos.Value.MoveAndWait();
PickMaterial(); // 잘못된 위치에서 픽할 수 있습니다!

4. 안전을 위해 순차 모션 사용

// ✅ 좋음 - 안전한 Z-up 먼저
SafeHeightPos.Value.MoveAndWait([Z]);
PickPos.Value.MoveAndWait([X, Y]);
PickPos.Value.MoveAndWait([Z]);

// ❌ 나쁨 - 충돌 가능
PickPos.Value.MoveAndWait(); // 모든 축이 한 번에 이동합니다!

참고