Skip to the content.

Alarm-Triggered Process Logic Integration Example

Overview

ProcessLogicAlarmIntegratedExample.java demonstrates a complete, production-ready integration of the NeqSim alarm system with process control and safety logic. This example shows how alarms can trigger automatic control actions, safety responses, and emergency shutdown sequences in a layered protection architecture.

Key Features

1. Layered Safety Architecture with Alarm Integration

The example implements a comprehensive 5-layer safety system:

Layer 1 (Alarms - SIL-0):
  ├─ HI/LO Alarms → Operator notification and manual intervention
  │
Layer 2 (Alarms + Control - SIL-1):
  ├─ HIHI/LOLO Alarms → Automatic control responses (valve throttling, etc.)
  │
Layer 3 (HIPPS - SIL-2):
  ├─ Independent fast-acting pressure protection
  ├─ 2oo3 voting logic on pressure transmitters
  ├─ Triggered by PT-HIPPS HIHI alarms (59 bara)
  │
Layer 4 (ESD - SIL-2):
  ├─ Emergency shutdown system
  ├─ Triggered by PT-ESD-001 HIHI alarm (60 bara) or manual button
  ├─ Full isolation and blowdown sequence
  │
Layer 5 (PSV - Mechanical):
  └─ Pressure safety valve (65 bara set pressure)

2. Multi-Variable Alarm Monitoring

Pressure Monitoring (PT-101)

AlarmConfig pressureAlarmConfig = AlarmConfig.builder()
    .highLimit(53.0)          // HI: Operator notification
    .highHighLimit(56.0)      // HIHI: Auto throttle valve
    .deadband(0.5)
    .delay(1.0)
    .unit("bara")
    .build();

Alarm Actions:

Temperature Monitoring (TT-101)

AlarmConfig temperatureAlarmConfig = AlarmConfig.builder()
    .highLimit(40.0)          // HI: Operator notification
    .highHighLimit(55.0)      // HIHI: Trigger cooling
    .deadband(2.0)
    .delay(3.0)
    .unit("C")
    .build();

Alarm Actions:

Flow Monitoring (FT-201)

AlarmConfig flowAlarmConfig = AlarmConfig.builder()
    .lowLimit(100.0)          // LO: Operator notification
    .lowLowLimit(50.0)        // LOLO: Trigger shutdown
    .highLimit(2000.0)        // HI: High flow warning
    .deadband(10.0)
    .delay(5.0)
    .unit("m3/hr")
    .build();

Alarm Actions:

Level Monitoring (LT-101)

AlarmConfig levelAlarmConfig = AlarmConfig.builder()
    .lowLowLimit(20.0)        // LOLO: Emergency shutdown
    .lowLimit(30.0)           // LO: Operator notification
    .highLimit(70.0)          // HI: High level warning
    .highHighLimit(85.0)      // HIHI: Critical high level
    .deadband(2.0)
    .delay(2.0)
    .unit("%")
    .build();

Alarm Actions:

3. Safety-Critical Alarm Configuration

HIPPS Protection (PT-HIPPS-1/2/3)

AlarmConfig hippsAlarmConfig = AlarmConfig.builder()
    .highHighLimit(59.0)      // Immediate HIPPS closure
    .deadband(0.2)            // Minimal deadband
    .delay(0.0)               // No delay - safety critical
    .unit("bara")
    .build();

2oo3 Voting Logic:

ESD Trigger (PT-ESD-001)

AlarmConfig esdAlarmConfig = AlarmConfig.builder()
    .highHighLimit(60.0)      // Full ESD sequence
    .deadband(0.5)
    .delay(0.0)               // Immediate ESD trigger
    .unit("bara")
    .build();

Demonstration Scenarios

The example runs six comprehensive scenarios demonstrating alarm-triggered logic:

Scenario 1: Normal Operation

Scenario 2: HI Alarm - Operator Notification

Scenario 3: HIHI Alarm - Automatic Control

Scenario 4: HIPPS Activation

Scenario 5: ESD Triggered by Alarm

Scenario 6: Low Level Emergency Shutdown

Code Structure

Main Components

// 1. Build process system
ProcessSystem processSystem = buildProcessSystem();

// 2. Create alarm manager
ProcessAlarmManager alarmManager = new ProcessAlarmManager();

// 3. Setup instrumentation with alarms
InstrumentationSetup instruments = 
    setupInstrumentationWithAlarms(processSystem, alarmManager);

// 4. Setup process logic
ProcessLogicSetup logicSetup = setupProcessLogic(processSystem, instruments);

// 5. Run scenarios
runAlarmTriggeredScenarios(runner, alarmManager, instruments, 
                          logicSetup, processSystem);

Alarm Evaluation Loop

private static List<AlarmEvent> evaluateAndDisplayAlarms(
    ProcessAlarmManager alarmManager,
    InstrumentationSetup instruments, 
    ProcessSystem system, 
    double dt) {
    
    List<AlarmEvent> allEvents = new ArrayList<>();
    
    // Run process to get current values
    system.run();
    
    // Evaluate each measurement device
    double sepPressure = instruments.separatorPT.getMeasuredValue();
    allEvents.addAll(alarmManager.evaluateMeasurement(
        instruments.separatorPT, sepPressure, dt, simulationTime));
    
    // ... evaluate other transmitters ...
    
    return allEvents;
}

Alarm-Triggered Control Actions

