SCL Programlama Dilinde CASE Koşulu | Tia Portal

SCL Programlama Dilinde CASE Koşulu | Tia Portal

Programlamada karar verme süreçleri, otomasyon sistemlerinin temel taşlarından biridir. Siemens TIA Portal’da kullanılan SCL (Structured Control Language) programlama dilinde, CASE komutu, bir değişkenin değerine bağlı olarak birden fazla yol arasında seçim yapmayı sağlayan güçlü bir araçtır. Bu makalede, CASE komutunun ne olduğunu, nasıl çalıştığını, hangi veri tipleriyle kullanılabileceğini ve gerçek hayatta nasıl uygulandığını detaylı bir şekilde açıklayacağız. Bol örnekle, hem yeni başlayanlar hem de deneyimli programcılar için rehber bir içerik sunacağız.

CASE Komutu Nedir?

CASE komutu, bir değişkenin (etiket veya "tag") değerine göre farklı talimat dizilerini çalıştıran bir çok yönlü dallanma yapısıdır. Türkçe’de “durum” ya da “seçenek” olarak düşünebileceğimiz bu yapı, bir değişkenin değerini sabit değerlerle karşılaştırır ve eşleşme durumunda ilgili kod bloğunu çalıştırır. Eğer hiçbir eşleşme olmazsa, isteğe bağlı bir ELSE bloğu devreye girer.

Örneğin, bir fabrikanın sıcaklık sensöründen gelen değere göre farklı işlemler yapmak istediğinizi düşünün:

  • Sıcaklık 0 ise bir şey yapma.
  • 1, 3 veya 5 ise bir lambayı yak.
  • 6 ile 10 arasında ise bir motoru çalıştır.
  • Diğer durumlarda bir uyarı ver.

CASE komutu, bu tür senaryoları düzenli ve okunabilir bir şekilde kodlamanızı sağlar.

CASE Komutunun Söz Dizimi

CASE komutunun temel yapısı şu şekildedir:

CASE <Etiket> OF
   <Sabit1>: <Talimatlar1>;
   <Sabit2>: <Talimatlar2>;
   ...
   <SabitX>: <TalimatlarX>;
ELSE
   <Talimatlar0>;
END_CASE;
  • <Etiket>: Değeri kontrol edilen değişken. Bu, bir tamsayı (örneğin, INT, DINT) veya bit dizisi (örneğin, BYTE, WORD) olabilir.
  • <Sabit>: Etiketin karşılaştırılacağı sabit değerler. Tek bir değer, birden fazla değer (örneğin, 1,3,5) veya bir aralık (örneğin, 6...10) olabilir.
  • <Talimatlar>: Eşleşme durumunda çalıştırılacak kod bloğu.
  • ELSE: Opsiyonel bir bölüm. Eğer etiket hiçbir sabitle eşleşmezse bu talimatlar çalışır.
  • END_CASE;: CASE komutunun sonunu belirtir.

CASE Komutunun Çalışma Mantığı

CASE komutu, etiketin değerini sırayla sabitlerle karşılaştırır:

  1. Etiketin değeri ilk sabitle eşleşirse, o sabite ait talimatlar çalıştırılır ve komut END_CASE ile biter.
  2. Eşleşme olmazsa, bir sonraki sabite geçilir.
  3. Hiçbir sabitle eşleşme olmazsa ve ELSE bloğu varsa, ELSE içindeki talimatlar çalıştırılır.
  4. ELSE bloğu yoksa ve eşleşme yoksa, hiçbir şey yapılmaz.

Bu yapı, birden fazla IF-ELSE bloğu yazmaktan daha düzenli ve performans açısından daha verimlidir.

Desteklenen Veri Tipleri

CASE komutunda etiket olarak kullanılabilecek veri tipleri şunlardır:

Veri TipiAçıklamaÖrnek Etiket
Bit DizileriBYTE, WORD, DWORD, LWORD gibi veri tipleri.BYTE#2, WORD#100
TamsayılarINT, DINT, UINT, UDINT gibi tamsayı türleri.INT#5, DINT#1000

Sabit Değerler

