%42 İndirim
,

400W Frenli Servo Motor Seti 60ST-M01330Z1 T3L-L20F-RABN

Orijinal fiyat: 34,603.36₺.Şu andaki fiyat: 20,033.52₺.

En İyi Kalite En İyi Fiyat Garantisi

Uygunluk: 50 adet stokta

Stok kodu: 60ST-M01330Z1 Kategoriler: , Marka:
🔥 Sadece Bugüne Özel %42 İndirim Fırsatı!📦 Kategori: 60 Mm Servo Motor Ve Sürücüleri🏷️ KW: 400 Watt🏷️ Encoder Tip: İncremental Encoder🏷️ Sürücü Kodu: T3L-L20F-RABN🏷️ Güç Kablo Kodu: DL-TH-80-A10.0D🏷️ Encoder Kablo Kodu: BM-TH-80F-A10.0D
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.

400 watt Frenli Servo Motor Seti 60ST-M01330Z1 T3L-L20F-RABN

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

Ürün Hakkında Detaylı İnceleme

400 watt Frenli Servo Motor Seti 60ST-M01330Z1 T3L-L20F-RABN, endüstriyel hareket kontrol sistemlerinde yüksek hassasiyet, dinamik yanıt ve güvenilir performans gerektiren uygulamalar için tasarlanmış kritik bir elektromechanik bileşendir. Bu set, kapalı döngü kontrol prensibiyle çalışır; entegre 2500 PPR (Darbe Başına Pals) artımlı enkoder, motor milinin anlık pozisyon ve hız bilgilerini sürekli olarak servo sürücüye (T3L-L20F-RABN) geri besler. Sürücü, bu geri besleme bilgisini kontrol ünitesinden gelen hedef komutlarla karşılaştırarak herhangi bir sapmayı (hata sinyali) tespit eder ve motorun stator sargılarına uygulanan akım ve gerilimi dinamik olarak ayarlayarak milin istenen pozisyona veya hıza ulaşmasını sağlar. Bu sürekli geri besleme ve düzeltme mekanizması, milimetrik hassasiyette konumlandırma ve yüksek tekrarlanabilirlik elde edilmesini mümkün kılar. Dahili elektromanyetik fren sistemi ise, motorun enerjisi kesildiğinde veya acil duruş komutu verildiğinde milin otomatik olarak kilitlenmesini sağlayarak, özellikle dikey eksenlerde yükün kontrolsüz hareketini önler ve operasyonel güvenliği artırır.

Mermak CNC mühendislik standartlarına uygun olarak geliştirilen bu servo motor, zorlu endüstriyel koşullarda dahi kesintisiz ve kararlı çalışma yeteneği sunan sağlam bir yapıya sahiptir. Motorun gövdesi, optimum ısı dağılımı sağlayacak şekilde tasarlanmış olup, uzun süreli yük altında dahi termal kararlılığını korur. IP54 koruma sınıfı, motorun iç bileşenlerini zararlı miktarda toz girişine ve her yönden gelen su sıçramalarına karşı koruyarak, ürünün ömrünü uzatır ve bakım ihtiyacını minimize eder. Standart 60 mm x 60 mm flanş boyutu (NEMA 23 uyumlu) ve 14 mm mil çapı, çeşitli redüktörler, kaplinler ve mekanik aktarım sistemleriyle kolay entegrasyon sağlar. Komple bir set olarak sunulması, 10 metrelik güç ve enkoder kabloları ile birlikte, sistem entegrasyon süreçlerini basitleştirir, mühendislik zamanından tasarruf edilmesini sağlar ve CNC routerlar, freze tezgahları, robotik kollar, otomatik montaj hatları ve genel otomasyon ekipmanları gibi geniş bir endüstriyel uygulama yelpazesinde yüksek performanslı hareket kontrolü için ideal bir çözüm sunar.

400 watt Frenli Servo Motor Seti 60ST-M01330Z1 T3L-L20F-RABN Avantajları

