Nisan 2026. Bir test ağında, FANUC 31i kontrolünü taklit eden küçük bir sunucu 8193 portunu dinliyordu. Amaç basitti: FANUC’un kendi istemci kütüphanesini, üretici DLL’i olmadan taklit edilen bir kontrolle konuşturmak. Sunucu, gerçek çerçeve yapısına uygun açılış yanıtı gönderdi. Karşı taraftaki kütüphane yanıtı okudu, doğruladı ve reddetti. Günlükte tek bir satır kaldı: -16, yani EW_PROTOCOL.
Bu reddin nedeni, FOCAS’ın ilk dersidir: FOCAS yalnızca bir tel protokolü değil, üreticinin dağıttığı bir kütüphane ailesidir. Kütüphane, karşı tarafta ne bekleyeceğini kendi içinde doğrular; paketleri taklit etmek her zaman yetmez. Aynı gün ikinci bir yol denendi: kütüphaneyi tamamen bırakıp doğrudan TCP üzerinden konuşmak. O yol, protokolün görünen yüzünü açtı.
FOCAS, FANUC CNC kontrollerindeki CNC ve PMC verisine erişmek için kullanılan yerel API ailesidir. Kaynaklarda FOCAS1 ve FOCAS2 adlarıyla geçer; Ethernet veya HSSB üzerinden bağlanır, bir handle açar ve okuma/yazma fonksiyonlarını bu handle üzerinden çalıştırır. MTConnect gibi açık bir standart değildir; kütüphane ve şartname üretici tarafından dağıtılır.[1][2][3]

