An avionics LRU (line-replaceable unit) that comes off an aircraft passes through a well-defined shop flow: induction, functional test, fault isolation, repair, final acceptance, release. Every step produces measurements. In most shops those measurements end their life as an ATE printout or a PDF attached to the release certificate, which means the shop learns nothing from them beyond the single pass/fail verdict. This guide walks through the LRU bench workflow and shows how to capture the same test as structured data you can trend.
The LRU Shop Workflow
A removed unit arrives with its removal paperwork and goes through:
- Induction. Receiving inspection, identity check against the removal record.
- Functional test. Run per the OEM's CMM (component maintenance manual), which defines the test conditions, limits, and maintenance levels for the unit.
- Fault isolation. If the functional test fails, isolate to the board or subassembly.
- Repair. Replace or rework the faulty element.
- Final acceptance test. Full CMM test again, from scratch, on the repaired unit.
- Release. Certificate of release to service backed by the acceptance test evidence.
Note the loop hiding in step 2: a significant share of inducted avionics units pass the functional test with no fault found. Published figures put NFF at 20 to 50 percent of avionics shop inductions. Those units consume a full bench cycle and return to stock with nothing learned, unless the measurements are kept.
What the Bench Measures
A typical avionics LRU acceptance test covers a few functional areas, each with its own measurements and limits from the CMM:
- Power. Input current, supply voltages, inrush behavior.
- Bus communication. ARINC 429 word error rates, response times, BITE message readout.
- Signal and calibration. Output accuracy against reference, delays, signal-to-noise.
- Environmental screening. For intermittent suspects, temperature and vibration during test, informally known as bake and shake.
Write the Acceptance Test as Structured Data
The test below is a final acceptance test for a repaired LRU, written with the TofuPilot framework. The procedure file declares the phases and limits; each phase is a plain Python function reading from the bench.
name: LRU Final Acceptance Testversion: 1.0.0description: Final acceptance test for a repaired avionics LRU before releaseunit: auto_identify: true serial_number: default_value: "LRU000042" part_number: default_value: "622-1234-001"plugs: - name: bench python: plugs.bench:Benchmain: - name: Power Consumption python: phases.power measurements: - name: input_current unit: A validators: - operator: "<=" expected_value: 1.8 - name: Bus Communication python: phases.bus_comms measurements: - name: arinc429_word_error_rate validators: - operator: "<=" expected_value: 0.00001 - name: response_time unit: ms validators: - operator: "<=" expected_value: 50 - name: Output Calibration python: phases.calibration measurements: - name: output_accuracy_error unit: "%" validators: - operator: ">=" expected_value: -0.5 - operator: "<=" expected_value: 0.5def power(measurements, bench): measurements.input_current = bench.read_input_current()def bus_comms(measurements, bench): measurements.arinc429_word_error_rate = bench.read_word_error_rate() measurements.response_time = bench.read_response_time()def calibration(measurements, bench): measurements.output_accuracy_error = bench.read_accuracy_error()class Bench: def read_input_current(self) -> float: return 1.42 def read_word_error_rate(self) -> float: return 0.0 def read_response_time(self) -> float: return 31.5 def read_accuracy_error(self) -> float: return 0.12Run it from the procedure directory:
tofupilot run ./lru-acceptance-test→ Phase: Power Consumption→ Phase: Bus Communication→ Phase: Output Calibration✓ Phase Output Calibration: PASS→ output_accuracy_error = 0.12 % [PASS]✓ Phase Bus Communication: PASS→ arinc429_word_error_rate = 0.0 [PASS]→ response_time = 31.5 ms [PASS]✓ Phase Power Consumption: PASS→ input_current = 1.42 A [PASS]✓ Run complete: PASSThe plug in this example returns fixed values so the test runs anywhere; on a real bench the same functions read from your instruments over VISA, serial, or whatever the fixture speaks. The structure is the point: every value is recorded with its unit and limit, tied to the serial number and part number.
From Test Records to Analytics
Once acceptance tests flow in as structured runs, the analytics come for free:
- Per part number. First-pass yield across all units of a part, the failure Pareto showing which phase and measurement fail most, and Cpk on each measurement showing how much margin the fleet of units really has against the CMM limits.
- Per serial number. The unit history page lists every shop visit and every measured value for one serial. A unit inducted for the fourth time is visible at a glance, along with how its measurements moved between visits.
- Over time. Drift in a measurement across months of inductions points at aging in the field, a supplier change in a repaired subassembly, or the bench itself moving.
None of this requires the OEM's software or data. The measurements are produced by your own bench under your own test procedure; recording them structurally instead of printing them is the only change.
What Good Looks Like
A component shop running this way releases every unit with the same certificate as before, but keeps the evidence behind it queryable. The engineer asked "have we seen this failure before" answers from the part number's history instead of a filing cabinet. The units that keep coming back stand out by retest count. And when a part's measurements start crowding a CMM limit across many serials, the shop sees it while it is still a trend, not yet a backlog.