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
- Actor System Guide - Complete actor development guide
- Device Integration Guide - Using device factories
- ISystemConfigurations - System configuration
- IVariableManager - Variable management