Bir Bakışta FOCAS
| Geliştirici | FANUC [1][2] |
|---|---|
| Tür | Yerel API kütüphanesi (FOCAS1/FOCAS2) ve üzerinde çalışan tel protokolü [2][3] |
| Taşıma | Ethernet (TCP; yaygın uygulamada 8193) ve HSSB (High Speed Serial Bus) [1][2] |
| İstemci | FWLIB32.DLL + seriye özel işlem DLL’leri; Linux tarafında libfwlib32-linux-*.so [2][3] |
| Bağlantı çağrısı | cnc_allclibhndl3(ip, port, timeout, handle); ardından tüm çağrılar aynı handle üzerinden [3] |
| Veri kapsamı | CNC durumu, eksen konumları, program, alarm, takım, makro, parametre, PMC penceresi ve dosya işlemleri [2] |
| Veri yönü | Okuma ve yazma; yazma yetkisi lisans, kontrol modeli ve uygulama kararına bağlıdır [2] |
| Desteklenen seriler | 30i-B, 0i-F, 0i-D, 16i/18i/21i, 15i, Power Mate i-D/H, 150-B gibi aileler [1] |
| Dokümantasyon | Kapalı; kütüphane ve şartname üretici dağıtımına bağlı. Kamuya açık tam bir şartname bulunamadı [2] |
FOCAS nedir, ne değildir?
FOCAS’ı MTConnect ile karıştırmak, sahada en pahalı mimari hataya götürür. MTConnect açık, salt-okunur ve çok markalı bir sözlüktür; FOCAS ise FANUC’a özel, derin ve yazma yetkisi olan bir API ailesidir. Biri “her makineyi aynı cümlede konuşturur”, diğeri “bir FANUC kontrolün içine girer”. İkisi rakip değildir; farklı katmanlarda çalışır. FANUC’un kendi MT-LINK i ürünü de Ethernet ve OPC UA üzerinden izleme sunar; bu, FOCAS’ın yerine geçen bir protokol değil, farklı bir ürün katmanıdır.[1][2][6]
FOCAS aynı zamanda tek bir DLL de değildir. FWLIB32.DLL çekirdek kütüphanedir; kontrol ailesine göre FWLIB30i, FWLIB0iD, FWLIB0i, FWLIB16W, FWLIBNCG gibi ek işlem kütüphaneleri gerekir. Aynı istemci kodu, farklı nesil bir kontrolde farklı DLL bileşimi isteyebilir. Bu yüzden “FOCAS kurdum, çalışıyor” cümlesi, model ve sürüm bilgisi olmadan eksiktir.[2][3]
Bir de lisans ve dağıtım sınırı var. Kütüphane açık kaynak değildir; üretici tarafından dağıtılır ve kullanım koşulları ürün/lisans anlaşmasına bağlıdır. Bu makalede fiyat veya lisans şartı verilmiyor; çünkü kamuya açık, doğrulanmış bir fiyat listesi bulunamadı. Doğru yaklaşım, entegrasyon bütçesine “lisans ve dağıtım” kalemini ayrı yazmaktır.[2]
İki taşıma, tek handle: bağlantı nasıl kurulur?
FOCAS iki taşıma sunar: Ethernet ve HSSB. Ethernet, TCP üzerinden çalışır; saha uygulamalarında 8193 portu yerleşik kabuldür. HSSB ise FANUC’un yüksek hızlı seri veri yolu ailesidir ve fonksiyon matrisinde ayrı bir sütun olarak işaretlenir. Her fonksiyon her iki taşımada da desteklenmez; matristeki O, E ve H işaretleri bunu gösterir.[1][2]
Bağlantı modeli handle tabanlıdır. İstemci cnc_allclibhndl3 ile IP, port ve timeout verir; kütüphane bir handle döndürür. Sonraki tüm okuma/yazma çağrıları bu handle üzerinden yürür; iş bitince handle serbest bırakılır. Bu tasarım, her sorgu için yeniden bağlanmayı önler; ama handle’ın yaşam döngüsünü yönetmeyi zorunlu kılar. Kopan bir bağlantıda eski handle ile devam etmek, sessiz hataların en yaygın nedenidir.[3]
Tel üzerinde ne var? Çerçeve düzeyi
FOCAS’ın tel formatı, kamuya açık bağımsız uygulamalarla (ör. pyfanuc) ve saha gözlemleriyle belgelenmiş durumda. Bu bilgi üretici şartnamesi değil, tersine mühendislik ve çalışan kod kanıtıdır; makalede bu sınırla okunmalı.[4][5]
Her çerçeve 10 baytlık bir başlıkla başlar: dört baytlık A0 A0 A0 A0 imzası, ardından sürüm, çerçeve tipi ve yük uzunluğu gelir. Tüm çoklu bayt alanları big-endian’dır. Çerçeve tipleri açılış, kapanış, veri ve red olarak ayrılır:
Başlık (10 bayt):
[A0 A0 A0 A0] [version:u16] [ftype:u16] [payload_len:u16]
0x0101 / 0x0102 açılış isteği / yanıtı
0x0201 / 0x0202 kapanış isteği / yanıtı
0x2101 / 0x2102 veri isteği / yanıtı
0x2103 red çerçevesi (gözlenen)
Veri isteğinin içinde alt paketler bulunur. Her alt paket 28 bayttır: uzunluk (genelde 0x001C), üç adet komut kodu ve beş adet 32-bit argüman. Yanıt tarafında başarılı bir alt paket, komut yankısı ve veri uzunluğuyla gelir; hata durumunda 14 baytlık kısa bir gövde döner. Bu yapı, tek bir TCP isteğinde birden çok komutu toplamayı mümkün kılar; saha yazılımları genellikle durum, program, feed, spindle ve alarm sorgularını tek pakette birleştirir.[4]
| Komut (c1/c2/c3) | Okuduğu veri | Tipik kullanım |
|---|---|---|
| 0x01/0x01/0x18 | Sistem bilgisi (CNC tipi, seri, sürüm, eksen sayısı) | Envanter ve uyumluluk kontrolü |
| 0x01/0x01/0x19 | Durum bilgisi (mod, çalışma, acil stop, alarm bitleri) | Canlı durum ve OEE |
| 0x01/0x01/0x1A | Alarm bilgisi | Arıza kaydı ve uyarı |
| 0x01/0x01/0x1C · 0x20 | Program numarası ve yürütülen program | Program takibi |
| 0x01/0x01/0x24 · 0x25 | Gerçek feed ve spindle hızı | Süreç izleme |
| 0x01/0x01/0x26 | Eksen konumu (makine, mutlak, göreli alt türleri) | Konum ve yol analizi |
| 0x01/0x01/0x61 | Override sinyalleri (feed, spindle, rapid) | Operatör müdahalesi tespiti |
| 0x01/0x01/0x22 | Yardımcı modal veri (T/M/S/H/D kodları) | Takım ve modal takip |
| 0x02/0x01/0x8001 | PMC veri penceresi | PLC seviyesinde izleme |
Tablo, FOCAS’ın neden “derin” sayıldığını gösteriyor: aynı handle üzerinden CNC durumu, PMC ve makro değişkenlerine kadar inilebiliyor. Bu derinlik, MTConnect’in standart sözlüğünde karşılığı olmayan verileri de kapsar.
İlk dönemeç: API ailesi, tek protokol değil
FOCAS’ı tek bir “protokol” gibi düşünmek, ilk büyük yanılgıdır. Üst katmanda bir C fonksiyon ailesi vardır: cnc_statinfo, cnc_absolute, cnc_rdprgnum, cnc_exeprgname, cnc_rdopnlsgnl, cnc_rdmacro, pmc_rdpmcrng gibi çağrılar. Alt katmanda ise bu çağrıları taşıyan bir TCP çerçevesi ve kontrol ailesine göre değişen DLL’ler bulunur.[1][2]
Bu yüzden aynı kod, 30i-B ile 0i-F’te aynı şekilde çalışmayabilir. Fonksiyon matrisi, her fonksiyonun hangi taşımada ve hangi kontrol ailesinde desteklendiğini gösterir; X işareti “desteklenmiyor” demektir. Sahada “FOCAS çalışmıyor” diye tarif edilen sorunların önemli bir kısmı, aslında yanlış DLL bileşimi veya desteklenmeyen fonksiyon çağrısıdır.[1]
İkinci dönemeç: Yazma yetkisi, asıl risk
FOCAS’ın en güçlü yanı, aynı zamanda en tehlikeli yanıdır: yazma. Parametre, offset, makro değişkeni, PMC biti veya tarih/saat ayarı değiştirilebilir. Bu yetki, izleme yazılımı için değil, entegrasyon, otomasyon ve bakım uygulamaları için anlamlıdır. Yanlış bir offset veya PLC biti takımı kırabilir, iş parçasını bozabilir ya da operatörü riske atabilir.[2]
Bu makale yazma tarifi vermiyor. Verilmesi gereken şey tarif değil, politika: yazma yetkisi olan bir istemci, okuma istemcisinden ayrı bir ağ segmentinde çalışmalı; değişiklikler sürüm kontrolünden, yedekten ve geri alma planından geçmeli; mümkünse önce kontrolün simülatöründe denenmeli. FANUC’un kendi güvenlik duyuru sayfası, bu yüzeyin üretici tarafından da izlendiğini gösteriyor.[7]
| İşlem | FOCAS | Önerilen politika |
|---|---|---|
| Durum, konum, alarm, program okuma | Evet | Salt-okunur istemci; ayrı ağ segmenti. |
| Parametre / offset yazma | Evet | Değişiklik kontrolü, yedek, geri alma; üretim içinde otomatik yazma yok. |
| Makro / PMC yazma | Evet | Yalnızca yetkili bakım oturumu; bit haritası ve geri dönüş planı zorunlu. |
| Program transferi | Evet | Dosya bütünlüğü, sürüm ve onay akışı; doğrudan üretim hattına yazma yok. |
Üçüncü dönemeç: DLL duvarı ve iki entegrasyon yolu
Geri dönelim açılıştaki redde. FANUC’un kendi kütüphanesi, taklit edilen kontrole bağlanırken açılış yanıtını kabul etmedi ve -16 EW_PROTOCOL döndürdü. Gözlemlediğimiz kadarıyla kütüphane bağlantı başına iki socket açıyor ve açılış isteğinde farklı bir hedef alanı kullanıyor; yanıtın içeriğini kendi doğrulama mantığıyla kontrol ediyor. Bu, “paket formatını biliyorsan her şeyi yaparsın” varsayımını boşa çıkarıyor.
İkinci yol, kütüphaneyi bırakıp doğrudan TCP üzerinden konuşmak. pyfanuc gibi bağımsız uygulamalar bu yolu izliyor ve gerçek FANUC 160/30i kontrollerinde çalıştığı raporlanıyor. Bu yol, çerçeve düzeyinde şeffaflık verir; ama üretici desteği ve garanti kapsamı dışındadır. Üstelik her kontrol ailesinde aynı davranışı garanti etmez.[4][5]
Bu iki yolun pratik sonucu şu: FOCAS entegrasyonunda “hangi istemci?” sorusu, “hangi port?” sorusundan daha önemlidir. Üretici kütüphanesi desteklenen ve bakımı kolay yoldur; doğrudan protokol ise bağımlılığı azaltır ama tersine mühendislik riskini ve model uyumsuzluğunu beraberinde getirir. İkisini aynı üretim hattında karıştırmak, iki ayrı hata kaynağı üretir.
NCGuide gibi simülatörlerde bazı komutların farklı davrandığını da not etmek gerekir. Yerel testlerde CMD_READ_OPNLSGNL (0x61) E6, CMD_READ_MACRO (0x15) 0x2103 red, CMD_READ_PMC (0x02) ise TCP kopması üretti. T-code bilgisi ise CMD_READ_MODAL_AUX (0x22) yanıtının 24. baytında okunabildi. Bunlar üretici şartnamesi değil, simülatör gözlemidir; gerçek donanımda ayrıca doğrulanmalıdır.
FOCAS mı, MTConnect mi?
| İhtiyaç | FOCAS | MTConnect |
|---|---|---|
| Derin CNC/PMC/makro verisi | Evet | Sınırlı |
| Parametre/offset/PMC yazma | Evet | Hayır |
| Çok markalı ortak sözlük | Hayır | Evet |
| Açık dokümantasyon | Hayır | Evet |
| Tipik kullanım | OEM entegrasyonu, bakım, derin izleme | MES, OEE, çok markalı pano |
Doğru mimari genellikle ikisini birlikte kullanır: FOCAS ile FANUC’a özel derin veri ve yazma işlemleri, MTConnect ile fabrika genelinde ortak izleme. MTConnect’in salt-okunur modeli, yazma yetkisini bilinçli olarak dışarıda bırakır; bu yüzden iki katmanı aynı istemcide birleştirmek yerine, veri toplama katmanını tek yazar, sunum katmanını salt-okur tutmak daha güvenli bir ayrımdır.[8]
Kurulumda yedi kritik adım
- Ethernet seçeneğini doğrulayın: FOCAS her kontrolde hazır değildir; Ethernet seçeneği ve uygun yazılım sürümü gerekir.
- Portu ve erişimi sınırlayın: 8193/TCP’yi yalnızca toplayıcıya açın; makine ağını kurumsal ağdan ayırın.
- DLL bileşimini eşleyin: Kontrol ailesine göre
FWLIB32+ seri DLL kombinasyonunu belirleyin; 32/64-bit uyumunu kontrol edin. - Handle yaşam döngüsünü yönetin: Bağlantıyı açık tutun, kopyalamayın, iş bitince serbest bırakın; kopmada yeniden bağlanma politikası yazın.
- Timeout ve retry koyun: Kontrolü sorgu yağmuruna tutmayın; ardışık hatalarda geri çekilme uygulayın.
- Okuma/yazma istemcilerini ayırın: Yazma yetkisi olan istemci ayrı kimlik, ayrı ağ ve ayrı onay akışı taşımalı.
- Log ve alarm izleyin: Kütüphane hata kodlarını (
EW_PROTOCOLdahil) toplayın; sessiz yeniden denemeleri görünür kılın.
Sonuç: Güç, yazmamayı seçtiğinizde başlar
FOCAS’ın değeri, kaç fonksiyon sunduğunda değil, hangi fonksiyonu hangi koşulda kullanmayı seçtiğinizde saklıdır. Aynı handle, bir eksen konumunu okuyabilir; bir offseti de değiştirebilir. Bu iki yetki arasındaki çizgiyi teknik olarak değil, süreç ve sorumlulukla çizmek gerekir.
Bir sonraki soru şu: FANUC kontrolünüze bağlanan istemci, gerçekten okumakla mı yetiniyor? Ve yazma yetkisi gerekiyorsa, bunu kimin, hangi kayıtla ve hangi geri dönüş planıyla yapacağı net mi?
Bu yazı, CNC kontrol protokolleri serisinin ikinci parçası. Açık standart tarafını serinin MTConnect makalesinde ele alacağız; seri haberleşmenin fiziksel katmanı için RS-232 rehberimize, gömülü protokol fiziği için I2C/SPI/UART makalemize göz atabilirsiniz.
Doğrulanmış Kaynaklar ve Referanslar
- Ladder99 fanuc-driver • FOCAS function matrix (O/E/H/X destek kodları, kontrol aileleri) • github.com/Ladder99/fanuc-driver
- Ladder99 fanuc-driver • Windows kurulumu, 8193 portu ve FOCAS DLL matrisi • installation-windows.md
- strangesast/fwlib • FANUC FOCAS derleme dosyaları ve
fwlib32.h(cnc_allclibhndl3) • github.com/strangesast/fwlib - pyfanuc • FOCAS tel protokolü notları (çerçeve yapısı, komutlar, örnek oturumlar) • pyfanuc/protocol.txt
- pyfanuc • FANUC FOCAS tel protokolü için bağımsız Python uygulaması • github.com/diohpix/pyfanuc
- FANUC America • MT-LINK i: Ethernet ve OPC UA tabanlı izleme • fanucamerica.com
- FANUC • Güvenlik duyuruları • fanuc.co.jp/en/product/vulnerability
- MTConnect • Referans agent README (karşılaştırma için salt-okunur model) • github.com/mtconnect/cppagent