Entegre Fail-Safe Fren Sistemi: Bu servo motor setinde bulunan dahili elektromanyetik fren, özellikle dikey eksen uygulamalarında veya ani güç kesintisi durumlarında yükün güvenli bir şekilde sabitlenmesini sağlayan kritik bir güvenlik ve kontrol mekanizmasıdır. Enerjisiz durumda (power-off) devreye giren bu “fail-safe” tasarım, motorun elektriksel beslemesi kesildiğinde veya acil duruş komutu verildiğinde milin otomatik olarak kilitlenmesini temin eder. Bu özellik, iş parçasının veya takımın yerçekimi etkisiyle düşmesini engelleyerek hem operatör güvenliğini artırır hem de işleme hassasiyetinin korunmasına yardımcı olur. Frenin kontrollü bir şekilde serbest bırakılması için sürücüden veya harici bir kaynaktan 24V DC enerji uygulanması gerekmektedir, bu da sistemin güvenli ve kontrollü bir şekilde başlatılıp durdurulmasına olanak tanır.

Yüksek Çözünürlüklü Artımlı Enkoder Geri Beslemesi: 60ST-M01330Z1 servo motor, 2500 PPR (Darbe Başına Pals) çözünürlüğe sahip artımlı bir enkoder ile donatılmıştır. Bu yüksek çözünürlük, motor milinin her bir devri için 2500 adet elektriksel darbe üreterek, kapalı döngü kontrol sistemlerinde milimetrik düzeyde hassas pozisyon geri bildirimi sağlar. Enkoderden gelen A/B faz sinyalleri, sürücünün motorun anlık konumunu ve hızını yüksek doğrulukla algılamasına olanak tanır. Bu sayede, sürücü ile kontrol ünitesi arasındaki iletişimde minimum gecikme ve maksimum doğruluk elde edilir, bu da özellikle CNC tezgahlarında, robotik sistemlerde ve diğer hassas hareket kontrol uygulamalarında üstün tekrarlanabilirlik ve işleme kalitesi için temel bir gerekliliktir.

Endüstriyel Dayanıklılık ve Çevresel Koruma: Bu servo motor, IP54 koruma sınıfı standartlarına uygun olarak tasarlanmıştır. “IP54” derecesi, motorun iç mekanizmalarının zararlı miktarda toz girişine karşı kısmi korumalı olduğunu (ilk rakam ‘5’) ve her yönden gelen su sıçramalarına karşı dayanıklı olduğunu (ikinci rakam ‘4’) gösterir. Bu özellik, motorun talaş, metal tozu veya hafif nem gibi endüstriyel ortamlarda yaygın olarak bulunan çevresel etkenlere karşı direncini artırır. Sağlam gövde yapısı ve sızdırmazlık elemanları, motorun iç bileşenlerinin korunmasını sağlayarak çalışma ömrünü uzatır, arıza oranlarını düşürür ve bakım gereksinimlerini minimize eder. Bu çevresel koruma, motorun zorlu üretim hatlarında dahi kesintisiz ve güvenilir bir şekilde çalışmasına olanak tanır.

Teknik Özellikler ve Kapasite

Özellik Değer/Açıklama
Motor Kodu 60ST-M01330Z1
Güç 400 Watt (0.4 kW)
Anma Torku 1.27 N·m (Newton metre)
Anma Hızı 3000 RPM (Devir/Dakika)
Enkoder Tipi 2500 PPR Artımlı Enkoder
Koruma Sınıfı IP54 (Toz ve su sıçramalarına karşı koruma)

Teknik Sıkça Sorulan Sorular (SSS)

Servo sürücü, entegre freni nasıl yönetir ve dikey eksen uygulamasında güvenli çalışma için ayarlanması gereken kritik parametreler nelerdir?

Servo sürücü (T3L-L20F-RABN), entegre elektromanyetik freni genellikle özel bir kontrol çıkışı, tipik olarak 24V DC sinyal aracılığıyla yönetir. Bu sinyal aktif olduğunda, fren bobini enerjilenir ve motor mili serbest kalır. Tersine, sinyal enerjisiz hale geldiğinde (örneğin, bir elektrik kesintisi veya acil durdurma sırasında), fren otomatik olarak devreye girerek mili kilitler. Dikey eksen uygulamasında güvenli çalışma için ayarlanması gereken kritik parametreler arasında “Fren Bırakma Gecikmesi” (Brake Release Delay) ve “Fren Devreye Girme Gecikmesi” (Brake Engage Delay) bulunur. Fren bırakma gecikmesi, frenin tamamen devreden çıkmadan önce motorun yeterli torku geliştirmesini sağlayarak yükün düşmesini önler. Fren devreye girme gecikmesi ise, frenin devreye girmeden önce motorun güvenli bir hıza yavaşlamasını veya durmasını sağlayarak aşırı aşınmayı veya mekanik şoku engeller. Tipik değerler 50-100 ms arasında değişmekle birlikte, hassas ayar, yük ataleti, yavaşlama rampası ve uygulamanın güvenlik marjlarına göre yapılmalıdır. Yanlış zamanlama, frenin erken aşınmasına, mekanik gerilime veya kontrolsüz yük hareketine yol açabilir.

