%15 İndirim
, , ,

Nema 34 Servo ve Step Planet Redüktörü 1/5 FALCON

21 müşteri puanına dayanarak 5 üzerinden 4.57 puan aldı
(21 müşteri değerlendirmesi)

Orijinal fiyat: 7,509.19₺.Şu andaki fiyat: 6,382.81₺.

Uygunluk: 4 adet stokta

🔥 Sadece Bugüne Özel %15 İndirim Fırsatı!📦 Kategori: 1/5 Oran Planet Redüktör Çeşitleri🏷️ Flanş / Gövde Ölçüsü: 80 Gövde🏷️ Nema Ölçüsü: Nema 34🏷️ ÖLÇÜ: 19 mm🏷️ Redüksiyon Oranı: 1/5 Oran🏷️ Mil Çapı: 19 mm
Mermak güvencesiFabrikadan son kullanıcıya · ithalatçı / ana bayi · güçlü stok
İthalatçıAna bayi / distribütörGüçlü stokİyi fiyatKurumsal fatura

Stokta / siparişe uygun · Standart kullanılmamış üründe 14 gün iade; özel ölçü/kesim ürünlerinde şartlar değişebilir.

Nema 34 Servo ve Step Planet Redüktörü 1/5 FALCON

ENDÜSTRİYEL OTOMASYON PARÇALARI | ÜSTÜN PERFORMANS SERİSİ

Ürün Hakkında Detaylı İnceleme

FALCON serisi Nema 34 Servo ve Step Planet Redüktörü 1/5, endüstriyel otomasyon sistemlerinde yüksek tork gereksinimlerini ve hassas hareket kontrolünü sağlamak üzere tasarlanmış mekanik bir güç aktarım bileşenidir. Bu redüktör, giriş milinden aldığı yüksek devirli ancak düşük torklu dönme hareketini, konsantrik olarak yerleştirilmiş bir dizi planet dişli mekanizması aracılığıyla, daha düşük devirli ancak nominal giriş torkunun beş katı artırılmış bir çıkış torkuna dönüştürür. Temel çalışma prensibi, bir merkez dişli (güneş dişli), bu dişli etrafında dönen ve aynı zamanda bir dış halka dişli (ring dişli) ile eşleşen birden fazla planet dişli ve bu planet dişlileri bir arada tutan bir taşıyıcı (planet taşıyıcı) üzerine kuruludur. Giriş mili güneş dişliyi tahrik ederken, planet dişliler halka dişli içinde yuvarlanarak planet taşıyıcısını döndürür ve bu taşıyıcı çıkış miline bağlıdır. Bu kompakt ve koaksiyel tasarım, yüksek güç yoğunluğu, düşük atalet ve mükemmel rijitlik sunarak, özellikle yüksek ataletli yüklerin hassas bir şekilde konumlandırılması ve dinamik sistemlerde motorun optimum çalışma aralığında kalmasını temin eder. Redüksiyon oranı 1/5 olması, motorun nominal torkunun 5 katına kadar çıkış torku elde edilmesini sağlarken, motor devrinin beşte birine düşürülmesiyle hassas kontrol ve yüksek çözünürlüklü hareket imkanı sunar.

Bu planet redüktörün yapısal bütünlüğü ve performans parametreleri, zorlu endüstriyel ortam koşullarına dayanacak şekilde optimize edilmiştir. Gövde, yüksek mukavemetli alüminyum alaşımdan imal edilmiş olup, hafiflik ve korozyon direnci sağlarken, iç mekanizmadaki dişliler ısıl işlem görmüş alaşımlı çelikten üretilmiştir. Bu malzeme seçimi, dişlilerin yüksek yük taşıma kapasitesini, aşınma direncini ve uzun ömürlülüğünü garanti eder. IP54 koruma sınıfı, redüktörün toz girişine ve her yönden su sıçramalarına karşı dayanıklı olduğunu belirtir, bu da onu endüstriyel atölyeler ve üretim hatları gibi tipik çalışma ortamları için uygun kılar. Sistem entegrasyonu açısından, Nema 34 standartlarına tam uyumlu kare flanş yapısı, piyasada yaygın olarak bulunan 4.5 Nm, 6 Nm, 8.5 Nm ve 12 Nm tork değerlerindeki step ve servo motorlarla doğrudan montaj imkanı sunar. Çıkış mili, uygulama gereksinimlerine göre düz veya kama kanallı seçeneklerle sunulabilir, bu da tahrik edilecek mekanik sistemlerle esnek bağlantı sağlar. Ömür boyu kapalı sistem yağlama özelliği, redüktörün periyodik bakım ihtiyacını ortadan kaldırarak işletme maliyetlerini düşürür ve sürekli operasyonel güvenilirliği destekler. Bu teknik özellikler, redüktörü CNC takım tezgahları, robotik sistemler, otomatik montaj hatları ve konveyör uygulamaları gibi geniş bir endüstriyel yelpazede kritik bir bileşen haline getirmektedir.

Nema 34 Servo ve Step Planet Redüktörü 1/5 FALCON Avantajları

Yüksek Tork Yoğunluğu ve Konumlandırma Doğruluğu: FALCON serisi 1/5 redüksiyon oranı, Nema 34 motorlardan elde edilen torku beş kat artırarak, özellikle yüksek ataletli veya ağır yüklerin hassas ve kontrollü bir şekilde hareket ettirilmesini sağlar. Bu tork artışı, motorun daha düşük devirlerde daha kararlı çalışmasına olanak tanır ve aşırı yüklenme durumlarında motorun zorlanmasını minimize eder. Redüktörün <15 arcmin gibi düşük bir geri boşluk (backlash) değeri sunması, hareket kontrol sistemlerinde tekrarlanabilir konumlandırma hassasiyetini maksimize eder. Bu değer, özellikle CNC işleme, robotik eklem hareketleri ve hassas montaj uygulamalarında, istenen pozisyon ile gerçek pozisyon arasındaki farkı minimuma indirerek, işleme kalitesini ve sistem doğruluğunu artırır. Düşük geri boşluk, dinamik yük değişimlerinde dahi sistemin rijitliğini korumasına yardımcı olur ve titreşimleri azaltır.

Geniş Nema 34 Motor Uyumluluğu ve Modüler Entegrasyon: Bu planet redüktör, endüstriyel otomasyon pazarında yaygın olarak kullanılan Nema 34 standartlarındaki servo ve step motorlarla tam mekanik uyumluluk gösterecek şekilde tasarlanmıştır. Flanş boyutları ve montaj delik düzeni, 4.5 Nm, 6 Nm, 8.5 Nm ve 12 Nm gibi farklı tork kapasitelerine sahip motorlarla doğrudan ve sorunsuz bir entegrasyon imkanı sunar. Bu geniş uyumluluk, kullanıcıların mevcut motor envanterlerini değerlendirmesine veya belirli uygulama gereksinimlerine göre farklı motorları kolayca seçmesine olanak tanır. Modüler tasarım yaklaşımı, sistem tasarımında esneklik sağlarken, yedek parça yönetimini basitleştirir ve bakım süreçlerini hızlandırır. Ayrıca, motor ve redüktör arasındaki standart arayüz, farklı üreticilerin motorlarıyla bile uyumluluk sağlayarak, sistem mühendislerine daha geniş bir seçenek yelpazesi sunar.

Yüksek Mekanik Verimlilik ve Uzun Operasyonel Ömür: FALCON serisi redüktör, optimize edilmiş dişli geometrisi, hassas üretim toleransları ve düşük sürtünmeli yataklama sistemleri sayesinde %95’in üzerinde nominal mekanik verimlilik sunar. Bu yüksek verimlilik oranı, motor tarafından üretilen gücün büyük bir kısmının mekanik işe dönüştürüldüğü, dolayısıyla enerji kaybının ve ısı üretiminin minimumda tutulduğu anlamına gelir. Azalan ısı üretimi, redüktörün ve bağlı motorun çalışma ömrünü uzatırken, enerji tüketimini düşürerek işletme maliyetlerine doğrudan olumlu etki eder. Isıl işlem görmüş alaşımlı çelikten imal edilen dişliler, yüksek yüzey sertliği ve çekirdek tokluğu sağlayarak ağır yükler altında bile mükemmel aşınma direnci ve yorulma ömrü sunar. Kapalı ve ömür boyu yağlamalı sistem, dış etkenlerden kaynaklanan kirliliği önler ve periyodik yağ değişimi veya bakım ihtiyacını ortadan kaldırarak redüktörün sürekli ve güvenilir bir şekilde çalışmasını garanti eder.

Teknik Özellikler ve Kapasite

Özellik Değer/Açıklama
Model Serisi FALCON Serisi Planet Redüktör
Redüksiyon Oranı 1/5 (Giriş devrinin 5 kat düşürülmesi, torkun 5 kat artırılması)
Uyumlu Motor Standardı Nema 34 (4.5 Nm, 6 Nm, 8.5 Nm, 12 Nm Step/Servo Motorlar ile uyumlu flanş)
Geri Boşluk (Backlash) < 15 arcmin (Yüksek hassasiyetli konumlandırma ve tekrarlanabilirlik için kritik)
Nominal Verimlilik > %95 (Düşük enerji kaybı, azaltılmış ısı üretimi ve işletme maliyeti)
Maksimum Çıkış Torku 100 Nm (Anlık tepe tork kapasitesi, motor gücüne ve uygulama dinamiklerine göre değişebilir)
Koruma Sınıfı IP54 (Toz girişine ve su sıçramalarına karşı koruma, endüstriyel ortamlar için uygun)
Gövde ve Dişli Malzemesi Yüksek Mukavemetli Alüminyum Alaşım (Gövde), Isıl İşlem Görmüş Alaşımlı Çelik (Dişliler)

Teknik Sıkça Sorulan Sorular (SSS)

Planet redüktörün <15 arcmin geri boşluk değeri, hassas konumlandırma uygulamaları için teknik olarak ne anlama gelmektedir?

Geri boşluk (backlash), redüktörün giriş milini sabit tutarken çıkış milinin serbestçe dönebildiği açısal mesafeyi ifade eder. 15 arcmin (ark dakika) değeri, bir derecenin 60’ta biri olan bir ark dakikasının 15 katına eşittir, yani 0.25 derecelik bir açısal boşluğa tekabül eder. Bu düşük geri boşluk değeri, özellikle CNC takım tezgahları, lazer kesim makineleri ve robotik kollar gibi yüksek hassasiyet gerektiren uygulamalarda kritik öneme sahiptir. Düşük geri boşluk, hareket yönü değişimlerinde sistemin tepki süresini kısaltır, konumlandırma hatalarını minimize eder ve tekrarlanabilirliği artırır. Ayrıca, işleme sırasında oluşan titreşimleri ve rezonansı azaltarak yüzey kalitesini ve parça doğruluğunu iyileştirir. Bu özellik, özellikle mikron seviyesinde hassasiyet beklenen konturlama ve interpolasyon hareketlerinde, birikimli pozisyon hatalarının önüne geçilmesinde temel bir parametredir.

1/5 redüksiyon oranı, Nema 34 motor seçimini ve sistem dinamiklerini teknik olarak nasıl etkiler?

1/5 redüksiyon oranı, redüktörün giriş miline uygulanan devri beşte birine düşürürken, giriş torkunu teorik olarak beş kat artırır (verimlilik kaybı ihmal edildiğinde). Bu durum, motor seçiminde önemli teknik avantajlar sunar. Öncelikle, daha küçük boyutlu ve daha yüksek devirli bir Nema 34 motorun, redüktör sayesinde çok daha büyük ataletli yükleri veya daha yüksek tork gerektiren uygulamaları tahrik etmesine olanak tanır. Motorun daha yüksek hızlarda çalışması, genellikle daha verimli bir çalışma noktasına denk gelir ve motorun termal yükünü azaltır. Sistem dinamikleri açısından, redüksiyon oranı yük ataletini motor miline yansıtırken karesiyle orantılı olarak azaltır (1/5 redüksiyon için 1/25 oranında). Bu, motorun yükü daha hızlı ivmelendirmesine ve yavaşlatmasına olanak tanıyarak sistemin dinamik tepkisini iyileştirir. Ayrıca, motorun kendi ataleti, yansıyan yük ataletine göre daha baskın hale gelebilir, bu da kontrol sisteminin kararlılığını artırır ve daha agresif kontrol döngülerine izin verir.

IP54 koruma sınıfının endüstriyel ortamdaki operasyonel güvenilirlik ve bakım gereksinimleri üzerindeki teknik etkileri nelerdir?

IP54 koruma sınıfı, Uluslararası Koruma Derecelendirmesi standardına göre, redüktörün katı cisimlere ve sıvılara karşı direncini belirtir. İlk rakam olan ‘5’, redüktörün toz girişine karşı kısmen korumalı olduğunu, yani tozun içeri girmesinin tamamen engellenemese de, operasyonel performansı olumsuz etkileyecek miktarda tozun içeri girmeyeceğini ifade eder. İkinci rakam olan ‘4’ ise, her yönden gelen su sıçramalarına karşı koruma sağlandığını gösterir. Bu teknik özellik, redüktörün talaşlı imalat atölyeleri, montaj hatları veya paketleme tesisleri gibi tipik endüstriyel ortamlarda güvenle kullanılabileceği anlamına gelir. Toz ve su sıçramalarına karşı koruma, iç mekanizmanın kirlenmesini önleyerek dişlilerin ve yatakların aşınmasını yavaşlatır, bu da redüktörün ömrünü uzatır ve arıza riskini azaltır. Bu koruma seviyesi, bakım gereksinimlerini de düşürür, zira iç bileşenlerin dış etkenlerden korunması sayesinde daha az temizlik ve kontrol ihtiyacı doğar. Ancak, doğrudan su jeti veya suya daldırma gibi daha zorlu koşullar için daha yüksek IP sınıfları gereklidir.

Bu planet redüktörün hem servo hem de step motorlarla uyumluluğu, her motor tipi için teknik olarak ne gibi avantajlar sunar?

FALCON serisi redüktörün Nema 34 standartlarındaki hem servo hem de step motorlarla uyumlu olması, mühendislere geniş bir uygulama esnekliği sunar. Servo motorlarla kullanıldığında, redüktörün yüksek tork kapasitesi ve düşük geri boşluk özellikleri, servo sistemlerin dinamik performansını ve hassasiyetini daha da artırır. Servo motorlar, genellikle yüksek çözünürlüklü enkoderler ile birlikte çalıştığından, redüktörün sağladığı tork artışı ve atalet eşleşmesi, motorun daha geniş bir hız ve yük aralığında optimum kontrol sağlamasına olanak tanır. Bu, özellikle hızlı ivmelenme/yavaşlama gerektiren ve yüksek dinamik tepki beklenen uygulamalarda kritik öneme sahiptir. Step motorlarla kullanıldığında ise, redüktörün 1/5 oranı, motorun adım açısını efektif olarak beşte birine düşürerek, sistemin açısal çözünürlüğünü artırır. Örneğin, 1.8 derecelik bir step motor, redüktörle birlikte 0.36 derecelik efektif adım açısına sahip olur. Bu, daha pürüzsüz hareket, daha az titreşim ve daha yüksek konumlandırma hassasiyeti sağlar. Ayrıca, redüktörün tork artırma özelliği, step motorların genellikle düşük hızlarda daha yüksek tork üretebilme eğilimini destekleyerek, motorun adım kaybetme riskini azaltır ve daha ağır yüklerin tahrik edilmesine imkan verir.

Step Motor Saha Seçimi

Sahada bildiğiniz üç bilgiyi girin. Gereksiz teknik değer istemeden doğrudan seçim sonucu verir.

Sonucun nasıl yorumlanacağını belirleyen genel uygulama alanı. CNC dışında otomasyon, blower, pompa, pano, konveyör ve genel makine uygulamalarını da seçebilirsiniz.
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Aynı güç, tork veya hız değeri CNC, konveyör, fan, pompa, pano veya genel otomasyon uygulamasında farklı emniyet payı ve farklı ürün sınıfı gerektirir.

Nereden bakılır? Makinenin gerçek kullanım amacından seçilir. Birden fazla kullanım varsa en ağır ve en sürekli çalışan senaryo esas alınır.

Kontrol: Değer pozitif ve gerçek saha/katalog bilgisiyle uyumlu olmalıdır. Varsayılan cnc_router yalnızca örnek başlangıç değeridir.

Köprü, tabla, spindle, fikstür ve taşınan yükün birlikte hareket eden toplamı.kg
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Akım değeri kablo, sigorta, güç kaynağı, pano ısısı ve cihaz güvenliği için temel veridir.

Nereden bakılır? Pens ampermetre, cihaz etiketi, sürücü/inverter ekranı veya katalog nominal akımından alınır.

Kontrol: Beklenen giriş aralığı: en az 1 kg. Varsayılan 80 kg yalnızca örnek başlangıç değeridir.

Boşta rapid veya üretimde ulaşılmak istenen en yüksek hız.m/dk
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Bu alan hesap sonucunu doğrudan etkileyen temel girdilerden biridir. Değer yanlış girilirse çıkan kapasite, hız, kuvvet veya maliyet yorumu da yanlış olur.

Nereden bakılır? Değer; ürün etiketi, katalog, kontrol yazılımı, sürücü/inverter ekranı, ölçüm cihazı, teknik çizim veya gerçek saha ölçümünden alınmalıdır.

Kontrol: Beklenen giriş aralığı: en az 0.5 m/dk. Varsayılan 8 m/dk yalnızca örnek başlangıç değeridir.

Makinedeki gerçek aktarımı seçin.
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Bu alan hesap sonucunu doğrudan etkileyen temel girdilerden biridir. Değer yanlış girilirse çıkan kapasite, hız, kuvvet veya maliyet yorumu da yanlış olur.

Nereden bakılır? Değer; ürün etiketi, katalog, kontrol yazılımı, sürücü/inverter ekranı, ölçüm cihazı, teknik çizim veya gerçek saha ölçümünden alınmalıdır.

Kontrol: Değer pozitif ve gerçek saha/katalog bilgisiyle uyumlu olmalıdır. Varsayılan bs10 yalnızca örnek başlangıç değeridir.

Dikey eksen ağırlığı sürekli taşır ve fren ihtiyacı doğurur.
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Bu alan hesap sonucunu doğrudan etkileyen temel girdilerden biridir. Değer yanlış girilirse çıkan kapasite, hız, kuvvet veya maliyet yorumu da yanlış olur.

Nereden bakılır? Değer; ürün etiketi, katalog, kontrol yazılımı, sürücü/inverter ekranı, ölçüm cihazı, teknik çizim veya gerçek saha ölçümünden alınmalıdır.

Kontrol: Değer pozitif ve gerçek saha/katalog bilgisiyle uyumlu olmalıdır. Varsayılan horizontal yalnızca örnek başlangıç değeridir.

Motor, redüktör ve mekanik aktarım seçerken sadece anlık hesap değil, günlük çalışma süresi ve darbe yükü de önemlidir.
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Bu alan hesap sonucunu doğrudan etkileyen temel girdilerden biridir. Değer yanlış girilirse çıkan kapasite, hız, kuvvet veya maliyet yorumu da yanlış olur.

Nereden bakılır? Değer; ürün etiketi, katalog, kontrol yazılımı, sürücü/inverter ekranı, ölçüm cihazı, teknik çizim veya gerçek saha ölçümünden alınmalıdır.

Kontrol: Değer pozitif ve gerçek saha/katalog bilgisiyle uyumlu olmalıdır. Varsayılan normal yalnızca örnek başlangıç değeridir.

Kuru kızak, kirli kremayer, boşluklu kaplin veya kötü yağlama teorik sonucu sahada bozar.
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Akım değeri kablo, sigorta, güç kaynağı, pano ısısı ve cihaz güvenliği için temel veridir.

Nereden bakılır? Pens ampermetre, cihaz etiketi, sürücü/inverter ekranı veya katalog nominal akımından alınır.

Kontrol: Değer pozitif ve gerçek saha/katalog bilgisiyle uyumlu olmalıdır. Varsayılan normal yalnızca örnek başlangıç değeridir.

Flanş / Gövde Ölçüsü

80 Gövde

Nema Ölçüsü

Nema 34

ÖLÇÜ

19 mm

Redüksiyon Oranı

1/5 Oran

Mil Çapı

19 mm

Değerlendirmeler

21 müşteri puanına dayanarak 5 üzerinden 4.57 puan aldı
4,6/521 değerlendirme

Sayfa hızını korumak için değerlendirme listesi ilk açılışta yüklenmez. Puan ve değerlendirme sayısı korunur.

