%42 İndirim
, , ,

750W Servo Motor Seti 80AST-A1C02430 T3D-L20A-RABF

Orijinal fiyat: 17,639.98₺.Şu andaki fiyat: 10,212.62₺.

En İyi Kalite En İyi Fiyat Garantisi

Uygunluk: 89 adet stokta

Stok kodu: 80AST-A1C02430 Kategoriler: , , , Marka:
🔥 Sadece Bugüne Özel %42 İndirim Fırsatı!📦 Kategori: 80 Flanş Servo Motor🏷️ KW: 750 Watt🏷️ Encoder Tip: Absolute encoder🏷️ Sürücü Kodu: T3D-L20A-RABF🏷️ Güç Kablo Kodu: DL-TH-60-A10.0D🏷️ Encoder Kablo Kodu: BM-TH-80AI-A10.0F
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.

Ürün Tanıtım Ve Eğitim Videoları

▶ Video Galeri

750W Servo Motor Seti 80AST-A1C02430 T3D-L20A-RABF Video İçerikleri

3 video bulundu. Videoyu popup olarak izlemek için görsele tıklayın.

17 bit ast motor çeşitleri 1 kW ve 750 watt ayrıca 400 watt seçenekleri ile

750 watt 17 bit servo motor ve sürücü seti

750W Servo Motor Seti 80AST-A1C02430 T3D-L20A-RABF

ENDÜSTRİYEL OTOMASYON PARÇALARI | Üstün Performans Serisi

Ürün Hakkında Detaylı İnceleme

Mermak CNC’nin üstün performans serisinden 750W Servo Motor Seti, 80AST-A1C02430 servo motoru ve T3D-L20A-RABF servo sürücüsü ile endüstriyel otomasyon uygulamaları için tasarlanmış, yüksek hassasiyetli bir hareket kontrol çözümüdür. Bu entegre set, kritik öneme sahip üretim süreçlerinde milimetrik düzeyde konumlandırma, dinamik hız kontrolü ve yüksek tork kapasitesi sunarak sistemlerinizi maksimum verimlilikle çalıştırmanızı sağlar.

Gelişmiş 17-bit mutlak encoder teknolojisi sayesinde güç kesintilerinde dahi mutlak konum bilgisini koruyarak yeniden referanslama ihtiyacını ortadan kaldırır. IP65 koruma sınıfıyla zorlu endüstriyel ortamlarda dahi toz ve suya karşı üstün dayanıklılık gösterir. Bu set, modern fabrika otomasyonu, CNC makineleri, robotik sistemler ve hassas üretim hatları için vazgeçilmez bir bileşendir.

Öne Çıkan Avantajlar

  • Yüksek Hassasiyetli Konumlandırma (17-bit Mutlak Encoder): Mekanik sistemlerde milimetrik altı düzeyde kontrol sağlayarak tekrarlanabilirliği ve üretim kalitesini artırır. Güç kesintisi sonrası konum bilgisini koruyarak referanslama ihtiyacını ortadan kaldırır.
  • Dinamik Performans ve Hızlı Tepki (3000 RPM Anma Hızı, 6000 RPM Maksimum Hız): Yüksek hızlanma ve yavaşlama kabiliyetleri sayesinde üretim döngü sürelerini kısaltır, verimliliği optimize eder ve dinamik yük değişimlerine anında adapte olur.
  • Endüstriyel Dayanıklılık (IP65 Koruma Sınıfı): Toz, kir ve su sıçramalarına karşı tam koruma sunarak zorlu fabrika ortamlarında kesintisiz ve güvenilir çalışma sağlar, bakım maliyetlerini düşürür ve sistem ömrünü uzatır.
  • Geniş Uygulama Esnekliği (Çoklu Çalışma Modları ve Koruma Özellikleri): Pozisyon, hız ve tork kontrolü gibi farklı modları desteklemesi ve aşırı gerilim, düşük gerilim, aşırı yük gibi durumlara karşı entegre korumaları ile sistem güvenliğini ve adaptasyon yeteneğini artırır.

