Skip to main content

ActorConfig

Configuration object passed to actors during construction, containing all necessary factories and services for actor operation.

Namespace: ControlBee.Models

Overview​

ActorConfig is the dependency injection container for actors. When creating an actor, the framework passes an ActorConfig instance that provides access to:

  • Device Factories - Create hardware interfaces (axes, I/O, vision, etc.)
  • System Services - Access to variable manager, event manager, time manager
  • Configuration - System properties and settings
  • UI Integration - Optional reference to UI actor

This design enables:

  • Testability (factories can be swapped with mocks)
  • Hardware independence (same actor code works with different hardware)
  • Service discovery (actors can access system services)
  • Dependency injection (all dependencies provided at construction time)

Constructor​

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
)

Note: Typically created by the framework, not by user code.

Properties​

ActorName​

public string ActorName { get; }

The name assigned to this actor instance.

Usage Example:

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

Device Factories​

AxisFactory​

public IAxisFactory AxisFactory { get; }

Factory for creating motion axis devices.

Usage Example:

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

DigitalInputFactory​

public IDigitalInputFactory DigitalInputFactory { get; }

Factory for creating digital input devices.

Usage Example:

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

DigitalOutputFactory​

public IDigitalOutputFactory DigitalOutputFactory { get; }

Factory for creating digital output devices.

Usage Example:

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

AnalogInputFactory​

public IAnalogInputFactory AnalogInputFactory { get; }

Factory for creating analog input devices.

Usage Example:

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

AnalogOutputFactory​

public IAnalogOutputFactory AnalogOutputFactory { get; }

Factory for creating analog output devices.

Usage Example:

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

BinaryActuatorFactory​

public IBinaryActuatorFactory BinaryActuatorFactory { get; }

Factory for creating binary actuator devices (cylinders with position feedback).

Usage Example:

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

VisionFactory​

public IVisionFactory VisionFactory { get; }

Factory for creating vision system devices.

Usage Example:

Camera = config.VisionFactory.Create();

DialogFactory​

public IDialogFactory DialogFactory { get; }

Factory for creating user dialog interfaces.

Usage Example:

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

InitializeSequenceFactory​

public IInitializeSequenceFactory InitializeSequenceFactory { get; }

Factory for creating initialization sequences.

System Services​

VariableManager​

public IVariableManager VariableManager { get; }

Service for managing actor variables across the system.

Usage Example:

// Save all variables
config.VariableManager.Save();

// Load recipe
config.VariableManager.Load("Recipe1");

EventManager​

public IEventManager EventManager { get; }

Service for logging events to the database.

Usage Example:

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

TimeManager​

public ITimeManager TimeManager { get; }

Service for time management and stopwatch creation.

Usage Example:

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

DeviceManager​

public IDeviceManager DeviceManager { get; }

Service for managing all hardware devices.

Usage Example:

// Get all motion devices
var motionDevices = config.DeviceManager.GetDevicesByType<IMotionDevice>();

// Check for device errors
foreach (var device in motionDevices)
{
if (device.Error)
{
HandleDeviceError(device);
}
}

SystemPropertiesDataSource​

public ISystemPropertiesDataSource SystemPropertiesDataSource { get; }

Data source for system property values.

ScenarioFlowTester​

public IScenarioFlowTester ScenarioFlowTester { get; }

Service for scenario testing and simulation.

Configuration​

SystemConfigurations​

public ISystemConfigurations SystemConfigurations { get; }

System-wide configuration settings.

Usage Example:

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

var recipeName = config.SystemConfigurations.RecipeName;

UI Integration​

UiActor​

public IActor? UiActor { get; }

Optional reference to the UI actor for sending UI messages.

Usage Example:

// Send message to UI
if (config.UiActor != null)
{
config.UiActor.Send(new Message(this, "UpdateDisplay", displayData));
}

Usage Example​

Basic Actor with Devices​

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

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

public StageActor(ActorConfig config) : base(config)
{
// Create devices using factories
X = config.AxisFactory.Create();
Y = config.AxisFactory.Create();
Z = config.AxisFactory.Create();
Vacuum = config.DigitalOutputFactory.Create();
MaterialSensor = config.DigitalInputFactory.Create();

// Map position to axes
PositionAxesMap.Add(LoadPos, [X, Y, Z]);
}

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

Using System Services​

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}"
);
}
}
}

Accessing Configuration​

public class ConfigurableActor : Actor
{
public ConfigurableActor(ActorConfig config) : base(config)
{
// Adjust behavior based on system configuration
if (config.SystemConfigurations.FakeMode)
{
Logger.Info($"{config.ActorName}: Running in simulation mode");
// Use simulated devices or skip hardware operations
}
else
{
Logger.Info($"{config.ActorName}: Running in production mode");
// Use real hardware
}
}
}

Testing Support​

ActorConfig enables easy testing by allowing factories to be replaced with mocks:

// Create test config with mock factories
var testConfig = new ActorConfig(
actorName: "TestActor",
systemConfigurations: mockSystemConfigurations,
axisFactory: mockAxisFactory,
digitalInputFactory: mockDigitalInputFactory,
// ... other dependencies ...
);

// Create actor with test config
var actor = new MyActor(testConfig);

// Verify actor behavior with mocked dependencies
actor.Start();
// ... assertions ...

See Also​