7. ünite / 10 · 4 saat
ArmScript II: yordam, sensör, hata ayıklama ve yalıtım
Yordamlarla yeniden kullanım, parçaları sayan ve konumunu okuyan sensör işlevleri, print ile hata ayıklama ve programın neden tarayıcıda, sınırlı çalıştığı.
Bu ünitenin sonunda
- proc ve call ile parametreli yordam yazmak ve yerel kapsamı kullanmak
- items(), item_x(i), here() ve holding() ile sensör verisini okumak
- Hata ayıklamayı print ve satır numaralı hatalarla yapmak
- Yorumlayıcının sınırlarını ve kullanıcı kodunun sunucuda neden çalışmadığını açıklamak
Ders notları
Yordamlar
Tekrarlanan işi bir yordam yap: proc al(x, y) ... end ve call al(0.55, -0.32). Yordamlar programın en üst düzeyinde tanımlanır, çağrıdan sonra da yazılabilir ve parametre alır. Yordamın var ile tanımladığı değişkenler yereldir; genel bir değişkeni yordam içinde değiştirebilirsin, ama aynı adlı parametre onu gölgeler. Yordam değer döndürmez; sonucu genel bir değişkene yazar.
Sensör işlevleri
holding(): tutucuda parça var mı.items(): hücredeki parça sayısı;item_x(i),item_y(i),item_z(i): i. parçanın konumu (1'den başlar; tutulan parçada TCP konumu).here(): TCP'nin şu anki duruşu.x_of(p),y_of(p),z_of(p),offset(p, dx, dy, dz),dist(a, b): hedef işlevleri.
İstif örneği bunları birleştirir: for i = 1 to items() döngüsü her parçanın konumunu okur, al yordamıyla alır, koy yordamıyla üst üste dizer ve üç parçanın merkezi 30, 90, 150 mm'ye oturur.
Hata ayıklama
Üç araç: print ile ara değerleri yaz; hata iletisindeki satır numarasına git; programı küçük parçalara bölüp tek tek çalıştır. Hata anına kadar süren hareket sahnede kaldığından kolun nerede durduğu görülür.
Sınırlar ve yalıtım
Yorumlayıcı saf TypeScript'tir ve tarayıcıda, bu sayfanın içinde çalışır. Dilde dosya, ağ ya da JavaScript'e çıkış yoktur: programın çağırabileceği işlevler sabit bir listedir ve kaynak kodda eval ya da Function yoktur (bu bir testle denetlenir). Kullanıcı kodu sunucuda çalışmaz. Sonsuz döngüye karşı sınırlar vardır: en çok 20000 adım, 12 çağrı derinliği, 200 çıktı satırı, 600 saniye benzetim süresi, 6000 karakter ve 300 satır. Bir sınır aşılınca program hata ile durur.
Simülasyon
Öğretim modeli: sanal kol bu dersin kendi modelidir. Uzuv ölçüleri, eklem sınırları, hız ve ivme değerleri ve güvenlik eşikleri bu sayfadaki kodda tanımlı ders sabitleridir; hiçbir robot üreticisinin ürünü, dili ya da eğitim içeriği değildir ve ders resmî bir üretici eğitimi değildir. Gerçek bir hücrede ölçüler üreticinin belgelerinden, güvenlik değerleri risk değerlendirmesinden gelir.
ArmScript: yaz, çalıştır, 3B sahnede izle
Platformun kendi robot dili. Örnek seç ya da kendi programını yaz, Çalıştır'a bas: yorumlayıcı programı tarayıcıda, sınırlı adımla koşturur, konsola çıktıyı ve hatayı satır numarasıyla yazar, sonucu 3B sahnede oynatır. Sunucuda hiçbir şey çalışmaz.
Kendin dene
ArmScript simülasyonunda "istif" örneğini çalıştır; konsoldaki üç satırı ve sahnede üç parçanın üst üste oturduğunu gör. Sonra "hata: sonsuz döngü" örneğini çalıştır: kaç adımda durdu ve süre neden kısa? Son olarak istif örneğinde koy yordamının z hesabını 0,06'dan 0,05'e çevir ve parçaların nasıl yerleştiğine, düşürme sayısına bak.
Kod
ArmScript bloklarını ArmScript simülasyonuna yapıştırıp tarayıcında çalıştırabilirsin. Python blokları yalnızca standart kütüphane kullanır; kendi bilgisayarında çalıştır.
# üç parçayı sırayla alıp B'de üst üste diz
proc al(x, y)
open
ptp pose(x, y, 0.25)
lin pose(x, y, 0.03)
close
lin pose(x, y, 0.25)
end
proc koy(x, y, z)
ptp pose(x, y, z + 0.22)
lin pose(x, y, z)
open
lin pose(x, y, z + 0.22)
end
for i = 1 to items()
call al(item_x(i), item_y(i))
call koy(0.55, 0.32, 0.03 + 0.06 * (i - 1))
print "parça", i, "yerleşti"
endimport { describeError, runProgram } from '@/lib/robot-kolu/armscript'
import { defaultCell } from '@/lib/robot-kolu/cell'
const src = 'ptp pose(0.5, 0.2, 0.3)\nprint here()'
const r = runProgram(src, { cell: defaultCell(false) }) // saf işlev: ağ yok, eval yok
if (!r.ok) console.log(describeError(r.error!, 'tr')) // satır numaralı hata
else console.log(r.output, r.duration.toFixed(2), 's') // çıktı ve benzetim süresi# YANLIŞ: bitmeyen döngü, yorumlayıcı adım sınırında durdurur
var n = 0
while true
n = n + 1
endSık yapılan hatalar
- Yordamda genel değişken yerine aynı adlı parametre kullanıp değişikliğin dışarı çıkmasını beklemek: parametre yereldir.
- Parça sırasını sabit varsaymak: i. parçanın konumunu her seferinde item_x(i) ile oku, bir parça alındığında konumu değişir.
- Sonsuz döngüyü "program donmuş" sanmak: sınır yalnızca hata verir, bu yüzden sınırı tasarımın bir parçası say.
- Yalıtımı gizlilik sanmak: programlar yalnızca tarayıcıda çalışır, ama kullanıcı kendi programını görür; sır koyma.
Yazılım mühendisliği bağlantısı
Kullanıcının yazdığı kodu çalıştırmak güvenlik riskidir. Bu ders üç önlem alır: dil JavaScript'e açılmaz, çalışma sınırlıdır ve her şey kullanıcının kendi sekmesinde olur.
- Kaynak koda "yasak çağrı yok" testi eklendi:
eval,Function,fetch,windowgeçmez. - Adım, derinlik, çıktı ve süre sınırları testle sınanır; sonsuz döngü iki saniyeden kısa sürede biter.
Kendini sına
Yordam içinde "var y = 1" ile tanımlanan değişken nerede görünür?
item_x(2) neyi okur?
Kullanıcı programı neden sunucuda çalıştırılmaz?
Adım sınırı (20000) neden vardır?
Bu üniteden sonra bitirme projesinde
- Yordamlı program: Üç parçayı yordamlarla ve döngüyle taşıyan, hata iletileri denenmiş program.