Proje ve Teknik Destek: Bu ürünün sisteminize uyumluluğu veya doğru seçimi konusunda kararsızsanız, teknik mühendislerimizden ücretsiz destek alabilirsiniz. Hızlı Teknik Soru Sor butonu ile bize ulaşın.

Daha detaylı bilgi için ürün içinde bulunan Hızlı Teknik Soru Sor butonunu tıklayarak anında cevap alabilirsiniz. Mermak, teknik konularda her zaman yanınızdadır.

Teknik Spesifikasyonlar

Ürünün performans verileri ve fiziksel özellikleri aşağıda detaylandırılmıştır. Bu değerler, sistem tasarımında kritik öneme sahip olup, uygulamanız için doğru seçimi yapmanızda size yol gösterecektir.

Teknik Parametre
Değer / Açıklama
Motor Modeli
80AST-A1C02430
Sürücü Modeli
T3D-L20A-RABF
Nominal Güç
750W (0.75 kW) – Motorun sürekli üretebildiği güç kapasitesidir. Yüksek dinamik yükler altında kararlı performans sunar.
Nominal Tork
2.4 N·m (Newton-metre) – Motorun sürekli olarak uygulayabileceği dönme kuvvetidir. Hassas hareket kontrolünde kritik öneme sahiptir.
Nominal Hız
3000 RPM (Devir/Dakika) – Motorun nominal yük altında kararlı bir şekilde dönebildiği hız limitidir.
Maksimum Hız
6000 RPM (Devir/Dakika) – Kısa süreli pik yüklerde ulaşılabilen en yüksek hız değeridir. Sistem esnekliğini ve hızlanma kabiliyetini artırır.
Nominal Gerilim
220V AC – Endüstriyel otomasyon sistemlerinde yaygın olarak kullanılan standart besleme gerilimidir.
Encoder Tipi
17-bit Mutlak (Absolute) Encoder – 2^17 (131072) pals/devir çözünürlük sunarak milimetrik altı hassasiyette konumlandırma sağlar ve güç kesintisinde mutlak konum bilgisini korur.
Flanş Boyutu
80 mm x 80 mm – Endüstriyel montaj standartlarına (örneğin NEMA uyumlu) uygun flanş ölçüsü, mekanik entegrasyonu kolaylaştırır.
Koruma Sınıfı
IP65 – Katı cisimlere (toz) ve su jetlerine (düşük basınçlı su) karşı tam koruma sağlar, zorlu endüstriyel ortamlarda güvenilir çalışmayı garanti eder.
Kablo Seti
10 Metre Güç Kablosu, 10 Metre Encoder Kablosu, +5V / +24V Sinyal Kablosu – Uzun mesafeli bağlantı imkanı sunan, endüstriyel standartlara uygun, komple kablo seti.
Çalışma Modları
Pozisyon, Hız, Tork Kontrolü – Çeşitli otomasyon senaryolarına uyum sağlayabilen esnek kontrol seçenekleri sunar.
Entegre Koruma
Aşırı gerilim, düşük gerilim, aşırı yük, aşırı akım – Motor ve sürücünün uzun ömürlü ve güvenli çalışmasını sağlayan dahili koruma mekanizmaları.

Endüstriyel Uygulama Alanları

Bu servo motor seti, yüksek performans ve güvenilirlik gerektiren çeşitli endüstriyel sektörlerde geniş bir kullanım yelpazesi sunar:

Robotik ve CNC Uygulamaları

Endüstriyel robot kollarında eksenel hareket kontrolü, hassas parça işleme yapan CNC freze, torna, lazer kesim ve gravür makinelerinde yüksek hızlı ve tekrarlanabilir konumlandırma için kritik bir çözümdür. 17-bit mutlak encoder sayesinde karmaşık yörünge takibi ve milimetrik işleme hassasiyeti sağlar.

Genel Otomasyon ve Üretim Hatları

