Siemens SINUMERIK Kontrol Yapıları ve Döngüler: IF, LOOP, FOR, WHILE, REPEAT, CASE ve GOTO (840D sl / 828D)

4 Ağustos 2026

Mentor CNC Editör Ekibi

Siemens SINUMERIK’te Kontrol Yapıları ve Döngüler

Kontrol, NC bloklarını standart olarak programlandıkları sırayla işler. Bu sırayı değiştirmenin iki yolu vardır: kontrol yapıları (IF, ELSE, ENDIF, LOOP, FOR, WHILE, REPEAT) ve program atlamaları (GOTOS, GOTOB, GOTOF, GOTO, GOTOC, CASE). Bu sayfa ikisini de, aralarındaki farkı da ve hangisinin ne zaman kullanılacağını anlatır.

Pratik karşılığı şudur: aynı deliği 40 kez yazmak yerine bir döngü kurarsınız; parça ölçüsüne göre farklı işleme yapan tek bir program yazarsınız; blok arama sırasında delme yapılmasını engellersiniz; ölçüm sonucu kötüyse programı alarmla durdurursunuz. Bunların tamamı kontrol yapılarıyla çözülür.

Bu sayfa kimin için? Parametrik program yazmaya başlayan CNC programcıları, kendi çevrimini yazmak isteyen teknisyenler, Fanuc makro B’den (WHILE DO / GOTO / IF) Siemens’e geçenler ve ölçüm-prob rutinlerini kendisi kuran herkes.

Önce kurallar: kontrol yapılarının sınırları

Kılavuz, kontrol yapılarını anlatmadan önce bir uyarı verir. Bu uyarıyı bilmeden yazılan programlar, tezgâhta anlaşılmaz alarmlarla durur:

Programlama hatası (kılavuzun kendi uyarısı) Kontrol yapıları yalnızca programın komut bölümüne (statement section) eklenebilir. Program başlığındaki tanımlamalar koşullu veya tekrarlı olarak çalıştırılamaz. Kontrol yapılarının anahtar kelimelerine veya atlama hedeflerine makro bindirilemez. Makro tanımlanırken böyle bir kontrol yapılmaz — yani hata tanımlama anında değil, çalışma anında ortaya çıkar.

Ek koşullar

KuralSahadaki anlamı
Kontrol yapısı program genelinde kullanılamazBir kontrol yapısı ana programda başlayıp alt programda bitemez; her seviye kendi içinde kapanmalıdır
Her alt program seviyesinde 16 kontrol yapısına kadar iç içe kurulabilirDerin iç içe yapılar için alt program seviyesi kullanmak gerekir
Kontrol yapısı elemanı içeren bloklar bastırılamaz (skip / atlama seviyesi)/1 IF ... gibi bir yazım işe yaramaz
Kontrol yapısı elemanı içeren bloklarda atlama etiketine izin verilmezETIKET: WHILE ... yazılamaz
Kontrol yapıları yorumlayıcı (interpreter) modda işlenir; döngü sonu bulununca döngü başı aranırBu sebeple programın blok yapısı yorumlayıcı modda tam olarak kontrol edilmez — dengesiz ENDIF/ENDWHILE hemen fark edilmez
Kontrol yapıları ile program atlamalarını karıştırmak genel olarak tavsiye edilmezİkisini aynı program bölümünde iç içe kullanmayın
Çevrimler ön derlendiğinde iç içe geçmenin doğruluğu kontrol edilebilirKendi çevriminizi yazıyorsanız bu kontrolü kullanın

Döngü içindeyken ekranda ne görünür?

Bir program döngüsü içinde yalnızca seçilmiş bloklar çalıştırılıyorsa, güncel blok göstergesinde döngüden önceki son ana çalışma bloğu görünür. İşlenen blokların da görünmesi için (örneğin teşhis amacıyla) çözümleyici tek blok SBL2 etkinleştirilmelidir.

Bu, “program takıldı” sanılan durumun asıl sebebidir Döngü çalışırken ekrandaki blok numarası değişmez. Operatör programın kilitlendiğini sanır. Aslında döngü dönmektedir. SBL2 açılırsa bloklar tek tek görünür.

IF, ELSE, ENDIF — koşullu deyim ve dallanma

İki farklı kullanımı vardır:

  • Koşullu deyim: IF ile ENDIF arasındaki blok yalnızca koşul sağlandığında çalışır.
  • Dallanma: IF – blok_1 – ELSE – blok_2 – ENDIF yapısında her zaman iki bloktan biri çalışır. Koşul sağlanırsa blok_1, sağlanmazsa blok_2.
