4

電気機器からkw値を読み取って、特定の時間に電気機器(エネルギーの消費率)を測定する機器があります。次に、これらの値はポーラーに送信され(定期的にデバイスに値を要求します)、データベースに挿入されます。

例:

最初の読み取り-1.01pmで10kw
2回目の読み取り-1.23pmで15kw
3回目の読み取り-午後1時30分に11kw

ご覧のとおり、ポーリング間隔は固定されていないため、値を異なる時間にデータベースに挿入できます。簡単にするために、データベースは[time]と[kw_value]の2つの列を持つ単なるテーブルであると想像できます。

これは実際には2つの部分からなる質問です。

  1. これらの測定値(1日のエネルギー消費量)から毎日のkwh値を取得するにはどうすればよいですか?私は数学がかなり苦手なので、これらの値から毎日のkwh値を取得する正しい方法がわかりません。

    すべての値を合計して平均を取得することを考えましたが、母は、1日のすべての測定値のグラフをプロットしてから、プロットされた線の下の領域を取得する必要があると言います(グラフ)、これにより、その日の総消費電力がわかります。次に、この値を使用して1日の期間を時間単位で除算し、kwhを取得する必要があります。

  2. データベースを使用してこれを行うにはどうすればよいですか?1日に数千の読み取り値がある場合(複数の電気機器から、この場合は3つの列があります-[time]、[kw_value]、[deviceid])、これをどのように計算する必要がありますか、すべての値をロードする必要がありますメモリ(私はC#を使用しています)とそこから計算しますか、それともSQLを使用してこれを計算できますか?

編集:kwとkwhの違いを指摘してくれてありがとう。私は元の質問で大きな間違いを犯したので、この編集を行いました。繰り返しになりますが、デバイスは特定の時間にkw値(キロジュール/秒で表したエネルギー消費率)を読み取り、データベースにこれらの値のリスト/プロットを指定すると、kwh(消費された総エネルギー)を決定する正しい方法は何ですか? )特定の日。

4

3 に答える 3

1

確かに、正確な kWh 値を取得することはできません。このようにポーリング頻度が低いと、推定使用量と実際の使用量の間に非常に大きな差が生じる可能性があります。次の例を挙げます。

1st reading - 10 kW at 1.01pm
2nd reading - 15 kW at 1.23pm
3rd reading - 11 kW at 1.30pm

他に情報がない場合、合理的な唯一の方法は、読み取り値の各ペアを平均し、それを時間で乗算することです。1.01 から 1.23 までは 22 分、つまり 0.367 時間です。その期間の平均測定値は (10 + 15)/2、つまり 12.5 kW であり、推定使用量は (12.5 * 0.367)、つまり 4.58 kWh になります。

ただし、そのアプローチには明らかな穴がいくつかあります。実際の消費量が次の場合はどうなりますか。

10 kW at 1.01pm
 0 kW at 1.02pm // machine turned off
15 kW at 1.23pm // machine turned back on
11 kW at 1.29pm

1.01 から 1.23 までの期間の実際の使用量は、1 分間で 10 kW、つまり 0.16 kWh です。

数値は、反対方向に同様の量だけずれている可能性があります。つまり、計算が非常に高い場合よりも非常に低い場合があります。

それが合理的である場合、私が行う方法は、マシン順、次に時間順のデータを返す SQL クエリを作成することです。したがって、次のようになります。

machine1, 1.01 am, reading
machine1, 1.20 am, reading
... etc. ...
machine2, 1.03, reading
machine2, 2.15, reading

そのため、マシン 1 のすべての測定値が時間順に表示され、次にマシン 2、というように表示されます。

ORDER BY と GROUP BY を使用してクエリを作成し、すべての読み取り値を適切な順序で返すことができます。次に、a を使用しSqlDataReaderて結果を順次移動し、各期間の消費量を計算し (上記の平均計算を使用)、各マシンの結果を合計します。すべての計算を実行して、次のような結果セットを返すクエリを作成できるかどうかを判断できるほど SQL をよく知りません。たとえば、次のようになります。

machine1, start time, end time, total power consumed
machine2, start time, end time, total power consumed
etc
于 2013-01-07T05:29:31.987 に答える
0

私のソリューションは、日間隔と測定間隔の重複を処理しようとします。

public class Measurement
        {
            public DateTime t;
            public double kwh;

            public Measurement(string t, double kwh)
            {
                this.t = DateTime.Parse(t);
                this.kwh = kwh;
            }
        }

        public static double getPowerConsumption(IEnumerable<Measurement> measurements, DateTime day)
        {
            DateTime never = DateTime.MinValue;
            DateTime tomorrow = day.AddDays(1);
            DateTime prev = never;
            double kwh = 0;

            foreach (Measurement m in measurements)
            {
                if (m.t >= day)
                //  measurement in our after or day
                {
                    if (m.t >= tomorrow)
                    {
                        if ((prev != never) && (prev < m.t))
                        {
                            //  add portion up to midnight
                            kwh += m.kwh * (tomorrow.Ticks - prev.Ticks) / (double)(m.t.Ticks - prev.Ticks);
                        }
                        break;
                    }
                    else if ((prev != never) && (prev < day) && (prev < m.t))
                    {
                        kwh += m.kwh * (m.t.Ticks - day.Ticks) / (double)(m.t.Ticks - prev.Ticks);
                    }
                    else
                    {
                        kwh += m.kwh;
                    }
                }
                prev = m.t;
            }

            return kwh;
        }

        static void Main(string[] args)
        {
            DateTime myDay = new DateTime(2012, 11, 2);
            List<Measurement> measurements = new List<Measurement>() { new Measurement("01.11.2012 23:30", 10), 
                                                                       new Measurement("02.11.2012 10:00", 1), 
                                                                       new Measurement("02.11.2012 23:30", 5), 
                                                                       new Measurement("03.11.2012 10:00", 6) };
            double kwh = getPowerConsumption(measurements, myDay);

            Console.WriteLine("Powerconsumption for " + myDay.ToShortDateString() + " was " + kwh.ToString("#.##") + "kWh");
        }
于 2013-01-06T15:38:24.833 に答える
0

このクエリは、各行の前の行を検索します。次に、間隔ごとに、間隔全体が最初からkwh値であると想定します。

; with  numbered as 
        (
        select  *
        ,       row_number() over (partition by deviceid order by time) rn
        from    YourTable
        )
select  deviceid
,       sum(t0.kwh_value * datediff(s, t0.[time], t1.[time])/3600)
from    numbered t1
join    numbered t0
on      t1.deviceid = t0.deviceid
        and t1.rn = t0.rn + 1
group by
        deviceid

クエリを変更して、間隔の平均kwhの使用を計算できます。

,       sum((t1.kwh_value + t0.kwh_value)/2 * datediff(s, t0.[time], t1.[time])/3600)
于 2013-01-06T15:00:33.453 に答える