Paketleme makineleri, montaj hatları, baskı makineleri ve tekstil makineleri gibi sürekli ve dinamik hareket kontrolü gerektiren üretim sistemlerinde kullanılır. Yüksek tork ve hız kapasitesi, üretim verimliliğini artırırken, IP65 koruma sınıfı zorlu ortam koşullarında dahi kesintisiz operasyon sunar.

Operasyonel Avantajlar

Yüksek Verimlilik

Gelişmiş servo kontrol algoritması ve optimize edilmiş motor yapısı sayesinde enerji tüketimini minimize ederken, hızlı tepki süresi ve dinamik performans ile üretim döngü sürelerini kısaltarak genel operasyonel verimliliği artırır.

Uzun Kullanım Ömrü

Yüksek kaliteli malzemeler, sağlam mekanik tasarım ve IP65 koruma sınıf

Birlikte Kullanılabilecek Ürünler

Servo Motor Redüktörleri
    Yüksek Tork ve Hassasiyet İçin:
    80PLF10 Planet Redüktör 1/10 (Servo)

    750W 80AST servo motorunuzla doğrudan uyumlu 80mm flanş yapısı sunar. 1:10 oranı, yüksek tork gerektiren uygulamalarda motorun gücünü artırarak daha hassas konumlandırma ve daha kararlı hareket sağlar. Özellikle ağır yük taşıma veya ince işleme gerektiren sistemler için idealdir.
    Daha Yüksek Hız ve Dengeli Tork İçin:
    80PLF5 Planet Redüktör 1/5 (Servo)

    Yine 80AST servo motorunuzla tam uyumlu 80mm flanşlıdır. 1:5 oranı, 1:10’a göre daha yüksek çıkış hızı sunarken, yine de tork artışı ve atalet uyumu sağlayarak dinamik uygulamalarda verimliliği artırır.
    Nema 34 Flanşlı Servo Motorlar İçin Alternatif:
    Nema 34 Servo ve Step Planet Redüktörü 1/10 FALCON

    750W servo motorlar genellikle Nema 34 flanş boyutuna sahip olabilir. Bu redüktör, Nema 34 uyumlu motorlar için 1:10 oranıyla yüksek tork ve hassasiyet sunar. Hem servo hem de step motorlarla kullanılabilme esnekliği sağlar.
    Nema 34 Flanşlı Servo Motorlar İçin Hız Odaklı Alternatif:
    Nema 34 Servo ve Step Planet Redüktörü 1/5 FALCON

    Nema 34 flanşlı 750W servo motorlar için 1:5 oranıyla daha yüksek hız ve dengeli tork artışı sunar. Hızlı hareket gerektiren uygulamalarda tercih edilebilir.
    Genel Amaçlı Yüksek Hız Uygulamaları İçin:
    Servo Planet Redüktör 1/3

    Daha düşük bir oran (1:3) ile motor hızını minimum düzeyde düşürürken, torku artırır ve atalet uyumunu iyileştirir. Çok yüksek hız gerektiren ancak yine de bir miktar tork artışına ihtiyaç duyan uygulamalar için uygundur.
    Genel Amaçlı Dengeli Uygulamalar İçin:
    Servo Planet Redüktör 1/5

    Çok yönlü bir oran olan 1:5, hız ve tork arasında iyi bir denge sunar. Çoğu orta seviye hız ve tork gerektiren servo uygulamaları için genel bir çözümdür.
    Genel Amaçlı Yüksek Tork Uygulamaları İçin:
    Servo Planet Redüktör 1/10

    Yüksek tork ve hassasiyetin ön planda olduğu genel servo uygulamaları için idealdir. Motorun çıkış torkunu önemli ölçüde artırarak ağır yükleri kontrol etme yeteneğini geliştirir.