; Koşullu deyim IF <koşul> Program bloğu ; koşul TRUE ise çalışır ENDIF; Dallanma IF <koşul> Program bloğu_1 ; koşul TRUE ise ELSE Program bloğu_2 ; koşul FALSE ise ENDIF
Anahtar kelimeAnlamı
IFKoşullu deyimi veya dallanmayı başlatır
ELSEAlternatif program bloğunu başlatır
ENDIFKoşullu deyimin veya dallanmanın sonunu işaretler
<koşul>TRUE veya FALSE olarak değerlendirilen mantıksal ifade

Kılavuzun takım değiştirme alt programı örneği

Bu örnek, IF/ELSE’in gerçek bir üretim probleminde nasıl kullanıldığını gösterdiği için değerlidir: program test modunda ve gerçek çalışmada “güncel takım” bilgisi farklı yerden okunur.

PROC L6 ; Takım değiştirme rutini N500 DEF INT TNR_AKTUELL ; Etkin T numarası için değişken N510 DEF INT TNR_VORWAHL ; Ön seçilmiş T numarası için değişken N520 STOPRE N530 IF $P_ISTEST ; Program test modundaysa… N540 TNR_AKTUELL = $P_TOOLNO ; …”güncel” takım program bağlamından okunur N550 ELSE ; Aksi hâlde… N560 TNR_AKTUELL = $TC_MPP6[9998,1] ; …iş milindeki takım okunur N570 ENDIF N580 GETSELT(TNR_VORWAHL) ; İş milinde ön seçili takımın T numarası N590 IF TNR_AKTUELL <> TNR_VORWAHL ; Ön seçili takım hâlâ güncel takım değilse… N600 G0 G40 G60 G90 SUPA X450 Y300 Z300 D0 ; …takım değiştirme konumuna git… N610 M206 ; …ve takım değiştir N620 ENDIF N630 M17
Örnekten çıkarılacak üç ders 1. Takım değiştirme konumuna gidiş SUPA ile yazılmıştır — böylece hareket hiçbir sıfır ofsetinden ve çerçeveden etkilenmez. 2. Aynı satırda D0 vardır; takım telafisi kapatılmadan takım değişim noktasına gidilmez. 3. STOPRE okuma işleminden önce yazılmıştır; sistem değişkeni okunacaksa ön işlemenin durdurulması gerekir.

LOOP ve ENDLOOP — sonsuz döngü

Sonsuz döngüler, sonsuz programlarda kullanılır. Döngünün sonunda her zaman başa geri dönüş vardır.

LOOPENDLOOP
Anahtar kelimeAnlamı
LOOPSonsuz döngüyü başlatır
ENDLOOPDöngünün sonunu işaretler ve döngü başına geri dönüş sağlar

Kılavuzun örneği, sonsuz döngünün en mantıklı kullanımıdır — operatörden işlem bekleme:

LOOP MSG (“kesici uç etkin değil”) M0 STOPRE ENDLOOP

Mesaj ekrana yazılır, M0 ile program durur, operatör düzeltip NC Start’a basınca döngü tekrar başa döner ve durum düzelmediyse yine durur.

Sonsuz döngüden çıkış LOOP–ENDLOOP arasında atlama komutu yoksa döngü kendiliğinden bitmez. 2010 tarihli Türkçe kaynağın ifadesiyle: program, RESET tuşuna basılana veya enerji kesilene kadar döner. Bu yüzden sonsuz döngü ya kasıtlı bir bekleme yapısı olarak ya da içine bir çıkış koşulu konarak kullanılmalıdır.

FOR … TO … ve ENDFOR — sayılı döngü

Sayılı döngü, bir işlemin sabit sayıda tekrarlanması gerektiğinde kullanılır.

FOR <değişken> = <başlangıç değeri> TO <son değer> … ENDFOR
ÖğeAnlamı
FORSayılı döngüyü başlatır
ENDFORDöngünün sonunu işaretler; sayım son değere ulaşmadığı sürece döngü başına geri döner
<değişken>Sayım değişkeni. Başlangıç değerinden son değere kadar artar ve her turda 1 artar. Tipi INT veya REAL. Not: örneğin R parametresi kullanılırsa tip REAL olur; sayım değişkeni REAL tipindeyse değeri tam sayıya yuvarlanır.
<başlangıç değeri>Sayımın başlangıç değeri. Koşul: başlangıç değeri son değerden küçük olmalıdır.
<son değer>Sayımın bitiş değeri

Örnek 1 — INT değişken ve R parametresi ile

DEF INT iVARIABLE1 R10=R12-R20*R1 R11=6 FOR iVARIABLE1 = R10 TO R11 ; sayım değişkeni = INTEGER değişken R20=R21*R22+R33 ENDFOR M30R11=6 FOR R10=R12-R20*R1 TO R11 ; sayım değişkeni = R parametresi (real) R20=R21*R22+R33 ENDFOR M30

Örnek 2 — sabit adette parça üretimi

