SCL Programlama Dilinde GOTO Komutu | Tia Portal

SCL Programlama Dilinde FOR Döngüsü | Tia Portal

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

  1. Aynı Blok: GOTO ve hedef etiket aynı fonksiyon/blok içinde olmalıdır; ağaç (network) veya bloklar arası atlama desteklenmez.
  2. 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.
  3. Belirsizlikten Kaçınma: Hedef etiketin tekil (unambiguous) olması gerekir; aynı ada sahip birden fazla etiket olmamalıdır.
  4. 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 veya CONTINUE 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ünse EXIT, CONTINUE veya IF…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