Bu 2500 PPR artımlı enkoder için blendajsız veya yanlış topraklanmış bir enkoder kablosu kullanmanın, özellikle uzun mesafelerde, sinyal bütünlüğü üzerindeki etkileri nelerdir?

Blendajsız veya yanlış topraklanmış bir enkoder kablosunun, 2500 PPR artımlı enkoder için özellikle birkaç metreyi aşan mesafelerde kullanılması, sinyal bütünlüğü açısından ciddi sorunlara yol açabilir. Endüstriyel ortamlar, güç kabloları, anahtarlamalı güç kaynakları ve diğer elektrikli makineler tarafından üretilen elektromanyetik parazit (EMI) ve radyo frekansı paraziti (RFI) açısından zengindir. Uygun blendajlama (örneğin, bir ucu toprağa bağlı örgülü bakır blendaj, genellikle sürücü tarafında) olmadan, bu harici gürültüler enkoderin diferansiyel A, B ve Z sinyallerine karışarak yanlış palslere, eksik palslere veya sinyal bozulmasına neden olabilir. Bu durum, kapalı döngü kontrol sisteminde pozisyon hatalarına, hız dalgalanmalarına ve kararsızlığa doğrudan yol açar; bu da hatalı işleme, sarsıntılı hareketler veya hatta sistem arızalarıyla sonuçlanabilir. Ayrıca, yanlış topraklama, gürültü sorunlarını daha da kötüleştiren toprak döngüleri oluşturabilir. Optimum performans ve güvenilirlik için, yüksek frekanslı enkoder sinyallerinin bütünlüğünü korumak amacıyla yüksek kaliteli, blendajlı, bükümlü çift (twisted-pair) enkoder kablosu ve doğru topraklama uygulamaları zorunludur.

Yüksek çevrimli bir uygulamada 400W servo motorun termal yükünü nasıl hesaplayabilirim ve IP54 koruma sınıfının ötesinde aşırı ısınmayı önlemek için hangi önlemler alınabilir?

Yüksek çevrimli bir uygulamada 400W 60ST-M01330Z1 servo motorun termal yükünü hesaplamak, hem sürekli hem de aralıklı tork gereksinimlerini, motor verimliliğini ve ortam sıcaklığını dikkate almayı gerektirir. Motorun sürekli termal limiti, nominal gücü (400W) ve ısıyı dağıtma yeteneği ile tanımlanır. Motor, nominal torkunun (1.27 N·m) üzerinde uzun süre çalıştığında veya sık ivmelenme/yavaşlama döngü

Servo 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 250 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 20 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 rack94 yalnızca örnek başlangıç değeridir.

İvme ve darbeli yük beklentisini 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 normal yalnızca örnek başlangıç değeridir.

Z ekseninde frenli servo gerekir.
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.

KW

400 Watt

Encoder Tip

İncremental Encoder

Sürücü Kodu

T3L-L20F-RABN

Güç Kablo Kodu

DL-TH-80-A10.0D

Encoder Kablo Kodu

BM-TH-80F-A10.0D

Güç

0.4 Kw

Çalışma Voltajı

220 V AC

Flanş Ölçüsü

60 mm

Frenli Motor

Harici Frenli

Akım

2.8 A

Enkoder

Incremental 2500 PPR

Maksimum Devir

3000 RPM

Model

60ST-M01330

Motor Tipi

AC Servo Motor

Tork

1.27 Nm

Değerlendirmeler

Bu ürün için henüz değerlendirme yok.

Ürün Hakkında Merak Edilenler

Servo Motor Fireni kaç kg Tutar ?