DEF INT WKPCCOUNT ; “WKPCCOUNT” adıyla INT tipi değişken tanımlanır FOR WKPCCOUNT = 0 TO 100 ; sayılı döngü; değişken 0’dan 100’e artar G01 … ENDFOR ; sayılı döngü sonu M30
Adım her zaman 1’dir SINUMERIK’in FOR döngüsünde artış adımı verilemez; değişken her turda bir artar. “İkişer artsın” gibi bir ihtiyaç varsa ya döngü içinde ikinci bir değişken kullanılır ya da WHILE döngüsüne geçilir.

WHILE ve ENDWHILE — koşul döngü başında

WHILE döngüsünde koşul döngünün başındadır. Döngü, koşul sağlandığı sürece çalışır. Koşul en baştan sağlanmıyorsa döngü hiç çalışmaz.

WHILE <koşul> … ENDWHILE
Anahtar kelimeAnlamı
WHILEProgram döngüsünü başlatır
ENDWHILEDöngünün sonunu işaretler ve döngü başına geri dönüş sağlar
<koşul>WHILE döngüsünün çalışması için sağlanması gereken koşul

Kılavuzun örneği, gerçek eksen konumuna göre kademeli dalma yapar:

WHILE $AA_IW[DRILL_AXIS] > -10 ; Koşul: delme eksenindeki güncel WCS ayar değeri -10’dan büyük olmalı G1 G91 F250 AX[DRILL_AXIS] = -1 ENDWHILE

Burada $AA_IW[...] eksenin parça koordinat sistemindeki ayar değeridir; her turda 1 mm artımsal dalınır ve eksen −10’a ulaştığında döngü biter.

REPEAT ve UNTIL — koşul döngü sonunda

REPEAT döngüsünde koşul döngünün sonundadır. Döngü bir kez çalıştırılır ve koşul sağlanana kadar tekrarlanır.

REPEATUNTIL <koşul>
Anahtar kelimeAnlamı
REPEATProgram döngüsünü başlatır
UNTILDöngünün sonunu işaretler ve döngü başına geri dönüş sağlar
<koşul>REPEAT döngüsünün artık çalıştırılmaması için sağlanması gereken koşul
Kaynak dosyada tespit edilen teknik hata 2010 tarihli Türkçe kaynak, REPEAT döngüsü için şunu yazıyor: “İşlev olarak WHILE döngüsü ile aynıdır. Tek farkı WHILE döngüsünde koşul döngü başında, REPEAT döngüsünde koşul döngü sonundadır.” Bu ifade eksik ve yanıltıcıdır. İki fark daha vardır ve ikisi de programın davranışını tersine çevirir: Koşulun anlamı terstir. WHILE’da koşul, döngünün çalışması için sağlanmalıdır. UNTIL’de ise koşul, döngünün artık çalışmaması için sağlanmalıdır. Aynı koşulu iki yapıya yazarsanız zıt sonuç alırsınız. REPEAT en az bir kez çalışır. WHILE, koşul baştan sağlanmıyorsa hiç çalışmaz; REPEAT gövdesi her hâlükârda bir kez işlenir. Yukarıdaki tanımlar, 01/2015 tarihli Job Planning (6FC5398-2BP40-5BA2) kılavuzundan alınmıştır ve esas alınması gereken tanımlar bunlardır.

Hangi döngüyü seçmeli?

DurumDoğru yapı
Tekrar sayısı baştan belli (40 delik, 100 parça)FOR ... TO ... ENDFOR
Tekrar sayısı belli değil, koşul baştan kontrol edilmeli (hiç çalışmayabilir)WHILE ... ENDWHILE
Gövde en az bir kez çalışmalı, sonra koşula bakılmalıREPEAT ... UNTIL
Operatör müdahalesi beklenecek, program kendiliğinden ilerlemeyecekLOOP ... ENDLOOP
İki alternatiften biri seçilecekIF ... ELSE ... ENDIF
İkiden fazla, tam sayı değerine göre dallanmaCASE ... OF ... DEFAULT

İç içe kontrol yapısı örneği

Kılavuzun kendi örneği, üç yapıyı birlikte kullanır ve gerçek bir emniyet problemini çözer: blok arama sırasında delme yapılmamalıdır.

LOOP IF NOT $P_SEARCH ; Blok arama yoksa G1 G90 X0 Z10 F1000 WHILE $AA_IM[X] <= 100 ; WHILE (X ekseni ayar değeri <= 100) G1 G91 X10 F500 ; Delik deseni Z-5 F100 Z5 ENDWHILE ELSE ; ELSE: blok arama MSG(“Blok arama sırasında delme yok”) ENDIF $A_OUT[1] = 1 ; Sonraki delme plakası G4 F2 ENDLOOP M30

Yapının okunması: dıştaki LOOP plaka plaka çalışmayı sürdürür; IF NOT $P_SEARCH yalnızca normal çalışmada delme yapılmasını sağlar; içteki WHILE X ekseni 100’e ulaşana kadar delik deseni işler; blok arama sırasında ise sadece ekrana mesaj yazılır.

