{"id":17375,"date":"2026-09-20T07:01:59","date_gmt":"2026-09-20T07:01:59","guid":{"rendered":"https:\/\/www.dgcrane.com\/?p=17375"},"modified":"2026-09-20T07:02:02","modified_gmt":"2026-09-20T07:02:02","slug":"crane-travelling-static-resistance-calculator","status":"publish","type":"post","link":"https:\/\/www.dgcrane.com\/vi\/crane-travelling-static-resistance-calculator\/","title":{"rendered":"M\u00e1y t\u00ednh \u0111i\u1ec7n tr\u1edf t\u0129nh khi di chuy\u1ec3n c\u1ea7n c\u1ea9u"},"content":{"rendered":"<div id=\"calculator\">\n  <div class=\"calculator-shell\">\n    <form id=\"calculator-form\" novalidate action=\"\">\n      <span class=\"calculator-sr-only\">C\u01a1 s\u1edf t\u00ednh to\u00e1n: EN 13135:2026. Ph\u1ea1m vi \u00e1p d\u1ee5ng: b\u00e1nh xe th\u00e9p c\u00f3 \u1ed5 l\u0103n tr\u00ean ray th\u00e9p. Ti\u00eau chu\u1ea9n ISO 8686-1:2012 kh\u00f4ng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng cho ph\u01b0\u01a1ng tr\u00ecnh n\u00e0y. Ng\u00e0y ki\u1ec3m \u0111\u1ecbnh: 17\/09\/2026.<\/span>\n\n      <section class=\"calculator-section\">\n        <div class=\"calculator-grid\">\n          <div class=\"calculator-field\">\n            <label for=\"calculator-loadMass\">T\u1ea3i \u0111\u1ecbnh m\u1ee9c, G<sub>N<\/sub> (Kil\u00f4gam)<\/label>\n            <input id=\"calculator-loadMass\" name=\"loadMass\" type=\"number\" inputmode=\"decimal\" min=\"0\" max=\"1000000000\" step=\"any\" value=\"10000\" aria-describedby=\"calculator-loadMass-error\">\n            <span id=\"calculator-loadMass-error\" class=\"error-msg\" aria-live=\"polite\"><\/span>\n          <\/div>\n\n          <div class=\"calculator-field\">\n            <label for=\"calculator-gravity\">Gia t\u1ed1c tr\u1ecdng tr\u01b0\u1eddng, g (N\/kg)<\/label>\n            <input id=\"calculator-gravity\" name=\"gravity\" type=\"number\" inputmode=\"decimal\" min=\"1\" max=\"20\" step=\"any\" value=\"10\" aria-describedby=\"calculator-gravity-error\">\n            <span id=\"calculator-gravity-error\" class=\"error-msg\" aria-live=\"polite\"><\/span>\n          <\/div>\n\n          <div class=\"calculator-field\">\n            <label for=\"calculator-gradient\">\u0110\u1ed9 d\u1ed1c l\u00ean d\u1ed1c, i (\u2030)<\/label>\n            <input id=\"calculator-gradient\" name=\"gradient\" type=\"number\" inputmode=\"decimal\" min=\"0\" max=\"100\" step=\"any\" value=\"1\" aria-describedby=\"calculator-gradient-error\">\n            <span id=\"calculator-gradient-error\" class=\"error-msg\" aria-live=\"polite\"><\/span>\n          <\/div>\n\n          <div class=\"calculator-field\">\n            <label for=\"calculator-wheelType\">C\u1ea5u tr\u00fac b\u00e1nh xe<\/label>\n            <select id=\"calculator-wheelType\" name=\"wheelType\">\n              <option value=\"flanged\" selected>B\u00e1nh xe c\u00f3 g\u1edd<\/option>\n              <option value=\"flangeless\">B\u00e1nh xe kh\u00f4ng v\u00e0nh<\/option>\n            <\/select>\n            <span id=\"calculator-wheelType-error\" class=\"error-msg\" aria-live=\"polite\"><\/span>\n          <\/div>\n\n          <div class=\"calculator-field\">\n            <label for=\"calculator-craneMass\">Kh\u1ed1i l\u01b0\u1ee3ng ri\u00eang c\u1ee7a c\u1ea7n c\u1ea9u, G (kg)<\/label>\n            <input id=\"calculator-craneMass\" name=\"craneMass\" type=\"number\" inputmode=\"decimal\" min=\"0.000001\" max=\"1000000000\" step=\"any\" value=\"20000\" aria-describedby=\"calculator-craneMass-error\">\n            <span id=\"calculator-craneMass-error\" class=\"error-msg\" aria-live=\"polite\"><\/span>\n          <\/div>\n\n          <div class=\"calculator-field\">\n            <label for=\"calculator-trolleyMass\">Kh\u1ed1i l\u01b0\u1ee3ng ri\u00eang c\u1ee7a xe \u0111\u1ea9y, G<sub>1<\/sub> (Kil\u00f4gam)<\/label>\n            <input id=\"calculator-trolleyMass\" name=\"trolleyMass\" type=\"number\" inputmode=\"decimal\" min=\"0.000001\" max=\"1000000000\" step=\"any\" value=\"2000\" aria-describedby=\"calculator-trolleyMass-error\">\n            <span id=\"calculator-trolleyMass-error\" class=\"error-msg\" aria-live=\"polite\"><\/span>\n          <\/div>\n\n          <div class=\"calculator-field\">\n            <label for=\"calculator-craneDiameter\">B\u00e1nh xe c\u1ea7n c\u1ea9u D<sub>w<\/sub> (mm)<\/label>\n            <select id=\"calculator-craneDiameter\" name=\"craneDiameter\">\n              <option value=\"50\">50<\/option>\n              <option value=\"80\">80<\/option>\n              <option value=\"100\">100<\/option>\n              <option value=\"125\">125<\/option>\n              <option value=\"160\">160<\/option>\n              <option value=\"250\">250<\/option>\n              <option value=\"320\">320<\/option>\n              <option value=\"400\" selected>400<\/option>\n              <option value=\"630\">630 tr\u1edf l\u00ean<\/option>\n            <\/select>\n            <span id=\"calculator-craneDiameter-error\" class=\"error-msg\" aria-live=\"polite\"><\/span>\n          <\/div>\n\n          <div class=\"calculator-field\">\n            <label for=\"calculator-craneFactor\">Y\u1ebfu t\u1ed1 c\u1ea7n c\u1ea9u, F<sub>r<\/sub><\/label>\n            <select id=\"calculator-craneFactor\" name=\"craneFactor\" aria-describedby=\"calculator-craneFactor-error\"><\/select>\n            <span id=\"calculator-craneFactor-error\" class=\"error-msg\" aria-live=\"polite\"><\/span>\n          <\/div>\n\n          <div class=\"calculator-field\">\n            <label for=\"calculator-trolleyDiameter\">B\u00e1nh xe \u0111\u1ea9y D<sub>w<\/sub> (mm)<\/label>\n            <select id=\"calculator-trolleyDiameter\" name=\"trolleyDiameter\">\n              <option value=\"50\">50<\/option>\n              <option value=\"80\">80<\/option>\n              <option value=\"100\">100<\/option>\n              <option value=\"125\">125<\/option>\n              <option value=\"160\" selected>160<\/option>\n              <option value=\"250\">250<\/option>\n              <option value=\"320\">320<\/option>\n              <option value=\"400\">400<\/option>\n              <option value=\"630\">630 tr\u1edf l\u00ean<\/option>\n            <\/select>\n            <span id=\"calculator-trolleyDiameter-error\" class=\"error-msg\" aria-live=\"polite\"><\/span>\n          <\/div>\n\n          <div class=\"calculator-field\">\n            <label for=\"calculator-trolleyFactor\">H\u1ec7 s\u1ed1 xe \u0111\u1ea9y, F<sub>r<\/sub><\/label>\n            <select id=\"calculator-trolleyFactor\" name=\"trolleyFactor\" aria-describedby=\"calculator-trolleyFactor-error\"><\/select>\n            <span id=\"calculator-trolleyFactor-error\" class=\"error-msg\" aria-live=\"polite\"><\/span>\n          <\/div>\n        <\/div>\n      <\/section>\n\n      <div id=\"calculator-error-summary\" class=\"calculator-error-summary\" role=\"alert\" tabindex=\"-1\"><\/div>\n\n      <div class=\"calculator-actions\">\n        <button type=\"submit\">T\u00ednh to\u00e1n<\/button>\n        <button type=\"reset\" class=\"calculator-reset\">C\u00e0i l\u1ea1i<\/button>\n      <\/div>\n    <input type=\"hidden\" name=\"trp-form-language\" value=\"vi\"\/><\/form>\n\n    <section class=\"calculator-results\" aria-live=\"polite\" aria-atomic=\"true\">\n      <div class=\"calculator-result-card calculator-result-main\">\n        <span>\u0110i\u1ec7n tr\u1edf t\u0129nh khi di chuy\u1ec3n c\u1ea7n c\u1ea9u, F<sub>st,max<\/sub><\/span>\n        <strong id=\"calculator-craneTotal\">\u2014<\/strong>\n      <\/div>\n\n      <div class=\"calculator-result-card\">\n        <span>\u0110i\u1ec7n tr\u1edf t\u0129nh c\u1ee7a xe \u0111\u1ea9y, F<sub>st,max<\/sub><\/span>\n        <strong id=\"calculator-trolleyTotal\">\u2014<\/strong>\n      <\/div>\n    <\/section>\n  <\/div>\n\n  <style>\n    #calculator {\n      --primary-color: #0a3487;\n      --primary-hover: #F58423;\n      --error-color: #e53935;\n      --bg-color: #EAEEF7;\n      --text-color: #4a4a4a;\n      --surface-color: #ffffff;\n      --border-color: #cccccc;\n      --soft-primary: #edf2ff;\n      --soft-error: #fff3f2;\n      --focus-shadow: rgba(10, 52, 135, 0.18);\n\n      max-width: 545px;\n      margin: 0 auto;\n      padding: 30px;\n      color: var(--text-color);\n      background: var(--bg-color);\n      font-family: Arial, Helvetica, sans-serif;\n      line-height: 1.5;\n      box-sizing: border-box;\n    }\n\n    #calculator *,\n    #calculator *::before,\n    #calculator *::after {\n      box-sizing: border-box;\n    }\n\n    #calculator .calculator-shell {\n      padding: 24px;\n      border-top: 5px solid var(--primary-color);\n      background: var(--surface-color);\n    }\n\n    #calculator .calculator-sr-only {\n      position: absolute;\n      width: 1px;\n      height: 1px;\n      padding: 0;\n      margin: -1px;\n      overflow: hidden;\n      clip: rect(0, 0, 0, 0);\n      white-space: nowrap;\n      border: 0;\n    }\n\n    #calculator .calculator-section {\n      margin: 0 0 16px;\n      padding: 16px;\n      background: var(--bg-color);\n    }\n\n    #calculator .calculator-grid {\n      display: grid;\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n      gap: 12px 14px;\n      align-items: start;\n    }\n\n    #calculator .calculator-field {\n      min-width: 0;\n    }\n\n    #calculator label,\n    #calculator button,\n    #calculator select {\n      font-size: 14px;\n    }\n\n    #calculator label {\n      display: flex;\n      min-height: 38px;\n      margin-bottom: 5px;\n      align-items: flex-end;\n      font-weight: 700;\n    }\n\n    #calculator input,\n    #calculator select,\n    #calculator button {\n      width: 100%;\n      border-radius: 0;\n      transition: 0.2s ease;\n    }\n\n    #calculator input,\n    #calculator select {\n      height: 36px;\n      padding: 5px 9px;\n      border: 1px solid var(--border-color);\n      color: var(--text-color);\n      background: var(--surface-color);\n      font-size: 16px;\n    }\n\n    #calculator input:focus,\n    #calculator select:focus {\n      border: 2px solid var(--primary-color);\n      outline: 0;\n      box-shadow: 0 0 0 3px var(--focus-shadow);\n    }\n\n    #calculator input.error,\n    #calculator select.error,\n    #calculator input.error:focus,\n    #calculator select.error:focus {\n      border: 2px solid var(--error-color);\n      box-shadow: none;\n    }\n\n    #calculator .error-msg {\n      display: none;\n      margin-top: 5px;\n      color: var(--error-color);\n      font-size: 12px;\n      font-weight: 700;\n    }\n\n    #calculator .error-msg.visible {\n      display: block;\n    }\n\n    #calculator .calculator-error-summary {\n      display: none;\n      margin-bottom: 14px;\n      padding: 10px;\n      border-left: 4px solid var(--error-color);\n      color: var(--error-color);\n      background: var(--soft-error);\n      font-weight: 700;\n    }\n\n    #calculator .calculator-error-summary.visible {\n      display: block;\n    }\n\n    #calculator .calculator-actions {\n      display: flex;\n      gap: 12px;\n      margin-top: 4px;\n    }\n\n    #calculator button {\n      height: 34px;\n      padding: 0 16px;\n      border: 0;\n      color: var(--surface-color);\n      background: var(--primary-color);\n      font-weight: 700;\n      line-height: 34px;\n      cursor: pointer;\n    }\n\n    #calculator button:hover,\n    #calculator button:focus-visible {\n      background: var(--primary-hover);\n      outline: 2px solid var(--primary-color);\n      outline-offset: 2px;\n    }\n\n    #calculator button.calculator-reset {\n      color: var(--primary-color);\n      background: var(--surface-color);\n      border: 1px solid var(--primary-color);\n    }\n\n    #calculator button.calculator-reset:hover,\n    #calculator button.calculator-reset:focus-visible {\n      color: var(--surface-color);\n      background: var(--primary-hover);\n    }\n\n    #calculator .calculator-results {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 12px;\n      margin-top: 18px;\n    }\n\n    #calculator .calculator-result-card {\n      margin: 0;\n      padding: 14px;\n      border-left: 4px solid var(--primary-color);\n      background: var(--soft-primary);\n    }\n\n    #calculator .calculator-result-card > span {\n      display: block;\n      font-size: 13px;\n      font-weight: 700;\n    }\n\n    #calculator .calculator-result-card strong {\n      display: block;\n      margin: 4px 0 10px;\n      color: var(--primary-color);\n      font-size: 32px;\n      line-height: 1.15;\n      overflow-wrap: anywhere;\n    }\n\n    @media (max-width: 768px) {\n      #calculator {\n        padding: 0.3rem;\n      }\n\n      #calculator .calculator-shell {\n        padding: 0.3rem;\n      }\n\n      #calculator label,\n      #calculator input,\n      #calculator select,\n      #calculator button {\n        font-size: 0.28rem;\n      }\n\n      #calculator input,\n      #calculator select,\n      #calculator button {\n        min-height: 0.7rem;\n        height: 0.7rem;\n      }\n\n      #calculator button {\n        line-height: 0.7rem;\n      }\n\n      #calculator .calculator-actions {\n        flex-direction: column;\n      }\n\n      #calculator .calculator-actions button {\n        width: 100%;\n      }\n\n      #calculator .calculator-grid {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        gap: 0.24rem;\n      }\n\n      #calculator label {\n        min-height: 0.7rem;\n      }\n\n      #calculator .calculator-results {\n        grid-template-columns: 1fr;\n      }\n    }\n\n    @media (prefers-reduced-motion: reduce) {\n      #calculator *,\n      #calculator *::before,\n      #calculator *::after {\n        transition: none;\n      }\n    }\n  <\/style>\n\n  <script>\n    (() => {\n      \"use strict\";\n\n      const root = document.getElementById(\"calculator\");\n      if (!root) return;\n\n      const form = root.querySelector(\"#calculator-form\");\n      const summary = root.querySelector(\"#calculator-error-summary\");\n\n      const diameterPoints = [\n        50, 80, 100, 125, 160, 250, 320, 400, 630\n      ];\n\n      const factorSets = {\n        flanged: [\n          0.013, 0.011, 0.010, 0.009, 0.008,\n          0.0065, 0.006, 0.0055, 0.005\n        ],\n        flangeless: [\n          0.011, 0.0095, 0.0085, 0.0075, 0.007,\n          0.0055, 0.0052, 0.005, 0.0045\n        ]\n      };\n\n      const fields = {\n        loadMass: root.querySelector(\"#calculator-loadMass\"),\n        gravity: root.querySelector(\"#calculator-gravity\"),\n        gradient: root.querySelector(\"#calculator-gradient\"),\n        wheelType: root.querySelector(\"#calculator-wheelType\"),\n        craneMass: root.querySelector(\"#calculator-craneMass\"),\n        craneDiameter: root.querySelector(\"#calculator-craneDiameter\"),\n        craneFactor: root.querySelector(\"#calculator-craneFactor\"),\n        trolleyMass: root.querySelector(\"#calculator-trolleyMass\"),\n        trolleyDiameter: root.querySelector(\"#calculator-trolleyDiameter\"),\n        trolleyFactor: root.querySelector(\"#calculator-trolleyFactor\")\n      };\n\n      const outputs = {\n        craneTotal: root.querySelector(\"#calculator-craneTotal\"),\n        trolleyTotal: root.querySelector(\"#calculator-trolleyTotal\")\n      };\n\n      function setError(fieldName, message) {\n        const input = fields[fieldName];\n        const error = root.querySelector(\n          `#calculator-${fieldName}-error`\n        );\n\n        input.classList.add(\"error\");\n        input.setAttribute(\"aria-invalid\", \"true\");\n\n        if (error) {\n          error.textContent = message;\n          error.classList.add(\"visible\");\n        }\n      }\n\n      function clearError(fieldName) {\n        const input = fields[fieldName];\n        const error = root.querySelector(\n          `#calculator-${fieldName}-error`\n        );\n\n        input.classList.remove(\"error\");\n        input.removeAttribute(\"aria-invalid\");\n\n        if (error) {\n          error.textContent = \"\";\n          error.classList.remove(\"visible\");\n        }\n      }\n\n      function validateInput(\n        fieldName,\n        label,\n        minimum,\n        maximum,\n        allowZero\n      ) {\n        const input = fields[fieldName];\n        const value = Number.parseFloat(input.value);\n\n        clearError(fieldName);\n\n        if (\n          input.value.trim() === \"\" ||\n          !Number.isFinite(value)\n        ) {\n          setError(\n            fieldName,\n            `${label} is required and must be a finite number.`\n          );\n          return null;\n        }\n\n        if (\n          (!allowZero && value <= minimum) ||\n          (allowZero &#038;&#038; value < minimum) ||\n          value > maximum\n        ) {\n          const relation = allowZero\n            ? `from ${minimum}`\n            : `greater than ${minimum}`;\n\n          setError(\n            fieldName,\n            `${label} must be ${relation} and no more than ${maximum}.`\n          );\n          return null;\n        }\n\n        return value;\n      }\n\n      function rollingFactor(wheelType, diameter) {\n        const factors = factorSets[wheelType];\n\n        if (!factors) {\n          throw new Error(\"Unsupported wheel construction.\");\n        }\n\n        const index = diameterPoints.indexOf(Number(diameter));\n\n        if (index === -1) {\n          throw new Error(\n            \"Unsupported wheel diameter selection.\"\n          );\n        }\n\n        return factors[index];\n      }\n\n      function calculateTravelResistance(\n        loadMass,\n        selfMass,\n        gravity,\n        gradientPerMille,\n        factor\n      ) {\n        const normalForce =\n          (loadMass + selfMass) * gravity;\n\n        const rolling =\n          normalForce * factor;\n\n        const grade =\n          normalForce * gradientPerMille \/ 1000;\n\n        return {\n          total: rolling + grade\n        };\n      }\n\n      function clearResults() {\n        outputs.craneTotal.textContent = \"\u2014\";\n        outputs.trolleyTotal.textContent = \"\u2014\";\n      }\n\n      function formatForce(value) {\n        return `${value.toLocaleString(\"en-US\", {\n          minimumFractionDigits: 2,\n          maximumFractionDigits: 2\n        })} N`;\n      }\n\n      function formatFactor(value) {\n        return value\n          .toFixed(6)\n          .replace(\/0+$\/, \"\")\n          .replace(\/\\.$\/, \"\");\n      }\n\n      function populateFactorOptions(prefix) {\n        const wheelType = fields.wheelType.value;\n        const diameter =\n          Number(fields[`${prefix}Diameter`].value);\n\n        const factorSelect =\n          fields[`${prefix}Factor`];\n\n        const factors = factorSets[wheelType];\n\n        const options = factors.map((factor) => {\n          const option =\n            document.createElement(\"option\");\n\n          option.value = String(factor);\n          option.textContent =\n            formatFactor(factor);\n\n          return option;\n        });\n\n        factorSelect.replaceChildren(...options);\n\n        factorSelect.value = String(\n          rollingFactor(wheelType, diameter)\n        );\n      }\n\n      function syncWheelSelectors(\n        prefix,\n        changedField\n      ) {\n        const wheelType =\n          fields.wheelType.value;\n\n        const diameterSelect =\n          fields[`${prefix}Diameter`];\n\n        const factorSelect =\n          fields[`${prefix}Factor`];\n\n        if (changedField === \"type\") {\n          populateFactorOptions(prefix);\n          return;\n        }\n\n        if (changedField === \"factor\") {\n          const factor =\n            Number(factorSelect.value);\n\n          const index =\n            factorSets[wheelType].findIndex(\n              (candidate) => candidate === factor\n            );\n\n          if (index !== -1) {\n            diameterSelect.value =\n              String(diameterPoints[index]);\n          }\n\n          return;\n        }\n\n        factorSelect.value = String(\n          rollingFactor(\n            wheelType,\n            Number(diameterSelect.value)\n          )\n        );\n      }\n\n      function readAndValidate() {\n        const values = {\n          loadMass: validateInput(\n            \"loadMass\",\n            \"Rated load\",\n            0,\n            1000000000,\n            true\n          ),\n\n          gravity: validateInput(\n            \"gravity\",\n            \"Gravity\",\n            1,\n            20,\n            false\n          ),\n\n          gradient: validateInput(\n            \"gradient\",\n            \"Uphill gradient\",\n            0,\n            100,\n            true\n          ),\n\n          craneMass: validateInput(\n            \"craneMass\",\n            \"Crane self mass\",\n            0,\n            1000000000,\n            false\n          ),\n\n          craneDiameter:\n            Number(fields.craneDiameter.value),\n\n          craneFactor:\n            Number(fields.craneFactor.value),\n\n          trolleyMass: validateInput(\n            \"trolleyMass\",\n            \"Trolley self mass\",\n            0,\n            1000000000,\n            false\n          ),\n\n          trolleyDiameter:\n            Number(fields.trolleyDiameter.value),\n\n          trolleyFactor:\n            Number(fields.trolleyFactor.value),\n\n          wheelType:\n            fields.wheelType.value\n        };\n\n        const linkedSelectionsValid =\n          values.craneFactor === rollingFactor(\n            values.wheelType,\n            values.craneDiameter\n          ) &&\n          values.trolleyFactor === rollingFactor(\n            values.wheelType,\n            values.trolleyDiameter\n          );\n\n        const invalid =\n          Object.entries(values).filter(\n            ([name, value]) =>\n              name !== \"wheelType\" &&\n              (\n                value === null ||\n                !Number.isFinite(value)\n              )\n          );\n\n        if (!linkedSelectionsValid) {\n          setError(\n            \"craneFactor\",\n            \"Wheel construction, diameter and factor must match.\"\n          );\n\n          setError(\n            \"trolleyFactor\",\n            \"Wheel construction, diameter and factor must match.\"\n          );\n\n          return null;\n        }\n\n        return invalid.length ? null : values;\n      }\n\n      function showResults(crane, trolley) {\n        outputs.craneTotal.textContent =\n          formatForce(crane.total);\n\n        outputs.trolleyTotal.textContent =\n          formatForce(trolley.total);\n      }\n\n      populateFactorOptions(\"crane\");\n      populateFactorOptions(\"trolley\");\n\n      fields.wheelType.addEventListener(\n        \"change\",\n        () => {\n          syncWheelSelectors(\"crane\", \"type\");\n          syncWheelSelectors(\"trolley\", \"type\");\n        }\n      );\n\n      fields.craneDiameter.addEventListener(\n        \"change\",\n        () => syncWheelSelectors(\n          \"crane\",\n          \"diameter\"\n        )\n      );\n\n      fields.craneFactor.addEventListener(\n        \"change\",\n        () => syncWheelSelectors(\n          \"crane\",\n          \"factor\"\n        )\n      );\n\n      fields.trolleyDiameter.addEventListener(\n        \"change\",\n        () => syncWheelSelectors(\n          \"trolley\",\n          \"diameter\"\n        )\n      );\n\n      fields.trolleyFactor.addEventListener(\n        \"change\",\n        () => syncWheelSelectors(\n          \"trolley\",\n          \"factor\"\n        )\n      );\n\n      Object.keys(fields).forEach(\n        (fieldName) => {\n          fields[fieldName].addEventListener(\n            \"input\",\n            () => clearError(fieldName)\n          );\n\n          fields[fieldName].addEventListener(\n            \"change\",\n            () => clearError(fieldName)\n          );\n        }\n      );\n\n      form.addEventListener(\n        \"submit\",\n        (event) => {\n          event.preventDefault();\n\n          summary.textContent = \"\";\n          summary.classList.remove(\"visible\");\n\n          const values = readAndValidate();\n\n          if (!values) {\n            clearResults();\n\n            summary.textContent =\n              \"Please correct the highlighted fields.\";\n\n            summary.classList.add(\"visible\");\n            summary.focus();\n            return;\n          }\n\n          const crane =\n            calculateTravelResistance(\n              values.loadMass,\n              values.craneMass,\n              values.gravity,\n              values.gradient,\n              values.craneFactor\n            );\n\n          const trolley =\n            calculateTravelResistance(\n              values.loadMass,\n              values.trolleyMass,\n              values.gravity,\n              values.gradient,\n              values.trolleyFactor\n            );\n\n          showResults(crane, trolley);\n        }\n      );\n\n      form.addEventListener(\n        \"reset\",\n        () => {\n          window.setTimeout(() => {\n            Object.keys(fields).forEach(\n              clearError\n            );\n\n            summary.textContent = \"\";\n            summary.classList.remove(\"visible\");\n\n            populateFactorOptions(\"crane\");\n            populateFactorOptions(\"trolley\");\n            clearResults();\n          }, 0);\n        }\n      );\n    })();\n  <\/script>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f4ng th\u1ee9c t\u00ednh \u0111i\u1ec7n tr\u1edf t\u0129nh khi di chuy\u1ec3n c\u1ea7n c\u1ea9u<\/h2>\n\n\n\n<div id=\"travel-resistance-formulas\">\n  <div class=\"formula\">\n    F<sub>f<\/sub>\n    = (G<sub>N<\/sub> + G) \u00d7 g \u00d7 f<sub>r<\/sub>\n  <\/div>\n\n  <div class=\"formula\">\n    F<sub>S<\/sub>\n    = (G<sub>N<\/sub> + G) \u00d7 g \u00d7 i\n    <span class=\"formula-condition\">\n    <\/span>\n  <\/div>\n\n  <div class=\"formula formula-total\">\n    F<sub>st,max<\/sub>\n    = F<sub>f<\/sub>\n    + F<sub>S<\/sub>\n  <\/div>\n\n  <style>\n    #travel-resistance-formulas {\n      --text-color: #4a4a4a;\n\n      width: 100%;\n      margin: 0;\n      padding: 0;\n      color: var(--text-color);\n      box-sizing: border-box;\n    }\n\n    #travel-resistance-formulas *,\n    #travel-resistance-formulas *::before,\n    #travel-resistance-formulas *::after {\n      box-sizing: border-box;\n    }\n\n    #travel-resistance-formulas .formula {\n      padding: 7px 0;\n      color: var(--text-color);\n      font-family: \"Segoe UI\", Arial, Helvetica, sans-serif;\n      font-size: 20px;\n      font-style: normal;\n      font-weight: 400;\n      line-height: 1.55;\n      text-align: left;\n      white-space: nowrap;\n    }\n\n    #travel-resistance-formulas .formula sub {\n      font-size: 65%;\n      font-style: normal;\n      vertical-align: -0.3em;\n    }\n\n    #travel-resistance-formulas .formula-condition {\n      margin-left: 8px;\n      font-size: 16px;\n      font-style: normal;\n      font-weight: 400;\n    }\n\n    #travel-resistance-formulas .formula-total {\n      color: var(--text-color);\n      font-size: 20px;\n      font-style: normal;\n      font-weight: 600;\n    }\n\n    @media (max-width: 520px) {\n      #travel-resistance-formulas {\n        overflow-x: auto;\n      }\n\n      #travel-resistance-formulas .formula {\n        font-size: 18px;\n      }\n\n      #travel-resistance-formulas .formula-condition {\n        font-size: 14px;\n      }\n\n      #travel-resistance-formulas .formula-total {\n        font-size: 18px;\n      }\n    }\n  <\/style>\n<\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>G<sub>N<\/sub>T\u1ea3i tr\u1ecdng \u0111\u1ecbnh m\u1ee9c c\u1ee7a c\u1ea7n c\u1ea9u, \u0111\u01a1n v\u1ecb: kg<\/li>\n\n\n\n<li>G: Tr\u1ecdng l\u01b0\u1ee3ng b\u1ea3n th\u00e2n c\u1ee7a c\u1ea7n c\u1ea9u, \u0111\u01a1n v\u1ecb: kg<\/li>\n\n\n\n<li>G<sub>1<\/sub>Tr\u1ecdng l\u01b0\u1ee3ng b\u1ea3n th\u00e2n xe \u0111\u1ea9y, \u0111\u01a1n v\u1ecb: kg<\/li>\n\n\n\n<li>g: Gia t\u1ed1c tr\u1ecdng tr\u01b0\u1eddng (gi\u00e1 tr\u1ecb \u0111\u01b0\u1ee3c l\u1ea5y l\u00e0 10 N\/kg)<\/li>\n\n\n\n<li>f<sub>r<\/sub>: H\u1ec7 s\u1ed1 ma s\u00e1t l\u0103n<\/li>\n\n\n\n<li>i: \u0110\u1ed9 d\u1ed1c gi\u1ea3 \u0111\u1ecbnh<\/li>\n\n\n\n<li>F<sub>f<\/sub>: L\u1ef1c c\u1ea3n ma s\u00e1t, \u0111\u01a1n v\u1ecb: N<\/li>\n\n\n\n<li>Fs: \u0110i\u1ec7n tr\u1edf d\u1ed1c, \u0111\u01a1n v\u1ecb: N<\/li>\n\n\n\n<li>F<sub>st, t\u1ed1i \u0111a<\/sub>: \u0110i\u1ec7n tr\u1edf t\u0129nh khi di chuy\u1ec3n c\u1ea7n c\u1ea9u, \u0111\u01a1n v\u1ecb: N<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Ghi ch\u00fa<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1i n\u00e0y f<sub>r<\/sub> H\u1ec7 s\u1ed1 n\u00e0y th\u1ef1c ch\u1ea5t th\u1ec3 hi\u1ec7n l\u1ef1c c\u1ea3n l\u0103n c\u1ee7a b\u00e1nh xe c\u1ed9ng v\u1edbi ma s\u00e1t \u1ed5 tr\u1ee5c b\u00e1nh xe, c\u00f9ng v\u1edbi c\u00e1c t\u00e1c \u0111\u1ed9ng b\u1ed5 sung li\u00ean quan \u0111\u1ebfn v\u00e0nh b\u00e1nh xe.<\/li>\n\n\n\n<li>Th\u00f4ng th\u01b0\u1eddng, \u0111\u01b0\u1eddng k\u00ednh b\u00e1nh xe c\u1ee7a c\u01a1 c\u1ea5u di chuy\u1ec3n c\u1ea7n c\u1ea9u l\u1edbn h\u01a1n \u0111\u01b0\u1eddng k\u00ednh b\u00e1nh xe c\u1ee7a c\u01a1 c\u1ea5u di chuy\u1ec3n xe \u0111\u1ea9y. Do \u0111\u00f3, c\u00f4ng c\u1ee5 t\u00ednh to\u00e1n n\u00e0y cho ph\u00e9p th\u1ef1c hi\u1ec7n c\u00e1c ph\u00e9p t\u00ednh ri\u00eang bi\u1ec7t d\u1ef1a tr\u00ean c\u00e1c th\u00f4ng s\u1ed1 t\u01b0\u01a1ng \u1ee9ng.<\/li>\n\n\n\n<li>\u0110\u1ed1i v\u1edbi c\u00e1c c\u01a1 c\u1ea5u di chuy\u1ec3n v\u00e0 \u0111\u1ed9ng c\u01a1 \u0111i\u1ec7n, y\u00eau c\u1ea7u v\u1ec1 c\u00f4ng su\u1ea5t t\u01b0\u01a1ng \u0111\u1ed1i nh\u1ea1y c\u1ea3m. Ngay c\u1ea3 \u0111\u1ed9 d\u1ed1c ch\u1ec9 1\u2030 c\u0169ng t\u1ea1o ra l\u1ef1c c\u1ea3n v\u1eadn h\u00e0nh th\u1ef1c t\u1ebf. Do \u0111\u00f3, trong tr\u01b0\u1eddng h\u1ee3p kh\u00f4ng c\u00f3 d\u1eef li\u1ec7u \u0111o \u0111\u01b0\u1ee3c t\u1eeb c\u01a1 s\u1edf, m\u1ed9t \u0111\u1ed9 d\u1ed1c gi\u1ea3 \u0111\u1ecbnh \u0111\u01b0\u1ee3c \u0111\u01b0a v\u00e0o \u0111\u1ec3 tr\u00e1nh vi\u1ec7c s\u1eed d\u1ee5ng \u0111\u1ed9ng c\u01a1 qu\u00e1 nh\u1ecf.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">C\u1ea7n c\u1ea9u \u00e1p d\u1ee5ng<\/h2>\n\n\n\n<p>C\u00e1c s\u1ea3n ph\u1ea9m \u0111\u01b0\u1ee3c li\u1ec7t k\u00ea d\u01b0\u1edbi \u0111\u00e2y ch\u1ee7 y\u1ebfu ph\u00f9 h\u1ee3p \u0111\u1ec3 s\u1eed d\u1ee5ng trong m\u00f4i tr\u01b0\u1eddng nh\u00e0 m\u00e1y kh\u00e9p k\u00edn trong nh\u00e0.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u1ea7n c\u1ea9u c\u1ea7u tr\u1ee5c m\u1ed9t d\u1ea7m<\/li>\n\n\n\n<li>C\u1ea7n c\u1ea9u c\u1ea7u tr\u1ee5c d\u1ea7m \u0111\u00f4i<\/li>\n\n\n\n<li>C\u1ea7n c\u1ea9u gi\u00e0n m\u1ed9t d\u1ea7m (d\u00f9ng trong nh\u00e0)<\/li>\n\n\n\n<li>C\u1ea7n c\u1ea9u gi\u00e0n hai d\u1ea7m (d\u00f9ng trong nh\u00e0)<\/li>\n\n\n\n<li>Xe \u0111\u1ea9y c\u1ee7a c\u1ea7n c\u1ea9u tr\u00ean cao<\/li>\n\n\n\n<li>Xe \u0111\u1ea9y c\u1ee7a c\u1ea7n c\u1ea9u gi\u00e0n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"C\u00f4ng c\u1ee5 t\u00ednh to\u00e1n l\u1ef1c c\u1ea3n t\u0129nh khi di chuy\u1ec3n c\u1ea7n c\u1ea9u \u01b0\u1edbc t\u00ednh l\u1ef1c c\u1ea7n thi\u1ebft \u0111\u1ec3 kh\u1eafc ph\u1ee5c ma s\u00e1t v\u00e0 \u0111\u1ed9 d\u1ed1c \u0111\u01b0\u1eddng ray trong \u0111i\u1ec1u ki\u1ec7n di chuy\u1ec3n b\u00ecnh th\u01b0\u1eddng. S\u1eed d\u1ee5ng t\u1ea3i tr\u1ecdng \u0111\u1ecbnh m\u1ee9c v\u00e0 tr\u1ecdng l\u01b0\u1ee3ng t\u0129nh c\u1ee7a c\u1ea7n c\u1ea9u, c\u00f4ng c\u1ee5 n\u00e0y ki\u1ec3m tra xem \u0111\u1ed9ng c\u01a1 v\u00e0 b\u1ed9 truy\u1ec1n \u0111\u1ed9ng c\u00f3 th\u1ec3 di chuy\u1ec3n c\u1ea7n c\u1ea9u hay kh\u00f4ng. K\u1ebft qu\u1ea3 h\u1ed7 tr\u1ee3 vi\u1ec7c l\u1ef1a ch\u1ecdn \u0111\u1ed9ng c\u01a1, h\u1ed9p s\u1ed1 v\u00e0 b\u00e1nh xe ph\u00f9 h\u1ee3p. C\u00f4ng c\u1ee5 t\u00ednh to\u00e1n l\u1ef1c c\u1ea3n t\u0129nh khi di chuy\u1ec3n c\u1ea7n c\u1ea9u c\u0169ng gi\u00fap \u0111\u00e1nh gi\u00e1 r\u1ee7i ro tr\u01b0\u1ee3t b\u00e1nh xe. \u0110\u1ed1i v\u1edbi \u0111\u01b0\u1eddng ray d\u1ed1c, ph\u00e9p t\u00ednh \u0111\u00e1nh gi\u00e1 kh\u1ea3 n\u0103ng tr\u01b0\u1ee3t c\u1ee7a c\u1ea7n c\u1ea9u sau khi d\u1eebng l\u1ea1i, gi\u00fap ng\u0103n ng\u1eeba h\u01b0 h\u1ecfng \u1ed5 tr\u1ee5c, k\u1eb9t ray v\u00e0 c\u00e1c v\u1ea5n \u0111\u1ec1 li\u00ean quan \u0111\u1ebfn l\u1eafp \u0111\u1eb7t.","protected":false},"author":8,"featured_media":17373,"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":[1059],"tags":[],"class_list":["post-17375","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-online-tools"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/posts\/17375"}],"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=17375"}],"version-history":[{"count":5,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/posts\/17375\/revisions"}],"predecessor-version":[{"id":17380,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/posts\/17375\/revisions\/17380"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/media\/17373"}],"wp:attachment":[{"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/media?parent=17375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/categories?post=17375"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dgcrane.com\/vi\/wp-json\/wp\/v2\/tags?post=17375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}