CNC Kontrol Üniteleri ve Mach3 Kartları
    Yüksek Performanslı 4 Eksen Mach3 Kontrolü (USB):
    4 Eksen Usb Mach3 Cnc Kart 2000 Khz

    2000 KHz pulse çıkış frekansı ile çok hızlı ve hassas hareket kontrolü sağlar. USB bağlantısı sayesinde modern bilgisayarlarla kolayca entegre olur ve Mach3 yazılımı ile geniş uyumluluk sunar. Yüksek hızlı ve hassas CNC makineleri için idealdir.
    Gelişmiş 5 Eksen Mach3 Kontrolü (USB):
    5 Eksen Cnc Usb Kontrol Kartı Mach3 Kart Green

    5 eksen desteği ile daha karmaşık ve çok yönlü CNC uygulamaları için uygundur. USB bağlantısı ile kolay kurulum ve kullanım sunar, Mach3 yazılımının tüm özelliklerinden faydalanmanızı sağlar.
    Bağımsız ve Sağlam 4 Eksen Kontrol Ünitesi:
    4 Eksen Cnc Kontrol Ünitesi Smc 4-4-16A16B

    Bilgisayar bağımlılığını ortadan kaldıran bağımsız bir kontrol ünitesidir. Entegre ekranı ve tuş takımı ile kolay programlama ve operasyon imkanı sunar. Endüstriyel ortamlarda kararlı ve güvenilir performans sağlar.
    Profesyonel El Çarklı 4 Eksen Kontrol Ünitesi:
    4 Eksen Kontrol Ünitesi M002-16A-16B (Profosyenel El Çarklı)

    Profesyonel el çarkı ile manuel hareketlerde yüksek hassasiyet ve kolaylık sunar. Bağımsız çalışma özelliği ve gelişmiş kontrol yetenekleri ile operatör konforunu ve işleme kalitesini artırır.
    Bağımsız 5 Eksen Kontrol Ünitesi:
    5 Eksen CNC Kontrol Ünitesi SMC5-5-N-N

    5 eksenli bağımsız kontrol yeteneği ile karmaşık geometrilerin işlenmesi ve çok eksenli robotik uygulamalar için idealdir. Bilgisayar bağlantısı olmadan çalışabilme avantajı sunar.
    Kapsamlı 4 Eksen Kontrol Paketi:
    Adt-Cnc4640 4 Eksen Freze Kontrol Ünitesi + El Çarkı + Klavye

    El çarkı ve klavye gibi ek aksesuarlarla birlikte gelen kapsamlı bir 4 eksen kontrol çözümüdür. Kullanıcıya tam bir kontrol deneyimi sunarak iş akışını hızlandırır ve kolaylaştırır.
    Modern ve Kullanıcı Dostu 4 Eksen Kontrol Ünitesi:
    Ddcs V4.1 Cnc Kontrol Ünitesi 4 Eksen + El Çarkı

    Modern arayüzü ve el çarkı entegrasyonu ile kullanıcı dostu bir deneyim sunar. 4 eksen kontrolü ile geniş bir uygulama yelpazesine hitap eder ve hassas manuel kontrol imkanı sağlar.
    Kompakt USB 4 Eksen Kontrol Paneli:
    TC55H 4 eksenli USB CNC Kontrol Paneli

    Kompakt tasarımı ve USB bağlantısı ile kolay taşınabilirlik ve hızlı kurulum sunar. Küçük ve orta ölçekli CNC makineleri için pratik ve etkili bir 4 eksen kontrol çözümüdür.
    Endüstriyel DSP Kontrol Paneli (3 Eksen):
    DSP Kontrol Paneli 0501 3 Eksen Cnc Kontrol Paneli Seti

    DSP tabanlı kontrol, yüksek kararlılık ve güvenilirlik sunar. Özellikle endüstriyel ortamlarda bilgisayar kaynaklı sorunları minimize ederek kesintisiz çalışma sağlar. 3 eksenli freze uygulamaları için yaygın olarak tercih edilir.
    Yüksek Performanslı 3 Eksen Mach3 Kontrolü (USB):
    3 Eksen Usb Mach3 Kontrol Kartı 2000 Khz

    3 eksenli uygulamalar için yüksek pulse frekansı (2000 KHz) ile üstün hız ve hassasiyet sunar. USB bağlantısı ile kolay entegrasyon ve Mach3 yazılımının avantajlarından faydalanma imkanı sağlar.
    Komple 4 Eksen Freze Kontrol Seti:
    4 Eksen Cnc Freze Kontrol Ünitesi Paneli + Tuş Takımı + El Çarkı Seti

    Tümleşik tuş takımı ve el çarkı ile eksiksiz bir 4 eksen freze kontrol deneyimi sunar. Kurulumu kolay ve kullanıma hazır bir paket olup, profesyonel CNC uygulamaları için idealdir.
    Basit ve Etkili 3 Eksen Freze Kontrol Seti:
    3 Eksen Cnc Freze Kontrol Ünitesi Paneli + El Çarkı Seti

    Daha basit 3 eksenli freze uygulamaları için uygun maliyetli ve etkili bir çözümdür. El çarkı ile manuel kontrol kolaylığı sunar ve temel CNC ihtiyaçlarını karşılar.

