Fault Detection and Isolation
Detecting that something is wrong, then locating which component - the FDI layer that every mitigation depends on.
Detect, then isolate
Fault Detection and Isolation (FDI) answers two questions in order: is the plant behaving abnormally, and if so, which component is responsible. Detection without isolation triggers blunt safing; isolation lets the stack take a targeted, minimal action. FDI runs continuously against both machines and feeds the state machine's degraded and safing edges.
Residual-based detection
The core technique is the residual: the difference between a measured signal and the twin's prediction of it. Under nominal operation residuals are small and noise-like. A structured pattern of residuals across signals is a fault signature. Isolation matches that pattern against a fault dictionary built from the FMEA.
import numpy as np
def fdi(meas, pred, cov_inv, signatures, chi2_thresh):
r = meas - pred # residual vector
score = float(r @ cov_inv @ r) # normalized magnitude
if score < chi2_thresh:
return ('nominal', None)
# isolate: nearest fault signature by direction
best = max(signatures, key=lambda s: r @ s.direction / (np.linalg.norm(r)+1e-9))
return ('fault', best.name)
Isolation matrix
A fault-signature matrix maps which residuals light up for which component fault. A column that is unique isolates cleanly; overlapping columns need more sensors or the twin to break the tie.
Once isolated, the fault routes to the smallest sufficient response: a sensor fault to virtual-sensor substitution, an actuator fault to failover, a plasma-physics precursor to disruption mitigation. Ambiguous isolation defaults conservatively toward degradation or safing.