60ST-M01330Z1 kodlu 400W Frenli Servo Motor Seti, dikey eksen uygulamalarında yükün güvenli bir şekilde tutulması ve hassas pozisyonlama yapılması için tasarlanmış profesyonel bir AC servo motor ve T3L-L20F-RABN sürücü setidir. Bu set, 0.4 kW gücünde, 60 mm flanş ölçüsüne sahip motoru ile endüstriyel otomasyon sistemlerinde yüksek dinamik yanıt ve kararlı çalışma sunar. Motorun en kritik özelliği olan harici fren sistemi, sistem enerjisi kesildiğinde veya acil duruş komutu verildiğinde milin otomatik olarak kilitlenmesini sağlar. Bu "fail-safe" yapı, özellikle dikey eksenlerde yerçekimi nedeniyle oluşabilecek kontrolsüz düşmeleri engeller ve operasyonel güvenliği en üst seviyeye taşır. Frenin serbest bırakılması için sürücü üzerinden 24V DC sinyal yönetimi gereklidir. Teknik olarak 220V AC çalışma voltajı ile beslenen bu set, 2.8 A akım değerinde çalışır ve 1.27 Nm nominal tork üretir. 3000 RPM maksimum devir kapasitesine sahip olan motor, 2500 PPR çözünürlüğündeki artımlı enkoderi sayesinde kontrol ünitesine milimetrik pozisyon geri bildirimi sağlar. IP54 koruma sınıfı, motorun toz ve su sıçramalarına karşı dayanıklı olmasını sağlayarak zorlu çalışma ortamlarında uzun ömürlü kullanım imkanı tanır. Kurulum sırasında motorun yönü ile ilgili bir düzeltme yapmanız gerekirse, sürücü üzerinden P-036 parametresini kullanabilirsiniz. P-036 parametresini 0'dan 1'e getirerek mekanik bağlantıları değiştirmeden motorun dönüş yönünü tersine çevirebilirsiniz. Ayrıca, motorun elektriksel karakteristiğinin sürücü tarafından doğru tanınması için motor kodu P-002 parametresinin 10 olarak ayarlanması, sistemin maksimum performansla çalışması için önemlidir. Bağlantılarınızı yaparken setle birlikte gelen DL-TH-80-A10.0D kodlu güç kablosu ve BM-TH-80F-A10.0D kodlu enkoder kablosunu kullanmanız, sinyal bütünlüğü ve elektriksel güvenlik açısından kritik öneme sahiptir. Kabloların blendajlarının doğru topraklanması, yüksek frekanslı gürültü ve parazitlerin sisteminize zarar vermesini önleyecektir. Mermak CNC Otomasyon olarak, sisteminizin uzun ömürlü ve hatasız çalışması için tüm bağlantıların ve parametre ayarlarının teknik dökümanlara uygun şekilde yapılmasını tavsiye ederiz.

Motor yön parametresi nedir ?

60ST-M01330Z1 kodlu 400W Frenli Servo Motor Seti için motor yön parametresi P-036'dır ve bu parametre motorun yönünü ters çevirir. Değerler: 0 = Normal yön, 1 = Ters yön. Eğer motor yönü ters ise P-036 parametresini 1 yaparak mekanik veya elektriksel düzeni değiştirmeden yönü düzeltebilirsiniz. Bu muhteşem ürünü seçmekle en doğru tercihi yaptınız! Motor yönü parametresi P-036, servo sürücünüzde pulse giriş yönünü kontrol eder. Motorunuz komut verildiğinde ters yönde dönüyorsa, P-036 parametresini 1 yapmanız yeterlidir. Bu sayede mekanik bağlantılarla uğraşmadan, sadece yazılımsal ayar ile yönü düzeltebilirsiniz. Parametre ayarı için: 1. Servo sürücünüzün parametre menüsüne girin. 2. P-036 parametresini bulun. 3. Değerini 0'dan 1'e değiştirin (veya tam tersi). 4. Değişikliği kaydedin ve sürücüyü yeniden başlatın. Bu ayar, motorun yönünü tersine çevirir ve sisteminizin sorunsuz çalışmasını sağlar. Ayrıca, motor kodu P-002 = 10 olarak ayarlanmalıdır ki bu motorun elektriksel karakteristiği doğru tanımlansın ve performans maksimum olsun. Daha fazla teknik destek veya satın alma için lütfen 400W Frenli Servo Motor Seti 60ST-M01330Z1 + T3a-L20F-RABF ürün sayfamızı ziyaret edin veya 05346585401 numaralı telefondan bize ulaşın. Birlikte en doğru ve uzun ömürlü kullanımı sağlayalım! Özet parametreler: Parametre Kodu Açıklama Değerler Varsayılan P-036 Pulse Input Direction (Pulse Giriş Yönü) 0 = Normal, 1 = Ters 0 P-002 Motor Code (Motor Kodu) 10 (60ST-M01330 için) 10 P-000 Parametre Şifresi 385 385 Motor yönü ile ilgili sorun yaşarsanız, P-036 parametresini kontrol etmek ve gerektiğinde değiştirmek en hızlı çözümdür. Başka sorularınız için her zaman yanınızdayız!