“750W Servo Motor Seti 80AST-A1C02430 T3D-L20A-RABF”, endüstriyel otomasyon uygulamalarında yüksek hassasiyetli konum, hız ve tork kontrolü sağlamak üzere tasarlanmış, 750 Watt gücünde bir AC servo motor ve bu motorla uyumlu bir servo sürücüden (driver) oluşan entegre bir sistemdir. Bu set, motorun entegre enkoderi aracılığıyla sürekli geri besleme alarak sürücü tarafından kapalı döngü kontrol prensibiyle çalışır; bu sayede dinamik yük koşullarında bile milimetrik hassasiyette hareket ve yüksek tekrarlanabilirlik sunar. Özellikle CNC makineleri, robotik sistemler, paketleme, tekstil ve baskı makineleri gibi hızlı tepki süresi, yüksek doğruluk ve kararlı hareket profilleri gerektiren uygulamalarda kritik bir bileşendir.

750W Servo Motor Seti 80AST-A1C02430 T3D-L20A-RABF Hakkında Merak Edilenler ve Teknik Detaylar

750W Servo Motor Seti 80AST-A1C02430 T3D-L20A-RABF kaç volt ile beslenmeli ve tam gücünde çalışırken yaklaşık kaç amper çeker?

80AST-A1C02430 servo motor, 220V AC anma gerilimi ile beslenmelidir. 750W gücünde ve 220V AC beslemede, yaklaşık 3.4 Amper (750W / 220V) anma akımı çekecektir. Sürücü kayıpları ve sistemsel verimsizlikler göz önüne alındığında, besleme ünitenizi seçerken bir miktar güvenlik payı bırakmanız önerilir.

Bu servo motor 2.4 N·m anma torkunu ve 3000 RPM anma hızını hangi çalışma koşullarında sürekli olarak sağlayabilir?

Motor, 2.4 N·m anma torkunu 3000 RPM anma hızında sürekli olarak sağlayacak şekilde tasarlanmıştır. Bu değerler, motorun nominal çalışma koşulları altında, belirtilen 750W gücü ürettiği ve uzun ömürlü çalışması için ideal performans noktalarını gösterir.

80AST-A1C02430 motoru 6000 RPM maksimum hızda sürekli çalıştırabilir miyim, yoksa bu sadece kısa süreli bir pik değer midir?

6000 RPM, motorun ulaşabileceği maksimum hız değeridir. Bu hızda sürekli çalışma, motorun ömrünü kısaltabilir veya aşırı ısınmaya neden olabilir. Motorun anma hızı 3000 RPM olup, bu hızda sürekli ve verimli çalışması önerilir. 6000 RPM genellikle kısa süreli hızlanma veya hassas pozisyonlama operasyonları için bir pik değer olarak düşünülmelidir.

Setle gelen 17 bit mutlak encoder’ın endüstriyel uygulamalardaki en büyük avantajı nedir? Elektrik kesintisinde pozisyon bilgisini korur mu?

