Elektrotechnische Berechnungstools für Dolibarr: - Leitungsquerschnittsrechner (DIN VDE 0100-520, DIN VDE 0298-4) - Widerstandsrechner für Potentialausgleich (VDE 0100-534/540) - Selektivitäts-Assistent (VDE 0100-530) Features: - Dark Mode Unterstützung - Responsive Design - PDF-Export - Dolibarr-Berechtigungssystem Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
615 lines
23 KiB
PHP
615 lines
23 KiB
PHP
<?php
|
||
/* Copyright (C) 2026 Eduard Wisch <data@data-it-solution.de>
|
||
*
|
||
* This program is free software: you can redistribute it and/or modify
|
||
* it under the terms of the GNU General Public License as published by
|
||
* the Free Software Foundation, either version 3 of the License, or
|
||
* (at your option) any later version.
|
||
*
|
||
* This program is distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
* GNU General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU General Public License
|
||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
/**
|
||
* \file tools/querschnittsrechner.php
|
||
* \ingroup elektroplanung
|
||
* \brief Leitungsquerschnitt-Rechner nach DIN VDE 0100-520 und DIN VDE 0298-4
|
||
*/
|
||
|
||
// Load Dolibarr environment
|
||
$res = 0;
|
||
if (!$res && file_exists("../../main.inc.php")) {
|
||
$res = @include "../../main.inc.php";
|
||
}
|
||
if (!$res && file_exists("../../../main.inc.php")) {
|
||
$res = @include "../../../main.inc.php";
|
||
}
|
||
if (!$res) {
|
||
die("Include of main fails");
|
||
}
|
||
|
||
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
|
||
require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
|
||
|
||
// Load translation files
|
||
$langs->loadLangs(array("elektroplanung@elektroplanung"));
|
||
|
||
// Security check
|
||
if (!isModEnabled('elektroplanung')) {
|
||
accessforbidden('Module not enabled');
|
||
}
|
||
if (!$user->hasRight('elektroplanung', 'tools', 'read')) {
|
||
accessforbidden('Permission denied');
|
||
}
|
||
|
||
$form = new Form($db);
|
||
|
||
// Page header
|
||
llxHeader('', $langs->trans("ElektroplanungQuerschnittsrechner"), '', '', 0, 0, array(
|
||
'https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js'
|
||
), array(
|
||
'/elektroplanung/css/elektroplanung.css'
|
||
), '', 'mod-elektroplanung page-querschnittsrechner');
|
||
|
||
// Viewport für Mobile
|
||
print '<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">';
|
||
|
||
print load_fiche_titre($langs->trans("ElektroplanungQuerschnittsrechner"), '', 'fa-bolt');
|
||
|
||
print '<div class="fichecenter">';
|
||
?>
|
||
|
||
<!-- Styles sind in /elektroplanung/css/elektroplanung.css -->
|
||
|
||
<div class="ep-calculator">
|
||
<div class="ep-toolbar">
|
||
<button class="butAction" onclick="epBerechnen()">
|
||
<span class="fa fa-search"></span> <?php echo $langs->trans("Calculate"); ?>
|
||
</button>
|
||
<button class="butActionDelete" onclick="epToggleFormulas()">
|
||
<span class="fa fa-calculator"></span> <span id="epFormulaToggleText"><?php echo $langs->trans("ElektroplanungFormelnAnzeigen"); ?></span>
|
||
</button>
|
||
<button class="butAction" onclick="epExportPDF()">
|
||
<span class="fa fa-file-pdf-o"></span> PDF
|
||
</button>
|
||
<button class="butActionDelete" onclick="epResetForm()">
|
||
<span class="fa fa-refresh"></span> <?php echo $langs->trans("Reset"); ?>
|
||
</button>
|
||
</div>
|
||
|
||
<!-- EINGABE SEKTION -->
|
||
<div class="ep-section">
|
||
<div class="ep-section-title">
|
||
<span class="fa fa-bolt"></span> <?php echo $langs->trans("ElektroplanungEingabeNetzart"); ?>
|
||
</div>
|
||
|
||
<div class="ep-form-group" style="margin-bottom: 15px;">
|
||
<label><?php echo $langs->trans("ElektroplanungEingabeart"); ?>:</label>
|
||
<div class="ep-radio-group">
|
||
<label class="ep-radio-label">
|
||
<input type="radio" name="inputType" value="strom" checked onchange="epToggleInputType()">
|
||
<span><?php echo $langs->trans("ElektroplanungStrom"); ?> (A)</span>
|
||
</label>
|
||
<label class="ep-radio-label">
|
||
<input type="radio" name="inputType" value="leistung" onchange="epToggleInputType()">
|
||
<span><?php echo $langs->trans("ElektroplanungLeistung"); ?> (kW)</span>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="ep-form-grid">
|
||
<div class="ep-form-group" id="epStromInput">
|
||
<label><?php echo $langs->trans("ElektroplanungStrom"); ?> <span class="ep-unit">[A]</span></label>
|
||
<input type="number" id="epStrom" value="16" step="0.1" min="0">
|
||
</div>
|
||
|
||
<div class="ep-form-group" id="epLeistungInput" style="display: none;">
|
||
<label><?php echo $langs->trans("ElektroplanungLeistung"); ?> <span class="ep-unit">[kW]</span></label>
|
||
<input type="number" id="epLeistung" value="3.68" step="0.01" min="0">
|
||
</div>
|
||
|
||
<div class="ep-form-group">
|
||
<label><?php echo $langs->trans("ElektroplanungNetzart"); ?>:</label>
|
||
<select id="epNetzart" onchange="epUpdateSpannung()">
|
||
<option value="1ph230">1-phasig 230V (AC)</option>
|
||
<option value="3ph400" selected>3-phasig 400V (Drehstrom)</option>
|
||
<option value="dc12">12V DC</option>
|
||
<option value="dc24">24V DC</option>
|
||
<option value="dc48">48V DC</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="ep-form-group">
|
||
<label><?php echo $langs->trans("ElektroplanungSpannung"); ?> <span class="ep-unit">[V]</span></label>
|
||
<input type="number" id="epSpannung" value="400" step="1" min="0">
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- LEITUNGSDATEN -->
|
||
<div class="ep-section">
|
||
<div class="ep-section-title">
|
||
<span class="fa fa-plug"></span> <?php echo $langs->trans("ElektroplanungLeitungsdaten"); ?>
|
||
</div>
|
||
|
||
<div class="ep-form-grid">
|
||
<div class="ep-form-group">
|
||
<label><?php echo $langs->trans("ElektroplanungLeitungslaenge"); ?> <span class="ep-unit">[m]</span></label>
|
||
<input type="number" id="epLaenge" value="20" step="0.1" min="0">
|
||
</div>
|
||
|
||
<div class="ep-form-group">
|
||
<label><?php echo $langs->trans("ElektroplanungLeistungsfaktor"); ?> (cos φ) <span class="ep-unit">[-]</span></label>
|
||
<input type="number" id="epCosphi" value="0.95" step="0.01" min="0.1" max="1.0">
|
||
</div>
|
||
|
||
<div class="ep-form-group">
|
||
<label><?php echo $langs->trans("ElektroplanungMaxSpannungsfall"); ?> <span class="ep-unit">[%]</span></label>
|
||
<select id="epSpannungsfall">
|
||
<option value="3">3% (Beleuchtung)</option>
|
||
<option value="5" selected>5% (Andere Verbraucher)</option>
|
||
<option value="1">1% (Sehr kritisch)</option>
|
||
<option value="2">2% (Kritisch)</option>
|
||
<option value="4">4% (Baustellen)</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="ep-form-group">
|
||
<label><?php echo $langs->trans("ElektroplanungLeitermaterial"); ?>:</label>
|
||
<select id="epMaterial">
|
||
<option value="56" selected>Kupfer (Cu)</option>
|
||
<option value="35">Aluminium (Al)</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- VERLEGUNG -->
|
||
<div class="ep-section">
|
||
<div class="ep-section-title">
|
||
<span class="fa fa-cogs"></span> <?php echo $langs->trans("ElektroplanungVerlegungUmgebung"); ?>
|
||
</div>
|
||
|
||
<div class="ep-form-grid">
|
||
<div class="ep-form-group">
|
||
<label><?php echo $langs->trans("ElektroplanungVerlegeart"); ?>:</label>
|
||
<select id="epVerlegeart">
|
||
<option value="B1">B1 - Mehradrig an/auf Wand</option>
|
||
<option value="B2" selected>B2 - Mehradrig in Mauerwerk</option>
|
||
<option value="C">C - Einadrig in Rohr</option>
|
||
<option value="E">E - Frei in Luft</option>
|
||
<option value="F">F - Einadrig frei</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="ep-form-group">
|
||
<label><?php echo $langs->trans("ElektroplanungUmgebungstemperatur"); ?> <span class="ep-unit">[°C]</span></label>
|
||
<input type="number" id="epTemperatur" value="30" step="1" min="-20" max="80">
|
||
</div>
|
||
|
||
<div class="ep-form-group">
|
||
<label><?php echo $langs->trans("ElektroplanungAnzahlKabel"); ?>:</label>
|
||
<select id="epHaeufung">
|
||
<option value="1" selected>1 Kabel (keine Häufung)</option>
|
||
<option value="2">2 Kabel</option>
|
||
<option value="3">3 Kabel</option>
|
||
<option value="4">4 Kabel</option>
|
||
<option value="5">5 Kabel</option>
|
||
<option value="6">6-9 Kabel</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="ep-form-group">
|
||
<label><?php echo $langs->trans("ElektroplanungIsolierung"); ?>:</label>
|
||
<select id="epIsolierung">
|
||
<option value="70" selected>PVC (70°C)</option>
|
||
<option value="90">XLPE/EPR (90°C)</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ERGEBNIS -->
|
||
<div id="epResultBox" class="ep-result-box">
|
||
<div class="ep-result-main" id="epResultQuerschnitt">2.5 mm²</div>
|
||
<div class="ep-result-label"><?php echo $langs->trans("ElektroplanungEmpfohlenerQuerschnitt"); ?></div>
|
||
|
||
<div class="ep-result-details">
|
||
<div class="ep-result-item">
|
||
<span><?php echo $langs->trans("ElektroplanungBerechnet"); ?>:</span>
|
||
<span class="ep-result-value" id="epResultBerechnet">-</span>
|
||
</div>
|
||
<div class="ep-result-item">
|
||
<span><?php echo $langs->trans("ElektroplanungSpannungsfallResult"); ?>:</span>
|
||
<span class="ep-result-value" id="epResultSpannungsfall">-</span>
|
||
</div>
|
||
<div class="ep-result-item">
|
||
<span><?php echo $langs->trans("ElektroplanungStrombelastbar"); ?>:</span>
|
||
<span class="ep-result-value" id="epResultStrombelastbar">-</span>
|
||
</div>
|
||
<div class="ep-result-item">
|
||
<span><?php echo $langs->trans("ElektroplanungKabeltyp"); ?>:</span>
|
||
<span class="ep-result-value" id="epResultKabeltyp">-</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="epWarnings"></div>
|
||
</div>
|
||
|
||
<!-- FORMELN SEKTION -->
|
||
<div id="epFormulasSection" class="ep-formulas-section">
|
||
<div class="ep-section-title">
|
||
<span class="fa fa-calculator"></span> <?php echo $langs->trans("ElektroplanungAngewendeteFormeln"); ?>
|
||
</div>
|
||
<div id="epFormulasContent"></div>
|
||
</div>
|
||
|
||
<div class="ep-info-box">
|
||
<strong><span class="fa fa-info-circle"></span> <?php echo $langs->trans("ElektroplanungHinweise"); ?>:</strong>
|
||
<ul style="margin-left: 20px; margin-top: 5px;">
|
||
<li><?php echo $langs->trans("ElektroplanungHinweisDIN"); ?></li>
|
||
<li><?php echo $langs->trans("ElektroplanungHinweisLaenge"); ?></li>
|
||
<li><?php echo $langs->trans("ElektroplanungHinweisFachplanung"); ?></li>
|
||
<li><?php echo $langs->trans("ElektroplanungHinweisNormquerschnitte"); ?></li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
// Globale Variablen
|
||
let epCalculationData = {};
|
||
|
||
// Normquerschnitte nach DIN VDE
|
||
const epNormQuerschnitte = [1.5, 2.5, 4, 6, 10, 16, 25, 35, 50, 70, 95, 120, 150, 185, 240, 300, 400, 500, 630];
|
||
|
||
// Strombelastbarkeit-Tabelle (Kupfer, PVC 70°C)
|
||
const epStrombelastbarkeit = {
|
||
'B1': { 1.5: 15.5, 2.5: 21, 4: 28, 6: 36, 10: 49, 16: 66, 25: 89, 35: 110, 50: 134, 70: 171, 95: 207, 120: 239, 150: 271, 185: 310, 240: 361, 300: 424, 400: 502 },
|
||
'B2': { 1.5: 18.5, 2.5: 25, 4: 34, 6: 43, 10: 60, 16: 80, 25: 107, 35: 133, 50: 164, 70: 209, 95: 253, 120: 290, 150: 328, 185: 375, 240: 435, 300: 509, 400: 599 },
|
||
'C': { 1.5: 19.5, 2.5: 27, 4: 37, 6: 47, 10: 64, 16: 86, 25: 114, 35: 141, 50: 175, 70: 222, 95: 269, 120: 309, 150: 349, 185: 399, 240: 461, 300: 537, 400: 629 },
|
||
'E': { 1.5: 24, 2.5: 32, 4: 42, 6: 54, 10: 73, 16: 98, 25: 131, 35: 162, 50: 199, 70: 253, 95: 306, 120: 351, 150: 396, 185: 453, 240: 524, 300: 611, 400: 716 },
|
||
'F': { 1.5: 22, 2.5: 30, 4: 40, 6: 51, 10: 69, 16: 93, 25: 125, 35: 154, 50: 190, 70: 242, 95: 293, 120: 336, 150: 379, 185: 434, 240: 502, 300: 585, 400: 685 }
|
||
};
|
||
|
||
// Temperatur-Korrekturfaktoren
|
||
function epGetTempFaktor(temp, isolierung) {
|
||
if (isolierung == 70) {
|
||
if (temp <= 10) return 1.22;
|
||
if (temp <= 15) return 1.17;
|
||
if (temp <= 20) return 1.12;
|
||
if (temp <= 25) return 1.06;
|
||
if (temp <= 30) return 1.0;
|
||
if (temp <= 35) return 0.94;
|
||
if (temp <= 40) return 0.87;
|
||
if (temp <= 45) return 0.79;
|
||
if (temp <= 50) return 0.71;
|
||
return 0.58;
|
||
} else {
|
||
if (temp <= 10) return 1.15;
|
||
if (temp <= 15) return 1.12;
|
||
if (temp <= 20) return 1.08;
|
||
if (temp <= 25) return 1.04;
|
||
if (temp <= 30) return 1.0;
|
||
if (temp <= 35) return 0.96;
|
||
if (temp <= 40) return 0.91;
|
||
if (temp <= 45) return 0.87;
|
||
if (temp <= 50) return 0.82;
|
||
if (temp <= 55) return 0.76;
|
||
return 0.71;
|
||
}
|
||
}
|
||
|
||
// Häufungs-Korrekturfaktoren
|
||
function epGetHaeufungsFaktor(anzahl) {
|
||
const faktoren = { 1: 1.0, 2: 0.80, 3: 0.70, 4: 0.65, 5: 0.60, 6: 0.57 };
|
||
return faktoren[anzahl] || 0.57;
|
||
}
|
||
|
||
// Toggle Strom/Leistung Eingabe
|
||
function epToggleInputType() {
|
||
const inputType = document.querySelector('input[name="inputType"]:checked').value;
|
||
document.getElementById('epStromInput').style.display = inputType === 'strom' ? 'flex' : 'none';
|
||
document.getElementById('epLeistungInput').style.display = inputType === 'leistung' ? 'flex' : 'none';
|
||
}
|
||
|
||
// Spannung aktualisieren
|
||
function epUpdateSpannung() {
|
||
const netzart = document.getElementById('epNetzart').value;
|
||
const spannungen = { '1ph230': 230, '3ph400': 400, 'dc12': 12, 'dc24': 24, 'dc48': 48 };
|
||
document.getElementById('epSpannung').value = spannungen[netzart];
|
||
}
|
||
|
||
// Nächsten Normquerschnitt finden
|
||
function epGetNormQuerschnitt(berechnet) {
|
||
for (let qs of epNormQuerschnitte) {
|
||
if (qs >= berechnet) return qs;
|
||
}
|
||
return epNormQuerschnitte[epNormQuerschnitte.length - 1];
|
||
}
|
||
|
||
// Formeln anzeigen/verbergen
|
||
function epToggleFormulas() {
|
||
const section = document.getElementById('epFormulasSection');
|
||
const text = document.getElementById('epFormulaToggleText');
|
||
if (section.classList.contains('show')) {
|
||
section.classList.remove('show');
|
||
text.textContent = '<?php echo addslashes($langs->trans("ElektroplanungFormelnAnzeigen")); ?>';
|
||
} else {
|
||
section.classList.add('show');
|
||
text.textContent = '<?php echo addslashes($langs->trans("ElektroplanungFormelnAusblenden")); ?>';
|
||
section.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
||
}
|
||
}
|
||
|
||
// Formeln generieren
|
||
function epGenerateFormulas(data) {
|
||
let html = '';
|
||
|
||
if (data.inputType === 'leistung') {
|
||
html += '<div class="ep-formula-box">';
|
||
html += '<div class="ep-formula-label">1. Stromberechnung aus Leistung</div>';
|
||
html += '<div class="ep-formula-content">';
|
||
if (data.netzart.startsWith('3ph')) {
|
||
html += `I = P / (√3 × U × cos φ)\nI = ${data.leistung} kW / (√3 × ${data.spannung} V × ${data.cosphi})\nI = ${data.strom.toFixed(2)} A`;
|
||
} else {
|
||
html += `I = P / (U × cos φ)\nI = ${data.leistung} kW / (${data.spannung} V × ${data.cosphi})\nI = ${data.strom.toFixed(2)} A`;
|
||
}
|
||
html += '</div></div>';
|
||
}
|
||
|
||
html += `<div class="ep-formula-box">
|
||
<div class="ep-formula-label">2. Querschnitt nach Spannungsfall (DIN VDE 0100-520)</div>
|
||
<div class="ep-formula-content">A = (2 × l × I × cos φ) / (κ × ΔU_zul)
|
||
|
||
Werte:
|
||
l = ${data.laenge} m
|
||
I = ${data.strom.toFixed(2)} A
|
||
cos φ = ${data.cosphi}
|
||
κ = ${data.kappa} m/(Ω·mm²) (${data.material})
|
||
ΔU_zul = ${data.deltaU_zul.toFixed(2)} V (${data.spannungsfallProzent}% von ${data.spannung}V)
|
||
|
||
A = (2 × ${data.laenge} × ${data.strom.toFixed(2)} × ${data.cosphi}) / (${data.kappa} × ${data.deltaU_zul.toFixed(2)})
|
||
A = ${data.A_spannungsfall.toFixed(3)} mm²
|
||
|
||
Normquerschnitt: ${data.querschnitt_spannungsfall} mm²</div>
|
||
</div>`;
|
||
|
||
html += `<div class="ep-formula-box">
|
||
<div class="ep-formula-label">3. Tatsächlicher Spannungsfall</div>
|
||
<div class="ep-formula-content">ΔU = (2 × l × I × cos φ) / (κ × A)
|
||
|
||
Mit ${data.querschnitt} mm²:
|
||
ΔU = ${data.deltaU_ist.toFixed(2)} V (${data.deltaU_prozent.toFixed(2)}%)
|
||
${data.deltaU_prozent <= data.spannungsfallProzent ? '✓ OK' : '✗ Zu hoch!'}</div>
|
||
</div>`;
|
||
|
||
html += `<div class="ep-formula-box">
|
||
<div class="ep-formula-label">4. Strombelastbarkeit (DIN VDE 0298-4)</div>
|
||
<div class="ep-formula-content">I_zul = I_Tabelle × f_Temp × f_Häufung
|
||
|
||
I_zul = ${data.I_tabelle.toFixed(1)} A × ${data.tempFaktor.toFixed(3)} × ${data.haeufungsFaktor.toFixed(2)}
|
||
I_zul = ${data.maxStrom.toFixed(1)} A
|
||
|
||
Benötigt: ${data.strom.toFixed(2)} A
|
||
${data.maxStrom >= data.strom ? '✓ Ausreichend' : '✗ Erhöhung nötig!'}</div>
|
||
</div>`;
|
||
|
||
document.getElementById('epFormulasContent').innerHTML = html;
|
||
}
|
||
|
||
// Hauptberechnung
|
||
function epBerechnen() {
|
||
try {
|
||
const inputType = document.querySelector('input[name="inputType"]:checked').value;
|
||
let strom, leistung = 0;
|
||
|
||
const spannung = parseFloat(document.getElementById('epSpannung').value);
|
||
const cosphi = parseFloat(document.getElementById('epCosphi').value);
|
||
const netzart = document.getElementById('epNetzart').value;
|
||
|
||
if (inputType === 'leistung') {
|
||
leistung = parseFloat(document.getElementById('epLeistung').value);
|
||
strom = netzart.startsWith('3ph')
|
||
? (leistung * 1000) / (Math.sqrt(3) * spannung * cosphi)
|
||
: (leistung * 1000) / (spannung * cosphi);
|
||
} else {
|
||
strom = parseFloat(document.getElementById('epStrom').value);
|
||
}
|
||
|
||
const laenge = parseFloat(document.getElementById('epLaenge').value);
|
||
const spannungsfallProzent = parseFloat(document.getElementById('epSpannungsfall').value);
|
||
const kappa = parseFloat(document.getElementById('epMaterial').value);
|
||
const verlegeart = document.getElementById('epVerlegeart').value;
|
||
const temperatur = parseFloat(document.getElementById('epTemperatur').value);
|
||
const haeufung = parseInt(document.getElementById('epHaeufung').value);
|
||
const isolierung = parseInt(document.getElementById('epIsolierung').value);
|
||
const material = kappa === 56 ? 'Kupfer' : 'Aluminium';
|
||
|
||
if (strom <= 0 || laenge <= 0 || spannung <= 0) {
|
||
throw new Error('Bitte alle Werte korrekt eingeben!');
|
||
}
|
||
|
||
const deltaU_zul = spannung * (spannungsfallProzent / 100);
|
||
const A_spannungsfall = (2 * laenge * strom * cosphi) / (kappa * deltaU_zul);
|
||
const querschnitt_spannungsfall = epGetNormQuerschnitt(A_spannungsfall);
|
||
|
||
let querschnitt = querschnitt_spannungsfall;
|
||
const tempFaktor = epGetTempFaktor(temperatur, isolierung);
|
||
const haeufungsFaktor = epGetHaeufungsFaktor(haeufung);
|
||
|
||
let I_tabelle = epStrombelastbarkeit[verlegeart][querschnitt] || 0;
|
||
let maxStrom = I_tabelle * tempFaktor * haeufungsFaktor;
|
||
|
||
let warnings = [];
|
||
while (maxStrom < strom && querschnitt < 500) {
|
||
const index = epNormQuerschnitte.indexOf(querschnitt);
|
||
if (index < epNormQuerschnitte.length - 1) {
|
||
const vorher = querschnitt;
|
||
querschnitt = epNormQuerschnitte[index + 1];
|
||
I_tabelle = epStrombelastbarkeit[verlegeart][querschnitt] || 0;
|
||
maxStrom = I_tabelle * tempFaktor * haeufungsFaktor;
|
||
warnings.push(`⚠️ Querschnitt von ${vorher}mm² auf ${querschnitt}mm² erhöht (Strombelastbarkeit)`);
|
||
} else break;
|
||
}
|
||
|
||
const deltaU_ist = (2 * laenge * strom * cosphi) / (kappa * querschnitt);
|
||
const deltaU_prozent = (deltaU_ist / spannung) * 100;
|
||
|
||
let kabeltyp = '';
|
||
if (netzart === '1ph230') kabeltyp = `NYM-J 3x${querschnitt}`;
|
||
else if (netzart.startsWith('3ph')) kabeltyp = `NYM-J 5x${querschnitt}`;
|
||
else kabeltyp = `H07V-K 2x${querschnitt}`;
|
||
|
||
if (deltaU_prozent > spannungsfallProzent) {
|
||
warnings.push(`⚠️ Spannungsfall ${deltaU_prozent.toFixed(2)}% > ${spannungsfallProzent}%`);
|
||
}
|
||
if (maxStrom / strom < 1.25) {
|
||
warnings.push(`💡 Nur ${((maxStrom/strom - 1)*100).toFixed(0)}% Reserve`);
|
||
}
|
||
if (temperatur > 40 && isolierung == 70) {
|
||
warnings.push(`⚠️ Hohe Temperatur! XLPE empfohlen`);
|
||
}
|
||
|
||
epCalculationData = {
|
||
inputType, strom, leistung, laenge, cosphi, spannungsfallProzent, spannung,
|
||
kappa, material, verlegeart, temperatur, haeufung, isolierung, netzart,
|
||
deltaU_zul, A_spannungsfall, querschnitt_spannungsfall, querschnitt,
|
||
deltaU_ist, deltaU_prozent, I_tabelle, tempFaktor, haeufungsFaktor,
|
||
maxStrom, kabeltyp, warnings
|
||
};
|
||
|
||
document.getElementById('epResultQuerschnitt').textContent = `${querschnitt} mm²`;
|
||
document.getElementById('epResultBerechnet').textContent = `${A_spannungsfall.toFixed(2)} mm²`;
|
||
document.getElementById('epResultSpannungsfall').textContent = `${deltaU_ist.toFixed(2)}V (${deltaU_prozent.toFixed(2)}%)`;
|
||
document.getElementById('epResultStrombelastbar').textContent = `${maxStrom.toFixed(1)} A`;
|
||
document.getElementById('epResultKabeltyp').textContent = kabeltyp;
|
||
|
||
const warningsDiv = document.getElementById('epWarnings');
|
||
warningsDiv.innerHTML = warnings.length > 0
|
||
? '<div class="ep-warning-box">' + warnings.join('<br>') + '</div>'
|
||
: '';
|
||
|
||
epGenerateFormulas(epCalculationData);
|
||
|
||
const resultBox = document.getElementById('epResultBox');
|
||
resultBox.classList.add('show');
|
||
resultBox.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
||
|
||
} catch (error) {
|
||
alert('Fehler: ' + error.message);
|
||
}
|
||
}
|
||
|
||
// Formular zurücksetzen
|
||
function epResetForm() {
|
||
document.getElementById('epStrom').value = 16;
|
||
document.getElementById('epLeistung').value = 3.68;
|
||
document.getElementById('epNetzart').value = '3ph400';
|
||
document.getElementById('epSpannung').value = 400;
|
||
document.getElementById('epLaenge').value = 20;
|
||
document.getElementById('epCosphi').value = 0.95;
|
||
document.getElementById('epSpannungsfall').value = 5;
|
||
document.getElementById('epMaterial').value = 56;
|
||
document.getElementById('epVerlegeart').value = 'B2';
|
||
document.getElementById('epTemperatur').value = 30;
|
||
document.getElementById('epHaeufung').value = 1;
|
||
document.getElementById('epIsolierung').value = 70;
|
||
|
||
document.getElementById('epResultBox').classList.remove('show');
|
||
document.getElementById('epFormulasSection').classList.remove('show');
|
||
document.getElementById('epFormulaToggleText').textContent = '<?php echo addslashes($langs->trans("ElektroplanungFormelnAnzeigen")); ?>';
|
||
}
|
||
|
||
// PDF Export
|
||
function epExportPDF() {
|
||
if (!epCalculationData.querschnitt) {
|
||
alert('Bitte erst eine Berechnung durchführen!');
|
||
return;
|
||
}
|
||
|
||
const { jsPDF } = window.jspdf;
|
||
const doc = new jsPDF();
|
||
const data = epCalculationData;
|
||
const datum = new Date().toLocaleDateString('de-DE');
|
||
|
||
let y = 20;
|
||
|
||
doc.setFontSize(18);
|
||
doc.setFont(undefined, 'bold');
|
||
doc.text('Leitungsquerschnitt-Berechnung', 105, y, { align: 'center' });
|
||
y += 8;
|
||
|
||
doc.setFontSize(10);
|
||
doc.setFont(undefined, 'normal');
|
||
doc.text('Nach DIN VDE 0100-520 und DIN VDE 0298-4', 105, y, { align: 'center' });
|
||
y += 5;
|
||
doc.text('Erstellt: ' + datum, 105, y, { align: 'center' });
|
||
y += 10;
|
||
|
||
doc.line(20, y, 190, y);
|
||
y += 10;
|
||
|
||
doc.setFontSize(14);
|
||
doc.setFont(undefined, 'bold');
|
||
doc.text('Eingabewerte', 20, y);
|
||
y += 7;
|
||
|
||
doc.setFontSize(10);
|
||
doc.setFont(undefined, 'normal');
|
||
|
||
const inputs = [
|
||
data.inputType === 'leistung' ? `Leistung: ${data.leistung} kW` : null,
|
||
`Strom: ${data.strom.toFixed(2)} A`,
|
||
`Spannung: ${data.spannung} V (${data.netzart})`,
|
||
`Leitungslänge: ${data.laenge} m`,
|
||
`Leistungsfaktor: ${data.cosphi}`,
|
||
`Max. Spannungsfall: ${data.spannungsfallProzent}%`,
|
||
`Material: ${data.material}`,
|
||
`Verlegeart: ${data.verlegeart}`,
|
||
`Temperatur: ${data.temperatur}°C`
|
||
].filter(Boolean);
|
||
|
||
inputs.forEach(line => { doc.text(line, 20, y); y += 6; });
|
||
y += 5;
|
||
|
||
doc.setFontSize(14);
|
||
doc.setFont(undefined, 'bold');
|
||
doc.text('Ergebnis', 20, y);
|
||
y += 7;
|
||
|
||
doc.setFontSize(16);
|
||
doc.setTextColor(16, 185, 129);
|
||
doc.text(`Querschnitt: ${data.querschnitt} mm²`, 20, y);
|
||
doc.setTextColor(0, 0, 0);
|
||
y += 8;
|
||
|
||
doc.setFontSize(10);
|
||
doc.setFont(undefined, 'normal');
|
||
doc.text(`Berechneter Querschnitt: ${data.A_spannungsfall.toFixed(2)} mm²`, 20, y); y += 6;
|
||
doc.text(`Spannungsfall: ${data.deltaU_ist.toFixed(2)} V (${data.deltaU_prozent.toFixed(2)}%)`, 20, y); y += 6;
|
||
doc.text(`Strombelastbarkeit: ${data.maxStrom.toFixed(1)} A`, 20, y); y += 6;
|
||
doc.text(`Kabeltyp: ${data.kabeltyp}`, 20, y);
|
||
|
||
doc.setFontSize(8);
|
||
doc.setTextColor(150);
|
||
doc.text('Elektroplanung - Alle Angaben ohne Gewähr', 105, 290, { align: 'center' });
|
||
|
||
doc.save(`Leitungsberechnung_${data.querschnitt}mm2_${datum.replace(/\./g, '-')}.pdf`);
|
||
}
|
||
|
||
// Initial berechnen
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
epBerechnen();
|
||
});
|
||
</script>
|
||
|
||
<?php
|
||
print '</div>';
|
||
|
||
llxFooter();
|
||
$db->close();
|