, , ,

Step Motor Planetary Gearbox 1/10

199.00$

High-precision planetary gearbox with a 1/10 reduction ratio, designed for industrial automation, robotics, and CNC applications. Features low backlash (<3 arc-min) and NEMA 34 flange compatibility.

Availability: 16 in stock

📦 Category: 1/10 Ratio Planetary Gearbox Varieties
Mermak assuranceFrom factory to end user · importer / main dealer · strong stock
ImporterMain dealer / distributorStrong stockGood priceCorporate invoice

In stock / available to order · 14-day return for standard unused products; conditions may vary for custom size/cut products.

Step Motor Planetary Gearbox 1/10

INDUSTRIAL AUTOMATION PARTS | SUPERIOR PERFORMANCE SERIES

Detailed Product Review

This planetary gearbox is a power transmission mechanism designed to convert the rotational motion and torque of a motor at a specific ratio for industrial automation systems. Its primary function is to reduce the high rotational speed of a stepper or servo motor while increasing the output torque by the reduction ratio. A 1/10 reduction ratio means that for every 10 turns of the motor’s input shaft, the gearbox’s output shaft rotates once, simultaneously providing an approximate 10-fold increase in torque compared to the motor’s nominal torque (excluding efficiency losses). The planetary gear arrangement consists of multiple planet gears rotating around a central sun gear and engaging with an outer ring gear. This configuration distributes the load across multiple gear surfaces, offering higher torque density and longer life in a more compact volume compared to traditional parallel-axis gearboxes. Furthermore, this structural advantage allows for lower inertia and higher torsional rigidity, enabling superior performance in dynamic applications.

The product’s material structure is optimized to withstand demanding industrial conditions. The gears are manufactured from heat-treated, precision-machined alloy steel for high strength and wear resistance. The housing is made from durable aluminum or cast material, offering high rigidity and heat dissipation properties. For system integration, the design compliant with the NEMA 34 flange standard ensures direct mechanical compatibility with many widely available stepper and servo motors. This standardizes the connection between the motor and the gearbox, ensuring ease of mounting. The IP65 protection class indicates that the gearbox is fully protected against dust ingress and resistant to low-pressure water jets, making it suitable for use in humid or dusty industrial environments. This gearbox can be used in a wide range of applications requiring sub-millimeter precision and high torque, such as CNC machining centers, robotic arms, precision positioning tables, packaging machines, and custom automation lines.

Advantages of the Step Motor Planetary Gearbox 1/10

High Precision and Low Backlash: This gearbox is characterized by a backlash value of less than 3 arc-minutes. Backlash is the angular play in a gear system that occurs during direction changes, where the output shaft moves without the input shaft responding. A low backlash value ensures that every micro-step or encoder pulse from the motor is transmitted to the load shaft with minimal loss and immediate response. This feature is critical for tool path accuracy in CNC machines, repeatable positioning in robotic applications, and sub-millimeter positioning accuracy in precision measurement systems. Low backlash increases system rigidity, reduces vibration, and provides a stable motion profile even under dynamic loads.

Wide Motor Compatibility (NEMA 34): The product features flange dimensions (86mm x 86mm) and mounting hole center distances (69.6mm) compliant with the NEMA 34 standard. This standard specifies the mechanical dimensions, mounting interfaces, and shaft characteristics of motors, ensuring mechanical compatibility between products from different manufacturers. NEMA 34 compliance allows the gearbox to be seamlessly integrated with a wide range of stepper and servo motors. This offers system designers flexibility in motor selection, allows for easy adaptation to existing systems, and simplifies spare parts procurement. The ability to switch between different motor types allows for optimization of motor performance according to application requirements.

High Torque Capacity and Efficiency: Despite its compact size, this planetary gearbox boasts a high torque transmission capacity. With a 1/10 reduction ratio, the motor’s nominal torque is multiplied up to ten times at the output shaft, making it ideal for precisely moving heavy loads or for applications requiring high cutting forces. A mechanical efficiency of 95% or higher minimizes energy losses. Efficiency indicates how much of the input power is converted into output power; high efficiency translates to less heat generation, lower energy consumption, and consequently, lower operating costs. This provides significant energy savings in the long run, especially in continuously operating industrial systems, and extends the gearbox’s lifespan by keeping its operating temperature at optimal levels.

Technical Specifications and Capacity

Feature | Value/Description

