JMPコミュニティの皆様へ
温度を連続的に循環させるオーブンを持っています(高温から低温へ、次に低温から高温へ、これを繰り返します)。
オーブンは温度と時間の記録を提供します。
Y 軸に温度、X 軸に時間をプロットすると、添付のグラフが得られます。
特定の温度範囲(この場合は 0dgC から 130dgC の間)内での温度変化率を計算する必要があります。
例えば:
緑色の固定情報は、ランプダウン (130dgc から 0dgc) を示しています。
それぞれの時間から、温度変化率(130 を時間差で割った値)を計算できます。
紫色のピン留めされた情報は、ランプアップ (0dgC から 130dgc) を示しています。
次に、同じ操作を行って温度変化率を計算します。
緑(ランプダウン)と紫(ランプアップ)= 1サイクル
この場合、ここでは数サイクル全体にわたってすべてのランプアップとランプダウンを計算する必要があります。
実際には、例としていくつかのサイクルのみを示していますが、実際には数百のサイクルがあります。
私の質問は、各サイクルのランプアップとランプダウンを計算し、それを別のデータ テーブルに保存するにはどうすればよいかということです。
もちろん、手動で行うこともできますが、これは面倒すぎます。
これを自動化する方法、または「より簡略化された」方法で実行できますか?
データを添付します。
オーブンは 2 列のデータ (時間と温度) のみを記録します。サイクル (第 1 サイクル、第 2 サイクルなど) のデータはありません。
長いメールになってしまい申し訳ありません。アドバイスをいただければ幸いです。
Br、
クリス
例えば数式を利用してこれを行うことができます。まずは州の列を追加します。

If(
0 < :Temp Profile < 130 & Dif(:Temp Profile) < 0, curstate = "Down Ramp",
0 < :Temp Profile < 130 & Dif(:Temp Profile) > 0, curstate = "Ramp Up",
curstate = "No Ramp"
)
そこからさらに計算を追加できます。
こんにちは@ChrisLooi さん
@jthiの考えに沿って、何百 (何千?) ものサイクルを処理する場合の自動化に役立つ JSL をいくつか追加したいと思いました。以下は、データ セット全体で機能するはずのコードですが、提供されたデータ セットのみでテストされています (ありがとうございます。そうしていただけると非常に助かります!)。コードにはコメントを付けませんでしたが、意味がわからない部分があればお知らせください。説明させていただきます。
Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "State",
"Character",
"Nominal",
Formula(
If(
0 <= :Temp Profile < 130 & Dif( :Temp Profile ) < 0, "Ramp down",
0 <= :Temp Profile < 130 & Dif( :Temp Profile ) > 0, "Ramp up",
"No Ramp"
)
)
);
dt << New Column( "Cycle No", "Numeric", "Ordinal" );
dt << New Column( "Phase", "Character", "Nominal" );
l = 1;
:"Cycle No"n[1] = 1;
For( i = 2, i <= N Rows( dt ) - 1, i++,
If(
(:State[i] == :State[i - 1]), :"Cycle No"n[i] = l,
((:State[i] != :State[i - 1]) & (:State[i] == "Ramp down" & :State[i - 1] == "No Ramp")),
:"Cycle No"n[i] = l;
:Phase[i] = "Start";,
((:State[i] != :State[i - 1]) & (:State[i] == "No Ramp" & :State[i - 1] == "Ramp down")),
:"Cycle No"n[i] = l;
:Phase[i - 1] = "End";,
((:State[i] != :State[i - 1]) & (:State[i] == "Ramp up" & :State[i - 1] == "No Ramp")),
:"Cycle No"n[i] = l;
:Phase[i] = "Start";,
((:State[i] != :State[i - 1]) & (:State[i] == "No Ramp" & :State[i - 1] == "Ramp up")),
:Phase[i - 1] = "End";
l++;
:"Cycle No"n[i] = l;
)
);
:"Cycle No"n[N Row( dt )] = l;
dt << Row Selection( Select Where( :Phase == "Start" ) );
dt << Row Selection( Select Where( :Phase == "End" ), Current Selection( "Extend" ) );
dtsubset = dt << Subset( Selected Rows( 1 ), Selected columns only( 0 ), Suppress Formula Eval( 1 ) );
dt << Clear Select;
dt_results = dtsubset << Summary(
Group( :State, :Cycle No ),
Mean( :Time ),
Mean( :Temp Profile ),
Subgroup( :Phase ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 )
);
Close( dtsubset, no save );
dt_results << New Column( "Temp Rate Change (°C/sec)",
"Numeric",
"Continuous",
Formula( (:"Temp Profile, End"n - :"Temp Profile, Start"n) / (:"Time, End"n - :"Time, Start"n) )
);
dt_results << Sort( By( :Cycle No, :"Time, End"n, :State ), Order( Ascending, Ascending, Ascending ), Replace Table, Suppress Formula Eval( 0 ) );
dt_results << Delete Columns( :"N Rows"n );
もちろん、関心のある温度範囲を変更する機能を追加することで、より柔軟にすることができます (ここでは、0 と 130 としてハードコードされています)。ただし、これにより複雑さも増します。
とにかく、これが役に立つことを願っています!
DS
助けてくれたjthiとSDF1に感謝します。感謝します。