상세 컨텐츠

본문 제목

[JMP+Python] JMP에서 Rainflow Count

카테고리 없음

by e5b 2025. 1. 4. 07:00

본문

반응형
    • JMP는 데이터 및 통계 분석 소프트웨어이다.
    • 신호 분석 전문 프로그램은 아니다.
    • 그래서 하중이나 신호 Data를 Rainflow 또는 Markov 방법으로 신호의 진폭의 개수를 측정하는 모듈이 없다.
    • 지난번에는 진폭 횟수가 분석된 결과 Data Table이 있을 경우 이를 그래프로 볼 수 있는 방법에 대해 설명했다. 
    • 3D 히스토그램이 가장 좋지만 JMP에서는 제공하지 않으므로 Heat-map으로 표현하는 방법에 대해서 말이다. 
 

[JMP] 3D Histogram 대신 Heatmap. 그리고 통계량 변경

JMP는 3D Histogram이 그려지지 않는다. 하중이나 신호 Data를 rainflow 또는 Markov method으로 진폭의 Range-Mean에 해당되는 갯수를 파악하기 위해 사용한다.   이는 기계 부품의 피로데미지나 잔존 수명

e5b-jmp.tistory.com

 

 

  • JMP 18버전부터 Python이 JMP에 Imbeded 되었다. 
  • Script에 직접 Python 코드를 삽입할 수 있다. 
  • JMP의 Data Table과 List 및 Variable 값들을 Python으로 보내서 계산을 하고 결과값을 다시 JMP로 가져와 분석결과를 확인하거나 추가 분석을 할 수 있다. 

출처 : JMP 홈페이지

 

 

  • Python에는 "rainflow" 패키지가 있다.  
  • 설명에는 ASTM E1049-85 rainflow cycle counting algorythm for fatigue analysis 이라고 적혀있다. 
  • ASTM E1049-85 Document 에는 하중의 진폭을 계산하는 여러 알고리즘 중 3개를 설명하고 있다.
  • 이 "rainflow" 패키지에서는 Pagoda Roof 알고리즘을 적용하고 있다.
  • 계산 알고리즘이 빗물이 Pagoda(지붕)을 따라 흘러내는 것에서 착안되어 이름이 지어졌다.  
  • "rainflow" 패키지의 사용 방법은 List 형식의 신호 데이터를 변수로 함수를 실행하면 결과값을 Matrix 형식으로 출력된다는 것을 알 수 있다.  
  • 자세한 내용은 링크를 확인하자.   https://pypi.org/project/rainflow/

 

 

  • "rainflow" 패키지를 이용하여 JMP에서 rainflow count을 할 수 있는 코드를 작성해보자.
  • JSL Script 창에서 Python code를 실행하는 방법과 Python Script창에서 JSL를 실행하는 방법이 있다. 
  • 나는 JSL Scrip에서 Python code를 실행하는 방법을 선호한다.
  • JSL에서 Python code를 작성할 수 있는 코드는 Python Execute()가 있다.
  • Help Script Index를 보면 코드 안에 Python에 입력될 변수와 출력될 변수를 {} 안에 입력하고 python code를 입력하면 된다. 

 

 

  • 분석의 프로세스는 다음과 같이 구상했다. 
    • JMP Data Table에서 rainflow count를 하고 싶은 Column을 선택한다.
    • 코드를 실행하면 어떤 rainflow 방법으로 계산할 것인지 선택한다. 
    • 선택한 후에는 세부적인 설정을 선택, 입력한다. 
    • 계산 결과값을 새로운 Data Table에 출력한다.

 

  • Python 패키지를 사용하기 위해서는 JMP에서 python package를 install 하고 패키지를 import 해야 한다.   
  • python에서 pip install *****  입력하는 것처럼 말이다. 
  • 이에 해당되는 코드가 PythonInstallPackages("패키지명")이다. 
  • 위 분석을 위해서는 Numpy, Pandas, rainflow 패키지가 인스톨되어야 한다.
//###Python pip install###
PythonInstallPackages("numpy");
PythonInstallPackages("pandas");
PythonInstallPackages("rainflow");

 

 

  • 분석을 위해 Open 된 Data Table을 dt라고 정의한다. 
  • Data Table에서 선택된 Column의 이름을 sel_col이라고 정의한다. 
  • sel_col에 해당되는 값들을 List로 만들고 이를 Matrix 형태로 바꾼다. 
  • JMP에서는 List는 {}로 구성되어 있지만 Python은 List가 []로 구성되어 있기 때문이다. 
Names Default To Here( 1 );

dt = Current Data Table();

//Make list to selected column for rainflow count
sel_col = dt << Get Selected Columns( string );
signal = As List( Column( dt, sel_col ) << GetAsMatrix() );
//show(signal);

 

 

  • rainflow 방법을 선택한 New window를 만든다.
  • Combo Box를 만들어서 rainflow 방법을 선택하게 했고 선택한 변수값에 따라 하위 선택 Combo Box가 아래에 Append() 되도록 만들었다. 
  • 하위 선택 Combo Box는 Expr()으로 만들어서 Append(Eval())로 디스플레이되도록 했다. 
  • Combo Box에서 선택한 값에 따라 기존에 선택된 하위 선택 Combo Box가 제거되고 새로운 Combo Box가 나타나게 하기 위해 Try(Combo Box 변수명 << delete box) 코드를 사용했다. 
  • 예전에는 if문을 사용했는데 Try() 코드가 훨씬 수월하다. 
  • 선택을 하고 최종적으로 OK 버튼을 클릭하면 rainflow 방법, 하위 세팅 변수값을 Get() 하도록 했다.  

  • Python Execute() 함수를 이용해서 Python "rainflow" 패키지를 실행하는 Python code를 입력했다.
  • signal과 설정 변수를 input으로 하여 조건에 따라 각각의 rainflow 코드가 실행되도록 했다.
  • 결과값을 새로운 Data Table로 만들어지도록 했고, 결과값을 Heat Map으로 표현되도록 구성했다. 

Pagoda roof 방식 Full info 설정시 결과값

 

 

  • "rainflow" 패키지는 pagofa roof 방식만 사용한다고 앞서 말했다.
  • 그 외 다른 방법도 추가하고 싶었다. 특히 4 Point 방식은 적용하고 싶었다.
  • 아무리 찾아봐도 4 Point 방식의 Python 패키지는 찾지 못했고,
  • LLM을 이용하여 Python code를 만들어보고 싶어 했지만, 실력이 부족하여 만든 code 마다 결과값에 문제가 있었다. 
  • 좀 더 자료를 찾아서 향후에 추가하고 싶다.

 

  • 구글에서 공개된 ASTM E1049-85 문서에는 Range-pair 방식에 대한 설명이 있었다.
  • 이를 프롬프트로 만들어서 Claude를 이용 Python code를 생성했고 이후 조금 튜닝을 해서 적용을 했다. 
  • 결과값에는 큰 차이가 없음을 확인했다. 

 

 

 

반응형