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. 当然,它不会按预期工作。输入参数是两个线性斜率。

  1. 烤箱温度将在 5 分钟 (Tw) 内从20C增加到70C
  2. 烤箱将在 2 分钟内冷却至70C20C(Tc)
  3. 步长应为1C(Ts)

因此该功能将控制继电器,该继电器将打开或关闭烤箱。我试图只搜索那些 ON/OFF_TIME 常量,但看起来我需要更严肃的方法。

问题是 - 如何计算ON_TIMEOFF_TIME

4

2 回答 2

0

您的常量 ON_TIME 和 OFF_TIME 必须分别代表 5 分钟和 2 分钟。您期望您的 T 以 50C/300 秒的速率变化 50C,但在 7 秒内,这将导致上升周期变化 1.17C,下降周期将 T 降低 0.33C,因此每 7 秒您将得到 T+ =0.83C

您的 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

我不确定这个,但我要试一试大便和咯咯笑。

您声明K1为 50/300,表示 300 秒(5 分钟)内的 delta T,并且您被限制为 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秒。此循环结果为 70 度,因为它模拟每个请求 300 秒。

        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

In terms of your question of how to calculate the on/off time I feel it's accurate.

于 2013-01-08T22:27:53.363 回答