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(); // 모든 축이 한 번에 이동합니다!
참고
- PositionAxesMap - 위치-축 매핑 관리
- IAxis 인터페이스 - 모션 축 제어
- 변수 시스템 가이드 - 위치 변수 사용
- INotifyValueChanged - 변경 알림