İçeriğe geç

Veri Transferleri

Data Transfer, bir değişkenin değerini periyodik olarak başka bir değişkene yazar. Anlık değeri olduğu gibi kopyalayabilir ya da önce kaynağın kayıt geçmişinden bir istatistik hesaplayabilir — saatlik sayaç farkı, dünün ortalaması, aylık maksimum.

Data Transfers ekranı — üstte transfer listesi, altta seçili transferin kaynak-hedef satırları

Ekran ana/detay yapısındadır: üstte transfer, altında satırları. Zamanlamayı transfer taşır, neyin kopyalanacağını satırlar.

Geri kalan her şey bu ayrımdan çıkar. Bir satır, yalnızca calcType ve rangeType birlikte doluysa istatistikseldir. Biri boşsa satır düz kopyadır.

Anlık değer satırıİstatistik satırı
AyarcalcType ve rangeType ikisi de boşcalcType ve rangeType ikisi de dolu
OkuduğuKaynağın anlık değeriKaynağın aralıktaki kayıt geçmişi
Kaynakta kayıt gerekir miHayırEvet
Çalışma sıklığıHer periyottaKendi yeniden hesaplama aralığında (aşağıda)

Yani anlık kopya, hesaplama alanları boş bırakılmış bir satırdır — Current Hour üzerinde Last Value değil. Boş satır zaten bellekte duran değeri okur; istatistik satırı ise aynı sayı için tarihçe veritabanını sorgular, bu da çok daha pahalıdır.

AlanTipZorunluAçıklama
nameString (≤100)EvetTransfer adı
dscString (≤255)HayırAçıklama
periodInteger (ms, ≥100)EvetTransferin çalışma sıklığı
statRecalcIntervalSecondsInteger (s, ≥10)HayırBu transferin Current * satırlarının yeniden hesaplama aralığını değiştirir
projectIdStringEvetBağlı proje

period tabanı, üründe tekrarlayan her şeyin paylaştığı değerdir: 100 ms.

AlanAçıklama
sourceVariableIdOkunan değişken
targetVariableIdYazılan değişken
calcTypeİstatistiksel hesaplama (VariableStatCalculationType)
rangeTypeZaman aralığı (VariableStatRangeType)
thresholdYazma filtresi, kaynak değerin yüzdesi olarak
deadbandYazma filtresi, mutlak fark olarak

İkisi de yazılacak değeri hedefin o anki değeriyle karşılaştırır ve değişim kayda değmeyecek kadar küçükse yazmayı bastırır. İkisi de opsiyoneldir; hiçbiri verilmezse her çalışma yazar.

  • deadband mutlaktır: |hedef − kaynak| bundan küçükse yazma atlanır.
  • threshold yüzdedir: |hedef − kaynak| / |kaynak| × 100 bu değere ulaştığında yazılır. Kaynak 0 ise, yalnızca hedef 0 değilse yazılır.
  • Önce deadband bakılır; böylece sıfıra yakın bir kaynakta yüzdenin her değişimi geçirdiği yerde mutlak bir taban gürültüyü bastırmaya devam eder.

Her ikisi de yalnızca iki değer de sayısalken geçerlidir. Sayısal olmayan bir değer ya da henüz değeri olmayan bir hedef her zaman yazdırır.

VariableStatCalculationType — 11 değer:

TipAnlamı
MinAralıktaki minimum değer
MaxAralıktaki maksimum değer
AvgAritmetik ortalama
SumToplam
CountKayıt sayısı
First ValueAralıktaki ilk kayıt
Last ValueAralıktaki son kayıt
Max DifferenceAralıktaki en büyük ardışık fark
Last First Differenceson − ilk — kümülatif sayaçların tipi
Middle ValueAralığın zamansal orta noktasındaki değer
Median ValueMedyan (sıralı ortanca)

VariableStatRangeType — beş zaman ölçeğinde Current ve Previous olmak üzere 10 değer:

TipAralık
Current HourSaat başından → şimdiye
Previous HourBir önceki tam saat
Current DayGece yarısından → şimdiye
Previous DayBir önceki tam gün
Current WeekHafta başından → şimdiye
Previous WeekBir önceki tam hafta
Current MonthAy başından → şimdiye
Previous MonthBir önceki tam ay
Current YearYıl başından → şimdiye
Previous YearBir önceki tam yıl

Bu sınırların nereye düşeceğini üç şey belirler:

  • Sunucunun saat dilimi. Aralıklar bakanın değil, sunucunun kendi diliminde kesilir.
  • Sunucunun yereli (locale) haftanın hangi günle başladığını belirler.
  • “Şimdi”, son tamamlanmış dakikadır, o an değil — Current * aralığı orada durur, böylece tarihçeye henüz yazılmamış örnekleri hiç sormaz.

