- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
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:
- Etiketin değeri ilk sabitle eşleşirse, o sabite ait talimatlar çalıştırılır ve komut
END_CASE
ile biter. - Eşleşme olmazsa, bir sonraki sabite geçilir.
- Hiçbir sabitle eşleşme olmazsa ve
ELSE
bloğu varsa,ELSE
içindeki talimatlar çalıştırılır. 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 Tipi | Açıklama | Örnek Etiket |
---|---|---|
Bit Dizileri | BYTE, WORD, DWORD, LWORD gibi veri tipleri. | BYTE#2 , WORD#100 |
Tamsayılar | INT, 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
)
- İkili sayı (örneğin,
- 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
)
- Tek bir tamsayı (örneğin,
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
Konu | Açıklama |
---|---|
Veri Tipi Uyumu | Etiket ve sabitlerin veri tipleri uyumlu olmalıdır (örneğin, BYTE etiket için BYTE# sabitleri). |
Tekrar Eden Sabitler | Aynı 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. |
Okunabilirlik | Kodun 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?
Ekstra Kaynaklar
Daha fazla bilgi için şu makalelere göz atabilirsiniz: TIA Portal Nedir?
Not: Örnekler TIA Portal V18 ile uyumludur.
- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
Yorumlar
Yorum Gönder