본문으로 건너뛰기

ActorConfig

액터 생성 중에 액터에게 전달되는 구성 객체로, 액터 작동에 필요한 모든 팩토리와 서비스를 포함합니다.

네임스페이스: ControlBee.Models

개요

ActorConfig는 액터를 위한 의존성 주입 컨테이너입니다. 액터를 생성할 때 프레임워크는 다음에 대한 액세스를 제공하는 ActorConfig 인스턴스를 전달합니다:

  • 장치 팩토리 - 하드웨어 인터페이스 생성(축, I/O, 비전 등)
  • 시스템 서비스 - 변수 관리자, 이벤트 관리자, 시간 관리자에 대한 액세스
  • 구성 - 시스템 속성 및 설정
  • UI 통합 - UI 액터에 대한 선택적 참조

이 설계는 다음을 가능하게 합니다:

  • 테스트 가능성(팩토리를 모의 객체로 교체 가능)
  • 하드웨어 독립성(동일한 액터 코드가 다양한 하드웨어에서 작동)
  • 서비스 검색(액터가 시스템 서비스에 액세스 가능)
  • 의존성 주입(모든 의존성이 생성 시점에 제공됨)

생성자

public ActorConfig(
string actorName,
ISystemConfigurations systemConfigurations,
IAxisFactory axisFactory,
IDigitalInputFactory digitalInputFactory,
IDigitalOutputFactory digitalOutputFactory,
IAnalogInputFactory analogInputFactory,
IAnalogOutputFactory analogOutputFactory,
IDialogFactory dialogFactory,
IInitializeSequenceFactory initializeSequenceFactory,
IBinaryActuatorFactory binaryActuatorFactory,
IVisionFactory visionFactory,
IVariableManager variableManager,
IEventManager eventManager,
ITimeManager timeManager,
IScenarioFlowTester scenarioFlowTester,
ISystemPropertiesDataSource systemPropertiesDataSource,
IDeviceManager deviceManager,
IActor? uiActor
)

참고: 일반적으로 사용자 코드가 아닌 프레임워크에 의해 생성됩니다.

속성

ActorName

public string ActorName { get; }

이 액터 인스턴스에 할당된 이름입니다.

사용 예시:

public MyActor(ActorConfig config) : base(config)
{
Logger.Info($"Creating actor: {config.ActorName}");
}

장치 팩토리

AxisFactory

public IAxisFactory AxisFactory { get; }

모션 축 장치를 생성하기 위한 팩토리입니다.

사용 예시:

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

DigitalInputFactory

public IDigitalInputFactory DigitalInputFactory { get; }

디지털 입력 장치를 생성하기 위한 팩토리입니다.

사용 예시:

MaterialSensor = config.DigitalInputFactory.Create();
SafetyGate = config.DigitalInputFactory.Create();

DigitalOutputFactory

public IDigitalOutputFactory DigitalOutputFactory { get; }

디지털 출력 장치를 생성하기 위한 팩토리입니다.

사용 예시:

Vacuum = config.DigitalOutputFactory.Create();
Cylinder = config.DigitalOutputFactory.Create();
StatusLight = config.DigitalOutputFactory.Create();

AnalogInputFactory

public IAnalogInputFactory AnalogInputFactory { get; }

아날로그 입력 장치를 생성하기 위한 팩토리입니다.

사용 예시:

PressureSensor = config.AnalogInputFactory.Create();
TemperatureSensor = config.AnalogInputFactory.Create();

AnalogOutputFactory

public IAnalogOutputFactory AnalogOutputFactory { get; }

아날로그 출력 장치를 생성하기 위한 팩토리입니다.

사용 예시:

ValveControl = config.AnalogOutputFactory.Create();
HeaterControl = config.AnalogOutputFactory.Create();

BinaryActuatorFactory

public IBinaryActuatorFactory BinaryActuatorFactory { get; }

이진 액추에이터 장치(위치 피드백이 있는 실린더)를 생성하기 위한 팩토리입니다.

사용 예시:

PickCylinder = config.BinaryActuatorFactory.Create();
ClampCylinder = config.BinaryActuatorFactory.Create();

VisionFactory

public IVisionFactory VisionFactory { get; }

비전 시스템 장치를 생성하기 위한 팩토리입니다.

사용 예시:

Camera = config.VisionFactory.Create();

DialogFactory

public IDialogFactory DialogFactory { get; }

사용자 대화 상자 인터페이스를 생성하기 위한 팩토리입니다.

사용 예시:

ErrorDialog = config.DialogFactory.Create();
ConfirmDialog = config.DialogFactory.Create();

InitializeSequenceFactory

public IInitializeSequenceFactory InitializeSequenceFactory { get; }

초기화 시퀀스를 생성하기 위한 팩토리입니다.

시스템 서비스

VariableManager

public IVariableManager VariableManager { get; }

시스템 전체에서 액터 변수를 관리하기 위한 서비스입니다.

사용 예시:

