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.

Ekran ana/detay yapısındadır: üstte transfer, altında satırları. Zamanlamayı transfer taşır, neyin kopyalanacağını satırlar.
İki tür satır
Section titled “İki tür satır”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ı | |
|---|---|---|
| Ayar | calcType ve rangeType ikisi de boş | calcType ve rangeType ikisi de dolu |
| Okuduğu | Kaynağın anlık değeri | Kaynağın aralıktaki kayıt geçmişi |
| Kaynakta kayıt gerekir mi | Hayır | Evet |
| Çalışma sıklığı | Her periyotta | Kendi 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.
Transfer alanları
Section titled “Transfer alanları”| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| name | String (≤100) | Evet | Transfer adı |
| dsc | String (≤255) | Hayır | Açıklama |
| period | Integer (ms, ≥100) | Evet | Transferin çalışma sıklığı |
| statRecalcIntervalSeconds | Integer (s, ≥10) | Hayır | Bu transferin Current * satırlarının yeniden hesaplama aralığını değiştirir |
| projectId | String | Evet | Bağlı proje |
period tabanı, üründe tekrarlayan her şeyin paylaştığı değerdir: 100 ms.
Satır alanları
Section titled “Satır alanları”| Alan | Açıklama |
|---|---|
| sourceVariableId | Okunan değişken |
| targetVariableId | Yazılan değişken |
| calcType | İstatistiksel hesaplama (VariableStatCalculationType) |
| rangeType | Zaman aralığı (VariableStatRangeType) |
| threshold | Yazma filtresi, kaynak değerin yüzdesi olarak |
| deadband | Yazma filtresi, mutlak fark olarak |
Threshold ve deadband
Section titled “Threshold ve deadband”İ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| × 100bu değere ulaştığında yazılır. Kaynak0ise, yalnızca hedef0değ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.
Hesaplama tipleri
Section titled “Hesaplama tipleri”VariableStatCalculationType — 11 değer:
| Tip | Anlamı |
|---|---|
| Min | Aralıktaki minimum değer |
| Max | Aralıktaki maksimum değer |
| Avg | Aritmetik ortalama |
| Sum | Toplam |
| Count | Kayıt sayısı |
| First Value | Aralıktaki ilk kayıt |
| Last Value | Aralıktaki son kayıt |
| Max Difference | Aralıktaki en büyük ardışık fark |
| Last First Difference | son − ilk — kümülatif sayaçların tipi |
| Middle Value | Aralığın zamansal orta noktasındaki değer |
| Median Value | Medyan (sıralı ortanca) |
Zaman aralığı tipleri
Section titled “Zaman aralığı tipleri”VariableStatRangeType — beş zaman ölçeğinde Current ve Previous olmak üzere 10 değer:
| Tip | Aralık |
|---|---|
| Current Hour | Saat başından → şimdiye |
| Previous Hour | Bir önceki tam saat |
| Current Day | Gece yarısından → şimdiye |
| Previous Day | Bir önceki tam gün |
| Current Week | Hafta başından → şimdiye |
| Previous Week | Bir önceki tam hafta |
| Current Month | Ay başından → şimdiye |
| Previous Month | Bir önceki tam ay |
| Current Year | Yıl başından → şimdiye |
| Previous Year | Bir ö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ık | Varsayılan yeniden hesaplama aralığı |
|---|---|
| Current Hour | 60 sn |
| Current Day | 5 dk |
| Current Week | 30 dk |
| Current Month, Current Year | 1 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.
Zamanlama ve yaşam döngüsü
Section titled “Zamanlama ve yaşam döngüsü”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.
Bir çalışma başarısız olduğunda
Section titled “Bir çalışma başarısız olduğunda”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.
Örnekler
Section titled “Örnekler”Kümülatif sayaçtan saatlik tüketim
Section titled “Kümülatif sayaçtan saatlik tüketim”- 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.
Dünün ortalama sıcaklığı
Section titled “Dünün ortalama sıcaklığı”- Kaynak:
Temperature_C(kayıtlı) - Hedef:
DailyAvg_Temperature - calcType Avg, rangeType Previous Day
- period: 300 000 ms
Saha değerini merkezi projeye yansıtmak
Section titled “Saha değerini merkezi projeye yansıtmak”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
Script ile yönetim
Section titled “Script ile yönetim”// Zamanlayıcıya ekle ve iptal etins.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örevar 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 →