PHM 프로젝트 (2-5)
포스트
취소

PHM 프로젝트 (2-5)

내가 한 부분 위주로 결과만 정리함

불평형 선풍기 결함 신호 해석

해당 문제의 경우 진동 신호 데이터와 실제 선풍기 이외에 어떤 추가 데이터도 제공되지 않았음. 근데 회전체라는 게 회전 수를 알아야 그걸 기준점으로 신호를 해석하는 거잖아요. 그래서 나름대로 선풍기의 스펙을 알아내고자 시도했으나 RPM은 구체적으로 알아낼 수 없었고, 아래의 정보 정도로 요약됨.

  • 모델명: 홍진테크 인더스 IN-M3012
  • 금속 재질로 구성됨, 4엽, 바람 세기 3단 구성.
  • RPM 정보 확인 불가, 정격 전력 AC 220V 60Hz
  • 모터 상단 수직에 가속도 센서 부착
    • 센서 감도: 100mV/g
  • 날개에 구멍 뚫기 및 볼트 부착으로 질량 불평형 형성됨
  • 단수 별 불평형 전후 진동 스펙트럼 비교 → 당연히 진폭이 크게 상승하고 주파수 그래프가 지저분해짐


  • 단수 별 1X 요약
    • 정상 상태
      • 1단: 1X 주파수 16Hz
      • 2단: 1X 주파수 18Hz
      • 3단: 1X 주파수 21Hz
    • 불평형 상태
      • 1단: 1X 주파수 15Hz
      • 2단: 1X 주파수 17Hz
      • 3단: 1X 주파수 20Hz
  • 1X를 해당 값으로 설정한 이유
    • 타코미터 측정 실패: 마커 없음, 선풍기 및 손 떨림
    • 일반적으로 가정용 선풍기의 RPM은 공개되지 않아 주파수 데이터와 일반적인 성능을 기반으로 결정: 보통 1100~1300RPM 수준의 모터 사용
      • 1200RPM = 20Hz 내외의 값을 최대 속도로 가정
    • 정상 상태의 각 단에서 가장 큰 피크를 보였던 주파수 확인: 16Hz, 18Hz, 21Hz → 각각 1, 2, 3단에 해당
    • 비정상 상태의 각 단에서 기존 1X와 유사하고 가장 큰 피크를 보이는 주파수: 15Hz, 17Hz, 20Hz
      • 밸런싱 결함으로 각 단에서 1Hz씩 속도 감소 ← 이게 무슨 말이냐면, 선풍기에 뚫은 구멍과 새로 꽂은 볼트의 직경은 유사하지만, 구멍은 얄팍한 반면 볼트는 두꺼워서 잃은 질량보다 얻은 질량이 더 많아졌고, 이 점이 모터의 속도를 아주 약간 감소시키는 데에 일조하지 않았을까 짐작함
  • 정상 상태 단수 별 속도 스펙트럼
    • 어느 정도 진동 존재하나 1X와 4X(BPF) 및 기타 배수 성분 확인됨 (보라색 마커)
      • 정상 진동 원인: 선풍기 제조 시 생긴 공차(정상 범위 이내)로 인한 미세 마모 및 유격, 날개가 공기를 밀어내며 생긴 마찰 및 와류, 공차로 인한 불완전한 밸런싱 등
        1. 가정용 선풍기 정도에 아주 엄격한 공차를 요구하는 것은 과함. 내부 부품들이야 잘 만들어야겠지만 외부 철망 정도는 대충 붙어있기만 하면 됨. → 여기서 허용 공차가 발생하고, 뭐 오래 썼으면 어느 정도 마모도 있을 거고 유격도 있겠지.
        2. 바람을 일으키는 게 그 목적인 장비이기 때문에 공기 저항의 영향을 꽤 받을 것. 공기와의 마찰이나 와류 등이 몸체 흔들림에 영향을 줄 것이다
        3. 1번의 이유로 밸런싱은 당연히 완전하지 않을 것. 왜냐면 그정도로 요구되는 장비가 아니니까.
    • 1X와 무관한 성분(노란색 마커) 확인되었으나, 120Hz대의 성분은 60Hz로 입력되는 전력 사양 때문 ← 센서나 선풍기에 입력되는 전류가 센서 측정값에 같이 나타날 수 있다고 한다.
  • 정상/불평형 비교
    • 가장 차이가 극명한 3단 기준으로 비교
    • 1X 주파수가 정상 상태에 비해 1Hz 감소: 날개에 추가된 볼트의 무게 및 그로 인한 불평형 때문
    • 다수의 피크 사이에 20Hz 간격의 일정한 사이드밴드 형성. 이로 인해 현재 불평형 문제가 있음을 확인할 수 있음
    • 정상 상태에 비해 심해진 진동(특히 저주파): 기기가 전체적으로 크게 흔들리고 있음