400W Frenli Servo Motor Seti 60ST-M01330Z1 T3L-L20F-RABN nedir?

400W Frenli Servo Motor Seti 60ST-M01330Z1 T3L-L20F-RABN, endüstriyel otomasyon sistemlerinde hassas pozisyonlama, hız ve tork kontrolü gerektiren eksen hareketleri için tasarlanmış profesyonel bir AC servo motor ve sürücü setidir. Bu set, 0.4 kW gücünde 60ST-M01330 model motor ve T3L-L20F-RABN sürücüden oluşmaktadır. Sistem, 220 V AC çalışma voltajı ile beslenir ve 2.8 A akım değerine sahiptir. Motor, 1.27 Nm nominal tork üretirken 3000 RPM maksimum devir hızına ulaşabilir. 60 mm flanş ölçüsü sayesinde standart mekanik bağlantılara kolayca uyum sağlar. Setin en önemli özelliklerinden biri, motor üzerinde bulunan harici elektromanyetik frendir. Bu fren, özellikle dikey eksen uygulamalarında enerjinin kesildiği veya acil duruş durumlarında yükün olduğu yerde sabitlenmesini sağlayarak mekanik güvenliği artırır. Geri besleme ünitesi olarak 2500 PPR çözünürlüğünde artımlı enkoder (Incremental Encoder) kullanılır. Bu yüksek çözünürlük, sürücünün motor milinin konumunu milimetrik hassasiyetle takip etmesine olanak tanır. T3L-L20F-RABN sürücü; konum, hız ve tork kontrol modlarını destekler. Ayrıca 500 kHz’e kadar diferansiyel darbe girişi, analog komutlar ve RS485 Modbus RTU haberleşme protokolü üzerinden kontrol edilebilir. Kurulum aşamasında motor yönü ile ilgili bir düzeltme yapmanız gerekirse, sürücü parametre menüsünden P-036 parametresini kullanabilirsiniz. P-036 parametresi 0 olarak ayarlandığında normal yön, 1 olarak ayarlandığında ise ters yön aktif olur. Ayrıca motorun elektriksel karakteristiğinin sürücü tarafından doğru tanınması için P-002 parametresinin 10 olarak ayarlanması önerilir. Bağlantı tarafında set ile birlikte gelen DL-TH-80-A10.0D kodlu güç kablosu ve BM-TH-80F-A10.0D kodlu enkoder kablosu, sistemin güvenli ve parazitsiz çalışması için tasarlanmıştır. Montaj sırasında kabloların blendajlı yapısının korunması ve topraklama hattının doğru yapılması, sinyal bütünlüğü ve sistem kararlılığı açısından kritiktir. Mermak CNC Otomasyon olarak, bu servo motor setini seçerken uygulamanızın tork ve hız gereksinimlerini, dikey eksen ise fren ihtiyacını ve sürücü haberleşme altyapınızı göz önünde bulundurmanızı öneririz. Yanlış güç veya tork seçimi, motorun sürekli aşırı yük altında kalmasına veya mekanik sistemin istenen performansı verememesine neden olabilir. Teknik destek veya doğru ürün eşleşmesi konusunda her zaman Mermak CNC Otomasyon uzmanlarına danışabilirsiniz.

400W Frenli Servo Motor Seti 60ST-M01330Z1 T3L-L20F-RABN nerelerde kullanılır?

