Skip to content
Case Study

Cross-Reference Analysis: Finding Every Tag Usage

A controls engineer needed to modify a conveyor speed reference on a ControlLogix system. Before changing anything, they used PLC Company to find all 23 usages of ConvSpeedRef across 4 routines -- and discovered hidden dependencies in alarm and permissive logic that would have broken if changed blindly.

Modifying a Live Production Tag

At a packaging plant running a ControlLogix L82 system, the production manager requested a change to the conveyor speed scaling. The controls engineer needed to modify the ConvSpeedRef tag -- a REAL value that sets the conveyor line speed from an HMI setpoint.

The problem: ConvSpeedRef could be referenced anywhere in the program. It might feed into interlocks, alarm comparisons, feedback loops, or analog output scaling. Changing the scaling factor without understanding every downstream dependency could cause unexpected machine behavior, nuisance alarms, or loss of permissives.

Instead of manually searching through hundreds of rungs in Studio 5000, the engineer uploaded the L5X export to PLC Company and ran a cross-reference search.

“I need to change the speed scaling, but I can't risk breaking something downstream.”

-- Controls engineer, packaging plant

From Search to Complete Signal Map

The cross-reference search found every usage of ConvSpeedRef, then the signal trace mapped the complete data flow from HMI input to physical output.

User Action

Searched for ConvSpeedRef

Cross-Reference Search Results

23 Usages Found Across 4 Routines

Main_Routine (3 usages)

Rung 12: MOV(HMI_SpeedSetpoint, ConvSpeedRef) -- Source write Rung 45: MUL(ConvSpeedRef, ScaleFactor, ConvSpeedScaled) -- Scaling calc Rung 46: CPT(ConvAccelRate, ConvSpeedRef * 0.15) -- Accel derived

Analog_Outputs (1 usage)

Rung 3: MOV(ConvSpeedScaled, AO_Module:2:O.Data[0]) -- Physical output

Speed_Control (3 usages)

Rung 1: MOV(HMI_SpeedSetpoint, ConvSpeedRef) -- HMI write target Rung 8: GRT(ConvSpeedRef, SpeedHighLimit) OTE(SpeedHighFlag) Rung 9: LES(ConvSpeedRef, SpeedLowLimit) OTE(ConvRunPermissive)

Alarm_Handler (1 usage)

Rung 15: GRT(ConvSpeedRef, SpeedHighLimit) OTE(SpeedHighAlarm)

Additional references found in 15 other rungs across these routines as indirect reads through ConvSpeedScaled and ConvAccelRate -- tags that derive their values from ConvSpeedRef.

User Action

Traced signal path for ConvSpeedRef

Signal Trace Path

Complete Signal Flow Map

Source (Operator Input)

HMI_SpeedSetpoint --> MOV --> ConvSpeedRef (Operator enters speed value on HMI panel)

Path 1: Analog Output (Physical Drive)

ConvSpeedRef --> MUL(ConvSpeedRef, ScaleFactor) --> ConvSpeedScaled ConvSpeedScaled --> MOV --> AO_Module:2:O.Data[0] (Scaled value sent to analog output card, slot 2, channel 0)

This is the primary path. Changing the scale factor here directly affects the physical analog output voltage driving the conveyor VFD.

Path 2: High Speed Alarm

ConvSpeedRef --> GRT(ConvSpeedRef, SpeedHighLimit) --> SpeedHighAlarm (Triggers alarm if speed reference exceeds configured limit)

Hidden dependency discovered. If the scaling change increases ConvSpeedRef values, the alarm threshold (SpeedHighLimit) may also need adjustment to prevent nuisance alarms.

Path 3: Run Permissive

ConvSpeedRef --> LES(ConvSpeedRef, SpeedLowLimit) --> ConvRunPermissive (Conveyor only runs if speed reference is above minimum threshold)

Critical interlock found. ConvRunPermissive gates the conveyor run command. If the new scaling produces values below SpeedLowLimit, the conveyor will refuse to start.

Path 4: Acceleration Rate

ConvSpeedRef --> CPT(ConvAccelRate, ConvSpeedRef * 0.15) (Acceleration rate derived as 15% of speed reference)

The acceleration ramp rate is proportional to the speed reference. A scaling change will automatically adjust acceleration, which may need verification for mechanical load limits.

What the Cross-Reference Revealed

23 Usages in Seconds

Found every reference to ConvSpeedRef across 4 routines instantly, including indirect dependencies through derived tags.

Complete Signal Path

Traced the full data flow from HMI operator input through scaling calculation to the physical analog output driving the conveyor VFD.

Hidden Dependencies

Discovered alarm threshold and run permissive logic that would have triggered nuisance alarms or prevented conveyor startup after the scaling change.

Safe Modification

The engineer knew exactly which rungs needed updating before making any change -- scaling, alarm limits, low-speed permissive, and acceleration rate.

Three Steps to Full Visibility

1

Upload Your PLC File

Drag and drop your ACD, L5X, or RSS file. The system parses every program, routine, rung, tag, and I/O mapping automatically.

2

Search for Any Tag

Enter a tag name to find every rung that reads, writes, or references it. Results are grouped by routine with exact rung numbers and instruction types.

3

Trace the Signal Path

Follow the complete data flow from source to destination. See how values propagate through scaling, comparisons, and interlocks across your entire program.

Try It With Your PLC File

Upload an ACD, L5X, or RSS file and find every tag usage in your program.

Common Questions

What is PLC cross-referencing?

PLC cross-referencing is the process of finding every location where a specific tag or variable is used across your entire PLC program. This includes every rung that reads the tag (XIC, GRT, LES, EQU), writes to the tag (OTE, MOV, CPT), or references it as an instruction operand. Cross-referencing is essential before making any program change to ensure you understand all dependencies and avoid breaking downstream logic.

Can I trace a signal path through the entire program?

Yes. Signal tracing follows a tag from its origin (where it is written) through every transformation (scaling, math, comparisons) to its final destinations (physical outputs, alarms, permissives). PLC Company maps the complete signal flow so you can see exactly how a value propagates through your program, including across routine boundaries and through intermediate tags.

What types of tag usages does it find?

The cross-reference search finds all usage types: reads (XIC, XIO, GRT, LES, EQU, GEQ, LEQ, NEQ), writes (OTE, OTL, OTU, MOV, COP, FLL), math operands (ADD, SUB, MUL, DIV, CPT), timer and counter presets and accumulators (TON, TOF, RTO, CTU, CTD), comparison values, and array index references. It also identifies usages within Add-On Instructions and structured tag members.

Does it work with structured tags and UDTs?

Yes. PLC Company fully supports structured tags, User-Defined Types (UDTs), and nested member access. When you search for a base tag, it finds all member references (e.g., searching Motor_1 finds Motor_1.Run, Motor_1.Speed, Motor_1.Fault). You can also search for specific members to narrow results. Array indices and multi-dimensional arrays are supported as well.