İstatistik gerçekte ne sıklıkla hesaplanır

Section titled “İstatistik gerçekte ne sıklıkla hesaplanır”

İstatistik satırı tarihçeyi her periyotta sorgulamaz. Sonuçlar önbelleğe alınır, aradaki çalışmalarda transfer önbellekteki değeri yeniden uygular.

  • Previous * aralığı kapandıktan sonra bir daha değişmez; bu yüzden dönem başına bir kez hesaplanır, sonra önbellek süresi dolana dek oradan verilir.
  • Current * aralığı kendi aralığında yeniden hesaplanır:
AralıkVarsayılan yeniden hesaplama aralığı
Current Hour60 sn
Current Day5 dk
Current Week30 dk
Current Month, Current Year1 saat

Transferdeki statRecalcIntervalSeconds bunların hepsinin yerine tek bir değer koyar (en az 10 sn).

Pratik sonucu şu: period, istatistiğin hesaplanma sıklığı değildir. Kısa periyot, transferin son sonucu sık sık yeniden uygulamasını sağlar — hedef bir ekranı besliyorsa ve yazma filtresinin sık değerlendirilmesini istiyorsanız işe yarar — ama sayıyı tazelemez. Daha sık hesaplatmak için period’u değil statRecalcIntervalSeconds’ı düşürün.

Anlık değer satırlarının önbelleği yoktur; onlar kaynağı her periyotta gerçekten okur.

Bir transfer zamanlanmadan hiçbir şey yapmaz. Durum iki değerden biridir: Scheduled ya da Not Scheduled. Scheduled, zamanlayıcıya bağlı demektir; şu anda çalışıyor demek değildir.

  • Proje aktif olmalıdır; pasif bir projede zamanlama reddedilir.
  • Projeyi pasife almak transferlerini iptal eder.
  • Kümede transferler yalnızca lider düğümde çalışır. İsteği alan başka bir düğüm onu lidere iletir; liderlik el değiştirirse yeni lider zamanlamayı geri yükler — yani zamanlanmış bir transfer yeniden başlatmayı ve lider değişimini atlatır.
  • Zamanlanmış transferler Job Monitor ekranında Data Transfer türü altında görünür.

Başarısız olan transfer sunucu günlüğüne ve proje günlüğüne nedenini adıyla yazan birer satır düşer — her çalışmada bir tane değil. Aynı nedenle başarısız olan sonraki çalışmalar sessiz kalır; farklı bir nedenle olan başarısızlık ise yeni bir arıza olarak raporlanır. Sonrasında başarılı olan ilk çalışma, bu arada kaç çalışmanın başarısız olduğunu söyleyen bir kurtulma satırı yazar; böylece sessizlik hiçbir zaman “düzeldi” diye okunmak zorunda kalmaz.

Önceden bilinmesi gereken bir ret var: hedef değişkenlerden biri Operation Lock taşıyorsa o çalışmada toplu yazma tümüyle reddedilir ve transferin hiçbir satırı yazılmaz. Transfer kilidin parolasını veremez; çaresi kilidi ya da satırı kaldırmaktır.

  • Kaynak: Energy_kWh (kümülatif, kayıtlı)
  • Hedef: Hourly_Consumption
  • calcType Last First Difference, rangeType Previous Hour
  • period: 60 000 ms

Aralık her saat başı kapanır ve bir kez hesaplanır; kısa periyot yalnızca sonucun saat döndükten hemen sonra düşmesini sağlar.

  • Kaynak: Temperature_C (kayıtlı)
  • Hedef: DailyAvg_Temperature
  • calcType Avg, rangeType Previous Day
  • period: 300 000 ms

Transferi merkezi projeye koyun:

  • Kaynak: saha projesindeki Site1_Power_kW
  • Hedef: merkezi projedeki Site1_Power_kW
  • calcType ve rangeType: boş bırakılır — bu anlık kopyadır
  • deadband: 0.5 — sakin bir sinyal her periyotta yazmasın
  • period: 10 000 ms
// Zamanlayıcıya ekle ve iptal et
ins.scheduleDataTransfer("hourly_energy_calc");
ins.cancelDataTransfer("hourly_energy_calc");
// "Scheduled" veya "Not Scheduled"
var status = ins.getDataTransferStatus("hourly_energy_calc");
// Çağıran projenin tüm transferleri, ada göre
var all = ins.getDataTransferStatusesByProject();

Zamanlama SCHEDULE_DATA_TRANSFER yetkisi ister ve denetim günlüğüne operatör eylemi olarak yazılır.

Ayrıntılar: Data Transfer API →