Skip to content

Latest commit

 

History

History
142 lines (105 loc) · 3.89 KB

File metadata and controls

142 lines (105 loc) · 3.89 KB

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

Visitor Purpose
EnableAllComponentsVisitor Calls Enable() on every I_Enablable component in the collection
DisableAllComponentsVisitor Calls Disable() on every I_Enablable component
CheckComponentsEnabledVisitor Returns TRUE if all components are enabled
VAR
    EnableVisitor : EnableAllComponentsVisitor;
END_VAR

Module.Components.Accept(EnableVisitor);

Reset

Visitor Purpose
ResetAllVisitor Resets both components and modules
ResetComponentsVisitor Resets components only
ResetModulesVisitor Resets modules only
VAR
    ResetVisitor : ResetAllVisitor;
END_VAR

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

Stop

Visitor Purpose
StopAllComponentsVisitor Calls Stop() on every stoppable component

Mode & State Change

Visitor Purpose
ChangeModeOnAllSubModulesVisitor Propagates a mode change to all sub-modules
ChangeStateOnAllSubModulesVisitor Propagates a state change to all sub-modules
ChangePackMLStateOnAllSubModulesVisitor PackML-specific state propagation
VAR
    ModeVisitor : ChangeModeOnAllSubModulesVisitor(RequestedMode := E_Mode.Auto);
END_VAR

Machine.Modules.Accept(ModeVisitor);

Events

Visitor Purpose
EventReactorVisitor Triggers state transitions in response to active events
EventReactorPackMLVisitor PackML variant of event-driven state changes
GetActiveEventSeverityVisitor Collects the highest active event severity across all components

Force

Visitor Purpose
ForceVisitor Sets a force state on all forcible digital components
ReleaseAllForceVisitor Releases all active forces back to Unforced

Safety

Visitor Purpose
SafetyOkVisitor Returns TRUE if all safety components report OK
SetSafetySimulationVisitor Enables or disables simulation mode on safety components

HMI

Visitor Purpose
GetSystemTreeJsonHmiVisitor Builds a JSON representation of the component/module tree for HMI
HmiEnableDisableAllVisitor Enables or disables all HMI-exposed components

Task Results

Visitor Purpose
GetComponentsTaskResultVisitor Aggregates 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