400W Frenli Servo Motor Seti 60ST-M01330Z1 T3L-L20F-RABN, özellikle dikey eksenlerde yük tutma gereksinimi olan ve hassas pozisyonlama isteyen endüstriyel otomasyon projelerinde tercih edilen bir hareket kontrol çözümüdür. 1.27 Nm tork değeri ve 3000 RPM maksimum devir kapasitesi ile CNC routerlar, freze tezgahları, robotik kollar ve otomatik montaj hatları gibi sistemlerde eksen sürüşü için kullanılır. Bu setin en belirgin özelliği, motor miline entegre edilmiş harici fren sistemidir. Enerji kesildiğinde veya acil duruş komutu verildiğinde devreye giren bu fren, dikey eksenlerde yerçekimi nedeniyle oluşabilecek kontrolsüz düşüşleri engeller. Frenin sağlıklı çalışması için sürücüden gelen 24V DC sinyal yönetimi kritik öneme sahiptir. Fren bırakma ve devreye girme zamanlamalarının, sistemin ataletine ve yavaşlama rampasına uygun şekilde sürücü parametreleri üzerinden ayarlanması gerekir. Sistem kurulumunda 2500 PPR artımlı enkoderin geri besleme sinyallerinin korunması, operasyonel kararlılık için hayati bir adımdır. Enkoder kablosunun blendajlı olması ve doğru topraklanması, endüstriyel ortamlardaki elektromanyetik parazitlerin (EMI) sinyal kalitesini bozmasını engeller. Uzun kablo mesafelerinde sinyal bütünlüğünü korumak için mutlaka kaliteli, bükümlü çift (twisted-pair) kablolar kullanılmalıdır. Kullanıcıların bu seti devreye almadan önce mekanik ve elektriksel uyumluluğu kontrol etmeleri gerekir. 60 mm x 60 mm flanş ölçüsü ve 14 mm mil çapı, mevcut mekanik aktarım sisteminizle (redüktör, kaplin veya vidalı mil) uyumlu olmalıdır. Ayrıca, 220V AC çalışma voltajı ve 2.8 A akım değerleri, besleme hattınızın ve sürücü çıkış kapasitenizin bu yükü karşılayıp karşılamadığını doğrulamak için önemlidir. Yüksek çevrimli uygulamalarda motorun termal yükünü göz önünde bulundurmalısınız. IP54 koruma sınıfı, motoru toz ve su sıçramalarına karşı korusa da, sürekli yüksek tork altında çalışacak sistemlerde motor gövdesinin ısı dağılımı için yeterli havalandırma alanına sahip olduğundan emin olunmalıdır. Mermak CNC Otomasyon teknik destek ekibi, sisteminize en uygun konfigürasyonu belirlemek ve parametre ayarlarını teyit etmek için projenizin mekanik yük ve hız gereksinimlerini değerlendirmenize yardımcı olabilir. Yanlış bir motor veya sürücü seçimi, sistemin kararsız çalışmasına veya mekanik aksamın zorlanmasına neden olabileceğinden, kurulum öncesi tüm bağlantıların ve parametrelerin sisteminize özel olarak doğrulanması önerilir.

400W Frenli Servo Motor Seti 60ST-M01330Z1 için sürücü parametre ayarları nasıl yapılır?

400W Frenli Servo Motor Seti 60ST-M01330Z1 (T3L-L20F-RABN) Parametre Ayarları

60ST-M01330Z1 motor ve T3L-L20F-RABN sürücü setinizin devreye alınması ve performans optimizasyonu için aşağıda belirtilen temel parametrelerin kontrol edilmesi gerekmektedir. Parametre değişikliği yapmadan önce sürücünün "Servo Enable" (SON) sinyalinin kapalı olduğundan emin olunuz.

Parametre İsim Varsayılan Değer Açıklama
P-000 Operasyon Şifresi 315 Parametre değişikliği için 385 olarak girilmelidir.
P-002 Motor Kodu * Motor modelinize uygun kod (Motor etiketine göre seçilmelidir).
P-004 Kontrol Modu 0 0: Pozisyon, 1: Hız, 2: Tork kontrolü.
P-005 1. Hız Döngüsü Kazancı 50 Hız tepkisini artırmak için artırılabilir.
P-006 1. Hız Döngüsü İntegral Zaman Sabiti 20 Sistem rijitliğini artırmak için azaltılabilir.
P-009 1. Pozisyon Döngüsü Kazancı 40 Pozisyon takibini iyileştirmek için artırılabilir.
P-025 Hız Komut Kaynağı 0 0: Analog giriş, 1: Dahili çoklu hız.
P-026 Tork Komut Kaynağı 0 0: Analog giriş, 1: Dahili tork.
P-075 Maksimum Hız Limiti 3500 Motorun maksimum devir sınırı (RPM).
P-076 JOG Çalışma Hızı 100 JOG modundaki çalışma hızı (RPM).
P-099 Motor Seri Kodu 0 Motor serisine göre (F1-MG, F4-WG vb.) ayarlanmalıdır.
P-165 Motor Durma Hızı Algılama 5 Motorun durduğunu algılamak için hız eşiği (RPM).
P-166 Fren Gecikme Süresi (Dururken) 300 Motor durduğunda frenin devreye girme süresi (ms).
P-169 Fren Açılma Gecikme Süresi 300 Servo enable sonrası frenin açılma süresi (ms).