Neden bu kadar önemli? Blok arama sırasında kontrol programı “hesaplar” ama kesme yapmamalıdır. $P_SEARCH sistem değişkeni kontrol edilmezse, arama sırasında çıkış sinyalleri ve hareketler istenmeyen biçimde tetiklenebilir. Kendi çevrimini yazan herkesin bu deseni bilmesi gerekir.

Program atlamaları: GOTOS, GOTOB, GOTOF, GOTO, GOTOC

GOTOS — program başına dönüş

GOTOS komutu, programı tekrarlamak için bir ana programın veya alt programın başına geri dönmek amacıyla kullanılır. Makine verisiyle her geri dönüşte şunlar ayarlanabilir:

  • Program çalışma süresi “0” yapılır.
  • Parça sayacı “1” değeri kadar artırılır.
NC/PLC arayüz sinyali DB21, DBX384.0 (program dallanması)Anlamı
0Program başına geri dönüş yok. Program, GOTOS’tan sonraki parça programı bloğuyla devam eder.
1Program başına geri dönüş yapılır. Parça programı tekrarlanır.
GOTOS’un üç kritik yan etkisi 1. GOTOS dahili olarak bir STOPRE (ön işleme durdurma) başlatır. 2. Veri tanımlamaları (LUD değişkenleri) içeren bir alt programda GOTOS, tanımlama bölümünden sonraki ilk program bloğuna atlar; yani veri tanımlamaları yeniden çalıştırılmaz. Bu nedenle tanımlanan değişkenler GOTOS bloğunda ulaştıkları değeri korur ve tanımlama bölümünde programlanan standart değerlere sıfırlanmaz. 3. GOTOS komutu senkron aksiyonlarda ve teknoloji çevrimlerinde kullanılamaz.

GOTOB, GOTOF, GOTO, GOTOC — etikete atlama

Programda atlama etiketleri (label) tanımlanır ve aynı program içindeki başka bir yerden bu etiketlere atlanır. Program çalışması, hedef etiketin hemen ardından gelen deyimle devam eder.

GOTOB <atlama hedefi> IF <atlama koşulu> = TRUE GOTOB <atlama hedefi> GOTOF <atlama hedefi> IF <atlama koşulu> = TRUE GOTOF <atlama hedefi> GOTO <atlama hedefi> IF <atlama koşulu> = TRUE GOTO <atlama hedefi> GOTOC <atlama hedefi> IF <atlama koşulu> = TRUE GOTOC <atlama hedefi>
KomutAnlamı
GOTOBAtlama hedefi programın başına doğru olan atlama deyimi
GOTOFAtlama hedefi programın sonuna doğru olan atlama deyimi
GOTOAtlama hedefi aranarak bulunur: arama önce program sonuna doğru, sonra program başına doğru yapılır
GOTOCGOTO ile aynı; farkı, “14080 Atlama tanımı bulunamadı” alarmının bastırılmasıdır. Hedef bulunamazsa program kesilmez, GOTOC komutundan sonraki satırla devam eder.
Atlama hedefi olabileceklerAçıklama
<atlama etiketi>Kullanıcı tanımlı adla programda kurulan etiket: <etiket>:
<blok numarası>Ana blok veya alt blok numarası (örn. 200, N300)
STRING tipi değişkenDeğişken atlama hedefi; değişken bir etiket veya blok numarası taşır

Etiket adlandırma kuralları

  • Etiketler her zaman bloğun başındadır. Blok numarası varsa etiket, blok numarasının hemen ardından gelir.
  • Karakter sayısı: en az 2, en fazla 32.
  • İzin verilen karakterler: harf, rakam, alt çizgi.
  • İlk iki karakter harf veya alt çizgi olmalıdır.
  • Etiket adının sonunda iki nokta üst üste (“:”) bulunur.

Ek koşullar

  • Atlama hedefi yalnızca program içinde bulunan, etiketli veya blok numaralı bir blok olabilir.
  • Atlama koşulu olmayan bir atlama deyimi ayrı bir blokta programlanmalıdır. Atlama koşulu olan deyimler için bu kısıt geçerli değildir; bu durumda bir blokta birden fazla atlama deyimi yazılabilir.
  • Atlama koşulu olmayan atlama deyimleri içeren programlarda M2/M30 program sonunun programın en sonunda olması gerekmez.

Örnek — koşullu atlama

