Variable Speed Bearing Vibration Analysis
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);
}