Reduction Ratio | 1/10 (10:1) – Output torque increase and speed reduction at 10 times the input speed.
Backlash | Less than 3 arc-min – Critical minimum clearance value for high-precision positioning.
Efficiency | 95% and above – High transmission efficiency, minimizing energy loss.
Mounting Compatibility | Fully compatible with NEMA 34 flanged servo and stepper motors (Flange: 86x86mm, Hole Centers: 69.6mm).
Protection Class | IP65 – Fully dust-tight and protected against low-pressure water jets from all directions.
Output Shaft Diameter | 19mm (standard); 14mm and 12.7mm (with ring options) – Different shaft diameter options providing application flexibility.

Technical Frequently Asked Questions (FAQ)

Why is the “backlash” value a critical technical parameter in planetary gearboxes, and what does a value below 3 arc-min signify?

Backlash is the angular clearance in a gearbox between the input shaft and the output shaft when the direction of rotation is reversed. This clearance directly affects the system’s accuracy and repeatability, especially in applications requiring precise positioning. High backlash can lead to positioning errors, vibration, reduced system rigidity, and undesirable oscillations under dynamic loads. A backlash value below 3 arc-minutes indicates that the gearbox is suitable for very high-precision applications. One arc-minute is 1/60th of a degree, so 3 arc-minutes represent a very small angular clearance. This low value ensures that every motor command is transmitted to the load shaft with minimal delay and maximum accuracy, enabling superior performance and part quality in critical applications such as CNC machining, robotic manipulation, and optical alignment.

How does a 1/10 reduction ratio optimize a stepper motor’s performance in industrial applications?

A 1/10 reduction ratio reduces the motor’s high rotational speed by ten times while theoretically increasing the output torque by ten times (approximately 9.5 times considering efficiency losses). This torque increase is vital for industrial applications requiring the movement of heavy loads, acceleration of high-inertia systems, or application of high cutting forces. While stepper motors tend to produce high torque at low speeds, their nominal torque is often limited. Using a gearbox allows smaller motors to handle larger workloads by increasing their nominal torque. Furthermore, reducing the speed allows the motor to operate more stably at lower speeds, enhancing micro-stepping performance and resulting in smoother, vibration-free motion. This combination significantly improves the system’s overall control precision and dynamic response.

What is the technical significance of the IP65 protection class for this planetary gearbox in industrial environments?

The IP (Ingress Protection) code specifies the degree of protection a device offers against solid objects and liquids. The IP65 classification consists of two digits: the first digit indicates protection against solids, and the second against liquids. The ‘6’ signifies that the gearbox is dust-tight, meaning no dust can enter, which is critical in environments like machining, woodworking, or dusty production areas. The ‘5’ indicates that the gearbox is protected against low-pressure water jets from all directions. This means the gearbox can operate in humid environments or be exposed to water during certain cleaning procedures. The IP65 protection class ensures that the gearbox’s internal mechanisms are shielded from environmental contaminants, extending its operational life, reducing maintenance needs, and providing reliable, uninterrupted operation even in harsh industrial conditions.

How do the high-quality alloy steel gears and housing material affect the performance and expected lifespan of the gearbox?

The use of high-quality alloy steel for the gearbox gears ensures that the material possesses high strength, hardness, and wear resistance. These steels typically undergo heat treatment processes (e.g., carburizing or nitriding) to increase surface hardness while maintaining core toughness. These structural properties allow the gears to operate under high torque loads without deformation, extend fatigue life, and minimize wear on the gear surfaces. Consequently, the gearbox’s precision and efficiency are maintained over a long period. The durable aluminum or cast material used for the housing not only protects the internal mechanism from external factors but also effectively dissipates heat generated by the gears, preventing overheating. Good heat management extends the lubricant’s life and reduces tolerance shifts due to thermal expansion of the gears. This material selection forms the basis for the gearbox to deliver high performance, reliability, and a long service life even in demanding industrial environments.

Mermak offers 16 years of experience in industrial automation parts. Our products are stocked at our Ankara Uzay Sanayi factory/warehouse, with up-to-date stock quantities and prices available on our website. Stocked items are dispatched directly from the warehouse without production delays. We ensure careful packaging, meticulous invoice and document follow-up, and utilize reliable logistics partners. The Mermak team closely monitors the shipment process. Upon request, product videos and factory tours are available via WhatsApp or our contact channels. We proudly supply to numerous countries including the United Kingdom, United States, Canada, Australia, Ireland, New Zealand, and South Africa, alongside similar countries and international markets.

Step Motor Güç Hesaplama

Bu mini araç ürün üzerinde hızlı ön kontrol içindir. Detaylı açıklama için tam hesaplayıcıyı açın.

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.