N40 R1=30 R2=60 R3=10 R4=11 R5=50 R6=20 ; Başlangıç değerleri N41 LA1: G0 X=R2*COS(R1)+R5 Y=R2*SIN(R1)+R6 ; LA1 etiketi kuruldu N42 R1=R1+R3 R4=R4-1 N43 IF R4>0 GOTOB LA1 ; Koşul sağlanırsa program başına doğru LA1’e atla N44 M30
Kaynak dosyada tespit edilen ikinci hata 2010 tarihli Türkçe kaynakta aynı örnek bozuk blok numaralarıyla verilmiştir: N150 MA1:N160N170 → tekrar N150N190. Aynı blok numarası (N150) iki kez kullanılmış, N180 atlanmıştır. Yukarıdaki sürüm, 01/2015 tarihli Job Planning kılavuzunun doğru numaralandırılmış örneğidir. Aynı blok numarasının iki kez kullanılması, blok arama ve atlama davranışını bozar.

Örnek — blok numarasına dolaylı atlama

N5 R10=100 N10 GOTOF “N”<<R10 ; Blok numarası R10’da bulunan bloğa atla … N90 … N100 … ; Atlama hedefi N110 …

Örnek — değişken atlama hedefi

DEF STRING[20] DESTINATION DESTINATION = “Marker2” GOTOF DESTINATION ; Program sonuna doğru, DESTINATION değişkenindeki hedefe atla Marker1: T=”Drill1″ … Marker2: T=”Drill2″ ; Atlama hedefi

Bu iki kalıp, tek programın farklı takım/işlem senaryolarını yönetmesini sağlar: hedef adı bir değişkende tutulur, karar program içinde verilir.

CASE … OF … DEFAULT — çok yollu dallanma

CASE fonksiyonu, bir değişkenin veya aritmetik fonksiyonun güncel değerini (tip: INT) kontrol etme ve sonuca göre programda farklı konumlara atlama imkânı verir.

CASE(<ifade>) OF <sabit_1> GOTOF <hedef_1> <sabit_2> GOTOF <hedef_2> … DEFAULT GOTOF <hedef_n>
ÖğeAnlamı
CASEAtlama deyimi
<ifade>Değişken veya aritmetik fonksiyon
OFKoşullu program dallanmalarını tanımlayan anahtar kelime
<sabit_1>, <sabit_2>Değişken veya aritmetik fonksiyon için belirtilen sabit değerler. Tip: INT
DEFAULTDeğişken belirtilen sabit değerlerin hiçbirini almadığında atlama hedefini belirler. DEFAULT programlanmazsa, bu durumlarda CASE deyiminden sonraki blok atlama hedefidir.
GOTOFProgram sonuna doğru atlama deyimi. GOTOF yerine diğer bütün GOTO komutları da programlanabilir.

Kılavuzun örneği

N20 DEF INT VAR1 VAR2 VAR3 N30 CASE(VAR1+VAR2-VAR3) OF 7 GOTOF Label_1 9 GOTOF Label_2 DEFAULT GOTOF Label_3 N40 Label_1: G0 X1 Y1 N50 Label_2: G0 X2 Y2 N60 Label_3: G0 X3 Y3
  1. VAR1+VAR2−VAR3 = 7 ise “Label_1” etiketli bloğa (→ N40) atlanır.
  2. VAR1+VAR2−VAR3 = 9 ise “Label_2” etiketli bloğa (→ N50) atlanır.
  3. Sonuç ne 7 ne 9 ise “Label_3” etiketli bloğa (→ N60) atlanır.
CASE nerede işe yarar? Parça tipine, bağlama istasyonuna, ölçüm sonucu sınıfına veya operatör seçimine göre farklı işleme rutinlerinin çağrılması. Aynı işi iç içe IF’lerle de yapabilirsiniz ama CASE hem daha okunaklıdır hem de tam sayı karşılaştırmasında daha hızlıdır.

Program bölümü tekrarı: REPEAT, REPEATB, ENDLABEL, P

Program bölümü tekrarı, bir program içindeki mevcut program bölümlerinin istenen sırayla tekrarlanmasını sağlar. Tekrarlanacak program satırları veya bölümleri atlama etiketleriyle belirlenir.

Dikkat: iki farklı REPEAT vardır Bu bölümdeki REPEAT, bir önceki bölümdeki REPEAT ... UNTIL döngüsü değildir. Buradaki REPEAT bir program bölümü tekrarıdır ve P adresiyle tekrar sayısı verilir. Aynı anahtar kelimenin iki ayrı işlevi olması, Siemens programlamasında en çok karıştırılan noktalardan biridir.

Dört kullanım biçimi

1. Tek program satırını tekrarla

<etiket>: … … REPEATB <etiket> P=<n>

2. Etiket ile REPEAT deyimi arasındaki bölümü tekrarla

<etiket>: … … REPEAT <etiket> P=<n>

3. İki etiket arasındaki bölümü tekrarla

<başlangıç etiketi>: … … <bitiş etiketi>: … … REPEAT <başlangıç etiketi> <bitiş etiketi> P=<n>

4. Etiket ile ENDLABEL arasındaki bölümü tekrarla

