Kanca
Bir TCP soketi, telefon hattı gibi çalışmaz: karşı taraf konuşmayı bitirdiğinde otomatik olarak "şimdi senin sıran" demez. TCP, iki yön arasında güvenilir bir bayt akışı garanti eder, hepsi bu. Yine de robot kontrol yazılımının neredeyse tamamı bu akışı bir "sıra" varmış gibi kullanır: komut gönder, yanıtı bekle, sonra bir sonraki komuta geç. Bu disiplin soketin kendisinden gelmiyor — üstüne biz koyuyoruz.
Ne oldu
TCP/IP, iki bilgisayar arasında IP adresi ve port numarasıyla tanımlanan
bir bağlantı üzerinden, sırası bozulmadan ve kaybolmadan ileten bir bayt
akışı sağlar. Python'ın resmi socket belgeleri bu modeli şöyle özetliyor:
istemci tarafı connect() ile bağlanır, send() ile veri gönderir,
recv() ile veri okur; sunucu tarafı ise bind() ile bir adrese bağlanır,
listen() ile bağlantı bekler, accept() ile gelen bağlantıyı kabul eder.
Soketin kendisi "önce sen konuş, sonra ben" demiyor — TCP tam çift yönlü
(full-duplex), istersen iki taraf da aynı anda yazabilir. Ama endüstriyel
robot kontrolü bunu neredeyse hiç kullanmaz. Bunun yerine bir DİSİPLİN
uygulanır: istemci bir komut metni gönderir, sonra recv() çağrısında
BEKLER, robot komutu işleyip bir yanıt metni gönderene kadar bir sonraki
komutu göndermez. Mecademic'in gerçek Meca500 protokolü tam olarak bu
şekilde çalışır (bkz. d-universite-mecademic-python): robot bir TCP
soketi üzerinden ASCII metin komutları dinler, her komutu işledikten sonra
metin bir yanıt döner.
Aşağıdaki kod bir soket AÇMIYOR — Pyodide çalışma ortamında ağ erişimi
bilerek kapalı (bkz. docs/08-guvenlik-sertlestirme.md "İstemci tarafı
çalıştırma izolasyonu"). Bunun yerine, gerçek bir soketten gidecek ve
gelecek METİNLERİ üretip okuyoruz; bu platformun iki eklemli robotuna
uyacak şekilde basitleştirilmiş bir komut biçimi kullanıyoruz (gerçek
Meca500 protokolü altı eklem argümanı alır).
Hazır
BoştaBağlantı yalnız bu sahnenin durumunu taşır; hesap veya ad içermez.
Genel 2 eklemli kol — jenerik örnek kol, belirli bir üretici modeline karşılık gelmez. Hesaplanan azami erişim: 1.80 m (bağlantı uzunluklarının toplamı).
Geliştirici ayrıntıları · çalışma sınırları
- azami çalışma süresi
- 8 s
- azami çıktı boyutu
- 64 KiB
- azami çıktı olayı
- 100
- azami eklem izi örneği
- 500
Gerçek dünyada
Gerçek bir Python sürecinde yukarıdaki komut_uret/sunucudan_yanit_oku
çiftinin yerini gerçek bir soket alır:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.0.100", 10000))
s.sendall(b"MoveJoints(30,-45,0,0,0,0)\n")
yanit = s.recv(1024)
connect() bağlantıyı kurar, sendall() komut metnini gönderir, recv()
ise robotun yanıtı gönderene kadar BLOKE olur — yani program o satırda
bekler. Bu bekleme, bir sonraki dersin konusu olan "döngü süresi" ve
"zaman aşımı" kavramlarının neden önemli olduğunu gösteriyor: recv()
sonsuza kadar beklerse, program da sonsuza kadar takılı kalır.
Bu satırların hiçbiri bu platformda çalıştırılmaz — connect() gerçek bir
ağ bağlantısı açar ve bu platform hiçbir zaman gerçek bir robota bağlanmaz
(bkz. docs/00-vizyon.md).
Dene
Sonraki
TCP tek başına bir "her zaman aynı sürede yanıt gelir" garantisi vermez. Endüstriyel otomasyon bu yüzden TCP/IP'nin üzerine (veya bazen tamamen farklı bir katmana) kendi protokollerini kurar. Sıradaki ders üç büyük örneği — EtherCAT, PROFINET, EtherNet/IP — karşılaştırıyor.