GAO XUERONGDownload Markdown ↓

Visitors

The visitor pattern allows operations to be applied across the entire component/module tree without modifying the visited objects. A visitor is passed to Components.Accept() or Modules.Accept() on any module, and it receives a callback for each item in the collection.

How It Works

Module.Components.Accept(MyVisitor)
  → calls MyVisitor.VisitComponent(Component1)
  → calls MyVisitor.VisitComponent(Component2)
  

To traverse sub-modules recursively, call Accept on Module.Modules as well, and within VisitModule() call Accept again on that module's collections.


Available Visitors

Enable / Disable

VisitorPurpose
EnableAllComponentsVisitorCalls Enable() on every I_Enablable component in the collection
DisableAllComponentsVisitorCalls Disable() on every I_Enablable component
CheckComponentsEnabledVisitorReturns TRUE if all components are enabled
VAR
    EnableVisitor : EnableAllComponentsVisitor;
END_VAR

Module.Components.Accept(EnableVisitor);

Reset

VisitorPurpose
ResetAllVisitorResets both components and modules
ResetComponentsVisitorResets components only
ResetModulesVisitorResets modules only
VAR
    ResetVisitor : ResetAllVisitor;
END_VAR

Module.Components.Accept(ResetVisitor);
Module.Modules.Accept(ResetVisitor);

Stop

VisitorPurpose
StopAllComponentsVisitorCalls Stop() on every stoppable component

Mode & State Change

VisitorPurpose
ChangeModeOnAllSubModulesVisitorPropagates a mode change to all sub-modules
ChangeStateOnAllSubModulesVisitorPropagates a state change to all sub-modules
ChangePackMLStateOnAllSubModulesVisitorPackML-specific state propagation
VAR
    ModeVisitor : ChangeModeOnAllSubModulesVisitor(RequestedMode := E_Mode.Auto);
END_VAR

Machine.Modules.Accept(ModeVisitor);

Events

VisitorPurpose
EventReactorVisitorTriggers state transitions in response to active events
EventReactorPackMLVisitorPackML variant of event-driven state changes
GetActiveEventSeverityVisitorCollects the highest active event severity across all components

Force

VisitorPurpose
ForceVisitorSets a force state on all forcible digital components
ReleaseAllForceVisitorReleases all active forces back to Unforced

Safety

VisitorPurpose
SafetyOkVisitorReturns TRUE if all safety components report OK
SetSafetySimulationVisitorEnables or disables simulation mode on safety components

HMI

VisitorPurpose
GetSystemTreeJsonHmiVisitorBuilds a JSON representation of the component/module tree for HMI
HmiEnableDisableAllVisitorEnables or disables all HMI-exposed components

Task Results

VisitorPurpose
GetComponentsTaskResultVisitorAggregates I_TaskResult status across all components

Example — Collecting Component Names (from Component_TEST)

VAR
    StringCollection : StringCollection<100>;
    Visitor          : ComponentVisitor_Mockup(StringCollection);
    Component        : Component_Mockup('MySensor');
END_VAR

Component.Accept(Visitor);
// StringCollection.Entries -> 1  (visitor was called once)

// Or across a module's whole collection
Module.Components.Accept(Visitor);
// StringCollection.Entries -> number of components in module

Implementing a Custom Visitor

FUNCTION_BLOCK MyVisitor IMPLEMENTS I_ComponentVisitor
METHOD VisitComponent
VAR_INPUT
    Component : I_Component;
END_VAR
    // operate on each component
    IF Component.Name = 'TargetSensor' THEN
        // ...
    END_IF
END_METHOD