Structured Control Language (SCL) içinde REPEAT … UNTIL döngüsü, döngü gövdesindeki komutları en az bir kez çalıştırdıktan sonra belirtilen koşul TRUE olana kadar tekrarlar. Bu yapı, koşulun baştan sağlanıp sağlanmadığına bakmaksızın en az bir kez yürütme garantisi sunar ve WHILE-DO döngüsünden bu yönüyle ayrılır. Döngü içindeki herhangi bir noktada CONTINUE ile mevcut yinelemeyi sonlandırıp koşul kontrolüne atlayabilir veya EXIT ile tüm döngüden çıkabilirsiniz. Aşağıda, hem temel hem de ileri seviye kullanım örnekleriyle bu komutu derinlemesine inceleyeceğiz.
SCL Döngü Yapıları Karşılaştırması
REPEAT-UNTIL ve WHILE-DO Farkı
- REPEAT … UNTIL: Döngü gövdesi bir kez kesin çalıştırılır, sonra koşul kontrol edilir. Koşul FALSE ise yeniden yürütülür.
- WHILE … DO: Koşul TRUE oldukça gövde tekrarlanır, başlangıçta koşul FALSE ise gövde hiç çalıştırılmaz.
FOR-TO-DO Döngüsü
- Belirli bir sayaç aralığında döngü kurulmasına yarar. Sayaç her seferinde artarak veya azalarak ilerler.
- REPEAT-UNTIL yapısının aksine, sayaç tanımlanarak kullanılır.
Syntax ve Parametreler
REPEAT
<Komutlar>; // En az bir kez çalıştırılır
UNTIL <Şart> // BOOL türünde ifade
END_REPEAT;
- <Komutlar>: Döngü koşulu FALSE olduğu sürece tekrarlanacak bir veya daha fazla SCL ifadesi.
- <Şart>: BOOL türünde bir ifade; TRUE olduğunda döngü sona erer. I, Q, M, D, L bellek alanlarından operandlar içerebilir.
- Döngü, END_REPEAT satırının ötesine geçerek program akışına devam eder.
Pratik Örnekler
1. Basit Sayaç Örneği
VAR
index : INT := 0;
END_VAR
REPEAT
index := index + 1;
UNTIL index >= 10
END_REPEAT;
Bu kod, index
değişkenini 0’dan başlayarak 10’a ulaşana kadar her seferinde bir artırır. Döngü gövdesi en az bir kez çalışır.
2. Tag Değer Atama
REPEAT
"Tag_Result" := "Tag_Value";
UNTIL "Tag_Error"
END_REPEAT;
Tag_Error
0 (“FALSE”) olduğu sürece Tag_Value
değeri sürekli Tag_Result
’e atanır. Koşul TRUE olduğunda döngü biter.
3. Dizi İçinde Arama
VAR
sensors : ARRAY[1..20] OF INT;
i : INT := 1;
found : BOOL := FALSE;
END_VAR
REPEAT
IF sensors[i] = 100 THEN
found := TRUE;
ELSE
i := i + 1;
END_IF;
UNTIL (found) OR (i > 20)
END_REPEAT;
Bu döngü, sensör değerleri içinde 100 değerini bulana veya dizi sonuna ulaşana kadar devam eder.
4. İç İçe Döngü Kullanımı
VAR
outer : INT := 0;
inner : INT;
END_VAR
REPEAT
outer := outer + 1;
inner := 0;
REPEAT
inner := inner + 2;
UNTIL inner > 10
END_REPEAT;
UNTIL outer = 5
END_REPEAT;
Dış döngü beş kez, iç döngü ise her dış yinelemede inner
10’dan büyük olana kadar çalışır.
CONTINUE ve EXIT ile İleri Kontrol
- CONTINUE: Mevcut yinelemeyi sonlandırır, doğrudan koşul kontrolüne atlar. Örneğin, belirli bir koşulda geriye kalan satırları atlamak için kullanılır.
- EXIT: Döngüden tamamen çıkar. Genellikle hata durumlarında veya erken çıkış gerektiren senaryolarda tercih edilir.
- Siemens, kodun okunabilirliği açısından aşırı CONTINUE, EXIT, GOTO ve RETURN kullanımından kaçınmayı önerir; özel durumlarda yorum satırı ile açıklama eklenmelidir.
REPEAT
IF errorFlag THEN
EXIT; // Hata durumunda döngüden çık
END_IF;
// Normal işlemler
UNTIL done
END_REPEAT;
Performans ve Uyarılar
- Döngü koşulunun kesinlikle bir noktada TRUE olmasını sağlayın; aksi halde sonsuz döngü oluşur ve PLC tarama süresini bloklar.
- PLC’lerde döngü kullanımı işlemci süresini artırabilir; özellikle üst üste iç içe döngülerden kaçınarak kodun deterministik çalışmasını koruyun.
- TIA Portal’da online izleme sırasında REPEAT bloklarındaki satırlar bazen görünmeyebilir; sorgulama için özel ayarlara ihtiyaç duyabilirsiniz.
Sık Sorulan Sorular
Döngü hiç çalışmıyor, neden?
WHILE-DO ile REPEAT-UNTIL karıştırılmış olabilir. REPEAT gövdeyi en az bir kez çalıştırırken, WHILE başlangıçta koşul FALSE ise hiç girmez.
İç içe döngüler performansı nasıl etkiler?
Her iç döngü, her dış yinelemede tamamen yeniden yürütülür. Döngü derinliği arttıkça işlemci süresi geometrik olarak artabilir.
Koşulu daha önceden test etmek mümkün mü?
Evet, koşulu döngü başlamadan kontrol etmek için WHILE-DO kullanmalısınız. REPEAT-UNTIL her zaman en az bir iterasyon yapar.
Yorumlar
Yorum Gönder