Skip to content

Auxiliary Engine Performance

Auxiliary engine health, scored.

The main engine moves the ship. The auxiliary engines power everything else — lose them all and you have a blackout. So the question is never just “is this engine healthy?” It is “can the fleet of generators ride through any one of them failing?“

blackout riskredundancy tierSFOC variancecylinder uniformityoverhaul timing

Three stages

Collect telemetry → Score the fleet → Escalate when at risk
  • Collect — every monitored AE parameter from the monthly performance reports: status, running hours, load, per-cylinder temps, SFOC, alarms.
  • Score — redundancy tier, SFOC variance, cylinder spread, overhaul countdown, and one composite blackout-risk number.
  • Escalate — HIGH or CRITICAL auto-routes to the Technical Superintendent with engine evidence and recommended actions.

The redundancy tier

The heart of the review — how much backup is left if one engine drops.

RunningStandbyTierRisk
12+Adequate redundancyLOW
11Minimum redundancyMEDIUM
10No redundancyHIGH
2+0Load-sharing, no backupMEDIUM
0anyBlackout — terminalCRITICAL

Worked example — MV POSUN

3 × MAN 7L21/31 generators. After a refresh:

MAN Energy Solutions
EngineStatusHoursSFOC varNote
AE1RUNNING12,400+6%Cyl 4 hot (+38 °C above mean)
AE2STANDBY8,200OK, available
AE3FAULT11,900LO-pressure trip, 6 days ago

1 running · 1 standby · 1 faulted → redundancy tier HIGH, blackout-risk HIGH. The pipeline tags escalation_required, raises the case to CRITICAL, and messages the TSI inbox:

  1. Root-cause AE3’s LO-pressure trip before next departure.
  2. Replace AE1 cylinder-4 injector at next port — variance plus hot-cylinder signature.
  3. Confirm AE2 standby-readiness drill within 24 h while AE3 is out.

Under the hood

The maths — variance, cost, blackout score

SFOC variance against the design curve, same definition as the main engine:

Variance % = (SFOC_actual − SFOC_design(P)) / SFOC_design(P) × 100

Above 8% is flagged; above 10% escalates. Variance shows up faster on AEs — they run narrower load bands than the ME.

Translated to commercial weight:

Δfuel/day = (SFOC_actual − SFOC_design) × P × 24 / 1e6 [MT/day]
$/day = Δfuel/day × fuel_price

A 1.2 MW AE at 75% load, 5% variance, $700/MT MGO ≈ $120/day, ~$44k/year — usually enough to justify an injector swap.

Cylinder uniformity, deviation from the engine mean:

ΔTᵢ = Tᵢ − mean(T) OK ≤ 30 °C · WARNING 30–50 °C · CRITICAL > 50 °C

Overhaul countdown:

H_remaining = H_interval − (H_current − H_last_overhaul)

Composite blackout-risk that drives the verdict:

R = w₁·N_fault + w₂·(1 − C_margin) + w₃·R_redundancy + w₄·N_overdue

where C_margin = (available kW − load kW) / available kW, and R_redundancy maps LOW=0 / MEDIUM=1 / HIGH=2. The composite maps to LOW / MEDIUM / HIGH / CRITICAL.

What gets captured
DomainData
Engine stateStatus (running / standby / fault / maintenance), running hours, hours since overhaul
LoadLoad %, power output, exporting / importing
Per-cylinderPmax, exhaust temp, FW inlet/outlet temp
AspirationBoost pressure, exhaust back-pressure
FuelSFOC actual, fuel grade in use
Power managementEngines online, blackout-risk inputs
AlarmsActive alarms with severity at sample time

Sources: vessel ERP (register, hours, status, alarms), the AE Performance form filed monthly by the Chief Engineer, and the PMS counter feed (hours since overhaul). Output is one timestamped record per vessel covering every AE plus the power-management context, over the same six-month rolling window used for ME reports.

Six-month rollup logic

Every monitored parameter, per engine, per month. Two gap states matter: a report yet to be submitted (current month, expected) versus a missing report (past month, a compliance issue).

# For each AE (AE1 / AE2 / …) build a six-month grid keyed by parameter
for ae_number in sorted(engines):
for parameter_key in PARAMETERS: # PMAX, EXHAUSTTEMP, …
main_row = [f"{ae_number} {parameter_key}"]
for month_date, month_label in zip(six_months_dates, six_months_labels):
performance = performance_data.get(month_date)
if performance == "No Data Available":
current = (month_date.month == datetime.utcnow().month and
month_date.year == datetime.utcnow().year)
main_row.append("Report yet to be submitted" if current
else "Missing Report")
continue
value = performance["data"].get(f"{parameter_key}AVERAGE")
main_row.append(round(value, 2) if value is not None else "No Data Available")
Escalation triggers
TriggerSeverity
Any engine in FAULTCRITICAL
Blackout-risk score HIGH or CRITICALCRITICAL
Cylinder deviation above 50 °CCRITICAL
Overhaul overdue or under 500 h awayCRITICAL
Exhaust temp above 420 °CCRITICAL
Multiple engines showing WARNINGHIGH
SFOC variance above 8% on any engineHIGH
Load-sharing failureHIGH
Architecture diagram
┌─────────────────────────────────────────┐
│ ERP telemetry · Engine register · PMS │
└─────────────────────┬───────────────────┘
│ monthly reports + specs
┌─────────────────────────────────────────┐
│ Stage 1 — Collection │
│ Per-engine telemetry, hours, alarms │
└─────────────────────┬───────────────────┘
│ structured telemetry
┌─────────────────────────────────────────┐
│ Stage 2 — Analysis │
│ redundancy · load-sharing · SFOC · │
│ rollup · overhaul · blackout-risk │
└─────────────────────┬───────────────────┘
│ verdict + scores
┌─────────────────────────────────────────┐
│ Stage 3 — Expert review │
│ Auto-escalate to TSI when triggered │
└─────────────────────────────────────────┘

Why script-driven

Redundancy tiers, SFOC variance, and blackout weighting all live in deterministic Python. The reviewer interprets the result; the verdict is reproducible. A tier that shifts MEDIUM → HIGH between two consecutive runs is a real event in the data — not a model mood.