Motorun katalogdaki durma torku değil, çalışacağı devirde kalabilen gerçek tork değeri kullanılmalıdır.Nm
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Dönen sistemdeki mekanik momenttir. Güç, redüktör, fren, pinyon veya mil seçimini doğrudan etkiler.

Nereden bakılır? Motor kataloğundan, torkmetreden, sürücü izleme ekranından veya yük hesabından alınır.

Kontrol: Beklenen giriş aralığı: en az 0.001 Nm. Varsayılan 6 Nm yalnızca örnek başlangıç değeridir.

Step motorlarda devir yükseldikçe tork düşer. Hedef hızdaki rpm değerini girin.rpm
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Dönen takım, motor, spindle, kasnak veya fan hızını belirler. Kesme, tork, güç ve çevresel hız sonuçlarını doğrudan değiştirir.

Nereden bakılır? Spindle/inverter ekranı, motor etiketi, kontrol yazılımı, takometre veya üretici katalog değerinden alınır.

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

İvme, sürtünme, rezonans ve yük değişimleri için eklenecek güvenlik payı.%
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Gerçek sahada oluşacak sürtünme, yaşlanma, darbe, sıcaklık ve ölçüm hataları için ek paydır.

Nereden bakılır? Uygulama riskine göre belirlenir. Sürekli, ağır, dikey veya duruşu kritik sistemlerde artırılır.

Kontrol: Beklenen giriş aralığı: en az 0 %. Varsayılan 40 % 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.

Pano, motor, sürücü ve güç kaynağı sıcak ortamda katalog gücünü aynı rahatlıkta vermez. Kapalı pano ve yaz ayları için önemlidir.°C
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 -20 °C, en fazla 80 °C. Varsayılan 35 °C yalnızca örnek başlangıç değeridir.

Bütün motor, fan, valf ve sürücüler aynı anda tam yükte çalışmıyorsa gerçek pano gücü daha düşük olabilir; yanlış seçilirse pano büyür veya küçük kalır.%
Bu değer neden istenir, nereden bulunur?

Neden gerekli? Oran değeri kayıp, emniyet, eş zamanlı çalışma, verim veya fireyi hesaba katmak için kullanılır.

Nereden bakılır? Saha tecrübesi, üretici verisi, ölçülen fire/kayıp oranı veya kullanım senaryosundan alınır.

Kontrol: Beklenen giriş aralığı: en az 1 %, en fazla 100 %. Varsayılan 70 % yalnızca örnek başlangıç değeridir.

Alan açıklamalarıDeğerler nereden bulunur?
Alan açıklamalarıFormu bölmemesi için açıklamalar ayrı paneldedir. Masaüstünde sağda, mobilde sonuçtan sonra akordeon olarak açılır.
Kullanım alanı

Neden girilir? 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.

Sonuçta neyi etkiler? Sonuç yorumunda risk seviyesi, ürün sınıfı, emniyet payı ve destek notlarını yönlendirir.

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.

Hedef devirde kullanılabilir step motor torku Nm

Neden girilir? Dönen sistemdeki mekanik momenttir. Güç, redüktör, fren, pinyon veya mil seçimini doğrudan etkiler.

Nereden bakılır? Motor kataloğundan, torkmetreden, sürücü izleme ekranından veya yük hesabından alınır.

Sonuçta neyi etkiler? kW hesabı, fren torku, kaplin, redüktör ve mekanik dayanım seçimlerinde kullanılır.

Kontrol: Beklenen giriş aralığı: en az 0.001 Nm. Varsayılan 6 Nm yalnızca örnek başlangıç değeridir.

Motorun hedef çalışma devri rpm

Neden girilir? Dönen takım, motor, spindle, kasnak veya fan hızını belirler. Kesme, tork, güç ve çevresel hız sonuçlarını doğrudan değiştirir.

Nereden bakılır? Spindle/inverter ekranı, motor etiketi, kontrol yazılımı, takometre veya üretici katalog değerinden alınır.

Sonuçta neyi etkiler? Kesme hızı, talaş yükü, tork, güç, rulman ömrü ve maksimum hız yorumlarında kullanılır.

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

Emniyet payı %

Neden girilir? Gerçek sahada oluşacak sürtünme, yaşlanma, darbe, sıcaklık ve ölçüm hataları için ek paydır.

Nereden bakılır? Uygulama riskine göre belirlenir. Sürekli, ağır, dikey veya duruşu kritik sistemlerde artırılır.

Sonuçta neyi etkiler? Önerilen motor, güç kaynağı, kablo, vakum, kompresör veya pano kapasitesini güvenli tarafa taşır.