private static void handlePressureHIHIAlarm(List<AlarmEvent> events, 
                                           ProcessSystem system,
                                           ProcessAlarmManager alarmManager) {
    
    for (AlarmEvent event : events) {
        if (event.getType() == AlarmEventType.ACTIVATED && 
            event.getLevel() == AlarmLevel.HIHI &&
            event.getSource().equals("PT-101")) {
            
            // Automatic control response
            ControlValve inletValve = 
                (ControlValve) system.getUnit("Inlet Control Valve");
            inletValve.setPercentValveOpening(50.0);
            
            // Run system with new valve position
            system.run();
            
            // Acknowledge alarm after action
            alarmManager.acknowledgeAll(simulationTime);
        }
    }
}

Alarm-Triggered Safety Logic

private static void handleHIPPSAlarm(List<AlarmEvent> events, 
                                    ESDLogic hippsLogic,
                                    ProcessAlarmManager alarmManager) {
    
    for (AlarmEvent event : events) {
        if (event.getType() == AlarmEventType.ACTIVATED && 
            event.getLevel() == AlarmLevel.HIHI &&
            event.getSource().startsWith("PT-HIPPS")) {
            
            // Activate HIPPS logic
            hippsLogic.activate();
            
            alarmManager.acknowledgeAll(simulationTime);
            break; // Only need one HIPPS transmitter to trigger
        }
    }
}

Output Reports

The example generates comprehensive reports:

1. Alarm Status Display

Shows currently active alarms with acknowledgement status:

┌─────────────────────────────────────────────────────────┐
│ ALARM STATUS: After HIHI Alarm + Auto Control          │
├─────────────────────────────────────────────────────────┤
│ Active Alarms: 1                                        │
├─────────────────────────────────────────────────────────┤
│ [ACK] HIHI - PT-101        : 57.00                     │
└─────────────────────────────────────────────────────────┘

2. Alarm History Report

Shows all alarm events with timestamps:

╔════════════════════════════════════════════════════════════════╗
║                    ALARM HISTORY REPORT                        ║
╠════════════════════════════════════════════════════════════════╣
║  Total Events: 12                                              ║
╠════════════════════════════════════════════════════════════════╣
║  Recent Events (last 10):                                      ║
║  ⚠ 30.0s ACTIVATED  PT-101          HI   53.50                ║
║  ⚠ 35.0s ACTIVATED  PT-101          HIHI 57.00                ║
║  ✋ 35.5s ACKNOWLEDGED PT-101       HIHI 57.00                ║
║  ...                                                           ║
╚════════════════════════════════════════════════════════════════╝

3. Alarm Statistics

Aggregated statistics by type and level:

╔════════════════════════════════════════════════════════════════╗
║                    ALARM STATISTICS                            ║
╠════════════════════════════════════════════════════════════════╣
║  Total Activations:     8                                      ║
║  Total Clearances:      3                                      ║
║  Total Acknowledgements: 5                                     ║
║                                                                ║
║  By Level:                                                     ║
║    HIHI (Critical High): 4                                     ║
║    HI (High):            2                                     ║
║    LO (Low):             1                                     ║
║    LOLO (Critical Low):  1                                     ║
╚════════════════════════════════════════════════════════════════╝

Integration Patterns

Pattern 1: Alarm-Triggered Control Adjustment

// Monitor for HIHI alarm
if (alarm.getLevel() == AlarmLevel.HIHI) {
    // Implement automatic control response
    valve.setPercentValveOpening(safeValue);
    system.run();
    alarmManager.acknowledgeAll(time);
}

Pattern 2: Alarm-Triggered Safety Logic

// Monitor for safety-critical alarm
if (alarm.getLevel() == AlarmLevel.HIHI && 
    alarm.getSource().equals("PT-ESD-001")) {
    // Activate safety logic
    esdLogic.activate();
}

Pattern 3: Alarm Acknowledgement Workflow

// Evaluate alarms
List<AlarmEvent> events = evaluateAlarms();

// Process events
for (AlarmEvent event : events) {
    if (event.getType() == AlarmEventType.ACTIVATED) {
        // Log alarm activation
        logger.logAlarm(event);
        
        // Notify operator
        operatorPanel.displayAlarm(event);
    }
}

// Acknowledge after operator review or automatic action
alarmManager.acknowledgeAll(currentTime);

Best Practices Demonstrated

  1. Layered Protection: Multiple independent protection layers from alarms to mechanical safety devices

  2. Appropriate Delays:
    • Safety-critical alarms: 0 seconds (immediate)
    • Process alarms: 1-5 seconds (avoid nuisance trips)
  3. Deadband Configuration:
    • Safety alarms: Minimal (0.2-0.5)
    • Process alarms: Moderate (1-2% of range)
  4. Alarm Actions:
    • HI/LO: Operator notification
    • HIHI/LOLO: Automatic control or shutdown
  5. Acknowledgement:
    • Acknowledge after automatic actions
    • Track acknowledgement status
  6. Comprehensive Logging:
    • All alarm events recorded
    • Statistics tracked by type and level
    • History available for analysis

Running the Example

# Compile
mvn compile

# Run
mvn exec:java -Dexec.mainClass="neqsim.process.util.example.ProcessLogicAlarmIntegratedExample"

Key Takeaways

Consistent Framework: All alarms configured using the same AlarmConfig builder pattern

Flexible Triggering: Alarms can trigger operator notifications, control actions, or safety logic

Centralized Management: ProcessAlarmManager coordinates all process alarms

Safety Integration: Seamless connection between alarms and SIL-rated safety systems

Production-Ready: Complete with logging, statistics, and acknowledgement workflows

ISA-18.2 Aligned: Four standard alarm levels (LOLO, LO, HI, HIHI)

This example provides a complete template for implementing alarm-triggered process control and safety logic in industrial applications using NeqSim.