Raw 데이터 신호 처리 알고리즘 작성

물론 cursor가 썼다.. 내가 한 것은 제미니와 커서에게 상황을 이해시키고 적절한 코드를 쓰도록 지시하기

  • 알고리즘 개요
    1. 데이터 로드
    2. 시간 축 설정
    3. FFT 처리 (주파수 도메인 변환)
    4. 그래프 그리기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
      import pandas as pd
      import numpy as np
      import matplotlib.pyplot as plt
      from scipy.fft import fft, fftfreq
    
      # 한글 폰트 설정
      FONT_FAMILY = "Malgun Gothic"  # Windows 한글 폰트
      FONT_SIZE = 13
      TITLE_FONT_SIZE = 15
    
      # ========== 설정 파라미터 ==========
      file_path = r"Extruder Gear Bearing결함.csv"
      to_save = "img/"
      fsize = (60, 10)
      data_col_idx = 1        # 두 번째 컬럼(Series0)이 진동 데이터
      time_col_idx = 0        # 첫 번째 컬럼(X)이 시간 데이터
      has_header = True       # 헤더가 있음 (X, Series0)
      fs_input = None         # 시간 열이 없을 경우 수동으로 입력할 샘플링 레이트(Hz)
    
      # ========== 1. 데이터 로드 ==========
      df = pd.read_csv(file_path, header=None if not has_header else 0)
      data_col_name = df.columns[data_col_idx] if has_header else f"Column {data_col_idx}"
      y = df.iloc[:, data_col_idx].values
      # ========== 2. 시간 축 설정 ==========
      t = df.iloc[:, time_col_idx].values
      dt = np.mean(np.diff(t))
      fs = 1 / dt
      print(f"분석 정보: 데이터 길이={len(y)}, 추정/입력 Fs={fs:.2f} Hz")
      # ========== 3. FFT 처리 (원본 데이터) ==========
      N = len(y)
      yf = fft(y)
      xf = fftfreq(N, dt)[:N//2]
      # 진폭 스펙트럼: DC 성분은 1/N, 나머지는 2/N
      fft_magnitude = np.abs(yf[0:N//2])
      fft_magnitude[0] = fft_magnitude[0] / N  # DC 성분
      fft_magnitude[1:] = 2.0 / N * fft_magnitude[1:]  # 나머지
      # ========== 6. 그래프 그리기 ==========
      # (1) 시간 도메인 원본 데이터
      plt.figure(figsize=fsize)
      plt.plot(t, y, label='Raw Data (Time Domain)', color='blue')
      plt.title(f'Time Domain: {data_col_name}')
      plt.xlabel('Time (s)')
      plt.ylabel('Amplitude')
      plt.grid(True)
      plt.legend()
      plt.tight_layout()
      plt.savefig(to_save + 'time_domain_original.png')
      plt.savefig(to_save + 'time_domain_original.svg')
      plt.show()
      # (2) FFT (주파수 도메인) - 원본 데이터
      plt.figure(figsize=fsize)
      plt.plot(xf, fft_magnitude, label='FFT Magnitude', color='red')
      plt.title('Frequency Domain (FFT) - Original Data')
      plt.xlabel('Frequency (Hz)')
      plt.ylabel('Magnitude')
      plt.grid(True)
      plt.legend()
      plt.tight_layout()
      plt.savefig(to_save + 'frequency_domain_original.png')
      plt.savefig(to_save + 'frequency_domain_original.svg')
      plt.show()
    
  • 분석 대상 데이터
    • 압축기 감속기 기어/베어링 손상 사례
    • 기타 설비 사양 공개되지 않음
  • 알고리즘 처리 결과
    • 사실 1단 기어 주파수와 2단 기어 주파수 피크 표시는 짐작하여 표시한 것임. 왜냐? 기어 이빨 갯수도 몰랐으니까. 강사님의 도움을 많이 받았음.
    • 저주파 쪽에 있는 성분이야 GMF라고 짐작하지만 고주파 쪽에 있는 저 파동은 사실 뭔지 잘 모름. 그래서 발표에서도 은근슬쩍 말 안했다. 나중에 물어볼걸 그랬나 싶음.

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.

PHM 프로젝트 (2-4)

현업 솔루션 이해 (1)