<etiket>: … … ENDLABEL: … … REPEAT <etiket> P=<n>
ÖğeAnlamı
REPEATBBir program satırını tekrarlama komutu
REPEATBir program bölümünü tekrarlama komutu
ENDLABELTekrarlanacak program bölümünün sonunu işaretleyen anahtar kelime. ENDLABEL programda birden fazla kez kullanılabilir. ENDLABEL satırında başka işlemler varsa bunlar her tekrarda yeniden çalıştırılır.
P=<n>Tekrar sayısı (tip INT). Program bölümü <n> kez tekrarlanır; son tekrardan sonra program REPEAT/REPEATB satırından sonraki satırdan devam eder. P=<n> verilmezse bölüm yalnızca bir kez tekrarlanır.

Etiket arama yönü — dikkat edilmesi gereken nokta

Etiketle belirlenen program satırı, REPEAT/REPEATB deyiminden önce veya sonra yer alabilir. Arama önce program başına doğru başlar; etiket bu yönde bulunamazsa arama program sonuna doğru sürdürülür.

İstisna Etiket ile REPEAT deyimi arasındaki bölüm tekrarlanacaksa (yukarıdaki 2. biçim), etiketli program satırı REPEAT deyiminden önce olmak zorundadır; çünkü bu durumda arama yalnızca program başına doğru yapılır.

Ayrıca etiketin bulunduğu satırda başka işlemler varsa, bunlar her tekrarda yeniden çalıştırılır.

Örnek 1 — tek satır tekrarı

N10 POSITION1: X10 Y20 N20 POSITION2: CYCLE(0,,9,8) ; Konum çevrimi N30 … N40 REPEATB POSITION1 P=5 ; N10 bloğunu beş kez çalıştır N50 REPEATB POSITION2 ; N20 bloğunu bir kez çalıştır N60 … N70 M30

Örnek 2 — etiket ile REPEAT arasındaki bölüm

N5 R10=15 N10 Begin: R10=R10+1 ; Genişlik N20 Z=10-R10 N30 G1 X=R10 F200 N40 Y=R10 N50 X=-R10 N60 Y=-R10 N70 Z=10+R10 N80 REPEAT BEGIN P=4 ; N10’dan N70’e kadarki bölümü dört kez çalıştır N90 Z10 N100 M30

Örnek 3 — iki etiket arasındaki bölüm

N5 R10=15 N10 Begin: R10=R10+1 ; Genişlik N20 Z=10-R10 N30 G1 X=R10 F200 N40 Y=R10 N50 X=-R10 N60 Y=-R10 N70 END: Z=10 N80 Z10 N90 CYCLE(10,20,30) N100 REPEAT BEGIN END P=3 ; N10’dan N70’e kadarki bölümü üç kez çalıştır N110 Z10 N120 M30

Örnek 4 — aynı delik konumlarını farklı teknolojilerle işleme

Bu örnek, program bölümü tekrarının en güçlü kullanımıdır: delik konumları bir kez yazılır, sonra aynı konumlar merkezleme, delme ve kılavuz çekme için tekrar tekrar çağrılır.

N10 CENTER DRILL() ; Merkezleme matkabını yükle N20 POS_1: ; Delme konumları 1 N30 X1 Y1 N40 X2 N50 Y2 N60 X3 Y3 N70 ENDLABEL: N80 POS_2: ; Delme konumları 2 N90 X10 Y5 N100 X9 Y-5 N110 X3 Y3 N120 ENDLABEL: N130 DRILL() ; Matkabı ve delme çevrimini değiştir N140 THREAD(6) ; M6 kılavuzu ve diş çevrimini yükle N150 REPEAT POS_1 ; POS_1’den ENDLABEL’e kadarki bölümü bir kez tekrarla N160 DRILL() ; Matkabı ve delme çevrimini değiştir N170 THREAD(8) ; M8 kılavuzu ve diş çevrimini yükle N180 REPEAT POS_2 ; POS_2’den ENDLABEL’e kadarki bölümü bir kez tekrarla N190 M30

Ek bilgiler ve sınırlar

  • Program bölümü tekrarları iç içe kullanılabilir. Her çağrı bir alt program seviyesi harcar.
  • Program bölümü tekrarı işlenirken M17 veya RET programlanırsa tekrar iptal edilir. Program, REPEAT satırından sonraki bloktan devam eder.
  • Güncel program göstergesinde program bölümü tekrarı ayrı bir alt program seviyesi olarak görüntülenir.
  • Seviye, program bölümü tekrarı sırasında iptal edilirse program, program bölümü tekrarı çağrısından sonraki noktadan devam eder.
  • REPEAT deyimi ile iki etiketin parantez içinde iç içe kullanılması mümkün değildir. Başlangıç etiketi REPEAT deyiminden önce görünüyorsa ve bitiş etiketine REPEAT deyiminden önce ulaşılmıyorsa, başlangıç etiketi ile REPEAT deyimi arasındaki bölüm tekrarlanır. Aynı kısıt etiket + ENDLABEL kullanımı için de geçerlidir.
  • Kontrol yapıları ve program bölümü tekrarları birlikte kullanılabilir; ancak ikisi arasında örtüşme olmamalıdır. Bir program bölümü tekrarı bir kontrol yapısı dalının içinde yer almalı ya da bir kontrol yapısı bir program bölümü tekrarının içinde yer almalıdır.
  • Atlamalar ve program bölümü tekrarları karıştırılırsa bloklar tamamen sıralı olarak işlenir. Örneğin bir program bölümü tekrarından atlama yapılırsa, program bölümünün programlanmış sonu bulunana kadar işleme devam eder.
  • REPEAT deyimi, hareket bloğundan sonra yazılmalıdır.