Evet, 17 bit mutlak encoder’ın en büyük avantajı, elektrik kesintisi yaşandığında dahi motorun mevcut pozisyon bilgisini kesin olarak korumasıdır. Sistem tekrar açıldığında, motorun başlangıç pozisyonunu bulmak için referans noktasına gitmesine (homing) gerek kalmaz, bu da makine başlangıç sürelerini kısaltır ve üretim verimliliğini artırır.

T3D-L20A-RABF sürücüyü PLC’me bağlarken sinyal gerilimi olarak +5V mu yoksa +24V mu tercih etmeliyim?

T3D-L20A-RABF sürücü, hem +5V hem de +24V sinyal gerilimlerini desteklemektedir. PLC’nizin çıkış sinyal gerilimine göre seçim yapmalısınız. Genellikle endüstriyel PLC’ler +24V çıkış sağladığı için bu yaygın olarak tercih edilir. Bağlantı yapmadan önce PLC’nizin teknik dokümanlarını kontrol etmeniz ve doğru sinyal seviyesini ayarlamanız önemlidir.

Setle birlikte gelen 10 metrelik güç ve encoder kabloları bu uzunlukta sinyal kalitesini etkiler mi, yoksa yeterli midir?

Mermak CNC tarafından sağlanan 10 metrelik güç ve encoder kabloları, bu setin nominal çalışma koşullarında sinyal bütünlüğünü koruyacak ve kayıpları minimize edecek şekilde seçilmiştir. Genellikle 10 metreye kadar olan mesafelerde ek bir önleme gerek kalmaz. Ancak, elektromanyetik parazit açısından yoğun bir endüstriyel ortamda çalışıyorsanız, kabloları diğer güç hatlarından ayırmak veya ekranlı kablo kanalları kullanmak performansı daha da artırabilir.

80AST-A1C02430 servo motorun IP65 koruma sınıfı ne anlama geliyor? Hangi çevresel koşullarda kullanılabilir?

IP65 koruma sınıfı, motorun tamamen toz geçirmez olduğunu (ilk rakam 6) ve her yönden düşük basınçlı su jetlerine karşı korunduğunu (ikinci rakam 5) belirtir. Bu sayede, tozlu imalat ortamlarında ve hafif su sıçramalarına maruz kalabilecek uygulamalarda güvenle kullanılabilir. Ancak, suya batırılmaya veya yüksek basınçlı su jetlerine karşı dayanıklı değildir.

Bu 750W servo seti, endüstriyel robotlarda hassas pozisyon kontrolü için direkt kullanılabilir mi, yoksa ek bir kontrolcüye ihtiyaç duyar mı?

Evet, bu set endüstriyel robotlar, gravür makineleri ve otomasyon ekipmanları gibi yüksek hassasiyet gerektiren uygulamalarda pozisyon kontrolü için tasarlanmıştır. T3D-L20A-RABF sürücü, bir PLC veya özel bir hareket kontrol kartından gelen darbe/yön (pulse/direction) sinyalleri veya diğer haberleşme protokolleri aracılığıyla pozisyon kontrolünü doğrudan gerçekleştirebilir. Ek bir servo kontrolcüye değil, uygun bir hareket kontrolörüne (PLC, CNC kontrolcü vb.) ihtiyaç duyar.

Servo motorum normalden fazla ısınıyor gibi hissediyorum. Aşırı ısınma limitleri nelerdir ve bunun olası nedenleri neler olabilir?

Her servo motorun bir miktar ısınması normaldir. Ancak, motorun yüzey sıcaklığı el değmeyecek kadar sıcak hale geliyorsa veya sürücü aşırı ısınma hatası veriyorsa bu bir problem işaretidir. Olası nedenler arasında aşırı yüklenme (2.4 N·m anma torkunun üzerinde sürekli çalışma), düşük besleme gerilimi, yetersiz soğutma, sürücü parametrelerinin yanlış ayarlanması veya mekanik sürtünme sorunları yer alabilir. Sorunu tespit etmek için yük durumunu, besleme gerilimini ve sürücü hata kodlarını kontrol etmenizi öneririz.

T3D-L20A-RABF sürücü ile pozisyon, hız ve tork kontrol modları arasında geçiş yapmak ne kadar kolay? Hangi modlar destekleniyor?