Önemli Uyarılar

  • Parametre Kaydı: Değiştirdiğiniz parametrelerin kalıcı olması için "E-SET" (Parametre Yazma) işlemini gerçekleştirmeniz ve sürücüyü kapatıp açmanız gerekmektedir.
  • Fren Kontrolü: Frenli motorlarda, frenin doğru zamanlamayla açılması (P-169) ve kapanması (P-166) dikey eksenlerde yükün düşmemesi için kritiktir.
  • Motor Kodu: Motorunuzun doğru çalışması için P-002 (Motor Kodu) ve P-099 (Motor Seri Kodu) değerlerinin, motor etiketindeki bilgilere göre "Motor Adaptation Table" (Motor Adaptasyon Tablosu) içerisinden seçilmesi zorunludur.
  • Hata Durumu: "Err-4" (Pozisyon hatası) alıyorsanız, P-080 (Pozisyon tolerans algılama) değerini kontrol ediniz. "Err-2" veya "Err-11" alıyorsanız, güç bağlantılarını ve topraklamayı gözden geçiriniz.

T3L-L20F-RABN sürücü için 400W Frenli Servo Motor Seti hata kodları ve çözüm önerileri nelerdir?

400W Frenli Servo Motor Seti (60ST-M01330Z1 / T3L-L20F-RABN) Hata Kodları ve Çözüm Önerileri

T3L-L20F-RABN sürücünüzde karşılaşılabilecek yaygın hata kodları, olası nedenleri ve çözüm yöntemleri aşağıda listelenmiştir. Sisteminizde bir alarm oluştuğunda, sürücü panelinde "Err" ile başlayan bir kod yanıp sönecektir.

Kod Anlamı Olası Neden Çözüm Önerisi
Err 1 Aşırı Hız (Speeding) Motor hızı maksimum limit değerini aşmıştır. Servo kazanç ayarlarını (gn) kontrol edin, aşırı yükü azaltın.
Err 2 Ana Devre Aşırı Voltaj Besleme voltajı çok yüksek veya frenleme enerjisi fazla. Giriş voltajını ölçün, frenleme direncini ve yükü kontrol edin.
Err 3 Ana Devre Düşük Voltaj Besleme voltajı çok düşük. Giriş voltajını kontrol edin, bağlantıların gevşek olup olmadığına bakın.
Err 4 Pozisyon Tolerans Hatası Pozisyon sapması belirlenen limiti aşmıştır. P-080 parametresini kontrol edin, mekanik sıkışma olup olmadığına bakın.
Err 5 Pozisyon Komut Frekansı Hatası Komut frekansı izin verilen maksimum değeri aşmıştır. Kontrol ünitesinden gelen pals frekansını düşürün, P-029/P-030 oranlarını kontrol edin.
Err 6 Motor Durdu (Stall) Motor mekanik olarak kilitlenmiş veya yanlış bağlanmış olabilir. Motor kablo faz sırasını (U, V, W) kontrol edin, mekanik yükü inceleyin.
Err 7 Sürücü Yasaklama Hatası CCWL/CWL limit anahtarları tetiklenmiş veya yanlış bağlanmış. Limit anahtarı kablolarını kontrol edin, P-097 parametresi ile limit kullanımını doğrulayın.
Err 9 Enkoder ABZ Sinyal Hatası Enkoder sinyali kesik veya parazitli. Enkoder kablosunun blendajını ve bağlantılarını kontrol edin.
Err 12 Aşırı Akım Motor sargılarında kısa devre veya sürücü arızası. Motor kablolarını ve motor sargılarını kontrol edin.
Err 13 Aşırı Yük (Overload) Motor sürekli olarak nominal yükün üzerinde çalışıyor. Mekanik yükü azaltın, hızlanma/yavaşlama sürelerini artırın.
Err 29 Kullanıcı Tork Aşırı Yükü İşlemci çevresel mantık devresi hatası. Sürücüyü yeniden başlatın, sorun devam ederse teknik destek alın.

