Aspen EDR自动化

作者 叶师兄 · 版本 1.4.0 · 更新于 2026-10-19 20:21 ·89.9 KB

通过原生 COM 接口自动化 Aspen EDR 换热器计算,支持管壳式、空冷器、板式、加热炉等模块的文件打开、变量读写、运行与结果判读。

AspenEDR换热器COM自动化Python流程模拟
5 下载29 浏览
将提示词发送给你的 AI,即可安装该 Skill
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_6eed38f8/aspen-edr-automation。

✓已通过基础校验

名称、分类、版本与作者信息完整,安装包与文档齐备。

✓可直接使用

提供 Markdown 文档与配置示例,下载后按文档说明使用即可。

Skill 详情

Aspen EDR 自动化(V11 原生 COM 配方)

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 的本地判带函数改为复用共享版(行为不变)。

⚡ 首选路径:读 com_recipes.md,用实测范本

在写任何自动化代码之前,先读 references/com_recipes.md——这是在真实 Aspen EDR V11.0 上逐点验证过的原生 COM 配方:

  • 连接与 ProgID(§1)、文件操作(§2)、应用对象 IATVApp 与模块名表(§3)
  • 数据访问(§4:Scalars/Arrays/ResultScalars/ResultArrays 四集合 + IATVScalar/IATVArray)
  • 变量枚举(§5:for-in 铁律 + dump 配方)、单位制三级控制(§6:UomSet 枚举表 + Value(unit) 换算规则)
  • 运行与状态(§7:Run 返回码 + CanRun/IsComplete/IsSaved/HasResults)
  • 进程卫生(§8:残留进程致命坑 + 清理五连)、错误码表(§9)、与 Aspen Plus/Simulation Workbook 的关系(§10)

本技能只保留实测验证过的原生配方。一切接口行为以 com_recipes.md 为准。

前提条件

  1. Windows,已装 Aspen EDR(实测 V11.0;本机另有 V14.0 但未注册 COM)且有有效许可证。
  2. 本机安装路径(非默认):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\。
  3. Python ≥ 3.7 + pywin32。⚠️ 本机实测可用的解释器:C:/Users/Eric Ye/.workbuddy/binaries/python/envs/default/Scripts/python.exe(系统 Python 无 win32com)。
  4. 版本切换:多版本共存时 COM 注册版本由 XEQ\EDRVerCtl.exe(Version Control Utility)控制;本机当前注册 = V11(ProgID 后缀 .37.0,V11=37、V12=38 依此类推)。
  5. 跨版本打开:实测 V12 的 .EDR 能被 V11 COM 引擎直接打开与计算(已用华东理工 E0204/E0301 两个 V12 文件验证),无需切换注册版本。若遇更高版本报 1200(文件格式不识别),再用 EDRVerCtl.exe 切到对应版本。

对象模型速览(真机 tlb 解析 + 官方文档双确认)

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.3.0 新增)⭐

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(加热炉)。

面积余量验收带(全模块,用户可指定,v1.4.0 新增)⭐

换热器"面积余量/过设计" = (实际面积−所需面积)/所需面积,工程常用 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 换热器标准顺序)⭐

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。

重要经验(均为 V11 真机实测,务必遵守)

  1. 残留进程是头号杀手:上一次会话留下的 AspenEDR.exe 会让下一次 Dispatch 永久挂死、无任何输出(真机连踩 2 次)。每次会话第 0 步先 taskkill /F /IM AspenEDR.exe;批处理每个案例前后都要清。
  2. 集合枚举只能 for-in:coll.Item(i)、coll(i) 全部返回 None(Count 属性正常)。正确写法 for s in tasc.Scalars: s.Name。
  3. 数组取值必须 _FlagAsMethod:arr.Values 不带参直接求值成首元素 float,之后 arr.Values(1) 报 'float' object is not callable;先 arr._FlagAsMethod("Values"),再 arr.Values(i) / arr.Values(i, "kW")(1 基下标)。
  4. Dispose() 不一定关进程(EDR V8.8+ 是 .NET/COM Interop,对象释放靠 GC);FileExit() 也可能留壳。清理五连:FileClose → Dispose → taskkill,脚本结束用 tasklist 验证。
  5. 读值可换算、赋值不换算:Value("kg/s") 读取时按指定单位返回;Value = x 按当前 Uom 解释。要按指定单位写,先 .Uom = "kg/s" 再赋 Value(改 Uom 不换算原值)。
  6. UomSet 三级:BJACApp.UomSet 只对之后新建的应用生效;已加载应用改 IATVApp.UomSet(1=US/2=SI/3=METRIC/4-6=用户集);单个变量用 .Uom。
  7. CanRun=False 也能 Run(文件带历史结果时 HasResults=True、CanRun 反而 False);判运行成败看 Run() 返回码(0=成功,-1=输入不完整,10xx=许可证类,11xx=引擎异常,1200=文件格式不识别)。
  8. 文件操作铁律:FileOpen 会先卸载当前文档(未存盘即丢);FileNew 不指定 appName 会弹 GUI 对话框挂死脚本——自动化必须显式传 "Tasc" 等名字;新建文件落盘前默认名 UNTITLE.BJT,务必 FileSaveAs 指定路径。
  9. 永远不动原件:官方示例与用户 .edr 先 copy 到工作目录再 FileOpen;结果另存 _run.edr。
  10. 变量字典按模块固定、不按案例变化:实测两个不同 TASC 案例(Liquid-Liquid_AEL 与 KettleReboiler_AKU)的四集合变量名逐字相同(519/294/846/460,零差异)——references/tasc_variables.md 对所有 TASC 案例通用,无需逐案例普查;但跨模块(Acol/Aple/Fihr…)变量集不同,换模块时先跑普查(examples/case2_variable_survey.py)。
  11. 设计/校核是 TascProgMode 切换,不是两套文件:输入标量 TascProgMode = 1 设计 / 2 校核 / 3 模拟(references/design_rating.md §2)。Design 运行不会把几何写进 Rating 输入——切回 Rating 时几何输入复原;"设计→校核"必须显式把 Design 的几何结果(同名变量 ShlID/TubeLng/BafNum…)完整写回 Rating 输入,且回写在 TascProgMode=2 之后、Run() 之前。只回写 3 个几何会破坏自洽(实测 E0204 负余量、E0301 异常高余量)。
  12. V12 文件 V11 引擎可直接开:华东理工 E0204/E0301(V12 存盘)能被本机注册的 V11 COM 引擎直接 FileOpen 并计算,无需 EDRVerCtl.exe 切换;仅当报 1200(格式不识别)才需切版本。
  13. 面积余量验收带默认 10–30%、可用户指定(v1.4.0 起全模块):换热器面积余量/过设计 = (实际面积−所需面积)/所需面积,工程默认带 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 搜索寻优。
  14. FiredHeater 模块名是 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)