Kontrol yapısı mı, atlama mı kullanmalı?

Kılavuz bu soruya doğrudan cevap verir:

Çalışma zamanı davranışı (kılavuzun ifadesi) Standart olarak etkin olan yorumlayıcı (interpreter) modda, program işleme sürelerini kısaltmak için program dallanmaları, kontrol yapılarına göre daha etkilidir. Ön derlenmiş çevrimlerde ise program dallanmaları ile kontrol yapıları arasında fark yoktur.
Kontrol yapıları (IF, WHILE, FOR…)Atlamalar (GOTOB, GOTOF, CASE)
OkunabilirlikYüksek — yapı gözle takip edilirDüşük — etiketler arasında gezinmek gerekir
Yorumlayıcı modda hızDaha yavaşDaha hızlı
Ön derlenmiş çevrimde hızFark yokFark yok
İç içe sınırAlt program seviyesi başına 16Yapısal sınır yok, ama karmaşıklık artar
Blok bastırma (skip)KullanılamazKullanılabilir
Etiket kullanımıAynı blokta yasakZorunlu

Pratik öneri: okunabilirlik ve bakım kolaylığı için kontrol yapılarını tercih edin. Çevrim yazıyorsanız ve çevrim ön derlenecekse zaten fark yoktur. Yalnızca çok uzun ve çok sık dönen döngülerde, yorumlayıcı modda çalışma süresi sorun oluyorsa atlamaya geçin. İkisini aynı bölümde karıştırmayın — kılavuz bunu açıkça tavsiye etmiyor.

Sahada en sık yapılan hatalar

  1. WHILE ve UNTIL koşulunu aynı sanmak. WHILE’da koşul “çalışması için”, UNTIL’de “artık çalışmaması için” sağlanmalıdır. Aynı koşulu iki yapıya yazmak zıt sonuç verir.
  2. Değişken tanımlarını döngü içine koymak. Kontrol yapıları yalnızca komut bölümünde çalışır; program başlığındaki tanımlar koşullu veya tekrarlı çalıştırılamaz.
  3. Kontrol yapısı bloğuna etiket yazmak. Kontrol yapısı elemanı içeren bloklarda atlama etiketine izin verilmez.
  4. Kontrol yapısı satırını atlama seviyesiyle bastırmaya çalışmak. Bu bloklar bastırılamaz.
  5. Dengesiz ENDIF / ENDWHILE / ENDFOR bırakmak. Yorumlayıcı modda blok yapısı tam kontrol edilmediği için hata ancak çalışma anında ortaya çıkar.
  6. 16 iç içe sınırını aşmak. Her alt program seviyesinde en fazla 16 kontrol yapısı iç içe kurulabilir.
  7. GOTOS’un STOPRE başlattığını bilmemek. Sürekli geçiş modunda çalışan bir programda beklenmedik duraklamaların sebebi bu olabilir.
  8. GOTOS sonrası değişkenlerin sıfırlanmasını beklemek. LUD değişkenleri değerlerini korur; tanımlama bölümü yeniden çalıştırılmaz.
  9. Program bölümü tekrarındaki REPEAT ile döngüdeki REPEAT’i karıştırmak. Biri P=<n> ile sayı alır, diğeri UNTIL ile biter.
  10. P değeri vermeden REPEAT yazmak. P belirtilmezse bölüm yalnızca bir kez tekrarlanır — çoğu kullanıcı “hiç tekrarlamaz” veya “sonsuz tekrarlar” sanır.
  11. Kontrol yapısı ile bölüm tekrarını örtüştürmek. Biri diğerinin tamamen içinde olmalıdır.
  12. Blok arama kontrolü ($P_SEARCH) koymamak. Blok arama sırasında hareket ve çıkış sinyali tetiklenebilir.

Sık sorulan sorular

Fanuc makro B’deki WHILE [koşul] DO1 … END1 karşılığı nedir?

WHILE <koşul> ... ENDWHILE. SINUMERIK’te DO/END numarası yoktur; iç içe yapılar anahtar kelimelerle eşleşir.

