ocs-calculators 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/README.md +25 -4
- package/README_EN.md +2 -2
- package/dist/ampacity/index.cjs +17 -0
- package/dist/ampacity/index.cjs.map +1 -0
- package/dist/ampacity/index.d.cts +68 -0
- package/dist/ampacity/index.d.ts +68 -0
- package/dist/ampacity/index.js +17 -0
- package/dist/ampacity/index.js.map +1 -0
- package/dist/chunk-3ERFRRHZ.cjs +119 -0
- package/dist/chunk-3ERFRRHZ.cjs.map +1 -0
- package/dist/chunk-4UU7WA7N.cjs +107 -0
- package/dist/chunk-4UU7WA7N.cjs.map +1 -0
- package/dist/chunk-5INEDXRY.cjs +69 -0
- package/dist/chunk-5INEDXRY.cjs.map +1 -0
- package/dist/chunk-5Q6IASB2.cjs +101 -0
- package/dist/chunk-5Q6IASB2.cjs.map +1 -0
- package/dist/chunk-746H65EQ.js +91 -0
- package/dist/chunk-746H65EQ.js.map +1 -0
- package/dist/chunk-DGO2DCO5.cjs +19 -0
- package/dist/chunk-DGO2DCO5.cjs.map +1 -0
- package/dist/chunk-FVESJBUD.cjs +95 -0
- package/dist/chunk-FVESJBUD.cjs.map +1 -0
- package/dist/chunk-GN6QNOUL.js +91 -0
- package/dist/chunk-GN6QNOUL.js.map +1 -0
- package/dist/chunk-IFVYGNT3.js +107 -0
- package/dist/chunk-IFVYGNT3.js.map +1 -0
- package/dist/chunk-IQR3SRCD.js +102 -0
- package/dist/chunk-IQR3SRCD.js.map +1 -0
- package/dist/chunk-IUENDAAJ.js +67 -0
- package/dist/chunk-IUENDAAJ.js.map +1 -0
- package/dist/chunk-J2UXRMTU.cjs +126 -0
- package/dist/chunk-J2UXRMTU.cjs.map +1 -0
- package/dist/chunk-KOSC6EA3.js +101 -0
- package/dist/chunk-KOSC6EA3.js.map +1 -0
- package/dist/chunk-LDSV3U4M.js +69 -0
- package/dist/chunk-LDSV3U4M.js.map +1 -0
- package/dist/chunk-MTAYG3U2.cjs +102 -0
- package/dist/chunk-MTAYG3U2.cjs.map +1 -0
- package/dist/chunk-NBFOB2PI.cjs +91 -0
- package/dist/chunk-NBFOB2PI.cjs.map +1 -0
- package/dist/chunk-NBHEOJ5A.cjs +88 -0
- package/dist/chunk-NBHEOJ5A.cjs.map +1 -0
- package/dist/chunk-P6KUGPHD.cjs +91 -0
- package/dist/chunk-P6KUGPHD.cjs.map +1 -0
- package/dist/chunk-QTPXTDGY.js +119 -0
- package/dist/chunk-QTPXTDGY.js.map +1 -0
- package/dist/chunk-RPKDEFSJ.cjs +78 -0
- package/dist/chunk-RPKDEFSJ.cjs.map +1 -0
- package/dist/chunk-RVG3LEZQ.js +95 -0
- package/dist/chunk-RVG3LEZQ.js.map +1 -0
- package/dist/chunk-RVP3IU2L.cjs +67 -0
- package/dist/chunk-RVP3IU2L.cjs.map +1 -0
- package/dist/chunk-UO2PHBC3.js +126 -0
- package/dist/chunk-UO2PHBC3.js.map +1 -0
- package/dist/chunk-VAHQDIMW.js +88 -0
- package/dist/chunk-VAHQDIMW.js.map +1 -0
- package/dist/chunk-WPMKM6NL.js +78 -0
- package/dist/chunk-WPMKM6NL.js.map +1 -0
- package/dist/chunk-YHDO6XVM.js +19 -0
- package/dist/chunk-YHDO6XVM.js.map +1 -0
- package/dist/copper/index.cjs +12 -0
- package/dist/copper/index.cjs.map +1 -0
- package/dist/copper/index.d.cts +57 -0
- package/dist/copper/index.d.ts +57 -0
- package/dist/copper/index.js +12 -0
- package/dist/copper/index.js.map +1 -0
- package/dist/curve-stagger/index.cjs +17 -0
- package/dist/curve-stagger/index.cjs.map +1 -0
- package/dist/curve-stagger/index.d.cts +77 -0
- package/dist/curve-stagger/index.d.ts +77 -0
- package/dist/curve-stagger/index.js +17 -0
- package/dist/curve-stagger/index.js.map +1 -0
- package/dist/dropper/index.cjs +15 -0
- package/dist/dropper/index.cjs.map +1 -0
- package/dist/dropper/index.d.cts +84 -0
- package/dist/dropper/index.d.ts +84 -0
- package/dist/dropper/index.js +15 -0
- package/dist/dropper/index.js.map +1 -0
- package/dist/force/index.cjs +17 -0
- package/dist/force/index.cjs.map +1 -0
- package/dist/force/index.d.cts +69 -0
- package/dist/force/index.d.ts +69 -0
- package/dist/force/index.js +17 -0
- package/dist/force/index.js.map +1 -0
- package/dist/icing/index.cjs +9 -0
- package/dist/icing/index.cjs.map +1 -0
- package/dist/icing/index.d.cts +43 -0
- package/dist/icing/index.d.ts +43 -0
- package/dist/icing/index.js +9 -0
- package/dist/icing/index.js.map +1 -0
- package/dist/index.cjs +154 -1204
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -763
- package/dist/index.d.ts +16 -763
- package/dist/index.js +98 -1045
- package/dist/index.js.map +1 -1
- package/dist/stroke/index.cjs +19 -0
- package/dist/stroke/index.cjs.map +1 -0
- package/dist/stroke/index.d.cts +63 -0
- package/dist/stroke/index.d.ts +63 -0
- package/dist/stroke/index.js +19 -0
- package/dist/stroke/index.js.map +1 -0
- package/dist/tension/index.cjs +19 -0
- package/dist/tension/index.cjs.map +1 -0
- package/dist/tension/index.d.cts +85 -0
- package/dist/tension/index.d.ts +85 -0
- package/dist/tension/index.js +19 -0
- package/dist/tension/index.js.map +1 -0
- package/dist/types-C2OanO8N.d.cts +33 -0
- package/dist/types-C2OanO8N.d.ts +33 -0
- package/dist/voltage-drop/index.cjs +12 -0
- package/dist/voltage-drop/index.cjs.map +1 -0
- package/dist/voltage-drop/index.d.cts +40 -0
- package/dist/voltage-drop/index.d.ts +40 -0
- package/dist/voltage-drop/index.js +12 -0
- package/dist/voltage-drop/index.js.map +1 -0
- package/dist/wavespeed/index.cjs +17 -0
- package/dist/wavespeed/index.cjs.map +1 -0
- package/dist/wavespeed/index.d.cts +58 -0
- package/dist/wavespeed/index.d.ts +58 -0
- package/dist/wavespeed/index.js +17 -0
- package/dist/wavespeed/index.js.map +1 -0
- package/dist/wear/index.cjs +13 -0
- package/dist/wear/index.cjs.map +1 -0
- package/dist/wear/index.d.cts +55 -0
- package/dist/wear/index.d.ts +55 -0
- package/dist/wear/index.js +13 -0
- package/dist/wear/index.js.map +1 -0
- package/dist/wind/index.cjs +15 -0
- package/dist/wind/index.cjs.map +1 -0
- package/dist/wind/index.d.cts +66 -0
- package/dist/wind/index.d.ts +66 -0
- package/dist/wind/index.js +15 -0
- package/dist/wind/index.js.map +1 -0
- package/package.json +64 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-5INEDXRY.cjs","../src/wear/meta.ts","../src/wear/index.ts"],"names":[],"mappings":"AAAA;ACEO,IAAM,SAAA,EAA2B;AAAA,EACtC,IAAA,EAAM,sCAAA;AAAA,EACN,MAAA,EAAQ,yBAAA;AAAA,EACR,OAAA,EAAS,8LAAA;AAAA,EACT,OAAA,EAAS;AAAA,IACP,yEAAA;AAAA,IACA,uFAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,qJAAA;AAAA,IACA,yPAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kMAAA;AAAA,IACA,kGAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADAA;AACA;AErBO,IAAM,sCAAA,EAAwC,EAAA;AA6C9C,SAAS,sBAAA,CAAuB,UAAA,EAA4B;AACjE,EAAA,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA,EAAI;AACrB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,6DAAA,EAAc,UAAU,CAAA,GAAA,CAAK,CAAA;AAAA,EACpD;AACA,EAAA,OAAQ,IAAA,CAAK,GAAA,EAAK,WAAA,EAAa,WAAA,EAAc,CAAA;AAC/C;AAUO,SAAS,SAAA,CAAU,KAAA,EAA8B;AACtD,EAAA,MAAM,EAAE,kBAAA,EAAoB,GAAG,EAAA,EAAI,KAAA;AACnC,EAAA,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,CAAA,CAAA,EAAI;AACb,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,yEAAA,EAAgB,EAAE,CAAA,OAAA,CAAM,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,mBAAA,EACJ,KAAA,CAAM,KAAA,IAAS,OAAA,EACX,KAAA,CAAM,mBAAA,EACN,sBAAA,CAAuB,KAAA,CAAM,kBAAkB,CAAA;AACrD,EAAA,GAAA,CAAI,CAAA,CAAE,mBAAA,EAAqB,CAAA,CAAA,EAAI;AAC7B,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,yEAAA,EAAgB,kBAAkB,CAAA,OAAA,CAAM,CAAA;AAAA,EAC/D;AACA,EAAA,GAAA,CAAI,mBAAA,EAAqB,EAAA,EAAI;AAC3B,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,CAAA,yBAAA,EAAQ,kBAAA,CAAmB,OAAA,CAAQ,CAAC,CAAC,CAAA,yDAAA,EAAiB,EAAE,CAAA,OAAA;AAAA,IAC1D,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,iBAAA,mBACJ,KAAA,CAAM,2BAAA,UAA+B,uCAAA;AACvC,EAAA,GAAA,CAAI,CAAA,CAAE,iBAAA,EAAmB,CAAA,CAAA,EAAI;AAC3B,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,yEAAA,EAAgB,gBAAgB,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,eAAA,EAAiB,GAAA,EAAK,kBAAA;AAC5B,EAAA,MAAM,YAAA,EAAe,eAAA,EAAiB,GAAA,EAAM,GAAA;AAE5C,EAAA,OAAO;AAAA,IACL,kBAAA,EAAoB,EAAA;AAAA,IACpB,kBAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,OAAA,EAAS,YAAA,EAAc,iBAAA,EAAmB,UAAA,EAAY;AAAA,EACxD,CAAA;AACF;AFtCA;AACA;AACE;AACA;AACA;AACA;AACF,2MAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-5INEDXRY.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const wearMeta: CalculatorMeta = {\n name: '接触线磨耗率',\n nameEn: 'Contact Wire Wear Ratio',\n summary: '根据原截面积与实测残存截面计算磨耗率 η,η > 20% 时建议更换接触线。',\n formula: [\n '磨耗率:η = (A₀ − A) / A₀ × 100%',\n '判定准则:η > 20% 建议更换接触线',\n '残径换算(近似):A = π·d² / 4',\n ],\n references: [\n '原截面积来源 TB/T 2809-2017《电气化铁路用铜及铜合金接触线》',\n '标称截面 120/150 mm² 为名义值,标准另列计算截面 121/151 mm²,实际截面由 TB/T 2809-2017 表2 外形尺寸公差带控制',\n '磨耗更换阈值请以最新版运维规程为准',\n ],\n scope: [\n '残径换算按圆截面近似,接触线实际为梯形截面,换算值存在系统性偏差',\n '未考虑磨耗沿跨距方向的不均匀分布',\n '实际产品截面以出厂检验单为准',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/wear/',\n};\n","export { wearMeta } from './meta';\n\n/** 更换阈值缺省值:η > 20% 建议更换接触线 */\nexport const DEFAULT_REPLACEMENT_THRESHOLD_PERCENT = 20;\n\n/** 磨耗计算公共输入 */\nexport interface WearBaseInput {\n /** 原截面积 A₀,mm² */\n readonly originalSectionMM2: number;\n /** 更换阈值 η,%。缺省 20 */\n readonly replacementThresholdPercent?: number;\n}\n\n/** 按实测残截面积计算 */\nexport interface WearByAreaInput extends WearBaseInput {\n readonly mode: 'area';\n /** 实测残截面积 A,mm²,不得大于 A₀ */\n readonly residualSectionMM2: number;\n}\n\n/** 按实测残径计算(圆截面近似 A = πd²/4) */\nexport interface WearByDiameterInput extends WearBaseInput {\n readonly mode: 'residual-diameter';\n /** 实测残径 d,mm */\n readonly residualDiameterMM: number;\n}\n\nexport type WearInput = WearByAreaInput | WearByDiameterInput;\n\n/** 判定结论:keep = 继续使用,replace = 建议更换 */\nexport type WearVerdict = 'keep' | 'replace';\n\n/** 磨耗率计算结果 */\nexport interface WearResult {\n /** 原截面积 A₀,mm² */\n readonly originalSectionMM2: number;\n /** 参与计算的残截面积 A,mm²(残径模式为换算值) */\n readonly residualSectionMM2: number;\n /** 截面损失 A₀ − A,mm² */\n readonly sectionLossMM2: number;\n /** 磨耗率 η,% */\n readonly wearPercent: number;\n /** 使用的更换阈值,% */\n readonly thresholdPercent: number;\n readonly verdict: WearVerdict;\n}\n\n/** 圆截面近似:由实测残径 d(mm)换算残截面积 A = π·d²/4(mm²) */\nexport function sectionFromDiameterMM2(diameterMM: number): number {\n if (!(diameterMM > 0)) {\n throw new RangeError(`残径必须为正数,收到 ${diameterMM} mm`);\n }\n return (Math.PI * diameterMM * diameterMM) / 4;\n}\n\n/**\n * 接触线磨耗率:η = (A₀ − A) / A₀ × 100%。\n *\n * 支持两种输入模式:直接给残截面积(`mode: 'area'`),或给实测残径\n * 按 A = π·d²/4 换算(`mode: 'residual-diameter'`)。\n *\n * 判定:η **严格大于**阈值(缺省 20%)判为 `replace`,等于阈值仍为 `keep`。\n */\nexport function wearRatio(input: WearInput): WearResult {\n const { originalSectionMM2: a0 } = input;\n if (!(a0 > 0)) {\n throw new RangeError(`原截面积必须为正数,收到 ${a0} mm²`);\n }\n\n const residualSectionMM2 =\n input.mode === 'area'\n ? input.residualSectionMM2\n : sectionFromDiameterMM2(input.residualDiameterMM);\n if (!(residualSectionMM2 > 0)) {\n throw new RangeError(`残截面积必须为正数,收到 ${residualSectionMM2} mm²`);\n }\n if (residualSectionMM2 > a0) {\n throw new RangeError(\n `残截面积 ${residualSectionMM2.toFixed(2)} mm² 不能大于原截面积 ${a0} mm²`,\n );\n }\n\n const thresholdPercent =\n input.replacementThresholdPercent ?? DEFAULT_REPLACEMENT_THRESHOLD_PERCENT;\n if (!(thresholdPercent > 0)) {\n throw new RangeError(`更换阈值必须为正数,收到 ${thresholdPercent}%`);\n }\n\n const sectionLossMM2 = a0 - residualSectionMM2;\n const wearPercent = (sectionLossMM2 / a0) * 100;\n\n return {\n originalSectionMM2: a0,\n residualSectionMM2,\n sectionLossMM2,\n wearPercent,\n thresholdPercent,\n verdict: wearPercent > thresholdPercent ? 'replace' : 'keep',\n };\n}\n"]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/stroke/meta.ts
|
|
2
|
+
var strokeMeta = {
|
|
3
|
+
name: "\u8865\u507F\u884C\u7A0B",
|
|
4
|
+
nameEn: "Compensation Stroke",
|
|
5
|
+
summary: "\u6309\u6E29\u5EA6\u4F38\u7F29\u91CF\u516C\u5F0F\u8BA1\u7B97\u951A\u6BB5\u7EBF\u7D22\u4F38\u7F29\u91CF\u4E0E\u8865\u507F\u88C5\u7F6E\u6240\u9700\u884C\u7A0B\uFF0C\u53EF\u5BF9\u7167\u88C5\u7F6E\u8BB8\u7528\u884C\u7A0B\u6821\u6838\u3002",
|
|
6
|
+
formula: [
|
|
7
|
+
"\u6E29\u5EA6\u4F38\u7F29\u91CF\uFF1A\u0394L = \u03B1\xB7L\xB7\u0394t",
|
|
8
|
+
"\u8865\u507F\u884C\u7A0B\u8BBE\u8BA1\u503C\uFF08\u542B\u88D5\u5EA6\uFF09\uFF1AS = n\xB7\u0394L + S\u2080"
|
|
9
|
+
],
|
|
10
|
+
references: [
|
|
11
|
+
"\u5168\u8865\u507F\u951A\u6BB5\u63A5\u89E6\u7EBF\u4E0E\u627F\u529B\u7D22\u987B\u5206\u522B\u8BA1\u7B97\uFF08\u5404\u81EA \u03B1/L \u4E0D\u540C\uFF09\uFF1B\u534A\u8865\u507F\u4EC5\u8BA1\u7B97\u63A5\u89E6\u7EBF\u4FA7",
|
|
12
|
+
"\u4F20\u52A8\u6BD4\u5E38\u89C1\u89C4\u683C\uFF1A\u6ED1\u8F6E\u7EC4 1:2/1:3\uFF08\u4E3B\u6D41\uFF09\u30011:4 \u89C1\u4E8E\u6559\u6750\u6848\u4F8B\uFF0C\u65E0\u6807\u51C6\u7EDF\u4E00\u6863\u4F4D\u8868",
|
|
13
|
+
"\u5B89\u88C5\u88D5\u5EA6\u53EF\u53C2\u7167\u8865\u507F\u5668 a/b \u503C\uFF1A\u4EFB\u4F55\u60C5\u51B5\u4E0B\u4E0D\u5C0F\u4E8E 200mm\uFF08\u539F\u94C1\u8FD0\u30142007\u301569\u53F7\u7B2C87\u6761\uFF0C\u5DF2\u7531\u94C1\u603B\u8FD0\u30142017\u30159\u53F7\u627F\u63A5\uFF09\uFF1B\u8BBE\u8BA1\u53D6\u503C\u60EF\u4F8B\u4E0D\u5C0F\u4E8E 300mm\uFF0C\u5C5E\u6559\u6750/\u8BBE\u8BA1\u60EF\u4F8B\u800C\u975E\u89C4\u7A0B\u6761\u6B3E",
|
|
14
|
+
"\u8865\u507F\u88C5\u7F6E\u4EA7\u54C1\u8981\u6C42\u89C1 TB/T 2075.12-2024\uFF08\u6ED1\u8F6E\u8865\u507F\u88C5\u7F6E\uFF09\u3001TB/T 2075.13-2024\uFF08\u68D8\u8F6E\u8865\u507F\u88C5\u7F6E\uFF09\u4E0E TB/T 2073-2020\uFF08\u96F6\u90E8\u4EF6\u6280\u672F\u6761\u4EF6\uFF09"
|
|
15
|
+
],
|
|
16
|
+
scope: [
|
|
17
|
+
"\u951A\u6BB5\u957F\u5EA6 L \u4E3A\u4E24\u7AEF\u951A\u56FA\u70B9\u4E4B\u95F4\u957F\u5EA6",
|
|
18
|
+
"\u8BBE\u8BA1\u6E29\u5DEE \u0394t \u4E3A\u6700\u9AD8\u4E0E\u6700\u4F4E\u8BBE\u8BA1\u6E29\u5EA6\u4E4B\u5DEE",
|
|
19
|
+
"\u94DC\u5408\u91D1\u7EBF\u81A8\u80C0\u7CFB\u6570\u7EA6 1.7\xD710\u207B\u2075/\u2103\uFF08EN 50149 \u94DC\u9521\u63A5\u89E6\u7EBF\u6570\u636E\u8868\uFF09",
|
|
20
|
+
"\u5168\u8865\u507F\u951A\u6BB5\u627F\u529B\u7D22\u4FA7\u987B\u53E6\u884C\u8BA1\u7B97",
|
|
21
|
+
"\u53C2\u6570\u53D6\u503C\u4EE5\u8BBE\u8BA1\u89C4\u7A0B\u4E3A\u51C6"
|
|
22
|
+
],
|
|
23
|
+
disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
|
|
24
|
+
online: "https://www.itswe.com/calculator/stroke/"
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// src/stroke/index.ts
|
|
28
|
+
var TRANSMISSION_RATIOS = [2, 3, 4];
|
|
29
|
+
var MIN_MARGIN_MM = 200;
|
|
30
|
+
var CONVENTIONAL_MARGIN_MM = 300;
|
|
31
|
+
function elongationMM(expansionPerDegC, anchorLengthM, tempRangeDegC) {
|
|
32
|
+
if (!(expansionPerDegC > 0)) {
|
|
33
|
+
throw new RangeError(`\u7EBF\u81A8\u80C0\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${expansionPerDegC} 1/\u2103`);
|
|
34
|
+
}
|
|
35
|
+
if (!(anchorLengthM > 0)) {
|
|
36
|
+
throw new RangeError(`\u951A\u6BB5\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${anchorLengthM} m`);
|
|
37
|
+
}
|
|
38
|
+
if (!(tempRangeDegC > 0)) {
|
|
39
|
+
throw new RangeError(`\u8BBE\u8BA1\u6E29\u5DEE\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tempRangeDegC} \u2103`);
|
|
40
|
+
}
|
|
41
|
+
return expansionPerDegC * anchorLengthM * tempRangeDegC * 1e3;
|
|
42
|
+
}
|
|
43
|
+
function requiredStrokeMM(elongation, ratio, marginMM) {
|
|
44
|
+
if (!(elongation >= 0)) {
|
|
45
|
+
throw new RangeError(`\u4F38\u7F29\u91CF\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${elongation} mm`);
|
|
46
|
+
}
|
|
47
|
+
if (!(marginMM >= 0)) {
|
|
48
|
+
throw new RangeError(`\u5B89\u88C5\u88D5\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${marginMM} mm`);
|
|
49
|
+
}
|
|
50
|
+
return ratio * elongation + marginMM;
|
|
51
|
+
}
|
|
52
|
+
function strokeCheck(input) {
|
|
53
|
+
const { transmissionRatio, allowableStrokeMM } = input;
|
|
54
|
+
if (!TRANSMISSION_RATIOS.includes(transmissionRatio)) {
|
|
55
|
+
throw new RangeError(
|
|
56
|
+
`\u4F20\u52A8\u6BD4\u5E94\u4E3A ${TRANSMISSION_RATIOS.map((r) => `1:${r}`).join(" / ")}\uFF0C\u6536\u5230 1:${transmissionRatio}`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
if (!(input.marginMM >= 0)) {
|
|
60
|
+
throw new RangeError(`\u5B89\u88C5\u88D5\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${input.marginMM} mm`);
|
|
61
|
+
}
|
|
62
|
+
const elongation = elongationMM(
|
|
63
|
+
input.expansionPerDegC,
|
|
64
|
+
input.anchorLengthM,
|
|
65
|
+
input.tempRangeDegC
|
|
66
|
+
);
|
|
67
|
+
const perDegreeMM = elongation / input.tempRangeDegC;
|
|
68
|
+
const required = requiredStrokeMM(elongation, transmissionRatio, input.marginMM);
|
|
69
|
+
if (allowableStrokeMM === null) {
|
|
70
|
+
return {
|
|
71
|
+
perDegreeMM,
|
|
72
|
+
elongationMM: elongation,
|
|
73
|
+
requiredStrokeMM: required,
|
|
74
|
+
allowableStrokeMM: null,
|
|
75
|
+
marginMM: null,
|
|
76
|
+
verdict: "not-assessed"
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (!(allowableStrokeMM > 0)) {
|
|
80
|
+
throw new RangeError(`\u88C5\u7F6E\u8BB8\u7528\u884C\u7A0B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${allowableStrokeMM} mm`);
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
perDegreeMM,
|
|
84
|
+
elongationMM: elongation,
|
|
85
|
+
requiredStrokeMM: required,
|
|
86
|
+
allowableStrokeMM,
|
|
87
|
+
marginMM: allowableStrokeMM - required,
|
|
88
|
+
verdict: required <= allowableStrokeMM ? "pass" : "fail"
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
exports.strokeMeta = strokeMeta; exports.TRANSMISSION_RATIOS = TRANSMISSION_RATIOS; exports.MIN_MARGIN_MM = MIN_MARGIN_MM; exports.CONVENTIONAL_MARGIN_MM = CONVENTIONAL_MARGIN_MM; exports.elongationMM = elongationMM; exports.requiredStrokeMM = requiredStrokeMM; exports.strokeCheck = strokeCheck;
|
|
101
|
+
//# sourceMappingURL=chunk-5Q6IASB2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-5Q6IASB2.cjs","../src/stroke/meta.ts","../src/stroke/index.ts"],"names":[],"mappings":"AAAA;ACEO,IAAM,WAAA,EAA6B;AAAA,EACxC,IAAA,EAAM,0BAAA;AAAA,EACN,MAAA,EAAQ,qBAAA;AAAA,EACR,OAAA,EACE,4OAAA;AAAA,EACF,OAAA,EAAS;AAAA,IACP,sEAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,wNAAA;AAAA,IACA,wMAAA;AAAA,IACA,uaAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO;AAAA,IACL,yFAAA;AAAA,IACA,2GAAA;AAAA,IACA,0JAAA;AAAA,IACA,sFAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADDA;AACA;AEpBO,IAAM,oBAAA,EAAoD,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAGlE,IAAM,cAAA,EAAgB,GAAA;AAGtB,IAAM,uBAAA,EAAyB,GAAA;AAsC/B,SAAS,YAAA,CACd,gBAAA,EACA,aAAA,EACA,aAAA,EACQ;AACR,EAAA,GAAA,CAAI,CAAA,CAAE,iBAAA,EAAmB,CAAA,CAAA,EAAI;AAC3B,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,+EAAA,EAAiB,gBAAgB,CAAA,SAAA,CAAM,CAAA;AAAA,EAC9D;AACA,EAAA,GAAA,CAAI,CAAA,CAAE,cAAA,EAAgB,CAAA,CAAA,EAAI;AACxB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,yEAAA,EAAgB,aAAa,CAAA,EAAA,CAAI,CAAA;AAAA,EACxD;AACA,EAAA,GAAA,CAAI,CAAA,CAAE,cAAA,EAAgB,CAAA,CAAA,EAAI;AACxB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,yEAAA,EAAgB,aAAa,CAAA,OAAA,CAAI,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,iBAAA,EAAmB,cAAA,EAAgB,cAAA,EAAgB,GAAA;AAC5D;AASO,SAAS,gBAAA,CACd,UAAA,EACA,KAAA,EACA,QAAA,EACQ;AACR,EAAA,GAAA,CAAI,CAAA,CAAE,WAAA,GAAc,CAAA,CAAA,EAAI;AACtB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,6DAAA,EAAc,UAAU,CAAA,GAAA,CAAK,CAAA;AAAA,EACpD;AACA,EAAA,GAAA,CAAI,CAAA,CAAE,SAAA,GAAY,CAAA,CAAA,EAAI;AACpB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,mEAAA,EAAe,QAAQ,CAAA,GAAA,CAAK,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,MAAA,EAAQ,WAAA,EAAa,QAAA;AAC9B;AAOO,SAAS,WAAA,CAAY,KAAA,EAAkC;AAC5D,EAAA,MAAM,EAAE,iBAAA,EAAmB,kBAAkB,EAAA,EAAI,KAAA;AAEjD,EAAA,GAAA,CAAI,CAAE,mBAAA,CAA0C,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC3E,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,CAAA,+BAAA,EAAS,mBAAA,CAAoB,GAAA,CAAI,CAAC,CAAA,EAAA,GAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA;AAChD,IAAA;AACF,EAAA;AAC4B,EAAA;AACL,IAAA;AACvB,EAAA;AAEmB,EAAA;AACX,IAAA;AACA,IAAA;AACA,IAAA;AACR,EAAA;AACuC,EAAA;AACgC,EAAA;AAEvC,EAAA;AACvB,IAAA;AACL,MAAA;AACc,MAAA;AACI,MAAA;AACC,MAAA;AACT,MAAA;AACD,MAAA;AACX,IAAA;AACF,EAAA;AAE8B,EAAA;AACP,IAAA;AACvB,EAAA;AAEO,EAAA;AACL,IAAA;AACc,IAAA;AACI,IAAA;AAClB,IAAA;AAC8B,IAAA;AACoB,IAAA;AACpD,EAAA;AACF;AF9C8E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-5Q6IASB2.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const strokeMeta: CalculatorMeta = {\n name: '补偿行程',\n nameEn: 'Compensation Stroke',\n summary:\n '按温度伸缩量公式计算锚段线索伸缩量与补偿装置所需行程,可对照装置许用行程校核。',\n formula: [\n '温度伸缩量:ΔL = α·L·Δt',\n '补偿行程设计值(含裕度):S = n·ΔL + S₀',\n ],\n references: [\n '全补偿锚段接触线与承力索须分别计算(各自 α/L 不同);半补偿仅计算接触线侧',\n '传动比常见规格:滑轮组 1:2/1:3(主流)、1:4 见于教材案例,无标准统一档位表',\n '安装裕度可参照补偿器 a/b 值:任何情况下不小于 200mm(原铁运〔2007〕69号第87条,已由铁总运〔2017〕9号承接);设计取值惯例不小于 300mm,属教材/设计惯例而非规程条款',\n '补偿装置产品要求见 TB/T 2075.12-2024(滑轮补偿装置)、TB/T 2075.13-2024(棘轮补偿装置)与 TB/T 2073-2020(零部件技术条件)',\n ],\n scope: [\n '锚段长度 L 为两端锚固点之间长度',\n '设计温差 Δt 为最高与最低设计温度之差',\n '铜合金线膨胀系数约 1.7×10⁻⁵/℃(EN 50149 铜锡接触线数据表)',\n '全补偿锚段承力索侧须另行计算',\n '参数取值以设计规程为准',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/stroke/',\n};\n","export { strokeMeta } from './meta';\n\n/** 补偿装置传动比(滑轮组/棘轮),n:1 中的 n */\nexport type TransmissionRatio = 2 | 3 | 4;\n\n/** 常见传动比档位 */\nexport const TRANSMISSION_RATIOS: readonly TransmissionRatio[] = [2, 3, 4];\n\n/** 安装裕度规程下限,mm(原铁运〔2007〕69号第87条) */\nexport const MIN_MARGIN_MM = 200;\n\n/** 安装裕度设计惯例值,mm(教材/设计惯例,非规程条款) */\nexport const CONVENTIONAL_MARGIN_MM = 300;\n\nexport interface StrokeInput {\n /** 锚段长度 L,m(两端锚固点之间) */\n readonly anchorLengthM: number;\n /** 设计温差 Δt,℃(最高与最低设计温度之差) */\n readonly tempRangeDegC: number;\n /** 线膨胀系数 α,1/℃(铜合金约 1.7e-5) */\n readonly expansionPerDegC: number;\n /** 补偿传动比 n(1:2 / 1:3 / 1:4) */\n readonly transmissionRatio: TransmissionRatio;\n /** 安装裕度 S₀,mm */\n readonly marginMM: number;\n /** 装置许用行程,mm。传 null 则不判定 */\n readonly allowableStrokeMM: number | null;\n}\n\nexport interface StrokeResult {\n /** 每℃伸缩量 α·L,mm/℃ */\n readonly perDegreeMM: number;\n /** 总伸缩量 ΔL = α·L·Δt,mm */\n readonly elongationMM: number;\n /** 所需行程 S = n·ΔL + S₀,mm */\n readonly requiredStrokeMM: number;\n readonly allowableStrokeMM: number | null;\n /** 富余量 = 许用行程 − 所需行程,mm。未提供许用行程时为 null */\n readonly marginMM: number | null;\n readonly verdict: 'pass' | 'fail' | 'not-assessed';\n}\n\n/**\n * 温度伸缩量:ΔL = α·L·Δt,mm。\n *\n * @param expansionPerDegC 线膨胀系数 α,1/℃\n * @param anchorLengthM 锚段长度 L,m\n * @param tempRangeDegC 设计温差 Δt,℃\n * @returns 伸缩量,mm\n */\nexport function elongationMM(\n expansionPerDegC: number,\n anchorLengthM: number,\n tempRangeDegC: number,\n): number {\n if (!(expansionPerDegC > 0)) {\n throw new RangeError(`线膨胀系数必须为正数,收到 ${expansionPerDegC} 1/℃`);\n }\n if (!(anchorLengthM > 0)) {\n throw new RangeError(`锚段长度必须为正数,收到 ${anchorLengthM} m`);\n }\n if (!(tempRangeDegC > 0)) {\n throw new RangeError(`设计温差必须为正数,收到 ${tempRangeDegC} ℃`);\n }\n return expansionPerDegC * anchorLengthM * tempRangeDegC * 1000;\n}\n\n/**\n * 补偿行程设计值(含裕度):S = n·ΔL + S₀,mm。\n *\n * @param elongation 总伸缩量 ΔL,mm\n * @param ratio 传动比 n\n * @param marginMM 安装裕度 S₀,mm\n */\nexport function requiredStrokeMM(\n elongation: number,\n ratio: TransmissionRatio,\n marginMM: number,\n): number {\n if (!(elongation >= 0)) {\n throw new RangeError(`伸缩量不能为负,收到 ${elongation} mm`);\n }\n if (!(marginMM >= 0)) {\n throw new RangeError(`安装裕度不能为负,收到 ${marginMM} mm`);\n }\n return ratio * elongation + marginMM;\n}\n\n/**\n * 计算锚段伸缩量与补偿装置所需行程,并可选对照许用行程校核。\n *\n * ⚠️ 全补偿锚段接触线与承力索须分别计算;本函数单次只算一根线索。\n */\nexport function strokeCheck(input: StrokeInput): StrokeResult {\n const { transmissionRatio, allowableStrokeMM } = input;\n\n if (!(TRANSMISSION_RATIOS as readonly number[]).includes(transmissionRatio)) {\n throw new RangeError(\n `传动比应为 ${TRANSMISSION_RATIOS.map((r) => `1:${r}`).join(' / ')},收到 1:${transmissionRatio}`,\n );\n }\n if (!(input.marginMM >= 0)) {\n throw new RangeError(`安装裕度不能为负,收到 ${input.marginMM} mm`);\n }\n\n const elongation = elongationMM(\n input.expansionPerDegC,\n input.anchorLengthM,\n input.tempRangeDegC,\n );\n const perDegreeMM = elongation / input.tempRangeDegC;\n const required = requiredStrokeMM(elongation, transmissionRatio, input.marginMM);\n\n if (allowableStrokeMM === null) {\n return {\n perDegreeMM,\n elongationMM: elongation,\n requiredStrokeMM: required,\n allowableStrokeMM: null,\n marginMM: null,\n verdict: 'not-assessed',\n };\n }\n\n if (!(allowableStrokeMM > 0)) {\n throw new RangeError(`装置许用行程必须为正数,收到 ${allowableStrokeMM} mm`);\n }\n\n return {\n perDegreeMM,\n elongationMM: elongation,\n requiredStrokeMM: required,\n allowableStrokeMM,\n marginMM: allowableStrokeMM - required,\n verdict: required <= allowableStrokeMM ? 'pass' : 'fail',\n };\n}\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// src/ampacity/meta.ts
|
|
2
|
+
var ampacityMeta = {
|
|
3
|
+
name: "\u8F7D\u6D41\u91CF\u4FEE\u6B63\u4E0E\u77ED\u8DEF\u70ED\u7A33\u5B9A",
|
|
4
|
+
nameEn: "Ampacity Derating and Short-Circuit Thermal Stability",
|
|
5
|
+
summary: "\u6309\u73AF\u5883\u6E29\u5EA6\u4FEE\u6B63\u6301\u7EED\u8F7D\u6D41\u91CF\uFF0C\u5E76\u6309\u77ED\u8DEF\u70ED\u7A33\u5B9A\u6821\u6838\u6700\u5C0F\u622A\u9762\uFF0C\u7528\u4E8E\u63A5\u89E6\u7EBF/\u9644\u52A0\u5BFC\u7EBF\u622A\u9762\u9009\u578B\u4E0E\u6821\u6838\u3002",
|
|
6
|
+
formula: [
|
|
7
|
+
"\u8F7D\u6D41\u91CF\u73AF\u5883\u6E29\u5EA6\u4FEE\u6B63\uFF1AI(Ta) = I\u2080\xB7\u221A((Tmax \u2212 Ta) / (Tmax \u2212 T\u2080))",
|
|
8
|
+
"\u77ED\u8DEF\u70ED\u7A33\u5B9A\u6700\u5C0F\u622A\u9762\uFF1AS \u2265 I_k\xB7\u221At_k / C"
|
|
9
|
+
],
|
|
10
|
+
references: [
|
|
11
|
+
"\u5141\u8BB8\u5DE5\u4F5C\u6E29\u5EA6\uFF1A\u94DC 95\u2103\u3001\u94DC\u5408\u91D1 150\u2103\uFF08TB/T 2809-2017 \u88685\uFF09",
|
|
12
|
+
"\u57FA\u51C6\u8F7D\u6D41\u91CF I\u2080 \u53EF\u6309 TB/T 2809-2017 \u88685 \u53D6\u503C\uFF08\u5BA4\u5185\u4E3A\u65E0\u98CE\u65E0\u65E5\u7167\u8BD5\u9A8C\u6761\u4EF6\u4E0B\u987B\u7B26\u5408\u503C\uFF0C\u5BA4\u5916\u503C\u5B9C\u53C2\u7167\uFF09",
|
|
13
|
+
"\u70ED\u7A33\u5B9A\u7CFB\u6570 C \u5C5E\u8BBE\u8BA1\u8F93\u5165\uFF0C\u987B\u6309\u8BBE\u8BA1\u624B\u518C\u4E0E\u4EA7\u54C1\u6280\u672F\u6761\u4EF6\u53D6\u503C"
|
|
14
|
+
],
|
|
15
|
+
scope: [
|
|
16
|
+
"\u4FEE\u6B63\u5F0F\u4EC5\u8986\u76D6\u73AF\u5883\u6E29\u5EA6\u9879",
|
|
17
|
+
"\u9AD8\u6D77\u62D4\u3001\u96A7\u9053\u3001\u65E5\u7167\u53E0\u52A0\u573A\u666F\u987B\u53E6\u884C\u53E0\u52A0\u6563\u70ED\u4FEE\u6B63",
|
|
18
|
+
"\u77ED\u8DEF\u7535\u6D41 I_k \u5E94\u4E3A\u4F9B\u7535\u8BA1\u7B97\u7ED9\u51FA\u7684\u70ED\u7A33\u5B9A\u7B49\u6548\u503C",
|
|
19
|
+
"\u5207\u9664\u65F6\u95F4 t_k \u4E3A\u4FDD\u62A4\u52A8\u4F5C\u5168\u5207\u9664\u65F6\u95F4",
|
|
20
|
+
"\u672A\u8003\u8651\u90BB\u8FD1\u91D1\u5C5E\u56DE\u6D41\u3001\u96C6\u80A4\u6548\u5E94\u4E0E\u77ED\u65F6\u8FC7\u8F7D\u5DE5\u51B5"
|
|
21
|
+
],
|
|
22
|
+
disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
|
|
23
|
+
online: "https://www.itswe.com/calculator/ampacity/"
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// src/ampacity/index.ts
|
|
27
|
+
var DEFAULT_BASE_AMBIENT_TEMP_DEG_C = 25;
|
|
28
|
+
function ampacityDeratingFactor(input) {
|
|
29
|
+
const {
|
|
30
|
+
maxAllowedTempDegC: tMax,
|
|
31
|
+
ambientTempDegC: tAmbient,
|
|
32
|
+
baseAmbientTempDegC: tBaseOpt
|
|
33
|
+
} = input;
|
|
34
|
+
const tBase = tBaseOpt ?? DEFAULT_BASE_AMBIENT_TEMP_DEG_C;
|
|
35
|
+
if (!(input.baseAmpacityA > 0)) {
|
|
36
|
+
throw new RangeError(`\u57FA\u51C6\u8F7D\u6D41\u91CF\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.baseAmpacityA} A`);
|
|
37
|
+
}
|
|
38
|
+
if (!(tMax > tBase)) {
|
|
39
|
+
throw new RangeError(
|
|
40
|
+
`\u5141\u8BB8\u6E29\u5EA6 ${tMax} \u2103 \u5FC5\u987B\u9AD8\u4E8E\u57FA\u51C6\u73AF\u5883\u6E29\u5EA6 ${tBase} \u2103`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
if (!(tAmbient < tMax)) {
|
|
44
|
+
throw new RangeError(
|
|
45
|
+
`\u5B9E\u9645\u73AF\u5883\u6E29\u5EA6 ${tAmbient} \u2103 \u5DF2\u8FBE\u5230\u6216\u8D85\u8FC7\u5141\u8BB8\u6E29\u5EA6 ${tMax} \u2103\uFF0C\u65E0\u6CD5\u6301\u7EED\u8FD0\u884C`
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
if (!(tAmbient >= -273.15)) {
|
|
49
|
+
throw new RangeError(`\u73AF\u5883\u6E29\u5EA6\u4E0D\u80FD\u4F4E\u4E8E\u7EDD\u5BF9\u96F6\u5EA6\uFF0C\u6536\u5230 ${tAmbient} \u2103`);
|
|
50
|
+
}
|
|
51
|
+
return Math.sqrt((tMax - tAmbient) / (tMax - tBase));
|
|
52
|
+
}
|
|
53
|
+
function deratedAmpacityA(input) {
|
|
54
|
+
return input.baseAmpacityA * ampacityDeratingFactor(input);
|
|
55
|
+
}
|
|
56
|
+
function shortCircuitMinSectionMM2(shortCircuitCurrentKA, clearingTimeS, thermalCoefficientC) {
|
|
57
|
+
if (!(shortCircuitCurrentKA > 0)) {
|
|
58
|
+
throw new RangeError(
|
|
59
|
+
`\u77ED\u8DEF\u7535\u6D41\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${shortCircuitCurrentKA} kA`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
if (!(clearingTimeS > 0)) {
|
|
63
|
+
throw new RangeError(`\u5207\u9664\u65F6\u95F4\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${clearingTimeS} s`);
|
|
64
|
+
}
|
|
65
|
+
if (!(thermalCoefficientC > 0)) {
|
|
66
|
+
throw new RangeError(
|
|
67
|
+
`\u70ED\u7A33\u5B9A\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${thermalCoefficientC} A\xB7\u221As/mm\xB2`
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
const iA = shortCircuitCurrentKA * 1e3;
|
|
71
|
+
return iA * Math.sqrt(clearingTimeS) / thermalCoefficientC;
|
|
72
|
+
}
|
|
73
|
+
function shortCircuitCheck(input) {
|
|
74
|
+
const minSectionMM2 = shortCircuitMinSectionMM2(
|
|
75
|
+
input.shortCircuitCurrentKA,
|
|
76
|
+
input.clearingTimeS,
|
|
77
|
+
input.thermalCoefficientC
|
|
78
|
+
);
|
|
79
|
+
const verdict = input.selectedSectionMM2 === null ? "not-assessed" : input.selectedSectionMM2 >= minSectionMM2 ? "pass" : "fail";
|
|
80
|
+
return { minSectionMM2, selectedSectionMM2: input.selectedSectionMM2, verdict };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export {
|
|
84
|
+
ampacityMeta,
|
|
85
|
+
DEFAULT_BASE_AMBIENT_TEMP_DEG_C,
|
|
86
|
+
ampacityDeratingFactor,
|
|
87
|
+
deratedAmpacityA,
|
|
88
|
+
shortCircuitMinSectionMM2,
|
|
89
|
+
shortCircuitCheck
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=chunk-746H65EQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ampacity/meta.ts","../src/ampacity/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const ampacityMeta: CalculatorMeta = {\n name: '载流量修正与短路热稳定',\n nameEn: 'Ampacity Derating and Short-Circuit Thermal Stability',\n summary:\n '按环境温度修正持续载流量,并按短路热稳定校核最小截面,用于接触线/附加导线截面选型与校核。',\n formula: [\n '载流量环境温度修正:I(Ta) = I₀·√((Tmax − Ta) / (Tmax − T₀))',\n '短路热稳定最小截面:S ≥ I_k·√t_k / C',\n ],\n references: [\n '允许工作温度:铜 95℃、铜合金 150℃(TB/T 2809-2017 表5)',\n '基准载流量 I₀ 可按 TB/T 2809-2017 表5 取值(室内为无风无日照试验条件下须符合值,室外值宜参照)',\n '热稳定系数 C 属设计输入,须按设计手册与产品技术条件取值',\n ],\n scope: [\n '修正式仅覆盖环境温度项',\n '高海拔、隧道、日照叠加场景须另行叠加散热修正',\n '短路电流 I_k 应为供电计算给出的热稳定等效值',\n '切除时间 t_k 为保护动作全切除时间',\n '未考虑邻近金属回流、集肤效应与短时过载工况',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/ampacity/',\n};\n","export { ampacityMeta } from './meta';\n\n/** 基准环境温度 T₀,℃(TB/T 2809-2017 标准环境) */\nexport const DEFAULT_BASE_AMBIENT_TEMP_DEG_C = 25;\n\n/** 载流量环境温度修正输入 */\nexport interface AmpacityDeratingInput {\n /** 基准载流量 I₀,A(标准环境 T₀ 下的持续载流量) */\n readonly baseAmpacityA: number;\n /** 最高允许工作温度 Tmax,℃(铜 95、铜合金 150) */\n readonly maxAllowedTempDegC: number;\n /** 最不利实际环境温度 Ta,℃ */\n readonly ambientTempDegC: number;\n /** 基准环境温度 T₀,℃。缺省 25 ℃ */\n readonly baseAmbientTempDegC?: number;\n}\n\nexport interface AmpacityDeratingResult {\n /** 修正系数,无量纲 */\n readonly deratingFactor: number;\n /** 修正后载流量 I(Ta),A */\n readonly deratedAmpacityA: number;\n}\n\n/**\n * 环境温度修正系数:√((Tmax − Ta) / (Tmax − T₀))。\n *\n * Ta 越接近允许温度,系数越小;Ta = T₀ 时为 1;Ta > Tmax 无解,直接抛错。\n */\nexport function ampacityDeratingFactor(input: AmpacityDeratingInput): number {\n const {\n maxAllowedTempDegC: tMax,\n ambientTempDegC: tAmbient,\n baseAmbientTempDegC: tBaseOpt,\n } = input;\n const tBase = tBaseOpt ?? DEFAULT_BASE_AMBIENT_TEMP_DEG_C;\n\n if (!(input.baseAmpacityA > 0)) {\n throw new RangeError(`基准载流量必须为正数,收到 ${input.baseAmpacityA} A`);\n }\n if (!(tMax > tBase)) {\n throw new RangeError(\n `允许温度 ${tMax} ℃ 必须高于基准环境温度 ${tBase} ℃`,\n );\n }\n if (!(tAmbient < tMax)) {\n throw new RangeError(\n `实际环境温度 ${tAmbient} ℃ 已达到或超过允许温度 ${tMax} ℃,无法持续运行`,\n );\n }\n if (!(tAmbient >= -273.15)) {\n throw new RangeError(`环境温度不能低于绝对零度,收到 ${tAmbient} ℃`);\n }\n\n return Math.sqrt((tMax - tAmbient) / (tMax - tBase));\n}\n\n/**\n * 修正后载流量:I(Ta) = I₀·√((Tmax − Ta)/(Tmax − T₀)),A。\n *\n * ⚠️ 修正式仅覆盖环境温度项;高海拔、隧道、日照叠加场景须另行叠加修正。\n */\nexport function deratedAmpacityA(input: AmpacityDeratingInput): number {\n return input.baseAmpacityA * ampacityDeratingFactor(input);\n}\n\n/** 热稳定校核判定结果 */\nexport type ThermalStabilityVerdict = 'pass' | 'fail' | 'not-assessed';\n\nexport interface ShortCircuitCheckInput {\n /** 短路电流 I_k,kA(热稳定等效值,由供电计算给出) */\n readonly shortCircuitCurrentKA: number;\n /** 全切除时间 t_k,s */\n readonly clearingTimeS: number;\n /** 热稳定系数 C,A·√s/mm²(设计输入) */\n readonly thermalCoefficientC: number;\n /** 拟选截面,mm²。传 null 则仅输出最小截面,不判定 */\n readonly selectedSectionMM2: number | null;\n}\n\nexport interface ShortCircuitCheckResult {\n /** 最小热稳截面 S_min = I_k·√t_k / C,mm² */\n readonly minSectionMM2: number;\n readonly selectedSectionMM2: number | null;\n /** 拟选截面判定 */\n readonly verdict: ThermalStabilityVerdict;\n}\n\n/**\n * 短路热稳定最小截面:S_min = I_k·√t_k / C,mm²。\n *\n * @param shortCircuitCurrentKA 短路电流,kA\n * @param clearingTimeS 切除时间,s\n * @param thermalCoefficientC 热稳定系数,A·√s/mm²\n */\nexport function shortCircuitMinSectionMM2(\n shortCircuitCurrentKA: number,\n clearingTimeS: number,\n thermalCoefficientC: number,\n): number {\n if (!(shortCircuitCurrentKA > 0)) {\n throw new RangeError(\n `短路电流必须为正数,收到 ${shortCircuitCurrentKA} kA`,\n );\n }\n if (!(clearingTimeS > 0)) {\n throw new RangeError(`切除时间必须为正数,收到 ${clearingTimeS} s`);\n }\n if (!(thermalCoefficientC > 0)) {\n throw new RangeError(\n `热稳定系数必须为正数,收到 ${thermalCoefficientC} A·√s/mm²`,\n );\n }\n const iA = shortCircuitCurrentKA * 1000;\n return (iA * Math.sqrt(clearingTimeS)) / thermalCoefficientC;\n}\n\n/**\n * 短路热稳定校核:给出最小截面,并在提供拟选截面时判定是否满足 S ≥ S_min。\n */\nexport function shortCircuitCheck(input: ShortCircuitCheckInput): ShortCircuitCheckResult {\n const minSectionMM2 = shortCircuitMinSectionMM2(\n input.shortCircuitCurrentKA,\n input.clearingTimeS,\n input.thermalCoefficientC,\n );\n\n const verdict: ThermalStabilityVerdict =\n input.selectedSectionMM2 === null\n ? 'not-assessed'\n : input.selectedSectionMM2 >= minSectionMM2\n ? 'pass'\n : 'fail';\n\n return { minSectionMM2, selectedSectionMM2: input.selectedSectionMM2, verdict };\n}\n"],"mappings":";AAEO,IAAM,eAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV;;;ACtBO,IAAM,kCAAkC;AA0BxC,SAAS,uBAAuB,OAAsC;AAC3E,QAAM;AAAA,IACJ,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,EACvB,IAAI;AACJ,QAAM,QAAQ,YAAY;AAE1B,MAAI,EAAE,MAAM,gBAAgB,IAAI;AAC9B,UAAM,IAAI,WAAW,kFAAiB,MAAM,aAAa,IAAI;AAAA,EAC/D;AACA,MAAI,EAAE,OAAO,QAAQ;AACnB,UAAM,IAAI;AAAA,MACR,4BAAQ,IAAI,wEAAiB,KAAK;AAAA,IACpC;AAAA,EACF;AACA,MAAI,EAAE,WAAW,OAAO;AACtB,UAAM,IAAI;AAAA,MACR,wCAAU,QAAQ,wEAAiB,IAAI;AAAA,IACzC;AAAA,EACF;AACA,MAAI,EAAE,YAAY,UAAU;AAC1B,UAAM,IAAI,WAAW,8FAAmB,QAAQ,SAAI;AAAA,EACtD;AAEA,SAAO,KAAK,MAAM,OAAO,aAAa,OAAO,MAAM;AACrD;AAOO,SAAS,iBAAiB,OAAsC;AACrE,SAAO,MAAM,gBAAgB,uBAAuB,KAAK;AAC3D;AA+BO,SAAS,0BACd,uBACA,eACA,qBACQ;AACR,MAAI,EAAE,wBAAwB,IAAI;AAChC,UAAM,IAAI;AAAA,MACR,4EAAgB,qBAAqB;AAAA,IACvC;AAAA,EACF;AACA,MAAI,EAAE,gBAAgB,IAAI;AACxB,UAAM,IAAI,WAAW,4EAAgB,aAAa,IAAI;AAAA,EACxD;AACA,MAAI,EAAE,sBAAsB,IAAI;AAC9B,UAAM,IAAI;AAAA,MACR,kFAAiB,mBAAmB;AAAA,IACtC;AAAA,EACF;AACA,QAAM,KAAK,wBAAwB;AACnC,SAAQ,KAAK,KAAK,KAAK,aAAa,IAAK;AAC3C;AAKO,SAAS,kBAAkB,OAAwD;AACxF,QAAM,gBAAgB;AAAA,IACpB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,QAAM,UACJ,MAAM,uBAAuB,OACzB,iBACA,MAAM,sBAAsB,gBAC1B,SACA;AAER,SAAO,EAAE,eAAe,oBAAoB,MAAM,oBAAoB,QAAQ;AAChF;","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/common/resistance.ts
|
|
2
|
+
var COPPER_ALPHA_PER_DEG_C = 393e-5;
|
|
3
|
+
var IACS_RESISTIVITY_OHM_MM2_PER_M = 0.017241;
|
|
4
|
+
function resistanceAtTempOhmPerKm(r20OhmPerKm, tempDegC, alphaPerDegC = COPPER_ALPHA_PER_DEG_C) {
|
|
5
|
+
if (!(r20OhmPerKm > 0)) {
|
|
6
|
+
throw new RangeError(`20\u2103 \u5355\u4F4D\u7535\u963B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${r20OhmPerKm} \u03A9/km`);
|
|
7
|
+
}
|
|
8
|
+
if (!(alphaPerDegC > 0)) {
|
|
9
|
+
throw new RangeError(`\u7535\u963B\u6E29\u5EA6\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${alphaPerDegC} /\u2103`);
|
|
10
|
+
}
|
|
11
|
+
return r20OhmPerKm * (1 + alphaPerDegC * (tempDegC - 20));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
exports.COPPER_ALPHA_PER_DEG_C = COPPER_ALPHA_PER_DEG_C; exports.IACS_RESISTIVITY_OHM_MM2_PER_M = IACS_RESISTIVITY_OHM_MM2_PER_M; exports.resistanceAtTempOhmPerKm = resistanceAtTempOhmPerKm;
|
|
19
|
+
//# sourceMappingURL=chunk-DGO2DCO5.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-DGO2DCO5.cjs","../src/common/resistance.ts"],"names":[],"mappings":"AAAA;ACUO,IAAM,uBAAA,EAAyB,MAAA;AAG/B,IAAM,+BAAA,EAAiC,QAAA;AAUvC,SAAS,wBAAA,CACd,WAAA,EACA,QAAA,EACA,aAAA,EAAuB,sBAAA,EACf;AACR,EAAA,GAAA,CAAI,CAAA,CAAE,YAAA,EAAc,CAAA,CAAA,EAAI;AACtB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,kFAAA,EAAoB,WAAW,CAAA,UAAA,CAAO,CAAA;AAAA,EAC7D;AACA,EAAA,GAAA,CAAI,CAAA,CAAE,aAAA,EAAe,CAAA,CAAA,EAAI;AACvB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,qFAAA,EAAkB,YAAY,CAAA,QAAA,CAAK,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,YAAA,EAAA,CAAe,EAAA,EAAI,aAAA,EAAA,CAAgB,SAAA,EAAW,EAAA,CAAA,CAAA;AACvD;ADvBA;AACA;AACE;AACA;AACA;AACF,8LAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-DGO2DCO5.cjs","sourcesContent":[null,"/**\n * 电阻温度修正 —— copper 与 voltage-drop 共用。\n *\n * ⚠️ 注意别与线膨胀系数混淆:\n * - 本文件的 α = 0.00393 /℃ 是**电阻**温度系数\n * - wire-specs 的 COPPER_ALLOY_ALPHA_PER_DEG_C = 1.7e-5 /℃ 是**热膨胀**系数\n * 两者相差两个数量级,混用会导致结果严重偏离。\n */\n\n/** 铜的电阻温度系数,1/℃ */\nexport const COPPER_ALPHA_PER_DEG_C = 0.00393;\n\n/** IACS 退火铜 20℃ 标准电阻率,Ω·mm²/m(= 1/58) */\nexport const IACS_RESISTIVITY_OHM_MM2_PER_M = 0.017241;\n\n/**\n * 单位电阻温度修正:r_T = r₂₀·[1 + α·(T − 20)]。\n *\n * @param r20OhmPerKm 20℃ 单位电阻,Ω/km\n * @param tempDegC 环境温度,℃\n * @param alphaPerDegC 电阻温度系数,1/℃。缺省铜 0.00393\n * @returns 该温度下的单位电阻,Ω/km\n */\nexport function resistanceAtTempOhmPerKm(\n r20OhmPerKm: number,\n tempDegC: number,\n alphaPerDegC: number = COPPER_ALPHA_PER_DEG_C,\n): number {\n if (!(r20OhmPerKm > 0)) {\n throw new RangeError(`20℃ 单位电阻必须为正数,收到 ${r20OhmPerKm} Ω/km`);\n }\n if (!(alphaPerDegC > 0)) {\n throw new RangeError(`电阻温度系数必须为正数,收到 ${alphaPerDegC} /℃`);\n }\n return r20OhmPerKm * (1 + alphaPerDegC * (tempDegC - 20));\n}\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/wind/meta.ts
|
|
2
|
+
var windMeta = {
|
|
3
|
+
name: "\u98CE\u504F\u9650\u754C\u6821\u9A8C",
|
|
4
|
+
nameEn: "Wind Deflection Clearance Check",
|
|
5
|
+
summary: "\u8BA1\u7B97\u7EBF\u7D22\u5728\u98CE\u8377\u8F7D\u4F5C\u7528\u4E0B\u7684\u8DE8\u4E2D\u504F\u79FB b\uFF0C\u53E0\u52A0\u62C9\u51FA\u503C\u540E\u4E0E\u9650\u754C\u5141\u8BB8\u503C\u6BD4\u8F83\uFF0C\u7ED9\u51FA\u5408\u683C/\u8D85\u9650\u7ED3\u8BBA\u3002",
|
|
6
|
+
formula: [
|
|
7
|
+
"\u5355\u4F4D\u98CE\u8377\u8F7D\uFF1Ap = \xBD\xB7\u03C1\xB7v\xB2\xB7d\xB7\u03B1\xB7sin\xB2\u03B8\uFF08\u03C1 = 1.225 kg/m\xB3\uFF09",
|
|
8
|
+
"\u8DE8\u4E2D\u98CE\u504F\uFF08\u7B80\u652F\u7D22\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF09\uFF1Ab = p\xB7L\xB2 / (8\xB7T)",
|
|
9
|
+
"\u9650\u754C\u6821\u9A8C\uFF1Ab + a \u2264 \u9650\u754C\u5141\u8BB8\u503C\uFF0C\u6EE1\u8DB3\u5224\u4E3A\u5408\u683C"
|
|
10
|
+
],
|
|
11
|
+
references: [
|
|
12
|
+
"\u7B80\u652F\u7D22\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u9002\u7528\u4E8E f/L \u2264 1/10 \u5DE5\u51B5",
|
|
13
|
+
"\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570 \u03B1\uFF1A\u5706\u67F1\u5F62\u7EBF\u7D22\u5E38\u53D6 1.2",
|
|
14
|
+
"\u9650\u754C\u5141\u8BB8\u503C\u6309\u53D7\u7535\u5F13\u52A8\u6001\u5305\u7EDC\u7EBF\u53D6\u503C"
|
|
15
|
+
],
|
|
16
|
+
scope: [
|
|
17
|
+
"\u98CE\u901F v\uFF1A0 ~ 60 m/s",
|
|
18
|
+
"\u98CE\u5411\u4E0E\u7EBF\u8DEF\u5939\u89D2 \u03B8\uFF1A0 ~ 180\xB0\uFF0C90\xB0 \u4E3A\u5782\u76F4\u4E8E\u7EBF\u8DEF",
|
|
19
|
+
"\u7EBF\u7D22\u76F4\u5F84 d\uFF1A1 ~ 30 mm",
|
|
20
|
+
"\u7EBF\u7D22\u5F20\u529B T\uFF1A1 ~ 40 kN",
|
|
21
|
+
"\u8DE8\u8DDD L\uFF1A5 ~ 80 m",
|
|
22
|
+
"\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570 \u03B1\uFF1A0.5 ~ 2.0",
|
|
23
|
+
"\u62C9\u51FA\u503C a\uFF1A0 ~ 0.6 m",
|
|
24
|
+
"\u9650\u754C\u5141\u8BB8\u503C\uFF1A0.1 ~ 2 m",
|
|
25
|
+
"\u672A\u8BA1\u5165\u7EBF\u7D22\u98CE\u81F4\u632F\u52A8\u3001\u9A70\u632F\u4E0E\u8986\u51B0\u9644\u52A0\u98CE\u8F7D"
|
|
26
|
+
],
|
|
27
|
+
disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
|
|
28
|
+
online: "https://www.itswe.com/calculator/wind/"
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// src/wind/index.ts
|
|
32
|
+
var AIR_DENSITY_KG_PER_M3 = 1.225;
|
|
33
|
+
function windLoadNPerM(params) {
|
|
34
|
+
const { windSpeedMPerS, windAngleDeg, wireDiameterMM, dragCoefficient, airDensityKgPerM3 } = params;
|
|
35
|
+
if (!(windSpeedMPerS >= 0)) {
|
|
36
|
+
throw new RangeError(`\u98CE\u901F\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${windSpeedMPerS} m/s`);
|
|
37
|
+
}
|
|
38
|
+
if (!(wireDiameterMM > 0)) {
|
|
39
|
+
throw new RangeError(`\u7EBF\u7D22\u76F4\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${wireDiameterMM} mm`);
|
|
40
|
+
}
|
|
41
|
+
if (!(dragCoefficient > 0)) {
|
|
42
|
+
throw new RangeError(`\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${dragCoefficient}`);
|
|
43
|
+
}
|
|
44
|
+
if (!(windAngleDeg >= 0 && windAngleDeg <= 180)) {
|
|
45
|
+
throw new RangeError(`\u98CE\u5411\u4E0E\u7EBF\u8DEF\u5939\u89D2\u5E94\u4E3A 0 ~ 180\xB0\uFF0C\u6536\u5230 ${windAngleDeg}\xB0`);
|
|
46
|
+
}
|
|
47
|
+
const rho = _nullishCoalesce(airDensityKgPerM3, () => ( AIR_DENSITY_KG_PER_M3));
|
|
48
|
+
if (!(rho > 0)) {
|
|
49
|
+
throw new RangeError(`\u7A7A\u6C14\u5BC6\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${rho} kg/m\xB3`);
|
|
50
|
+
}
|
|
51
|
+
const dM = wireDiameterMM * 1e-3;
|
|
52
|
+
const sinTheta = Math.sin(windAngleDeg * Math.PI / 180);
|
|
53
|
+
return 0.5 * rho * windSpeedMPerS * windSpeedMPerS * dM * dragCoefficient * sinTheta * sinTheta;
|
|
54
|
+
}
|
|
55
|
+
function windDeflectionM(windLoadNPerM2, spanM, tensionKN) {
|
|
56
|
+
if (!(windLoadNPerM2 >= 0)) {
|
|
57
|
+
throw new RangeError(`\u5355\u4F4D\u98CE\u8377\u8F7D\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${windLoadNPerM2} N/m`);
|
|
58
|
+
}
|
|
59
|
+
if (!(spanM > 0)) {
|
|
60
|
+
throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
|
|
61
|
+
}
|
|
62
|
+
if (!(tensionKN > 0)) {
|
|
63
|
+
throw new RangeError(`\u7EBF\u7D22\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionKN} kN`);
|
|
64
|
+
}
|
|
65
|
+
return windLoadNPerM2 * spanM * spanM / (8 * tensionKN * 1e3);
|
|
66
|
+
}
|
|
67
|
+
function windClearanceCheck(input) {
|
|
68
|
+
const { staggerM, clearanceLimitM } = input;
|
|
69
|
+
if (!(staggerM >= 0)) {
|
|
70
|
+
throw new RangeError(`\u62C9\u51FA\u503C\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${staggerM} m`);
|
|
71
|
+
}
|
|
72
|
+
if (!(clearanceLimitM > 0)) {
|
|
73
|
+
throw new RangeError(`\u9650\u754C\u5141\u8BB8\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${clearanceLimitM} m`);
|
|
74
|
+
}
|
|
75
|
+
const p = windLoadNPerM(input);
|
|
76
|
+
const b = windDeflectionM(p, input.spanM, input.tensionKN);
|
|
77
|
+
const totalOffsetM = b + staggerM;
|
|
78
|
+
return {
|
|
79
|
+
windLoadNPerM: p,
|
|
80
|
+
deflectionM: b,
|
|
81
|
+
totalOffsetM,
|
|
82
|
+
clearanceLimitM,
|
|
83
|
+
marginM: clearanceLimitM - totalOffsetM,
|
|
84
|
+
passes: totalOffsetM <= clearanceLimitM
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
exports.windMeta = windMeta; exports.AIR_DENSITY_KG_PER_M3 = AIR_DENSITY_KG_PER_M3; exports.windLoadNPerM = windLoadNPerM; exports.windDeflectionM = windDeflectionM; exports.windClearanceCheck = windClearanceCheck;
|
|
95
|
+
//# sourceMappingURL=chunk-FVESJBUD.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-FVESJBUD.cjs","../src/wind/meta.ts","../src/wind/index.ts"],"names":[],"mappings":"AAAA;ACEO,IAAM,SAAA,EAA2B;AAAA,EACtC,IAAA,EAAM,sCAAA;AAAA,EACN,MAAA,EAAQ,iCAAA;AAAA,EACR,OAAA,EACE,2PAAA;AAAA,EACF,OAAA,EAAS;AAAA,IACP,oIAAA;AAAA,IACA,qHAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,uGAAA;AAAA,IACA,iGAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO;AAAA,IACL,gCAAA;AAAA,IACA,qHAAA;AAAA,IACA,2CAAA;AAAA,IACA,2CAAA;AAAA,IACA,8BAAA;AAAA,IACA,4DAAA;AAAA,IACA,qCAAA;AAAA,IACA,+CAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADDA;AACA;AE3BO,IAAM,sBAAA,EAAwB,KAAA;AAoB9B,SAAS,aAAA,CAAc,MAAA,EAA+B;AAC3D,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAA,EAAc,cAAA,EAAgB,eAAA,EAAiB,kBAAkB,EAAA,EAAI,MAAA;AAE7F,EAAA,GAAA,CAAI,CAAA,CAAE,eAAA,GAAkB,CAAA,CAAA,EAAI;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,uDAAA,EAAa,cAAc,CAAA,IAAA,CAAM,CAAA;AAAA,EACxD;AACA,EAAA,GAAA,CAAI,CAAA,CAAE,eAAA,EAAiB,CAAA,CAAA,EAAI;AACzB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,yEAAA,EAAgB,cAAc,CAAA,GAAA,CAAK,CAAA;AAAA,EAC1D;AACA,EAAA,GAAA,CAAI,CAAA,CAAE,gBAAA,EAAkB,CAAA,CAAA,EAAI;AAC1B,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,qFAAA,EAAkB,eAAe,CAAA,CAAA;AACxD,EAAA;AACiD,EAAA;AACW,IAAA;AAC5D,EAAA;AACiC,EAAA;AACjB,EAAA;AACkC,IAAA;AAClD,EAAA;AAE4B,EAAA;AAC4B,EAAA;AAC+B,EAAA;AACzF;AASiG;AACpE,EAAA;AAC+B,IAAA;AAC1D,EAAA;AACkB,EAAA;AAC4B,IAAA;AAC9C,EAAA;AACsB,EAAA;AAC+B,IAAA;AACrD,EAAA;AAC0D,EAAA;AAC5D;AAmCmF;AAC3C,EAAA;AAEhB,EAAA;AAC2B,IAAA;AACjD,EAAA;AAC4B,EAAA;AAC+B,IAAA;AAC3D,EAAA;AAE6B,EAAA;AAC4B,EAAA;AAChC,EAAA;AAElB,EAAA;AACU,IAAA;AACF,IAAA;AACb,IAAA;AACA,IAAA;AAC2B,IAAA;AACH,IAAA;AAC1B,EAAA;AACF;AFrCiI;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-FVESJBUD.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const windMeta: CalculatorMeta = {\n name: '风偏限界校验',\n nameEn: 'Wind Deflection Clearance Check',\n summary:\n '计算线索在风荷载作用下的跨中偏移 b,叠加拉出值后与限界允许值比较,给出合格/超限结论。',\n formula: [\n '单位风荷载:p = ½·ρ·v²·d·α·sin²θ(ρ = 1.225 kg/m³)',\n '跨中风偏(简支索抛物线近似):b = p·L² / (8·T)',\n '限界校验:b + a ≤ 限界允许值,满足判为合格',\n ],\n references: [\n '简支索抛物线近似,适用于 f/L ≤ 1/10 工况',\n '风载体型系数 α:圆柱形线索常取 1.2',\n '限界允许值按受电弓动态包络线取值',\n ],\n scope: [\n '风速 v:0 ~ 60 m/s',\n '风向与线路夹角 θ:0 ~ 180°,90° 为垂直于线路',\n '线索直径 d:1 ~ 30 mm',\n '线索张力 T:1 ~ 40 kN',\n '跨距 L:5 ~ 80 m',\n '风载体型系数 α:0.5 ~ 2.0',\n '拉出值 a:0 ~ 0.6 m',\n '限界允许值:0.1 ~ 2 m',\n '未计入线索风致振动、驰振与覆冰附加风载',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/wind/',\n};\n","export { windMeta } from './meta';\n\n/** 标准大气空气密度,kg/m³ */\nexport const AIR_DENSITY_KG_PER_M3 = 1.225;\n\n/** 风荷载计算的输入参数 */\nexport interface WindLoadInput {\n /** 风速 v,m/s */\n readonly windSpeedMPerS: number;\n /** 风向与线路夹角 θ,度。90° 表示风垂直于线路 */\n readonly windAngleDeg: number;\n /** 线索直径 d,mm */\n readonly wireDiameterMM: number;\n /** 风载体型系数 α(阻力系数),圆柱形线索常取 1.2 */\n readonly dragCoefficient: number;\n /** 空气密度 ρ,kg/m³。缺省为标准大气 1.225 */\n readonly airDensityKgPerM3?: number;\n}\n\n/**\n * 单位风荷载(Janssen 公式):p = ½·ρ·v²·d·α·sin²θ,N/m。\n * 线索直径按 mm → m 换算(×1e-3)。\n */\nexport function windLoadNPerM(params: WindLoadInput): number {\n const { windSpeedMPerS, windAngleDeg, wireDiameterMM, dragCoefficient, airDensityKgPerM3 } = params;\n\n if (!(windSpeedMPerS >= 0)) {\n throw new RangeError(`风速不能为负,收到 ${windSpeedMPerS} m/s`);\n }\n if (!(wireDiameterMM > 0)) {\n throw new RangeError(`线索直径必须为正数,收到 ${wireDiameterMM} mm`);\n }\n if (!(dragCoefficient > 0)) {\n throw new RangeError(`风载体型系数必须为正数,收到 ${dragCoefficient}`);\n }\n if (!(windAngleDeg >= 0 && windAngleDeg <= 180)) {\n throw new RangeError(`风向与线路夹角应为 0 ~ 180°,收到 ${windAngleDeg}°`);\n }\n const rho = airDensityKgPerM3 ?? AIR_DENSITY_KG_PER_M3;\n if (!(rho > 0)) {\n throw new RangeError(`空气密度必须为正数,收到 ${rho} kg/m³`);\n }\n\n const dM = wireDiameterMM * 1e-3;\n const sinTheta = Math.sin((windAngleDeg * Math.PI) / 180);\n return 0.5 * rho * windSpeedMPerS * windSpeedMPerS * dM * dragCoefficient * sinTheta * sinTheta;\n}\n\n/**\n * 跨中风偏(简支索抛物线近似):b = p·L² / (8·T),m。\n *\n * @param windLoadNPerM 单位风荷载 p,N/m\n * @param spanM 跨距 L,m\n * @param tensionKN 线索张力 T,kN(内部 ×1e3 化 N)\n */\nexport function windDeflectionM(windLoadNPerM: number, spanM: number, tensionKN: number): number {\n if (!(windLoadNPerM >= 0)) {\n throw new RangeError(`单位风荷载不能为负,收到 ${windLoadNPerM} N/m`);\n }\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(tensionKN > 0)) {\n throw new RangeError(`线索张力必须为正数,收到 ${tensionKN} kN`);\n }\n return (windLoadNPerM * spanM * spanM) / (8 * tensionKN * 1e3);\n}\n\n/** 风偏限界校验输入:风荷载参数 + 张力/跨距/拉出值/限界允许值 */\nexport interface WindClearanceInput extends WindLoadInput {\n /** 线索张力 T,kN */\n readonly tensionKN: number;\n /** 跨距 L,m */\n readonly spanM: number;\n /** 拉出值 a,m */\n readonly staggerM: number;\n /** 限界允许值,m */\n readonly clearanceLimitM: number;\n}\n\n/** 风偏限界校验结果 */\nexport interface WindClearanceResult {\n /** 单位风荷载 p,N/m */\n readonly windLoadNPerM: number;\n /** 跨中风偏 b,m */\n readonly deflectionM: number;\n /** 风偏 + 拉出值 b + a,m */\n readonly totalOffsetM: number;\n /** 限界允许值,m */\n readonly clearanceLimitM: number;\n /** 富余量 = 限界允许值 − (b + a),m。负值表示超限 */\n readonly marginM: number;\n /** 是否合格 */\n readonly passes: boolean;\n}\n\n/**\n * 风偏限界校验:计算跨中风偏 b,叠加拉出值 a,与限界允许值比较。\n *\n * 判据:b + a ≤ 限界允许值 → 合格。\n */\nexport function windClearanceCheck(input: WindClearanceInput): WindClearanceResult {\n const { staggerM, clearanceLimitM } = input;\n\n if (!(staggerM >= 0)) {\n throw new RangeError(`拉出值不能为负,收到 ${staggerM} m`);\n }\n if (!(clearanceLimitM > 0)) {\n throw new RangeError(`限界允许值必须为正数,收到 ${clearanceLimitM} m`);\n }\n\n const p = windLoadNPerM(input);\n const b = windDeflectionM(p, input.spanM, input.tensionKN);\n const totalOffsetM = b + staggerM;\n\n return {\n windLoadNPerM: p,\n deflectionM: b,\n totalOffsetM,\n clearanceLimitM,\n marginM: clearanceLimitM - totalOffsetM,\n passes: totalOffsetM <= clearanceLimitM,\n };\n}\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// src/icing/meta.ts
|
|
2
|
+
var icingMeta = {
|
|
3
|
+
name: "\u8986\u51B0\u8377\u8F7D\u6821\u6838",
|
|
4
|
+
nameEn: "Ice Load Check",
|
|
5
|
+
summary: "\u6309\u51B0\u7B52\u6A21\u578B\u8BA1\u7B97\u8986\u51B0\u8377\u8F7D\uFF0C\u7ED9\u51FA\u8986\u51B0\u540E\u7684\u603B\u5782\u76F4\u8377\u8F7D\u3001\u5F1B\u5EA6\u53CA\u76F8\u5BF9\u65E0\u51B0\u5DE5\u51B5\u7684\u589E\u5E45\u3002",
|
|
6
|
+
formula: [
|
|
7
|
+
"\u51B0\u7B52\u6A21\u578B\u51B0\u91CD\uFF1Ag_ice = \u03C1_ice \xB7 g\u2080 \xB7 \u03C0 \xB7 b \xB7 (d + b)",
|
|
8
|
+
"\u8986\u51B0\u540E\u603B\u5782\u76F4\u8377\u8F7D\uFF1Ag_total = g_self + g_ice",
|
|
9
|
+
"\u65E0\u51B0\u5F1B\u5EA6\uFF1Af\u2080 = g_self\xB7l\xB2 / (8T)",
|
|
10
|
+
"\u8986\u51B0\u5F1B\u5EA6\uFF1Af_ice = g_total\xB7l\xB2 / (8T)",
|
|
11
|
+
"\u5F1B\u5EA6\u589E\u5E45\uFF1A(f_ice / f\u2080 \u2212 1) \xD7 100%"
|
|
12
|
+
],
|
|
13
|
+
references: [
|
|
14
|
+
"\u4F9D\u636E\u672C\u7AD9 \u8986\u51B0\u8377\u8F7D / \u8377\u8F7D\u8BA1\u7B97 \u6761\u76EE",
|
|
15
|
+
"\u51B0\u5BC6\u5EA6\u9ED8\u8BA4 900 kg/m\xB3\uFF0C\u8F7B\u8986\u51B0\u5730\u533A\u53EF\u53D6\u66F4\u5C0F\u503C\uFF0C\u4EE5\u5F53\u5730\u6C14\u8C61\u8D44\u6599\u4E3A\u51C6",
|
|
16
|
+
"\u5747\u5300\u51B0\u7B52\u5047\u8BBE\uFF0C\u672A\u8003\u8651\u4E0D\u89C4\u5219\u8986\u51B0\u5F62\u6001"
|
|
17
|
+
],
|
|
18
|
+
scope: [
|
|
19
|
+
"\u7EBF\u7D22\u76F4\u5F84 d\uFF1A1 ~ 40 mm",
|
|
20
|
+
"\u8986\u51B0\u539A\u5EA6 b\uFF1A0 ~ 50 mm\uFF080 \u8868\u793A\u65E0\u51B0\uFF09",
|
|
21
|
+
"\u5F20\u529B T\uFF1A1 ~ 40 kN",
|
|
22
|
+
"\u8DE8\u8DDD l\uFF1A10 ~ 90 m",
|
|
23
|
+
"\u7EBF\u7D22\u81EA\u91CD g_self\uFF1A1 ~ 60 N/m",
|
|
24
|
+
"\u51B0\u5BC6\u5EA6 \u03C1_ice\uFF1A500 ~ 950 kg/m\xB3",
|
|
25
|
+
"\u5747\u5300\u51B0\u7B52\u6A21\u578B\uFF0C\u672A\u8003\u8651\u4E0D\u5747\u5300\u8986\u51B0\u3001\u8131\u51B0\u8DF3\u8DC3\u4E0E\u98CE\u51B0\u7EC4\u5408",
|
|
26
|
+
"\u5F1B\u5EA6\u6309\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u672A\u8003\u8651\u8986\u51B0\u540E\u5F20\u529B\u53D8\u5316\uFF08\u672A\u4E0E\u72B6\u6001\u65B9\u7A0B\u8026\u5408\uFF09"
|
|
27
|
+
],
|
|
28
|
+
disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
|
|
29
|
+
online: "https://www.itswe.com/calculator/icing/"
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// src/types.ts
|
|
33
|
+
var G0 = 9.81;
|
|
34
|
+
|
|
35
|
+
// src/common/ice.ts
|
|
36
|
+
var DEFAULT_ICE_DENSITY_KG_PER_M3 = 900;
|
|
37
|
+
function iceLoadNPerM(params) {
|
|
38
|
+
const { wireDiameterM, iceThicknessM } = params;
|
|
39
|
+
const rho = params.iceDensityKgPerM3 ?? DEFAULT_ICE_DENSITY_KG_PER_M3;
|
|
40
|
+
if (!(wireDiameterM > 0)) {
|
|
41
|
+
throw new RangeError(`\u7EBF\u7D22\u76F4\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${wireDiameterM} m`);
|
|
42
|
+
}
|
|
43
|
+
if (!(iceThicknessM >= 0)) {
|
|
44
|
+
throw new RangeError(`\u8986\u51B0\u539A\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${iceThicknessM} m`);
|
|
45
|
+
}
|
|
46
|
+
if (!(rho > 0)) {
|
|
47
|
+
throw new RangeError(`\u51B0\u5BC6\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${rho} kg/m\xB3`);
|
|
48
|
+
}
|
|
49
|
+
if (iceThicknessM === 0) return 0;
|
|
50
|
+
return rho * G0 * Math.PI * iceThicknessM * (wireDiameterM + iceThicknessM);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/icing/index.ts
|
|
54
|
+
function icingCheck(input) {
|
|
55
|
+
const { wireDiameterM, iceThicknessM, tensionN, spanM, selfWeightNPerM } = input;
|
|
56
|
+
if (!(tensionN > 0)) {
|
|
57
|
+
throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionN} N`);
|
|
58
|
+
}
|
|
59
|
+
if (!(spanM > 0)) {
|
|
60
|
+
throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
|
|
61
|
+
}
|
|
62
|
+
if (!(selfWeightNPerM > 0)) {
|
|
63
|
+
throw new RangeError(`\u7EBF\u7D22\u81EA\u91CD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${selfWeightNPerM} N/m`);
|
|
64
|
+
}
|
|
65
|
+
const iceParams = {
|
|
66
|
+
wireDiameterM,
|
|
67
|
+
iceThicknessM,
|
|
68
|
+
...input.iceDensityKgPerM3 === void 0 ? {} : { iceDensityKgPerM3: input.iceDensityKgPerM3 }
|
|
69
|
+
};
|
|
70
|
+
const gIce = iceLoadNPerM(iceParams);
|
|
71
|
+
const gTotal = selfWeightNPerM + gIce;
|
|
72
|
+
const fNoIce = selfWeightNPerM * spanM * spanM / (8 * tensionN);
|
|
73
|
+
const fIce = gTotal * spanM * spanM / (8 * tensionN);
|
|
74
|
+
return {
|
|
75
|
+
iceLoadNPerM: gIce,
|
|
76
|
+
totalLoadNPerM: gTotal,
|
|
77
|
+
sagNoIceM: fNoIce,
|
|
78
|
+
sagWithIceM: fIce,
|
|
79
|
+
growthPercent: (fIce / fNoIce - 1) * 100,
|
|
80
|
+
heavy: gIce > selfWeightNPerM
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export {
|
|
85
|
+
G0,
|
|
86
|
+
DEFAULT_ICE_DENSITY_KG_PER_M3,
|
|
87
|
+
iceLoadNPerM,
|
|
88
|
+
icingMeta,
|
|
89
|
+
icingCheck
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=chunk-GN6QNOUL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/icing/meta.ts","../src/types.ts","../src/common/ice.ts","../src/icing/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const icingMeta: CalculatorMeta = {\n name: '覆冰荷载校核',\n nameEn: 'Ice Load Check',\n summary:\n '按冰筒模型计算覆冰荷载,给出覆冰后的总垂直荷载、弛度及相对无冰工况的增幅。',\n formula: [\n '冰筒模型冰重:g_ice = ρ_ice · g₀ · π · b · (d + b)',\n '覆冰后总垂直荷载:g_total = g_self + g_ice',\n '无冰弛度:f₀ = g_self·l² / (8T)',\n '覆冰弛度:f_ice = g_total·l² / (8T)',\n '弛度增幅:(f_ice / f₀ − 1) × 100%',\n ],\n references: [\n '依据本站 覆冰荷载 / 荷载计算 条目',\n '冰密度默认 900 kg/m³,轻覆冰地区可取更小值,以当地气象资料为准',\n '均匀冰筒假设,未考虑不规则覆冰形态',\n ],\n scope: [\n '线索直径 d:1 ~ 40 mm',\n '覆冰厚度 b:0 ~ 50 mm(0 表示无冰)',\n '张力 T:1 ~ 40 kN',\n '跨距 l:10 ~ 90 m',\n '线索自重 g_self:1 ~ 60 N/m',\n '冰密度 ρ_ice:500 ~ 950 kg/m³',\n '均匀冰筒模型,未考虑不均匀覆冰、脱冰跳跃与风冰组合',\n '弛度按抛物线近似,未考虑覆冰后张力变化(未与状态方程耦合)',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/icing/',\n};\n","/**\n * 全库公共类型定义。\n *\n * 命名约定(重要):\n * 所有数值字段的单位都写在变量名末尾,例如 tensionKN / spanM / crossSectionMM2。\n * 工程计算里单位混淆是头号 bug 来源,宁可名字长,也不要靠注释记单位。\n */\n\n/**\n * 每个计算器模块必须导出的元信息。\n * 这是本库区别于\"玩具代码\"的核心 —— 公式、依据、适用范围、免责声明全部可机读。\n */\nexport interface CalculatorMeta {\n /** 计算器中文名 */\n readonly name: string;\n /** 计算器英文名,用于国际检索 */\n readonly nameEn: string;\n /** 一句话用途说明 */\n readonly summary: string;\n /** 核心公式,LaTeX 或纯文本,可多条 */\n readonly formula: readonly string[];\n /** 参考依据:标准号、设计手册、教材。注意标注该标准是否真正包含此公式 */\n readonly references: readonly string[];\n /** 适用范围与已知限制 */\n readonly scope: readonly string[];\n /** 免责声明 */\n readonly disclaimer: string;\n /** 在线版本地址 */\n readonly online: string;\n}\n\n/** 重力加速度,N/kg(m/s²) */\nexport const G0 = 9.81;\n","/**\n * 覆冰冰筒模型 —— tension 与 icing 共用。\n *\n * 统一使用 SI 单位(米),与站点 calc-core.js 的 icingCheck 内部口径一致。\n * 页面侧若以 mm 采集,调用前需自行 /1000。\n */\n\nimport { G0 } from '../types';\n\n/** 冰密度常用值,kg/m³ */\nexport const DEFAULT_ICE_DENSITY_KG_PER_M3 = 900;\n\nexport interface IceLoadParams {\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 覆冰厚度 b,m。传 0 表示无冰 */\n readonly iceThicknessM: number;\n /** 冰密度 ρ_ice,kg/m³。缺省 900 */\n readonly iceDensityKgPerM3?: number;\n}\n\n/**\n * 冰筒模型单位长度冰重:g_ice = ρ_ice·g₀·π·b·(d + b),N/m。\n *\n * 传 iceThicknessM = 0 时返回 0。\n */\nexport function iceLoadNPerM(params: IceLoadParams): number {\n const { wireDiameterM, iceThicknessM } = params;\n const rho = params.iceDensityKgPerM3 ?? DEFAULT_ICE_DENSITY_KG_PER_M3;\n\n if (!(wireDiameterM > 0)) {\n throw new RangeError(`线索直径必须为正数,收到 ${wireDiameterM} m`);\n }\n if (!(iceThicknessM >= 0)) {\n throw new RangeError(`覆冰厚度不能为负,收到 ${iceThicknessM} m`);\n }\n if (!(rho > 0)) {\n throw new RangeError(`冰密度必须为正数,收到 ${rho} kg/m³`);\n }\n if (iceThicknessM === 0) return 0;\n\n return rho * G0 * Math.PI * iceThicknessM * (wireDiameterM + iceThicknessM);\n}\n","export { icingMeta } from './meta';\n\n// 冰筒模型与 tension 模块共用 src/common/ice.ts,由根 index 统一导出\nimport { iceLoadNPerM, type IceLoadParams } from '../common/ice';\n\nexport interface IcingCheckInput {\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 覆冰厚度 b,m。传 0 表示无冰 */\n readonly iceThicknessM: number;\n /** 线索张力 T,N */\n readonly tensionN: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 线索自重 g_self,N/m */\n readonly selfWeightNPerM: number;\n /** 冰密度 ρ_ice,kg/m³。缺省 900 */\n readonly iceDensityKgPerM3?: number;\n}\n\nexport interface IcingCheckResult {\n /** 单位长度冰重 g_ice,N/m */\n readonly iceLoadNPerM: number;\n /** 覆冰后总垂直荷载 g_total,N/m */\n readonly totalLoadNPerM: number;\n /** 无冰弛度 f₀,m */\n readonly sagNoIceM: number;\n /** 覆冰弛度 f_ice,m */\n readonly sagWithIceM: number;\n /** 弛度增幅,% */\n readonly growthPercent: number;\n /** 冰重是否超过线索自重(重覆冰判据) */\n readonly heavy: boolean;\n}\n\n/**\n * 覆冰综合校核。\n *\n * 给出覆冰后的总垂直荷载、弛度及增幅;冰重超过线索自重时 `heavy` 为真。\n *\n * ⚠️ 弛度按抛物线近似,且**未与张力-温度状态方程耦合** —— 覆冰引起的\n * 张力变化未计入,大覆冰工况偏于乐观。\n */\nexport function icingCheck(input: IcingCheckInput): IcingCheckResult {\n const { wireDiameterM, iceThicknessM, tensionN, spanM, selfWeightNPerM } = input;\n\n if (!(tensionN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionN} N`);\n }\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(selfWeightNPerM > 0)) {\n throw new RangeError(`线索自重必须为正数,收到 ${selfWeightNPerM} N/m`);\n }\n\n const iceParams: IceLoadParams = {\n wireDiameterM,\n iceThicknessM,\n ...(input.iceDensityKgPerM3 === undefined\n ? {}\n : { iceDensityKgPerM3: input.iceDensityKgPerM3 }),\n };\n const gIce = iceLoadNPerM(iceParams);\n const gTotal = selfWeightNPerM + gIce;\n\n const fNoIce = (selfWeightNPerM * spanM * spanM) / (8 * tensionN);\n const fIce = (gTotal * spanM * spanM) / (8 * tensionN);\n\n return {\n iceLoadNPerM: gIce,\n totalLoadNPerM: gTotal,\n sagNoIceM: fNoIce,\n sagWithIceM: fIce,\n growthPercent: (fIce / fNoIce - 1) * 100,\n heavy: gIce > selfWeightNPerM,\n };\n}\n"],"mappings":";AAEO,IAAM,YAA4B;AAAA,EACvC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV;;;ACCO,IAAM,KAAK;;;ACtBX,IAAM,gCAAgC;AAgBtC,SAAS,aAAa,QAA+B;AAC1D,QAAM,EAAE,eAAe,cAAc,IAAI;AACzC,QAAM,MAAM,OAAO,qBAAqB;AAExC,MAAI,EAAE,gBAAgB,IAAI;AACxB,UAAM,IAAI,WAAW,4EAAgB,aAAa,IAAI;AAAA,EACxD;AACA,MAAI,EAAE,iBAAiB,IAAI;AACzB,UAAM,IAAI,WAAW,sEAAe,aAAa,IAAI;AAAA,EACvD;AACA,MAAI,EAAE,MAAM,IAAI;AACd,UAAM,IAAI,WAAW,sEAAe,GAAG,WAAQ;AAAA,EACjD;AACA,MAAI,kBAAkB,EAAG,QAAO;AAEhC,SAAO,MAAM,KAAK,KAAK,KAAK,iBAAiB,gBAAgB;AAC/D;;;ACCO,SAAS,WAAW,OAA0C;AACnE,QAAM,EAAE,eAAe,eAAe,UAAU,OAAO,gBAAgB,IAAI;AAE3E,MAAI,EAAE,WAAW,IAAI;AACnB,UAAM,IAAI,WAAW,gEAAc,QAAQ,IAAI;AAAA,EACjD;AACA,MAAI,EAAE,QAAQ,IAAI;AAChB,UAAM,IAAI,WAAW,gEAAc,KAAK,IAAI;AAAA,EAC9C;AACA,MAAI,EAAE,kBAAkB,IAAI;AAC1B,UAAM,IAAI,WAAW,4EAAgB,eAAe,MAAM;AAAA,EAC5D;AAEA,QAAM,YAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,GAAI,MAAM,sBAAsB,SAC5B,CAAC,IACD,EAAE,mBAAmB,MAAM,kBAAkB;AAAA,EACnD;AACA,QAAM,OAAO,aAAa,SAAS;AACnC,QAAM,SAAS,kBAAkB;AAEjC,QAAM,SAAU,kBAAkB,QAAQ,SAAU,IAAI;AACxD,QAAM,OAAQ,SAAS,QAAQ,SAAU,IAAI;AAE7C,SAAO;AAAA,IACL,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBAAgB,OAAO,SAAS,KAAK;AAAA,IACrC,OAAO,OAAO;AAAA,EAChB;AACF;","names":[]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// src/curve-stagger/meta.ts
|
|
2
|
+
var curveStaggerMeta = {
|
|
3
|
+
name: "\u66F2\u7EBF\u62C9\u51FA\u503C\u6821\u6838",
|
|
4
|
+
nameEn: "Curve Stagger Clearance Check",
|
|
5
|
+
summary: "\u8BA1\u7B97\u66F2\u7EBF\u533A\u6BB5\u8DE8\u4E2D\u7EFC\u5408\u504F\u79FB\uFF08\u62C9\u51FA\u503C\u5747\u503C\u3001\u66F2\u7EBF\u77E2\u5EA6\u3001\u98CE\u504F\u7684\u7EC4\u5408\uFF09\uFF0C\u4E0E\u53D7\u7535\u5F13\u5BB9\u8BB8\u504F\u79FB\u6BD4\u8F83\u7ED9\u51FA\u5224\u5B9A\u3002",
|
|
6
|
+
formula: [
|
|
7
|
+
"\u5E73\u5747\u62C9\u51FA\u503C\uFF1A\u0101 = (a\u2081 + a\u2082) / 2",
|
|
8
|
+
"\u66F2\u7EBF\u77E2\u5EA6\uFF1Ac = l\xB2 / (8R)\uFF08\u76F4\u7EBF\u6BB5 R = \u221E \u65F6 c = 0\uFF09",
|
|
9
|
+
"\u8D85\u9AD8\u6A2A\u79FB\uFF1A\u03B4 = H\xB7h / l\u2080",
|
|
10
|
+
"\u8DE8\u4E2D\u98CE\u504F\uFF1Ap_w = (\xBD\xB7\u03C1\xB7v\xB2\xB7d\xB7\u03B1) \xB7 l\xB2 / (8T)\uFF08\u53D6\u98CE\u5411\u5782\u76F4\u7EBF\u8DEF\u7684\u6700\u4E0D\u5229\u5DE5\u51B5\uFF09",
|
|
11
|
+
"\u7EFC\u5408\u504F\u79FB\uFF1Ae = max(|\u0101 + c|, |\u0101 \u2212 c|) + p_w \u2264 [e]"
|
|
12
|
+
],
|
|
13
|
+
references: [
|
|
14
|
+
"\u4F9D\u636E\u672C\u7AD9 \u62C9\u51FA\u503C\u8BBE\u8BA1 \u6761\u76EE",
|
|
15
|
+
"\u98CE\u504F\u53D6\u98CE\u5411\u5782\u76F4\u7EBF\u8DEF\u7684\u6700\u4E0D\u5229\u5DE5\u51B5\uFF08sin\xB2\u03B8 = 1\uFF09",
|
|
16
|
+
"\u5BB9\u8BB8\u504F\u79FB [e] \u6309\u53D7\u7535\u5F13\u52A8\u6001\u5305\u7EDC\u7EBF\u53D6\u503C\uFF0C\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6"
|
|
17
|
+
],
|
|
18
|
+
scope: [
|
|
19
|
+
"\u66F2\u7EBF\u534A\u5F84 R\uFF1A0 ~ 20000 m\uFF08\u76F4\u7EBF\u4F20 0 \u6216 Infinity\uFF09",
|
|
20
|
+
"\u8DE8\u8DDD l\uFF1A20 ~ 80 m",
|
|
21
|
+
"\u62C9\u51FA\u503C a\u2081/a\u2082\uFF1A\u22120.6 ~ 0.6 m\uFF08\u66F2\u7EBF\u5185\u4FA7\u4E3A\u6B63\uFF09",
|
|
22
|
+
"\u98CE\u901F v\uFF1A0 ~ 60 m/s",
|
|
23
|
+
"\u7EBF\u7D22\u76F4\u5F84 d\uFF1A1 ~ 30 mm",
|
|
24
|
+
"\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570 \u03B1\uFF1A0.5 ~ 2",
|
|
25
|
+
"\u5F20\u529B T\uFF1A5 ~ 40 kN",
|
|
26
|
+
"\u6ED1\u677F\u9762\u8DDD\u8F68\u9762 H\uFF1A4 ~ 8 m\uFF1B\u5916\u8F68\u8D85\u9AD8 h\uFF1A0 ~ 0.25 m\uFF1B\u8F68\u8DDD l\u2080 \u9ED8\u8BA4 1.435 m",
|
|
27
|
+
"\u26A0\uFE0F \u7AD9\u70B9\u6E90\u7801\u7684 JSDoc \u5199\u660E\u7EFC\u5408\u504F\u79FB\u542B\u8D85\u9AD8\u6A2A\u79FB\u9879 \u2213\u03B4\uFF0C\u4F46\u5B9E\u73B0\u4E2D \u03B4 \u4EC5\u8BA1\u7B97\u8FD4\u56DE\u3001\u672A\u53C2\u4E0E e \u7684\u5408\u6210\u3002\u672C\u5E93\u6309\u5B9E\u73B0\u884C\u4E3A\u5BF9\u9F50\uFF0C\u8BE6\u89C1\u6D4B\u8BD5\u4E2D\u7684\u8BF4\u660E"
|
|
28
|
+
],
|
|
29
|
+
disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
|
|
30
|
+
online: "https://www.itswe.com/calculator/curve-stagger/"
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// src/curve-stagger/index.ts
|
|
34
|
+
var STANDARD_GAUGE_M = 1.435;
|
|
35
|
+
var DEFAULT_PANTOGRAPH_HEIGHT_M = 6;
|
|
36
|
+
function versineM(spanM, curveRadiusM) {
|
|
37
|
+
if (!(spanM > 0)) {
|
|
38
|
+
throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
|
|
39
|
+
}
|
|
40
|
+
if (!(curveRadiusM > 0) || !Number.isFinite(curveRadiusM)) {
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
return spanM * spanM / (8 * curveRadiusM);
|
|
44
|
+
}
|
|
45
|
+
function cantShiftM(cantM, pantographHeightM = DEFAULT_PANTOGRAPH_HEIGHT_M, gaugeM = STANDARD_GAUGE_M) {
|
|
46
|
+
if (!(cantM >= 0)) {
|
|
47
|
+
throw new RangeError(`\u5916\u8F68\u8D85\u9AD8\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${cantM} m`);
|
|
48
|
+
}
|
|
49
|
+
if (!(pantographHeightM > 0)) {
|
|
50
|
+
throw new RangeError(`\u6ED1\u677F\u9762\u8DDD\u8F68\u9762\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${pantographHeightM} m`);
|
|
51
|
+
}
|
|
52
|
+
if (!(gaugeM > 0)) {
|
|
53
|
+
throw new RangeError(`\u8F68\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${gaugeM} m`);
|
|
54
|
+
}
|
|
55
|
+
return pantographHeightM * cantM / gaugeM;
|
|
56
|
+
}
|
|
57
|
+
function curveStaggerCheck(input) {
|
|
58
|
+
const { spanM, stagger1M, stagger2M, wireDiameterM, dragCoefficient, tensionN } = input;
|
|
59
|
+
if (!(tensionN > 0)) {
|
|
60
|
+
throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionN} N`);
|
|
61
|
+
}
|
|
62
|
+
if (!(wireDiameterM > 0)) {
|
|
63
|
+
throw new RangeError(`\u7EBF\u7D22\u76F4\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${wireDiameterM} m`);
|
|
64
|
+
}
|
|
65
|
+
if (!(dragCoefficient > 0)) {
|
|
66
|
+
throw new RangeError(`\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${dragCoefficient}`);
|
|
67
|
+
}
|
|
68
|
+
if (!(input.windSpeedMPerS >= 0)) {
|
|
69
|
+
throw new RangeError(`\u98CE\u901F\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${input.windSpeedMPerS} m/s`);
|
|
70
|
+
}
|
|
71
|
+
if (!(input.allowableOffsetM > 0)) {
|
|
72
|
+
throw new RangeError(`\u5BB9\u8BB8\u504F\u79FB\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.allowableOffsetM} m`);
|
|
73
|
+
}
|
|
74
|
+
const meanStaggerM = (stagger1M + stagger2M) / 2;
|
|
75
|
+
const c = versineM(spanM, input.curveRadiusM);
|
|
76
|
+
const delta = cantShiftM(
|
|
77
|
+
input.cantM ?? 0,
|
|
78
|
+
input.pantographHeightM ?? DEFAULT_PANTOGRAPH_HEIGHT_M,
|
|
79
|
+
input.gaugeM ?? STANDARD_GAUGE_M
|
|
80
|
+
);
|
|
81
|
+
const rhoAir = 1.225;
|
|
82
|
+
const windLoadNPerM = 0.5 * rhoAir * input.windSpeedMPerS * input.windSpeedMPerS * wireDiameterM * dragCoefficient;
|
|
83
|
+
const pw = windLoadNPerM * spanM * spanM / (8 * tensionN);
|
|
84
|
+
const offsetPlusM = Math.abs(meanStaggerM + c) + pw;
|
|
85
|
+
const offsetMinusM = Math.abs(meanStaggerM - c) + pw;
|
|
86
|
+
const maxOffsetM = Math.max(offsetPlusM, offsetMinusM);
|
|
87
|
+
return {
|
|
88
|
+
meanStaggerM,
|
|
89
|
+
versineM: c,
|
|
90
|
+
cantShiftM: delta,
|
|
91
|
+
windOffsetM: pw,
|
|
92
|
+
offsetPlusM,
|
|
93
|
+
offsetMinusM,
|
|
94
|
+
maxOffsetM,
|
|
95
|
+
passes: maxOffsetM <= input.allowableOffsetM
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export {
|
|
100
|
+
curveStaggerMeta,
|
|
101
|
+
STANDARD_GAUGE_M,
|
|
102
|
+
DEFAULT_PANTOGRAPH_HEIGHT_M,
|
|
103
|
+
versineM,
|
|
104
|
+
cantShiftM,
|
|
105
|
+
curveStaggerCheck
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=chunk-IFVYGNT3.js.map
|