0
    double K1 = 50.0 / 300; // Warm up, 5 min, 20 - 70. Subject to change, if wrong
    double K2 = -50.0 / 120; // Cool down, 2 min, 20 - 70. Subject to change, if wrong

    double T = 20;
    const int ON_TIME = 7; // seconds. this should be calculated
    const int OFF_TIME = 2; // seconds. this should be calculated
    int onCounter = ON_TIME;
    int offCounter = 0;
    for (int t = 0; t < 1800; t++)
    {
        if (onCounter > 0)
        {
            onCounter--;
            T += K1;
        }
        else if(offCounter == 0)
        {
            onCounter = ON_TIME;
            // switch relay off here
        }

        if (offCounter > 0)
        {
            T += K2;
            offCounter--;
        }
        else if(onCounter == 0)
        {
            offCounter = OFF_TIME;
            // switch relay on here
        }
        Console.WriteLine("t: {0}, T: {1:F2}", t, T);
    }

この関数が行うことは、オーブン温度を 30 分間 (Tt) まで直線的にシミュレートすること70Cです。もちろん、期待どおりには機能しません。入力パラメータは 2 つの線形勾配です。

  1. オーブンの温度が から20Cまで70C5 分間 (Tw)上昇します。
  2. オーブンは から70Cまで20C2 分間冷却されます (Tc)
  3. ステップは1C(Ts)

したがって、関数はリレーを制御し、オーブンをオンまたはオフにします。これらの ON/OFF_TIME 定数を検索しようとしましたが、もっと真剣なアプローチが必要なようです。

ON_TIME問題は -とを計算する方法OFF_TIMEです。

4

2 に答える 2

0

定数 ON_TIME と OFF_TIME は、それぞれ 5 分と 2 分を表す必要があります。T が 50C/300 秒のレートで 50C 変化すると予想していますが、7 秒で上昇サイクルでは 1.17C 変化し、下降サイクルでは T が 0.33C 減少するため、7 秒ごとに T+ になります。 =0.83℃

ON_TIME と OFF_TIME は秒単位で表すか、*60 を使用できます。

ループの途中でオーブンを暖かく保とうとしているかどうかはわかりません。このアルゴリズムでは、4 つの加熱/冷却サイクルが発生し、リレーがオンの位置になります。それは望ましくありません。本物のオーブンで:)

代わりに、次のアプローチを検討してください。

double dTemp = 50.0;
int cycleFor = 30*60;
int heatFor = 5*60;
int coolFor = 2*60;
double tBase = 20.0;
double temp = tbase;
for (int t = 0; t<cycleFor; t++){
   if (t<heatFor)
       temp = tBase + (t*dTemp/heatFor);
   else if (t>cycleFor - coolFor)
       temp = tBase + ((cycleFor-t)*dTemp/coolFor)
}
于 2013-01-08T20:45:14.203 に答える
0

これについてはよくわかりませんが、うんちと笑いのために試してみます.

K1300 秒 (5 分) にわたるデルタ T を表す 50/300 として宣言し、1 度のステップに制限されています。

問題は、1 学位を取得するのに何秒待たなければならないかということではありませんか? じゃあ答えじゃないのか…

 1/6(time) = 1 -> time = 1/(1/6) -> time = 6 seconds

同様に、冷却についても

 5/12(time) = 1 -> time = 1/(5/12) -> time = 12/5 seconds -> time = 2.4 seconds

以前のコメントの誤りに気づき、あなたの質問をよりよく理解していると思います。まだ間違っていたら教えてください、すぐに削除します。

アップデート

あなたの問題は他の何かにあるかもしれません。私は自分の数学が正しいと確信していたので、証明を示す単純なループを書きました。

これが加熱ループです。経過時間は6秒と言いました。このループは、要求ごとに 300 秒をシミュレートするため、70 度になります。

        for (int fiveMinutes = 0; fiveMinutes < 300; fiveMinutes += 6)
        {
            T += (K1 * 6);
            Console.WriteLine("t: {0}, T: {1:F2}", fiveMinutes + 6, T);
        }

結果:

t: 6, T: 21.00
t: 12, T: 22.00
t: 18, T: 23.00
/*
.....
*/
t: 300, T: 70.00

以下の冷却ループは 20 度になります。

        for (float twoMinutes = 120f; twoMinutes > 0; twoMinutes -= 2.4f)
        {
            T += (K2 * 2.4);
            Console.WriteLine("t: {0:F2}, T: {1:F2}", twoMinutes - 2.4f, T);
        }


t: 117.60, T: 69.00
t: 115.20, T: 68.00
/*
...
*/
t: 0, T: 20.00

オン/オフ時間を計算する方法についての質問に関しては、正確だと思います。

于 2013-01-08T22:27:53.363 に答える