{"id":17030,"date":"2026-05-22T01:39:17","date_gmt":"2026-05-22T01:39:17","guid":{"rendered":"https:\/\/www.dgcrane.com\/?p=17030"},"modified":"2026-05-22T01:59:01","modified_gmt":"2026-05-22T01:59:01","slug":"crane-dynamic-loading-calculator","status":"publish","type":"post","link":"https:\/\/www.dgcrane.com\/vi\/crane-dynamic-loading-calculator\/","title":{"rendered":"M\u00e1y t\u00ednh t\u1ea3i tr\u1ecdng \u0111\u1ed9ng c\u1ee7a c\u1ea7n c\u1ea9u"},"content":{"rendered":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">\n    <title>M\u00e1y t\u00ednh t\u1ea3i tr\u1ecdng \u0111\u1ed9ng c\u1ee7a c\u1ea7n c\u1ea9u | P_d = \u03c6\u00b7(Q+Q_h+G_t)<\/title>\n    <style>\n        \/* all styles are strictly scoped inside #calculator *\/\n        #calculator {\n            --primary-color: #0a3487;\n            --primary-hover: #F58423;\n            --error-color: #e53935;\n            --bg-color: #EAEEF7;\n            --text-color: #4a4a4a;\n            \n            display: block;\n            width: 100%;\n            background: var(--bg-color);\n            font-family: 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;\n            color: var(--text-color);\n        }\n        \n        \/* container for PC max-width & padding *\/\n        #calculator .calculator-container {\n            max-width: 545px;\n            padding: 30px;\n            margin: 0 auto;\n            background: var(--bg-color);\n            box-sizing: border-box;\n        }\n        \n        \/* typography *\/\n        #calculator .calculator-title {\n            font-size: 24px;\n            font-weight: 600;\n            margin: 0 0 4px 0;\n            color: var(--primary-color);\n            letter-spacing: -0.2px;\n        }\n        \n        #calculator .calculator-subtitle {\n            font-size: 14px;\n            margin: 0 0 24px 0;\n            font-family: monospace;\n            background: rgba(10,52,135,0.08);\n            display: inline-block;\n            padding: 4px 12px;\n            border-radius: 0;\n            color: var(--primary-color);\n        }\n        \n        \/* input groups *\/\n        #calculator .input-group {\n            margin-bottom: 20px;\n            width: 100%;\n            position: relative;\n        }\n        \n        #calculator label {\n            display: block;\n            font-size: 14px;\n            font-weight: 500;\n            margin-bottom: 6px;\n            color: var(--text-color);\n        }\n        \n        #calculator .var-symbol {\n            font-family: monospace;\n            font-weight: 700;\n            background: rgba(0,0,0,0.04);\n            padding: 0px 4px;\n            border-radius: 0;\n            margin-left: 4px;\n        }\n        \n        \/* wrapper for input + inline unit (unit placed inside input field on the right) *\/\n        #calculator .input-unit-wrapper {\n            position: relative;\n            width: 100%;\n        }\n        \n        #calculator .input-unit-wrapper .calculator-input {\n            width: 100%;\n            padding-right: 104px;\n        }\n        \n        #calculator .inline-unit {\n            position: absolute;\n            right: 1px;\n            top: 1px;\n            bottom: 1px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 14px;\n            font-weight: 500;\n            color: #aaaaaa;\n            background: transparent;\n            padding: 0 8px;\n            height: auto;\n            line-height: 1;\n            white-space: nowrap;\n            font-family: monospace;\n            pointer-events: none;\n            box-sizing: border-box;\n        }\n        \n        \/* select styling \u2014 no unit after select *\/\n        #calculator .calculator-input,\n        #calculator .calculator-select {\n            width: 100%;\n            height: 36px;\n            padding: 0 12px;\n            font-size: 16px;\n            border: 1px solid #ccc;\n            border-radius: 0;\n            background: white;\n            font-family: 'Segoe UI', 'SF Mono', monospace;\n            color: #333;\n            transition: all 0.2s ease;\n            box-sizing: border-box;\n        }\n        \n        #calculator .calculator-select {\n            cursor: pointer;\n            appearance: none;\n            background-image: url('data:image\/svg+xml;utf8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"%234a4a4a\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"><\/polyline><\/svg>');\n            background-repeat: no-repeat;\n            background-position: right 12px center;\n            background-size: 14px;\n        }\n        \n        \/* ensure dropdown options have consistent font and spacing *\/\n        #calculator .calculator-select option {\n            font-size: 14px;\n            padding: 8px;\n            font-family: 'Segoe UI', 'SF Mono', monospace;\n            line-height: 1.4;\n            color: #333;\n        }\n        \n        #calculator .calculator-input:focus,\n        #calculator .calculator-select:focus {\n            outline: none;\n            border: 2px solid var(--primary-color);\n            padding: 0 11px;\n            height: 36px;\n        }\n        \n        #calculator .input-unit-wrapper .calculator-input:focus {\n            padding-right: 103px;\n        }\n        \n        \/* error state: border 2px solid error-color *\/\n        #calculator .calculator-input.error-input,\n        #calculator .calculator-select.error-input {\n            border: 2px solid var(--error-color);\n            padding: 0 11px;\n            height: 36px;\n        }\n        \n        #calculator .input-unit-wrapper .calculator-input.error-input {\n            padding-right: 103px;\n        }\n        \n        \/* error message styling *\/\n        #calculator .error-msg {\n            font-size: 12px;\n            color: var(--error-color);\n            margin-top: 5px;\n            display: none;\n            line-height: 1.2;\n        }\n        \n        #calculator .error-msg.visible {\n            display: block;\n        }\n        \n        \/* result area *\/\n        #calculator .result-area {\n            background: white;\n            margin: 20px 0 24px 0;\n            padding: 18px 16px;\n            text-align: center;\n            border-left: 4px solid var(--primary-color);\n            box-shadow: 0 1px 3px rgba(0,0,0,0.05);\n        }\n        \n        #calculator .result-label {\n            font-size: 14px;\n            font-weight: 500;\n            text-transform: uppercase;\n            letter-spacing: 1px;\n            color: var(--text-color);\n            margin-bottom: 8px;\n        }\n        \n        #calculator .result-value {\n            font-size: 40px;\n            font-weight: 800;\n            font-family: 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n            color: var(--primary-color);\n            line-height: 1.1;\n            word-break: break-word;\n        }\n        \n        #calculator .calculation-detail {\n            font-size: 12px;\n            font-family: monospace;\n            color: #6b7280;\n            margin-top: 8px;\n            border-top: 1px solid #ececec;\n            padding-top: 6px;\n        }\n        \n        \/* button group: horizontal flex on PC *\/\n        #calculator .button-group {\n            display: flex;\n            flex-direction: row;\n            gap: 16px;\n            margin-top: 8px;\n        }\n        \n        #calculator button {\n            flex: 1;\n            height: 36px;\n            font-size: 14px;\n            font-weight: 600;\n            border: none;\n            border-radius: 0;\n            cursor: pointer;\n            transition: all 0.2s ease;\n            font-family: inherit;\n        }\n        \n        #calculator .btn-primary {\n            background: var(--primary-color);\n            color: white;\n        }\n        \n        #calculator .btn-primary:hover {\n            background: var(--primary-hover);\n        }\n        \n        #calculator .btn-secondary {\n            background: #6c757d;\n            color: white;\n        }\n        \n        #calculator .btn-secondary:hover {\n            background: #5a6268;\n        }\n        \n        \/* mobile responsiveness (rem based, following spec) *\/\n        @media (max-width: 768px) {\n            #calculator .calculator-container {\n                padding: 20px;\n                max-width: 100%;\n            }\n            #calculator .calculator-input,\n            #calculator .calculator-select,\n            #calculator button,\n            #calculator .inline-unit {\n                height: 0.7rem;\n                font-size: 0.28rem;\n                line-height: 0.7rem;\n            }\n            #calculator .calculator-input,\n            #calculator .calculator-select {\n                height: 0.7rem;\n                padding: 0 0.2rem;\n                font-size: 0.28rem;\n            }\n            #calculator .input-unit-wrapper .calculator-input {\n                padding-right: 1.8rem;\n            }\n            #calculator .calculator-input:focus,\n            #calculator .calculator-select:focus {\n                padding: 0 0.18rem;\n                height: 0.7rem;\n            }\n            #calculator .input-unit-wrapper .calculator-input:focus {\n                padding-right: 1.78rem;\n            }\n            #calculator .calculator-input.error-input,\n            #calculator .calculator-select.error-input {\n                padding: 0 0.18rem;\n                height: 0.7rem;\n            }\n            #calculator .input-unit-wrapper .calculator-input.error-input {\n                padding-right: 1.78rem;\n            }\n            #calculator label {\n                font-size: 0.28rem;\n            }\n            #calculator .result-value {\n                font-size: 0.7rem;\n            }\n            #calculator .result-label,\n            #calculator .calculation-detail {\n                font-size: 0.24rem;\n            }\n            #calculator .btn-primary,\n            #calculator .btn-secondary {\n                font-size: 0.28rem;\n                height: 0.7rem;\n            }\n            #calculator .button-group {\n                flex-direction: column;\n                gap: 12px;\n            }\n            #calculator button {\n                width: 100%;\n            }\n            #calculator .calculator-title {\n                font-size: 0.5rem;\n            }\n            #calculator .calculator-subtitle {\n                font-size: 0.24rem;\n            }\n            #calculator .inline-unit {\n                font-size: 0.28rem;\n                padding: 0 0.2rem;\n            }\n            \/* option text slightly smaller on mobile but consistent *\/\n            #calculator .calculator-select option {\n                font-size: 0.28rem;\n            }\n        }\n        \n        \/* error priority: error border overrides focus *\/\n        #calculator .calculator-input.error-input:focus,\n        #calculator .calculator-select.error-input:focus {\n            border: 2px solid var(--error-color);\n        }\n        \n        \/* remove any default spinner on number input *\/\n        #calculator .calculator-input[type=\"number\"] {\n            -moz-appearance: textfield;\n        }\n        #calculator .calculator-input[type=\"number\"]::-webkit-inner-spin-button,\n        #calculator .calculator-input[type=\"number\"]::-webkit-outer-spin-button {\n            -webkit-appearance: none;\n            margin: 0;\n        }\n    <\/style>\n<\/head>\n<body>\n<div id=\"calculator\">\n    <div class=\"calculator-container\">\n        \n        \n        <!-- \u03c6 factor selection: Using ASCII symbols [+], [-], [!] for perfect size consistency -->\n        <div class=\"input-group\">\n            <label for=\"calculator-phi\">Y\u1ebfu t\u1ed1 \u0111\u1ed9ng <span class=\"var-symbol\">\u03c6<\/span><\/label>\n            <select id=\"calculator-phi\" class=\"calculator-select\">\n                <option value=\"1.1\">\ud83d\udd38 T\u1ed1c \u0111\u1ed9 th\u1ea5p \/ t\u1ea3i nh\u1eb9 \/ \u0111i\u1ec1u khi\u1ec3n ch\u00ednh x\u00e1c \u2192 \u03c6 = 1,10<\/option>\n                <option value=\"1.2\">\ud83d\udd38 C\u00f4ng nghi\u1ec7p th\u00f4ng th\u01b0\u1eddng (nh\u1eb9) \u2192 \u03c6 = 1,20<\/option>\n                <option value=\"1.25\" selected>\ud83d\udd38 C\u00f4ng nghi\u1ec7p th\u00f4ng th\u01b0\u1eddng (trung b\u00ecnh) \u2192 \u03c6 = 1,25<\/option>\n                <option value=\"1.3\">\ud83d\udd38 C\u00f4ng nghi\u1ec7p th\u00f4ng th\u01b0\u1eddng (n\u1eb7ng) \u2192 \u03c6 = 1,30<\/option>\n                <option value=\"1.4\">\ud83d\udd38 S\u1eed d\u1ee5ng trong \u0111i\u1ec1u ki\u1ec7n kh\u1eafc nghi\u1ec7t \/ t\u1ea3i n\u1eb7ng \u2192 \u03c6 = 1,40<\/option>\n                <option value=\"1.5\">\ud83d\udd38\u0110\u1eadp m\u1ea1nh \/ S\u1eed d\u1ee5ng trong nh\u00e0 m\u00e1y \u2192 \u03c6 = 1,50<\/option>\n                <option value=\"1.6\">\ud83d\udd38Ch\u1ed1ng s\u1ed1c c\u1ef1c m\u1ea1nh \/ \u0111i\u1ec1u ki\u1ec7n l\u00e0m vi\u1ec7c kh\u1eafc nghi\u1ec7t \u2192 \u03c6 = 1,60<\/option>\n            <\/select>\n            <div class=\"error-msg\" id=\"error-phi\"><\/div>\n        <\/div>\n\n        <!-- Q : Rated load | unit placed AFTER input box (inline) -->\n        <div class=\"input-group\">\n            <label for=\"calculator-ratedLoad\">T\u1ea3i tr\u1ecdng \u0111\u1ecbnh m\u1ee9c <span class=\"var-symbol\">Q<\/span><\/label>\n            <div class=\"input-unit-wrapper\">\n                <input type=\"number\" id=\"calculator-ratedLoad\" class=\"calculator-input\" placeholder=\"v\u00ed d\u1ee5, 20.0\" step=\"any\" value=\"20.0\">\n                <span class=\"inline-unit\">t\u1ea5n (t)<\/span>\n            <\/div>\n            <div class=\"error-msg\" id=\"error-ratedLoad\"><\/div>\n        <\/div>\n\n        <!-- Q_h : Hook + lifting attachment weight | unit after input -->\n        <div class=\"input-group\">\n            <label for=\"calculator-hookWeight\">Kh\u1ed1i l\u01b0\u1ee3ng m\u00f3c v\u00e0 ph\u1ea7n g\u1eafn k\u1ebft <span class=\"var-symbol\">Q<sub>h<\/sub><\/span><\/label>\n            <div class=\"input-unit-wrapper\">\n                <input type=\"number\" id=\"calculator-hookWeight\" class=\"calculator-input\" placeholder=\"v\u00ed d\u1ee5, 0,6\" step=\"any\" value=\"0.6\">\n                <span class=\"inline-unit\">t\u1ea5n (t)<\/span>\n            <\/div>\n            <div class=\"error-msg\" id=\"error-hookWeight\"><\/div>\n        <\/div>\n\n        <!-- G_t : Trolley self-weight | unit after input -->\n        <div class=\"input-group\">\n            <label for=\"calculator-trolleyWeight\">Tr\u1ecdng l\u01b0\u1ee3ng b\u1ea3n th\u00e2n c\u1ee7a xe \u0111\u1ea9y <span class=\"var-symbol\">G<sub>t<\/sub><\/span><\/label>\n            <div class=\"input-unit-wrapper\">\n                <input type=\"number\" id=\"calculator-trolleyWeight\" class=\"calculator-input\" placeholder=\"v\u00ed d\u1ee5, 5.4\" step=\"any\" value=\"5.4\">\n                <span class=\"inline-unit\">t\u1ea5n (t)<\/span>\n            <\/div>\n            <div class=\"error-msg\" id=\"error-trolleyWeight\"><\/div>\n        <\/div>\n\n        <!-- Result display area -->\n        <div class=\"result-area\">\n            <div class=\"result-label\">K\u1ebft qu\u1ea3 t\u1ea3i \u0111\u1ed9ng <span>P<sub>d<\/sub><\/span><\/div>\n            <div class=\"result-value\" id=\"calculator-result\">\u2014 kN<\/div>\n            <div class=\"calculation-detail\" id=\"calc-detail\"><\/div>\n        <\/div>\n\n        <!-- Action Buttons -->\n        <div class=\"button-group\">\n            <button id=\"calculator-calcBtn\" class=\"btn-primary\">T\u00ednh to\u00e1n<\/button>\n            <button id=\"calculator-resetBtn\" class=\"btn-secondary\">C\u00e0i l\u1ea1i<\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n    (function() {\n        \/\/ DOM references\n        const phiSelect = document.getElementById('calculator-phi');\n        const ratedLoadInput = document.getElementById('calculator-ratedLoad');\n        const hookWeightInput = document.getElementById('calculator-hookWeight');\n        const trolleyWeightInput = document.getElementById('calculator-trolleyWeight');\n        const calcBtn = document.getElementById('calculator-calcBtn');\n        const resetBtn = document.getElementById('calculator-resetBtn');\n        const resultSpan = document.getElementById('calculator-result');\n        const calcDetailSpan = document.getElementById('calc-detail');\n        \n        \/\/ error message containers\n        const errorPhi = document.getElementById('error-phi');\n        const errorRated = document.getElementById('error-ratedLoad');\n        const errorHook = document.getElementById('error-hookWeight');\n        const errorTrolley = document.getElementById('error-trolleyWeight');\n        \n        \/\/ input fields for validation\n        const inputFields = [\n            { element: ratedLoadInput, errorDiv: errorRated, name: 'Rated load' },\n            { element: hookWeightInput, errorDiv: errorHook, name: 'Hook & attachment mass' },\n            { element: trolleyWeightInput, errorDiv: errorTrolley, name: 'Trolley self-weight' }\n        ];\n        const selectField = { element: phiSelect, errorDiv: errorPhi, name: 'Dynamic factor' };\n        \n        \/\/ conversion factor: tonnes -> kN\n        const TON_TO_KN = 9.80665;\n        \n        \/\/ Helper: clear error for a single input (remove class, hide message)\n        function clearErrorForInput(inputEl, errorDiv) {\n            if (inputEl) inputEl.classList.remove('error-input');\n            if (errorDiv) errorDiv.classList.remove('visible');\n        }\n        \n        \/\/ set error for single input\n        function setErrorForInput(inputEl, errorDiv, message) {\n            if (inputEl) inputEl.classList.add('error-input');\n            if (errorDiv) {\n                errorDiv.textContent = message || 'Invalid value';\n                errorDiv.classList.add('visible');\n            }\n        }\n        \n        \/\/ clear all errors\n        function clearAllErrors() {\n            inputFields.forEach(field => {\n                clearErrorForInput(field.element, field.errorDiv);\n            });\n            clearErrorForInput(selectField.element, selectField.errorDiv);\n        }\n        \n        \/\/ validate single numeric input (non-empty, valid number >=0)\n        function validateSingleInput(value, fieldName) {\n            if (value === undefined || value === null || value === '') {\n                return { valid: false, message: `${fieldName} cannot be empty.` };\n            }\n            const num = parseFloat(value);\n            if (isNaN(num)) {\n                return { valid: false, message: `${fieldName} must be a valid number.` };\n            }\n            if (num < 0) {\n                return { valid: false, message: `${fieldName} cannot be negative.` };\n            }\n            return { valid: true, value: num };\n        }\n        \n        \/\/ validate phi select\n        function validatePhi() {\n            const phiVal = phiSelect.value;\n            const num = parseFloat(phiVal);\n            if (isNaN(num)) {\n                return { valid: false, message: 'Dynamic factor must be a valid number.' };\n            }\n            if (num <= 0) {\n                return { valid: false, message: '\u03c6 must be greater than 0.' };\n            }\n            return { valid: true, value: num };\n        }\n        \n        \/\/ main validation routine\n        function validateAllInputs() {\n            let isValid = true;\n            \n            \/\/ Validate rated load\n            const ratedRaw = ratedLoadInput.value;\n            const ratedCheck = validateSingleInput(ratedRaw, 'Rated load');\n            if (!ratedCheck.valid) {\n                setErrorForInput(ratedLoadInput, errorRated, ratedCheck.message);\n                isValid = false;\n            } else {\n                clearErrorForInput(ratedLoadInput, errorRated);\n            }\n            \n            \/\/ Validate hook weight\n            const hookRaw = hookWeightInput.value;\n            const hookCheck = validateSingleInput(hookRaw, 'Hook &#038; attachment mass');\n            if (!hookCheck.valid) {\n                setErrorForInput(hookWeightInput, errorHook, hookCheck.message);\n                isValid = false;\n            } else {\n                clearErrorForInput(hookWeightInput, errorHook);\n            }\n            \n            \/\/ Validate trolley weight\n            const trolleyRaw = trolleyWeightInput.value;\n            const trolleyCheck = validateSingleInput(trolleyRaw, 'Trolley self-weight');\n            if (!trolleyCheck.valid) {\n                setErrorForInput(trolleyWeightInput, errorTrolley, trolleyCheck.message);\n                isValid = false;\n            } else {\n                clearErrorForInput(trolleyWeightInput, errorTrolley);\n            }\n            \n            \/\/ Validate phi\n            const phiCheck = validatePhi();\n            if (!phiCheck.valid) {\n                setErrorForInput(phiSelect, errorPhi, phiCheck.message);\n                isValid = false;\n            } else {\n                clearErrorForInput(phiSelect, errorPhi);\n            }\n            \n            if (isValid) {\n                return {\n                    valid: true,\n                    Q: parseFloat(ratedLoadInput.value),\n                    Qh: parseFloat(hookWeightInput.value),\n                    Gt: parseFloat(trolleyWeightInput.value),\n                    phi: parseFloat(phiSelect.value)\n                };\n            } else {\n                return { valid: false };\n            }\n        }\n        \n        \/\/ compute and update result (2 decimals)\n        function computeAndDisplay() {\n            const validation = validateAllInputs();\n            if (!validation.valid) {\n                resultSpan.textContent = '-- kN';\n                calcDetailSpan.textContent = '';\n                return;\n            }\n            \n            const { Q, Qh, Gt, phi } = validation;\n            const sumTon = Q + Qh + Gt;\n            const dynamicTonForce = phi * sumTon;\n            const dynamicKN = dynamicTonForce * TON_TO_KN;\n            const roundedKN = Math.round(dynamicKN * 100) \/ 100;\n            resultSpan.textContent = roundedKN.toFixed(2) + ' kN';\n            \n            \/\/ detail expression: consistent formatting\n            const sumFixed = sumTon.toFixed(3);\n            const phiFixed = phi.toFixed(3);\n            calcDetailSpan.innerHTML = `${phiFixed} \u00d7 (${Q.toFixed(2)} + ${Qh.toFixed(2)} + ${Gt.toFixed(2)}) t = ${phiFixed} \u00d7 ${sumFixed} t = ${dynamicTonForce.toFixed(3)} t \u2192 ${roundedKN.toFixed(2)} kN`;\n        }\n        \n        \/\/ reset all inputs to default values, clear errors &#038; reset result\n        function resetCalculator() {\n            ratedLoadInput.value = '20.0';\n            hookWeightInput.value = '0.6';\n            trolleyWeightInput.value = '5.4';\n            phiSelect.value = '1.25';   \/\/ medium duty default\n            \n            clearAllErrors();\n            \n            \/\/ reset result display\n            resultSpan.textContent = '-- kN';\n            calcDetailSpan.textContent = '';\n            \n            \/\/ additionally, remove error classes from all inputs (already cleared, but ensure)\n            inputFields.forEach(field => {\n                field.element.classList.remove('error-input');\n            });\n            if (phiSelect) phiSelect.classList.remove('error-input');\n        }\n        \n        \/\/ setup dynamic error clearing on input\/change\n        function setupDynamicErrorClearing() {\n            ratedLoadInput.addEventListener('input', function() {\n                clearErrorForInput(ratedLoadInput, errorRated);\n            });\n            hookWeightInput.addEventListener('input', function() {\n                clearErrorForInput(hookWeightInput, errorHook);\n            });\n            trolleyWeightInput.addEventListener('input', function() {\n                clearErrorForInput(trolleyWeightInput, errorTrolley);\n            });\n            phiSelect.addEventListener('change', function() {\n                clearErrorForInput(phiSelect, errorPhi);\n            });\n        }\n        \n        \/\/ calculate action\n        function onCalculate() {\n            computeAndDisplay();\n        }\n        \n        \/\/ reset action\n        function onReset() {\n            resetCalculator();\n        }\n        \n        \/\/ initialization\n        function init() {\n            setupDynamicErrorClearing();\n            calcBtn.addEventListener('click', onCalculate);\n            resetBtn.addEventListener('click', onReset);\n            \/\/ initial compute with default values (shows result on page load)\n            computeAndDisplay();\n        }\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', init);\n        } else {\n            init();\n        }\n    })();\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f4ng th\u1ee9c t\u00ednh to\u00e1n t\u1ea3i tr\u1ecdng \u0111\u1ed9ng c\u1ee7a c\u1ea7n c\u1ea9u<\/h2>\n\n\n\n<p>P<sub>d<\/sub>=\u03c6(Q+Q<sub>h<\/sub>+G<sub>t<\/sub>)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>P<sub>d<\/sub>: T\u1ea3i \u0111\u1ed9ng<\/li>\n\n\n\n<li>\u03c6: H\u1ec7 s\u1ed1 \u1ea3nh h\u01b0\u1edfng<\/li>\n\n\n\n<li>H\u1ecfi: T\u1ea3i tr\u1ecdng \u0111\u1ecbnh m\u1ee9c<\/li>\n\n\n\n<li>Q<sub>h<\/sub>: Tr\u1ecdng l\u01b0\u1ee3ng c\u1ee7a m\u00f3c v\u00e0 b\u1ed9 ph\u1eadn n\u00e2ng<\/li>\n\n\n\n<li>G<sub>t<\/sub>Tr\u1ecdng l\u01b0\u1ee3ng b\u1ea3n th\u00e2n c\u1ee7a xe \u0111\u1ea9y<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Ghi ch\u00fa<\/h2>\n\n\n\n<p>Trong v\u1eadn h\u00e0nh th\u1ef1c t\u1ebf c\u1ee7a c\u1ea7n c\u1ea9u, c\u00e1c l\u1ef1c t\u00e1c \u0111\u1ed9ng l\u00ean n\u00f3 lu\u00f4n l\u1edbn h\u01a1n t\u1ea3i tr\u1ecdng t\u0129nh. T\u00e1c \u0111\u1ed9ng c\u1ee7a vi\u1ec7c n\u00e2ng v\u00e0 kh\u1edfi \u0111\u1ed9ng, qu\u00e1n t\u00ednh trong qu\u00e1 tr\u00ecnh phanh, \u0111\u1ed9 rung do gia t\u1ed1c \u0111\u1ed9ng c\u01a1 v\u00e0 l\u1ef1c \u0111\u1ed9ng do s\u1ef1 l\u1eafc l\u01b0 c\u1ee7a t\u1ea3i tr\u1ecdng \u0111\u1ec1u \u0111\u01b0\u1ee3c khu\u1ebfch \u0111\u1ea1i. Do \u0111\u00f3, c\u00e1c y\u1ebfu t\u1ed1 n\u00e0y c\u1ea7n \u0111\u01b0\u1ee3c nh\u00e2n v\u1edbi h\u1ec7 s\u1ed1 t\u1ea3i tr\u1ecdng \u0111\u1ed9ng trong qu\u00e1 tr\u00ecnh t\u00ednh to\u00e1n.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0110\u1ed1i v\u1edbi \u0111i\u1ec1u ki\u1ec7n t\u1ed1c \u0111\u1ed9 th\u1ea5p, t\u1ea3i nh\u1eb9 ho\u1eb7c \u0111i\u1ec1u khi\u1ec3n ch\u00ednh x\u00e1c, \u03c6=1.1<\/li>\n\n\n\n<li>\u0110\u1ed1i v\u1edbi c\u1ea7n c\u1ea9u c\u00f4ng nghi\u1ec7p th\u00f4ng th\u01b0\u1eddng, \u03c6=1,2-1,3<\/li>\n\n\n\n<li>\u0110\u1ed1i v\u1edbi \u0111i\u1ec1u ki\u1ec7n l\u00e0m vi\u1ec7c kh\u1eafc nghi\u1ec7t ho\u1eb7c t\u1ea3i n\u1eb7ng, ho\u1eb7c tr\u1ea1ng th\u00e1i v\u1eadn h\u00e0nh c\u00f3 t\u00e1c \u0111\u1ed9ng \u0111\u00e1ng k\u1ec3, \u03c6=1,4-1,6<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">C\u1ea7n c\u1ea9u \u00e1p d\u1ee5ng<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u1ea7u tr\u1ee5c<\/li>\n\n\n\n<li>S\u1ebfu Gnatry<\/li>\n\n\n\n<li>Xe \u0111\u1ea9y\/m\u00e1y n\u00e2ng \u0111i\u1ec7n<\/li>\n\n\n\n<li>C\u1ea9u C\u1ea3ng<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">T\u00ecnh hu\u1ed1ng kh\u00f4ng \u00e1p d\u1ee5ng<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>M\u00e1y m\u00f3c quay t\u1ed1c \u0111\u1ed9 cao (Tuabin, \u0110\u1ed9ng c\u01a1)<\/li>\n\n\n\n<li>H\u1ec7 th\u1ed1ng tr\u1ee5c ch\u00ednh m\u00e1y c\u00f4ng c\u1ee5 ch\u00ednh x\u00e1c<\/li>\n\n\n\n<li>H\u1ec7 th\u1ed1ng n\u00e2ng h\u1ea1 th\u00f4ng minh (Ki\u1ec3m so\u00e1t ch\u1ed1ng rung l\u1eafc t\u1ef1 \u0111\u1ed9ng)<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"Gi\u00e1 tr\u1ecb c\u1ed1t l\u00f5i c\u1ee7a m\u00e1y t\u00ednh t\u1ea3i tr\u1ecdng \u0111\u1ed9ng c\u1ea7n c\u1ea9u l\u00e0 ph\u1ea3n \u00e1nh c\u00e1c t\u1ea3i tr\u1ecdng ph\u00e1t sinh th\u00eam trong qu\u00e1 tr\u00ecnh v\u1eadn h\u00e0nh th\u1ef1c t\u1ebf thay v\u00ec ch\u1ec9 tr\u1ecdng l\u01b0\u1ee3ng n\u00e2ng t\u0129nh, nh\u1eb1m \u0111\u00e1nh gi\u00e1 ch\u00ednh x\u00e1c t\u00e1c \u0111\u1ed9ng c\u1ee7a c\u00e1c hi\u1ec7n t\u01b0\u1ee3ng \u0111\u1ed9ng nh\u01b0 kh\u1edfi \u0111\u1ed9ng n\u00e2ng h\u1ea1, phanh, va \u0111\u1eadp khi v\u1eadn h\u00e0nh, rung \u0111\u1ed9ng v\u00e0 l\u1eafc l\u01b0 c\u1ee7a t\u1ea3i tr\u1ecdng l\u00ean k\u1ebft c\u1ea5u v\u00e0 c\u01a1 c\u1ea5u c\u1ea7n c\u1ea9u. N\u00f3 h\u1ed7 tr\u1ee3 hi\u1ec7u qu\u1ea3 vi\u1ec7c ki\u1ec3m tra \u0111\u1ed9 b\u1ec1n v\u00e0 \u0111\u1ed9 v\u00f5ng c\u1ee7a d\u1ea7m ch\u00ednh, ph\u00e2n t\u00edch \u00e1p l\u1ef1c d\u1ea7m cu\u1ed1i v\u00e0 \u1ee9ng su\u1ea5t ray, c\u0169ng nh\u01b0 l\u1ef1a ch\u1ecdn lo\u1ea1i v\u00e0 ki\u1ec3m \u0111\u1ecbnh an to\u00e0n \u0111\u1ed9ng c\u01a1, phanh v\u00e0 c\u00e1c b\u1ed9 ph\u1eadn quan tr\u1ecdng kh\u00e1c, v\u00e0 \u0111\u00f3ng vai tr\u00f2 l\u00e0 c\u01a1 s\u1edf quan tr\u1ecdng cho thi\u1ebft k\u1ebf k\u1ebft c\u1ea5u, \u0111\u00e1nh gi\u00e1 tu\u1ed5i th\u1ecd v\u00e0 ch\u1ee9ng nh\u1eadn an to\u00e0n c\u1ee7a c\u1ea7n c\u1ea9u tr\u00ean cao v\u00e0 c\u1ea7n c\u1ea9u gi\u00e0n theo ti\u00eau chu\u1ea9n ISO, FEM, EN v\u00e0 GB.","protected":false},"author":8,"featured_media":17038,"parent":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"single-onlinetools.php","format":"standard","meta":{"_acf_changed":false,"rank_math_lock_modified_date":false,"pgc_sgb_lightbox_settings":"","footnotes":""},"categories":[63],"tags":[],"class_list":["post-17030","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-other"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/posts\/17030"}],"collection":[{"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/comments?post=17030"}],"version-history":[{"count":6,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/posts\/17030\/revisions"}],"predecessor-version":[{"id":17039,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/posts\/17030\/revisions\/17039"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/media\/17038"}],"wp:attachment":[{"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/media?parent=17030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/categories?post=17030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/tags?post=17030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}