Variable Speed Bearing Vibration Analysis

Available on: Flexs Q5C

Monitors a bearing on a variable-speed machine. Captures a high-frequency FFT to track lubrication film health (3.5–12 kHz RMS band), then an enveloped capture for bearing fault detection, measures RPM from the motor's electrical peak, computes fault frequencies from bearing geometry, and logs all amplitudes to the Front Bearing io group as well demonstrating how to make the measurements available over ModBUS.

setEnv("led","green");


let mbData = bin.alloc(128); // Create a data buffer
modbus.setData(mbData); // Use the buffer for modbus requests

while(run()){


// capture a high frequency fft to monitor lubrication film health
// a degraded lubrication film results in metal / metal contact which produces high frequency vibrations that can be analyzed

scope.getWaveform({ "ch": 0, "osr": 128, "size": 4096, "fft": true, "bandpass": false, "fMin": 0, "fMax": 12000, "demod": false, "demodRatio": 1 });

  // extract the amplitudes for the bands we're interested in (in our case 3500hz to 6200hz)
  let hf =  scope.getAmplitudes(
  {
    lubricationFilm:[3500,12000,"RMS"]
  }
);

// capture a fft with frequency demodulation / enveloping to diagnoose bearing failure conditions, fMin could also be set at 3-4khz to filter for just bearing faults
scope.getWaveform({ "ch": 0, "osr": 128, "size": 4096, "fft": true, "bandpass": true, "fMin": 0, "fMax": 16000, "demod": true, "demodRatio": 32 });

// determine the motor rpm
let speed = scope.getPeak(50, // min freq
                          70 // max freq
                          );

let rpm = speed.freq * 120 / 10; // 10 pole motor

print("RPM:",rpm);


let freqs = {
  "Fundamental": rpm/60,
  "Fundamental Train":0.0071*rpm,
  "Inner Ring Defect":0.1717*rpm,
  "Outer Ring Defect":0.1283*rpm,
  "Roller Defect":	0.0548*rpm,
  "Pelton Cup":	rpm/60*16,
  "Generator Pole":	rpm/60*10,
};

// extract amplitude data from the FFT
let amplitudes = scope.getAmplitudes(	freqs, // freq list
										3, // 3 bins wide
                    					"MAX"); // aggregation option "MAX","AVG","SUM"


amplitudes.speed = rpm; // datalog the speed
for(let i in hf){ amplitudes[i] = hf[i];} // combine our hf measurements so that they are logged too
io["Front Bearing"] = amplitudes;


// Move the readings to our modbus registers
mbData.seek(0);// Start at the beginning of our buffer
for(let i in amplitudes){ // Loop through our amplitudes object
mbData.write("F32BADC",amplitudes[i]); // write each amplitude to a register
}

// Measurements could also be sent with EtherIP, HTTP, MQTT or uploaded to an FTP server 

waitMS(100);

}