T3D-L20A-RABF sürücü, pozisyon kontrolü, hız kontrolü ve tork kontrolü olmak üzere üç temel çalışma modunu da destekler. Modlar arası geçiş, sürücünün parametre ayarları üzerinden kolayca yapılabilir. Genellikle sürücünün yazılım arayüzü veya dahili DIP anahtarları/tuş takımı aracılığıyla istenilen kontrol modu seçilir ve ilgili parametreler ayarlanır. Detaylı bilgi için sürücünün kullanım kılavuzuna başvurabilirsiniz.

Mermak CNC olarak bu 750W servo motor seti için garanti süresi ne kadar ve garanti kapsamı neleri içeriyor?

Mermak CNC olarak, 750W Servo Motor Seti 80AST-A1C02430 T3D-L20A-RABF için 2 yıl garanti süresi sunmaktayız. Garanti, üretim hatalarına ve malzeme kusurlarına karşı koruma sağlar. Kullanım kılavuzuna uygun olmayan kullanım, yanlış kurulum, aşırı yüklenme veya dış etkenlerden kaynaklanan hasarlar garanti kapsamı dışındadır. Detaylı garanti koşulları için lütfen satış sözleşmenizi veya Mermak CNC ile iletişime geçin.

Motor veya sürücü arızalandığında yedek parça temini veya tamir hizmeti Mermak CNC tarafından nasıl sağlanıyor, tahmini süreler nedir?

Mermak CNC olarak, sattığımız ürünlerin yedek parça teminini ve teknik servis hizmetini sağlamaktayız. Arıza durumunda, öncelikle teknik servisimizle iletişime geçerek sorunun tespiti yapılır. Gerekirse motor veya sürücü ayrı ayrı temin edilebilir. Yedek parça temini ve tamir süreleri, parçanın stok durumuna ve arızanın niteliğine göre değişiklik göstermekle birlikte, müşteri memnuniyetini ön planda tutarak en kısa sürede çözüm üretmeye çalışırız.

Setin ilk kurulumu ve devreye alınması sırasında Mermak CNC’den teknik destek alabiliyor muyuz?

Evet, Mermak CNC olarak müşterilerimize satış sonrası kapsamlı teknik destek sağlıyoruz. 750W Servo Motor Seti 80AST-A1C02430 T3D-L20A-RABF’nin ilk kurulumu, kablolaması, sürücü parametre ayarları ve devreye alınması konularında telefon veya e-posta yoluyla teknik destek ekibimizden yardım alabilirsiniz. Ayrıca, ihtiyaç halinde uzaktan bağlantı veya yerinde destek (ek ücrete tabi olabilir) seçenekleri de değerlendirilebilir.

4.11.2025

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

750 Watt

Encoder Tip

Absolute encoder

Sürücü Kodu

T3D-L20A-RABF

Güç Kablo Kodu

DL-TH-60-A10.0D

Encoder Kablo Kodu

BM-TH-80AI-A10.0F

Güç

0.75 Kw

Motor Tipi

AC Servo Motor

Flanş Ölçüsü

80 mm

Çalışma Voltajı

220 V AC

Frenli Motor

Standart

Akım

4.5 A

Enkoder

17-bit Absolute

Maksimum Devir

3000 RPM

Model

80AST-A1C02430

Tork

2.39 Nm

Değerlendirmeler

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

▶ Video Galeri

750W Servo Motor Seti 80AST-A1C02430 T3D-L20A-RABF Video İçerikleri

3 video bulundu. Videoyu popup olarak izlemek için görsele tıklayın.

17 bit ast motor çeşitleri 1 kW ve 750 watt ayrıca 400 watt seçenekleri ile

750 watt 17 bit servo motor ve sürücü seti

Alışveriş Sepeti
Ürün
750W Servo Motor Seti 80AST-A1C02430 T3D-L20A-RABF
Orijinal fiyat: 17,639.98₺.Şu andaki fiyat: 10,212.62₺.
⚙ 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