Trends

Trends – CODESYS'ten Canlı Veri Bağlantısı (Generate Code Dökümantasyonu)

Bu kılavuz, “Generate Code” düğmesini kullanarak bir PLC'den (örneğin CODESYS projesi) gelen canlı verileri PLCVisu Trend modülüne nasıl bağlayacağınızı açıklar. Amaç, ölçüm değerlerini (örn. sıcaklık, basınç, doluluk) döngüsel olarak bir veritabanına yazmak ve bu verileri Trend Viewer'da görselleştirmektir.

Amaç

  • CODESYS'ten gelen canlı verileri otomatik olarak bir trend veritabanına yazmak
  • Bu verileri gerçek zamanlı olarak bir HMI üzerinde görselleştirmek (örn. WAGO WP400)
  • PLCVisu'daki kod üreticisi sayesinde minimum yapılandırma gereksinimi

Adım Adım Kılavuz

1. Kod Oluştur

Trend UI içinde “Generate Code” düğmesine tıklayın. Kod otomatik olarak kopyalanır ve doğrudan CODESYS projenize yapıştırılabilir.

(* DECLARATION SECTION *)
trendsFBlinetrend1Instance: PLCVisu.trendsFB; (* Trend için FB örneği *)
slinetrend1Columns:STRING(4096):= 'dataset1';
slinetrend1Values:STRING(4096);
(* CODE SECTION *)
(* Dosya yolu ve max kayıt sayısı parametrelerini başlat *)
trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', {{max_records}});
(* Veritabanına bir kayıt yaz *)
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING({{dataset1_value}}));
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"');
trendsFBlinetrend1Instance.write('',slinetrend1Columns, slinetrend1Values);
(* Ayırıcı satır yaz - isteğe bağlı - örn. batch sonu görünümü için *)
(* trendsFBlinetrend1Instance.writeFinish(''); *)

İsteğe Bağlı:
writeFinish('') komutu ile trend görünümünde görsel ayırıcı çizgiler (örn. batch ayrımı) oluşturabilirsiniz.

2. Sensör Değeri Ekle

GVL.MySensor yerine gerçek PLC değişkeninizi yazın, örnek:

REAL_TO_STRING(GVL.TemperatureSensor1)

Notlar:

  • Değişken REAL olarak tanımlanmalı
  • Diğer türler için uygun dönüştürücü kullanılmalı:
    • INT_TO_STRING(...) → tam sayılar
    • BOOL_TO_STRING(...) → boole ifadeleri

3. CODESYS & PLCVisu Arasındaki Bağlantıyı Kur

Verilerin PLCVisu'da görüntülenebilmesi için şu adımlar izlenmeli:

CODESYS’te:

  1. Sembol yapılandırmasını açın
  2. Gerekli GVL değişkenlerini işaretleyin
  3. “Harici erişime izin ver” seçeneğini aktif edin
  4. Gerekirse sembol dosyasını dışa aktarın

PLCVisu’da:

  • Projede PLC bağlantısını yapılandırın:
    • PLCVisu://localhost → yerel testler
    • opc.tcp://<IP>:4840 → OPC UA bağlantısı
  • Tag-Browser ile değerleri bağlayın

4. Veritabanını Başlat

trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', 10000);
  • Veritabanı dosyasını oluşturur (veya açar)
  • 10000 → maksimum kayıt sayısını tanımlar
  • Bu satır yalnızca bir kez çağrılmalıdır (örn. başlatma döngüsünde)

5. Verileri Döngüsel Olarak Yaz

Aşağıdaki kod, her çalıştırmada mevcut sensör değerini yazar:

slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING(GVL.TemperatureSensor1));
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"');
trendsFBlinetrend1Instance.write('', 'dataset1', slinetrend1Values);

Tipik kullanım:

  • Döngüsel bir görevde (örn. her 1 saniyede bir)
  • Ya da zamanlayıcı bir FB ile

Özet: CODESYS ↔ PLCVisu Trend

Adım Açıklama
Generate Code Temel kod yapısını oluşturur
Sensör değeri ekle GVL değişkenini *_TO_STRING(...) ile dönüştür
Bağlantıyı etkinleştir Sembol yapılandırması & PLCVisu veri kaynağını ayarla
.init() Veritabanını oluştur ve tampon boyutunu belirle
.write() Değerleri döngüsel olarak yaz
İsteğe bağlı: .writeFinish Görsel ayırıcı çizgiler oluşturur (örn. batch sonu)

Hata Giderme

Sorun Olası Nedenler
Trend verisi görünmüyor .init() çağrılmamış veya sensör değeri boş
.write() hatası Format hatası (örneğin eksik " karakteri)
Veritabanı oluşturulmamış Yanlış dosya yolu veya yazma izni yok
PLC bağlantısı yok Sembol yapılandırması kapalı veya IP hatalı

Öneri

  • Üretilen kodu şablon olarak kullanın – dataset1, değişken adlarını ve yolları özelleştirin
  • Birden fazla sinyal mi gerekiyor? → Birden çok .write() satırı kullanın veya dataset2, dataset3 tanımlayın
  • Önce tek bir REAL değişkenle test yaparak başlayın
dataset3
dataset2
.write()
dataset1
"
.write()
.init()
*_TO_STRING(...)
slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING(GVL.TemperatureSensor1)); slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"'); trendsFBlinetrend1Instance.write('', 'dataset1', slinetrend1Values);
10000
trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', 10000);
opc.tcp://<IP>:4840
PLCVisu://localhost
BOOL_TO_STRING(...)
INT_TO_STRING(...)
REAL
REAL_TO_STRING(GVL.TemperatureSensor1)
GVL.MySensor
writeFinish('')
(* DECLARATION SECTION *) trendsFBlinetrend1Instance: PLCVisu.trendsFB; (* Trend için FB örneği *) slinetrend1Columns:STRING(4096):= 'dataset1'; slinetrend1Values:STRING(4096); (* CODE SECTION *) (* Dosya yolu ve max kayıt sayısı parametrelerini başlat *) trendsFBlinetrend1Instance.init('$$PLCVisuDB$$/trends/linetrend1.db', {{max_records}}); (* Veritabanına bir kayıt yaz *) slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096('"', REAL_TO_STRING({{dataset1_value}})); slinetrend1Values := PLCVisu.ELA_UTIL.CONCAT_4096(slinetrend1Values, '"'); trendsFBlinetrend1Instance.write('',slinetrend1Columns, slinetrend1Values); (* Ayırıcı satır yaz - isteğe bağlı - örn. batch sonu görünümü için *) (* trendsFBlinetrend1Instance.writeFinish(''); *)