c# - 温控功能/算法

标签 c# c algorithm

    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 分钟内的 toastr 温度 (Tt),线性上升至 70C。当然,它并没有按预期工作。输入参数是两个线性斜率。

  1. toastr 温度将在 5 分钟内从 20C 升至 70C(Tw)
  2. toastr 将在 2 分钟内从 70C 冷却至 20C (Tc)
  3. 步骤应为1C (Ts)

因此该函数将控制继电器,从而打开或关闭 toastr 。 我试图只搜索那些 ON/OFF_TIME 常量,但看起来我需要更认真的方法。

问题是 - 如何计算 ON_TIMEOFF_TIME

最佳答案

我不确定这个,但我打算尝试一下大便和咯咯笑。

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

关于你如何计算开/关时间的问题,我觉得它是准确的。

关于c# - 温控功能/算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14223445/

相关文章:

c# - 解析 XML 并用元素值填充字符串

c# - 导航到页面期间 Windows Phone 设备中的 ExecutionEngineException

c - fgets 在 while 循环中挂起

c - 如何读取和比较 C 中的字符 255

php - Array to SVG,灵活的PHP算法

c# - 计算 FFT 相关系数

c# - 将 ResourceDictionary 应用于 WPF 框架中的页面

c - 如何在 C 中正确编写将两个整数相加的函数

algorithm - 自动设置Canny边缘检测算法参数的实用方法

python - 使用通配符和不匹配项有效地搜索前缀