Değişken ne işe yarar? Önce bunu netleştirelim
Klasik bir CNC programında her şey sabittir. Delik derinliği Z-20 yazılmıştır, o programda hep 20 mm’dir. Aynı parçanın 25 mm’lik hâlini işleyeceksen programı açıp elle değiştirirsin.
Değişken kullanınca bu iş tersine döner: derinliği programın başında bir kere yazarsın, program da onu kullanır. Ölçü değişince tek satır değiştirirsin, gerisi kendiliğinden uyar. Aynı program 10 farklı ölçüde parçayı işler.
Fanuc’tan geliyorsan bu sana yabancı değil — orada makro değişkenleri (#100, #500) var. Siemens’te aynı iş yapılır ama sistem daha geniş: değişkene tip verirsin, isim verirsin, hatta geçerlilik alanını belirlersin.
| Fanuc’ta | SINUMERIK’te | Not |
|---|---|---|
#100 (yerel makro değişkeni) | R10 ya da kendi tanımladığın değişken | R parametreleri numaralıdır, kendi değişkenlerine isim verirsin |
#500 (kalıcı ortak değişken) | GUD (global kullanıcı değişkeni) | SINUMERIK’te ayrı bir tanım dosyasında tanımlanır |
#1000 serisi (sistem) | $ ile başlayan sistem değişkenleri | SINUMERIK tarafında çok daha ayrıntılı |
| Tip yok, hepsi sayı | INT, REAL, BOOL, CHAR, STRING, AXIS, FRAME | Yanlış tip yazarsan kontrol alarm verir |
DEF ile tanımlama, veri tipleri ve sınırları, sistem değişkenlerinin $ önek mantığı, hesap ve karşılaştırma işlemleri. Bilgiler Siemens’in güncel Job Planning programlama kılavuzundan alınmıştır.SINUMERIK’te üç tür değişken vardır
Kılavuz değişkenleri net biçimde üçe ayırıyor. Karışıklığın çoğu bu ayrımı bilmemekten çıkıyor.
1. Sistem değişkenleri
Anlamı kontrol tarafından sabitlenmiş, hazır gelen değişkenlerdir. Makine dataları, ayar dataları, takım verileri, o anki eksen konumu… Hepsinin adı $ ile başlar. Sen tanımlamazsın, sadece okur — yetkin varsa yazarsın.
2. Önceden tanımlı kullanıcı değişkenleri
Sistemde zaten vardır, ama kaç tane olacağını makine datası belirler. En bilineni R parametreleridir. Ayrıca link değişkenleri de bu gruptadır.
3. Kendi tanımladığın değişkenler
Adını, tipini, boyutunu, görünürlüğünü tamamen sen belirlersin. DEF komutuyla tanımlanır ve program çalışırken oluşturulur.
R parametreleri — en çok kullanacağın şey
R parametreleri kanala özel, önceden tanımlı kullanıcı değişkenleridir. Kılavuzun tanımıyla: REAL veri tipinde bir dizidir. Yani her R parametresi ondalıklı sayı tutabilir.
İki farklı yazım, aynı şey
Tarihsel sebeplerle iki yazım da geçerlidir:
Dizinli yazımın avantajı şudur: köşeli parantezin içine ifade yazabilirsin.
Buna dolaylı programlama denir ve döngülerle birlikte çok güçlüdür — 20 farklı deliğin derinliğini R20…R39 arasına koyup döngüde tek satırla dolaşabilirsin.
Kaç tane R parametresi var?
Burada 2010’lu yılların Türkçe eğitim notlarında sık geçen bir yanlış var: “100 adettir, R1’den R99’a kadar” denir. Doğrusu şu:
- Numaralandırma R0‘dan başlar, R1’den değil.
- Sayı sabit değildir. Üst sınır makine datasıyla belirlenir:
MAX_INDEX = (MD28050 $MN_MM_NUM_R_PARAM) − 1
Yani kendi tezgâhında kaç R parametresi olduğunu bilmek istiyorsan MD28050’ye bakacaksın. 100 tanımlıysa geçerli aralık R0…R99’dur.
Değer aralığı
| Yazım | Aralık | Sınır |
|---|---|---|
| Normal (üstel olmayan) | ± (0,0000001 … 9999999) | En fazla 8 ondalık basamak |
| Üstel | ± (1×10−300 … 1×10+300) | Yazım: 8.2EX-3 · işaret ve nokta dahil en fazla 10 karakter |
$ gelir.Parça programında R10 yazarsın. Aynı parametreyi bir senkron eylem içinde kullanacaksan $R10 yazman gerekir. Sebebi teknik: R10 program hazırlanırken (ön işleme), $R10 ise hareket gerçekleşirken (ana çalışma) okunur. Karıştırırsan değer beklediğinden farklı çıkar.Kendi değişkenini tanımlamak: DEF
R10, R11, R12… ile yazılmış uzun bir program altı ay sonra okunmaz. DEF ile değişkene isim verirsin ve program kendi kendini açıklar.
En sade hâli
İsimlendirme kuralları — kılavuzun kendi ifadesi
- En fazla 31 karakter. (Türkçe kaynaklarda sık geçen “32 karakter” yanlıştır.)
- İlk iki karakter harf ve/veya alt çizgi olmalıdır.
_DERINLIKolur,D1ERINLIKolur,1DERINLIKolmaz. $işareti sistem değişkenlerine ayrılmıştır, kullanılamaz.
Tanım nereye yazılır?
Kılavuzun kuralları şöyle:
- Veriler kendine ait bir blokta tanımlanmalıdır — hareket satırının içine sıkıştırılamaz.
- Her tanım satırında tek bir veri tipi kullanılır.
- Aynı tipten birden fazla değişken tek satırda tanımlanabilir.
İleri seviye: DEF’in tam sözdizimi
Günlük işte gerekmez, ama sınır ve birim atamak isteyenler için kılavuz şu yapıyı veriyor:
Buradaki PHU fiziksel birimi, LLI alt sınırı, ULI üst sınırı belirler. Örnek:
Sınır koymanın faydası: değişkene aralık dışında bir değer atanırsa kontrol uyarır. Program yanlış değerle sessizce çalışmaz.
Veri tipleri ve gerçek sınırları
Yanlış tip seçmek programın alarm vermesinin en sık sebeplerinden biridir. Aşağıdaki tablo kılavuzun kendi tablosudur:
| Tip | Ne tutar? | Değer aralığı |
|---|---|---|
INT | İşaretli tam sayı | −2.147.483.648 … +2.147.483.647 |
REAL | Gerçek (ondalıklı) sayı, IEEE LONG REAL | ±(~2,2×10−308 … ~1,8×10+308) |
BOOL | Doğru / yanlış | TRUE (1), FALSE (0) |
CHAR | Tek ASCII karakteri | ASCII kodu 0 … 255 |
STRING | Belirli uzunlukta karakter dizisi | En fazla 200 karakter (özel karakter yok) |
AXIS | Eksen / iş mili tanımlayıcısı | Kanal eksen adı |
FRAME | Koordinat dönüşümü verisi (taşıma, döndürme, ölçekleme, aynalama) | — |
Tip dönüşümünde dikkat edilecek nokta
REAL bir değeri INT değişkene atarsan kontrol yuvarlar: ondalık kısım 0,5 ve üzeriyse yukarı, altındaysa aşağı. Yani DEF INT A yapıp A=7.6 yazarsan A içinde 8 olur — 7 değil. Bunu bilmeden ölçü hesabı yapmak parçayı bozar.
Sistem değişkenleri ve $ önek sistemi
Sistem değişkenlerinin adı rastgele değildir. $ işaretinden sonraki harfler hangi veri olduğunu, ondan sonraki harf ise nerede geçerli olduğunu söyler.
İlk harf — hangi veri?
| Önek | Anlamı | Ne zaman okunur? |
|---|---|---|
$M | Makine datası | Ön işleme sırasında |
$S | Ayar datası (setting data), koruma bölgeleri | |
$T | Takım yönetimi verileri | |
$P | Programlanan değerler | |
$C | ISO çevrim kabuğunun çevrim değişkenleri | |
$O | Opsiyon datası | |
R | R parametreleri | |
$$M / $$S | Makine / ayar datası | Ana çalışma sırasında |
$A | O anki ana çalışma verisi | |
$V | Servo verisi | |
$R | R parametreleri (senkron eylemde) |
$S için “sistem datası” yazılır — doğrusu ayar datasıdır (setting data), sistem datası değil. $V için “servis datası” yazılır — doğrusu servo datasıdır. İkisi de anlamı tamamen değiştiriyor.İkinci harf — nerede geçerli?
N— NCK geneli (tüm kontrol)C— kanala özelA— eksene özel
Örnek: $AA_IM[X] → $A ana çalışma verisi, ikinci A eksene özel, yani X ekseninin o anki makine koordinatındaki konumu.
$TC_... içindeki C harfi kanalı değil, takım taşıyıcısını (tool carrier) gösterir. $P_... ise kanala özel değişkenleri ifade eder. Türkçe notlarda $TC_DP3[8,2] için “o anki kanala ait takım parametresi” açıklaması bu yüzden yanlıştır.Ön işleme mi, ana çalışma mı?
Bu ayrım pratikte şu anlama gelir: ön işleme değişkenleri kontrol satırı okuyup yorumlarken değerlenir ve ön işleme durdurma tetiklemezler. Ana çalışma değişkenleri ise hareket fiilen gerçekleşirken değerlenir. Eksenin o anki gerçek konumunu okumak istiyorsan ana çalışma değişkenine bakman gerekir; ön işleme değişkeni sana kontrolün önden hesapladığı değeri verir.
Değişken nerede geçerli? LUD, PUD, GUD
Bu konu Türkçe eğitim notlarının çoğunda hiç geçmez, ama “değişkenim alt programda niye boş geliyor?” sorusunun cevabı tam olarak burada.
| Tür | Nerede tanımlanır? | Nereden erişilir? | Ne zaman silinir? |
|---|---|---|---|
| LUD Yerel kullanıcı değişkeni | Ana program olmayan bir parça programında (yani alt programda) | Sadece tanımlandığı programın içinden | Program bitince veya NC Reset’te |
| PUD Program geneli değişken | Ana program olarak çalışan parça programında | Ana programdan ve bütün alt programlarından | Program bitince veya NC Reset’te |
| GUD Global kullanıcı değişkeni | Ayrı bir tanım dosyasında (SGUD, MGUD, UGUD, GUD4…GUD9) | Bütün parça programlarından | Silinmez — kapatıp açsan da durur |
Kural şudur: alt programda tanımladığın değişken ana programa geri dönmez. Değeri her iki tarafta da kullanmak istiyorsan değişkeni ana programda tanımlarsın (PUD olur) ya da GUD yaparsın.
GUD’lar bir tanım dosyasına yazılır, örneğin _N_DEF_DIR/_N_MGUD_DEF. Bunlar makine kapatılıp açıldığında da korunur — Fanuc’taki #500 serisinin karşılığı gibi düşünebilirsin.
Değişkenlerle hesap yapmak
Kılavuzun aritmetik fonksiyon tablosu:
| Komut | Anlamı | Örnek / not |
|---|---|---|
+ − * / | Toplama, çıkarma, çarpma, bölme | 3 / 4 = 0.75 |
DIV | Tam sayı bölme | 7 DIV 4.1 = 1 |
MOD | Modülo — bölmeden kalan | 7 MOD 4.1 = 2.9 |
: | FRAME değişkenleri için zincir operatörü | Sadece frame’lerde |
SIN() COS() TAN() | Sinüs, kosinüs, tanjant | Açı derece cinsindendir (dik açı = 90°) |
ASIN() ACOS() | Ters sinüs, ters kosinüs | |
ATAN2(,) | Ters tanjant 2 | Birbirine dik iki vektörden bileşke açıyı verir, sonuç −180° … +180° |
SQRT() | Karekök | |
POT() | Kare alma (2. kuvvet) | Kare alma POT()‘tur |
ABS() | Mutlak değer | |
TRUNC() | Tam sayı kısmını alır | Karşılaştırma hassasiyeti için de kullanılır |
ROUND() | Tam sayıya yuvarlar | |
LN() EXP() | Doğal logaritma, üstel fonksiyon | |
MINVAL() MAXVAL() | İki değişkenin küçüğü / büyüğü | |
BOUND() | Değeri tanımlı aralık içinde tutar | |
CTRANS() CROT() | Öteleme, döndürme | Frame işlemleri |
CSCALE() CMIRROR() | Ölçekleme, aynalama | Frame işlemleri |
ROT() → kare alma işlemi” diye geçen bir satır dolaşıyor. Yanlıştır. Kılavuzda kare alma POT(), döndürme ise CROT() olarak tanımlanmıştır. ROT zaten frame döndürme komutudur — kare almakla hiçbir ilgisi yoktur. Bu hatayla yazılmış bir hesap yanlış ölçü üretir.Pratik örnek — hipotenüs
Konik hesabı, pah hesabı, delik dairesi koordinatı — hepsi bu iki fonksiyonla çıkar.
Karşılaştırma ve mantık işlemleri
Bunlar IF ve döngü koşullarının temelidir.
Karşılaştırma operatörleri
| Operatör | Anlamı |
|---|---|
== | Eşittir |
<> | Eşit değildir |
> | Büyüktür |
< | Küçüktür |
>= | Büyük veya eşittir |
<= | Küçük veya eşittir |
= değil == ile yazılır.Tek eşittir atamadır: R1=5 demek “R1’e 5 yaz” demektir. Karşılaştırma için çift eşittir gerekir: IF R1==5. Bazı Türkçe kaynaklarda IF X=-50 şeklinde örnekler var; bu yazım koşulu değil atamayı ifade eder ve beklediğin gibi çalışmaz.Karşılaştırma CHAR, INT, REAL ve BOOL tiplerinde çalışır. STRING, AXIS ve FRAME tiplerinde ise yalnızca == ve <> kullanılabilir. Sonuç her zaman BOOL tipindedir.
Mantık operatörleri
AND (ve), OR (veya), NOT (değil), XOR (dışlayan veya).
Bit düzeyinde çalışanlar: B_AND, B_OR, B_NOT, B_XOR. Bunlar CHAR ve INT tiplerinin tek tek bitlerine uygulanır — makine datası bitlerini sorgulamak için kullanılır.
Mantık işlemlerinde 0 = FALSE, 0’dan farklı her değer = TRUE sayılır.
R10ANDR11 yazamazsın, R10 AND R11 yazarsın. Ayrıca B_NOT tek işlenene uygulanır ve işlenen operatörden sonra gelir.İşlem öncelik sırası
Yüksekten düşüğe:
NOT,B_NOT*,/,DIV,MOD+,−B_ANDB_XORB_ORANDXOROR<<(karakter dizisi birleştirme)==,<>,>,<,>=,<=
Aynı öncelikteki işlemler soldan sağa hesaplanır. Parantez kullanarak sırayı istediğin gibi değiştirebilirsin — kılavuz da bunu öneriyor.
Frame’lerin zincir operatörü : ise bu listeye girmez; başka operatörlerle aynı ifadede kullanılmamalıdır.
Ondalıklı sayı karşılaştırmanın tuzağı ve TRUNC
Şu programı yazsan ne olur?
Kâğıt üzerinde 61.02 − 61.01 = 0.01, yani 0.01 > 0.01 yanlış; program alarm vermemeli. Ama REAL veriler kontrol içinde 64 bit IEEE biçiminde tutulur ve ondalık sayılar tam olarak temsil edilemez. Sonuç 0,0099999… veya 0,0100000…1 çıkabilir.
SINUMERIK bu yüzden karşılaştırmalarda mutlak eşitliğe değil, göreli eşitliğe bakar. Göreli hassasiyet 10−12 mertebesindedir ve ==, <>, >=, <=, >, < için geçerlidir.
Yine de sapma kabul edilemezse çözüm TRUNC ile tam sayıya taşımaktır:
Sık yapılan hatalar
Değişkeni hareket satırının içinde tanımlamak
Tanımlar kendi bloklarında olmalıdır. DEF REAL DERINLIK G1 X50 gibi bir satır çalışmaz.
Alt programda tanımlayıp ana programda aramak
Alt programda tanımlanan değişken LUD’dur, alt program bitince silinir. Değeri dışarı taşımak istiyorsan ana programda tanımla veya GUD kullan.
Karşılaştırmada tek eşittir kullanmak
IF R1=5 yerine IF R1==5. Bu, en çok zaman kaybettiren yazım hatasıdır.
Boşluksuz mantık ifadesi yazmak
IF (R10<50)AND(R11>20) yerine operatörün iki yanına boşluk koy.
INT değişkene ondalıklı değer atamak
Kontrol yuvarlar ve sana haber vermez. Ölçü tutmayınca sebebini burada ara.
R parametresini “sıfırlanır” sanmak
R parametreleri program bitince silinmez. Önceki işten kalan değerle çalışmamak için kullanacağın parametreleri programın başında kendin sıfırla.
MD28050’yi bilmeden yüksek numaralı R parametresi kullanmak
Tezgâhında 100 parametre tanımlıysa R150 yazdığın an alarm alırsın. Üst sınırı bir kez öğren, not et.
Sık sorulan sorular
R parametresi ile DEF ile tanımlanan değişken arasında pratikte ne fark var?
R parametresi hazırdır, tanımlamana gerek yoktur, REAL tipindedir ve program bitince silinmez. DEF ile tanımladığın değişkene istediğin ismi ve tipi verirsin, ama tanımlaman gerekir ve geçerlilik alanı sınırlıdır. Kısa hesaplar için R, okunabilir program için DEF.
Fanuc’taki #500 serisinin karşılığı nedir?
Kapatıp açınca korunması bakımından en yakın karşılık GUD‘dur. Ancak GUD ayrı bir tanım dosyasında tanımlanır; parça programının içinden oluşturulamaz.
Değişkenle takım ofsetini programdan değiştirebilir miyim?
Sistem değişkenleri üzerinden mümkündür, ancak bu doğrudan makinenin kesme davranışını değiştirir. Yetki seviyesi ve yazma zamanlaması da işin içine girer. Bu sayfada bilinçli olarak örnek vermiyoruz; ofset yazma işlemi kendi başına ayrı bir konudur ve makine üreticisinin kılavuzuyla birlikte ele alınmalıdır.
Kaç R parametrem olduğunu nereden görürüm?
MD28050 $MN_MM_NUM_R_PARAM makine datasına bakılır. Geçerli en yüksek numara bu değerin bir eksiğidir.
Değişken adında Türkçe karakter kullanabilir miyim?
Kullanma. Kılavuz harf ve alt çizgi şartı koyuyor; Ç, Ğ, İ, Ö, Ş, Ü gibi karakterler kontrol sürümüne göre sorun çıkarabilir. DERINLIK yaz, DERİNLİK yazma.
Bu bilgiler 828D’de de geçerli mi?
Bu sayfadaki değişken yapısı, veri tipleri, operatörler ve öncelik sırası NC dilinin parçasıdır; 840D sl ve 828D için ortak kılavuzda tanımlanmıştır. Panel ve menü konuları gibi sürümle değişmez. Yalnızca veri sınıfı (DCM/DCI/DCU) 828D’ye özeldir ve R parametresi sayısı gibi makine datasına bağlı değerler tezgâhtan tezgâha farklıdır.
Kaynaklar
- Siemens AG — SINUMERIK 840D sl / 828D Job Planning, Programming Manual, 01/2015, doküman no 6FC5398-2BP40-5BA2: Bölüm 2.1 Değişkenler (s.19), 2.1.2.1 Kanala özel aritmetik parametreler R (s.22), 2.1.4 Kullanıcı değişkenlerinin tanımı DEF (s.27), 2.1.14 Veri tipleri (s.55), 2.2 Dolaylı programlama (s.62), 2.3 Aritmetik fonksiyonlar (s.69), 2.4 Karşılaştırma ve mantık işlemleri (s.71), 2.5 TRUNC ile hassasiyet düzeltmesi (s.73), 2.7 İşlem öncelikleri (s.76), 2.8 Tip dönüşümleri (s.76)
- Siemens AG — SINUMERIK 840D sl / 828D Fundamentals, Programming Manual (temel NC dili tanımları)