Sabitler, etiketin veri tipine uygun olmalıdır:

  • Bit Dizileri için:
    • İkili sayı (örneğin, 2#10)
    • Sekizlik sayı (örneğin, 8#77)
    • Onaltılık sayı (örneğin, 16#AD)
    • Tip belirtilmemiş sabit (örneğin, 1000)
    • Tip belirtilmiş sabitler (örneğin, BYTE#2, WORD#2)
  • Tamsayılar için:
    • Tek bir tamsayı (örneğin, 5)
    • Bir aralık (örneğin, 15...20)
    • Birden fazla değer veya aralık (örneğin, 10, 11, 15...20)

Not: Tip belirtilmiş etiketler (örneğin, BYTE türü bir etiket) kullanıldığında, sabitlerin de aynı tipte belirtilmesi gerekir (örneğin, BYTE#2).

Örneklerle CASE Kullanımı

CASE komutunun farklı senaryolarda nasıl kullanıldığını anlamak için birkaç örnek inceleyelim.

Örnek 1: Günlük Planlama

Bir fabrikanın çalışma günlerine göre farklı işlemler yaptığını düşünelim. Haftanın gününü temsil eden bir day_of_week değişkeni (1= Pazartesi, 7= Pazar) kullanıyoruz:

VAR
   day_of_week : INT;
   message : STRING;
END_VAR

CASE day_of_week OF
   1: message := 'Pazartesi: Üretim başlasın';
   2: message := 'Salı: Kalite kontrol';
   3: message := 'Çarşamba: Bakım günü';
   4: message := 'Perşembe: Sevkiyat';
   5: message := 'Cuma: Raporlama';
   6, 7: message := 'Hafta sonu: Dinlenme';
   ELSE message := 'Geçersiz gün';
END_CASE;

Açıklama:

  • day_of_week 1 ise, message "Pazartesi: Üretim başlasın" olur.
  • 6 veya 7 ise, "Hafta sonu: Dinlenme" yazılır.
  • 1-7 dışında bir değer girilirse, ELSE bloğu çalışır ve "Geçersiz gün" yazılır.

Örnek 2: Sıcaklık Kontrolü

Bir sıcaklık sensöründen gelen değere göre farklı işlemler yapalım:

VAR
   temperature : INT;
   alarm : STRING;
END_VAR

CASE temperature OF
   0...30: alarm := 'Soğuk: Isıtıcıyı aç';
   31...60: alarm := 'Normal: Sistem stabil';
   61...100: alarm := 'Sıcak: Soğutma başlat';
   ELSE alarm := 'Hata: Sensör arızalı';
END_CASE;

Açıklama:

  • Sıcaklık 0-30 arasında ise ısıtıcı açılır.
  • 31-60 arasında ise sistem normal çalışır.
  • 61-100 arasında soğutma başlar.
  • Diğer değerlerde sensör arızası uyarısı verilir.

Örnek 3: Bit Dizisi ile Kontrol

Bir BYTE etiketi kullanarak bir makinenin durumunu kontrol edelim:

VAR
   machine_state : BYTE;
   output : INT;
END_VAR

CASE machine_state OF
   BYTE#0: output := 0; // Makine kapalı
   BYTE#1: output := 1; // Makine çalışıyor
   BYTE#2: output := 2; // Makine bakımda
   ELSE output := -1;   // Bilinmeyen durum
END_CASE;

Açıklama:

  • machine_state BYTE#0 ise makine kapalıdır.
  • BYTE#1 ise çalışıyor, BYTE#2 ise bakımda.
  • Diğer durumlarda output -1 olur.

Örnek 4: İç İçe CASE Kullanımı

Bir fabrikanın sıcaklık ve basınç değerlerine göre karmaşık bir kontrol yapalım:

VAR
   temperature : INT;
   pressure : INT;
   alarm : STRING;
END_VAR

CASE temperature OF
   0...50:
      CASE pressure OF
         0...10: alarm := 'Düşük sıcaklık ve basınç';
         11...20: alarm := 'Düşük sıcaklık, normal basınç';
         ELSE alarm := 'Düşük sıcaklık, yüksek basınç';
      END_CASE;
   51...80: alarm := 'Normal sıcaklık';
   81...100:
      CASE pressure OF
         0...15: alarm := 'Yüksek sıcaklık, düşük basınç';
         16...25: alarm := 'Yüksek sıcaklık, normal basınç';
         ELSE alarm := 'Yüksek sıcaklık ve basınç';
      END_CASE;
   ELSE alarm := 'Sıcaklık aralığı dışı';
END_CASE;

Açıklama:

  • Sıcaklık 0-50 arasında ise, basınç değerine göre farklı mesajlar verilir.
  • 51-80 arasında ise sadece "Normal sıcaklık" yazılır.
  • 81-100 arasında yine basınç kontrol edilir.
  • Diğer durumlarda hata mesajı verilir.

CASE Kullanırken Dikkat Edilmesi Gerekenler

KonuAçıklama
Veri Tipi UyumuEtiket ve sabitlerin veri tipleri uyumlu olmalıdır (örneğin, BYTE etiket için BYTE# sabitleri).
Tekrar Eden SabitlerAynı sabit birden fazla kez tanımlanırsa, sadece ilk eşleşme çalışır.
ELSE KullanımıBilinmeyen durumları yakalamak için ELSE bloğu eklemek iyi bir uygulamadır.
PerformansÇok fazla sabit içeren CASE blokları, PLC’nin döngü süresini etkileyebilir. Gereksiz dallanmalardan kaçının.
OkunabilirlikKodun anlaşılır olması için yorum satırları (//) kullanın ve anlamlı etiket isimleri seçin.

En İyi Uygulamalar

  • Anlamlı İsimler Kullanın: temperature, machine_state gibi etiket isimleri, kodun ne yaptığını açıkça gösterir.
  • Aralıkları Kullanın: Tek tek değer yazmak yerine, mümkünse aralıklar (örneğin, 6...10) kullanın.
  • Hata Durumlarını Ele Alın: ELSE bloğu ile beklenmeyen değerleri yakalayın.
  • Yorum Ekleyin: Her CASE bloğunun ne yaptığını açıklayan yorumlar ekleyin.
  • Test Edin: TIA Portal’ın simülasyon özelliğini kullanarak kodunuzu test edin.

Sonuç

SCL’de CASE komutu, birden fazla koşulu düzenli ve verimli bir şekilde yönetmek için güçlü bir araçtır. Tamsayılar ve bit dizileriyle çalışabilir, tek değerler, aralıklar veya birden fazla değerle eşleşmeler yapabilir. İç içe CASE kullanımı, karmaşık otomasyon senaryolarını çözmek için esneklik sağlar. Yukarıdaki örneklerle, CASE komutunun hem basit hem de ileri düzey uygulamalarını gördük. Şimdi TIA Portal’ı açıp kendi CASE tabanlı projenizi yapmaya ne dersiniz?

  • Case Koşulu Nasıl Çalışır? Simülatör ile Bakalım
  • Ekstra Kaynaklar

    Daha fazla bilgi için şu makalelere göz atabilirsiniz: TIA Portal Nedir?


    Not: Örnekler TIA Portal V18 ile uyumludur.

    Yorumlar