Önemli Teknik Notlar

  • Motor Yönü: Motorunuz komut verildiğinde ters yönde dönüyorsa, mekanik bağlantıları değiştirmek yerine P-036 parametresini 0'dan 1'e (veya 1'den 0'a) değiştirerek yazılımsal olarak düzeltebilirsiniz.
  • Fren Kontrolü: Frenli motorlarda, frenin serbest kalması için sürücüden gelen BRK sinyalinin doğru yapılandırıldığından emin olun. Frenin devreye girmesi ve bırakılması için P-166, P-167 ve P-169 parametreleri kritik zamanlama ayarlarını içerir.
  • Parametre Kaydı: Yapılan tüm değişikliklerin kalıcı olması için parametre ayarlarından sonra "Parameter Write" (E-SET) işlemini gerçekleştirmeyi unutmayın.

400W Frenli Servo Motor Seti 60ST-M01330Z1 için güç ve enkoder kablo bağlantı şeması nedir?

60ST-M01330Z1 Frenli Servo Motor ve T3L-L20F-RABN Sürücü Bağlantı Şeması

400W Frenli Servo Motor Seti (60ST-M01330Z1) ve T3L-L20F-RABN sürücü için güç ve enkoder bağlantıları, sistemin kararlı çalışması ve motorun hassas kontrolü için kritik öneme sahiptir. Aşağıdaki tablolar, sürücü üzerindeki terminal gruplarına göre bağlantı detaylarını içermektedir.

1. Güç ve Motor Bağlantıları (Strong Current Terminals)

Terminal Grubu Terminal Sembolü Bağlantı Notlar
Ana Güç Girişi R, S, T 220V AC (Tek Faz veya Üç Faz) L serisi sürücüler için 220V AC giriş.
Motor Güç Çıkışı U, V, W Servo Motor U, V, W Fazları Motor faz sırası sürücü ile birebir eşleşmelidir.
Topraklama PE Toprak Hattı Motor gövdesi ve sürücü mutlaka topraklanmalıdır.
Fren Bağlantısı P, BK Harici Frenleme Direnci Dahili direnç yetersiz kaldığında kullanılır.

2. Enkoder ve Kontrol Sinyal Bağlantıları (CN1 ve CN2)

Terminal Fonksiyon Açıklama Yaygın Hata
CN2 Motor Enkoder Portu Motor üzerindeki 2500 PPR enkoder sinyalleri Kablo blendajının topraklanmaması (gürültüye neden olur).
CN1 Kontrol Sinyalleri Pulse, Direction, Servo Enable (SON) Sinyal kablolarının güç kabloları ile aynı kanaldan geçirilmesi.

Önemli Teknik Uyarılar:

  • Kablo Mesafesi: Komut kabloları 3 metreyi, enkoder kabloları 20 metreyi geçmemelidir.
  • Parazit Koruması: Güç hatları (motor kabloları, besleme kabloları) ile sinyal hatları arasında en az 30 cm mesafe bırakılmalı ve aynı kanaldan geçirilmemelidir.
  • Fren Kontrolü: Frenli motorlarda, frenin serbest kalması için 24V DC besleme gereklidir. Frenin enerjisi kesildiğinde motor mili mekanik olarak kilitlenir.
  • Motor Yönü: Eğer motor komut verildiğinde ters yönde dönüyorsa, mekanik bağlantıyı değiştirmek yerine P-036 parametresini 0'dan 1'e (veya 1'den 0'a) değiştirerek yazılımsal olarak düzeltebilirsiniz.
  • Motor Tanımlama: Setin tam performansla çalışması için motor kodu P-002 parametresinin 10 olarak ayarlandığından emin olun.
Alışveriş Sepeti
Ürün
400W Frenli Servo Motor Seti 60ST-M01330Z1 T3L-L20F-RABN
Orijinal fiyat: 34,603.36₺.Şu andaki fiyat: 20,033.52₺.
⚙ 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