// 모든 변수 저장
config.VariableManager.Save();

// 레시피 로드
config.VariableManager.Load("Recipe1");

EventManager

public IEventManager EventManager { get; }

데이터베이스에 이벤트를 로깅하기 위한 서비스입니다.

사용 예시:

config.EventManager.WriteEvent(
severity: EventSeverity.Warning,
category: "Motion",
message: "Axis timeout",
data: new { AxisName = "X", Timeout = 5000 }
);

TimeManager

public ITimeManager TimeManager { get; }

시간 관리 및 스톱워치 생성을 위한 서비스입니다.

사용 예시:

var stopwatch = config.TimeManager.StartNew();
// ... 작업 ...
var elapsed = stopwatch.ElapsedMilliseconds;

DeviceManager

public IDeviceManager DeviceManager { get; }

모든 하드웨어 장치를 관리하기 위한 서비스입니다.

사용 예시:

// 모든 모션 장치 가져오기
var motionDevices = config.DeviceManager.GetDevicesByType<IMotionDevice>();

// 장치 오류 확인
foreach (var device in motionDevices)
{
if (device.Error)
{
HandleDeviceError(device);
}
}

SystemPropertiesDataSource

public ISystemPropertiesDataSource SystemPropertiesDataSource { get; }

시스템 속성 값을 위한 데이터 소스입니다.

ScenarioFlowTester

public IScenarioFlowTester ScenarioFlowTester { get; }

시나리오 테스트 및 시뮬레이션을 위한 서비스입니다.

구성

SystemConfigurations

public ISystemConfigurations SystemConfigurations { get; }

시스템 전체 구성 설정입니다.

사용 예시:

if (config.SystemConfigurations.FakeMode)
{
Logger.Info("Running in simulation mode");
}

var recipeName = config.SystemConfigurations.RecipeName;

UI 통합

UiActor

public IActor? UiActor { get; }

UI 메시지를 보내기 위한 UI 액터에 대한 선택적 참조입니다.

사용 예시:

// UI에 메시지 전송
if (config.UiActor != null)
{
config.UiActor.Send(new Message(this, "UpdateDisplay", displayData));
}

사용 예시

장치를 사용하는 기본 액터

public class StageActor : Actor
{
// 장치
public IAxis X, Y, Z;
public IDigitalOutput Vacuum;
public IDigitalInput MaterialSensor;

// 변수
public Variable<Position3D> LoadPos = new(VariableScope.Local);
public Variable<double> Speed = new(VariableScope.Local, 100.0);

public StageActor(ActorConfig config) : base(config)
{
// 팩토리를 사용하여 장치 생성
X = config.AxisFactory.Create();
Y = config.AxisFactory.Create();
Z = config.AxisFactory.Create();
Vacuum = config.DigitalOutputFactory.Create();
MaterialSensor = config.DigitalInputFactory.Create();

// 위치를 축에 매핑
PositionAxesMap.Add(LoadPos, [X, Y, Z]);
}

public override void Start()
{
base.Start();
SetState(new IdleState(this));
}
}

시스템 서비스 사용

public class MonitorActor : Actor
{
private readonly IEventManager eventManager;
private readonly ITimeManager timeManager;

public MonitorActor(ActorConfig config) : base(config)
{
eventManager = config.EventManager;
timeManager = config.TimeManager;
}

public void LogOperationTime(string operationName, Action operation)
{
var stopwatch = timeManager.StartNew();

try
{
operation();

eventManager.WriteEvent(
EventSeverity.Info,
"Performance",
$"{operationName} completed",
new { Duration = stopwatch.ElapsedMilliseconds }
);
}
catch (Exception ex)
{
eventManager.WriteEvent(
EventSeverity.Error,
"Error",
$"{operationName} failed: {ex.Message}"
);
}
}
}

구성 액세스

public class ConfigurableActor : Actor
{
public ConfigurableActor(ActorConfig config) : base(config)
{
// 시스템 구성에 따라 동작 조정
if (config.SystemConfigurations.FakeMode)
{
Logger.Info($"{config.ActorName}: Running in simulation mode");
// 시뮬레이션된 장치 사용 또는 하드웨어 작업 건너뛰기
}
else
{
Logger.Info($"{config.ActorName}: Running in production mode");
// 실제 하드웨어 사용
}
}
}

테스트 지원

ActorConfig는 팩토리를 모의 객체로 교체하여 쉽게 테스트할 수 있게 합니다:

// 모의 팩토리를 사용하여 테스트 구성 생성
var testConfig = new ActorConfig(
actorName: "TestActor",
systemConfigurations: mockSystemConfigurations,
axisFactory: mockAxisFactory,
digitalInputFactory: mockDigitalInputFactory,
// ... 기타 의존성 ...
);

// 테스트 구성으로 액터 생성
var actor = new MyActor(testConfig);

// 모의 의존성으로 액터 동작 검증
actor.Start();
// ... 어설션 ...

참고