FOR döngüsünde adımı 2 yapabilir miyim?

Hayır. Sayım değişkeni her turda 1 artar. Farklı adım gerekiyorsa WHILE kullanın ve artışı kendiniz yazın.

Sayım değişkeni olarak R parametresi kullanabilir miyim?

Evet. Bu durumda değişken REAL tipinde olur ve kılavuzun belirttiği gibi değeri tam sayıya yuvarlanır.

Başlangıç değeri son değerden büyük olursa ne olur?

Kılavuz koşulu net koyar: başlangıç değeri son değerden küçük olmalıdır. Tersi bir kullanım için FOR uygun değildir.

Programın sonsuza kadar dönmesini nasıl durdururum?

LOOP–ENDLOOP arasına bir çıkış koşulu (IF + GOTOF) koyun ya da yapıyı WHILE’a çevirin. Aksi hâlde 2010 tarihli kaynağın belirttiği gibi program yalnızca RESET ile veya enerji kesilerek durur.

GOTOC ne zaman kullanılır?

Atlama hedefinin bazen var bazen yok olduğu, opsiyonel program bölümlerinde. Hedef bulunamazsa 14080 alarmı verilmez ve program bir sonraki satırdan devam eder.

CASE’de DEFAULT yazmazsam ne olur?

Değişken belirtilen sabitlerin hiçbirine eşit değilse, CASE deyiminden sonraki blok atlama hedefi olur.

REPEAT ile alt program çağırmak arasındaki fark nedir?

REPEAT ayrı bir dosya gerektirmez; aynı program içindeki bölümü tekrarlar. Ancak her REPEAT çağrısı bir alt program seviyesi harcar ve güncel program göstergesinde ayrı bir alt program seviyesi olarak görünür.

Döngü içindeyken ekranda blok numarası neden değişmiyor?

Çünkü güncel blok göstergesinde döngüden önceki son ana çalışma bloğu gösterilir. İşlenen blokların görünmesi için çözümleyici tek blok SBL2 etkinleştirilmelidir.

Mentor CNC notu: Kontrol yapıları ve atlamalar, programın hangi hareketin ne zaman yapılacağını belirler; hatalı bir koşul, takımın beklenmedik bir yere gitmesine sebep olabilir. Yeni yazılan her döngü ve dallanma önce grafik/simülasyonda, sonra parça bağlanmadan, tek blok ve düşük ilerleme override’ı ile denenmelidir. Özellikle sonsuz döngüler ve koşullu takım değiştirme rutinleri, tezgâhta ilk denemede gözetim altında çalıştırılmalıdır. Bu sayfadaki sözdizimi, değer aralıkları ve sistem değişkenleri belirtilen Siemens kaynaklarına dayanır; kontrol sürümüne ve makine üreticisinin yapılandırmasına göre farklılık gösterebilir. Makine üreticisinin kılavuzu her zaman önceliklidir. Bu sayfa eğitim amaçlıdır ve resmî kılavuzun yerini tutmaz.

Kaynaklar

  • Siemens AG — SINUMERIK İleri Seviye CNC Kullanım & Programlama, 05/2010: Bölüm 4.8 Dolaylı Programlama (koşullu atlama, durum koşullaması / CASE), Bölüm 4.9 Döngüler (sonsuz döngü LOOP–ENDLOOP, IF–ELSE–ENDIF, sayılı döngü FOR–ENDFOR, WHILE–ENDWHILE, REPEAT–UNTIL)
  • Siemens AG — SINUMERIK 840D sl / 828D Job Planning, Programming Manual, 01/2015, doküman no 6FC5398-2BP40-5BA2: Bölüm 2.10 Program atlamaları ve dallanmalar (2.10.1 GOTOS, 2.10.2 GOTOB/GOTOF/GOTO/GOTOC, 2.10.3 CASE…OF…DEFAULT), Bölüm 2.11 Program bölümü tekrarı (REPEAT, REPEATB, ENDLABEL, P), Bölüm 2.12 Kontrol yapıları (2.12.1 IF/ELSE/ENDIF, 2.12.2 LOOP/ENDLOOP, 2.12.3 FOR/ENDFOR, 2.12.4 WHILE/ENDWHILE, 2.12.5 REPEAT/UNTIL, 2.12.6 iç içe kontrol yapısı örneği)

MENTOR CNC
Sahadan gelen cnc bilgisi

Mentor CNC; CNC torna, CNC freze, kontrol üniteleri, kesici takımlar ve teknik hesaplamalar konusunda üretim sahasında edinilen tecrübeyi anlaşılır ve uygulanabilir teknik içeriklere dönüştürür.

Amacımız; operatörlerin, öğrencilerin, mühendislerin ve atölye sahiplerinin doğru bilgiye daha hızlı ulaşmasını ve üretimde daha güvenli, verimli kararlar almasını sağlamaktır.