Alışveriş Sepeti
Ürün
Nema 34 Servo ve Step Planet Redüktörü 1/5 FALCON
Orijinal fiyat: 7,509.19₺.Şu andaki fiyat: 6,382.81₺.
⚙ Araçlar
Scroll to Top
'; var w = window.open('', '_blank'); if(w && w.document){ w.document.open(); w.document.write(html); w.document.close(); } else { window.print(); } } function updateAdvisor(form, results){ var slug = form.getAttribute('data-mthc-calc') || ''; var level = 'ok'; var msg = 'Sonuç ön seçim için kullanılabilir. Kesin karar için emniyet payı, katalog sınırı ve saha testiyle doğrulayın.'; var bullets = ['Sınırda çıkan değeri tek başına ürün seçimi kabul etmeyin.', 'İlgili hesaplayıcılarla hız, tork, pulse, kablo ve güç tarafını birlikte kontrol edin.']; var product = 'İlgili ürün sınıfı için hesap sonucunu WhatsApp ile gönderip motor, sürücü, güç kaynağı, mekanik aktarım, pano ve yardımcı ekipmanı birlikte doğrulatın.'; var appText = text(form, 'application_area'); var appPrefix = appText ? 'Kullanım alanı: ' + appText + '. ' : ''; if(slug.indexOf('step') !== -1){ var tq = num(form,'torque_nm'), rpm = num(form,'rpm'), volt = num(form,'voltage'), hz = pickResult(results,'pulse frekansı'); if(tq >= 8){ product = 'Öneri sınıfı: NEMA 34 / NEMA 42 step motor, güçlü sürücü, 48–60V DC güç kaynağı ve uygun kablo kesiti.'; } else if(tq >= 3){ product = 'Öneri sınıfı: NEMA 34 step motor, DM860H sınıfı sürücü ve 48–60V DC güç kaynağı.'; } else { product = 'Öneri sınıfı: NEMA 23 / küçük NEMA 34 step motor ve uygun akımda sürücü.'; } if(rpm > 900 || hz > 80000 || (volt && volt < 48)){ level='mid'; msg='Step motor tarafında hız veya pulse sınırı risk oluşturabilir.'; } bullets = ['Hedef devirde kalan torku katalog eğrisinden kontrol edin.', 'Mikrostep yükseldikçe pulse ihtiyacı artar; güç artmaz.', 'Yüksek hız ve ağır eksende servo seçeneğini de değerlendirin.']; } else if(slug.indexOf('servo') !== -1){ var ratio = pickResult(results,'atalet oranı') || num(form,'ratio'); product = 'Öneri sınıfı: servo motor + uyumlu sürücü + gerekiyorsa frenli motor ve planet redüktör birlikte seçilmelidir.'; if(ratio > 8){ level='high'; msg='Servo atalet oranı yüksek görünüyor; tuning zorlaşabilir ve alarm riski artabilir.'; } else if(ratio > 5){ level='mid'; msg='Servo seçiminde atalet ve redüktör oranı dikkatli kontrol edilmeli.'; } bullets = ['Sürekli tork ve tepe torku ayrı kontrol edin.', 'Z ekseninde frenli servo tercih edin.', 'Atalet oranı yüksekse redüktör oranını veya motor gövdesini değiştirin.']; } else if(slug.indexOf('spindle') !== -1 || slug.indexOf('freze') !== -1 || slug.indexOf('talas') !== -1){ var chip = pickResult(results,'talaş yükü'), kw = pickResult(results,'önerilen güç') || pickResult(results,'güç ihtiyacı'); product = 'Öneri sınıfı: spindle gücü, inverter, ER pens, kesici takım ve soğutma tipi malzemeye göre birlikte seçilmelidir.'; if(chip && chip < 0.02){ level='mid'; msg='Talaş yükü düşük olabilir; takım kesmek yerine sürtüp ısı üretebilir.'; } else if(chip && chip > 0.12){ level='high'; msg='Talaş yükü yüksek olabilir; takım kırılması veya spindle zorlanması riski var.'; } else if(kw > 6){ level='mid'; msg='Güç ihtiyacı yüksek; makine rijitliği, vakum tutuşu ve inverter kapasitesi kontrol edilmeli.'; } bullets = ['Talaş rengi, ses, yüzey ve spindle akımıyla deneme kesimi yapın.', 'Alüminyumda talaş tahliyesi ve soğutma kritiktir.', 'Takım çapı büyüdükçe pens ve spindle rulman yükünü kontrol edin.']; } else if(slug.indexOf('vidali') !== -1){ var crit = pickResult(results,'kritik devir'), speed = pickResult(results,'eksen hızı'); product = 'Öneri sınıfı: vidalı mil, BK/BF yatak, kaplin, lineer kızak ve uygun motor birlikte değerlendirilmelidir.'; if(crit && speed){ level='mid'; msg='Uzun vidalı milde hız hedefi kritik devir ve titreşimle sınırlandırılabilir.'; } bullets = ['Hatve büyürse hız artar ama kuvvet azalır.', 'Uzun vidalı milde kritik devir ve burkulma kontrolü yapın.', 'Boşluk ve yataklama kalitesi teorik çözünürlükten daha önemlidir.']; } else if(slug.indexOf('kremayer') !== -1 || slug.indexOf('pinyon') !== -1 || slug.indexOf('reduktor') !== -1){ product = 'Öneri sınıfı: modüle uygun kremayer, pinyon, planet redüktör ve servo/step motor beraber seçilmelidir.'; bullets = ['Pinyon büyürse hız artar, itme kuvveti düşer.', 'Redüktör oranı torku artırır fakat hızı azaltır.', 'Backlash ve diş teması hassasiyeti doğrudan etkiler.']; } else if(slug.indexOf('vakum') !== -1 || slug.indexOf('blower') !== -1){ product = 'Öneri sınıfı: tabla alanı, bölge sayısı, kaçak oranı ve malzemeye göre blower/vakum pompası seçilmelidir.'; bullets = ['Küçük parçada teorik tutma kuvveti hızla düşer.', 'MDF spoilboard kaçağı debi ihtiyacını artırır.', 'Yetersiz vakumda paso ve ilerlemeyi düşürün.']; } else if(slug.indexOf('pano') !== -1 || slug.indexOf('kablo') !== -1 || slug.indexOf('sigorta') !== -1 || slug.indexOf('inverter') !== -1 || slug.indexOf('elektrik') !== -1){ product = 'Öneri sınıfı: inverter, kablo kesiti, sigorta, pano fanı, kontaktör ve topraklama birlikte planlanmalıdır.'; bullets = ['Kabloyu yalnız akıma göre değil uzunluk ve gerilim düşümüne göre seçin.', 'Sigorta kabloyu korur; cihaz üretici önerisi ayrıca kontrol edilir.', 'Pano sıcaklığı gerçek yükte ölçülmelidir.']; } else if(slug.indexOf('dxf') !== -1 || slug.indexOf('gcode') !== -1 || slug.indexOf('g-code') !== -1){ product = 'Öneri sınıfı: CAM hazırlığı, takım çapı, iç/dış kesim yönü ve süre/maliyet hesabı birlikte kontrol edilmelidir.'; bullets = ['Açık kontur, çift çizgi ve yanlış layer kesim hatası üretir.', 'G90/G91 ve G20/G21 durumunu çalıştırmadan önce kontrol edin.', 'Kesin teklif için DXF/CAM dosyası ayrıca incelenmelidir.']; } else if(slug.indexOf('lastik') !== -1){ product = 'Kontrol özeti: lastik ölçüsü değişiminde toplam çap, çevre, yerden yükseklik ve km saati farkı birlikte değerlendirilmelidir.'; bullets = ['Çap farkı büyüdükçe km saati, kilometre sayacı, hızlanma, frenleme ve aktarma yükleri daha fazla etkilenir.', 'Lastik ölçüsü seçerken jant genişliği, ofset, çamurluk boşluğu, yük endeksi ve hız endeksi ayrıca kontrol edilmelidir.', '4x4 araçlarda ön ve arka lastik çevreleri farklı olmamalıdır; aktarma organlarına yük bindirebilir.']; } else if(slug.indexOf('agirlik') !== -1 || slug.indexOf('malzeme') !== -1){ product = 'Öneri sınıfı: ağırlık sonucu malzeme alımı, kargo, vinç/forklift, konstrüksiyon ve teklif planında kullanılabilir; kesin sevkiyat için kantar veya üretici verisi kontrol edilmelidir.'; bullets = ['Ahşap, MDF ve benzeri malzemelerde nem ağırlığı ciddi değiştirir.', 'Boru ve kutu profilde gerçek et kalınlığı katalog değerinden farklıysa sonuç sapar.', 'Taşıma ve kaldırma planında ağırlık merkezi ve emniyet payı ayrıca değerlendirilmelidir.']; } else if(slug.indexOf('maliyet') !== -1 || slug.indexOf('teklif') !== -1 || slug.indexOf('yatirim') !== -1){ product = 'Öneri sınıfı: makine saati, takım sarfı, elektrik, bakım, fire ve kâr oranı satış fiyatına birlikte yansıtılmalıdır.'; bullets = ['Hazırlık süresi küçük adetlerde parça maliyetini belirler.', 'Takım kırılma ve fire payı yoksa teklif zarar ettirebilir.', 'Yatırım geri dönüşü kapasite kullanımına bağlıdır.']; } else if(slug.indexOf('blower') !== -1 || slug.indexOf('fan') !== -1 || slug.indexOf('pompa') !== -1){ product = 'Öneri sınıfı: motor gücü, inverter, kablo kesiti, sigorta ve uygulama debi/basınç ihtiyacı birlikte seçilmelidir.'; bullets = ['Fan ve blower uygulamalarında debi ile basınç birlikte okunmalıdır.', 'Pompa tarafında basma yüksekliği ve verim motor gücünü ciddi değiştirir.', 'İnverter kullanılıyorsa motor akımı ve soğutma koşulları ayrıca kontrol edilir.']; } else if(slug.indexOf('konveyor') !== -1 || slug.indexOf('otomasyon') !== -1 || slug.indexOf('plc') !== -1 || slug.indexOf('sensor') !== -1 || slug.indexOf('solenoid') !== -1 || slug.indexOf('ups') !== -1 || slug.indexOf('jenerator') !== -1){ product = 'Öneri sınıfı: otomasyon güç kaynağı, PLC/sensör/valf besleme, motor sürücü, UPS veya jeneratör kapasitesi uygulama alanına göre birlikte planlanmalıdır.'; bullets = ['24V yardımcı beslemede sensör, röle, valf ve PLC aynı anda çalışabilir.', 'Kalkış akımı olan yüklerde güç kaynağı ve koruma elemanları sınırda seçilmemelidir.', 'Yedekleme süresi hesabında akü yaşlanması ve sıcaklık etkisi eklenmelidir.']; } if(appText){ bullets.unshift('Kullanım alanı seçimi: ' + appText + '. Aynı hesap sonucu CNC, konveyör, pompa, blower, pano veya genel otomasyonda farklı emniyet payı gerektirebilir.'); product = appPrefix + product; } var sahaBullets = buildSahaContextBullets(form, slug, results); if(sahaBullets.length){ bullets = sahaBullets.concat(bullets); } setAdvisor(form, level, msg, bullets, product); } function normalizeTireInput(value){ return String(value || '').trim().replace(/,/g, '.').replace(/\s+/g, ' ').toUpperCase(); } function parseTireSize(value){ var raw = normalizeTireInput(value); if(!raw){ return null; } var m = raw.match(/^(\d{3})\s*(?:\/|\s|-)\s*(\d{2,3})\s*(?:R|ZR)?\s*(\d{2})$/i); if(m){ var widthMm = parseFloat(m[1]); var aspect = parseFloat(m[2]); var rimIn = parseFloat(m[3]); var sidewallMm = widthMm * aspect / 100; var rimMm = rimIn * 25.4; var diameterMm = rimMm + 2 * sidewallMm; return buildTireObject(raw, 'Metrik', widthMm, aspect, rimIn, sidewallMm, diameterMm); } m = raw.match(/^(\d{2,3}(?:\.\d+)?)\s*[X×]\s*(\d{1,2}(?:\.\d+)?)\s*(?:R)?\s*(\d{2})$/i); if(m){ var diaIn = parseFloat(m[1]); var widthIn = parseFloat(m[2]); var rimIn2 = parseFloat(m[3]); var diameterMm2 = diaIn * 25.4; var widthMm2 = widthIn * 25.4; var rimMm2 = rimIn2 * 25.4; var sidewallMm2 = (diameterMm2 - rimMm2) / 2; var aspect2 = widthMm2 > 0 ? sidewallMm2 / widthMm2 * 100 : 0; return buildTireObject(raw, 'İnç', widthMm2, aspect2, rimIn2, sidewallMm2, diameterMm2); } return null; } function buildTireObject(raw, type, widthMm, aspect, rimIn, sidewallMm, diameterMm){ var rimMm = rimIn * 25.4; var circMm = diameterMm * PI; return { raw: raw, type: type, widthMm: widthMm, aspect: aspect, rimIn: rimIn, rimMm: rimMm, sidewallMm: sidewallMm, diameterMm: diameterMm, diameterIn: diameterMm / 25.4, circumferenceMm: circMm, circumferenceM: circMm / 1000, revPerKm: circMm > 0 ? 1000000 / circMm : 0 }; } function tireResultCards(prefix, tire){ return [ add(prefix + ' toplam dış çap', tire.diameterMm, 'mm', tire.raw + ' ölçüsünün teorik toplam lastik yüksekliği'), add(prefix + ' toplam dış çap', tire.diameterIn, 'inç', 'İnç karşılığı'), add(prefix + ' yanak yüksekliği', tire.sidewallMm, 'mm', 'Jant kenarı ile lastik dış çapı arasındaki tek taraflı yanak ölçüsü'), add(prefix + ' taban genişliği', tire.widthMm, 'mm', 'Lastik taban genişliği'), add(prefix + ' jant çapı', tire.rimIn, 'inç', 'Jant ölçüsü'), add(prefix + ' bir turda aldığı yol', tire.circumferenceM, 'm', 'Lastik bir tam tur döndüğünde teorik ilerleme'), add(prefix + ' kilometrede dönüş', tire.revPerKm, 'tur/km', '1 km gitmek için yaklaşık teker dönüş sayısı') ]; } function weightShapeFromSlug(slug){ var map = { 'sac-plaka-agirlik-hesaplama': 'plate', 'blok-kutuk-agirlik-hesaplama': 'block', 'yuvarlak-mil-agirlik-hesaplama': 'round_bar', 'boru-agirlik-hesaplama': 'pipe', 'daire-disk-agirlik-hesaplama': 'round_plate', 'kare-mil-agirlik-hesaplama': 'square_bar', 'kare-kutu-profil-agirlik-hesaplama': 'square_tube', 'dikdortgen-kutu-profil-agirlik-hesaplama': 'rect_tube', 'altigen-mil-agirlik-hesaplama': 'hex_bar', 'kosebent-agirlik-hesaplama': 'angle_l' }; return map[slug] || ''; } function isWeightCalculatorSlug(slug){ return slug === 'malzeme-agirlik-hesaplama' || weightShapeFromSlug(slug) !== ''; } function updateWeightFieldVisibility(form){ var slug = form.getAttribute('data-mthc-calc') || ''; if(!isWeightCalculatorSlug(slug)){ return; } var shapeValue = form.elements['shape_type'] ? form.elements['shape_type'].value : (weightShapeFromSlug(slug) || 'plate'); var materialValue = form.elements['material_density'] ? String(form.elements['material_density'].value) : ''; var all = ['custom_density','length_mm','width_mm','height_mm','thickness_mm','diameter_mm','inner_diameter_mm','side_mm','wall_mm','leg_a_mm','leg_b_mm']; var map = { plate: ['length_mm','width_mm','thickness_mm'], block: ['length_mm','width_mm','height_mm'], round_bar: ['diameter_mm','length_mm'], pipe: ['diameter_mm','inner_diameter_mm','length_mm'], round_plate: ['diameter_mm','thickness_mm'], square_bar: ['side_mm','length_mm'], square_tube: ['side_mm','wall_mm','length_mm'], rect_tube: ['width_mm','height_mm','wall_mm','length_mm'], hex_bar: ['side_mm','length_mm'], angle_l: ['leg_a_mm','leg_b_mm','wall_mm','length_mm'] }; var visible = (map[shapeValue] || map.plate).slice(); if(materialValue === '0'){ visible.push('custom_density'); } all.forEach(function(name){ var el = form.elements[name]; if(!el){ return; } var field = el.closest ? el.closest('.mthc-field') : null; if(!field){ return; } var show = visible.indexOf(name) !== -1; field.style.display = show ? '' : 'none'; field.setAttribute('aria-hidden', show ? 'false' : 'true'); }); } function weightShapeHint(shape){ var hints = { plate: 'Plaka hesabı: uzunluk × genişlik × kalınlık.', block: 'Blok hesabı: uzunluk × genişlik × yükseklik.', round_bar: 'Dolu silindir hesabı: çap ve boy ile hacim bulunur.', pipe: 'Boru hesabı: dış çap hacminden iç çap boşluğu düşülür.', round_plate: 'Disk hesabı: daire alanı × kalınlık.', square_bar: 'Dolu kare mil hesabı: kare kesit alanı × boy.', square_tube: 'Kare kutu profil hesabı: dış kareden iç boşluk düşülür.', rect_tube: 'Dikdörtgen kutu profil hesabı: dış dikdörtgenden iç boşluk düşülür.', hex_bar: 'Altıgen dolu mil hesabı: karşılıklı yüz ölçüsünden kesit alanı bulunur.', angle_l: 'Köşebent hesabı: iki kanat alanından ortak köşe payı düşülür.' }; return hints[shape] || hints.plate; } function parseCutList(raw){ var items = []; String(raw || '').split(/[;\n,]+/).forEach(function(part){ var s = part.trim().toLowerCase(); if(!s){ return; } s = s.replace(/mm/g,'').replace(/adet/g,'').replace(/\s+/g,''); var m = s.match(/([0-9]+(?:[\.,][0-9]+)?)(?:x|\*)([0-9]+(?:[\.,][0-9]+)?)/); if(m){ var len = parseFloat(m[1].replace(',','.')); var qty = Math.round(parseFloat(m[2].replace(',','.'))); if(isFinite(len) && len > 0 && isFinite(qty) && qty > 0){ items.push({len:len, qty:qty}); } } else { var v = parseFloat(s.replace(',','.')); if(isFinite(v) && v > 0){ items.push({len:v, qty:1}); } } }); return items; } function calculate(form){ var slug = form.getAttribute('data-mthc-calc'); var r = []; switch(slug){ case 'lastik-olcusu-hesaplama': { var original = parseTireSize(text(form,'original_tire_size')); var newer = parseTireSize(text(form,'new_tire_size')); var indicated = num(form,'indicated_speed_kmh') || 100; if(!original && !newer){ r = []; break; } if(original){ r = r.concat(tireResultCards('Orijinal lastik', original)); } if(newer){ r = r.concat(tireResultCards('Yeni lastik', newer)); } if(original && newer){ var ratio = newer.circumferenceMm / original.circumferenceMm; var diaDiff = newer.diameterMm - original.diameterMm; var diaPct = original.diameterMm > 0 ? diaDiff / original.diameterMm * 100 : 0; var circDiff = newer.circumferenceMm - original.circumferenceMm; var actualSpeed = indicated * ratio; var speedDiff = actualSpeed - indicated; var speedPct = indicated > 0 ? speedDiff / indicated * 100 : 0; var actualDistance = 100 * ratio; r.push(add('Çap farkı', diaDiff, 'mm', 'Yeni lastik çapı ile orijinal lastik çapı arasındaki fark')); r.push(add('Çap farkı', diaPct, '%', 'Pozitif değer yeni lastiğin daha büyük olduğunu gösterir')); r.push(add('Araç yüksekliği değişimi', diaDiff / 2, 'mm', 'Yerden yükseklik yaklaşık çap farkının yarısı kadar değişir')); r.push(add('Çevre farkı', circDiff / 1000, 'm/tur', 'Yeni lastiğin her turda fazladan veya eksik aldığı yol')); r.push(add('Km saati ' + fmt(indicated,0) + ' gösterirken gerçek hız', actualSpeed, 'km/saat', 'Lastik çapı büyürse gerçek hız genelde daha yüksek çıkar')); r.push(add('Km saati sapması', speedPct, '%', 'Pozitif değer km saatinin olduğundan düşük gösterdiği anlamına gelir')); r.push(add('Sayaç 100 km gösterirken gerçek yol', actualDistance, 'km', 'Kilometre sayacı teorik farkı')); } break; } case 'kargo-desi-hacimsel-agirlik-hesaplama': { var L = num(form,'package_length_cm'), W = num(form,'package_width_cm'), H = num(form,'package_height_cm'); var q = Math.max(1, num(form,'package_quantity') || 1); var realEach = Math.max(0, num(form,'actual_weight_kg') || 0); var div = num(form,'desi_divisor') || 3000; var desiEach = (L * W * H) / div; var volumeM3Each = (L * W * H) / 1000000; var realTotal = realEach * q; var desiTotal = desiEach * q; var chargeable = Math.max(realTotal, desiTotal); r = [ add('Tek koli desi / hacimsel ağırlık', desiEach, 'kg', 'Koli dış ölçülerine göre'), add('Toplam desi / hacimsel ağırlık', desiTotal, 'kg', 'Koli adedi dahil'), add('Toplam gerçek tartı ağırlığı', realTotal, 'kg', 'Girilen gerçek ağırlık × koli adedi'), add('Yaklaşık esas alınacak ağırlık', chargeable, 'kg', 'Gerçek ağırlık ve hacimsel ağırlıktan büyük olan'), add('Toplam hacim', volumeM3Each * q, 'm³', 'Paketlerin toplam hacmi') ]; break; } case 'profil-kesim-fire-hesaplama': { var stock = num(form,'stock_length_mm') || 6000; var kerf = Math.max(0, num(form,'kerf_mm') || 0); var kgm = Math.max(0, num(form,'profile_weight_kg_m') || 0); var endWaste = Math.max(0, num(form,'usable_end_waste_mm') || 0); var list = parseCutList(text(form,'cut_list_text')); var pieces = 0, netLen = 0; list.forEach(function(x){ pieces += x.qty; netLen += x.len * x.qty; }); var cutLoss = pieces * kerf; var usableStock = Math.max(1, stock - endWaste); var bars = Math.ceil((netLen + cutLoss) / usableStock); var boughtLen = bars * stock; var wasteLen = Math.max(0, boughtLen - netLen - cutLoss); var totalKg = kgm > 0 ? boughtLen / 1000 * kgm : 0; var netKg = kgm > 0 ? netLen / 1000 * kgm : 0; var wastePct = boughtLen > 0 ? wasteLen / boughtLen * 100 : 0; r = [ add('Toplam net kesilecek boy', netLen / 1000, 'm', 'Parça boyları × adet'), add('Toplam parça adedi', pieces, 'adet', 'Kesim listesinden okunan toplam parça'), add('Yaklaşık kesim payı', cutLoss / 1000, 'm', 'Testere payı dahil'), add('Gerekli standart boy adedi', bars, 'boy', 'Basit toplam metraj hesabıyla'), add('Yaklaşık fire', wasteLen / 1000, 'm', 'Standart boydan kalan yaklaşık miktar'), add('Fire oranı', wastePct, '%', 'Yaklaşık fire / alınan toplam boy') ]; if(kgm > 0){ r.push(add('Alınacak yaklaşık ağırlık', totalKg, 'kg', 'Standart boy adedi × kg/m')); r.push(add('Net parça ağırlığı', netKg, 'kg', 'Sadece kesilecek net parçalar')); } break; } case 'kablo-gerilim-dusumu-hesaplama': { var sys = form.elements['cable_system'] ? form.elements['cable_system'].value : 'dc'; var V = num(form,'voltage_v') || 24, I = num(form,'current_a'), lenM = num(form,'cable_length_m'), S = num(form,'cable_section_mm2') || 1; var mat = form.elements['cable_material'] ? form.elements['cable_material'].value : 'cu'; var rho = mat === 'al' ? 0.0282 : 0.0175; var pf = Math.max(0.1, Math.min(1, num(form,'power_factor') || 1)); var drop = 0; if(sys === 'ac3'){ var rOne = rho * lenM / S; drop = Math.sqrt(3) * I * rOne * pf; } else { var rLoop = rho * (2 * lenM) / S; drop = I * rLoop * (sys === 'ac1' ? pf : 1); } var pctDrop = V > 0 ? drop / V * 100 : 0; var loadV = V - drop; r = [ add('Yaklaşık gerilim düşümü', drop, 'V', 'Kablo direnci ve akıma göre'), add('Gerilim düşümü oranı', pctDrop, '%', 'Besleme voltajına göre kayıp'), add('Yük ucunda kalan voltaj', loadV, 'V', 'Cihaz tarafında yaklaşık görülecek voltaj'), add('Kablo direnç katsayısı', rho, 'Ω·mm²/m', mat === 'al' ? 'Alüminyum iletken' : 'Bakır iletken') ]; break; } case 'motor-kw-hp-amper-kva-hesaplama': { var kwOut = num(form,'motor_power_kw'); var phase = num(form,'motor_phase') || 3; var voltage = num(form,'line_voltage_v') || 380; var eff = Math.max(1, Math.min(100, num(form,'motor_efficiency') || 85)) / 100; var pf2 = Math.max(0.1, Math.min(1, num(form,'power_factor') || 0.85)); var inputKw = eff > 0 ? kwOut / eff : kwOut; var hp = kwOut / 0.7457; var kva = inputKw / pf2; var amp = phase === 3 ? (kva * 1000) / (Math.sqrt(3) * voltage) : (kva * 1000) / voltage; r = [ add('Motor gücü', hp, 'HP', 'kW değerinin beygir gücü karşılığı'), add('Yaklaşık giriş gücü', inputKw, 'kW', 'Verim dikkate alınmış elektriksel giriş gücü'), add('Yaklaşık görünür güç', kva, 'kVA', 'Güç faktörü dikkate alınmış değer'), add('Yaklaşık hat akımı', amp, 'A', phase === 3 ? 'Üç faz hat akımı' : 'Tek faz hat akımı') ]; break; } case 'basinc-debi-hava-tuketimi-hesaplama': { var dia = num(form,'cylinder_diameter_mm'), stroke = num(form,'stroke_mm'); var cyc = num(form,'cycles_min'), press = num(form,'working_pressure_bar'); var acting = num(form,'acting_type') || 2, count = Math.max(1, num(form,'cylinder_count') || 1); var margin = Math.max(0, num(form,'leak_margin_percent') || 0) / 100; var volLStroke = (PI * Math.pow(dia/2,2) * stroke) / 1000000; var freeAirLMin = volLStroke * acting * cyc * count * (press + 1) * (1 + margin); var m3h = freeAirLMin * 60 / 1000; var cfm = freeAirLMin / 28.3168; r = [ add('Silindir tek strok hacmi', volLStroke, 'L', 'Piston alanı × strok'), add('Yaklaşık serbest hava tüketimi', freeAirLMin, 'L/dk', 'Basınç, çevrim, adet ve kaçak payı dahil'), add('Yaklaşık serbest hava tüketimi', m3h, 'm³/saat', ''), add('Yaklaşık serbest hava tüketimi', cfm, 'CFM', '1 CFM ≈ 28.3 L/dk') ]; break; } case 'malzeme-fiyat-fire-hesaplama': { var pwkg = num(form,'piece_weight_kg'), q2 = Math.max(1, num(form,'piece_quantity') || 1); var price = num(form,'unit_price_per_kg'), waste2 = Math.max(0, num(form,'waste_percent') || 0) / 100; var proc = Math.max(0, num(form,'processing_cost_total') || 0), tax = Math.max(0, num(form,'tax_percent') || 0) / 100; var netKg = pwkg * q2; var buyKg = netKg * (1 + waste2); var matCost = buyKg * price; var subtotal = matCost + proc; var taxAmount = subtotal * tax; var total = subtotal + taxAmount; r = [ add('Toplam net ağırlık', netKg, 'kg', 'Tek parça ağırlığı × adet'), add('Fire dahil alınacak ağırlık', buyKg, 'kg', 'Fire oranı eklenmiş yaklaşık ihtiyaç'), add('Malzeme bedeli', matCost, 'TL', 'Kg fiyatı × fire dahil ağırlık'), add('Ara toplam', subtotal, 'TL', 'Malzeme + işlem bedeli'), add('Vergi tutarı', taxAmount, 'TL', 'Girilen orana göre'), add('Genel toplam', total, 'TL', 'Vergi dahil toplam'), add('Parça başı yaklaşık maliyet', total / q2, 'TL/adet', 'Genel toplam / adet') ]; break; } case 'alan-hacim-kesit-hesaplama': { var gt = form.elements['geometry_type'] ? form.elements['geometry_type'].value : 'rectangle_area'; var Lmm = num(form,'length_mm'), Wmm = num(form,'width_mm'), Hmm = num(form,'height_mm'), Dmm = num(form,'diameter_mm'), IDmm = num(form,'inner_diameter_mm'), wallmm = num(form,'wall_mm'); var areaMm2 = 0, volMm3 = 0; var note = ''; if(gt === 'rectangle_area'){ areaMm2 = Lmm * Wmm; note = 'Uzunluk × genişlik'; } else if(gt === 'circle_area'){ areaMm2 = PI * Math.pow(Dmm/2,2); note = 'Daire alanı'; } else if(gt === 'ring_area'){ areaMm2 = PI * (Math.pow(Dmm/2,2) - Math.pow(IDmm/2,2)); note = 'Dış daireden iç daire düşüldü'; } else if(gt === 'box_volume'){ volMm3 = Lmm * Wmm * Hmm; areaMm2 = Lmm * Wmm; note = 'Dikdörtgen prizma'; } else if(gt === 'cylinder_volume'){ areaMm2 = PI * Math.pow(Dmm/2,2); volMm3 = areaMm2 * Lmm; note = 'Silindir hacmi'; } else if(gt === 'pipe_section'){ areaMm2 = PI * (Math.pow(Dmm/2,2) - Math.pow(IDmm/2,2)); note = 'Boru kesit alanı'; } else if(gt === 'rect_tube_section'){ areaMm2 = Wmm*Hmm - Math.max(Wmm-2*wallmm,0)*Math.max(Hmm-2*wallmm,0); note = 'Kutu profil kesit alanı'; } areaMm2 = Math.max(0, areaMm2); volMm3 = Math.max(0, volMm3); r = [ add('Hesaplanan alan / kesit', areaMm2, 'mm²', note), add('Hesaplanan alan / kesit', areaMm2 / 100, 'cm²', ''), add('Hesaplanan alan', areaMm2 / 1000000, 'm²', ''), add('Hacim', volMm3 / 1000, 'cm³', 'Hacim hesabı seçildiyse'), add('Hacim', volMm3 / 1000000, 'L', '1 L = 1000 cm³'), add('Hacim', volMm3 / 1000000000, 'm³', '') ]; break; } case 'malzeme-agirlik-hesaplama': case 'sac-plaka-agirlik-hesaplama': case 'blok-kutuk-agirlik-hesaplama': case 'yuvarlak-mil-agirlik-hesaplama': case 'boru-agirlik-hesaplama': case 'daire-disk-agirlik-hesaplama': case 'kare-mil-agirlik-hesaplama': case 'kare-kutu-profil-agirlik-hesaplama': case 'dikdortgen-kutu-profil-agirlik-hesaplama': case 'altigen-mil-agirlik-hesaplama': case 'kosebent-agirlik-hesaplama': { updateWeightFieldVisibility(form); var density = num(form,'material_density'); if(density <= 0){ density = num(form,'custom_density'); } var shape = form.elements['shape_type'] ? form.elements['shape_type'].value : (weightShapeFromSlug(slug) || 'plate'); var len = num(form,'length_mm'), w = num(form,'width_mm'), h = num(form,'height_mm'), th = num(form,'thickness_mm'); var d = num(form,'diameter_mm'), id = num(form,'inner_diameter_mm'), side = num(form,'side_mm'), wall = num(form,'wall_mm'); var la = num(form,'leg_a_mm'), lb = num(form,'leg_b_mm'); var qty = Math.max(1, num(form,'quantity') || 1); var waste = Math.max(0, num(form,'waste_percent') || 0) / 100; var volume = 0; var valid = true; var hint = weightShapeHint(shape); if(density <= 0){ valid = false; hint = 'Yoğunluk sıfırdan büyük olmalıdır.'; } if(shape === 'plate'){ volume = len * w * th; } else if(shape === 'block'){ volume = len * w * h; } else if(shape === 'round_bar'){ volume = PI * Math.pow(d/2, 2) * len; } else if(shape === 'pipe'){ if((!form.elements['inner_diameter_mm']) && wall > 0){ id = Math.max(d - 2 * wall, 0); } if(id >= d){ valid = false; hint = 'Boru hesabında iç çap dış çaptan küçük olmalıdır. Et kalınlığı dış çapın yarısından küçük olmalıdır.'; } volume = PI * (Math.pow(d/2, 2) - Math.pow(id/2, 2)) * len; } else if(shape === 'round_plate'){ volume = PI * Math.pow(d/2, 2) * th; } else if(shape === 'square_bar'){ volume = side * side * len; } else if(shape === 'square_tube'){ if(wall*2 >= side){ valid = false; hint = 'Kare kutu profilde et kalınlığı dış kenarın yarısından küçük olmalıdır.'; } volume = (side*side - Math.pow(Math.max(side - 2*wall, 0), 2)) * len; } else if(shape === 'rect_tube'){ if(wall*2 >= w || wall*2 >= h){ valid = false; hint = 'Dikdörtgen kutu profilde et kalınlığı dış genişlik ve yüksekliğin yarısından küçük olmalıdır.'; } volume = (w*h - Math.max(w - 2*wall, 0) * Math.max(h - 2*wall, 0)) * len; } else if(shape === 'hex_bar'){ volume = (Math.sqrt(3) / 2) * side * side * len; } else if(shape === 'angle_l'){ if(wall >= la || wall >= lb){ valid = false; hint = 'Köşebentte et kalınlığı kanat ölçülerinden küçük olmalıdır.'; } volume = (la*wall + lb*wall - wall*wall) * len; } volume = Math.max(0, volume); var cm3 = volume / 1000; var kgEach = valid ? (cm3 * density / 1000) : 0; var kgTotal = kgEach * qty * (1 + waste); var ton = kgTotal / 1000; var meterWeight = (len > 0 && ['round_bar','pipe','square_bar','square_tube','rect_tube','hex_bar','angle_l'].indexOf(shape) !== -1) ? kgEach / (len / 1000) : 0; var kgM2 = (shape === 'plate' || shape === 'round_plate') ? density * th : 0; r = [ add('Tek parça yaklaşık ağırlık', kgEach, 'kg', hint), add('Toplam yaklaşık ağırlık', kgTotal, 'kg', 'Adet ve fire/emniyet payı dahil'), add('Toplam yaklaşık ağırlık', ton, 'ton', ''), add('Hesaplanan hacim', cm3, 'cm³', 'Seçilen geometriye göre teorik hacim'), add('Kullanılan yoğunluk', density, 'g/cm³', 'Malzeme cinsine göre') ]; if(meterWeight > 0){ r.push(add('Yaklaşık metre ağırlığı', meterWeight, 'kg/m', 'Aynı kesitte 1 metre parça ağırlığı')); } if(kgM2 > 0){ r.push(add('Yaklaşık metrekare ağırlığı', kgM2, 'kg/m²', 'Aynı kalınlıkta 1 m² levha ağırlığı')); } break; } case 'vidali-mil-hiz-hesabi': { var motorRpm = num(form,'motor_rpm'), lead = num(form,'lead_mm'), ratio = num(form,'ratio') || 1; var screwRpm = motorRpm / ratio; var speed = screwRpm * lead; r = [add('Vidanın dönüş devri', screwRpm, 'rpm', 'Redüktör sonrası vida devri'), add('Teorik eksen hızı', speed, 'mm/dk', 'Kontrol yazılımındaki teorik hızlı hareket sınırı'), add('Teorik eksen hızı', speed/1000, 'm/dk', ''), add('Teorik eksen hızı', speed/60, 'mm/sn', '')]; break; } case 'vidali-mil-motor-devir-hesabi': { var targetSpeed = num(form,'target_speed'), lead2 = num(form,'lead_mm') || 1, ratio2 = num(form,'ratio') || 1; var screwNeed = targetSpeed / lead2; var motorNeed = screwNeed * ratio2; r = [add('Gerekli vida devri', screwNeed, 'rpm', ''), add('Gerekli motor devri', motorNeed, 'rpm', 'Motorun bu devri yük altında çevirebilmesi gerekir')]; break; } case 'vidali-mil-itme-kuvveti-hesabi': { var t = num(form,'motor_torque_nm'), ratio3 = num(form,'ratio') || 1, eff = num(form,'efficiency')/100, lead3 = num(form,'lead_mm')/1000; var screwTorque = t * ratio3 * eff; var forceN = lead3 > 0 ? (2 * PI * screwTorque) / lead3 : 0; r = [add('Vida girişindeki yaklaşık tork', screwTorque, 'Nm', ''), add('Teorik itme kuvveti', forceN, 'N', ''), add('Teorik itme kuvveti', forceN/KGF, 'kgf', '')]; break; } case 'vidali-mil-tork-ihtiyaci-hesabi': { var forceKg = num(form,'target_force_kgf'), lead4 = num(form,'lead_mm')/1000, ratio4 = num(form,'ratio') || 1, eff4 = num(form,'efficiency')/100; var force = forceKg * KGF; var motorTorque = (ratio4 * eff4) > 0 ? (force * lead4) / (2 * PI * ratio4 * eff4) : 0; r = [add('Hedef kuvvet', force, 'N', ''), add('Gerekli yaklaşık motor torku', motorTorque, 'Nm', 'Emniyet payı eklenmeden teorik değer'), add('Gerekli yaklaşık motor torku', motorTorque*10.1972, 'kgf·cm', '')]; break; } case 'vidali-mil-cozunurluk-hesabi': { var steps = num(form,'motor_steps'), micro = num(form,'microstep') || 1, ratio5 = num(form,'ratio') || 1, lead5 = num(form,'lead_mm') || 1; var stepsPerMm = steps * micro * ratio5 / lead5; r = [add('Kontrol ayarı', stepsPerMm, 'step/mm', 'Yazılıma girilecek başlangıç değeri'), add('Bir pulse ile teorik hareket', 1/stepsPerMm, 'mm', ''), add('Bir pulse ile teorik hareket', (1/stepsPerMm)*1000, 'mikron', ''), add('100 mm hareket için pulse', stepsPerMm*100, 'pulse', '')]; break; } case 'vidali-mil-kritik-devir-yaklasik': { var dmm = num(form,'root_diameter_mm'), lmm = num(form,'unsupported_length_mm'), cs = num(form,'support_factor'); var din = dmm / 25.4; var lin = lmm / 25.4; var critical = lin > 0 ? cs * 4.76e6 * din / (lin * lin) : 0; r = [add('Yaklaşık kritik devir', critical, 'rpm', 'Rezonans bölgesine yaklaşmamak gerekir'), add('80% emniyetli üst sınır', critical*0.8, 'rpm', 'Ön kontrol için daha güvenli kabul'), add('70% daha muhafazakâr sınır', critical*0.7, 'rpm', '')]; break; } case 'reduktor-cikis-deviri-hesabi': { var rpmIn = num(form,'motor_rpm'), rr = num(form,'ratio') || 1; var out = rpmIn / rr; r = [add('Redüktör çıkış devri', out, 'rpm', ''), add('Çıkış açısal hızı', out*6, 'derece/sn', '')]; break; } case 'reduktor-cikis-torku-hesabi': { var mt = num(form,'motor_torque_nm'), rr2 = num(form,'ratio') || 1, effr = num(form,'efficiency')/100; var outTorque = mt * rr2 * effr; r = [add('Yaklaşık çıkış torku', outTorque, 'Nm', ''), add('Yaklaşık çıkış torku', outTorque*10.1972, 'kgf·cm', '')]; break; } case 'reduktor-kayis-kasnak-hiz-hesabi': { var mr = num(form,'motor_rpm'), rr3 = num(form,'ratio') || 1, dia = num(form,'pulley_diameter_mm'); var outRpm = mr / rr3; var circ = PI * dia; var mmMin = outRpm * circ; r = [add('Kasnak çıkış devri', outRpm, 'rpm', ''), add('Teorik lineer hız', mmMin, 'mm/dk', ''), add('Teorik lineer hız', mmMin/1000, 'm/dk', ''), add('Teorik lineer hız', mmMin/60000, 'm/sn', '')]; break; } case 'step-motor-surucu-pulse-hesabi': { var spm = num(form,'steps_per_mm'), ts = num(form,'target_speed'); var hz = spm * ts / 60; r = [add('Gerekli pulse frekansı', hz, 'Hz', ''), add('Gerekli pulse frekansı', hz/1000, 'kHz', 'Kontrol kartı ve sürücü bu frekansı desteklemeli')]; break; } case 'step-motor-guc-kaynagi-hesabi': { var count = num(form,'motor_count'), cur = num(form,'driver_current'), sim = num(form,'simultaneous_percent')/100, margin = num(form,'margin_percent')/100, volt = num(form,'voltage'); var amps = count * cur * sim * (1 + margin); r = [add('Önerilen güç kaynağı akımı', amps, 'A', 'Yaklaşık ön seçim değeri'), add('Önerilen güç kaynağı gücü', amps*volt, 'W', ''), add('Önerilen güç kaynağı gücü', amps*volt/1000, 'kW', '')]; break; } case 'servo-motor-guc-tork-hesabi': { var massSv = Math.max(1, num(form,'moving_mass_kg')); var speedSv = Math.max(0.5, num(form,'target_speed_m_min')); var driveSv = form.elements['drive_type'] ? form.elements['drive_type'].value : 'rack94'; var levelSv = form.elements['work_level'] ? form.elements['work_level'].value : 'normal'; var orientSv = form.elements['axis_orientation'] ? form.elements['axis_orientation'].value : 'horizontal'; var leadMapSv = {bs5:5,bs10:10,bs20:20,rack94:94.25,belt100:100}; var effMapSv = {bs5:.88,bs10:.88,bs20:.86,rack94:.90,belt100:.92}; var fricMapSv = {bs5:.035,bs10:.035,bs20:.04,rack94:.075,belt100:.055}; var leadSv = leadMapSv[driveSv] || 94.25, effSv = effMapSv[driveSv] || .9; var accelSv = levelSv==='hard' ? 2.0 : (levelSv==='soft' ? .55 : 1.1); var forceSv = massSv*accelSv + massSv*9.81*(fricMapSv[driveSv]||.06); if(orientSv==='vertical'){ forceSv += massSv*9.81; } forceSv *= levelSv==='hard' ? 1.65 : 1.45; var torqueSv = forceSv*(leadSv/1000)/(2*PI*effSv); var rpmSv = (speedSv*1000)/leadSv; var kwSv = torqueSv*rpmSv/9550; var needKwSv = Math.max(.18, kwSv*1.45); var classesSv = [.4,.75,1,1.5,2,3,4.4,5.5,7.5,11]; var classSv = classesSv[classesSv.length-1]; for(var cs=0; cs=needKwSv){ classSv=classesSv[cs]; break; } } var nominalTqSv = classSv*9550/3000; r = [ add('Önerilen servo sınıfı', classSv, 'kW', orientSv==='vertical'?'Frenli motor seçin':'Standart başlangıç sınıfı'), add('Hesaplanan sürekli motor torku', torqueSv, 'Nm', 'Aktarma ve saha payı dahil'), add('Tahmini motor devri', rpmSv, 'rpm', rpmSv>3000?'Redüktör/aktarma oranı yeniden değerlendirilmeli':''), add('Seçilen sınıfın yaklaşık nominal torku', nominalTqSv, 'Nm', '3000 rpm sınıfı için'), add('Hesaplanan eksen kuvveti', forceSv, 'N', '') ]; break; } case 'servo-motor-tork-hesabi': { var pkw = num(form,'power_kw'), rpm2 = num(form,'rpm') || 1; var tq = 9550 * pkw / rpm2; r = [add('Yaklaşık tork', tq, 'Nm', ''), add('Yaklaşık tork', tq*10.1972, 'kgf·cm', '')]; break; } case 'servo-enkoder-cozunurluk-hesabi': { var ppr = num(form,'encoder_ppr'), quad = num(form,'quadrature') || 1, ratio6 = num(form,'ratio') || 1, lead6 = num(form,'lead_mm') || 1; var countsRev = ppr * quad; var countsMm = countsRev * ratio6 / lead6; r = [add('Tur başına sayım', countsRev, 'count/tur', ''), add('Lineer çözünürlük', countsMm, 'count/mm', ''), add('Bir count ile teorik hareket', 1/countsMm, 'mm', ''), add('Bir count ile teorik hareket', (1/countsMm)*1000, 'mikron', '')]; break; } case 'spindle-devir-hesabi': { var vcBase = num(form,'material_vc') || 350; var d = num(form,'tool_diameter_mm') || 1; var fl = num(form,'flute_count') || 1; var pr = num(form,'priority_factor') || 1; var mq = num(form,'machine_quality') || 1; var op = num(form,'operation_factor') || 1; var maxR = num(form,'max_spindle_rpm') || 24000; var rpmNeed = (vcBase * pr * 1000) / (PI * d); var rpmLimited = Math.min(rpmNeed, maxR); var chip = Math.max(0.015, Math.min(0.14, d * 0.008 * pr * mq * op)); var feed = rpmLimited * fl * chip; r = [add('Hesaplanan hedef spindle devri', rpmNeed, 'rpm', rpmNeed>maxR?'Spindle maksimum devrini aşıyor; sınırlı değerle başlayın':'Başlangıç devir değeri'), add('Kullanılabilir başlangıç devri', rpmLimited, 'rpm', ''), add('Önerilen başlangıç F', feed, 'mm/dk', 'Makine kalitesi ve öncelik dahil'), add('Tahmini talaş yükü', chip, 'mm/diş', '')]; break; } case 'spindle-kesme-hizi-hesabi': { var srpm = num(form,'rpm'), td = num(form,'tool_diameter_mm'); var speed = PI * td * srpm / 1000; r = [add('Kesme hızı', speed, 'm/dk', ''), add('Kesme hızı', speed/60, 'm/sn', '')]; break; } case 'freze-ilerleme-hizi-hesabi': { var frpm = num(form,'rpm'), flutes = num(form,'flute_count'), chip = num(form,'chipload'); var feed = frpm * flutes * chip; r = [add('Önerilen başlangıç ilerleme hızı', feed, 'mm/dk', ''), add('Önerilen başlangıç ilerleme hızı', feed/1000, 'm/dk', ''), add('Bir devirde ilerleme', flutes*chip, 'mm/tur', '')]; break; } case 'spindle-guc-tahmini-hesabi': { var phase = form.elements['phase_type'] ? form.elements['phase_type'].value : 'three'; var v = num(form,'voltage'), i = num(form,'current'), pf = num(form,'power_factor'), ef = num(form,'efficiency')/100; var electrical = (phase === 'three') ? SQRT3 * v * i * pf : v * i * pf; var shaft = electrical * ef; r = [add('Yaklaşık elektriksel güç', electrical/1000, 'kW', ''), add('Yaklaşık mile aktarılan güç', shaft/1000, 'kW', 'Verim hesaba katılmış tahmini değer'), add('Yaklaşık mile aktarılan güç', shaft, 'W', '')]; break; } case 'lineer-hareket-ivme-kuvvet-hesabi': { var m = num(form,'mass_kg'), a = num(form,'acceleration'), friction = num(form,'friction_n'), saf = num(form,'safety_percent')/100; var baseF = m * a + friction; var totalF = baseF * (1 + saf); r = [add('Emniyet paysız kuvvet', baseF, 'N', ''), add('Emniyet paylı hedef kuvvet', totalF, 'N', ''), add('Emniyet paylı hedef kuvvet', totalF/KGF, 'kgf', '')]; break; } case 'kayis-kasnak-cozunurluk-hesabi': { var teeth = num(form,'pulley_teeth'), pitch = num(form,'belt_pitch'), st = num(form,'motor_steps'), ms = num(form,'microstep') || 1, rt = num(form,'ratio') || 1; var mmRev = teeth * pitch / rt; var stepsMm = st * ms / mmRev; r = [add('Bir motor turunda lineer hareket', mmRev, 'mm', ''), add('Kontrol ayarı', stepsMm, 'step/mm', ''), add('Bir pulse ile teorik hareket', 1/stepsMm, 'mm', ''), add('Bir pulse ile teorik hareket', (1/stepsMm)*1000, 'mikron', '')]; break; } case 'step-motor-guc-hesaplama': { var massSt = Math.max(1, num(form,'moving_mass_kg')); var speedSt = Math.max(.5, num(form,'target_speed_m_min')); var driveSt = form.elements['drive_type'] ? form.elements['drive_type'].value : 'bs10'; var orientSt = form.elements['axis_orientation'] ? form.elements['axis_orientation'].value : 'horizontal'; var leadMapSt = {bs5:5,bs10:10,bs20:20,rack94:94.25,belt100:100}; var effMapSt = {bs5:.88,bs10:.88,bs20:.86,rack94:.88,belt100:.90}; var fricMapSt = {bs5:.04,bs10:.04,bs20:.045,rack94:.09,belt100:.06}; var leadSt = leadMapSt[driveSt] || 10, effSt = effMapSt[driveSt] || .86; var accelSt = Math.max(.45, Math.min(1.25, speedSt/10)); var forceSt = massSt*accelSt + massSt*9.81*(fricMapSt[driveSt]||.06); if(orientSt==='vertical'){ forceSt += massSt*9.81; } forceSt *= 1.75; var runTorqueSt = forceSt*(leadSt/1000)/(2*PI*effSt); var rpmSt = (speedSt*1000)/leadSt; var derateSt = Math.max(.22, Math.min(.82, .88 - rpmSt*.00065)); var holdTorqueSt = runTorqueSt/derateSt*1.2; var nmClassesSt = [1.2,2.2,3.0,4.5,6,8.5,12,20,30,40]; var classSt = nmClassesSt[nmClassesSt.length-1]; for(var ns=0; ns=holdTorqueSt){ classSt=nmClassesSt[ns]; break; } } var nemaSt = classSt<=3 ? 'NEMA 23' : (classSt<=12 ? 'NEMA 34' : 'NEMA 42'); var servoSt = rpmSt>900 || holdTorqueSt>12 || speedSt>15 || (orientSt==='vertical' && massSt>80); r = [ add('Önerilen step motor sınıfı', classSt, 'Nm', nemaSt), add('Tahmini motor devri', rpmSt, 'rpm', rpmSt>900?'Step motor için yüksek devir bölgesi':''), add('Hedef devirde gereken çalışma torku', runTorqueSt, 'Nm', 'Saha yükü ve emniyet payı dahil'), add('Hesaplanan eksen kuvveti', forceSt, 'N', ''), add('Saha kararı', servoSt ? 1 : 0, servoSt ? 'Servo önerilir' : 'Step uygundur', servoSt?'Hız/tork sınırı nedeniyle servo daha güvenli':'Uygun sürücü voltajı ve tork eğrisi kontrol edilmeli') ]; break; } case 'guc-kaynagi-hesaplama': { var countG = num(form,'motor_count'), curG = num(form,'driver_current'), simG = num(form,'simultaneous_percent')/100, marginG = num(form,'margin_percent')/100, voltG = num(form,'voltage'); var ampsG = countG * curG * simG * (1 + marginG); r = [add('Önerilen güç kaynağı akımı', ampsG, 'A', 'Yaklaşık ön seçim değeri'), add('Önerilen güç kaynağı gücü', ampsG*voltG, 'W', ''), add('Önerilen güç kaynağı gücü', ampsG*voltG/1000, 'kW', '')]; break; } case 'spindle-motor-kw-hesaplama': { var matSp = form.elements['material_type'] ? form.elements['material_type'].value : 'mdf'; var dSp = Math.max(1, num(form,'tool_diameter_mm')); var passSp = Math.max(.2, num(form,'max_pass_mm')); var dataSp = { foam:{rpm:18000,chip:.16,u:.05,offset:-.7}, mdf:{rpm:18000,chip:.075,u:.18,offset:0}, plywood:{rpm:18000,chip:.065,u:.22,offset:0}, wood:{rpm:16000,chip:.075,u:.25,offset:.3}, acrylic:{rpm:16000,chip:.05,u:.28,offset:0}, compact:{rpm:18000,chip:.045,u:.48,offset:1.0}, aluminum:{rpm:16000,chip:.035,u:.85,offset:1.2} }; var mpSp = dataSp[matSp] || dataSp.mdf; var rpmSp = mpSp.rpm; if(dSp>16){rpmSp=Math.min(rpmSp,10000);} else if(dSp>12){rpmSp=Math.min(rpmSp,12000);} else if(dSp>8){rpmSp=Math.min(rpmSp,16000);} var chipSp = Math.max(.025, Math.min(matSp==='aluminum'?.09:.20, mpSp.chip + dSp*.006)); var feedSp = rpmSp*2*chipSp; var widthSp = Math.max(1, Math.min(dSp*.5, dSp-0.2)); var safePassSp = dSp*(matSp==='aluminum'?.35:(matSp==='compact'?.45:.65)); var usedPassSp = Math.min(passSp, safePassSp); var mrrSp = usedPassSp*widthSp*feedSp; var cutKwSp = mrrSp*mpSp.u/60000; var floorSp = dSp<=4?1.5:(dSp<=6?2.2:(dSp<=8?3.5:(dSp<=12?4.5:(dSp<=16?6:9)))); floorSp = Math.max(1.5, floorSp + mpSp.offset + (passSp>dSp*.8?1:0) + (passSp>dSp?1.5:0)); var needSp = Math.max(floorSp, cutKwSp*2.2); var classesSp = [1.5,2.2,3.5,4.5,6,7.5,9,12,15]; var classSp = classesSp[classesSp.length-1]; for(var ps=0; ps=needSp){classSp=classesSp[ps];break;} } var maxFeedSp = feedSp*Math.max(.75,Math.min(1.45,classSp/Math.max(needSp,.1))); var riskSp = passSp>safePassSp; r = [ add('Önerilen minimum spindle sınıfı', classSp, 'kW', riskSp?'Girilen paso için güçlü ve rijit makine gerekir':'Standart sınıfa yuvarlandı'), add('Güvenli başlangıç devri', rpmSp, 'rpm', 'Yaygın 2 ağızlı takım kabulü'), add('Güvenli başlangıç ilerlemesi', maxFeedSp, 'mm/dk', 'İlk kesimde akım, ses ve talaş kontrol edilerek artırılır'), add('Önerilen ilk paso', safePassSp, 'mm', riskSp?'İstenen paso yüksek; önce bu değerden başlayın':'Girilen paso kabul edilebilir aralıkta'), add('Tahmini talaş kaldırma', mrrSp/1000, 'cm³/dk', 'Önerilen ilk paso üzerinden') ]; break; } case 'talas-yuku-hesaplama': { var feedT = num(form,'feed_mm_min'), rpmT = num(form,'rpm') || 1, flT = num(form,'flute_count') || 1; var chipT = feedT / rpmT / flT; r = [add('Talaş yükü', chipT, 'mm/diş', 'Diş başına ilerleme'), add('Bir devirde ilerleme', chipT*flT, 'mm/tur', '')]; break; } case 'spindle-tork-hesaplama': { var spKw = num(form,'power_kw'), spRpm = num(form,'rpm') || 1; var spTq = 9550 * spKw / spRpm; r = [add('Yaklaşık spindle torku', spTq, 'Nm', ''), add('Yaklaşık spindle torku', spTq*10.1972, 'kgf·cm', '')]; break; } case 'kremayer-hiz-hesaplama': { var krpm = num(form,'motor_rpm'), krat = num(form,'ratio') || 1, mod = num(form,'module'), teethK = num(form,'teeth'); var pitchDia = mod * teethK; var outK = krpm / krat; var travelRev = PI * pitchDia; var speedK = outK * travelRev; r = [add('Pinyon bölüm çapı', pitchDia, 'mm', ''), add('Pinyon bir tur ilerleme', travelRev, 'mm/tur', ''), add('Redüktör çıkış devri', outK, 'rpm', ''), add('Teorik eksen hızı', speedK, 'mm/dk', ''), add('Teorik eksen hızı', speedK/1000, 'm/dk', '')]; break; } case 'kremayer-itme-kuvveti-hesaplama': { var ktq = num(form,'motor_torque_nm'), krat2 = num(form,'ratio') || 1, keff = num(form,'efficiency')/100, kd = num(form,'pinion_diameter_mm')/1000; var outTqK = ktq * krat2 * keff; var forceK = kd > 0 ? outTqK / (kd/2) : 0; r = [add('Redüktör çıkış torku', outTqK, 'Nm', ''), add('Teorik itme kuvveti', forceK, 'N', ''), add('Teorik itme kuvveti', forceK/KGF, 'kgf', '')]; break; } case 'pinyon-cap-hesaplama': { var modP = num(form,'module'), teethP = num(form,'teeth'); var diaP = modP * teethP; r = [add('Pinyon bölüm dairesi çapı', diaP, 'mm', ''), add('Bir turdaki teorik ilerleme', PI*diaP, 'mm/tur', ''), add('Yarıçap', diaP/2, 'mm', '')]; break; } case 'planet-reduktor-guc-hiz-hesaplama': { var prpm = num(form,'motor_rpm'), ptq = num(form,'motor_torque_nm'), pr = num(form,'ratio') || 1, pe = num(form,'efficiency')/100; var poutRpm = prpm / pr; var poutTq = ptq * pr * pe; var pkw = poutTq * poutRpm / 9550; r = [add('Çıkış devri', poutRpm, 'rpm', ''), add('Çıkış torku', poutTq, 'Nm', ''), add('Çıkış mekanik gücü', pkw, 'kW', 'Verim sonrası yaklaşık değer')]; break; } case 'vidali-mil-guc-hesaplama': { var fkg = num(form,'force_kgf'), vmm = num(form,'speed_mm_min'), veff = num(form,'efficiency')/100, vsafe = num(form,'safety_percent')/100; var fn = fkg * KGF; var ms = vmm / 60000; var mechW = fn * ms; var inputW = veff > 0 ? mechW / veff : 0; r = [add('Saf mekanik güç', mechW, 'W', ''), add('Verim sonrası motor tarafı güç', inputW, 'W', ''), add('Emniyet paylı önerilen güç', inputW*(1+vsafe), 'W', '')]; break; } case 'mach3-steps-per-unit-hesaplama': case 'ddcs-pulse-mm-hesaplama': { var mst = num(form,'motor_steps'), mmic = num(form,'microstep') || 1, mrat = num(form,'ratio') || 1, mlead = num(form,'lead_mm') || 1; var mspm = mst * mmic * mrat / mlead; r = [add('Kontrol ayarı', mspm, 'pulse/mm', 'Başlangıç değeri'), add('Bir pulse ile teorik hareket', 1/mspm, 'mm', ''), add('Bir pulse ile teorik hareket', (1/mspm)*1000, 'mikron', '')]; break; } case 'inverter-guc-hesaplama': { var ikw = num(form,'motor_kw'), iload = num(form,'load_percent')/100, imar = num(form,'margin_percent')/100; var inv = ikw * iload * (1 + imar); r = [add('Hesaplanan inverter kapasitesi', inv, 'kW', 'Bir üst standart sınıf seçilebilir'), add('Yaklaşık W karşılığı', inv*1000, 'W', '')]; break; } case 'kablo-kesiti-hesaplama': { var kc = num(form,'current'), kl = num(form,'length_m'), kv = num(form,'voltage'), kd = num(form,'drop_percent')/100; var rho = 0.0175; var maxDrop = kv * kd; var section = maxDrop > 0 ? (2 * rho * kl * kc) / maxDrop : 0; r = [add('İzin verilen gerilim düşümü', maxDrop, 'V', ''), add('Yaklaşık minimum bakır kesit', section, 'mm²', 'Pratikte bir üst standart kesit seçilir')]; break; } case 'sigorta-salter-hesaplama': { var ph = form.elements['phase_type'] ? form.elements['phase_type'].value : 'single'; var skw = num(form,'power_kw'), sv = num(form,'voltage') || 1, spf = num(form,'power_factor') || 1, smar = num(form,'margin_percent')/100; var amp = (ph === 'three') ? (skw*1000)/(SQRT3*sv*spf) : (skw*1000)/(sv*spf); r = [add('Yaklaşık çalışma akımı', amp, 'A', ''), add('Emniyet paylı akım', amp*(1+smar), 'A', 'Sigorta ön seçimi için başlangıç')]; break; } case 'vakum-tutma-kuvveti-hesaplama': { var area = num(form,'area_cm2')/10000, vkpa = num(form,'vacuum_kpa')*1000, leak = num(form,'leak_percent')/100; var vf = area * vkpa * (1-leak); r = [add('Pratik tahmini tutma kuvveti', vf, 'N', 'Kaçak düşülmüş yaklaşık değer'), add('Pratik tahmini tutma kuvveti', vf/KGF, 'kgf', '')]; break; } case 'kesim-suresi-hesaplama': { var pathM = num(form,'toolpath_m'), feedC = num(form,'feed_mm_min') || 1, pass = num(form,'pass_count') || 1, loss = num(form,'loss_percent')/100, extra = num(form,'extra_min'); var baseMin = (pathM*1000/feedC) * pass; var totalMin = baseMin * (1+loss) + extra; r = [add('Teorik kesim süresi', baseMin, 'dk', ''), add('Kayıp ve hazırlık dahil süre', totalMin, 'dk', ''), add('Saat karşılığı', totalMin/60, 'saat', '')]; break; } case 'parca-basi-maliyet-hesaplama': { var mh = num(form,'machine_hour_cost'), oh = num(form,'operator_hour_cost'), jm = num(form,'job_minutes'), mat = num(form,'material_cost'), tool = num(form,'tool_cost'), scrap = num(form,'scrap_percent')/100, pc = num(form,'part_count') || 1; var labor = (mh+oh) * jm / 60; var total = (labor + mat + tool) * (1+scrap); r = [add('Toplam taban maliyet', total, 'TL', ''), add('Parça başı taban maliyet', total/pc, 'TL/adet', 'Kâr ve vergi eklenmeden')]; break; } case 'elektrik-tuketimi-hesaplama': { var sk = num(form,'spindle_kw'), vk = num(form,'vacuum_kw'), ak = num(form,'axis_kw'), hrs = num(form,'hours'), price = num(form,'price_kwh'); var kwh = (sk+vk+ak)*hrs; r = [add('Toplam tüketim', kwh, 'kWh', ''), add('Yaklaşık elektrik maliyeti', kwh*price, 'TL', '')]; break; } case 'paso-sayisi-hesaplama': { var th = num(form,'thickness_mm'), dp = num(form,'depth_per_pass_mm') || 1, fin = num(form,'finish_allowance_mm'); var rough = Math.max(th - fin, 0); var passes = Math.ceil(rough / dp) + (fin > 0 ? 1 : 0); r = [add('Kaba paso sayısı', Math.ceil(rough/dp), 'adet', ''), add('Toplam paso sayısı', passes, 'adet', fin > 0 ? 'Son temizlik pasosu dahil' : '')]; break; } case 'lineer-kizak-yuk-hesaplama': { var loadKg = num(form,'load_kg'), carCount = num(form,'car_count') || 1, dyn = num(form,'dynamic_factor') || 1, sf = num(form,'safety_percent')/100; var perKg = loadKg / carCount; var designKg = perKg * dyn * (1 + sf); r = [add('Araba başına statik yük', perKg, 'kg', ''), add('Araba başına seçim yükü', designKg, 'kg', 'Dinamik katsayı ve emniyet payı dahil'), add('Araba başına seçim yükü', designKg*KGF, 'N', '')]; break; } case 'lineer-araba-yuk-dagilimi-hesaplama': { var lkg = num(form,'load_kg'), oh = num(form,'overhang_mm')/1000, spacing = num(form,'car_spacing_mm')/1000, cc = num(form,'car_count') || 1; var f = lkg * KGF; var moment = f * oh; var extra = spacing > 0 ? moment / spacing : 0; var avg = f / cc; var design = avg + extra / Math.max(cc/2,1); r = [add('Yaklaşık moment', moment, 'Nm', ''), add('Ortalama araba yükü', avg, 'N', ''), add('Moment etkili tahmini kritik yük', design, 'N', 'En çok yük alan araba için kaba tahmin'), add('Moment etkili tahmini kritik yük', design/KGF, 'kgf', '')]; break; } case 'krom-mil-sehim-hesaplama': { var lk = num(form,'load_kg'), span = num(form,'span_mm'), d = num(form,'diameter_mm'), sup = num(form,'support_factor') || 1; var E = 210000, F = lk * KGF, I = PI * Math.pow(d,4) / 64; var defl = I > 0 ? (F * Math.pow(span,3) / (48 * E * I)) * sup : 0; r = [add('Yaklaşık sehim', defl, 'mm', 'Basit kiriş yaklaşımı'), add('Mil atalet momenti', I, 'mm⁴', '')]; break; } case 'sigma-profil-agirlik-hesaplama': { var kgm = num(form,'kg_per_m'), len = num(form,'length_m'), cnt = num(form,'count') || 1; var total = kgm * len * cnt; r = [add('Tek parça ağırlığı', kgm*len, 'kg', ''), add('Toplam profil ağırlığı', total, 'kg', '')]; break; } case 'sigma-profil-kesim-olcusu-hesaplama': { var outer = num(form,'outer_mm'), allow = num(form,'allowance_each_mm'), cntp = num(form,'count') || 1; var cut = Math.max(outer - 2*allow, 0); r = [add('Tek parça kesim boyu', cut, 'mm', ''), add('Toplam kesim uzunluğu', cut*cntp/1000, 'm', '')]; break; } case 'sigma-profil-sehim-yaklasik-hesaplama': { var pload = num(form,'load_kg'), pspan = num(form,'span_mm'), icm4 = num(form,'inertia_cm4'), psup = num(form,'support_factor') || 1; var Eal = 70000, Iprof = icm4 * 10000, Fp = pload * KGF; var pdef = Iprof > 0 ? (Fp * Math.pow(pspan,3) / (48 * Eal * Iprof)) * psup : 0; r = [add('Yaklaşık profil sehimi', pdef, 'mm', ''), add('Kullanılan atalet momenti', Iprof, 'mm⁴', '')]; break; } case 'kaplin-tork-hesaplama': { var ckw = num(form,'power_kw'), crpm = num(form,'rpm') || 1, csafe = num(form,'safety_percent')/100; var ct = 9550 * ckw / crpm; r = [add('Çalışma torku', ct, 'Nm', ''), add('Emniyet paylı kaplin torku', ct*(1+csafe), 'Nm', 'Kaplin kapasitesi için başlangıç'), add('Emniyet paylı kaplin torku', ct*(1+csafe)*10.1972, 'kgf·cm', '')]; break; } case 'triger-kayis-uzunlugu-hesaplama': { var C = num(form,'center_mm'), t1 = num(form,'teeth1'), t2 = num(form,'teeth2'), pitch = num(form,'pitch_mm'); var D1 = (t1*pitch)/PI, D2 = (t2*pitch)/PI; var L = 2*C + (PI/2)*(D1+D2) + (Math.pow(D2-D1,2)/(4*C || 1)); r = [add('Yaklaşık kayış boyu', L, 'mm', 'En yakın standart kayış seçilir'), add('Yaklaşık kayış diş sayısı', L/pitch, 'diş', ''), add('Birinci kasnak bölüm çapı', D1, 'mm', ''), add('İkinci kasnak bölüm çapı', D2, 'mm', '')]; break; } case 'kasnak-oran-hesaplama': { var mr = num(form,'motor_rpm'), dt = num(form,'driver_teeth') || 1, drt = num(form,'driven_teeth') || 1, effo = num(form,'efficiency')/100; var ratio = drt / dt; var out = mr / ratio; r = [add('Aktarma oranı', ratio, ':1', 'Çıkış kasnağı / motor kasnağı'), add('Çıkış devri', out, 'rpm', ''), add('Yaklaşık tork çarpanı', ratio*effo, 'kat', 'Verim sonrası')]; break; } case 'rulman-omur-hesaplama': { var Ckn = num(form,'c_kn'), Pkn = num(form,'p_kn') || 0.001, rrpm = num(form,'rpm') || 1; var L10 = Math.pow(Ckn/Pkn, 3); var hours = L10 * 1000000 / (60 * rrpm); r = [add('L10 temel ömür', L10, 'milyon devir', ''), add('Yaklaşık çalışma ömrü', hours, 'saat', 'Sabit yük varsayımıyla'), add('Yaklaşık çalışma ömrü', hours/24, 'gün', '')]; break; } case 'pnomatik-silindir-kuvvet-hesaplama': { var cd = num(form,'diameter_mm')/1000, rod = num(form,'rod_mm')/1000, bar = num(form,'pressure_bar'), ce = num(form,'efficiency')/100; var P = bar * 100000, areaPush = PI*Math.pow(cd,2)/4, areaRod = PI*Math.pow(rod,2)/4; var push = P * areaPush * ce, pull = P * Math.max(areaPush-areaRod,0) * ce; r = [add('İtme kuvveti', push, 'N', ''), add('İtme kuvveti', push/KGF, 'kgf', ''), add('Çekme kuvveti', pull, 'N', 'Mil alanı düşülmüş'), add('Çekme kuvveti', pull/KGF, 'kgf', '')]; break; } case 'kompresor-debi-hesaplama': { var kd = num(form,'diameter_mm')/1000, stroke = num(form,'stroke_mm')/1000, cyc = num(form,'cycle_min'), kc = num(form,'count') || 1, kb = num(form,'pressure_bar'), lossK = num(form,'loss_percent')/100; var vol = PI*Math.pow(kd,2)/4*stroke; // m3 one stroke var freeLm = vol*2*cyc*kc*(kb+1)*1000*(1+lossK); r = [add('Yaklaşık serbest hava ihtiyacı', freeLm, 'L/dk', 'İleri-geri çevrim dahil'), add('Saatlik hava ihtiyacı', freeLm*60, 'L/saat', '')]; break; } case 'atc-hava-tuketimi-hesaplama': { var ch = num(form,'changes_hour'), apl = num(form,'air_per_change_l'), aloss = num(form,'loss_percent')/100; var lh = ch * apl * (1+aloss); r = [add('Saatlik hava tüketimi', lh, 'L/saat', ''), add('Ortalama hava ihtiyacı', lh/60, 'L/dk', '')]; break; } case 'vakum-pompasi-guc-hesaplama': { var flow = num(form,'flow_m3h'), vac = num(form,'vacuum_kpa')*1000, ve = num(form,'efficiency')/100, vs = num(form,'safety_percent')/100; var q = flow / 3600; var airKw = q * vac / 1000; var motorKw = ve > 0 ? airKw / ve * (1+vs) : 0; r = [add('Teorik hava gücü', airKw, 'kW', ''), add('Verim ve pay dahil motor gücü', motorKw, 'kW', 'Yaklaşık ön seçim')]; break; } case 'blower-debi-hesaplama': { var za = num(form,'zone_area_m2'), leakRate = num(form,'leak_m3h_m2'), oz = num(form,'open_zones') || 1, bs = num(form,'safety_percent')/100; var req = za * leakRate * oz * (1+bs); r = [add('Önerilen minimum debi', req, 'm³/h', 'Kaçak ve emniyet payı dahil'), add('Dakika karşılığı', req/60, 'm³/dk', '')]; break; } case 'vfd-frekans-devir-hesaplama': { var hz = num(form,'frequency_hz'), poles = num(form,'poles') || 2, slip = num(form,'slip_percent')/100; var sync = 120 * hz / poles; var actual = sync * (1-slip); r = [add('Senkron devir', sync, 'rpm', ''), add('Kayma sonrası yaklaşık devir', actual, 'rpm', '')]; break; } case 'motor-akim-guc-hesaplama': { var mphase = form.elements['phase_type'] ? form.elements['phase_type'].value : 'three'; var mv = num(form,'voltage'), mi = num(form,'current'), mpf = num(form,'power_factor') || 1, meff = num(form,'efficiency')/100; var elW = (mphase === 'three') ? SQRT3*mv*mi*mpf : mv*mi*mpf; r = [add('Yaklaşık elektriksel güç', elW/1000, 'kW', ''), add('Yaklaşık mekanik güç', elW*meff/1000, 'kW', 'Verim sonrası')]; break; } case 'cnc-router-motor-secim-on-kontrol': { var rm = num(form,'mass_kg'), rv = num(form,'speed_mm_min')/60000, ra = num(form,'acceleration'), rf = num(form,'friction_n'), re = num(form,'efficiency')/100, rs = num(form,'safety_percent')/100; var forceR = (rm*ra + rf) * (1+rs); var powerR = re > 0 ? (forceR * rv) / re : 0; r = [add('Emniyet paylı hedef kuvvet', forceR, 'N', ''), add('Emniyet paylı hedef kuvvet', forceR/KGF, 'kgf', ''), add('Yaklaşık mekanik güç ihtiyacı', powerR, 'W', 'Aktarma verimi dahil')]; break; } case 'mdf-kesim-parametre-hesaplama': case 'aluminyum-kesim-parametre-hesaplama': case 'pleksi-kesim-parametre-hesaplama': { var crpm2 = num(form,'rpm'), cfl = num(form,'flute_count') || 1, cchip = num(form,'chipload'), cpass = num(form,'pass_depth_mm'); var feed = crpm2 * cfl * cchip; r = [add('Başlangıç ilerleme hızı', feed, 'mm/dk', ''), add('Başlangıç ilerleme hızı', feed/1000, 'm/dk', ''), add('Girilen paso derinliği', cpass, 'mm', 'Makine rijitliğiyle kontrol edin')]; break; } case 'ic-kose-radyus-hesaplama': { var td = num(form,'tool_diameter_mm'), fa = num(form,'finish_allowance_mm'); var rad = td/2 + fa; r = [add('Minimum iç köşe radyüsü', rad, 'mm', ''), add('Takım yarıçapı', td/2, 'mm', '')]; break; } case 'takim-cikma-orani-hesaplama': { var td2 = num(form,'tool_diameter_mm') || 1, so = num(form,'stickout_mm'); var ld = so / td2; r = [add('Çıkma oranı L/D', ld, 'kat', ''), add('Pens dışı uzunluk', so, 'mm', ld > 4 ? 'Yüksek titreşim riski olabilir' : 'Daha kontrollü aralık')]; break; } case 'z-ekseni-fren-torku-hesaplama': { var zl = num(form,'load_kg'), zlead = num(form,'lead_mm')/1000, zratio = num(form,'ratio') || 1, zeff = num(form,'efficiency')/100, zsafe = num(form,'safety_percent')/100; var zforce = zl * KGF; var zt = (zforce * zlead) / (2*PI*zratio*Math.max(zeff,0.001)); r = [add('Teorik tutma torku', zt, 'Nm', ''), add('Emniyet paylı fren torku', zt*(1+zsafe), 'Nm', 'Fren seçimi için'), add('Emniyet paylı fren torku', zt*(1+zsafe)*10.1972, 'kgf·cm', '')]; break; } case 'spindle-sogutma-suyu-hacmi-hesaplama': { var sw = num(form,'spindle_kw'), loadp = num(form,'load_percent')/100, heatp = num(form,'heat_percent')/100, tm = num(form,'time_min'), tr = num(form,'temp_rise_c') || 1; var heatW = sw*1000*loadp*heatp; var joule = heatW*tm*60; var liters = joule/(4186*tr); r = [add('Suya aktarılan yaklaşık ısı', heatW, 'W', ''), add('Minimum teorik su hacmi', liters, 'L', 'Radyatör veya chiller olmadan'), add('Emniyetli pratik hacim', liters*2, 'L', 'Yaklaşık iki kat pay')]; break; } case 'cnc-router-makine-konfiguratoru': { var size = num(form,'machine_size_factor'), mat = num(form,'material_factor'), body = num(form,'body_factor'), motor = num(form,'motor_factor'), sp = num(form,'spindle_kw'), vac = num(form,'vacuum_table'), atc = num(form,'atc'), pri = num(form,'priority'); var score = size*18 + mat*16 + body*18 + motor*10 + sp*5 + vac*8 + atc*10 + pri*8; var classHint = score < 95 ? 'Hafif/orta sınıf; ekonomik veya standart üretim için' : (score < 140 ? 'Orta-ağır sınıf; servo ve güçlü gövde önerilir' : 'Ağır sanayi sınıfı; servo + redüktör, güçlü vakum ve rijit gövde gerekli'); var recSp = Math.max(sp, mat >= 4 ? 6 : (size >= 3 ? 4.5 : 2.2)); r = [add('Makine ihtiyaç puanı', score, 'puan', classHint), add('Önerilen minimum spindle sınıfı', recSp, 'kW', ''), add('Vakum / ATC donanım puanı', vac*8 + atc*10, 'puan', 'Donanım karmaşıklığı')]; break; } case 'cnc-eksen-motor-secim-sihirbazi': { var mE = num(form,'mass_kg'), vE = num(form,'target_speed')/60000, aE = num(form,'acceleration'), fE = num(form,'friction_n'), radE = num(form,'drive_radius_mm')/1000, ratioE = num(form,'ratio') || 1, effE = Math.max(num(form,'efficiency')/100,0.001), safeE = num(form,'safety_percent')/100; var forceE = (mE*aE + fE) * (1+safeE); var motorTorqueE = forceE * radE / (ratioE * effE); var circE = 2*PI*radE*1000; var outRpmE = circE > 0 ? num(form,'target_speed') / circE : 0; var motorRpmE = outRpmE * ratioE; r = [add('Emniyet paylı eksen kuvveti', forceE, 'N', ''), add('Gerekli yaklaşık motor torku', motorTorqueE, 'Nm', motorRpmE > 1000 ? 'Bu devir step motor için dikkat ister' : ''), add('Gerekli motor devri', motorRpmE, 'rpm', ''), add('Yaklaşık mekanik güç', forceE*vE/effE, 'W', '')]; break; } case 'servo-atalet-uyumluluk-hesabi': { var lm = num(form,'load_kg'), rrmm = num(form,'radius_mm')/1000, rg = num(form,'ratio') || 1, miKgcm = num(form,'motor_inertia_kgcm2'), acc = num(form,'target_acceleration'); var loadJ = lm * rrmm * rrmm; var reflected = loadJ / (rg*rg); var motorJ = miKgcm * 0.0001; var ratioJ = motorJ > 0 ? reflected / motorJ : 0; var accTorque = reflected * (rrmm > 0 ? acc/rrmm : 0); r = [add('Yük ataleti', loadJ, 'kg·m²', ''), add('Motora yansıyan atalet', reflected, 'kg·m²', ''), add('Atalet oranı', ratioJ, ':1', ratioJ > 10 ? 'Yüksek; tuning zorlaşabilir' : (ratioJ > 5 ? 'Sınırda; kontrol edin' : 'Daha rahat ayarlanabilir')), add('Yaklaşık ivme torku etkisi', accTorque, 'Nm', '')]; break; } case 'cnc-router-maksimum-hiz-hesaplama': { var mrpm = num(form,'motor_rpm'), mmrev = num(form,'motion_per_rev'), rat = num(form,'ratio') || 1, spmm = num(form,'steps_per_mm') || 1, khz = num(form,'card_khz'); var mech = mrpm/rat*mmrev; var pulseLimit = khz*1000*60/spmm; r = [add('Mekanik maksimum hız', mech, 'mm/dk', 'Motor ve aktarma sınırı'), add('Pulse sınırına göre maksimum hız', pulseLimit, 'mm/dk', 'Kontrol kartı sınırı'), add('Kullanılabilir teorik üst sınır', Math.min(mech,pulseLimit), 'mm/dk', mech < pulseLimit ? 'Darboğaz mekanik/motor tarafı' : 'Darboğaz pulse/kontrol kartı tarafı')]; break; } case 'kontrol-karti-pulse-siniri-hesaplama': { var sppm = num(form,'steps_per_mm'), tv = num(form,'target_speed'), ck = num(form,'card_khz'), micro = num(form,'microstep'); var needKhz = sppm * tv / 60 / 1000; var maxSpeed = sppm > 0 ? ck*1000*60/sppm : 0; var reserve = needKhz > 0 ? (ck-needKhz)/needKhz*100 : 0; r = [add('Gerekli pulse frekansı', needKhz, 'kHz', ''), add('Kart sınırına göre maksimum hız', maxSpeed, 'mm/dk', ''), add('Frekans rezervi', reserve, '%', reserve < 20 ? 'Sınırda veya yetersiz olabilir' : 'Daha güvenli aralık')]; break; } case 'spindle-inverter-uyum-sihirbazi': { var skw = num(form,'spindle_kw'), sv = num(form,'spindle_voltage'), sup = num(form,'supply_type'), pf = num(form,'power_factor') || 1, ef = Math.max(num(form,'efficiency')/100,0.001), len = num(form,'cable_length_m'), saf = num(form,'safety_percent')/100; var current = sup === 3 ? (skw*1000/(SQRT3*sv*pf*ef)) : (skw*1000/(sv*pf*ef)); var inv = skw*(1+saf); var cable = current <= 10 ? 1.5 : (current <= 18 ? 2.5 : (current <= 26 ? 4 : (current <= 34 ? 6 : 10))); r = [add('Önerilen minimum inverter gücü', inv, 'kW', 'Bir üst standart sınıf seçilebilir'), add('Yaklaşık çalışma akımı', current, 'A', ''), add('Ön kablo kesiti sınıfı', cable, 'mm²', len > 20 ? 'Uzun kabloda gerilim düşümü ayrıca kontrol edilmeli' : '')]; break; } case 'spindle-pens-takim-uyum-rehberi': { var col = num(form,'collet_max_mm'), tool = num(form,'tool_diameter_mm'), rpmP = num(form,'rpm'), stick = num(form,'stickout_mm'); var margin = col - tool; var vcP = PI*tool*rpmP/1000; var ldP = tool > 0 ? stick/tool : 0; r = [add('Pens çap rezervi', margin, 'mm', margin < 1 ? 'Sınırda; daha büyük pens sistemi gerekebilir' : 'Uygun aralık'), add('Kesme hızı', vcP, 'm/dk', ''), add('Takım çıkma oranı', ldP, 'L/D', ldP > 4 ? 'Titreşim riski yüksek' : 'Daha kontrollü aralık')]; break; } case 'gelismis-talas-yuku-hesaplama': { var mf = num(form,'material_factor'), td = num(form,'tool_diameter_mm'), fl = num(form,'flute_count') || 1, rpmG = num(form,'rpm') || 1, feedG = num(form,'feed_mm_min'), depG = num(form,'depth_mm'), widG = num(form,'width_mm'); var chipG = feedG/(rpmG*fl); var mrrG = depG*widG*feedG/1000; var riskG = (chipG/(td||1))*100*mf; r = [add('Hesaplanan talaş yükü', chipG, 'mm/diş', chipG < 0.02 ? 'Düşük; sürtme/yanma riski' : (chipG > 0.12 ? 'Yüksek; takım kırma riski' : 'Genel başlangıç aralığı')), add('Talaş kaldırma hacmi', mrrG, 'cm³/dk', ''), add('Kesim yükü risk skoru', riskG, 'puan', riskG > 3 ? 'Malzeme ve makine rijitliği kontrol edilmeli' : '')]; break; } case 'gelismis-cnc-kesim-suresi-hesaplama': { var cp = num(form,'cut_path_mm'), rp = num(form,'rapid_path_mm'), ff = num(form,'feed_mm_min')||1, rr0 = num(form,'rapid_mm_min')||1, holes = num(form,'hole_count'), sh = num(form,'sec_per_hole'), tc = num(form,'tool_changes'), stc = num(form,'sec_per_tool'), setup = num(form,'setup_min'), clean = num(form,'cleanup_min'); var cutMin = cp/ff; var rapidMin = rp/rr0; var extraMin = (holes*sh + tc*stc)/60; var total = cutMin + rapidMin + extraMin + setup + clean; r = [add('Net kesim süresi', cutMin, 'dk', ''), add('Gerçekçi toplam parça süresi', total, 'dk', ''), add('8 saatte yaklaşık kapasite', total > 0 ? 480/total : 0, 'adet', '')]; break; } case 'profesyonel-parca-basi-maliyet-hesaplama': { var matC = num(form,'material_cost'), waste = num(form,'waste_percent')/100, cyc = num(form,'cycle_min'), ekw = num(form,'electric_kw'), eprice = num(form,'electric_price'), oph = num(form,'operator_hour'), toolC = num(form,'tool_cost'), mach = num(form,'machine_hour'), overhead = num(form,'overhead_percent')/100, prof = num(form,'profit_percent')/100; var timeH = cyc/60; var base = matC*(1+waste) + ekw*timeH*eprice + oph*timeH + toolC + mach*timeH; var withOver = base*(1+overhead); var sale = withOver*(1+prof); r = [add('Net parça maliyeti', base, 'TL', ''), add('Genel gider dahil maliyet', withOver, 'TL', ''), add('Önerilen satış fiyatı', sale, 'TL', 'Hedef kâr dahil')]; break; } case 'vakum-tabla-blower-secim-sihirbazi': { var pw = num(form,'part_width_mm'), pl = num(form,'part_length_mm'), vk = num(form,'vacuum_kpa'), leak = num(form,'leak_percent')/100, cf = num(form,'cut_force_n'), zones = num(form,'zone_count'), mlf = num(form,'material_leak_factor'); var area = pw*pl/1000000; var theoretical = area*vk*1000; var practical = theoretical*Math.max(0,1-leak)/mlf; var margin = cf > 0 ? practical/cf : 0; r = [add('Parça vakum alanı', area, 'm²', ''), add('Pratik tutma kuvveti tahmini', practical, 'N', ''), add('Kesim kuvvetine karşı güvenlik oranı', margin, 'kat', margin < 2 ? 'Sınırda; kayma riski olabilir' : 'Daha güvenli aralık'), add('Bölge başına göreli blower ihtiyacı', zones*mlf/(Math.max(0.1,1-leak)), 'birim', '')]; break; } case 'toz-emme-talas-toplama-hesaplama': { var hd = num(form,'hose_diameter_mm')/1000, as = num(form,'air_speed_ms'), hl = num(form,'hose_length_m'), eb = num(form,'elbow_count'), df = num(form,'dust_factor'); var q = PI*Math.pow(hd/2,2)*as*3600; var loss = (hl*0.08 + eb*0.25)*df; r = [add('Gerekli hava debisi', q, 'm³/h', ''), add('Hortum/dirsek kayıp skoru', loss, 'puan', loss > 2 ? 'Direnç yüksek; çap ve hat kontrol edilmeli' : ''), add('Kayıp paylı debi hedefi', q*(1+loss/10), 'm³/h', '')]; break; } case 'lineer-kizak-araba-yuk-sihirbazi': { var load = num(form,'load_kg')*KGF, cars = num(form,'carriage_count')||1, mom = num(form,'moment_nm'), rail = num(form,'rail_spacing_mm')/1000, sf = num(form,'safety_percent')/100; var baseCar = load/cars; var momForce = rail > 0 ? mom/rail : 0; var totalCar = (baseCar + momForce/Math.max(1,cars/2))*(1+sf); r = [add('Statik araba başı yük', baseCar, 'N', ''), add('Momentten gelen ek kuvvet', momForce, 'N', ''), add('Emniyet paylı araba başı hedef', totalCar, 'N', '')]; break; } case 'vidali-mil-omur-burkulma-sihirbazi': { var d = num(form,'root_diameter_mm'), l = num(form,'length_mm'), loadK = num(form,'load_kgf'), rpmV = num(form,'rpm'), sfac = num(form,'support_factor'), safv = num(form,'safety_percent')/100; var din = d/25.4, lin = l/25.4; var crit = lin > 0 ? sfac*4.76e6*din/(lin*lin) : 0; var rpmMargin = rpmV > 0 ? crit/rpmV : 0; var buckScore = loadK*Math.pow(l/1000,2)/(Math.max(1,d*d))*(1+safv); r = [add('Yaklaşık kritik devir', crit, 'rpm', ''), add('Çalışma devrine güvenlik oranı', rpmMargin, 'kat', rpmMargin < 1.5 ? 'Kritik devire yakın' : 'Daha güvenli'), add('Burkulma risk skoru', buckScore, 'puan', buckScore > 2 ? 'Çap/yataklama kontrol edilmeli' : '')]; break; } case 'kremayer-pinyon-secim-sihirbazi': { var mod = num(form,'module'), teeth = num(form,'teeth'), ratioK = num(form,'ratio')||1, rpmK = num(form,'motor_rpm'), tqK = num(form,'motor_torque_nm'), massK = num(form,'mass_kg'), accK = num(form,'acceleration'), effK = num(form,'efficiency')/100; var pd = mod*teeth; var circ = PI*pd; var speedK = rpmK/ratioK*circ; var forceK = (tqK*ratioK*effK)/(Math.max(pd/2000,0.0001)); var needK = massK*accK; r = [add('Pinyon bölüm çapı', pd, 'mm', ''), add('Teorik eksen hızı', speedK, 'mm/dk', ''), add('Teorik itme kuvveti', forceK, 'N', ''), add('İvme için gereken kuvvet', needK, 'N', forceK < needK*1.5 ? 'Güvenlik payı düşük olabilir' : '')]; break; } case 'planet-reduktor-secim-araci': { var tq = num(form,'motor_torque_nm'), rpmR = num(form,'motor_rpm'), ratR = num(form,'ratio')||1, effR = num(form,'efficiency')/100, tt = num(form,'target_torque_nm'), tr = num(form,'target_rpm'); var outT = tq*ratR*effR; var outR = rpmR/ratR; r = [add('Redüktör çıkış torku', outT, 'Nm', outT >= tt ? 'Hedef torku karşılıyor' : 'Tork yetersiz'), add('Redüktör çıkış devri', outR, 'rpm', outR >= tr ? 'Hedef hızı karşılıyor' : 'Hız yetersiz'), add('Tork güvenlik oranı', tt>0 ? outT/tt : 0, 'kat', '')]; break; } case 'guc-panosu-toplam-elektrik-hesabi': { var totalKw = num(form,'spindle_kw')+num(form,'drive_kw')+num(form,'vacuum_kw')+num(form,'dust_kw')+num(form,'compressor_kw')+num(form,'aux_kw'); var sim = num(form,'simultaneous_percent')/100, ph = form.elements['phase_type'] ? form.elements['phase_type'].value : 'three', volt = num(form,'voltage'), pf2 = num(form,'power_factor')||1; var runKw = totalKw*sim; var amp = ph === 'three' ? runKw*1000/(SQRT3*volt*pf2) : runKw*1000/(volt*pf2); r = [add('Toplam kurulu güç', totalKw, 'kW', ''), add('Eş zamanlı tahmini güç', runKw, 'kW', ''), add('Tahmini ana akım', amp, 'A', ''), add('Ön sigorta sınıfı', amp*1.25, 'A', 'Bir üst standart değer seçilir')]; break; } case 'servo-fren-direnci-rejeneratif-hesabi': { var massF = num(form,'mass_kg'), speedF = num(form,'speed_mm_min')/60000, dt = num(form,'decel_time_s')||0.001, axis = num(form,'axis_type'), drop = num(form,'vertical_drop_mm')/1000, cyc = num(form,'cycles_per_min'), internal = num(form,'drive_internal_w'); var ke = 0.5*massF*speedF*speedF; var pe = axis === 1 ? massF*KGF*drop : 0; var energy = ke + pe; var peak = energy/dt; var avg = energy*cyc/60; r = [add('Frenleme enerjisi', energy, 'J', ''), add('Anlık frenleme gücü', peak, 'W', ''), add('Ortalama rejeneratif güç', avg, 'W', avg > internal ? 'Dahili kapasite aşılabilir' : 'Dahili kapasite içinde olabilir')]; break; } case 'atc-takim-degistirici-secim-araci': { var ch = num(form,'changes_per_day'), man = num(form,'manual_sec'), atc = num(form,'atc_sec'), tc0 = num(form,'tool_count'), air = num(form,'air_l_per_change'), dh = num(form,'daily_hours'); var saved = Math.max(0,(man-atc)*ch/60); var airTotal = ch*air; r = [add('Günlük zaman kazancı', saved, 'dk', ''), add('Günlük hava tüketimi', airTotal, 'L', ''), add('Çalışma saatine göre kazanç', dh>0 ? saved/dh : 0, 'dk/saat', ''), add('Gerekli takım magazin adedi', tc0, 'takım', '')]; break; } case 'kompresor-ihtiyaci-sihirbazi': { var apc = num(form,'air_per_cycle_l'), cpm = num(form,'cycles_per_min'), atcl = num(form,'atc_air_l_min'), safc = num(form,'safety_percent')/100, pb = num(form,'pressure_bar'); var need = (apc*cpm + atcl)*(1+safc); var tank = Math.max(25, need/10*pb); r = [add('Minimum serbest hava debisi', need, 'L/dk', ''), add('Önerilen pratik tank hacmi', tank, 'L', ''), add('Çalışma basıncı', pb, 'bar', 'Basınç düşümü izlenmeli')]; break; } case 'cnc-bakim-periyodu-hesaplayici': { var h = num(form,'daily_hours'), dust = num(form,'dust_level'), matB = num(form,'material_factor'), lub = num(form,'auto_lubrication'), drive = num(form,'drive_type'); var scoreB = h*dust*matB*lub*drive; var cleanDays = Math.max(1, Math.round(12/Math.max(1,scoreB))); var greaseDays = Math.max(1, Math.round(30/Math.max(1,scoreB/2))); r = [add('Bakım yoğunluk skoru', scoreB, 'puan', scoreB > 25 ? 'Ağır bakım şartı' : 'Normal kontrol aralığı'), add('Temizlik kontrol aralığı', cleanDays, 'gün', ''), add('Yağlama/kızak kontrol aralığı', greaseDays, 'gün', '')]; break; } case 'ariza-teshis-sihirbazi': { var pc = num(form,'problem_code'), rc = num(form,'recent_change'), temp = num(form,'motor_temp_c'), voltA = num(form,'supply_voltage'), msA = num(form,'microstep'); var risk = 30 + rc*15 + (temp>70?20:0) + (voltA<36?15:0) + (msA>16?10:0); var hint = 'İlk kontrol: kablo, ayar, mekanik sıkışma ve besleme değerlerini sırayla kontrol edin.'; if(pc===1){ hint='Step motor için akım ayarı, güç kaynağı voltajı, mikrostep ve yüksek devir tork düşümü kontrol edilmeli.'; } if(pc===2){ hint='Servo alarm kodu, fren, enkoder kablosu, atalet oranı ve sürücü parametreleri kontrol edilmeli.'; } if(pc===3){ hint='Kaplin, kremayer boşluğu, steps/mm, pulse sınırı ve mekanik kayma kontrol edilmeli.'; } if(pc===4 || pc===5){ hint='İnverter parametresi, enable sinyali, frekans komutu, motor etiketi ve hata kodu kontrol edilmeli.'; } if(pc===6 || pc===7){ hint='Yağlama, boşluk, yataklama, hizalama ve diş/vida aşınması kontrol edilmeli.'; } r = [add('Ön teşhis risk puanı', risk, 'puan', hint), add('Sıcaklık kontrol değeri', temp, '°C', temp>70?'Yüksek sıcaklık arıza belirtisi olabilir':''), add('Mikrostep/pulse dikkat seviyesi', msA, 'çarpan', msA>16?'Pulse ihtiyacı artabilir':'')]; break; } case 'urun-uyum-kontrol-sistemi': { var mt0 = num(form,'motor_torque_nm'), dc = num(form,'driver_current_a'), pv = num(form,'psu_voltage'), rg0 = num(form,'ratio')||1, pd0 = num(form,'pinyon_diameter_mm'), ma0 = num(form,'mass_kg'), tv0 = num(form,'target_speed'), ac0 = num(form,'acceleration'); var forceHave = mt0*rg0/(Math.max(pd0/2000,0.0001)); var forceNeed = ma0*ac0; var scoreU = forceNeed>0 ? forceHave/forceNeed : 0; var speedNote = tv0>18000 ? 'Yüksek hızda step tork düşümü kontrol edilmeli' : 'Hız hedefi daha makul aralıkta'; r = [add('Teorik itme kuvveti', forceHave, 'N', ''), add('İvme için gereken kuvvet', forceNeed, 'N', ''), add('Uyum güvenlik oranı', scoreU, 'kat', scoreU<2?'Sınırda; bir üst sınıf düşünülmeli':'Ön seçim olumlu'), add('Besleme voltajı kontrolü', pv, 'V', pv<48?'Yüksek hız için düşük kalabilir':speedNote)]; break; } case 'cnc-elektrik-tuketimi-gelismis': { var kwT = num(form,'spindle_kw')+num(form,'drive_kw')+num(form,'vacuum_kw')+num(form,'dust_kw')+num(form,'compressor_kw'); var dh0 = num(form,'daily_hours'), wd = num(form,'work_days'), ep = num(form,'electric_price'), sm0 = num(form,'simultaneous_percent')/100; var avgKw = kwT*sm0; var daily = avgKw*dh0*ep; r = [add('Ortalama çalışma gücü', avgKw, 'kW', ''), add('Saatlik elektrik maliyeti', avgKw*ep, 'TL/saat', ''), add('Günlük elektrik maliyeti', daily, 'TL/gün', ''), add('Aylık elektrik maliyeti', daily*wd, 'TL/ay', '')]; break; } case 'cnc-yatirim-geri-donus-hesaplayici': { var inv = num(form,'investment'), dp = num(form,'daily_pieces'), pp = num(form,'profit_per_piece'), wdays = num(form,'work_days'), fixed = num(form,'fixed_monthly'), riskp = num(form,'risk_percent')/100; var gross = dp*pp*wdays; var net = gross*(1-riskp)-fixed; var months = net>0 ? inv/net : 0; r = [add('Aylık brüt katkı', gross, 'TL', ''), add('Risk ve gider sonrası net kazanç', net, 'TL/ay', net<=0?'Yatırım geri dönüşü oluşmuyor':''), add('Yaklaşık geri dönüş süresi', months, 'ay', '')]; break; } case 'dxf-kesim-suresi-teklif-hesaplama': { var cl = num(form,'cut_length_mm'), pc0 = num(form,'pierce_count'), ff0 = num(form,'feed_mm_min')||1, spp = num(form,'sec_per_pierce'), setup0 = num(form,'setup_min'), mat0 = num(form,'material_cost'), mhc = num(form,'machine_hour_cost'), profit0 = num(form,'profit_percent')/100; var cutTime = cl/ff0; var totalTime = cutTime + pc0*spp/60 + setup0; var cost0 = mat0 + totalTime/60*mhc; var quote = cost0*(1+profit0); r = [add('Yaklaşık kesim süresi', cutTime, 'dk', ''), add('Toplam iş süresi', totalTime, 'dk', ''), add('Yaklaşık maliyet', cost0, 'TL', ''), add('Önerilen teklif bedeli', quote, 'TL', 'Kâr dahil ön teklif')]; break; } case 'cnc-saha-kesim-parametre-sihirbazi': { var matK = num(form,'material_type') || 1; var dK = num(form,'tool_diameter_mm') || 1; var flK = num(form,'flute_count') || 1; var depK = num(form,'depth_mm'); var widthK = dK * (num(form,'width_percent')/100); var priK = num(form,'priority_factor') || 1; var machK = num(form,'machine_quality') || 1; var spindleK = num(form,'spindle_kw') || 1; var baseVcK = 350 * matK; var rpmK = (baseVcK * 1000) / (PI * dK); rpmK = Math.min(Math.max(rpmK, 6000), 24000); var chipK = Math.max(0.015, Math.min(0.12, dK * 0.008 * matK * priK)); var feedK = rpmK * flK * chipK * machK; var mrrK = depK * widthK * feedK / 1000; var kwNeedK = mrrK * 0.016 / Math.max(0.55, matK) * (1 + Math.max(0, depK/dK-0.8)*0.35); var loadPctK = spindleK > 0 ? kwNeedK/spindleK*100 : 0; r = [add('Önerilen başlangıç devri', rpmK, 'rpm', 'Malzeme ve takım çapına göre'), add('Önerilen başlangıç F', feedK, 'mm/dk', 'Makine kalitesi ve öncelik hesaba katıldı'), add('Tahmini talaş yükü', chipK, 'mm/diş', ''), add('Talaş kaldırma hacmi', mrrK, 'cm³/dk', ''), add('Spindle yük tahmini', loadPctK, '%', loadPctK>85?'Spindle sınırda; paso veya F düşürülmeli':'Ön seçim daha güvenli')]; break; } case 'cnc-makine-kalitesine-gore-kesim-suresi': { var pathQ = num(form,'cut_length_mm'); var baseFeedQ = num(form,'machine_feed_base') || 1; var matQ = num(form,'material_factor') || 1; var pierQ = num(form,'pierce_count'); var secPierQ = num(form,'sec_per_pierce'); var tcQ = num(form,'tool_change_count'); var tcMinQ = num(form,'min_per_tool_change'); var setupQ = num(form,'setup_min'); var effQ = Math.max(10, num(form,'efficiency_percent'))/100; var practicalFeedQ = baseFeedQ * matQ * effQ; var cutMinQ = practicalFeedQ>0 ? pathQ/practicalFeedQ : 0; var totalQ = cutMinQ + pierQ*secPierQ/60 + tcQ*tcMinQ + setupQ; var pcs8h = totalQ>0 ? (8*60)/totalQ : 0; r = [add('Makineye göre pratik F', practicalFeedQ, 'mm/dk', ''), add('Net kesim süresi', cutMinQ, 'dk', ''), add('Toplam gerçekçi iş süresi', totalQ, 'dk', 'Hazırlık, dalma ve takım değişimi dahil'), add('8 saatte yaklaşık kapasite', pcs8h, 'adet', '')]; break; } case 'spindle-secimi-saha-hesaplama': { var mp = num(form,'material_power') || 0.016; var toolSp = Math.max(1, num(form,'max_tool_diameter_mm')); var depSp = Math.max(.1, num(form,'single_pass_depth_mm')); var presetSp = { '0.005': {feed:7000,rpm:18000}, '0.014': {feed:3000,rpm:18000}, '0.016': {feed:4500,rpm:18000}, '0.018': {feed:3500,rpm:18000}, '0.020': {feed:2500,rpm:16000}, '0.024': {feed:3500,rpm:18000}, '0.038': {feed:1200,rpm:18000} }; var mpKey = mp.toFixed(3); var preset = presetSp[mpKey] || {feed:3000,rpm:18000}; var diameterFactor = Math.max(.55, Math.min(1.15, 8/toolSp)); var depthFactor = Math.max(.45, Math.min(1.15, toolSp/Math.max(toolSp, depSp))); var feedSp = Math.round((preset.feed * diameterFactor * depthFactor)/100)*100; var rpmSp = Math.round((preset.rpm * Math.max(.72, Math.min(1.1, 8/toolSp)))/500)*500; var widthSp = toolSp; var mrrSp = depSp * widthSp * feedSp / 1000; var kwRawSp = Math.max(.35, mrrSp * mp * 1.15); var classes = [2.2,3.5,4.5,6,7.5,9,12]; var rec = classes[classes.length-1]; for(var ci=0; ci= kwRawSp*1.12){ rec = classes[ci]; break; } } var passStart = Math.min(depSp, Math.max(.5, toolSp * (mp >= .038 ? .25 : (mp >= .02 ? .5 : .75)))); r = [ add('Gerekli minimum spindle sınıfı', rec, 'kW', rec>=7.5?'Büyük takım veya ağır talaş kaldırma':'Saha ön seçimi'), add('Güvenli başlangıç ilerlemesi', feedSp, 'mm/dk', 'Makine rijitliği bilinmediği için temkinli başlangıç'), add('Güvenli başlangıç devri', rpmSp, 'rpm', 'Takım üreticisi verisi varsa o değer önceliklidir'), add('İlk deneme paso', passStart, 'mm', 'Ses, yüzey ve spindle yüküne göre kademeli artırın') ]; break; } case 'pano-fani-sogutma-hesaplama': { var loss = num(form,'loss_w'), dtp = num(form,'temp_rise_c')||1, safp = num(form,'safety_percent')/100; var m3h = (3.1 * loss / dtp) * (1+safp); r = [add('Gerekli yaklaşık hava debisi', m3h, 'm³/saat', 'Filtre ve yaz sıcaklığı için pay eklenmiştir'), add('Dakikadaki hava debisi', m3h/60, 'm³/dk', ''), add('Isı yükü', loss, 'W', '')]; break; } case 'gcode-feedrate-cevirici': { var f = num(form,'feed_mm_min'); r = [add('G-code F değeri', f, 'mm/dk', ''), add('İlerleme', f/60, 'mm/sn', ''), add('İlerleme', f/1000, 'm/dk', ''), add('1 metrelik yolu alma süresi', f>0 ? 1000/f : 0, 'dk', '')]; break; } case 'gcode-kod-rehberi': { var cid = num(form,'code_id'); var risk = cid===2 ? 80 : (cid===6 ? 70 : (cid===4 || cid===7 ? 45 : 25)); var hint = 'Seçilen kod temel kontrol kodudur; çalıştırmadan önce sıfır noktası ve güvenli Z kontrol edilir.'; if(cid===1){ hint='G90 mutlak koordinattır; hareketler iş sıfırına göre yorumlanır.'; } if(cid===2){ hint='G91 artımsal koordinattır; açık kalırsa beklenmeyen hareket oluşturabilir.'; } if(cid===3){ hint='G21 milimetre birimidir; G20 inç moduna karşı kontrol edilmelidir.'; } if(cid===4){ hint='M3 spindle çalıştırır; devir komutu ve inverter enable kontrol edilmelidir.'; } if(cid===5){ hint='M5 spindle durdurur; duruş süresi ve frenleme davranışı kontrol edilmelidir.'; } if(cid===6){ hint='M6 takım değiştirir; makro, güvenli Z, hava ve takım boyu kontrolü gerekir.'; } if(cid===7){ hint='M8 soğutma açar; çıkış rölesi ve pompa yönü kontrol edilmelidir.'; } if(cid===8){ hint='M9 soğutma kapatır; iş sonunda açık kalmaması gerekir.'; } r = [add('Kod risk dikkat puanı', risk, 'puan', hint), add('Kontrol seviyesi', cid, 'kod', '')]; break; } case 'takim-boyu-sifirlama-yardimcisi': { var th = num(form,'probe_thickness_mm'), tz = num(form,'touch_z_mm'), sz = num(form,'safe_z_mm'); var offset = tz - th; r = [add('Hesaplanan Z ofset yorumu', offset, 'mm', 'Kontrol sistemindeki makro mantığına göre doğrulanmalıdır'), add('Güvenli kalkış yüksekliği', sz, 'mm', sz < 10 ? 'Düşük olabilir' : 'Genel başlangıç için uygun'), add('Prob kalınlığı', th, 'mm', '')]; break; } case 'probe-makro-on-kontrol': { var pf = num(form,'probe_feed')||1, sd = num(form,'search_distance'), pt = num(form,'plate_thickness'), szp = num(form,'safe_z'); var sec = sd / pf * 60; r = [add('Maksimum probe arama süresi', sec, 'sn', ''), add('Prob plaka kalınlığı', pt, 'mm', ''), add('Güvenli Z', szp, 'mm', szp < pt ? 'Prob plakasından düşük olabilir; kontrol edin' : '')]; break; } case 'delik-cevrimi-gcode-yardimcisi': { var hc = num(form,'hole_count'), dep0 = num(form,'depth_mm'), safe0 = num(form,'safe_z_mm'), feed0 = num(form,'feed_mm_min')||1, rap0 = num(form,'rapid_mm_min')||1; var per = dep0/feed0 + (dep0+safe0)/rap0; var total = per*hc; r = [add('Delik başı yaklaşık süre', per*60, 'sn', ''), add('Toplam delik süresi', total, 'dk', ''), add('Delik adedi', hc, 'adet', '')]; break; } case 'dikdortgen-kesim-yolu-hesaplama': { var w = num(form,'width_mm'), h0 = num(form,'height_mm'), pc = num(form,'piece_count'), pass = num(form,'pass_count')||1, feed = num(form,'feed_mm_min')||1; var path = 2*(w+h0)*pc*pass; r = [add('Toplam kesim yolu', path, 'mm', ''), add('Toplam kesim yolu', path/1000, 'm', ''), add('Yaklaşık kesim süresi', path/feed, 'dk', '')]; break; } case 'dairesel-cep-kesim-yolu-hesaplama': { var dia = num(form,'pocket_diameter_mm'), tool = num(form,'tool_diameter_mm')||1, stepPct = num(form,'stepover_percent')/100, passc = num(form,'pass_count')||1, feedp = num(form,'feed_mm_min')||1; var stepover = Math.max(tool*stepPct,0.001); var loops = Math.ceil((dia/2)/stepover); var avgDia = dia/2; var path = loops * PI * avgDia * passc; r = [add('Yaklaşık halka sayısı', loops, 'tur', ''), add('Yaklaşık takım yolu', path, 'mm', ''), add('Yaklaşık süre', path/feedp, 'dk', '')]; break; } case 'dxf-kapali-kontur-kontrol-listesi': { var open = num(form,'open_contours'), dup = num(form,'duplicate_lines'), tiny = num(form,'tiny_segments'), lay = num(form,'layer_count'); var riskD = open*30 + dup*20 + tiny*2 + Math.max(0,lay-3)*5; r = [add('CAM hazırlık risk puanı', riskD, 'puan', riskD>50?'DXF temizlenmeden kesime girilmemeli':'Ön kontrol daha olumlu'), add('Açık kontur', open, 'adet', ''), add('Üst üste çizgi', dup, 'adet', '')]; break; } case 'dxf-fire-malzeme-hesaplama': { var sw = num(form,'sheet_w'), sh = num(form,'sheet_h'), pa = num(form,'part_area_cm2'), pcs = num(form,'piece_count'), waste = num(form,'waste_percent')/100, scost = num(form,'sheet_cost'); var sheetArea = sw*sh/100; var needArea = pa*pcs*(1+waste); var use = sheetArea>0 ? needArea/sheetArea : 0; r = [add('Plaka kullanım oranı', use*100, '%', use>1?'Bir plakadan fazla gerekebilir':''), add('Fire paylı gerekli alan', needArea, 'cm²', ''), add('Yaklaşık malzeme maliyeti', scost*use, 'TL', '')]; break; } case 'cnc-teklif-hazirlama-sihirbazi': { var mat = num(form,'material_cost'), pm = num(form,'process_min'), mh = num(form,'machine_hour'), lab = num(form,'labor_cost'), tc = num(form,'tool_cost'), wp = num(form,'waste_percent')/100, prof = num(form,'profit_percent')/100; var base = mat + pm/60*mh + lab + tc; var risked = base*(1+wp); var quote = risked*(1+prof); r = [add('Net maliyet', base, 'TL', ''), add('Risk/fire dahil maliyet', risked, 'TL', ''), add('Önerilen teklif bedeli', quote, 'TL', 'Kâr dahil'), add('Minimum zarar etmeme fiyatı', risked, 'TL', '')]; break; } case 'operator-verimlilik-hesaplama': { var shift = num(form,'shift_hours')*60, setup = num(form,'setup_min'), cut = num(form,'cut_min'), hand = num(form,'handling_min'), down = num(form,'downtime_percent')/100; var usable = Math.max(0,(shift-setup)*(1-down)); var cycle = cut+hand; var pieces = cycle>0 ? usable/cycle : 0; r = [add('Kullanılabilir üretim süresi', usable, 'dk', ''), add('Parça çevrim süresi', cycle, 'dk/parça', ''), add('Günlük üretim kapasitesi', pieces, 'adet', '')]; break; } case 'bakim-sarf-malzeme-maliyet-hesaplama': { var oil = num(form,'oil_cost'), filt = num(form,'filter_cost'), toolc = num(form,'tool_cost'), serv = num(form,'service_cost'), dh = num(form,'downtime_hours'), mhv = num(form,'machine_hour_value'); var total = oil+filt+toolc+serv+dh*mhv; r = [add('Aylık bakım ve sarf yükü', total, 'TL/ay', ''), add('Duruş fırsat maliyeti', dh*mhv, 'TL', ''), add('Günlük ortalama bakım payı', total/26, 'TL/gün', '')]; break; } case 'cnc-yuzey-puruzlulugu-tahmini': { var td0 = num(form,'tool_diameter_mm')||1, so = num(form,'stepover_mm'), tt0 = num(form,'tool_type')||1; var R = td0/2; var scallop = (so*so)/(8*R)*tt0; r = [add('Teorik iz yüksekliği', scallop, 'mm', scallop>0.03?'Yüzey izi belirgin olabilir':'Daha ince yüzey beklenir'), add('Teorik iz yüksekliği', scallop*1000, 'mikron', ''), add('Step-over / çap oranı', so/td0*100, '%', '')]; break; } case 'lineer-ray-yaglama-miktari-hesaplama': { var cc = num(form,'carriage_count'), dhy = num(form,'daily_hours'), df = num(form,'dust_factor'), al = num(form,'auto_lube'); var score = cc*dhy*df*al/8; var days = Math.max(1, Math.round(14/Math.max(1,score/4))); r = [add('Yağlama yoğunluk skoru', score, 'puan', score>20?'Ağır/tozlu kullanım':'Normal kullanım'), add('Önerilen kontrol aralığı', days, 'gün', ''), add('Toplam araba sayısı', cc, 'adet', '')]; break; } case 'cnc-yerlesim-alan-hesaplama': { var mw = num(form,'machine_w'), ml = num(form,'machine_l'), ss = num(form,'service_space'), ls = num(form,'loading_space'); var totalW = mw + 2*ss; var totalL = ml + 2*ss + ls; r = [add('Gerekli minimum genişlik', totalW, 'mm', ''), add('Gerekli minimum uzunluk', totalL, 'mm', ''), add('Yaklaşık yerleşim alanı', totalW*totalL/1000000, 'm²', '')]; break; } case 'makine-nakliye-kapi-gecis-kontrolu': { var mw0 = num(form,'machine_w'), mh0 = num(form,'machine_h'), dw = num(form,'door_w'), dh0 = num(form,'door_h'), mar = num(form,'margin_mm'); var wclear = dw - mar - mw0; var hclear = dh0 - mar - mh0; r = [add('Genişlik boşluğu', wclear, 'mm', wclear<0?'Geçiş riski yüksek':''), add('Yükseklik boşluğu', hclear, 'mm', hclear<0?'Geçiş riski yüksek':''), add('Geçiş uygunluk puanı', Math.min(wclear,hclear), 'mm', Math.min(wclear,hclear)<0?'Yer keşfi şart':'Ön kontrol olumlu')]; break; } case 'kompresor-tank-dolum-suresi-hesaplama': { var tank = num(form,'tank_l'), ps = num(form,'p_start'), pe = num(form,'p_end'), fad = num(form,'fadm')||1; var air = tank*Math.max(0,pe-ps); r = [add('Gerekli serbest hava', air, 'L', ''), add('Yaklaşık dolum süresi', air/fad, 'dk', ''), add('Yaklaşık dolum süresi', air/fad*60, 'sn', '')]; break; } case 'inverter-fren-direnci-on-secim': { var mk = num(form,'motor_kw'), bp = num(form,'brake_percent')/100, stime = num(form,'stop_time_s')||1, cyc = num(form,'cycle_per_hour'); var peak = mk*1000*bp; var avg = peak*stime*cyc/3600; r = [add('Yaklaşık anlık fren gücü', peak, 'W', ''), add('Saatlik ortalama fren gücü', avg, 'W', avg>200?'Direnç watt değeri dikkatli seçilmeli':''), add('Duruş süresi', stime, 'sn', '')]; break; } case 'cnc-kesici-takim-maliyet-hesaplama': { var tp = num(form,'tool_price'), life = num(form,'tool_life_min')||1, part = num(form,'part_cut_min'), br = num(form,'breakage_percent')/100; var cpm = tp/life; var ppc = cpm*part*(1+br); r = [add('Takım dakika maliyeti', cpm, 'TL/dk', ''), add('Parça başı takım maliyeti', ppc, 'TL/parça', ''), add('Bir takımla tahmini parça', life/Math.max(part,0.001), 'adet', '')]; break; } case 'genel-dc-guc-kaynagi-kapasite-hesaplama': { var vdc = num(form,'voltage'), lc = num(form,'load_current'), sim = num(form,'simultaneous_percent')/100, st = num(form,'start_margin_percent')/100, sf = num(form,'safety_percent')/100; var runA = lc * sim; var reqA = runA * (1 + st) * (1 + sf); r = [add('Eş zamanlı çalışma akımı', runA, 'A', ''), add('Önerilen güç kaynağı akımı', reqA, 'A', 'Bir üst standart amper değeri seçilir'), add('Önerilen güç kaynağı gücü', reqA*vdc, 'W', ''), add('Önerilen güç kaynağı gücü', reqA*vdc/1000, 'kW', '')]; break; } case 'pano-24v-yardimci-guc-hesaplama': { var plc = num(form,'plc_current'), sc = num(form,'sensor_count'), sma = num(form,'sensor_current_ma'), vc = num(form,'valve_count'), vma = num(form,'valve_current_ma'), aux = num(form,'aux_current'), mar = num(form,'margin_percent')/100; var amps = plc + sc*sma/1000 + vc*vma/1000 + aux; var rec = amps*(1+mar); r = [add('Toplam 24V nominal akım', amps, 'A', ''), add('Önerilen 24V güç kaynağı akımı', rec, 'A', ''), add('Önerilen 24V güç kaynağı gücü', rec*24, 'W', ''), add('Valf ve sensörlerin toplam payı', sc*sma/1000 + vc*vma/1000, 'A', '')]; break; } case 'aku-ups-yedekleme-suresi-hesaplama': { var ah = num(form,'battery_ah'), bv = num(form,'battery_voltage'), lw = num(form,'load_watt')||1, effu = num(form,'efficiency')/100, usable = num(form,'usable_percent')/100; var wh = ah*bv; var useWh = wh*effu*usable; r = [add('Teorik akü enerjisi', wh, 'Wh', ''), add('Kullanılabilir enerji', useWh, 'Wh', 'Verim ve güvenli deşarj sonrası'), add('Yaklaşık yedekleme süresi', useWh/lw, 'saat', ''), add('Yaklaşık yedekleme süresi', useWh/lw*60, 'dk', '')]; break; } case 'blower-fan-motor-guc-akim-hesaplama': { var ph = text(form,'phase_type'), mk = num(form,'motor_kw'), volt0 = num(form,'voltage')||1, pf0 = num(form,'power_factor')||1, ef0 = num(form,'efficiency')/100, srv = num(form,'service_factor')||1; var denom = (String(ph).indexOf('Üç') !== -1 || form.elements['phase_type'].value === 'three') ? SQRT3*volt0*pf0*ef0 : volt0*pf0*ef0; var amp = denom>0 ? mk*1000/denom : 0; r = [add('Tahmini çalışma akımı', amp, 'A', ''), add('Servis paylı akım', amp*srv, 'A', 'Kablo/sigorta ön kontrolü'), add('Yaklaşık giriş gücü', mk/Math.max(ef0,0.001), 'kW', ''), add('Motor gücü', mk, 'kW', '')]; break; } case 'blower-fan-debi-basinc-guc-hesaplama': { var q = num(form,'airflow_m3h')/3600, dp = num(form,'pressure_pa'), effb = num(form,'efficiency')/100, mb = num(form,'margin_percent')/100; var airW = q*dp; var motorW = effb>0 ? airW/effb*(1+mb) : 0; r = [add('Hava gücü', airW, 'W', 'Debi x basınç'), add('Önerilen motor gücü', motorW, 'W', 'Verim ve emniyet paylı'), add('Önerilen motor gücü', motorW/1000, 'kW', ''), add('Debi', q*3600, 'm³/h', '')]; break; } case 'pompa-motor-guc-hesaplama': { var flow = num(form,'flow_m3h')/3600, head = num(form,'head_m'), den = num(form,'density'), effp = num(form,'efficiency')/100, mp = num(form,'margin_percent')/100; var hydW = den*9.80665*flow*head; var motW = effp>0 ? hydW/effp*(1+mp) : 0; r = [add('Hidrolik güç', hydW, 'W', ''), add('Önerilen motor gücü', motW, 'W', ''), add('Önerilen motor gücü', motW/1000, 'kW', ''), add('Debi', flow*3600, 'm³/h', '')]; break; } case 'konveyor-motor-guc-hiz-hesaplama': { var load = num(form,'load_kg'), bs = num(form,'belt_speed_m_min'), drum = num(form,'drum_diameter_mm')/1000, mu = num(form,'friction_coeff'), deg = num(form,'incline_deg')*PI/180, effc = num(form,'efficiency')/100, mc = num(form,'margin_percent')/100; var force = load*9.80665*(mu*Math.cos(deg)+Math.sin(deg)); var speedMs = bs/60; var torque = force*(drum/2)/Math.max(effc,0.001)*(1+mc); var kwc = force*speedMs/Math.max(effc,0.001)*(1+mc)/1000; var rpmc = drum>0 ? bs/(PI*drum) : 0; r = [add('Gerekli tambur devri', rpmc, 'rpm', ''), add('Bant çekiş kuvveti', force, 'N', ''), add('Tambur çıkış torku', torque, 'Nm', ''), add('Yaklaşık motor gücü', kwc, 'kW', '')]; break; } case 'rezistans-isitici-guc-hesaplama': { var m = num(form,'mass_kg'), cp = num(form,'specific_heat'), dt = num(form,'temp_delta'), tm = num(form,'time_min')||1, loss = num(form,'loss_percent')/100; var kj = m*cp*dt; var kwr = (kj/(tm*60))*(1+loss); r = [add('Gerekli ısı enerjisi', kj, 'kJ', ''), add('Önerilen ısıtıcı gücü', kwr, 'kW', ''), add('Önerilen ısıtıcı gücü', kwr*1000, 'W', ''), add('Saatlik enerji tüketimi', kwr, 'kWh/saat', '')]; break; } case 'solenoid-valf-guc-kaynagi-hesaplama': { var vc0 = num(form,'valve_count'), cw = num(form,'coil_watt'), vv = num(form,'voltage')||24, sm = num(form,'simultaneous_percent')/100, mm = num(form,'margin_percent')/100; var watts = vc0*cw*sm*(1+mm); r = [add('Eş zamanlı bobin gücü', vc0*cw*sm, 'W', ''), add('Önerilen güç kaynağı gücü', watts, 'W', ''), add('Önerilen güç kaynağı akımı', watts/vv, 'A', ''), add('Toplam bobin sayısı', vc0, 'adet', '')]; break; } case 'sensor-plc-io-guc-butcesi': { var ccu = num(form,'controller_current'), ic = num(form,'input_count'), ima = num(form,'input_ma'), oc = num(form,'output_count'), oma = num(form,'output_ma'), hmi = num(form,'hmi_current'), marg = num(form,'margin_percent')/100; var totalA = ccu + ic*ima/1000 + oc*oma/1000 + hmi; r = [add('Toplam 24V I/O akımı', totalA, 'A', ''), add('Emniyet paylı akım', totalA*(1+marg), 'A', ''), add('Emniyet paylı güç', totalA*(1+marg)*24, 'W', ''), add('Çıkış yükleri payı', oc*oma/1000, 'A', '')]; break; } case 'trifaze-motor-akim-kablo-sigorta-hesaplama': { var kwm = num(form,'motor_kw'), vl = num(form,'voltage')||380, pfm = num(form,'power_factor')||1, efm = num(form,'efficiency')/100, len = num(form,'cable_length_m'), sfac = num(form,'start_factor')||1; var amp3 = kwm*1000/(SQRT3*vl*pfm*Math.max(efm,0.001)); var starter = amp3*sfac; var approxCable = amp3 <= 10 ? 1.5 : amp3 <= 16 ? 2.5 : amp3 <= 25 ? 4 : amp3 <= 32 ? 6 : amp3 <= 50 ? 10 : amp3 <= 63 ? 16 : 25; r = [add('Tahmini çalışma akımı', amp3, 'A', ''), add('Yaklaşık kalkış akımı', starter, 'A', ''), add('Ön kablo kesiti sınıfı', approxCable, 'mm²', len>30?'Uzun kabloda gerilim düşümü ayrıca kontrol edilmeli':''), add('Yaklaşık sigorta alt sınırı', amp3*1.25, 'A', '')]; break; } case 'jenerator-kva-hesaplama': { var tk = num(form,'total_kw'), pfj = num(form,'power_factor')||0.8, sj = num(form,'simultaneous_percent')/100, skw = num(form,'start_extra_kw'), mj = num(form,'margin_percent')/100; var workKw = tk*sj + skw; var kva = workKw/pfj*(1+mj); r = [add('Eş zamanlı + kalkış yükü', workKw, 'kW', ''), add('Önerilen jeneratör kapasitesi', kva, 'kVA', ''), add('Yaklaşık aktif güç karşılığı', kva*pfj, 'kW', ''), add('Emniyet payı', mj*100, '%', '')]; break; } case 'motor-kalkis-akimi-hesaplama': { var run = num(form,'running_current'), stype = num(form,'start_type')||1, ss = num(form,'start_seconds'), sph = num(form,'starts_per_hour'); var ia = run*stype; r = [add('Yaklaşık kalkış akımı', ia, 'A', ''), add('Çalışma akımına göre katsayı', stype, 'x', ''), add('Saatlik yüksek akım süresi', ss*sph, 'sn/saat', ''), add('Termik yük göstergesi', ia*ss*sph/3600, 'A·s/saat', '')]; break; } case 'endustriyel-guc-dagitim-senaryo-hesabi': { var ac = num(form,'motor_kw'), dc = num(form,'dc_watt')/1000, heat = num(form,'heater_kw'), auxw = num(form,'aux_watt')/1000, simg = num(form,'simultaneous_percent')/100, pfg = num(form,'power_factor')||0.85, mg = num(form,'margin_percent')/100; var total = ac + dc + heat + auxw; var active = total*simg*(1+mg); r = [add('Kurulu güç toplamı', total, 'kW', ''), add('Eş zamanlı emniyetli aktif güç', active, 'kW', ''), add('Yaklaşık kVA ihtiyacı', active/pfg, 'kVA', ''), add('Yardımcı yüklerin toplam payı', dc+auxw, 'kW', '')]; break; } case 'basincli-hava-kacak-maliyeti-hesaplama': { var leak = num(form,'leak_l_min')/1000, spec = num(form,'specific_kw_m3_min'), hd = num(form,'hours_day'), dy = num(form,'days_year'), ep = num(form,'electric_price'); var kwLoss = leak*spec; var kwhYear = kwLoss*hd*dy; r = [add('Kaçak kaynaklı güç kaybı', kwLoss, 'kW', ''), add('Yıllık enerji kaybı', kwhYear, 'kWh/yıl', ''), add('Yıllık yaklaşık maliyet', kwhYear*ep, 'TL/yıl', ''), add('Aylık yaklaşık maliyet', kwhYear*ep/12, 'TL/ay', '')]; break; } case 'hidrolik-silindir-kuvvet-hesaplama': { var pd = num(form,'piston_diameter_mm')/1000, rd = num(form,'rod_diameter_mm')/1000, bar = num(form,'pressure_bar'), eh = num(form,'efficiency')/100; var pa = bar*100000; var areaPush = PI*pd*pd/4; var areaPull = Math.max(areaPush - PI*rd*rd/4, 0); var pushN = pa*areaPush*eh; var pullN = pa*areaPull*eh; r = [add('İtme kuvveti', pushN, 'N', ''), add('İtme kuvveti', pushN/1000/9.80665, 'ton', ''), add('Çekme kuvveti', pullN, 'N', 'Mil alanı düşülmüş'), add('Çekme kuvveti', pullN/1000/9.80665, 'ton', '')]; break; } case 'pano-isi-yuku-sogutma-hesaplama': { var dkw = num(form,'drive_kw'), lp = num(form,'loss_percent')/100, auxh = num(form,'aux_watt'), dtc = num(form,'allowed_delta')||10, mh = num(form,'margin_percent')/100; var heatW = (dkw*1000*lp + auxh)*(1+mh); var airflow = heatW/(1.2*Math.max(dtc,1))*3.6; r = [add('Pano içi yaklaşık ısı yükü', heatW, 'W', ''), add('Yaklaşık minimum hava debisi', airflow, 'm³/h', 'Filtre ve kayıplar hariç'), add('Isı yükü', heatW/1000, 'kW', ''), add('İzin verilen sıcaklık artışı', dtc, '°C', '')]; break; } case 'dc-gerilim-dusumu-hesaplama': { var vd = num(form,'voltage')||24, curd = num(form,'current'), lenm = num(form,'length_m'), sec = num(form,'section_mm2')||1; var rho = 0.0175; var drop = 2*lenm*rho*curd/sec; r = [add('Gerilim düşümü', drop, 'V', 'Gidiş-dönüş hat'), add('Gerilim düşümü oranı', drop/vd*100, '%', ''), add('Yük ucundaki yaklaşık voltaj', vd-drop, 'V', ''), add('Kablo direnci', 2*lenm*rho/sec, 'Ω', '')]; break; } case 'motor-koruma-salteri-secim-hesabi': { var ph = form.elements['phase_type'] ? form.elements['phase_type'].value : 'three', kw = num(form,'motor_kw'), v = num(form,'voltage')||1, pf = num(form,'power_factor')||1, eff = num(form,'efficiency')/100, sf = num(form,'start_factor')||1, mar = num(form,'service_margin')/100; var a = ph === 'three' ? kw*1000/(SQRT3*v*pf*Math.max(eff,0.001)) : kw*1000/(v*pf*Math.max(eff,0.001)); r = [add('Tahmini motor çalışma akımı', a, 'A', 'Etiket akımı varsa onu esas alın'), add('Şalter ayar hedefi', a*(1+mar), 'A', 'Motor koruma ayarı bu değere yakın sınıftan seçilir'), add('Yaklaşık kalkış akımı', a*sf, 'A', 'Yanlış atma riskini yorumlamak için'), add('Bir üst kontrol akımı', a*1.25, 'A', 'Kablo/sigorta ayrıca kontrol edilir')]; break; } case 'kontaktor-secim-hesabi': { var a = num(form,'load_current'), cls = num(form,'load_class')||1, sp = num(form,'safety_percent')/100, st = num(form,'starts_per_hour'), cv = form.elements['coil_voltage'] ? form.elements['coil_voltage'].value : '220'; var ie = a*cls*(1+sp); r = [add('Önerilen minimum kontaktör Ie', ie, 'A', 'Bir üst standart kontaktör seçilir'), add('Kullanım sınıfı katsayısı', cls, 'x', cls>1.3?'Ağır veya sık kalkışlı yük':'Normal ön kontrol'), add('Bobin voltajı', parseFloat(cv)||0, 'V', 'Pano kontrol voltajıyla aynı olmalı'), add('Saatlik anahtarlama', st, 'adet/saat', st>60?'Elektriksel ömür kontrol edilmeli':'')]; break; } case 'termik-role-ayari-hesabi': { var mc = num(form,'motor_current'), sfac = num(form,'service_factor')||1, amb = num(form,'ambient_c'), ss = num(form,'start_seconds'), adj = num(form,'safety_percent')/100; var set = mc*sfac*(1+adj); r = [add('Termik röle ayar hedefi', set, 'A', 'Genelde motor etiket akımına ayarlanır'), add('Alt kontrol sınırı', mc*0.95, 'A', ''), add('Üst kontrol sınırı', mc*1.05, 'A', ''), add('Saha risk notu', (amb>45?20:0)+(ss>8?20:0), 'puan', amb>45||ss>8?'Sıcaklık veya uzun kalkış nedeniyle atma davranışı kontrol edilmeli':'')]; break; } case 'pano-trafo-va-hesabi': { var steady = num(form,'steady_va'), cc = num(form,'contactor_count'), inrush = num(form,'coil_inrush_va'), hold = num(form,'coil_hold_va'), mar = num(form,'margin_percent')/100; var holdTotal = steady + cc*hold; var peak = steady + cc*inrush; r = [add('Sürekli VA ihtiyacı', holdTotal*(1+mar), 'VA', 'Tutma yükü ve yardımcı yükler'), add('Çekme anı tepe VA', peak*(1+mar), 'VA', 'Kontaktör ilk çekme anı'), add('Önerilen trafo sınıfı', Math.max(holdTotal, peak)*(1+mar), 'VA', 'Bir üst standart değer'), add('Bobin tutma toplamı', cc*hold, 'VA', '')]; break; } case 'reduktor-servis-faktoru-hesabi': { var h = num(form,'hours_day'), st = num(form,'starts_hour'), shock = num(form,'shock_class')||1, tq = num(form,'required_torque_nm'), mar = num(form,'margin_percent')/100; var hf = h>16?1.25:(h>8?1.12:1), sf = shock*(1+Math.min(st,120)/600)*hf*(1+mar); r = [add('Yaklaşık servis faktörü', sf, 'x', sf>1.5?'Ağır hizmet sınıfı':'Ön kontrol'), add('Gerekli katalog torku', tq*sf, 'Nm', 'Redüktör nominal torku bu değeri karşılamalı'), add('Çalışma süresi faktörü', hf, 'x', ''), add('Dur-kalk etkisi', 1+Math.min(st,120)/600, 'x', '')]; break; } case 'zincir-disli-oran-hesabi': { var d1 = num(form,'driver_teeth')||1, d2 = num(form,'driven_teeth')||1, rpm = num(form,'input_rpm'), tq = num(form,'input_torque_nm'), eff = num(form,'efficiency')/100; var ratio = d2/d1; r = [add('Aktarım oranı', ratio, 'x', ratio>1?'Hız düşer, tork artar':'Hız artar, tork düşer'), add('Çıkış devri', rpm/ratio, 'rpm', ''), add('Çıkış torku', tq*ratio*eff, 'Nm', ''), add('Verim kaybı', tq*ratio*(1-eff), 'Nm eşdeğer', '')]; break; } case 'toz-emis-hortum-capi-hava-hizi-hesabi': { var q = num(form,'airflow_m3h')/3600, d = num(form,'hose_diameter_mm')/1000, target = num(form,'target_speed_ms')||1, l = num(form,'hose_length_m'), eb = num(form,'elbow_count'); var area = PI*d*d/4, speed = area>0 ? q/area : 0, reqD = Math.sqrt(4*q/(PI*target))*1000; r = [add('Mevcut hortumda hava hızı', speed, 'm/sn', speed4||l>8?'Dirsek/uzunluk debiyi düşürebilir':''), add('Debi', q*3600, 'm³/h', '')]; break; } case 'fan-statik-basinc-debi-on-kontrol': { var q = num(form,'airflow_m3h')/3600, dl = num(form,'duct_loss_pa'), fl = num(form,'filter_loss_pa'), hl = num(form,'hood_loss_pa'), eff = num(form,'efficiency')/100, mar = num(form,'margin_percent')/100; var p = (dl+fl+hl)*(1+mar), w = q*p/Math.max(eff,0.001); r = [add('Toplam statik basınç hedefi', p, 'Pa', ''), add('Fan hava gücü', q*p, 'W', ''), add('Önerilen motor gücü', w, 'W', 'Verim ve pay dahil'), add('Önerilen motor gücü', w/1000, 'kW', '')]; break; } case 'pnomatik-silindir-hava-tuketimi-hesabi': { var bore = num(form,'bore_mm')/1000, stroke = num(form,'stroke_mm')/1000, bar = num(form,'pressure_bar'), cpm = num(form,'cycles_min'), factor = num(form,'action_factor')||2, mar = num(form,'margin_percent')/100; var volL = PI*bore*bore/4*stroke*1000; var freeLMin = volL*(bar+1)*factor*cpm*(1+mar); r = [add('Bir strok hacmi', volL, 'L', ''), add('Serbest hava tüketimi', freeLMin, 'L/dk', ''), add('Saatlik hava tüketimi', freeLMin*60, 'L/saat', ''), add('Kompresör paylı öneri', freeLMin*1.2, 'L/dk', 'Kompresör FAD değeriyle karşılaştırın')]; break; } case 'pompa-basma-yuksekligi-kayip-hesabi': { var stat = num(form,'static_head_m'), len = num(form,'pipe_length_m'), loss = num(form,'loss_per_m'), fit = num(form,'fitting_loss_m'), pbar = num(form,'required_pressure_bar'), mar = num(form,'margin_percent')/100; var total = (stat + len*loss + fit + pbar*10.197)*(1+mar); r = [add('Toplam basma yüksekliği', total, 'mSS', ''), add('Basınç karşılığı', total/10.197, 'bar', ''), add('Boru kaybı payı', len*loss+fit, 'mSS', ''), add('Statik yükseklik', stat, 'm', '')]; break; } case 'yuk-kaldirma-motor-gucu-hesabi': { var load = num(form,'load_kg'), speed = num(form,'speed_m_min')/60, dia = num(form,'drum_diameter_mm')/1000, eff = num(form,'efficiency')/100, mar = num(form,'margin_percent')/100; var force = load*9.80665, kw = force*speed/Math.max(eff,0.001)*(1+mar)/1000, tq = force*(dia/2)*(1+mar), rpm = dia>0 ? (speed*60)/(PI*dia) : 0; r = [add('Kaldırma kuvveti', force, 'N', ''), add('Tambur torku', tq, 'Nm', 'Fren torku ayrıca kontrol edilmeli'), add('Tambur devri', rpm, 'rpm', ''), add('Önerilen motor gücü', kw, 'kW', '')]; break; } case 'doner-tabla-tork-hesabi': { var m = num(form,'load_kg'), r0 = num(form,'radius_m'), rpm = num(form,'target_rpm'), t = num(form,'accel_time_s')||1, fr = num(form,'friction_torque_nm'), mar = num(form,'safety_percent')/100; var inertia = 0.5*m*r0*r0, alpha = (rpm*2*PI/60)/t, tq = (inertia*alpha+fr)*(1+mar); r = [add('Yaklaşık yük ataleti', inertia, 'kg·m²', ''), add('Açısal ivme', alpha, 'rad/sn²', ''), add('Gerekli tabla torku', tq, 'Nm', ''), add('Hedef açısal hız', rpm*2*PI/60, 'rad/sn', '')]; break; } case 'mikser-karistirici-motor-gucu-hesabi': { var rho = num(form,'density'), d = num(form,'impeller_diameter_mm')/1000, rpm = num(form,'rpm'), pfac = num(form,'process_factor')||1, mar = num(form,'margin_percent')/100; var n = rpm/60, p = pfac*rho*Math.pow(n,3)*Math.pow(d,5)*(1+mar); r = [add('Yaklaşık karıştırma gücü', p, 'W', 'Ön seçim'), add('Yaklaşık karıştırma gücü', p/1000, 'kW', ''), add('Devir etkisi göstergesi', Math.pow(n,3), 'n³', 'Devir artışı gücü çok artırır'), add('Çap etkisi göstergesi', Math.pow(d,5), 'D⁵', 'Çap artışı çok etkilidir')]; break; } case 'basincli-hava-boru-capi-on-secim': { var free = num(form,'free_air_l_min'), bar = num(form,'pressure_bar'), vel = num(form,'target_velocity_ms')||1, len = num(form,'line_length_m'), mar = num(form,'margin_percent')/100; var compM3s = (free/1000/60)/(bar+1)*(1+mar); var dia = Math.sqrt(4*compM3s/(PI*vel))*1000; r = [add('Önerilen yaklaşık iç çap', dia, 'mm', ''), add('Sıkıştırılmış hacimsel debi', compM3s*3600, 'm³/h', ''), add('Hat uzunluğu dikkat puanı', len/dia*10, 'puan', len>30?'Uzun hat; çap büyütme veya ring hat düşünülmeli':''), add('Serbest hava debisi', free, 'L/dk', '')]; break; } case 'kompresor-hat-basinc-dusumu-hesabi': { var free = num(form,'free_air_l_min'), d = num(form,'pipe_diameter_mm')||1, len = num(form,'line_length_m'), fittings = num(form,'fitting_count'), bar = num(form,'pressure_bar'); var speedScore = free/Math.max(1,d*d)*(bar+1); var drop = (len/10 + fittings*0.7)*speedScore/100; r = [add('Yaklaşık basınç düşümü skoru', drop, 'bar eşdeğer', drop>0.5?'Hat çapı veya bağlantılar kontrol edilmeli':'Ön risk düşük'), add('Hat direnç puanı', len+fittings*5, 'puan', ''), add('Boru çapı', d, 'mm', ''), add('Makine girişinde tahmini basınç', Math.max(0,bar-drop), 'bar', '')]; break; } case 'ssr-kontaktor-isi-yuku-hesabi': { var a = num(form,'load_current'), vd = num(form,'voltage_drop'), ph = num(form,'phase_count')||1, amb = num(form,'ambient_c'), rth = num(form,'heatsink_c_w')||1; var heat = a*vd*ph, rise = heat*rth; r = [add('SSR toplam ısı kaybı', heat, 'W', ''), add('Soğutucu sıcaklık artışı', rise, '°C', ''), add('Tahmini soğutucu sıcaklığı', amb+rise, '°C', amb+rise>80?'Soğutma yetersiz olabilir':''), add('Faz sayısı', ph, 'adet', '')]; break; } case 'motor-verim-enerji-tasarruf-hesabi': { var kw = num(form,'motor_kw'), load = num(form,'load_percent')/100, h = num(form,'hours_year'), olde = num(form,'old_efficiency')/100, newe = num(form,'new_efficiency')/100, price = num(form,'electric_price'); var mech = kw*load, oldKwh = mech/Math.max(olde,0.001)*h, newKwh = mech/Math.max(newe,0.001)*h, sav = oldKwh-newKwh; r = [add('Eski motor yıllık tüketim', oldKwh, 'kWh/yıl', ''), add('Yeni motor yıllık tüketim', newKwh, 'kWh/yıl', ''), add('Yıllık enerji tasarrufu', sav, 'kWh/yıl', ''), add('Yıllık maliyet tasarrufu', sav*price, 'TL/yıl', '')]; break; } case 'fan-filtre-kirlenme-debi-dusumu-hesabi': { var q = num(form,'nominal_airflow_m3h'), pc = num(form,'clean_pressure_pa')||1, pd = num(form,'dirty_pressure_pa')||1, exp = num(form,'fan_curve_factor')||0.5, minq = num(form,'min_required_airflow'); var remain = q*Math.pow(pc/pd, exp); r = [add('Kirli filtrede tahmini debi', remain, 'm³/h', remain4?'Aralık kısa tutulmalı':''), add('Önerilen kontrol aralığı', days, 'gün', ''), add('Aylık yaklaşık gres ihtiyacı', grams*30/days, 'g/ay', '')]; break; } case 'kayis-gerginlik-on-kontrol-hesabi': { var kw = num(form,'power_kw'), rpm = num(form,'rpm')||1, dia = num(form,'pulley_diameter_mm')/1000, belts = num(form,'belt_count')||1, sp = num(form,'service_percent')/100; var v = PI*dia*rpm/60, force = kw*1000/Math.max(v,0.001)*(1+sp), per = force/belts; r = [add('Kayış çevresel hızı', v, 'm/sn', ''), add('Toplam çevresel kuvvet', force, 'N', ''), add('Kayış başı kuvvet', per, 'N/kayış', ''), add('Servis payı', sp*100, '%', '')]; break; } case 'mil-kama-kesme-basinc-kontrolu': { var tq = num(form,'torque_nm'), d = num(form,'shaft_diameter_mm'), b = num(form,'key_width_mm'), h = num(form,'key_height_mm'), L = num(form,'key_length_mm'), allow = num(form,'allowable_mpa')||1; var F = tq*2000/Math.max(d,0.001), shear = F/(b*L), crush = F/((h/2)*L); r = [add('Kama çevresel kuvveti', F, 'N', ''), add('Kesme gerilmesi', shear, 'MPa', shear>allow?'Kesme riski yüksek':''), add('Ezilme basıncı', crush, 'MPa', crush>allow?'Ezilme riski yüksek':''), add('Emniyet oranı', allow/Math.max(shear,crush,0.001), 'kat', '')]; break; } case 'civata-sikma-torku-hesabi': { var d = num(form,'bolt_diameter_mm')/1000, F = num(form,'preload_kn')*1000, K = num(form,'nut_factor'), adj = num(form,'safety_percent')/100; var T = K*F*d*(1+adj); r = [add('Yaklaşık sıkma torku', T, 'Nm', 'Tork anahtarı ön değeri'), add('Hedef ön yük', F/1000, 'kN', ''), add('Sürtünme katsayısı', K, '', 'Yağlı/kuru bağlantıda değişir'), add('Cıvata çapı', d*1000, 'mm', '')]; break; } case 'ankraj-civata-yuk-kontrolu': { var load = num(form,'total_load_kn'), cnt = num(form,'bolt_count')||1, sf = num(form,'safety_factor')||1, allow = num(form,'allowable_per_bolt_kn')||1; var per = load*sf/cnt; r = [add('Emniyetli toplam yük', load*sf, 'kN', ''), add('Cıvata başı tasarım yükü', per, 'kN', per>allow?'İzin verilen değeri aşıyor':'Ön kontrol olumlu'), add('Cıvata başı izin verilen yük', allow, 'kN', ''), add('Yük kullanım oranı', per/allow*100, '%', '')]; break; } case 'motor-sicaklik-derating-hesabi': { var kw = num(form,'rated_kw'), amb = num(form,'ambient_c'), alt = num(form,'altitude_m'), duty = num(form,'duty_percent')/100, mar = num(form,'margin_percent')/100; var tempF = Math.max(0, amb-40)*0.01, altF = Math.max(0, alt-1000)/1000*0.03, usable = kw*Math.max(0.4,1-tempF-altF)*duty*(1-mar); r = [add('Tahmini güvenli kullanılabilir güç', usable, 'kW', usablemaxDepth?'Paso yüksek görünüyor':'Paso makul görünüyor')]; break; } case 'pleksi-erime-riski-hesabi': { var rpm=num(form,'rpm')||1, feed=num(form,'feed_mm_min')||1, d=num(form,'tool_diameter_mm')||1, fl=num(form,'flute_count')||1, dep=num(form,'depth_mm'), air=num(form,'air_assist')||1; var chip=feed/rpm/fl; var risk=(rpm/18000)*air*(dep/d)*Math.max(0.5,0.06/Math.max(chip,0.001))*100; r=[add('Talaş yükü', chip, 'mm/diş', ''), add('Erime risk puanı', risk, '/100', risk>100?'Yüksek risk: F artırın, rpm düşürün veya hava ekleyin':'Kontrollü başlangıç'), add('Paso/çap oranı', dep/d*100, '%', '')]; break; } case 'aluminyum-talas-tahliye-hesabi': { var rpm=num(form,'rpm')||1, feed=num(form,'feed_mm_min')||1, d=num(form,'tool_diameter_mm')||1, fl=num(form,'flute_count')||1, dep=num(form,'depth_mm'), cool=num(form,'cooling')||1; var chip=feed/rpm/fl; var mrr=dep*d*feed/1000; var risk=(fl*25)+(dep/d*60)+(cool*30)+(chip<0.025?30:0); r=[add('Talaş yükü', chip, 'mm/diş', ''), add('Talaş kaldırma hacmi', mrr, 'cm³/dk', ''), add('Talaş tahliye risk puanı', risk, '/100', risk>100?'Risk yüksek: ağız sayısı/paso/soğutma kontrol edilmeli':'Ön kontrol makul')]; break; } case 'compression-freze-uygunluk-kontrolu': { var th=num(form,'thickness_mm'), fp=num(form,'first_pass_mm'), up=num(form,'upcut_length_mm'), cl=num(form,'cutter_length_mm'), sp=num(form,'surface_priority')||1; var okFirst=fp>up?100:fp/up*100; var okLen=cl>=th?100:cl/th*100; var score=Math.min(okFirst,okLen)*sp; r=[add('İlk paso uygunluğu', okFirst, '%', fp<=up?'İlk paso upcut bölümünü aşmıyor':'İlk paso compression etkisine uygun'), add('Kesici boy uygunluğu', okLen, '%', cl5?'Yüksek titreşim riski':'Makul aralık'), add('Titreşim risk puanı', risk, '/100', risk>100?'Risk yüksek':'Ön kontrol'), add('Önerilen maksimum çıkma', d*4.5, 'mm', 'Mümkünse bu değere yaklaşın')]; break; } case 'tek-paso-derinlik-guvenli-mi-hesabi': { var d=num(form,'tool_diameter_mm')||1, desired=num(form,'desired_depth_mm'), mat=num(form,'material_factor')||1, mq=num(form,'machine_quality')||1, kw=num(form,'spindle_kw')||1; var safe=d*0.75*mat*mq*Math.min(1.35,Math.sqrt(kw/4.5)); r=[add('Tahmini güvenli başlangıç paso', safe, 'mm', ''), add('İstenen paso kullanım oranı', desired/safe*100, '%', desired>safe?'İstenen paso yüksek görünüyor':'Ön kontrol olumlu'), add('Takım çapına oran', desired/d*100, '%', '')]; break; } case 'takim-kirilma-risk-puani-hesabi': { var d=num(form,'tool_diameter_mm')||1, st=num(form,'stickout_mm'), dep=num(form,'depth_mm'), feed=num(form,'feed_mm_min'), rpm=num(form,'rpm')||1, fl=num(form,'flute_count')||1, mat=num(form,'material_factor')||1; var chip=feed/rpm/fl; var risk=(st/d*12)+(dep/d*35)+(chip/(d*0.01)*30)*mat; r=[add('Talaş yükü', chip, 'mm/diş', ''), add('Kırılma risk puanı', risk, '/100', risk>100?'Yüksek risk':'Ön kontrol'), add('Çıkma / çap oranı', st/d, '', '')]; break; } case 'makine-kalitesi-f-karsilastirma-hesabi': { var mat=num(form,'material_factor')||1, d=num(form,'tool_diameter_mm')||1, fl=num(form,'flute_count')||1, rpm=num(form,'rpm')||1, pr=num(form,'priority_factor')||1; var chip=d*0.008*mat*pr; var base=rpm*fl*chip; r=[add('Pro makine başlangıç F', base*1.2, 'mm/dk', ''), add('Orta makine başlangıç F', base, 'mm/dk', ''), add('Zayıf makine başlangıç F', base*0.55, 'mm/dk', ''), add('Tahmini talaş yükü', chip, 'mm/diş', '')]; break; } case 'kucuk-parca-vakum-tutus-riski-hesabi': { var L=num(form,'part_length_mm')/1000,W=num(form,'part_width_mm')/1000,kpa=num(form,'vacuum_kpa'), leak=num(form,'leak_percent')/100, cf=num(form,'cut_force_n'), sf=num(form,'safety_factor')||1; var hold=L*W*kpa*1000*(1-leak); var need=cf*sf; r=[add('Efektif tutma kuvveti', hold, 'N', ''), add('Gerekli güvenli tutma kuvveti', need, 'N', hold35?'Kullanılmayan bölgeleri kapatın':'Makul'), add('Kapalı alan oranı', cov/zone*100, '%', '')]; break; } case 'vakum-parca-kayma-riski-hesabi': { var hold=num(form,'hold_force_n'), mu=num(form,'friction_coeff'), cf=num(form,'cut_force_n'), sf=num(form,'safety_factor')||1; var side=hold*mu; var need=cf*sf; r=[add('Yan tutma kuvveti', side, 'N', ''), add('Gerekli güvenli yan kuvvet', need, 'N', sideduty?'Sürekli çalışma riski':'Makul'), add('Tank tampon oranı', tank/Math.max(total,1), 'dk', 'Yaklaşık tampon göstergesi')]; break; } case 'cnc-olcu-kacirma-teshis-araci': { var cmd=num(form,'command_mm')||1, meas=num(form,'measured_mm')||1, back=num(form,'backlash_mm'), steps=num(form,'steps_per_mm'), symptom=num(form,'symptom')||1; var err=meas-cmd; var newSteps=steps*cmd/meas; r=[add('Ölçü hatası', err, 'mm', ''), add('Hata oranı', err/cmd*100, '%', ''), add('Önerilen yeni steps/mm', newSteps, 'pulse/mm', 'Hata düzenli oransalsa kullanın'), add('Backlash pulse karşılığı', back*steps, 'pulse', symptom>1.15?'Belirti mekanik olabilir':'')]; break; } case 'backlash-bosluk-telafi-hesaplayici': { var b=num(form,'backlash_mm'), spm=num(form,'steps_per_mm'), ax=num(form,'axis_type')||1; var pulse=b*spm; r=[add('Telafi edilecek boşluk', b, 'mm', ''), add('Pulse karşılığı', pulse, 'pulse', ''), add('Mekanik risk puanı', b*100*ax, '/100', b>0.1?'Mekanik boşluk öncelikli giderilmeli':'Düşük boşluk')]; break; } case 'step-motor-isinma-gucsuzluk-teshis-araci': { var mi=num(form,'motor_current_a')||1, di=num(form,'driver_current_a'), v=num(form,'supply_voltage_v'), ms=num(form,'microstep'), rpm=num(form,'motor_rpm'), symptom=num(form,'symptom')||1; var currentRatio=di/mi*100; var speedRisk=rpm/800*50; var voltHelp=v>=48?0:25; var risk=(Math.abs(currentRatio-100)*0.5)+speedRisk+voltHelp+(ms>16?15:0)*symptom; r=[add('Akım ayarı oranı', currentRatio, '%', currentRatio>115?'Akım yüksek olabilir':(currentRatio<70?'Akım düşük olabilir':'Makul')), add('Hız/voltaj risk puanı', risk, '/100', risk>100?'Risk yüksek':'Ön kontrol'), add('Besleme voltajı', v, 'V', v<36?'Yüksek hızda tork zayıf kalabilir':'')]; break; } case 'inverter-hata-on-teshis-araci': { var mc=num(form,'motor_current_a')||1, meas=num(form,'measured_current_a'), acc=num(form,'accel_time_s'), ft=num(form,'fault_type')||1; var load=meas/mc*100; var risk=(load>100?(load-100)*2:0)+(acc<3?35:0)*ft; r=[add('Motor akım yük oranı', load, '%', load>100?'Etiket akımı aşılıyor':'Makul'), add('Hata risk puanı', risk, '/100', risk>80?'Parametre ve mekanik kontrol gerekli':'Ön kontrol'), add('Hızlanma süresi', acc, 'sn', acc<3?'Çok kısa olabilir':'')]; break; } case 'servo-alarm-on-teshis-araci': { var ir=num(form,'inertia_ratio'), acc=num(form,'acceleration'), load=num(form,'load_percent'), fe=num(form,'following_error'), sy=num(form,'symptom')||1; var risk=(ir>5?(ir-5)*8:0)+(acc*8)+(load>90?(load-90)*2:0)+(fe>0?20:0)*sy; r=[add('Servo alarm risk puanı', risk, '/100', risk>100?'Yüksek risk':'Ön kontrol'), add('Atalet oranı', ir, '', ir>10?'Tuning zor olabilir':''), add('Yük oranı', load, '%', load>90?'Sınırda':'')]; break; } case 'grbl-steps-mm-hesaplayici': { var st=num(form,'motor_steps'), mic=num(form,'microstep'), travel=num(form,'travel_per_rev_mm')||1, cmd=num(form,'command_mm')||1, meas=num(form,'measured_mm')||1; var theoretical=st*mic/travel; var corrected=theoretical*cmd/meas; r=[add('Teorik GRBL steps/mm', theoretical, 'step/mm', '$100/$101/$102 başlangıç'), add('Ölçüme göre düzeltilmiş değer', corrected, 'step/mm', ''), add('Ölçüm hata oranı', (meas-cmd)/cmd*100, '%', '')]; break; } case 'grbl-ivme-hiz-ayar-hesaplayici': { var spm=num(form,'steps_per_mm')||1, hz=num(form,'max_pulse_hz'), rpm=num(form,'motor_max_rpm'), travel=num(form,'travel_per_rev_mm'), mq=num(form,'machine_quality')||1; var speedPulse=hz/spm*60; var speedMotor=rpm*travel; var safe=Math.min(speedPulse,speedMotor)*0.75*mq; var accel=500*mq*Math.min(2,travel/40); r=[add('Pulse sınırına göre maksimum hız', speedPulse, 'mm/dk', ''), add('Motor devrine göre maksimum hız', speedMotor, 'mm/dk', ''), add('Önerilen GRBL maksimum hız', safe, 'mm/dk', '$110/$111 için başlangıç'), add('Önerilen başlangıç ivme', accel, 'mm/sn²', '$120/$121 için başlangıç')]; break; } case 'cnc-fason-kesim-fiyat-hesaplayici': { var ct=num(form,'cut_time_min'), setup=num(form,'setup_time_min'), hc=num(form,'machine_hour_cost'), mat=num(form,'material_cost'), tool=num(form,'tool_cost'), elec=num(form,'electric_cost'), profit=num(form,'profit_percent')/100; var timeCost=(ct+setup)/60*hc; var cost=timeCost+mat+tool+elec; var price=cost*(1+profit); r=[add('Süre maliyeti', timeCost, 'TL', ''), add('Toplam maliyet', cost, 'TL', ''), add('Önerilen satış fiyatı', price, 'TL', ''), add('Net kar', price-cost, 'TL', '')]; break; } case 'plaka-parca-adet-fire-hesaplayici': { var sx=num(form,'sheet_x_mm'), sy=num(form,'sheet_y_mm'), px=num(form,'part_x_mm'), py=num(form,'part_y_mm'), gap=num(form,'gap_mm'), margin=num(form,'edge_margin_mm'); var ax=Math.floor((sx-2*margin+gap)/(px+gap))*Math.floor((sy-2*margin+gap)/(py+gap)); var rot=Math.floor((sx-2*margin+gap)/(py+gap))*Math.floor((sy-2*margin+gap)/(px+gap)); var best=Math.max(ax,rot); var used=best*px*py; var area=sx*sy; r=[add('Düz yerleşim adet', ax, 'adet', ''), add('Döndürülmüş yerleşim adet', rot, 'adet', ''), add('En iyi yaklaşık adet', best, 'adet', ''), add('Yaklaşık alan verimi', used/area*100, '%', '')]; break; } case 'nest-verimlilik-hesaplayici': { var sheet=num(form,'sheet_area_m2')||1, parts=num(form,'parts_area_m2'), cost=num(form,'sheet_cost'), rec=num(form,'scrap_recovery_percent')/100; var eff=parts/sheet*100; var waste=Math.max(0,sheet-parts)/sheet*cost*(1-rec); r=[add('Nest verimi', eff, '%', eff<70?'Fire yüksek olabilir':'Makul'), add('Fire oranı', 100-eff, '%', ''), add('Net fire maliyeti', waste, 'TL', '')]; break; } case 'kesim-metresi-fiyat-hesaplayici': { var len=num(form,'cut_length_m')||1, feed=num(form,'feed_mm_min'), setup=num(form,'setup_min'), hour=num(form,'machine_hour_cost'), profit=num(form,'profit_percent')/100; var cutMin=len*1000/feed; var cost=(cutMin+setup)/60*hour; var price=cost*(1+profit); r=[add('Net kesim süresi', cutMin, 'dk', ''), add('Toplam süre maliyeti', cost, 'TL', ''), add('Önerilen toplam satış', price, 'TL', ''), add('Metre başı satış fiyatı', price/len, 'TL/m', '')]; break; } case 'cnc-parametre-deneme-planlayici': { var rpm=num(form,'start_rpm'), feed=num(form,'start_feed'), step=num(form,'step_percent')/100, cnt=Math.min(10,Math.max(1,Math.round(num(form,'test_count')))), mode=form.elements['change_mode']?form.elements['change_mode'].value:'feed'; var lastFeed=feed*Math.pow(1+step,cnt-1), lastRpm=rpm*Math.pow(1+step,cnt-1); r=[add('1. deneme RPM', rpm, 'rpm', ''), add('1. deneme F', feed, 'mm/dk', ''), add('Son deneme RPM', mode==='feed'?rpm:lastRpm, 'rpm', ''), add('Son deneme F', mode==='rpm'?feed:lastFeed, 'mm/dk', cnt+' kademeli plan')]; break; } case 'spindle-yuk-akim-izleme-hesabi': { var rated=num(form,'rated_current_a')||1, cut=num(form,'cut_current_a'), idle=num(form,'idle_current_a'), duty=num(form,'duty_type')||1; var net=Math.max(0,cut-idle); var usable=Math.max(0.1,rated-idle); var load=net/usable*100/duty; r=[add('Net kesim akımı', net, 'A', ''), add('Tahmini spindle yük oranı', load, '%', load>85?'Yüksek yük':'Makul'), add('Etiket akımına oran', cut/rated*100, '%', '')]; break; } case 'vakum-deligi-aralik-on-hesabi': { var tx=num(form,'table_x_mm'), ty=num(form,'table_y_mm'), dia=num(form,'hole_diameter_mm'), pitch=num(form,'hole_pitch_mm'), zone=num(form,'zone_count')||1; var nx=Math.floor(tx/pitch)+1, ny=Math.floor(ty/pitch)+1, count=nx*ny, open=count*PI*Math.pow(dia/2,2)/1000000; r=[add('Yaklaşık delik sayısı', count, 'adet', ''), add('Toplam açık delik alanı', open*10000, 'cm²', ''), add('Bölge başı alan', tx*ty/zone/1000000, 'm²', '')]; break; } default: r = []; } r = enhanceSahaResults(form, r); render(form, r); } function sanitizeAiHtml(html){ var tpl = document.createElement('template'); tpl.innerHTML = String(html || ''); var allowed = {BR:1,P:1,DIV:1,SPAN:1,STRONG:1,B:1,EM:1,I:1,UL:1,OL:1,LI:1,TABLE:1,THEAD:1,TBODY:1,TFOOT:1,TR:1,TH:1,TD:1,A:1}; function clean(node){ Array.prototype.slice.call(node.childNodes).forEach(function(child){ if(child.nodeType === 1){ if(!allowed[child.tagName]){ child.replaceWith(document.createTextNode(child.textContent || '')); return; } Array.prototype.slice.call(child.attributes).forEach(function(attr){ var name = attr.name.toLowerCase(); var ok = (child.tagName === 'A' && ['href','target','rel','title'].indexOf(name) !== -1) || ((child.tagName === 'TD' || child.tagName === 'TH') && ['colspan','rowspan'].indexOf(name) !== -1); if(name.indexOf('on') === 0 || !ok){ child.removeAttribute(attr.name); } }); if(child.tagName === 'A'){ var href = child.getAttribute('href') || ''; try{ var u = new URL(href, window.location.origin); if(['http:','https:','mailto:','tel:'].indexOf(u.protocol) === -1 && href.charAt(0) !== '#'){ child.removeAttribute('href'); } }catch(e){ if(href.charAt(0) !== '#'){ child.removeAttribute('href'); } } if(child.getAttribute('target') === '_blank'){ child.setAttribute('rel','noopener noreferrer nofollow'); } } clean(child); } else if(child.nodeType !== 3){ child.remove(); } }); } clean(tpl.content); return tpl.innerHTML; } function collectPageContext(wrap){ var lines = []; var title = wrap.querySelector('h1') ? wrap.querySelector('h1').textContent.trim() : ''; var category = wrap.querySelector('.mthc-eyebrow') ? wrap.querySelector('.mthc-eyebrow').textContent.trim() : ''; if(title){ lines.push('Başlık: ' + title); } if(category){ lines.push('Kategori: ' + category); } var form = wrap.querySelector('.mthc-form[data-mthc-calc]'); if(form){ lines.push('Girilen değerler:'); collectFormRows(form).forEach(function(row){ lines.push('- ' + row.label + ': ' + row.value); }); } var cards = Array.prototype.map.call(wrap.querySelectorAll('.mthc-result-card'), function(card){ return card.textContent.replace(/\s+/g,' ').trim(); }); if(cards.length){ lines.push('Hesap sonucu:'); cards.forEach(function(x){ lines.push('- ' + x); }); } var advisor = wrap.querySelector('[data-mthc-advisor]'); if(advisor){ lines.push('Karar özeti: ' + advisor.textContent.replace(/\s+/g,' ').trim()); } var match = wrap.querySelector('[data-mthc-product-match]'); if(match){ lines.push('Ürün eşleştirme: ' + match.textContent.replace(/\s+/g,' ').trim()); } var products = Array.prototype.map.call(wrap.querySelectorAll('[data-mthc-product-target]'), function(a){ return (a.getAttribute('data-mthc-product-label') || a.textContent).replace(/\s+/g,' ').trim() + ' => ' + a.href; }); if(products.length){ lines.push('Doğrudan ürün/kategori bağlantıları:'); products.slice(0,5).forEach(function(x){ lines.push('- ' + x); }); } return lines.join('\n').slice(0,5000); } function initAiPanels(){ document.querySelectorAll('[data-mthc-ai-panel]').forEach(function(panel){ if(panel.getAttribute('data-ai-ready')){ return; } panel.setAttribute('data-ai-ready','1'); var wrap = panel.closest('.mthc-wrap') || document; var textarea = panel.querySelector('[data-mthc-ai-text]'); var answer = panel.querySelector('[data-mthc-ai-answer]'); var send = panel.querySelector('[data-mthc-ai-send]'); var clear = panel.querySelector('[data-mthc-ai-clear]'); var quicks = panel.querySelectorAll('[data-mthc-ai-question]'); Array.prototype.forEach.call(quicks, function(btn){ btn.addEventListener('click', function(){ if(textarea){ textarea.value = btn.getAttribute('data-mthc-ai-question') || ''; textarea.focus(); } }); }); if(clear){ clear.addEventListener('click', function(){ if(answer){ answer.innerHTML = 'Yanıt temizlendi. Yeni bir soru sorabilirsiniz.'; } }); } if(!send || !textarea || !answer){ return; } send.addEventListener('click', function(){ var question = textarea.value.trim(); if(!question){ textarea.focus(); return; } var url = panel.getAttribute('data-mthc-ai-url') || ''; var nonce = panel.getAttribute('data-mthc-ai-nonce') || ''; var title = panel.getAttribute('data-mthc-ai-title') || ''; var slug = panel.getAttribute('data-mthc-ai-slug') || ''; var fd = new FormData(); fd.append('action','mthc_calc_ai_support'); fd.append('nonce', nonce); fd.append('title', title); fd.append('slug', slug); fd.append('question', question); fd.append('context', collectPageContext(wrap)); fd.append('website',''); send.disabled = true; answer.classList.add('mthc-ai-loading'); answer.innerHTML = 'Sayfa sonucu ve girilen değerler okunuyor; teknik yanıt hazırlanıyor...'; fetch(url, {method:'POST', body:fd, credentials:'same-origin'}) .then(function(res){ return res.json(); }) .then(function(json){ if(!json || !json.success || !json.data || !json.data.answer){ throw new Error(json && json.data && json.data.message ? json.data.message : 'Yanıt alınamadı.'); } answer.innerHTML = sanitizeAiHtml(json.data.answer); }) .catch(function(err){ answer.innerHTML = '' + escapeHtml(err.message || 'Teknik yardım servisine ulaşılamadı. Sonucu WhatsApp ile gönderebilirsiniz.') + ''; }) .finally(function(){ send.disabled = false; answer.classList.remove('mthc-ai-loading'); }); }); textarea.addEventListener('keydown', function(e){ if((e.ctrlKey || e.metaKey) && e.key === 'Enter'){ e.preventDefault(); send.click(); } }); }); } function resetForm(form){ Array.prototype.forEach.call(form.elements, function(el){ if(!el.name){ return; } if(el.hasAttribute('data-default')){ el.value = el.getAttribute('data-default'); } }); calculate(form); } function sendUsage(wrap, eventName){ if(!wrap){ return; } var url = wrap.getAttribute('data-mthc-ajax') || ''; var nonce = wrap.getAttribute('data-mthc-usage-nonce') || ''; var slug = wrap.getAttribute('data-mthc-wrap') || ''; if(!url || !nonce || !slug){ return; } var fd = new FormData(); fd.append('action','mthc_usage_event'); fd.append('nonce', nonce); fd.append('slug', slug); fd.append('event', eventName || 'view'); if(navigator.sendBeacon){ navigator.sendBeacon(url, fd); } else { fetch(url, {method:'POST', body:fd, credentials:'same-origin'}).catch(function(){}); } } function collectSummary(wrap){ var form = wrap.querySelector('.mthc-form[data-mthc-calc]'); var lines = []; var title = wrap.querySelector('h1') ? wrap.querySelector('h1').textContent.trim() : ''; if(title){ lines.push(title); } if(form){ collectFormRows(form).forEach(function(r){ lines.push(r.label + ': ' + r.value); }); } Array.prototype.forEach.call(wrap.querySelectorAll('.mthc-result-card'), function(card){ lines.push(card.textContent.replace(/\s+/g,' ').trim()); }); var adv = wrap.querySelector('[data-mthc-advisor]'); if(adv){ lines.push(adv.textContent.replace(/\s+/g,' ').trim()); } var cls = wrap.querySelector('[data-mthc-class-recommendation]'); if(cls){ lines.push(cls.textContent.replace(/\s+/g,' ').trim()); } return lines.join('\n').slice(0,4000); } function initQuotePanels(){ document.querySelectorAll('[data-mthc-quote-panel]').forEach(function(panel){ if(panel.getAttribute('data-ready')){ return; } panel.setAttribute('data-ready','1'); var wrap = panel.closest('.mthc-wrap'); var btn = panel.querySelector('[data-mthc-quote-send]'); var status = panel.querySelector('[data-mthc-quote-status]'); if(!wrap || !btn){ return; } btn.addEventListener('click', function(){ var url = wrap.getAttribute('data-mthc-ajax') || ''; var nonce = wrap.getAttribute('data-mthc-quote-nonce') || ''; var fd = new FormData(); fd.append('action','mthc_quote_request'); fd.append('nonce', nonce); fd.append('slug', btn.getAttribute('data-mthc-slug') || wrap.getAttribute('data-mthc-wrap') || ''); fd.append('title', btn.getAttribute('data-mthc-title') || (wrap.querySelector('h1') ? wrap.querySelector('h1').textContent : '')); fd.append('name', (panel.querySelector('[data-mthc-quote-name]') || {}).value || ''); fd.append('phone', (panel.querySelector('[data-mthc-quote-phone]') || {}).value || ''); fd.append('message', (panel.querySelector('[data-mthc-quote-message]') || {}).value || ''); fd.append('website', (panel.querySelector('[data-mthc-quote-website]') || {}).value || ''); fd.append('summary', collectSummary(wrap)); fd.append('url', window.location.href); btn.disabled = true; if(status){ status.textContent = 'Talep kaydediliyor...'; } fetch(url, {method:'POST', body:fd, credentials:'same-origin'}) .then(function(r){ return r.json(); }) .then(function(json){ if(!json || !json.success){ throw new Error(json && json.data && json.data.message ? json.data.message : 'Talep kaydedilemedi.'); } if(status){ status.textContent = json.data.message || 'Talep kaydedildi.'; } sendUsage(wrap, 'quote'); }) .catch(function(e){ if(status){ status.textContent = e.message || 'Talep kaydedilemedi.'; } }) .finally(function(){ btn.disabled = false; }); }); }); } function initHelpPanels(){ var mq = window.matchMedia ? window.matchMedia('(max-width: 760px)') : {matches:false, addEventListener:function(){}}; function updateLabel(panel){ var btn = panel.querySelector('[data-mthc-help-toggle]'); if(!btn){ return; } var span = btn.querySelector('span'); var open = panel.hasAttribute('open'); if(span){ span.textContent = open ? 'Alan açıklamalarını gizle' : 'Alan açıklamalarını göster'; } btn.setAttribute('aria-expanded', open ? 'true' : 'false'); } document.querySelectorAll('[data-mthc-help-panel]').forEach(function(panel){ if(panel.getAttribute('data-mthc-help-ready')){ return; } panel.setAttribute('data-mthc-help-ready','1'); if(panel.tagName && panel.tagName.toLowerCase() === 'details'){ if(mq.matches){ panel.removeAttribute('open'); } else { panel.setAttribute('open','open'); } updateLabel(panel); panel.addEventListener('toggle', function(){ updateLabel(panel); }); } }); document.querySelectorAll('.mthc-field-help-list').forEach(function(list){ if(list.getAttribute('data-mthc-accordion-ready')){ return; } list.setAttribute('data-mthc-accordion-ready','1'); list.querySelectorAll('.mthc-help-item').forEach(function(item){ item.addEventListener('toggle', function(){ if(!item.open){ return; } list.querySelectorAll('.mthc-help-item').forEach(function(other){ if(other !== item){ other.removeAttribute('open'); } }); }); }); }); document.querySelectorAll('.mthc-form').forEach(function(form){ if(form.getAttribute('data-mthc-inline-help-ready')){ return; } form.setAttribute('data-mthc-inline-help-ready','1'); form.querySelectorAll('[data-mthc-inline-help]').forEach(function(item){ item.addEventListener('toggle', function(){ if(!item.open){ return; } form.querySelectorAll('[data-mthc-inline-help]').forEach(function(other){ if(other !== item){ other.removeAttribute('open'); } }); }); }); }); document.querySelectorAll('[data-mthc-jump-help]').forEach(function(link){ if(link.getAttribute('data-mthc-jump-ready')){ return; } link.setAttribute('data-mthc-jump-ready','1'); link.addEventListener('click', function(e){ var id = link.getAttribute('data-mthc-jump-help') || ''; var target = id ? document.getElementById(id) : null; var panel = target ? target.closest('[data-mthc-help-panel]') : null; if(panel && panel.tagName && panel.tagName.toLowerCase() === 'details'){ panel.setAttribute('open','open'); updateLabel(panel); } if(target && target.tagName && target.tagName.toLowerCase() === 'details'){ target.setAttribute('open','open'); setTimeout(function(){ target.scrollIntoView({behavior:'smooth', block:'center'}); }, 60); } }); }); } function init(){ document.querySelectorAll('.mthc-form[data-mthc-calc]').forEach(function(form){ form.addEventListener('submit', function(e){ e.preventDefault(); calculate(form); }); form.addEventListener('input', function(){ calculate(form); }); form.addEventListener('change', function(){ calculate(form); }); var reset = form.querySelector('[data-mthc-reset]'); if(reset){ reset.addEventListener('click', function(){ resetForm(form); }); } calculate(form); }); initHelpPanels(); initAiPanels(); initQuotePanels(); document.querySelectorAll('.mthc-wrap[data-mthc-wrap]').forEach(function(wrap){ if(!wrap.getAttribute('data-view-counted')){ wrap.setAttribute('data-view-counted','1'); sendUsage(wrap, 'view'); } }); document.querySelectorAll('[data-mthc-print]').forEach(function(btn){ btn.addEventListener('click', function(){ var wrap = btn.closest('.mthc-wrap'); var form = wrap ? wrap.querySelector('.mthc-form[data-mthc-calc]') : null; if(form){ buildReport(form); } else { window.print(); } }); }); } if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); //# sourceURL=mthc-script-js-after