通过原生 COM 接口自动化 Aspen EDR 换热器计算,支持管壳式、空冷器、板式、加热炉等模块的文件打开、变量读写、运行与结果判读。
✓已通过基础校验
名称、分类、版本与作者信息完整,安装包与文档齐备。
✓可直接使用
提供 Markdown 文档与配置示例,下载后按文档说明使用即可。
v1.0.0(2026-09-28):全链路真机打通并验证(本机 Aspen EDR V11.0 = COM 版本 37.0.0.380)。连接(2.2 s)→ 打开 .edr → 枚举变量(TASC:519 输入标量 / 294 输入数组 / 846 结果标量 / 460 结果数组)→ 改输入(
FlRaHS+20%)→ 运行(0.3 s,返回 0)→ 结果物理正确(面积余量 3.32% → -35.78%,壳程流速/压降上升,LMTD 下降)→ 恢复原值(逐位复现)。独家踩坑已固化:集合枚举只能for-in(Item(i)恒返 None)、数组取值必须先_FlagAsMethod("Values")、残留 AspenEDR.exe 会让下一次 Dispatch 永久挂死(真机踩过 2 次)、Dispose()不一定关进程、读值可带单位换算而赋值不换算。
>
v1.1.0(2026-09-28):新增 设计→校核两段式工作流。真机实测确认
TascProgMode映射(1=Design/2=Rating/3=Simulation),固化"切模式后几何输入复原、须完整传递几何"的致命细节(用 4 个竞赛级真实源文件验证:2×V11 天津大学 + 2×V12 华东理工,V12 文件 V11 引擎可直接打开)。新增references/design_rating.md、com_recipes.md §11与examples/case3_design_then_rating.py。
>
v1.2.0(2026-09-28):新增 面积余量验收带(设计判据,默认 10%–30%,可用户指定)。
case3支持--margin-low/--margin-high(默认 10/30)与--metric(默认ExcessSurfDirty污垢态,可切ExcessSurfClean洁净态),两道校核后自动判读 PASS/BELOW/ABOVE 并写入报告与 CSV。实测澄清DesignBasisRatio(设计过设计率输入,须 ≥1.0;rc=1250)在锁定几何的竞赛"详细设计"文件里不重定尺寸,故余量权威值来自 Rating 结果而非设计输入。新增design_rating.md §7、com_recipes.md §11.1/§11.2。
>
v1.3.0(2026-10-14):多模块覆盖 + 11 案例真机批量验证。新增通用跨模块引擎
examples/edr_run_any.py(resolve_module自动解析 GetApp 名:Tasc/Acol/Aple/Fire/PlateFin/Teams…),覆盖从仅 Tasc 扩展到 全部主流换热器类型。新增 11 案例批量运行器examples/case4_multimodule_batch.py(一次会话跑通:Tasc 冷凝器/再沸器/热虹吸 ×3、Acol 空冷器 ×2、Aple 板式 ×2、Fire 加热炉 ×2、PlateFin 板翅式 ×1、Teams 机械设计 ×1),每个含物理合理性判读,输出统一 JSON/CSV/Markdown 报告。新增 3 个可读独立示例case5_aircooled.py/case6_plate.py/case7_firedheater.py。新增参考references/multimodule_variables.md(各模块关键变量真机 survey 速查)。真机全 11 案例 PASS(Run rc=0,物理判读通过)。关键新坑:FiredHeater 的 GetApp 名是Fire(不是Fihr/FiredHeater,那两个返回 None;文件内还挂UTILITIES伴随应用,取Fire即可)。
>
v1.4.0(2026-10-15):面积余量验收带扩展到全模块、PASS 判据支持用户指定(特性横跨全部模块与全部判读入口,由原 v1.3.1 修订号升级为次版本号)。v1.2.0 的验收带原本只有
case3(Tasc)能用;本版把"用户指定余量带"做进所有判读入口:case1/case4/case5/case6/case7/edr_run_any统一新增--margin-low/--margin-high(默认 10/30)与--margin-metric(可带:ratio/:percent量纲后缀)、--no-margin。按模块自动取判据变量(真机 dump 确认,量纲不同):Tasc/Acol=ExcessSurfDirty(百分数)、Aple=AreaRatio(比值,自动 (v−1)×100 换算)、PlateFin=ExchCalc_AreaRatio(比值)、Fire/Teams 无余量变量 → N/A 不参与 PASS。物理判读合格但余量越出用户指定带 →verdict=MARGIN_FAIL。case4报告新增 margin 字段与 CSV/Markdown 列。新增edr_common.py共享 helpers(MARGIN_DEFAULTS/resolve_margin_metric/margin_percent/verdict_margin/margin_check/margin_from_results/add_margin_args),case3的本地判带函数改为复用共享版(行为不变)。
在写任何自动化代码之前,先读 references/com_recipes.md——这是在真实 Aspen EDR V11.0 上逐点验证过的原生 COM 配方:
for-in 铁律 + dump 配方)、单位制三级控制(§6:UomSet 枚举表 + Value(unit) 换算规则)本技能只保留实测验证过的原生配方。一切接口行为以 com_recipes.md 为准。
D:\Aspen V11\Aspen Exchanger Design and Rating V11.0\(程序在 XEQ\AspenEDR.exe);官方示例 26+ 个 .EDR 在 Examples\ 下(Shell&Tube 12 个 / AirCooled 10 个 / FiredHeater 4 个);帮助文档(含完整自动化章节)在 C:\ProgramData\AspenTech\Aspen Exchanger Design and Rating V11.0\HtmlHelp\Content\html\。pywin32。⚠️ 本机实测可用的解释器:C:/Users/Eric Ye/.workbuddy/binaries/python/envs/default/Scripts/python.exe(系统 Python 无 win32com)。XEQ\EDRVerCtl.exe(Version Control Utility)控制;本机当前注册 = V11(ProgID 后缀 .37.0,V11=37、V12=38 依此类推)。.EDR 能被 V11 COM 引擎直接打开与计算(已用华东理工 E0204/E0301 两个 V12 文件验证),无需切换注册版本。若遇更高版本报 1200(文件格式不识别),再用 EDRVerCtl.exe 切到对应版本。BJACApp (ProgID: BJACWIN.BJACApp / .37.0 / .NewInstance.37.0)
│ 属性: Visible, UomSet, IsSaved, ATVApps/ATVAppsCount
│ 方法: FileNew(app)/FileOpen(path)/FileSave/FileSaveAs/FileClose/FilePrint/FileExit
│ GetApp(name)/LoadApp(name)/RunApp(name,async)/GetVersion()/Dispose()
│
└── IATVApp (模块对象,名字: Tasc/Acol/Aerotran/Aple/PlateFin/Fihr/FiredHeater/Teams/Hetran/Muse/Fran)
│ 属性: UomSet, CanRun, IsComplete, IsSaved, HasResults, Name
│ 方法: Run() -> 0=成功, GetSize 等
│
├── Scalars(name) -> IATVScalar # 输入标量(TASC 519 个)
├── Arrays(name) -> IATVArray # 输入数组(294 个)
├── ResultScalars(name) -> IATVScalar # 结果标量(846 个)
└── ResultArrays(name) -> IATVArray # 结果数组(460 个)
IATVScalar: .Value / .Value("kg/s") 读写, .Uom 单位串, .Name, .Text, .Category, .IsComplete
IATVArray : .GetSize(), .Values(i)/(i,unit) ← 必须先 arr._FlagAsMethod("Values")!
import subprocess, win32com.client as win32
# 0. 进程卫生(致命!残留实例会让 Dispatch 永久挂死,真机踩过 2 次)
subprocess.run(["taskkill", "/F", "/IM", "AspenEDR.exe"], capture_output=True)
# 1. 连接(单实例服务器:Dispatch 会连上已在跑的实例;独立实例用 NewInstance ProgID)
app = win32.Dispatch("BJACWIN.BJACApp") # 锁定版本: "BJACWIN.BJACApp.37.0"
app.Visible = False
# 2. 打开文件——永远先复制副本再开,绝不直接改官方示例/用户原件
app.FileOpen(r"C:\work\case_copy.edr") # FileOpen 是唯一打开途径
# 3. 取应用对象(名字不带空格;GetApp 与 app.Tasc 属性等价)
tasc = app.GetApp("Tasc")
# 4. 单位制(三级:BJACApp.UomSet 只管新建应用;改已加载应用用 IATVApp.UomSet)
tasc.UomSet = 2 # 1=US 2=SI 3=METRIC 4-6=用户 SET1-3
# 5. 变量普查(首次接触某文件必做;名字按名访问,集合只能 for-in 枚举)
for s in tasc.Scalars: # ❌ tasc.Scalars.Item(i) 恒返 None
print(s.Name, s.Value, s.Uom)
# 6. 改输入(赋值用当前单位、不做换算;读值才可用 Value("unit") 换算)
tasc.Scalars("FlRaHS").Value = 1050000.0 # 热侧流量 lb/h(当前单位制)
kg_s = tasc.Scalars("FlRaHS").Value("kg/s") # 读值带单位换算 → 291.9 kg/s
# 7. 运行(同步,TASC 典型 <1 s;返回 0 = 成功)
rc = tasc.Run() # ⚠️ CanRun=False 也能跑(有历史结果时)
assert rc == 0
# 8. 读结果(按名访问;后缀约定 _SS=壳程 _TS=管程 _CS=冷侧 _HS=热侧)
area = tasc.ResultScalars("Area").Value # 面积 ft2(当前单位)
margin = tasc.ResultScalars("ExcessSurfDirty").Value # 面积余量 %(污垢态)
lmtd = tasc.ResultScalars("LMTD").Value
dp_ss = tasc.ResultScalars("PresDropCrossFlowSS").Value # 壳程错流压降
t_out = tasc.ResultScalars("ExchExitTempCS").Value # 冷侧出口温度
# 数组结果:先 _FlagAsMethod 再按下标(1 基)取
arr = tasc.ResultArrays("arShellDuty") # 各壳程热负荷
arr._FlagAsMethod("Values")
duty1_kw = arr.Values(1, "kW") # 支持单位参数
# 9. 另存(不覆盖原件)
app.FileSaveAs(r"C:\work\case_run.edr")
# 10. 清理五连(Dispose 后进程仍可能存活,taskkill 兜底)
app.FileClose(); app.Dispose()
subprocess.run(["taskkill", "/F", "/IM", "AspenEDR.exe"], capture_output=True)
TASC 常用变量名(完整表见 references/tasc_variables.md,全量快照 references/tasc_vars_dump.json):
| 类别 | 变量名 | 含义 |
|---|---|---|
| 输入 | FlRaHS / FlRaCS |
热/冷侧流量 |
| 输入 | TempInHS / TempInCS / TempOutHS / TempOutCS |
进出口温度(0=待算) |
| 输入 | TubeOD / TubeID / TEMAClass |
几何 |
| 结果 | Area |
换热面积(实际提供值,不随工况变) |
| 结果 | ExcessSurfDirty / ExcessSurfClean |
面积余量 %(污垢/洁净态, |
| 结果 | LMTD / DutyRatio / ExchExitTempCS/HS |
温差/热负荷比/出口温度 |
| 结果 | PresDropCrossFlowSS / AvgSSvelocity / AvgTSvelocity |
压降/流速 |
| 结果 | FoulResSS / FoulResTS |
污垢热阻 |
| 数组 | arShellDuty / arPresDropShell / arPresDropTube |
逐壳程热负荷/压降 |
v1.2.0 只演示了 Tasc(管壳式热工)。v1.3.0 把能力扩展到 全部主流换热器类型,
关键突破是 edr_run_any.resolve_module 能自动解析各模块的 GetApp 名字——不同模块
名字完全不同,且多与直觉不符(详见 references/multimodule_variables.md 与 com_recipes.md §3.2):
| 换热器类型 | GetApp 名(实测) | 同义/候选 | 结果标量规模 | 关键结果变量(节选) |
|---|---|---|---|---|
| 管壳式热工 Shell&Tube | Tasc |
— | ~846 | Area/ExcessSurfDirty/LMTD/PresDropCalc* |
| 空冷器 AirCooled | Acol |
Aerotran |
~551 | DutyRatio/Area/BrakePowerTotal/AirPerFanAct |
| 板式 Plate | Aple |
— | ~109 | TotalHeatExchanged/AreaOfPlate/PlatesPerExch |
| 加热炉 Fired Heater | Fire |
(Fihr/FiredHeater 均返 None!) |
~109 | Heater_OverallDuty/Heater_FuelEfficiency/Fbox_StreamTempOut |
| 板翅式 Plate-Fin | PlateFin |
Muse |
~69 | ExchCalc_HeatLoad/ExchCalc_HeatBalance/ExchCalc_UAvalueFinal |
| 管壳式机械设计 | Teams |
— | ~597 | AreaTubes/ChannelTotalStress/DesPressSS |
⚠️ FiredHeater 头号坑(真机):
GetApp("Fihr")与GetApp("FiredHeater")都返回None;
正确名字是Fire(文件内同时挂一个UTILITIES伴随应用,忽略即可)。case4/case7已内置此解析。
11 案例批量运行器 examples/case4_multimodule_batch.py(一次会话跑通全部,输出报告):
| # | 案例标签 | 模块 | 代表文件 |
|---|---|---|---|
| 1–3 | tasc_condenser / tasc_reboiler / tasc_thermosiphon |
Tasc | TS-Condenser-Vertical_BEM / KettleReboiler_AKU / TS-Thermosiphon-Vertical_BEM |
| 4–5 | aircooled_water / aircooled_hydrocarbon |
Acol | Water-DryAir_Simul_Method2 / Hydrocarbon-DryAir_Simul_Method2 |
| 6–7 | plate_waterwater / plate_steamwater_sim |
Aple | Water-Water_Rating / Steam-Water_Simulation |
| 8–9 | firedheater_q1 / firedheater_vacuum |
Fire | QFiredHeater1 / BoxVacuumHeater |
| 10 | platefin_crossflow |
PlateFin | PFsimple crossflow |
| 11 | teams_mechdes_bem |
Teams | MechDesBEM_US |
每个案例的物理判读函数(tasc/aircooled/plate/firedheater/platefin/teams)见 case4 源码:
面积/热负荷 > 0、压降 > 0(可选 ≤ 允许)、加热炉出口 > 进口且效率 ∈(0,100]、
板翅式热平衡偏差
可读独立示例(与 case1 同构,便于照抄改造成自己的脚本):
case5_aircooled.py(空冷器)、case6_plate.py(板式)、case7_firedheater.py(加热炉)。
换热器"面积余量/过设计" = (实际面积−所需面积)/所需面积,工程常用 10%–30% 作验收带。
本版起所有判读入口都支持用户指定该验收带,并纳入 PASS 判据:物理判读合格、
但余量越出用户指定带 → verdict = MARGIN_FAIL(而不是 PASS)。
按模块自动取判据变量(真机 dump 确认;不同模块量纲不同,脚本自动统一换算成百分数余量):
| 模块(GetApp) | 默认判据变量 | 量纲 | 换算规则 | 无变量时 |
|---|---|---|---|---|
| Tasc / Acol(Aerotran) / Hetran | ExcessSurfDirty |
百分数 | 原值即 %(如 3.32 = 3.32%) | — |
| Aple(板式) | AreaRatio |
比值 | (v−1)×100(1.008 → 0.82%) |
— |
| PlateFin(Muse)(板翅式) | ExchCalc_AreaRatio |
比值 | (v−1)×100 |
— |
| Fire(加热炉)/ Teams(机械设计) | 无 | — | — | 判据 N/A,不参与 PASS |
统一 CLI(case1/case4/case5/case6/case7/edr_run_any 通用):
python case4_multimodule_batch.py --margin-low 10 --margin-high 30 # 指定验收带(默认就是 10–30%)
python case4_multimodule_batch.py --margin-low -1 --margin-high 1 # 窄带:官方示例(几何恰好够用)也能 PASS
python case4_multimodule_batch.py --margin-metric ExcessSurfClean # 覆盖判据变量(切洁净态)
python case4_multimodule_batch.py --margin-metric AreaRatio:ratio # 显式声明量纲(比值)
python case4_multimodule_batch.py --no-margin # 关闭余量判读(退回纯物理判读)
判据文本:PASS (xx.xx% in [10,30]%) / BELOW (偏紧/余量不足) / ABOVE (偏保守/可优化) / N/A。
case4 的报告(JSON/CSV/Markdown)含 margin 字段(metric/kind/raw/value_pct/band/verdict/ok)。
共享实现(examples/edr_common.py,各脚本零重复):
MARGIN_DEFAULTS(模块→判据表)、resolve_margin_metric(模块, override)、
margin_percent(原值, kind)(比值→百分数)、verdict_margin(v, low, high)、
margin_check(模块对象, ...)(自行抓取判带)、margin_from_results(已抓结果, ...)、
add_margin_args(argparse)(一键挂 CLI 参数)。
⚠️ 与 case3 的关系:
case3(设计→校核两段式)早在 v1.2.0 就有--margin-low/--margin-high/--metric,
本版仅将其本地判带函数替换为edr_common.verdict_margin共享版(行为完全不变)。
另注意(case3 实测铁律):锁定几何的源文件DesignBasisRatio不重定尺寸,余量权威值来自
Rating 结果——验收带只做"是否达标"的判读,不会代替 EDR 去寻优几何。
EDR 换热器设计是 先 Design(定几何)后 Rating(校核)。核心开关是输入标量 TascProgMode:
1=Design(几何是结果)/ 2=Rating(几何是输入)/ 3=Simulation(算出口温度)。
切换后 Run() 即按对应模式重算。
致命细节(实测):Design 运行不会把定出的几何写进 Rating 输入——切回 Rating 时几何输入
会复原成文件原值。所以"设计→校核"必须显式把 Design 几何结果写回 Rating 输入,且要完整传递
(遍历 Rating 输入、凡 Design 结果里有同名值的都回写;只改壳径/管长/折流板会破坏几何自洽)。完整机制、
变量表、4 文件验证数据见 references/design_rating.md 与 references/com_recipes.md §11;
可运行范本 examples/case3_design_then_rating.py(一次会话对 4 文件跑通两段式,输出 JSON+CSV)。
速查(4 个竞赛源文件真机结论,全 Tasc 模块、原文件均 Rating 模式):
| 文件 | 设计面积 m² | 校核-原几何 污垢余量% | 校核-设计几何 污垢余量% |
|---|---|---|---|
| E0302 一级氢氰化原料2号预热器 | 3.746 | 42.89 | 0.01 |
| E0305 异构化预热器 | 6.359 | 35.41 | 9.76 |
| E0204 详细设计 | 2.593 | 33.68 | 12.89 |
| E0301 详细设计 | 8.883 | 49.58 | 1.46 |
设计几何回校核后余量全落在 0–13%(恰好够用);原几何普遍富余 33–50%。
面积余量验收带(设计判据,默认 10–30%):换热器"面积余量/过设计" = (实际面积−所需面积)/所需面积,工程常用 10%–30% 作设计余量带(默认),可由用户按习惯指定。脚本 case3 在两道校核后把结果 ExcessSurfDirty(默认,污垢态)或 ExcessSurfClean(洁净态)与 [low, high] 比对,给出 PASS / BELOW(偏紧) / ABOVE(偏保守):
python case3_design_then_rating.py # 默认带 10%~30%,判据=ExcessSurfDirty
python case3_design_then_rating.py --margin-low 10 --margin-high 30
python case3_design_then_rating.py --metric ExcessSurfClean
重要事实(实测):本机 4 个竞赛"详细设计"源文件几何已锁定(DesignFixSizes=2、BasisForDesign=1),EDR 设计模式不会按目标余量重定尺寸——设 DesignBasisRatio=1.1/1.2/1.3 定出的几何与余量完全相同。因此余量的权威值来自 Rating 结果,而非设计输入;若项目要求 10–30% 设计余量,需手动上调几何或放开锁定让 EDR 搜索寻优。验收带的作用就是把"余量是否达标"自动化判读(默认带下 4 文件设计几何判据:E0204=PASS,其余 BELOW 偏紧)。详见 design_rating.md §7、com_recipes.md §11.1/§11.2。
AspenEDR.exe 会让下一次 Dispatch 永久挂死、无任何输出(真机连踩 2 次)。每次会话第 0 步先 taskkill /F /IM AspenEDR.exe;批处理每个案例前后都要清。for-in:coll.Item(i)、coll(i) 全部返回 None(Count 属性正常)。正确写法 for s in tasc.Scalars: s.Name。_FlagAsMethod:arr.Values 不带参直接求值成首元素 float,之后 arr.Values(1) 报 'float' object is not callable;先 arr._FlagAsMethod("Values"),再 arr.Values(i) / arr.Values(i, "kW")(1 基下标)。Dispose() 不一定关进程(EDR V8.8+ 是 .NET/COM Interop,对象释放靠 GC);FileExit() 也可能留壳。清理五连:FileClose → Dispose → taskkill,脚本结束用 tasklist 验证。Value("kg/s") 读取时按指定单位返回;Value = x 按当前 Uom 解释。要按指定单位写,先 .Uom = "kg/s" 再赋 Value(改 Uom 不换算原值)。BJACApp.UomSet 只对之后新建的应用生效;已加载应用改 IATVApp.UomSet(1=US/2=SI/3=METRIC/4-6=用户集);单个变量用 .Uom。CanRun=False 也能 Run(文件带历史结果时 HasResults=True、CanRun 反而 False);判运行成败看 Run() 返回码(0=成功,-1=输入不完整,10xx=许可证类,11xx=引擎异常,1200=文件格式不识别)。FileOpen 会先卸载当前文档(未存盘即丢);FileNew 不指定 appName 会弹 GUI 对话框挂死脚本——自动化必须显式传 "Tasc" 等名字;新建文件落盘前默认名 UNTITLE.BJT,务必 FileSaveAs 指定路径。copy 到工作目录再 FileOpen;结果另存 _run.edr。references/tasc_variables.md 对所有 TASC 案例通用,无需逐案例普查;但跨模块(Acol/Aple/Fihr…)变量集不同,换模块时先跑普查(examples/case2_variable_survey.py)。TascProgMode 切换,不是两套文件:输入标量 TascProgMode = 1 设计 / 2 校核 / 3 模拟(references/design_rating.md §2)。Design 运行不会把几何写进 Rating 输入——切回 Rating 时几何输入复原;"设计→校核"必须显式把 Design 的几何结果(同名变量 ShlID/TubeLng/BafNum…)完整写回 Rating 输入,且回写在 TascProgMode=2 之后、Run() 之前。只回写 3 个几何会破坏自洽(实测 E0204 负余量、E0301 异常高余量)。FileOpen 并计算,无需 EDRVerCtl.exe 切换;仅当报 1200(格式不识别)才需切版本。(实际面积−所需面积)/所需面积,工程默认带 10%–30%(--margin-low/--margin-high 覆盖,--metric/--margin-metric 切判据变量)。case1/4/5/6/7 与 edr_run_any 判读时默认自动纳入该带:物理合格但越带 → MARGIN_FAIL;--no-margin 关闭。判据按模块自动取(量纲不同):Tasc/Acol=ExcessSurfDirty(百分数)、Aple=AreaRatio(比值,脚本自动 (v−1)×100)、PlateFin=ExchCalc_AreaRatio(比值)、Fire/Teams 无余量变量→N/A 不参与判读。case3(设计→校核)v1.2.0 起有同款验收带,判带函数已复用 edr_common.verdict_margin。⚠️ 竞赛"详细设计"源文件几何锁定(DesignFixSizes=2),DesignBasisRatio(设计过设计率输入,须 ≥1.0;<1.0 → rc=1250)不改尺寸——余量权威值来自 Rating 结果,不是设计输入;要真按 10–30% 定几何须放开锁定让 EDR 搜索寻优。Fire(真机坑):GetApp("Fihr")/GetApp("FiredHeater") 都返回| 文件 | 用途 |
|---|---|
references/com_recipes.md |
⭐ V11 原生 COM 实测配方(11 节,首选参考) |
references/design_rating.md |
⭐ 设计→校核两段式工作流(TascProgMode 映射 + 几何传递机制 + 4 文件验证表 + 校核判据变量) |
references/tasc_variables.md |
TASC 管壳式关键变量名表(按功能分组,真机 dump 精选) |
references/multimodule_variables.md |
⭐ v1.3.0 多模块变量速查(Acol/Aple/Fire/PlateFin/Teams 关键结果/输入变量,真机 survey,含 GetApp 名坑) |
references/tasc_vars_dump.json |
TASC 全量变量快照(519 输入标量/294 输入数组/846 结果标量/460 结果数组,Liquid-Liquid_AEL.EDR 实测) |
examples/edr_common.py |
⭐ 公共 COM 助手库(进程卫生/连接/普查/读写/运行/清理五连);v1.4.0 新增面积余量验收带共享 helpers(MARGIN_DEFAULTS/resolve_margin_metric/margin_percent/verdict_margin/margin_check/margin_from_results/add_margin_args) |
examples/edr_run_any.py |
⭐ v1.3.0 通用跨模块引擎:自动解析模块名、普查、改输入、Run、抓结果、清理(resolve_module 内置 Tasc/Acol/Aple/Fire/PlateFin/Teams 候选);v1.4.0 起支持 --margin-low/--margin-high/--margin-metric/--no-margin 余量验收 |
examples/case1_tasc_rating.py |
管壳式校核全流程:改流量 → 运行 → 面积余量/压降/出口温度;v1.4.0 起每次重跑后按用户指定验收带判读(真机通过) |
examples/case2_variable_survey.py |
任意 .edr 变量普查:四集合 dump 成 JSON + CSV(真机通过) |
examples/case3_design_then_rating.py |
⭐ 设计→校核两段式:4 竞赛源文件真机跑通(Design 定几何 → 完整几何传递 → Rating 校核,输出 JSON+CSV) |
examples/case4_multimodule_batch.py |
⭐ v1.3.0 多模块 11 案例批量运行器:覆盖 Tasc/Acol/Aple/Fire/PlateFin/Teams,输出 JSON+CSV+Markdown 报告;v1.4.0 起判读纳入用户指定面积余量验收带(越带 → MARGIN_FAIL) |
examples/case5_aircooled.py |
v1.3.0 空冷器(Acol)可读独立示例:运行 → 读热工/风机结果 → 判读(v1.4.0 起含面积余量验收带,判据 ExcessSurfDirty) |
examples/case6_plate.py |
v1.3.0 板式(Aple)可读独立示例:运行 → 读热负荷/面积/压降/板片数 → 判读(v1.4.0 起含面积余量验收带,判据 AreaRatio 比值自动换算) |
examples/case7_firedheater.py |
v1.3.0 加热炉(Fire)可读独立示例:运行 → 读热负荷/效率/温升/热通量 → 判读(含 Fire 解析坑;Fire 无面积余量变量 → 判据 N/A) |
FlRaHS 875000→1050000 lb/h(+20%)→ Run 0.3 s 返回 0:ExcessSurfDirty 3.32%→-35.78%(面积不足报警合理)、AvgSSvelocity 1.67→2.01 ft/s、PresDropCrossFlowSS 1.77→2.46 psi、LMTD 6.69→5.53 °F、冷侧出口 98.6→100.7 °F——全部物理方向正确;arShellDuty 两壳程 4291764/4461617 BTU/h,_FlagAsMethod + 单位参数取值 1257.8 kW 正确。TascProgMode 映射实测确认:1=Design(Area 为所需面积)、2=Rating(几何为输入、Area 为实际面积)、3=Simulation;case3_design_then_rating.py 一次会话跑通 4 文件,输出 design_rating_report.json + .csv。case3 新增 --margin-low/--margin-high(默认 10/30)与 --metric,两道校核后自动判读DesignBasisRatio 探针(E0302):<1.0 → Run() 返回 rc=1250(非法);锁定几何下edr_run_any.py,resolve_module 真机确认各模块 GetApp 名;case4_multimodule_batch.py 一次会话跑通 11 案例,全部 Run() 返回 0、物理判读 PASS:multimodule_report.json / .csv / .md(位于用户指定 --work-dir)。edr_common.py 新增共享 helpers(MARGIN_DEFAULTS/resolve_margin_metric/margin_percent/verdict_margin/margin_check/margin_from_results/add_margin_args),单元自测全过(量纲换算/模块默认/override 后缀/判带边界)。case1 真机:默认带 10–30% 下"FlRaHS+20% 后 ExcessSurfDirty=-35.78% → BELOW、恢复原值 3.32% → BELOW";改 --margin-low 0 --margin-high 5 后同一数据 3.32% → PASS(用户指定带即时翻转判读)。case5(Acol,percent 判据 ExcessSurfDirty=0.0%)与 case6(Aple,ratio 判据 AreaRatio=1.008 → 0.82%,换算正确)默认带下均 MARGIN_FAIL;case7(Fire)判据 N/A → PASS。edr_run_any 真机:Tasc 输出 [margin] ExcessSurfDirty = 3.32% 带[10,30]% → BELOW 并写入报告;Fire 输出 N/A。case4 三组全量 11 案例(真机,全部 rc=0):默认带 10–30% → 3 PASS(Fire×2/Teams,N/A 不挡)+ 8 MARGIN_FAIL(Tasc×3/Acol×2/Aple×2/PlateFin×1,官方示例余量均在 0% 附近);窄带 --margin-low -1 --margin-high 1 → 11/11 PASS;--no-margin → 11/11 PASS(与 v1.3.0 行为一致,向后兼容)。报告 CSV 新增 margin_metric/margin_pct/margin_verdict 列。aspen-edr-automation/
├── SKILL.md # 本文件(v1.4.0)
├── references/
│ ├── com_recipes.md # ⭐ V11 原生 COM 实测配方(11 节,首选参考)
│ ├── design_rating.md # ⭐ 设计→校核两段式工作流(TascProgMode + 几何传递 + 验证)
│ ├── tasc_variables.md # TASC 关键变量名表
│ ├── multimodule_variables.md # ⭐ v1.3.0 多模块变量速查(Acol/Aple/Fire/PlateFin/Teams)
│ └── tasc_vars_dump.json # TASC 全量变量快照(真机)
└── examples/
├── edr_common.py # ⭐ 公共 COM 助手库(含 v1.4.0 余量验收带 helpers)
├── edr_run_any.py # ⭐ v1.3.0 通用跨模块引擎(resolve_module 自动解析模块名)
├── case1_tasc_rating.py # 管壳式校核全流程(真机通过)
├── case2_variable_survey.py # 变量普查工具(真机通过)
├── case3_design_then_rating.py # ⭐ 设计→校核两段式(4 文件真机通过)
├── case4_multimodule_batch.py # ⭐ v1.3.0 多模块 11 案例批量运行器(真机验证;v1.4.0 起含余量验收带判读)
├── case5_aircooled.py # v1.3.0 空冷器(Acol)可读独立示例
├── case6_plate.py # v1.3.0 板式(Aple)可读独立示例
└── case7_firedheater.py # v1.3.0 加热炉(Fire)可读独立示例
9c235f8b7069b531bb76cb03c0d0b6468a2bcfde655ade65162b8d3c967f5129