验证状态

  • 真机(Aspen EDR V11.0 = 37.0.0.380,本机 2026-09-28):
    • Dispatch 连接 2.2 s;FileOpen 官方示例 Liquid-Liquid_AEL.EDR 成功;
    • 四集合枚举 519/294/846/460 全数 dump 落盘;
    • 改 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——全部物理方向正确;
    • 恢复原值重跑,10 项结果逐位复现;
    • arShellDuty 两壳程 4291764/4461617 BTU/h,_FlagAsMethod + 单位参数取值 1257.8 kW 正确。
  • 设计→校核两段式(2026-09-28,4 个竞赛级真实源文件):
    • TascProgMode 映射实测确认:1=Design(Area 为所需面积)、2=Rating(几何为输入、Area 为实际面积)、3=Simulation;
    • V12 文件(华东理工 E0204/E0301)被 V11 引擎直接打开计算,无需版本切换;
    • 完整几何传递机制验证:E0204/E0301 用"只回写 3 个几何"得到 -2.32%/60.39%(不自洽),改完整传递后回落到 12.89%/1.46%(设计几何恰好够用),物理方向正确;
    • 4 文件设计面积 2.59–8.88 m²;设计几何回校核后污垢余量全落 0–13%,原几何则 33–50%(普遍偏保守);
    • 现成脚本 case3_design_then_rating.py 一次会话跑通 4 文件,输出 design_rating_report.json + .csv。
  • 面积余量验收带 + DesignBasisRatio 实测(2026-09-28,v1.2.0):
    • case3 新增 --margin-low/--margin-high(默认 10/30)与 --metric,两道校核后自动判读
    • DesignBasisRatio 探针(E0302):<1.0 → Run() 返回 rc=1250(非法);锁定几何下
  • 多模块覆盖 + 11 案例批量(2026-10-14,v1.3.0 真机):
    • 新增通用引擎 edr_run_any.py,resolve_module 真机确认各模块 GetApp 名;
    • 四集合普查确认各模块变量规模:Acol 337/317/551/234、Aple 40/284/109/118、
    • case4_multimodule_batch.py 一次会话跑通 11 案例,全部 Run() 返回 0、物理判读 PASS:
      • Tasc×3(冷凝器 Area=2826/LMTD=68.6、再沸器 Area=235/LMTD=16.8、热虹吸 Area=404/LMTD=72.7)
      • Acol×2(水冷 Area=1836/风机 14.2 kW、烃类 Area=1.77e4/风机 115 kW)
      • Aple×2(水-水 Q=1.4e7/69 板、汽-水 Q=7.8e7/111 板)
      • Fire×2(QFiredHeater1 总负荷 17.4 MW/温升 198→370 °C/效率 85.9%、真空炉 46 kW/温升 310→400 °C)
      • PlateFin×1(Q=642.7 kW/MTD=15.7 °C/UA=32.9 kW/K/热平衡 −0.0058 闭合)
      • Teams×1(管束 3232 ft²/通道应力 3153
    • 3 个可读独立示例(case5/6/7)结构同 case1,分别覆盖 Acol/Aple/Fire,便于照抄改造。
    • 输出 multimodule_report.json / .csv / .md(位于用户指定 --work-dir)。
  • 面积余量验收带全模块 + PASS 判据用户指定(2026-10-15,v1.4.0 真机):
    • 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)可读独立示例
下载后解压即可使用

文件

文件名
c51e52efc2497eea53e96ebc8beb99a2.zip
大小
89.9 KB
SHA256
9c235f8b7069b531bb76cb03c0d0b6468a2bcfde655ade65162b8d3c967f5129
来源
本地
存储
COS

评论

暂无评分,欢迎发表第一条评价

还没有评论,来抢沙发吧

    版本历史

    1. v1.4.0最新2026-10-19
    发表新帖 联系我们 官方QQ群
    梦马论坛-以梦为马,不负韶华

    化工人的交流乐园

    联系我们

    • 投诉建议 相关侵权、举报、投诉及建议等,请发 E-mail:admin@meng.horse