Siemens TIA Portal’daki Structured Control Language (SCL), CASE, EXIT, GOTO ve RETURN gibi program akışı kontrol ifadeleri içerir. GOTO ifadesi, çalışmayı tanımlı bir jump label etiketine kaydırarak kodun belirtilen noktasından devam etmesini sağlar. Etiketler aynı blok içinde, harflerle başlayıp rakamlarla devam eden geçerli birer IDENTIFIER olarak tanımlanır. GOTO, yalnızca içinde bulunduğu blok sınırları içinde çalışır; döngülere içerden atlama yasaktır ancak döngüden dışarı atlama mümkündür. Yapısal programlama ilkelerine göre aşırı GOTO kullanımı okunabilirliği düşürebileceğinden genellikle hata yönetimi gibi özel durumlarla sınırlı tutulmalıdır.
GOTO Komutunun Tanımı
GOTO ifadesi, program akışını anında belirli bir jump label etiketine taşır. Bu sayede, koşul değerlendirmesi olmaksızın kodun farklı bölümlerine “atlama” yapılabilir.
- Gerekli olduğunda hızlı hata işleme veya belirli bir durumun gerçekleşmesi halinde koddan acil çıkış senaryoları oluşturmak için tercih edilir.
- Kullanımı, yapılandırılmış programlamada nadiren önerilir; zira kodun takibini zorlaştırabilir.
Söz Dizimi (Syntax)
GOTO ;
...
: ;
: Daha önce LABEL … END_LABEL bloğunda tanımlanmış geçerli bir tanımlayıcıdır.- Etiketlerin ve GOTO ifadesinin aynı mantıksal blokta yer alması zorunludur.
Jump Label (Etiket) Tanımlama
Etiketler, GOTO’nun atlayacağı hedefleri belirtir. SCL bloklarında şu şekilde beyan edilir:
LABEL
MyLabel1, MyLabel2, MyLabel3;
END_LABEL;
- IDENTIFIER kuralları: Harf (a–z, A–Z) ile başlamalı, ardından rakamlar (0–9) gelebilir. Özel karakter veya ters sıralamada (önce rakam, sonra harf) tanımlama desteklenmez.
- SCL, IEC 61131-3 standardına uygun bir dil olduğu için tanımlayıcı kuralları bu standarda bağlıdır.
Kısıtlamalar ve Kurallar
- Aynı Blok: GOTO ve hedef etiket aynı fonksiyon/blok içinde olmalıdır; ağaç (network) veya bloklar arası atlama desteklenmez.
- Döngülere İçerden Atlama: Döngü gövdesinin ortasından içeri atlama yasaktır; ancak döngüden dışarı atlamak mümkündür.
- Belirsizlikten Kaçınma: Hedef etiketin tekil (unambiguous) olması gerekir; aynı ada sahip birden fazla etiket olmamalıdır.
- Yapısal Programlama: Aşırı GOTO kullanımı “spaghetti kod” riskini artırır; sadece hata yönetimi veya acil çıkış senaryolarıyla sınırlı tutulması önerilir.
Örnekler
Örnek 1: Case-Of ile Yönlendirme
CASE "Tag_Value" OF
1: GOTO MyLabel1;
2: GOTO MyLabel2;
3: GOTO MyLabel3;
ELSE GOTO MyLabel4;
END_CASE;
LABEL
MyLabel1, MyLabel2, MyLabel3, MyLabel4;
END_LABEL;
MyLabel1: "Tag_1" := 1;
MyLabel2: "Tag_2" := 1;
MyLabel3: "Tag_3" := 1;
MyLabel4: "Tag_4" := 1;
Açıklama: Tag_Value
’nun değerine göre ilgili etikete atlanır ve sadece o etikete karşılık gelen Tag’e (örneğin, Tag_1
, Tag_2
) 1 atanır. Diğer Tag’ler etkilenmez.
Örnek 2: Örnek 15-8 (Manual’dan)
FUNCTION_BLOCK FB3
VAR
A, B, C, INDEX: INT;
END_VAR
LABEL
LABEL1, LABEL2, LABEL3;
END_LABEL
BEGIN
IF A > B THEN
GOTO LABEL1; // A>B ise LABEL1’e atla
ELSIF A > C THEN
GOTO LABEL2; // A>C ise LABEL2’ye atla
END_IF;
// Normal akış
INDEX := 0;
LABEL1: INDEX := 1;
GOTO LABEL3;
LABEL2: INDEX := 2;
LABEL3: ; // Ortak çıkış noktası, akış buradan devam eder
END_FUNCTION_BLOCK;
Açıklama: Koşula göre farklı etiketlere atlanır, en sonunda LABEL3
ortak çıkış noktası olarak kullanılır. LABEL3
’ün boş olması, akışın birleştiği bir nokta olduğunu gösterir.
Örnek 3: Döngüden Dışarı Atlama
VAR
i : INT := 0;
error : BOOL := FALSE;
END_VAR
LABEL
ErrorHandler;
END_LABEL;
FOR i := 1 TO 10 DO
IF "DB10".Sensor[i] < 0 THEN
error := TRUE;
GOTO ErrorHandler; // Hatalı veri, döngüden dışarı atla
END_IF;
"DB10".Output[i] := "DB10".Sensor[i];
END_FOR;
ErrorHandler: "Tag_Error" := error;
Açıklama: DB10.Sensor[i]
’de negatif bir değer tespit edilirse, GOTO ErrorHandler
ile döngüden dışarı atlanır ve hata işleme bloğuna geçilir. Tag_Error
’e hata durumu atanır.
GOTO vs EXIT vs CONTINUE
Özellik | GOTO | EXIT | CONTINUE |
---|---|---|---|
Etki Alanı | Aynı blok içindeki etiket | İçinde bulunduğu döngü | İçinde bulunduğu döngü |
İşlevi | Belirtilen etikete atlar | Döngüyü tamamen sonlandırır | Mevcut döngü adımını atlar |
Kullanım Amacı | Hata yönetimi, acil çıkış | Döngüden çıkmak | Belirli adımları atlamak |
Koşul Gerekliliği | Koşulsuz çalışabilir | Genellikle koşulla kullanılır | Genellikle koşulla kullanılır |
Ne Zaman Kullanmalı, Ne Zaman Kaçınmalı?
Kullanılmalı
- Kritik hata durumlarında (örneğin
IF Error THEN GOTO ErrorHandler;
) acil çıkış veya hata işleme bloğuna atlamak için.
Kaçınılmalı
- Döngü akışını bölmek yerine, daha okunabilir
EXIT
veyaCONTINUE
ifadeleri tercih edilmeli. - Kodun genel akışını bozan, bakımı zorlaştıran “spaghetti kod” riskini önlemek için sınırlı kullanım.
Performans ve Hata Ayıklama İpuçları
- Performans: Aşırı
GOTO
kullanımı, kod akışını karmaşıklaştırarak PLC tarama süresini öngörülemez hale getirebilir. Mümkünse koşullu ifadelerle akışı sadeleştirin. - Hata Ayıklama: TIA Portal’da
GOTO
kullanılan kodları izlemek için “Watch Table” oluşturun ve etiketlere ulaşan akışı takip edin. “Breakpoints” ile atlama noktalarını adım adım kontrol edebilirsiniz. - VS Code ile SCL: TIA Portal dışında SCL kodu yazarken,
GOTO
ve etiket tanımları için Siemens SCL eklentisiyle linter’lar kullanın. Bu, geçersiz etiketleri yakalar.
Kod Okunabilirliği için En İyi Uygulamalar
- Siemens,
GOTO
kullanımında yorum satırları eklemeyi önerir. Örneğin:(* Hata durumu, hata işleyiciye atla *) GOTO ErrorHandler;
GOTO
kullanımını minimumda tutun; mümkünseEXIT
,CONTINUE
veyaIF…THEN
yapılarını tercih edin.- Etiket adlarını anlamlı seçin (örneğin,
ErrorHandler
,ExitPoint
) ve her etiketin amacını yorum satırıyla açıklayın.
Sıkça Sorulan Sorular
İç içe döngülerde hangi döngü etkilenir?
GOTO, yalnızca en yakınındaki mantıksal blok/döngü içinde tanımlı etiketleri kullanır; iç içe döngülerde bile sadece aynı blok içindeki etiket hedef alınabilir.
“Spaghetti kod” riskini nasıl azaltırım?
GOTO’yu sadece acil hata çıkışı veya global durum yönetimi için kullanın; normal akış için EXIT
, CONTINUE
veya IF…THEN
/CASE
yapıları tercih edilmeli.
GOTO ile EXIT farkı nedir?
GOTO
belirli bir etikete atlayarak program akışını değiştirir ve döngü dışındaki bir noktaya geçiş yapabilir. EXIT
ise sadece döngüyü sonlandırır ve döngü sonrası ilk satıra geçer.
TIA Portal’da GOTO hata ayıklaması nasıl yapılır?
“Watch Table” ile etiketlere ulaşan değişkenleri izleyin. “Breakpoints” koyarak GOTO
atlamalarının hangi koşullarda tetiklendiğini adım adım kontrol edebilirsiniz.
Sonuç
GOTO komutu, SCL dilinde program akışını hızlıca yönlendirmek için güçlü bir araçtır, ancak dikkatli kullanılmalıdır. Hata yönetimi ve acil çıkış senaryolarında etkili olsa da, aşırı kullanımı kodun okunabilirliğini ve bakımını zorlaştırabilir. TIA Portal’da hata ayıklama araçlarını kullanarak ve Siemens’in önerdiği en iyi uygulamalara bağlı kalarak, GOTO ile temiz ve performans dostu kodlar yazabilirsiniz.
Yorumlar
Yorum Gönder