ocs-calculators 0.1.1 → 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 +10 -0
- package/README.md +22 -1
- package/README_EN.md +1 -1
- 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 +148 -1198
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -761
- package/dist/index.d.ts +14 -761
- package/dist/index.js +92 -1039
- 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
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
本文件格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
|
|
4
4
|
版本号遵循[语义化版本](https://semver.org/lang/zh-CN/)。
|
|
5
5
|
|
|
6
|
+
## [0.1.2] - 2026-09-06
|
|
7
|
+
|
|
8
|
+
### 新增
|
|
9
|
+
|
|
10
|
+
- **子路径导入**:支持 `import 'ocs-calculators/wind'` 等按模块导入,
|
|
11
|
+
构建改为多入口 + ESM splitting,利于打包工具 tree-shaking
|
|
12
|
+
- `CONTRIBUTING.md`(贡献指南,含与站点 `calc-core.js` 的同步政策)与
|
|
13
|
+
`SECURITY.md`(安全与公式纠错报告流程)
|
|
14
|
+
- README 增加同步政策章节与子路径导入示例
|
|
15
|
+
|
|
6
16
|
## [0.1.1] - 2026-09-05
|
|
7
17
|
|
|
8
18
|
### 修复
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[English](./README_EN.md) | 简体中文
|
|
9
9
|
|
|
10
10
|

|
|
11
|
-

|
|
11
|
+
[](https://github.com/showhoo/ocs-calculators/actions/workflows/ci.yml)
|
|
12
12
|

|
|
13
13
|

|
|
14
14
|
|
|
@@ -62,6 +62,13 @@ for (const p of curve) {
|
|
|
62
62
|
|
|
63
63
|
上面这段输出与 <https://www.itswe.com/calculator/tension/> 在线计算器完全一致,测试用例里做了逐行回归。
|
|
64
64
|
|
|
65
|
+
也支持按模块子路径导入(利于打包工具做 tree-shaking):
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { windClearanceCheck } from 'ocs-calculators/wind';
|
|
69
|
+
import { wearRatio } from 'ocs-calculators/wear';
|
|
70
|
+
```
|
|
71
|
+
|
|
65
72
|
## 12 个计算器(全部实现)
|
|
66
73
|
|
|
67
74
|
对应 <https://www.itswe.com/Category:tools> 的 12 个在线计算器,全部已实现并逐项回归。
|
|
@@ -109,6 +116,18 @@ console.log(tensionMeta.scope); // 适用范围:跨距 20~90 m、E 50~20
|
|
|
109
116
|
console.log(tensionMeta.disclaimer); // 免责声明
|
|
110
117
|
```
|
|
111
118
|
|
|
119
|
+
## 与站点实现的同步政策
|
|
120
|
+
|
|
121
|
+
本仓库是 [itswe.com](https://www.itswe.com) 在线计算器的公式算法层,同步基准为站点资产
|
|
122
|
+
[`calculator/assets/calc-core.js`](https://www.itswe.com/calculator/assets/calc-core.js):
|
|
123
|
+
|
|
124
|
+
- `src/` 中每个模块的公式与默认参数,以 `calc-core.js` 对应实现为准;
|
|
125
|
+
- 站点侧公式变更时,本仓库同步更新并补充/修订对应测试;
|
|
126
|
+
- 本仓库的公式变更同样会回流站点,两边的计算结果保持一致;
|
|
127
|
+
- `meta.ts` 中的参考依据(标准号 + 年份)随两侧更新同步修订。
|
|
128
|
+
|
|
129
|
+
当前同步状态:`calc-core.js` 与 `src/` 一致(2026-09-05 校验,152 项测试全绿)。
|
|
130
|
+
|
|
112
131
|
## ⚠️ 免责声明
|
|
113
132
|
|
|
114
133
|
**本库所有计算结果仅供参考,不构成工程设计、施工或验收依据。**
|
|
@@ -157,6 +176,8 @@ src/<模块名>/
|
|
|
157
176
|
2. `meta.ts` 必须写全 `formula` / `references` / `scope` / `disclaimer`
|
|
158
177
|
3. 测试的期望值取自站点在线计算器,容差 1%(站点输出经过显示取整)
|
|
159
178
|
|
|
179
|
+
完整约定与同步政策见 [CONTRIBUTING.md](./CONTRIBUTING.md)。
|
|
180
|
+
|
|
160
181
|
## 相关项目
|
|
161
182
|
|
|
162
183
|
- [ocs-wiki-content](https://github.com/showhoo/ocs-wiki-content) — 504 条词条快照与结构化数据(规划中)
|
package/README_EN.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[简体中文](./README.md) | English
|
|
9
9
|
|
|
10
10
|

|
|
11
|
-

|
|
11
|
+
[](https://github.com/showhoo/ocs-calculators/actions/workflows/ci.yml)
|
|
12
12
|

|
|
13
13
|

|
|
14
14
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkNBFOB2PIcjs = require('../chunk-NBFOB2PI.cjs');
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
exports.DEFAULT_BASE_AMBIENT_TEMP_DEG_C = _chunkNBFOB2PIcjs.DEFAULT_BASE_AMBIENT_TEMP_DEG_C; exports.ampacityDeratingFactor = _chunkNBFOB2PIcjs.ampacityDeratingFactor; exports.ampacityMeta = _chunkNBFOB2PIcjs.ampacityMeta; exports.deratedAmpacityA = _chunkNBFOB2PIcjs.deratedAmpacityA; exports.shortCircuitCheck = _chunkNBFOB2PIcjs.shortCircuitCheck; exports.shortCircuitMinSectionMM2 = _chunkNBFOB2PIcjs.shortCircuitMinSectionMM2;
|
|
17
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/ampacity/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,+aAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/ampacity/index.cjs"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { C as CalculatorMeta } from '../types-C2OanO8N.cjs';
|
|
2
|
+
|
|
3
|
+
declare const ampacityMeta: CalculatorMeta;
|
|
4
|
+
|
|
5
|
+
/** 基准环境温度 T₀,℃(TB/T 2809-2017 标准环境) */
|
|
6
|
+
declare const DEFAULT_BASE_AMBIENT_TEMP_DEG_C = 25;
|
|
7
|
+
/** 载流量环境温度修正输入 */
|
|
8
|
+
interface AmpacityDeratingInput {
|
|
9
|
+
/** 基准载流量 I₀,A(标准环境 T₀ 下的持续载流量) */
|
|
10
|
+
readonly baseAmpacityA: number;
|
|
11
|
+
/** 最高允许工作温度 Tmax,℃(铜 95、铜合金 150) */
|
|
12
|
+
readonly maxAllowedTempDegC: number;
|
|
13
|
+
/** 最不利实际环境温度 Ta,℃ */
|
|
14
|
+
readonly ambientTempDegC: number;
|
|
15
|
+
/** 基准环境温度 T₀,℃。缺省 25 ℃ */
|
|
16
|
+
readonly baseAmbientTempDegC?: number;
|
|
17
|
+
}
|
|
18
|
+
interface AmpacityDeratingResult {
|
|
19
|
+
/** 修正系数,无量纲 */
|
|
20
|
+
readonly deratingFactor: number;
|
|
21
|
+
/** 修正后载流量 I(Ta),A */
|
|
22
|
+
readonly deratedAmpacityA: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 环境温度修正系数:√((Tmax − Ta) / (Tmax − T₀))。
|
|
26
|
+
*
|
|
27
|
+
* Ta 越接近允许温度,系数越小;Ta = T₀ 时为 1;Ta > Tmax 无解,直接抛错。
|
|
28
|
+
*/
|
|
29
|
+
declare function ampacityDeratingFactor(input: AmpacityDeratingInput): number;
|
|
30
|
+
/**
|
|
31
|
+
* 修正后载流量:I(Ta) = I₀·√((Tmax − Ta)/(Tmax − T₀)),A。
|
|
32
|
+
*
|
|
33
|
+
* ⚠️ 修正式仅覆盖环境温度项;高海拔、隧道、日照叠加场景须另行叠加修正。
|
|
34
|
+
*/
|
|
35
|
+
declare function deratedAmpacityA(input: AmpacityDeratingInput): number;
|
|
36
|
+
/** 热稳定校核判定结果 */
|
|
37
|
+
type ThermalStabilityVerdict = 'pass' | 'fail' | 'not-assessed';
|
|
38
|
+
interface ShortCircuitCheckInput {
|
|
39
|
+
/** 短路电流 I_k,kA(热稳定等效值,由供电计算给出) */
|
|
40
|
+
readonly shortCircuitCurrentKA: number;
|
|
41
|
+
/** 全切除时间 t_k,s */
|
|
42
|
+
readonly clearingTimeS: number;
|
|
43
|
+
/** 热稳定系数 C,A·√s/mm²(设计输入) */
|
|
44
|
+
readonly thermalCoefficientC: number;
|
|
45
|
+
/** 拟选截面,mm²。传 null 则仅输出最小截面,不判定 */
|
|
46
|
+
readonly selectedSectionMM2: number | null;
|
|
47
|
+
}
|
|
48
|
+
interface ShortCircuitCheckResult {
|
|
49
|
+
/** 最小热稳截面 S_min = I_k·√t_k / C,mm² */
|
|
50
|
+
readonly minSectionMM2: number;
|
|
51
|
+
readonly selectedSectionMM2: number | null;
|
|
52
|
+
/** 拟选截面判定 */
|
|
53
|
+
readonly verdict: ThermalStabilityVerdict;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 短路热稳定最小截面:S_min = I_k·√t_k / C,mm²。
|
|
57
|
+
*
|
|
58
|
+
* @param shortCircuitCurrentKA 短路电流,kA
|
|
59
|
+
* @param clearingTimeS 切除时间,s
|
|
60
|
+
* @param thermalCoefficientC 热稳定系数,A·√s/mm²
|
|
61
|
+
*/
|
|
62
|
+
declare function shortCircuitMinSectionMM2(shortCircuitCurrentKA: number, clearingTimeS: number, thermalCoefficientC: number): number;
|
|
63
|
+
/**
|
|
64
|
+
* 短路热稳定校核:给出最小截面,并在提供拟选截面时判定是否满足 S ≥ S_min。
|
|
65
|
+
*/
|
|
66
|
+
declare function shortCircuitCheck(input: ShortCircuitCheckInput): ShortCircuitCheckResult;
|
|
67
|
+
|
|
68
|
+
export { type AmpacityDeratingInput, type AmpacityDeratingResult, DEFAULT_BASE_AMBIENT_TEMP_DEG_C, type ShortCircuitCheckInput, type ShortCircuitCheckResult, type ThermalStabilityVerdict, ampacityDeratingFactor, ampacityMeta, deratedAmpacityA, shortCircuitCheck, shortCircuitMinSectionMM2 };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { C as CalculatorMeta } from '../types-C2OanO8N.js';
|
|
2
|
+
|
|
3
|
+
declare const ampacityMeta: CalculatorMeta;
|
|
4
|
+
|
|
5
|
+
/** 基准环境温度 T₀,℃(TB/T 2809-2017 标准环境) */
|
|
6
|
+
declare const DEFAULT_BASE_AMBIENT_TEMP_DEG_C = 25;
|
|
7
|
+
/** 载流量环境温度修正输入 */
|
|
8
|
+
interface AmpacityDeratingInput {
|
|
9
|
+
/** 基准载流量 I₀,A(标准环境 T₀ 下的持续载流量) */
|
|
10
|
+
readonly baseAmpacityA: number;
|
|
11
|
+
/** 最高允许工作温度 Tmax,℃(铜 95、铜合金 150) */
|
|
12
|
+
readonly maxAllowedTempDegC: number;
|
|
13
|
+
/** 最不利实际环境温度 Ta,℃ */
|
|
14
|
+
readonly ambientTempDegC: number;
|
|
15
|
+
/** 基准环境温度 T₀,℃。缺省 25 ℃ */
|
|
16
|
+
readonly baseAmbientTempDegC?: number;
|
|
17
|
+
}
|
|
18
|
+
interface AmpacityDeratingResult {
|
|
19
|
+
/** 修正系数,无量纲 */
|
|
20
|
+
readonly deratingFactor: number;
|
|
21
|
+
/** 修正后载流量 I(Ta),A */
|
|
22
|
+
readonly deratedAmpacityA: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 环境温度修正系数:√((Tmax − Ta) / (Tmax − T₀))。
|
|
26
|
+
*
|
|
27
|
+
* Ta 越接近允许温度,系数越小;Ta = T₀ 时为 1;Ta > Tmax 无解,直接抛错。
|
|
28
|
+
*/
|
|
29
|
+
declare function ampacityDeratingFactor(input: AmpacityDeratingInput): number;
|
|
30
|
+
/**
|
|
31
|
+
* 修正后载流量:I(Ta) = I₀·√((Tmax − Ta)/(Tmax − T₀)),A。
|
|
32
|
+
*
|
|
33
|
+
* ⚠️ 修正式仅覆盖环境温度项;高海拔、隧道、日照叠加场景须另行叠加修正。
|
|
34
|
+
*/
|
|
35
|
+
declare function deratedAmpacityA(input: AmpacityDeratingInput): number;
|
|
36
|
+
/** 热稳定校核判定结果 */
|
|
37
|
+
type ThermalStabilityVerdict = 'pass' | 'fail' | 'not-assessed';
|
|
38
|
+
interface ShortCircuitCheckInput {
|
|
39
|
+
/** 短路电流 I_k,kA(热稳定等效值,由供电计算给出) */
|
|
40
|
+
readonly shortCircuitCurrentKA: number;
|
|
41
|
+
/** 全切除时间 t_k,s */
|
|
42
|
+
readonly clearingTimeS: number;
|
|
43
|
+
/** 热稳定系数 C,A·√s/mm²(设计输入) */
|
|
44
|
+
readonly thermalCoefficientC: number;
|
|
45
|
+
/** 拟选截面,mm²。传 null 则仅输出最小截面,不判定 */
|
|
46
|
+
readonly selectedSectionMM2: number | null;
|
|
47
|
+
}
|
|
48
|
+
interface ShortCircuitCheckResult {
|
|
49
|
+
/** 最小热稳截面 S_min = I_k·√t_k / C,mm² */
|
|
50
|
+
readonly minSectionMM2: number;
|
|
51
|
+
readonly selectedSectionMM2: number | null;
|
|
52
|
+
/** 拟选截面判定 */
|
|
53
|
+
readonly verdict: ThermalStabilityVerdict;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 短路热稳定最小截面:S_min = I_k·√t_k / C,mm²。
|
|
57
|
+
*
|
|
58
|
+
* @param shortCircuitCurrentKA 短路电流,kA
|
|
59
|
+
* @param clearingTimeS 切除时间,s
|
|
60
|
+
* @param thermalCoefficientC 热稳定系数,A·√s/mm²
|
|
61
|
+
*/
|
|
62
|
+
declare function shortCircuitMinSectionMM2(shortCircuitCurrentKA: number, clearingTimeS: number, thermalCoefficientC: number): number;
|
|
63
|
+
/**
|
|
64
|
+
* 短路热稳定校核:给出最小截面,并在提供拟选截面时判定是否满足 S ≥ S_min。
|
|
65
|
+
*/
|
|
66
|
+
declare function shortCircuitCheck(input: ShortCircuitCheckInput): ShortCircuitCheckResult;
|
|
67
|
+
|
|
68
|
+
export { type AmpacityDeratingInput, type AmpacityDeratingResult, DEFAULT_BASE_AMBIENT_TEMP_DEG_C, type ShortCircuitCheckInput, type ShortCircuitCheckResult, type ThermalStabilityVerdict, ampacityDeratingFactor, ampacityMeta, deratedAmpacityA, shortCircuitCheck, shortCircuitMinSectionMM2 };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_BASE_AMBIENT_TEMP_DEG_C,
|
|
3
|
+
ampacityDeratingFactor,
|
|
4
|
+
ampacityMeta,
|
|
5
|
+
deratedAmpacityA,
|
|
6
|
+
shortCircuitCheck,
|
|
7
|
+
shortCircuitMinSectionMM2
|
|
8
|
+
} from "../chunk-746H65EQ.js";
|
|
9
|
+
export {
|
|
10
|
+
DEFAULT_BASE_AMBIENT_TEMP_DEG_C,
|
|
11
|
+
ampacityDeratingFactor,
|
|
12
|
+
ampacityMeta,
|
|
13
|
+
deratedAmpacityA,
|
|
14
|
+
shortCircuitCheck,
|
|
15
|
+
shortCircuitMinSectionMM2
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/tension/meta.ts
|
|
2
|
+
var tensionMeta = {
|
|
3
|
+
name: "\u5F20\u529B-\u6E29\u5EA6\u5B89\u88C5\u66F2\u7EBF",
|
|
4
|
+
nameEn: "Tension-Temperature Installation Curve",
|
|
5
|
+
summary: "\u6309\u5F20\u529B-\u6E29\u5EA6\u72B6\u6001\u65B9\u7A0B\u6C42\u89E3\u5404\u6E29\u5EA6\u6863\u7684\u65BD\u5DE5\u5F20\u529B\u4E0E\u5F1B\u5EA6\uFF0C\u751F\u6210\u5B89\u88C5\u66F2\u7EBF\u8868\uFF1B\u652F\u6301\u5F53\u91CF\u8DE8\u8DDD\uFF08\u591A\u8DE8\u951A\u6BB5\uFF09\u4E0E\u8986\u51B0\u5DE5\u51B5\u6821\u6838\u3002",
|
|
6
|
+
formula: [
|
|
7
|
+
"\u72B6\u6001\u65B9\u7A0B\uFF1AT\u2082 \u2212 g\u2082\xB2l\xB2EA/(24T\u2082\xB2) = T\u2081 \u2212 g\u2081\xB2l\xB2EA/(24T\u2081\xB2) \u2212 \u03B1EA(t\u2082 \u2212 t\u2081)",
|
|
8
|
+
"\u8DE8\u4E2D\u5F1B\u5EA6\uFF08\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF09\uFF1Af = gl\xB2/(8T)",
|
|
9
|
+
"\u5F53\u91CF\u8DE8\u8DDD\uFF1Al_D = \u221A(\u03A3l\u1D62\xB3 / \u03A3l\u1D62)",
|
|
10
|
+
"\u8986\u51B0\u8377\u8F7D\uFF08\u51B0\u7B52\u6A21\u578B\uFF09\uFF1Ag_ice = \u03C1_ice \xB7 g\u2080 \xB7 \u03C0 \xB7 b \xB7 (d + b)"
|
|
11
|
+
],
|
|
12
|
+
references: [
|
|
13
|
+
"TB 10009-2016\u300A\u94C1\u8DEF\u7535\u529B\u7275\u5F15\u4F9B\u7535\u8BBE\u8BA1\u89C4\u8303\u300B\u2014\u2014 \u4EC5\u89C4\u5B9A\u63A5\u89E6\u7EBF\u6700\u5C0F\u5F20\u529B\u3001\u5F20\u529B\u786E\u5B9A\u539F\u5219\u4E0E\u5F20\u529B\u5DEE\u9650\u503C\uFF0C\u4E0D\u542B\u5F20\u529B-\u6E29\u5EA6\u72B6\u6001\u65B9\u7A0B\u672C\u8EAB",
|
|
14
|
+
"\u5F20\u529B-\u6E29\u5EA6\u72B6\u6001\u65B9\u7A0B\u4E3A\u901A\u7528\u67D4\u7D22\u72B6\u6001\u65B9\u7A0B\uFF0C\u5177\u4F53\u5F62\u5F0F\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u53CA\u63A5\u89E6\u7F51\u8BBE\u8BA1\u6559\u6750/\u624B\u518C\u4E3A\u51C6",
|
|
15
|
+
"\u7EBF\u6750 E / \u03B1 / \u7EBF\u5BC6\u5EA6\u4E3A\u6807\u79F0\u53C2\u8003\u503C\uFF0C\u5B9E\u9645\u4EE5\u4EA7\u54C1\u6280\u672F\u6761\u4EF6\u4E3A\u51C6"
|
|
16
|
+
],
|
|
17
|
+
scope: [
|
|
18
|
+
"\u5F39\u6027\u6A21\u91CF E\uFF1A50 ~ 200 GPa",
|
|
19
|
+
"\u622A\u9762\u79EF A\uFF1A50 ~ 250 mm\xB2",
|
|
20
|
+
"\u8DE8\u8DDD l\uFF1A20 ~ 90 m",
|
|
21
|
+
"\u5F1B\u5EA6\u91C7\u7528\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u4E0D\u9002\u7528\u4E8E\u5927\u5F1B\u5EA6\uFF08f/l > 1/10\uFF09\u5DE5\u51B5",
|
|
22
|
+
"\u8986\u51B0\u6A21\u578B\u4E3A\u5747\u5300\u51B0\u7B52\u5047\u8BBE\uFF0C\u4E0D\u8003\u8651\u4E0D\u5747\u5300\u8986\u51B0\u4E0E\u8131\u51B0\u8DF3\u8DC3"
|
|
23
|
+
],
|
|
24
|
+
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",
|
|
25
|
+
online: "https://www.itswe.com/calculator/tension/"
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// src/tension/index.ts
|
|
29
|
+
function sagM(weightPerLengthNPerM, spanM, tensionN) {
|
|
30
|
+
if (!(tensionN > 0)) {
|
|
31
|
+
throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionN} N`);
|
|
32
|
+
}
|
|
33
|
+
return weightPerLengthNPerM * spanM * spanM / (8 * tensionN);
|
|
34
|
+
}
|
|
35
|
+
function equivalentSpanM(spansM) {
|
|
36
|
+
if (spansM.length === 0) {
|
|
37
|
+
throw new RangeError("\u8DE8\u8DDD\u6570\u7EC4\u4E0D\u80FD\u4E3A\u7A7A");
|
|
38
|
+
}
|
|
39
|
+
let sumCubed = 0;
|
|
40
|
+
let sum = 0;
|
|
41
|
+
for (const s of spansM) {
|
|
42
|
+
if (!(s > 0)) {
|
|
43
|
+
throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${s}`);
|
|
44
|
+
}
|
|
45
|
+
sumCubed += s * s * s;
|
|
46
|
+
sum += s;
|
|
47
|
+
}
|
|
48
|
+
return Math.sqrt(sumCubed / sum);
|
|
49
|
+
}
|
|
50
|
+
function stateCoefficientK(weightPerLengthNPerM, spanM, elasticModulusGPa, crossSectionMM2) {
|
|
51
|
+
const ePa = elasticModulusGPa * 1e9;
|
|
52
|
+
const aM2 = crossSectionMM2 * 1e-6;
|
|
53
|
+
return weightPerLengthNPerM * weightPerLengthNPerM * spanM * spanM * ePa * aM2 / 24;
|
|
54
|
+
}
|
|
55
|
+
function solveTensionN(K, targetN) {
|
|
56
|
+
const hOf = (t) => t - K / (t * t) - targetN;
|
|
57
|
+
let lo = Math.max(targetN, 1e-9);
|
|
58
|
+
let hi = lo + 1;
|
|
59
|
+
let guard = 0;
|
|
60
|
+
while (hOf(hi) < 0 && guard++ < 200) {
|
|
61
|
+
hi = lo + (hi - lo) * 2;
|
|
62
|
+
if (!Number.isFinite(hi)) break;
|
|
63
|
+
}
|
|
64
|
+
let iterations = 0;
|
|
65
|
+
for (let i = 0; i < 200; i++) {
|
|
66
|
+
iterations = i + 1;
|
|
67
|
+
const mid = 0.5 * (lo + hi);
|
|
68
|
+
if (hOf(mid) < 0) {
|
|
69
|
+
lo = mid;
|
|
70
|
+
} else {
|
|
71
|
+
hi = mid;
|
|
72
|
+
}
|
|
73
|
+
if (hi - lo <= 1e-12 * Math.max(1, hi)) break;
|
|
74
|
+
}
|
|
75
|
+
const tensionN = 0.5 * (lo + hi);
|
|
76
|
+
return { tensionN, iterations, residualN: hOf(tensionN) };
|
|
77
|
+
}
|
|
78
|
+
function tensionAt(input) {
|
|
79
|
+
const T1N = input.baseTensionKN * 1e3;
|
|
80
|
+
if (!(T1N > 0)) {
|
|
81
|
+
throw new RangeError(`\u57FA\u51C6\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.baseTensionKN} kN`);
|
|
82
|
+
}
|
|
83
|
+
if (!(input.spanM > 0)) {
|
|
84
|
+
throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.spanM} m`);
|
|
85
|
+
}
|
|
86
|
+
const K = stateCoefficientK(
|
|
87
|
+
input.weightPerLengthNPerM,
|
|
88
|
+
input.spanM,
|
|
89
|
+
input.elasticModulusGPa,
|
|
90
|
+
input.crossSectionMM2
|
|
91
|
+
);
|
|
92
|
+
const ePa = input.elasticModulusGPa * 1e9;
|
|
93
|
+
const aM2 = input.crossSectionMM2 * 1e-6;
|
|
94
|
+
const alphaEA = input.expansionPerDegC * ePa * aM2;
|
|
95
|
+
const fBase = T1N - K / (T1N * T1N);
|
|
96
|
+
const target = fBase - alphaEA * (input.targetTempDegC - input.baseTempDegC);
|
|
97
|
+
const { tensionN, iterations, residualN } = solveTensionN(K, target);
|
|
98
|
+
return {
|
|
99
|
+
targetTempDegC: input.targetTempDegC,
|
|
100
|
+
tensionKN: tensionN / 1e3,
|
|
101
|
+
sagM: sagM(input.weightPerLengthNPerM, input.spanM, tensionN),
|
|
102
|
+
iterations,
|
|
103
|
+
residualN
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function tensionCurve(base, tempsDegC) {
|
|
107
|
+
return tempsDegC.map((t) => tensionAt({ ...base, targetTempDegC: t }));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
exports.tensionMeta = tensionMeta; exports.sagM = sagM; exports.equivalentSpanM = equivalentSpanM; exports.stateCoefficientK = stateCoefficientK; exports.solveTensionN = solveTensionN; exports.tensionAt = tensionAt; exports.tensionCurve = tensionCurve;
|
|
119
|
+
//# sourceMappingURL=chunk-3ERFRRHZ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-3ERFRRHZ.cjs","../src/tension/meta.ts","../src/tension/index.ts"],"names":[],"mappings":"AAAA;ACEO,IAAM,YAAA,EAA8B;AAAA,EACzC,IAAA,EAAM,mDAAA;AAAA,EACN,MAAA,EAAQ,wCAAA;AAAA,EACR,OAAA,EACE,2TAAA;AAAA,EACF,OAAA,EAAS;AAAA,IACP,6KAAA;AAAA,IACA,yFAAA;AAAA,IACA,+EAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,yUAAA;AAAA,IACA,8OAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO;AAAA,IACL,8CAAA;AAAA,IACA,2CAAA;AAAA,IACA,+BAAA;AAAA,IACA,0IAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADDA;AACA;AEmBO,SAAS,IAAA,CACd,oBAAA,EACA,KAAA,EACA,QAAA,EACQ;AACR,EAAA,GAAA,CAAI,CAAA,CAAE,SAAA,EAAW,CAAA,CAAA,EAAI;AACnB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,6DAAA,EAAc,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EACjD;AACA,EAAA,OAAQ,qBAAA,EAAuB,MAAA,EAAQ,MAAA,EAAA,CAAU,EAAA,EAAI,QAAA,CAAA;AACvD;AAOO,SAAS,eAAA,CAAgB,MAAA,EAAmC;AACjE,EAAA,GAAA,CAAI,MAAA,CAAO,OAAA,IAAW,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,UAAA,CAAW,kDAAU,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,SAAA,EAAW,CAAA;AACf,EAAA,IAAI,IAAA,EAAM,CAAA;AACV,EAAA,IAAA,CAAA,MAAW,EAAA,GAAK,MAAA,EAAQ;AACtB,IAAA,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAA,EAAI;AACZ,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,6DAAA,EAAc,CAAC,CAAA,CAAA;AACtC,IAAA;AACoB,IAAA;AACb,IAAA;AACT,EAAA;AAC+B,EAAA;AACjC;AAgBU;AACwB,EAAA;AACF,EAAA;AACqD,EAAA;AACrF;AAY+D;AACR,EAAA;AAEtB,EAAA;AACjB,EAAA;AACF,EAAA;AACyB,EAAA;AACb,IAAA;AACI,IAAA;AAC5B,EAAA;AAEiB,EAAA;AACa,EAAA;AACX,IAAA;AACO,IAAA;AACN,IAAA;AACX,MAAA;AACA,IAAA;AACA,MAAA;AACP,IAAA;AACwC,IAAA;AAC1C,EAAA;AAE6B,EAAA;AAC2B,EAAA;AAC1D;AAOmE;AAC/B,EAAA;AAClB,EAAA;AACO,IAAA;AACvB,EAAA;AACwB,EAAA;AACa,IAAA;AACrC,EAAA;AAEU,EAAA;AACF,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACR,EAAA;AACsC,EAAA;AACF,EAAA;AACW,EAAA;AAEhB,EAAA;AACgC,EAAA;AAEI,EAAA;AAE5D,EAAA;AACiB,IAAA;AACA,IAAA;AACsC,IAAA;AAC5D,IAAA;AACA,IAAA;AACF,EAAA;AACF;AAQmB;AACoD,EAAA;AACvE;AFzE6F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-3ERFRRHZ.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const tensionMeta: CalculatorMeta = {\n name: '张力-温度安装曲线',\n nameEn: 'Tension-Temperature Installation Curve',\n summary:\n '按张力-温度状态方程求解各温度档的施工张力与弛度,生成安装曲线表;支持当量跨距(多跨锚段)与覆冰工况校核。',\n formula: [\n '状态方程:T₂ − g₂²l²EA/(24T₂²) = T₁ − g₁²l²EA/(24T₁²) − αEA(t₂ − t₁)',\n '跨中弛度(抛物线近似):f = gl²/(8T)',\n '当量跨距:l_D = √(Σlᵢ³ / Σlᵢ)',\n '覆冰荷载(冰筒模型):g_ice = ρ_ice · g₀ · π · b · (d + b)',\n ],\n references: [\n 'TB 10009-2016《铁路电力牵引供电设计规范》—— 仅规定接触线最小张力、张力确定原则与张力差限值,不含张力-温度状态方程本身',\n '张力-温度状态方程为通用柔索状态方程,具体形式以设计文件及接触网设计教材/手册为准',\n '线材 E / α / 线密度为标称参考值,实际以产品技术条件为准',\n ],\n scope: [\n '弹性模量 E:50 ~ 200 GPa',\n '截面积 A:50 ~ 250 mm²',\n '跨距 l:20 ~ 90 m',\n '弛度采用抛物线近似,不适用于大弛度(f/l > 1/10)工况',\n '覆冰模型为均匀冰筒假设,不考虑不均匀覆冰与脱冰跳跃',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/tension/',\n};\n","export { tensionMeta } from './meta';\n\n/** 单个温度档的输入参数 */\nexport interface TensionPointInput {\n /** 基准工况张力 T₁,kN */\n readonly baseTensionKN: number;\n /** 基准温度 t₁,℃ */\n readonly baseTempDegC: number;\n /** 目标温度 t₂,℃ */\n readonly targetTempDegC: number;\n /** 单位自重荷载 g,N/m(覆冰工况传自重与冰重的组合值) */\n readonly weightPerLengthNPerM: number;\n /** 计算跨距 l,m(多跨锚段传当量跨距 l_D) */\n readonly spanM: number;\n /** 弹性模量 E,GPa */\n readonly elasticModulusGPa: number;\n /** 截面积 A,mm² */\n readonly crossSectionMM2: number;\n /** 线膨胀系数 α,1/℃ */\n readonly expansionPerDegC: number;\n}\n\n/** 安装曲线公共参数(不含目标温度) */\nexport type TensionCurveInput = Omit<TensionPointInput, 'targetTempDegC'>;\n\n/** 单个温度档的计算结果 */\nexport interface TensionResult {\n /** 目标温度 t₂,℃ */\n readonly targetTempDegC: number;\n /** 该温度下的张力 T₂,kN */\n readonly tensionKN: number;\n /** 跨中弛度 f,m(抛物线近似) */\n readonly sagM: number;\n /** 求解迭代次数 */\n readonly iterations: number;\n /** 状态方程残差,N(用于校验收敛,应接近 0) */\n readonly residualN: number;\n}\n\n/**\n * 跨中弛度,抛物线近似:f = gl²/(8T)\n * @param weightPerLengthNPerM 单位自重荷载 g,N/m\n * @param spanM 跨距 l,m\n * @param tensionN 张力 T,N\n * @returns 弛度 f,m\n */\nexport function sagM(\n weightPerLengthNPerM: number,\n spanM: number,\n tensionN: number,\n): number {\n if (!(tensionN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionN} N`);\n }\n return (weightPerLengthNPerM * spanM * spanM) / (8 * tensionN);\n}\n\n/**\n * 当量跨距(多跨锚段归算):l_D = √(Σlᵢ³ / Σlᵢ)\n * @param spansM 各跨跨距,m\n * @returns 当量跨距 l_D,m\n */\nexport function equivalentSpanM(spansM: readonly number[]): number {\n if (spansM.length === 0) {\n throw new RangeError('跨距数组不能为空');\n }\n let sumCubed = 0;\n let sum = 0;\n for (const s of spansM) {\n if (!(s > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${s}`);\n }\n sumCubed += s * s * s;\n sum += s;\n }\n return Math.sqrt(sumCubed / sum);\n}\n\n/**\n * 覆冰荷载(均匀冰筒模型)与 icing 模块共用 `src/common/ice.ts`,\n * 由根 index 统一导出,此处不再重复定义。\n */\n\n/**\n * 状态方程系数 K = g²l²EA/24,单位 N³。\n * 使状态方程可写成 F(T) = T − K/T² 的紧凑形式。\n */\nexport function stateCoefficientK(\n weightPerLengthNPerM: number,\n spanM: number,\n elasticModulusGPa: number,\n crossSectionMM2: number,\n): number {\n const ePa = elasticModulusGPa * 1e9;\n const aM2 = crossSectionMM2 * 1e-6;\n return (weightPerLengthNPerM * weightPerLengthNPerM * spanM * spanM * ePa * aM2) / 24;\n}\n\n/**\n * 求解状态方程 T − K/T² = target 的正根。\n *\n * h(T) = T − K/T² − target 在 T > 0 上严格单调递增(h′ = 1 + 2K/T³ > 0),\n * 因此用二分法必定收敛。又由 T = target + K/T² 可知 T > target,\n * 可直接取 target 作为下界,bracket 很紧。\n */\nexport function solveTensionN(\n K: number,\n targetN: number,\n): { tensionN: number; iterations: number; residualN: number } {\n const hOf = (t: number): number => t - K / (t * t) - targetN;\n\n let lo = Math.max(targetN, 1e-9);\n let hi = lo + 1;\n let guard = 0;\n while (hOf(hi) < 0 && guard++ < 200) {\n hi = lo + (hi - lo) * 2;\n if (!Number.isFinite(hi)) break;\n }\n\n let iterations = 0;\n for (let i = 0; i < 200; i++) {\n iterations = i + 1;\n const mid = 0.5 * (lo + hi);\n if (hOf(mid) < 0) {\n lo = mid;\n } else {\n hi = mid;\n }\n if (hi - lo <= 1e-12 * Math.max(1, hi)) break;\n }\n\n const tensionN = 0.5 * (lo + hi);\n return { tensionN, iterations, residualN: hOf(tensionN) };\n}\n\n/**\n * 求某一温度档的张力与弛度。\n *\n * 状态方程:T₂ − g²l²EA/(24T₂²) = T₁ − g²l²EA/(24T₁²) − αEA(t₂ − t₁)\n */\nexport function tensionAt(input: TensionPointInput): TensionResult {\n const T1N = input.baseTensionKN * 1000;\n if (!(T1N > 0)) {\n throw new RangeError(`基准张力必须为正数,收到 ${input.baseTensionKN} kN`);\n }\n if (!(input.spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${input.spanM} m`);\n }\n\n const K = stateCoefficientK(\n input.weightPerLengthNPerM,\n input.spanM,\n input.elasticModulusGPa,\n input.crossSectionMM2,\n );\n const ePa = input.elasticModulusGPa * 1e9;\n const aM2 = input.crossSectionMM2 * 1e-6;\n const alphaEA = input.expansionPerDegC * ePa * aM2;\n\n const fBase = T1N - K / (T1N * T1N);\n const target = fBase - alphaEA * (input.targetTempDegC - input.baseTempDegC);\n\n const { tensionN, iterations, residualN } = solveTensionN(K, target);\n\n return {\n targetTempDegC: input.targetTempDegC,\n tensionKN: tensionN / 1000,\n sagM: sagM(input.weightPerLengthNPerM, input.spanM, tensionN),\n iterations,\n residualN,\n };\n}\n\n/**\n * 批量求解多个温度档,生成安装曲线表。\n */\nexport function tensionCurve(\n base: TensionCurveInput,\n tempsDegC: readonly number[],\n): TensionResult[] {\n return tempsDegC.map((t) => tensionAt({ ...base, targetTempDegC: t }));\n}\n"]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// 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
|
+
_nullishCoalesce(input.cantM, () => ( 0)),
|
|
78
|
+
_nullishCoalesce(input.pantographHeightM, () => ( DEFAULT_PANTOGRAPH_HEIGHT_M)),
|
|
79
|
+
_nullishCoalesce(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
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
exports.curveStaggerMeta = curveStaggerMeta; exports.STANDARD_GAUGE_M = STANDARD_GAUGE_M; exports.DEFAULT_PANTOGRAPH_HEIGHT_M = DEFAULT_PANTOGRAPH_HEIGHT_M; exports.versineM = versineM; exports.cantShiftM = cantShiftM; exports.curveStaggerCheck = curveStaggerCheck;
|
|
107
|
+
//# sourceMappingURL=chunk-4UU7WA7N.cjs.map
|
|
@@ -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"]}
|