Kontrol: Beklenen giriş aralığı: en az 0 %. Varsayılan 40 % yalnızca örnek başlangıç değeridir.

Çalışma zorluğu

Neden girilir? 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.

Sonuçta neyi etkiler? Sonuç kartındaki ana değer, risk seviyesi, ürün sınıfı ve teknik öneri bu girdiye göre şekillenir.

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

Bakım ve mekanik durum

Neden girilir? 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.

Sonuçta neyi etkiler? Kablo, sigorta, gerilim düşümü, güç ve pano ısı yükü hesaplarında kullanılı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.

Pano / ortam sıcaklığı °C

Neden girilir? 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.

Sonuçta neyi etkiler? Sonuç kartındaki ana değer, risk seviyesi, ürün sınıfı ve teknik öneri bu girdiye göre şekillenir.

Kontrol: Beklenen giriş aralığı: en az -20 °C, en fazla 80 °C. Varsayılan 35 °C yalnızca örnek başlangıç değeridir.

Eş zamanlı yük oranı %

Neden girilir? Oran değeri kayıp, emniyet, eş zamanlı çalışma, verim veya fireyi hesaba katmak için kullanılır.

Nereden bakılır? Saha tecrübesi, üretici verisi, ölçülen fire/kayıp oranı veya kullanım senaryosundan alınır.

Sonuçta neyi etkiler? Gerçekçi kapasite, maliyet, risk ve ürün sınıfı önerisinde kullanılır.

Kontrol: Beklenen giriş aralığı: en az 1 %, en fazla 100 %. Varsayılan 70 % yalnızca örnek başlangıç değeridir.

Flange / Body Size
Compatible Motor Type
NEMA Size
Reduction Ratio

Değerlendirmeler

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

Shopping Cart
Product
Step Motor Planetary Gearbox 1/10
199.00$
⚙ Tools
Müşteri Destek Merkezi
Sıfırla×
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 torque = num(form,'torque_nm'), rpm = num(form,'rpm'); var kw = torque * rpm / 9550; r = [add('Yaklaşık mekanik güç', kw, 'kW', ''), add('Yaklaşık mekanik güç', kw*1000, 'W', '')]; 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 torqueSm = num(form,'torque_nm'), rpmSm = num(form,'rpm'), safetySm = num(form,'safety_percent')/100; var kwSm = torqueSm * rpmSm / 9550; r = [add('Yaklaşık mekanik güç', kwSm*1000, 'W', ''), add('Yaklaşık mekanik güç', kwSm, 'kW', ''), add('Emniyet paylı seçim gücü', kwSm*(1+safetySm)*1000, 'W', 'Pratik motor seçimi için artırılmış değer')]; 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 dep = num(form,'depth_mm'), wid = num(form,'width_mm'), feedS = num(form,'feed_mm_min'), mf = num(form,'material_factor') || 1, mm = num(form,'machine_margin')/100; var mrr = dep * wid * feedS / 1000; var kwNeed = mrr * mf / 60 / 100; r = [add('Talaş kaldırma hacmi', mrr, 'cm³/dk', ''), add('Yaklaşık güç ihtiyacı', kwNeed, 'kW', 'Kaba malzeme katsayılı tahmin'), add('Emniyet paylı önerilen güç', kwNeed*(1+mm), 'kW', 'Bir üst spindle sınıfı değerlendirilebilir')]; 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 feedSp = num(form,'target_feed_mm_min'); var toolSp = num(form,'max_tool_diameter_mm') || 1; var depSp = num(form,'single_pass_depth_mm'); var widthSp = toolSp * (num(form,'cut_width_percent')/100); var mqSp = num(form,'machine_quality') || 1; var dutySp = num(form,'duty_factor') || 1; var mrrSp = depSp * widthSp * feedSp / 1000; var kwRawSp = mrrSp * mp * dutySp / mqSp; 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.15){ rec = classes[ci]; break; } } var f45 = kwRawSp>0 ? feedSp * Math.sqrt(4.5/kwRawSp) : feedSp; var f75 = kwRawSp>0 ? feedSp * Math.sqrt(7.5/kwRawSp) : feedSp; r = [add('Talaş kaldırma hacmi', mrrSp, 'cm³/dk', ''), add('Yaklaşık gerekli spindle gücü', kwRawSp, 'kW', ''), add('Önerilen spindle sınıfı', rec, 'kW', rec>=7.5?'Ağır üretim veya büyük takım için':'Ön seçim'), add('4.5 kW ile tahmini güvenli F', f45, 'mm/dk', ''), add('7.5 kW ile tahmini güvenli F', f75, 'mm/dk', '')]; 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