ocs-calculators 0.1.0 → 0.1.2
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 +45 -4
- package/README.md +47 -5
- package/README_EN.md +11 -5
- 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-CVA4EH2K.js +102 -0
- package/dist/chunk-CVA4EH2K.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-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-MZBQ4546.cjs +102 -0
- package/dist/chunk-MZBQ4546.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 +162 -1220
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +47 -775
- package/dist/index.d.ts +47 -775
- package/dist/index.js +108 -1063
- 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-4UU7WA7N.cjs","../src/curve-stagger/meta.ts","../src/curve-stagger/index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-4UU7WA7N.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const curveStaggerMeta: CalculatorMeta = {\n name: '曲线拉出值校核',\n nameEn: 'Curve Stagger Clearance Check',\n summary:\n '计算曲线区段跨中综合偏移(拉出值均值、曲线矢度、风偏的组合),与受电弓容许偏移比较给出判定。',\n formula: [\n '平均拉出值:ā = (a₁ + a₂) / 2',\n '曲线矢度:c = l² / (8R)(直线段 R = ∞ 时 c = 0)',\n '超高横移:δ = H·h / l₀',\n '跨中风偏:p_w = (½·ρ·v²·d·α) · l² / (8T)(取风向垂直线路的最不利工况)',\n '综合偏移:e = max(|ā + c|, |ā − c|) + p_w ≤ [e]',\n ],\n references: [\n '依据本站 拉出值设计 条目',\n '风偏取风向垂直线路的最不利工况(sin²θ = 1)',\n '容许偏移 [e] 按受电弓动态包络线取值,以设计文件为准',\n ],\n scope: [\n '曲线半径 R:0 ~ 20000 m(直线传 0 或 Infinity)',\n '跨距 l:20 ~ 80 m',\n '拉出值 a₁/a₂:−0.6 ~ 0.6 m(曲线内侧为正)',\n '风速 v:0 ~ 60 m/s',\n '线索直径 d:1 ~ 30 mm',\n '风载体型系数 α:0.5 ~ 2',\n '张力 T:5 ~ 40 kN',\n '滑板面距轨面 H:4 ~ 8 m;外轨超高 h:0 ~ 0.25 m;轨距 l₀ 默认 1.435 m',\n '⚠️ 站点源码的 JSDoc 写明综合偏移含超高横移项 ∓δ,但实现中 δ 仅计算返回、未参与 e 的合成。本库按实现行为对齐,详见测试中的说明',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/curve-stagger/',\n};\n","export { curveStaggerMeta } from './meta';\n\n/** 标准轨距,m */\nexport const STANDARD_GAUGE_M = 1.435;\n\n/** 滑板面距轨面的常用值,m */\nexport const DEFAULT_PANTOGRAPH_HEIGHT_M = 6.0;\n\nexport interface CurveStaggerInput {\n /** 曲线半径 R,m。直线段传 0 或 Infinity */\n readonly curveRadiusM: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 定位点 1 拉出值 a₁,m(曲线内侧为正) */\n readonly stagger1M: number;\n /** 定位点 2 拉出值 a₂,m(曲线内侧为正) */\n readonly stagger2M: number;\n /** 风速 v,m/s */\n readonly windSpeedMPerS: number;\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 风载体型系数 α */\n readonly dragCoefficient: number;\n /** 线索张力 T,N */\n readonly tensionN: number;\n /** 容许偏移 [e],m */\n readonly allowableOffsetM: number;\n /** 滑板面距轨面 H,m。缺省 6.0 */\n readonly pantographHeightM?: number;\n /** 外轨超高 h,m。缺省 0 */\n readonly cantM?: number;\n /** 轨距 l₀,m。缺省 1.435 */\n readonly gaugeM?: number;\n}\n\nexport interface CurveStaggerResult {\n /** 平均拉出值 ā,m */\n readonly meanStaggerM: number;\n /** 曲线矢度 c = l²/(8R),m。直线段为 0 */\n readonly versineM: number;\n /** 超高横移 δ = H·h/l₀,m */\n readonly cantShiftM: number;\n /** 跨中风偏 p_w,m */\n readonly windOffsetM: number;\n /** 矢度与拉出值同向时的偏移,m */\n readonly offsetPlusM: number;\n /** 矢度与拉出值反向时的偏移,m */\n readonly offsetMinusM: number;\n /** 取两者较大值,m */\n readonly maxOffsetM: number;\n /** 是否满足容许偏移 */\n readonly passes: boolean;\n}\n\n/**\n * 曲线矢度:c = l² / (8R),m。\n * 直线段(R = 0 或 Infinity)返回 0。\n */\nexport function versineM(spanM: number, curveRadiusM: number): number {\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(curveRadiusM > 0) || !Number.isFinite(curveRadiusM)) {\n return 0;\n }\n return (spanM * spanM) / (8 * curveRadiusM);\n}\n\n/**\n * 超高横移:δ = H·h / l₀,m。\n *\n * @param cantM 外轨超高 h,m\n * @param pantographHeightM 滑板面距轨面 H,m\n * @param gaugeM 轨距 l₀,m\n */\nexport function cantShiftM(\n cantM: number,\n pantographHeightM: number = DEFAULT_PANTOGRAPH_HEIGHT_M,\n gaugeM: number = STANDARD_GAUGE_M,\n): number {\n if (!(cantM >= 0)) {\n throw new RangeError(`外轨超高不能为负,收到 ${cantM} m`);\n }\n if (!(pantographHeightM > 0)) {\n throw new RangeError(`滑板面距轨面必须为正数,收到 ${pantographHeightM} m`);\n }\n if (!(gaugeM > 0)) {\n throw new RangeError(`轨距必须为正数,收到 ${gaugeM} m`);\n }\n return (pantographHeightM * cantM) / gaugeM;\n}\n\n/**\n * 曲线区段跨中综合偏移校核。\n *\n * 风偏取风向垂直线路的最不利工况(sin²θ = 1)。\n *\n * ⚠️ 与站点源码一致:超高横移 δ 会计算并返回,但**不参与** e 的合成。\n * 站点 JSDoc 描述的公式为 `e = |ā ± c ∓ δ| + p_w`,与其实现不符;\n * 若站点后续修正,本库的 offsetPlusM / offsetMinusM 需同步调整。\n */\nexport function curveStaggerCheck(input: CurveStaggerInput): CurveStaggerResult {\n const { spanM, stagger1M, stagger2M, wireDiameterM, dragCoefficient, tensionN } = input;\n\n if (!(tensionN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionN} N`);\n }\n if (!(wireDiameterM > 0)) {\n throw new RangeError(`线索直径必须为正数,收到 ${wireDiameterM} m`);\n }\n if (!(dragCoefficient > 0)) {\n throw new RangeError(`风载体型系数必须为正数,收到 ${dragCoefficient}`);\n }\n if (!(input.windSpeedMPerS >= 0)) {\n throw new RangeError(`风速不能为负,收到 ${input.windSpeedMPerS} m/s`);\n }\n if (!(input.allowableOffsetM > 0)) {\n throw new RangeError(`容许偏移必须为正数,收到 ${input.allowableOffsetM} m`);\n }\n\n const meanStaggerM = (stagger1M + stagger2M) / 2;\n const c = versineM(spanM, input.curveRadiusM);\n const delta = cantShiftM(\n input.cantM ?? 0,\n input.pantographHeightM ?? DEFAULT_PANTOGRAPH_HEIGHT_M,\n input.gaugeM ?? STANDARD_GAUGE_M,\n );\n\n // 单位风荷载 p = ½·ρ·v²·d·α·sin²θ,取 sin²θ = 1(风向垂直线路最不利)\n const rhoAir = 1.225;\n const windLoadNPerM =\n 0.5 * rhoAir * input.windSpeedMPerS * input.windSpeedMPerS * wireDiameterM * dragCoefficient;\n const pw = (windLoadNPerM * spanM * spanM) / (8 * tensionN);\n\n const offsetPlusM = Math.abs(meanStaggerM + c) + pw;\n const offsetMinusM = Math.abs(meanStaggerM - c) + pw;\n const maxOffsetM = Math.max(offsetPlusM, offsetMinusM);\n\n return {\n meanStaggerM,\n versineM: c,\n cantShiftM: delta,\n windOffsetM: pw,\n offsetPlusM,\n offsetMinusM,\n maxOffsetM,\n passes: maxOffsetM <= input.allowableOffsetM,\n };\n}\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/wear/meta.ts
|
|
2
|
+
var wearMeta = {
|
|
3
|
+
name: "\u63A5\u89E6\u7EBF\u78E8\u8017\u7387",
|
|
4
|
+
nameEn: "Contact Wire Wear Ratio",
|
|
5
|
+
summary: "\u6839\u636E\u539F\u622A\u9762\u79EF\u4E0E\u5B9E\u6D4B\u6B8B\u5B58\u622A\u9762\u8BA1\u7B97\u78E8\u8017\u7387 \u03B7\uFF0C\u03B7 > 20% \u65F6\u5EFA\u8BAE\u66F4\u6362\u63A5\u89E6\u7EBF\u3002",
|
|
6
|
+
formula: [
|
|
7
|
+
"\u78E8\u8017\u7387\uFF1A\u03B7 = (A\u2080 \u2212 A) / A\u2080 \xD7 100%",
|
|
8
|
+
"\u5224\u5B9A\u51C6\u5219\uFF1A\u03B7 > 20% \u5EFA\u8BAE\u66F4\u6362\u63A5\u89E6\u7EBF",
|
|
9
|
+
"\u6B8B\u5F84\u6362\u7B97\uFF08\u8FD1\u4F3C\uFF09\uFF1AA = \u03C0\xB7d\xB2 / 4"
|
|
10
|
+
],
|
|
11
|
+
references: [
|
|
12
|
+
"\u539F\u622A\u9762\u79EF\u6765\u6E90 TB/T 2809-2017\u300A\u7535\u6C14\u5316\u94C1\u8DEF\u7528\u94DC\u53CA\u94DC\u5408\u91D1\u63A5\u89E6\u7EBF\u300B",
|
|
13
|
+
"\u6807\u79F0\u622A\u9762 120/150 mm\xB2 \u4E3A\u540D\u4E49\u503C\uFF0C\u6807\u51C6\u53E6\u5217\u8BA1\u7B97\u622A\u9762 121/151 mm\xB2\uFF0C\u5B9E\u9645\u622A\u9762\u7531 TB/T 2809-2017 \u88682 \u5916\u5F62\u5C3A\u5BF8\u516C\u5DEE\u5E26\u63A7\u5236",
|
|
14
|
+
"\u78E8\u8017\u66F4\u6362\u9608\u503C\u8BF7\u4EE5\u6700\u65B0\u7248\u8FD0\u7EF4\u89C4\u7A0B\u4E3A\u51C6"
|
|
15
|
+
],
|
|
16
|
+
scope: [
|
|
17
|
+
"\u6B8B\u5F84\u6362\u7B97\u6309\u5706\u622A\u9762\u8FD1\u4F3C\uFF0C\u63A5\u89E6\u7EBF\u5B9E\u9645\u4E3A\u68AF\u5F62\u622A\u9762\uFF0C\u6362\u7B97\u503C\u5B58\u5728\u7CFB\u7EDF\u6027\u504F\u5DEE",
|
|
18
|
+
"\u672A\u8003\u8651\u78E8\u8017\u6CBF\u8DE8\u8DDD\u65B9\u5411\u7684\u4E0D\u5747\u5300\u5206\u5E03",
|
|
19
|
+
"\u5B9E\u9645\u4EA7\u54C1\u622A\u9762\u4EE5\u51FA\u5382\u68C0\u9A8C\u5355\u4E3A\u51C6"
|
|
20
|
+
],
|
|
21
|
+
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",
|
|
22
|
+
online: "https://www.itswe.com/calculator/wear/"
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/wear/index.ts
|
|
26
|
+
var DEFAULT_REPLACEMENT_THRESHOLD_PERCENT = 20;
|
|
27
|
+
function sectionFromDiameterMM2(diameterMM) {
|
|
28
|
+
if (!(diameterMM > 0)) {
|
|
29
|
+
throw new RangeError(`\u6B8B\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${diameterMM} mm`);
|
|
30
|
+
}
|
|
31
|
+
return Math.PI * diameterMM * diameterMM / 4;
|
|
32
|
+
}
|
|
33
|
+
function wearRatio(input) {
|
|
34
|
+
const { originalSectionMM2: a0 } = input;
|
|
35
|
+
if (!(a0 > 0)) {
|
|
36
|
+
throw new RangeError(`\u539F\u622A\u9762\u79EF\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${a0} mm\xB2`);
|
|
37
|
+
}
|
|
38
|
+
const residualSectionMM2 = input.mode === "area" ? input.residualSectionMM2 : sectionFromDiameterMM2(input.residualDiameterMM);
|
|
39
|
+
if (!(residualSectionMM2 > 0)) {
|
|
40
|
+
throw new RangeError(`\u6B8B\u622A\u9762\u79EF\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${residualSectionMM2} mm\xB2`);
|
|
41
|
+
}
|
|
42
|
+
if (residualSectionMM2 > a0) {
|
|
43
|
+
throw new RangeError(
|
|
44
|
+
`\u6B8B\u622A\u9762\u79EF ${residualSectionMM2.toFixed(2)} mm\xB2 \u4E0D\u80FD\u5927\u4E8E\u539F\u622A\u9762\u79EF ${a0} mm\xB2`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
const thresholdPercent = _nullishCoalesce(input.replacementThresholdPercent, () => ( DEFAULT_REPLACEMENT_THRESHOLD_PERCENT));
|
|
48
|
+
if (!(thresholdPercent > 0)) {
|
|
49
|
+
throw new RangeError(`\u66F4\u6362\u9608\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${thresholdPercent}%`);
|
|
50
|
+
}
|
|
51
|
+
const sectionLossMM2 = a0 - residualSectionMM2;
|
|
52
|
+
const wearPercent = sectionLossMM2 / a0 * 100;
|
|
53
|
+
return {
|
|
54
|
+
originalSectionMM2: a0,
|
|
55
|
+
residualSectionMM2,
|
|
56
|
+
sectionLossMM2,
|
|
57
|
+
wearPercent,
|
|
58
|
+
thresholdPercent,
|
|
59
|
+
verdict: wearPercent > thresholdPercent ? "replace" : "keep"
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
exports.wearMeta = wearMeta; exports.DEFAULT_REPLACEMENT_THRESHOLD_PERCENT = DEFAULT_REPLACEMENT_THRESHOLD_PERCENT; exports.sectionFromDiameterMM2 = sectionFromDiameterMM2; exports.wearRatio = wearRatio;
|
|
69
|
+
//# sourceMappingURL=chunk-5INEDXRY.cjs.map
|
|
@@ -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":"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","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,102 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resistanceAtTempOhmPerKm
|
|
3
|
+
} from "./chunk-YHDO6XVM.js";
|
|
4
|
+
|
|
5
|
+
// src/copper/meta.ts
|
|
6
|
+
var copperMeta = {
|
|
7
|
+
name: "\u63A5\u89E6\u7EBF\u53C2\u6570\u901F\u67E5",
|
|
8
|
+
nameEn: "Contact Wire Parameter Lookup",
|
|
9
|
+
summary: "\u5185\u7F6E CTHM / CTHA / CTHS \u7CFB\u5217 120/150 mm\xB2 \u63A5\u89E6\u7EBF\u53C2\u6570\u8868\uFF0C\u6309\u957F\u5EA6\u4E0E\u73AF\u5883\u6E29\u5EA6\u7ED9\u51FA\u603B\u91CD\u91CF\u4E0E\u6E29\u5EA6\u4FEE\u6B63\u7535\u963B\u3002",
|
|
10
|
+
formula: [
|
|
11
|
+
"\u7535\u963B\u6E29\u5EA6\u4FEE\u6B63\uFF08\u03B1 = 0.00393 /\u2103\uFF09\uFF1Ar_T = r\u2082\u2080\xB7[1 + \u03B1\xB7(T \u2212 20)]",
|
|
12
|
+
"\u603B\u91CD\u91CF\uFF1AW = w\u2080 \xD7 l\uFF08w\u2080 \u5355\u4F4D\u91CD\u91CF kg/km\uFF0Cl \u957F\u5EA6 km\uFF09"
|
|
13
|
+
],
|
|
14
|
+
references: [
|
|
15
|
+
"\u5185\u7F6E\u53C2\u6570\u8868\u6765\u6E90 TB/T 2809-2017\u300A\u7535\u6C14\u5316\u94C1\u8DEF\u7528\u94DC\u53CA\u94DC\u5408\u91D1\u63A5\u89E6\u7EBF\u300B\uFF082018-05-01 \u5B9E\u65BD\uFF09",
|
|
16
|
+
"\u5355\u4F4D\u91CD\u91CF\u4E3A\u6807\u79F0\u503C",
|
|
17
|
+
"\u8F7D\u6D41\u91CF\u4E3A 150\u2103 \u6301\u7EED\u503C\uFF0C\u5BA4\u5185/\u5BA4\u5916\u53CC\u53E3\u5F84\u6309\u6807\u51C6\u88685",
|
|
18
|
+
"r\u2082\u2080 \u9664 CTHM-120 \u53D6\u7ED9\u5B9A\u503C\u5916\uFF0C\u5747\u6309\u5BFC\u7535\u7387\u53CD\u7B97\u4F30\u7B97\uFF08IACS \u6807\u51C6\u7535\u963B\u7387 0.017241 \u03A9\xB7mm\xB2/m \xF7 \u5BFC\u7535\u7387 \xF7 \u622A\u9762\u79EF\uFF1B0.017241 = 1/58\uFF09",
|
|
19
|
+
"\u6B63\u5F0F\u5DE5\u7A0B\u4EE5\u4EA7\u54C1\u6807\u51C6\u4E0E\u51FA\u5382\u68C0\u9A8C\u5355\u4E3A\u51C6"
|
|
20
|
+
],
|
|
21
|
+
scope: [
|
|
22
|
+
"\u6E29\u5EA6\u4FEE\u6B63\u4EC5\u8986\u76D6\u7535\u963B\uFF0C\u672A\u4FEE\u6B63\u5355\u4F4D\u91CD\u91CF\u4E0E\u8F7D\u6D41\u91CF",
|
|
23
|
+
"\u9002\u7528\u6E29\u5EA6 \u221240 ~ 90 \u2103",
|
|
24
|
+
"\u8F7D\u6D41\u91CF\u4E3A 150\u2103 \u5141\u8BB8\u6E29\u5EA6\u4E0B\u7684\u6301\u7EED\u503C\uFF0C\u672A\u505A\u73AF\u5883\u6E29\u5EA6\u4FEE\u6B63"
|
|
25
|
+
],
|
|
26
|
+
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",
|
|
27
|
+
online: "https://www.itswe.com/calculator/copper/"
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// src/copper/index.ts
|
|
31
|
+
var TB2809_WIRE_PARAMS = {
|
|
32
|
+
"CTHM-120": {
|
|
33
|
+
unitWeightKgPerKm: 1082,
|
|
34
|
+
r20OhmPerKm: 0.2113,
|
|
35
|
+
ampacityIndoor150A: 430,
|
|
36
|
+
ampacityOutdoor150A: 560,
|
|
37
|
+
note: "\u53D6\u6807\u51C6 CTMH \u884C\uFF08\u9AD8\u5F3A\u5EA6\u94DC\u9541\u5408\u91D1\uFF09\uFF0C\u03C1 \u6309\u6807\u51C6\u4E0A\u9650 0.02535 \u8BA1\u7B97"
|
|
38
|
+
},
|
|
39
|
+
"CTHM-150": {
|
|
40
|
+
unitWeightKgPerKm: 1350,
|
|
41
|
+
r20OhmPerKm: 0.169,
|
|
42
|
+
ampacityIndoor150A: 500,
|
|
43
|
+
ampacityOutdoor150A: 650,
|
|
44
|
+
note: "\u53D6\u6807\u51C6 CTMH \u884C\uFF08\u9AD8\u5F3A\u5EA6\u94DC\u9541\u5408\u91D1\uFF09"
|
|
45
|
+
},
|
|
46
|
+
"CTHA-120": {
|
|
47
|
+
unitWeightKgPerKm: 1070,
|
|
48
|
+
r20OhmPerKm: 0.1481,
|
|
49
|
+
ampacityIndoor150A: 515,
|
|
50
|
+
ampacityOutdoor150A: 680,
|
|
51
|
+
note: "\u53D6\u6807\u51C6 CTA \u884C\uFF08\u94DC\u94F6\u5408\u91D1\uFF09\uFF0C\u03C1 \u2264 0.01777"
|
|
52
|
+
},
|
|
53
|
+
"CTHA-150": {
|
|
54
|
+
unitWeightKgPerKm: 1330,
|
|
55
|
+
r20OhmPerKm: 0.1185,
|
|
56
|
+
ampacityIndoor150A: 620,
|
|
57
|
+
ampacityOutdoor150A: 785,
|
|
58
|
+
note: "\u53D6\u6807\u51C6 CTA \u884C\uFF08\u94DC\u94F6\u5408\u91D1\uFF09"
|
|
59
|
+
},
|
|
60
|
+
"CTHS-120": {
|
|
61
|
+
unitWeightKgPerKm: 1080,
|
|
62
|
+
r20OhmPerKm: 0.1916,
|
|
63
|
+
ampacityIndoor150A: 515,
|
|
64
|
+
ampacityOutdoor150A: 680,
|
|
65
|
+
note: "\u53D6\u6807\u51C6 CTS \u884C\uFF08\u94DC\u9521\u5408\u91D1\uFF09\uFF0C\u8F7D\u6D41\u91CF\u6309 CTS \u884C\u53D6\u503C"
|
|
66
|
+
},
|
|
67
|
+
"CTHS-150": {
|
|
68
|
+
unitWeightKgPerKm: 1345,
|
|
69
|
+
r20OhmPerKm: 0.1533,
|
|
70
|
+
ampacityIndoor150A: 620,
|
|
71
|
+
ampacityOutdoor150A: 790,
|
|
72
|
+
note: "\u53D6\u6807\u51C6 CTS \u884C\uFF08\u94DC\u9521\u5408\u91D1\uFF09\uFF0C\u8F7D\u6D41\u91CF\u6309 CTS \u884C\u53D6\u503C"
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
function wireLookup(input) {
|
|
76
|
+
const { model, lengthKm, ambientTempDegC } = input;
|
|
77
|
+
const params = TB2809_WIRE_PARAMS[model];
|
|
78
|
+
if (params === void 0) {
|
|
79
|
+
throw new RangeError(`\u672A\u77E5\u578B\u53F7\uFF1A${model}`);
|
|
80
|
+
}
|
|
81
|
+
if (!(lengthKm > 0)) {
|
|
82
|
+
throw new RangeError(`\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${lengthKm} km`);
|
|
83
|
+
}
|
|
84
|
+
if (ambientTempDegC < -40 || ambientTempDegC > 90) {
|
|
85
|
+
throw new RangeError(`\u9002\u7528\u6E29\u5EA6\u4E3A \u221240 ~ 90 \u2103\uFF0C\u6536\u5230 ${ambientTempDegC} \u2103`);
|
|
86
|
+
}
|
|
87
|
+
const rT = resistanceAtTempOhmPerKm(params.r20OhmPerKm, ambientTempDegC);
|
|
88
|
+
return {
|
|
89
|
+
model,
|
|
90
|
+
...params,
|
|
91
|
+
totalWeightKg: params.unitWeightKgPerKm * lengthKm,
|
|
92
|
+
rTOhmPerKm: rT,
|
|
93
|
+
totalResistanceOhm: rT * lengthKm
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export {
|
|
98
|
+
copperMeta,
|
|
99
|
+
TB2809_WIRE_PARAMS,
|
|
100
|
+
wireLookup
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=chunk-CVA4EH2K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/copper/meta.ts","../src/copper/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const copperMeta: CalculatorMeta = {\n name: '接触线参数速查',\n nameEn: 'Contact Wire Parameter Lookup',\n summary:\n '内置 CTHM / CTHA / CTHS 系列 120/150 mm² 接触线参数表,按长度与环境温度给出总重量与温度修正电阻。',\n formula: [\n '电阻温度修正(α = 0.00393 /℃):r_T = r₂₀·[1 + α·(T − 20)]',\n '总重量:W = w₀ × l(w₀ 单位重量 kg/km,l 长度 km)',\n ],\n references: [\n '内置参数表来源 TB/T 2809-2017《电气化铁路用铜及铜合金接触线》(2018-05-01 实施)',\n '单位重量为标称值',\n '载流量为 150℃ 持续值,室内/室外双口径按标准表5',\n 'r₂₀ 除 CTHM-120 取给定值外,均按导电率反算估算(IACS 标准电阻率 0.017241 Ω·mm²/m ÷ 导电率 ÷ 截面积;0.017241 = 1/58)',\n '正式工程以产品标准与出厂检验单为准',\n ],\n scope: [\n '温度修正仅覆盖电阻,未修正单位重量与载流量',\n '适用温度 −40 ~ 90 ℃',\n '载流量为 150℃ 允许温度下的持续值,未做环境温度修正',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/copper/',\n};\n","export { copperMeta } from './meta';\n\n// 电阻温度修正与铜常数统一放在 src/common/resistance.ts(copper 与 voltage-drop 共用),\n// 由根 index 统一导出,此处仅内部引用,避免重复导出同名符号。\nimport { resistanceAtTempOhmPerKm } from '../common/resistance';\n\n/** 站点计算器内置的 6 个型号 */\nexport type CopperWireModel =\n | 'CTHM-120'\n | 'CTHM-150'\n | 'CTHA-120'\n | 'CTHA-150'\n | 'CTHS-120'\n | 'CTHS-150';\n\nexport interface WireParamEntry {\n /** 单位重量,kg/km(标称值) */\n readonly unitWeightKgPerKm: number;\n /** 20℃ 直流电阻,Ω/km */\n readonly r20OhmPerKm: number;\n /** 150℃ 持续载流量,室内口径,A */\n readonly ampacityIndoor150A: number;\n /** 150℃ 持续载流量,室外口径,A */\n readonly ampacityOutdoor150A: number;\n /** 口径说明:本行实际对应标准中的哪一行 */\n readonly note: string;\n}\n\n/**\n * 接触线参数表,来源 TB/T 2809-2017。\n *\n * 载流量为 150℃ 持续值(室内/室外双口径,标准表5)。\n *\n * 已与站点 `/calculator/assets/calc-core.js` 中的 COPPER_TABLE 逐项比对,\n * 6 个型号 × 4 项参数完全一致。\n *\n * 注:站点曾因显示层 `fmt()` 的尾零剥离正则把载流量渲染成 43/56(应为 430/560),\n * 已于 R38 之后修复。若再遇渲染值与本表不符,先确认是否为显示层问题:\n * 本表与服务端数据源始终一致。\n *\n * ⚠️ 注意型号口径:CTHM / CTHA / CTHS 是站点计算器的型号代码,与标准中的\n * CTMH / CTA / CTS 并非同名对应。`note` 字段说明各行实际取自标准的哪一行,\n * 交叉引用 TB/T 2809-2017 时请以 note 为准。\n */\nexport const TB2809_WIRE_PARAMS: Record<CopperWireModel, WireParamEntry> = {\n 'CTHM-120': {\n unitWeightKgPerKm: 1082,\n r20OhmPerKm: 0.2113,\n ampacityIndoor150A: 430,\n ampacityOutdoor150A: 560,\n note: '取标准 CTMH 行(高强度铜镁合金),ρ 按标准上限 0.02535 计算',\n },\n 'CTHM-150': {\n unitWeightKgPerKm: 1350,\n r20OhmPerKm: 0.169,\n ampacityIndoor150A: 500,\n ampacityOutdoor150A: 650,\n note: '取标准 CTMH 行(高强度铜镁合金)',\n },\n 'CTHA-120': {\n unitWeightKgPerKm: 1070,\n r20OhmPerKm: 0.1481,\n ampacityIndoor150A: 515,\n ampacityOutdoor150A: 680,\n note: '取标准 CTA 行(铜银合金),ρ ≤ 0.01777',\n },\n 'CTHA-150': {\n unitWeightKgPerKm: 1330,\n r20OhmPerKm: 0.1185,\n ampacityIndoor150A: 620,\n ampacityOutdoor150A: 785,\n note: '取标准 CTA 行(铜银合金)',\n },\n 'CTHS-120': {\n unitWeightKgPerKm: 1080,\n r20OhmPerKm: 0.1916,\n ampacityIndoor150A: 515,\n ampacityOutdoor150A: 680,\n note: '取标准 CTS 行(铜锡合金),载流量按 CTS 行取值',\n },\n 'CTHS-150': {\n unitWeightKgPerKm: 1345,\n r20OhmPerKm: 0.1533,\n ampacityIndoor150A: 620,\n ampacityOutdoor150A: 790,\n note: '取标准 CTS 行(铜锡合金),载流量按 CTS 行取值',\n },\n};\n\nexport interface CopperLookupInput {\n readonly model: CopperWireModel;\n /** 长度 l,km */\n readonly lengthKm: number;\n /** 环境温度 T,℃ */\n readonly ambientTempDegC: number;\n}\n\nexport interface CopperLookupResult extends WireParamEntry {\n readonly model: CopperWireModel;\n /** 总重量 W = w₀ × l,kg */\n readonly totalWeightKg: number;\n /** 温度修正电阻 r_T,Ω/km */\n readonly rTOhmPerKm: number;\n /** 全长温度修正电阻,Ω */\n readonly totalResistanceOhm: number;\n}\n\n/**\n * 按型号、长度与环境温度给出接触线参数速查结果。\n */\nexport function wireLookup(input: CopperLookupInput): CopperLookupResult {\n const { model, lengthKm, ambientTempDegC } = input;\n\n const params = TB2809_WIRE_PARAMS[model];\n if (params === undefined) {\n throw new RangeError(`未知型号:${model}`);\n }\n if (!(lengthKm > 0)) {\n throw new RangeError(`长度必须为正数,收到 ${lengthKm} km`);\n }\n if (ambientTempDegC < -40 || ambientTempDegC > 90) {\n throw new RangeError(`适用温度为 −40 ~ 90 ℃,收到 ${ambientTempDegC} ℃`);\n }\n\n const rT = resistanceAtTempOhmPerKm(params.r20OhmPerKm, ambientTempDegC);\n\n return {\n model,\n ...params,\n totalWeightKg: params.unitWeightKgPerKm * lengthKm,\n rTOhmPerKm: rT,\n totalResistanceOhm: rT * lengthKm,\n };\n}\n"],"mappings":";;;;;AAEO,IAAM,aAA6B;AAAA,EACxC,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,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV;;;ACmBO,IAAM,qBAA8D;AAAA,EACzE,YAAY;AAAA,IACV,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,MAAM;AAAA,EACR;AACF;AAuBO,SAAS,WAAW,OAA8C;AACvE,QAAM,EAAE,OAAO,UAAU,gBAAgB,IAAI;AAE7C,QAAM,SAAS,mBAAmB,KAAK;AACvC,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI,WAAW,iCAAQ,KAAK,EAAE;AAAA,EACtC;AACA,MAAI,EAAE,WAAW,IAAI;AACnB,UAAM,IAAI,WAAW,gEAAc,QAAQ,KAAK;AAAA,EAClD;AACA,MAAI,kBAAkB,OAAO,kBAAkB,IAAI;AACjD,UAAM,IAAI,WAAW,yEAAuB,eAAe,SAAI;AAAA,EACjE;AAEA,QAAM,KAAK,yBAAyB,OAAO,aAAa,eAAe;AAEvE,SAAO;AAAA,IACL;AAAA,IACA,GAAG;AAAA,IACH,eAAe,OAAO,oBAAoB;AAAA,IAC1C,YAAY;AAAA,IACZ,oBAAoB,KAAK;AAAA,EAC3B;AACF;","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"]}
|