o2DOMfactor 的「Boyd 2018 实测 0.10–0.20」、skimmerDOMEffAir 的 BOD₅ −51%、系统总氧的 Summerfelt 引用)—— 这是第四次。⇒ 写下一个数时先问:它是算出来的,还是量出来的?iRAS 项目从 2026 年初首发以来, 经历了 18 次重大版本升级, 每次都基于公开文献或工业项目实测数据校准, 不是经验调整。 本手册整合 v1.1 (2026 年 4 月) 物理框架重构 + v1.2 (热平衡建模) + v1.3 (工程化模块) + v1.4 (投资财务评价) + v1.5 (可研报告生成器) + v1.6 (站级设备 + UI 重构) + v1.7 (氧锥拓扑 + 系统排水重构 + 审计修复) + v1.9 (碳酸盐平衡求解 + o2 物理校准 + finance 零利率修复) + v1.9.1 / v1.9.2 (液氧消耗口径 + 蒸发系数量纲 + 通风口径 + 机械除湿机) + v1.9.3 (基线对齐与验证自动化) + v2.0.0 (热平衡架构重构 + 气液接触器) + v2.0.1 / v2.1 (缺陷修复 + 车间显热能量守恒 + 守恒类断言) + v2.2 (工况覆盖补盲 + 登记表声明自校验 + UI 审计 + 字段范围单一事实源) + v2.3 (第七轮审计处置: head 结构修复 + 加载路径钳制 + 曝气尾气入室 + 全局热工单源 + chart.js SRI) , 以及 v2.3 内后续四批工作 —— 简易模式 (自然通风车间自由空气节点求解 + 太阳辐射子系统首次建模)、池内曝气拓扑修正 (曝气强度约束 + sp 白名单跨模块同源)、车间模式三档 + 车间通风机建模、CO₂ 脱除机制澄清 + 浅池告警, v2.5 六批 (字段流转工厂化 + aerationMode 硬告警 configWarns + 空气曝气密度分界 40→30 + 空气曝气设计工况点与加载路径哨兵盲区 + 手册第 15 章追平代码), 直至 v2.6 (开源基建 + 液氧采购口径补生物滤池水侧耗氧 —— 氧锥按「鱼 + MBBR」选而液氧按「只有鱼」买, 锚定工况年耗 471 → 790 t) 与 v2.7 (财务 OPEX 基数接线修复 + 生物滤池设计 TAN 按盐度取行业口径 + NH₃ 独立校验 + 投饵率校准第一批 + 输入/结果分区重整) —— 的全部内容, 是 RAS 工程设计的完整参考。
〔v2.2 注: 本段此前停在 v2.0.0 —— v2.1 与 v2.2 两批工作都只加了下方的版本演进章节, 而没有更新这段总览。同一事实 (手册覆盖到哪个版本) 散布于封面副标题、封面页脚、本章标题与本段共四处, 改一处不改其余。已加入 t21 三文档判据, 下次漏改会转红。〕
〔v2.3.3 文档批订正: 上句最后一条不成立。 实测 v2.3 → v2.3.3 期间四处全部漏改而自检 29/29 全绿 —— 当前 29 项里管版本的只有 meta_version_consistency, 且只查 index 页内 meta。根因不是判据写漏了, 而是页面内自检运行在 index.html 的 DOM 里, 根本读不到 manual.html 与 README.md, 这个判据在浏览器内原理上就做不成 —— "t21 三次扩展全部落空"由此得解。现改由工具侧门禁 tools/check_doc_version.js 承担(node 可同时读三个文件), 四处口径已随本批订正到 v2.3.3。⇒ 纪律 12: 注释里写"已被断言覆盖"不等于真被覆盖 —— 声称有防线时必须同时给出该防线失败时的可见信号。〕
v1.0 在 calcStageLoad 中用 feedDesign = feedMax × peakFactor 算所有"日产污染物"。但 feedMax 已是日峰值, 再乘 1.2-1.5 在量纲上是"日总量再放大", 所有下游负荷被一刀切偏大约 17%。v1.1 严格分离三个时间尺度:
peakFactor 物理意义钉死: 代谢污染物 (TAN/O₂/CO₂) 小时峰值/全日均速率, 默认 1.5 (Timmons & Ebeling 2010 标准)。
| 类别 | 设备 | 选型基准 | 物理理由 |
|---|---|---|---|
| 慢动力学 | BF 滤池、反硝化、CO₂ 脱气、微滤、蛋分、UV | 日量 × safety | 菌膜代谢有惯性, HRT 数小时缓冲峰值 |
| 快动力学 | 鱼池增氧 (液氧)、BF 曝气风机 | 小时峰值 × safety | 氧气即时消耗, 投喂 30min 内 DO 可见底 |
v1.0 用 0.25 一刀切违背物种特性差异。v1.1 改为按物种 + 温度自动算:
| 物种 | o2BaseFactor | o2Q10 | 典型值 | 依据 |
|---|---|---|---|---|
| 鲑鱼 | 0.32 | 2.0 | 0.20-0.23 | Atlantic Sapphire / Davidson 2014 |
| 大菱鲆 | 0.28 | 2.0 | 0.21-0.22 | 黄海所 / 莱州东方海洋实测 |
| 罗非鱼 | 0.16 | 2.0 | 0.26-0.30 | Blue Ridge / FAO 实测 |
| 石斑鱼 | 0.18 | 2.0 | 0.28-0.32 | 南海所 实验数据 |
| 加州鲈 | 0.19 | 2.0 | 0.26-0.28 | 广东海大 |
| 鳗鲡 | 0.13 | 2.0 | 0.20-0.22 | 福建天马 (粉料代谢慢) |
| 对虾 | 0.31 | 1.3 | 0.40 | Boyd 2018 (Q10 偏低反映高温饱和) |
v1.0 没有 CO₂ 脱气塔模型 (仅在增氧节点扣 70% 写死)。v1.1 作为独立设备建模, 默认参数与 Delta Cooling Towers 工业项目实测对齐: G:L=3, 风压 2.5 kPa, 风机效率 0.60, 单次脱气率 65%。
v1.0 大菱鲆 15/30/40 kg/m³ 偏低 (与莱州东方海洋等循环水项目实测 50-70 kg/m³ 不符)。v1.1 调整为 25/50/60 kg/m³。修正后大菱鲆综合成本从 81.5 元/kg → 48.1 元/kg, 与国家海水鱼产业体系 2019 调查数据 (46.32 元/kg) 偏差仅 +4%。
v1.1 设备 8 年 + 土建 20 年分别折旧, 加到日运行成本。引入完整 V_total = V_tank + V_process 建模 (典型 V_process 占 V_tank 的 30-60%)。换水率口径改为 V_total (行业标准 Timmons 2010 / 国家海水鱼体系)。详见第 8 章。
v1.1 把热平衡参数(气温/源水温/U 值/换气率) 放在每个阶段的 proc 字段里, 用户必须在每个阶段重复设置。
工程现实中这些是项目级常量。v1.2 把所有热平衡参数挪到顶部全局配置区
globalThermalConfig, 作为项目级常量影响所有阶段。新增地区预设(青岛/海南/挪威 Bergen/法罗群岛)、围护预设、4 工况对比(冬/夏/年均)。详见第 28 章。
v1.1 用单点能量平衡, 忽略车间空气节点。v1.2 改为双节点 Picard 迭代同时求解空气热平衡 + 空气湿平衡, 输出 T_room、RH、蒸发率/凝结率、热泵装机。详见第 29 章。
v1.2 引入完整车间围护参数: U_wall / U_roof / U_floor / U_window / windowRatio / airChangeRate / ventHeatRecovery / poolCover。详见第 28 章。
大型项目(>1000 t/yr)拆成多模块并联: 每模块独立循环, 模块间共用液氧站/应急电源/控制中心。每模块内部按容量上限自动配 N+1 备用 (主泵/风机/RDF/UV/热泵)。模块数完全由用户在阶段卡片"🔧 套数" subSystemCount 决定。详见第 26 章。
用户给"每套池数 + 池深", 工具按总水体反推单池直径 D = √(4V/πH)。自动检查工程合理性: D < 4m / D > 30m / D > 20m 配 H < 3m 给告警。SPECIES_DB 各鱼种各阶段加入推荐池深 recDepth_m。详见第 27 章。
独立的 pid.html 查看器, 主页面"📐 输出 P&ID"一键打开, 自动渲染主流串联 + 3 条旁路 + 公用工程 + 仪表泡泡 + 联锁线 + 设备表。LOX 跟随阶段切换。详见第 30 章。
独立的 equipment.html 页面, 一键导出当前方案完整设备规格表, 含 N+1 备用展开 + 单价 + 合计金额, 支持打印/导出 PDF。详见第 31 章。
v1.3 早期版本中池深有两个独立输入(阶段卡片头 + 热平衡区), 容易混淆。v1.3.x 统一为一个数据源: stage.poolDepth_m → recDepth_m → proc.poolDepth → 1.5。同时用于池径反推 + 热平衡。详见第 27.5 节。
各阶段独立估算的散热相加 × thermalSharingFactor (默认 0.75) = 全场总散热, 反映多阶段共享车间的工程现实(共享外墙节省散热约 25%)。详见第 29.7 节。
V_process 加入集水池项 V_sump = clamp(Q/30, 20, 200) m³, P&ID 加入 S-101 标识。
v1.3 输出停在工程概算 (CAPEX 万元 / OPEX 元/kg), 用户拿这个数据再去 Excel 手算财务评价 (NPV/IRR/回收期) 是当前主要的工作流痛点——一份可研报告里财务评价占 30% 篇幅, 设计院通常要花 1-2 周做完。 v1.4 加入独立的投资财务评价页面 (finance.html), 主页面"💰 投资财务评价"按钮一键打开, 按发改委可研编制规范输出 8 张标准财务表:
用户在页面顶部填 17 个参数 (售价、项目年限、产能爬坡、自有资金比例、贷款利率、折现率、所得税等), 计算引擎用逐年现金流模型 + Newton-Raphson 求 IRR, 实时输出关键指标。 支持一键导出 Excel (用 SheetJS, 7 个工作表) 和打印为 PDF。详见第 33 章。
v1.4 财务评价 6 个关键指标的定义全部按国内可研规范:
| 指标 | 定义 | 判断 |
|---|---|---|
| 全投资 IRR (税后) | 项目所有现金流(不含贷款本息)的内部收益率 | > 折现率 = 财务可行 |
| 自有资金 IRR | 股东视角现金流(项目 CF + 贷款流入 − 还本付息)的 IRR | 有杠杆放大效应 |
| NPV (净现值) | 按折现率折算到 t=0 的累计现金流现值 | > 0 = 可行 |
| 静态投资回收期 | 累计净现金流首次 ≥ 0 的年份(线性插值) | RAS 项目典型 5-8 年 |
| 动态投资回收期 | 累计折现现金流首次 ≥ 0 的年份 | 静态 + 折现影响 |
| 盈亏平衡点 (BEP) | 满产年净利润 = 0 时的产量比例 | < 75% = 安全裕度大 |
从 v1.0 到 v1.5 共 1 年多时间, iRAS 完成了从"单页工程概算"到"完整可研工作流"的演进:
| 版本 | 发布 | 核心能力 | 用户工作流 |
|---|---|---|---|
| v1.0 | 2026-04 初 | 稳态浓度计算 + 设备选型 | 看几个数,自己再 Excel 加工 |
| v1.1 | 2026-04 末 | + 物理框架重构 + CAPEX/OPEX + V_total | 能给出综合成本元/kg |
| v1.2 | 2026-05 初 | + 全局气候 + 双节点热平衡 + 4 工况对比 | 挪威/海南都能算 |
| v1.3 | 2026-05 中 | + 多模块并联 + N+1 备用 + P&ID + 设备清单 | 工程化的设计输出 |
| v1.3.x | 2026-05 | UI 整理 + 池深统一 + 共用车间散热 | 用户体验细节打磨 |
| v1.4 | 2026-05 末 | + 投资财务评价 (NPV/IRR + 8 张表 + Excel 导出) | 报告级输出 |
| v1.5 | 2026-05 末 | + 可研报告生成器 (16 章扩展版 + 模板 + docx 输出 + 图表嵌入) | 从工具到工作流 |
v1.4 之前的输出层级停在工程数据 (P&ID / 设备清单 / 财务表 Excel), 用户需要把这些数据手动整合到一份 Word 可研报告里。 一份政府版可研通常 80-150 页, 设计院做一份要花 1-2 个月。v1.5 加入可研报告生成器 (report.html), 按发改委编制规范输出 16 章扩展版可研, .docx 格式, 大幅压缩可研撰写时间。
v1.5 严格遵循以下技术决策:
| 章 | 名称 | iRAS 自动化率 |
|---|---|---|
| 1 | 总论 | 85% |
| 2 | 项目背景与建设必要性 | 50% |
| 3 | 市场分析与建设规模 | 60% |
| 4 | 建设场址与建设条件 | 30% |
| 5 | 工艺技术方案 | 95% |
| 6 | 主要设备方案 | 100% |
| 7 | 土建/总图/公用工程方案 | 50% |
| 8 | 节能节水 | 70% |
| 9 | 环境影响评价 | 60% |
| 10 | 劳动安全卫生与消防 | 40% |
| 11 | 项目实施与组织机构 | 65% |
| 12 | 投资估算与资金筹措 | 95% |
| 13 | 财务评价 | 100% |
| 14 | 国民经济评价 / 社会效益评价 | 50% |
| 15 | 风险分析 | 70% |
| 16 | 结论与建议 | 80% |
加权平均自动化率约 70%, 用户需要补充的主要是项目身份信息 (业主名/地址等 20 字段)、场址自然条件、土建详细设计、消防/环评/安评等专项内容(这些必须由有资质机构出具)。
v1.5 在 docx 中嵌入 3 张自动生成的图:
图表生成路径: 浏览器侧 SVG → Canvas → PNG → docx ImageRun。中文字体使用系统 SimHei/Microsoft YaHei, 高清 2× DPR 渲染。
v1.5 之前, 液氧储罐 (V-901) 作为阶段级设备计入 calcCapex, 每个阶段独立挂一笔储罐 CAPEX。 但 RAS 工程实际是全场单点供应: 多个阶段共用同一座液氧站, 计 4 次显然错误。 4 阶段千吨级项目可虚报约 30 万元 CAPEX。
v1.6 把液氧储罐从阶段 CAPEX 剔除, 挪到全场"③ 站级设备"区域, 增加 calcSiteCapex(stages, eqPrices, allResults)
函数计算站级 CAPEX 并加入工程总投资。用户可在 ③ 区调整规格 / 数量 / 单价, iRAS 按全场日耗自动推荐:
单价按规模指数公式 P = 100,000 × (size/3)^0.6 取值, 经标准档列表:
1 t ≈ 5 万 · 3 t = 10 万 · 5 t ≈ 14 万 · 10 t ≈ 22 万 · 20 t ≈ 35 万 · 30 t ≈ 47 万 · 50 t ≈ 65 万 (元/罐)。
P&ID 图 (V-901) / 设备清单 / 可研报告 全部同步显示规格 + "全场共用"标注。
v1.6 把 iRAS 主页面从"一长条信息流"重构为可扫描的工程师视角:
<details open> 替代 <section>, 用户可按需折叠看不到的区| 项目 | v1.5 旧 | v1.6 新 |
|---|---|---|
| MBBR 单价标签 | "生物滤池单价 (元/m³)" | "MBBR 池系统 (填料+曝气配件, 不含池体/风机) — 元/m³ 填料净体积" |
| 设备规格清单 MBBR | 仅显示净填料体积 | 净填料 + 池总容积 (按 fillRatio 反推) |
| 投资概算单价 | "500 /h"(单位 bug) | "500 元/(m³/h)"(正确显示) |
| 设备选型上限 | 硬编码 (8 RDF / 60 m³ MBBR ...) | 按 modFlow 自适应(支持千吨级单模块) |
| 液氧需求量显示 | 仅在站级备注 | 阶段成本明细 / 设备清单 / 站级备注 共 3 处 |
| B45 边界钳制 | 百分比字段可超 100 | 19 个百分比字段强制 [0, 100] 钳制 |
| 报告 FCR 显示 | 没有 | 每阶段表加 FCR 列 |
| 打印优化 | 简单 hide button | A4 + 1.5cm 边距 + 阶段独立分页 + 灰阶图表 |
v1.5 代码已经修复但本手册之前未同步的几处公式:
| 章节 | 项目 | v1.5 旧手册 | v1.6 正确 |
|---|---|---|---|
| 4.2 | NO₃ 产生率 | NO₃ = TAN × η_bio | NO₃ = TAN × 1.0 (稳态质量守恒) |
| 8.2 | V_RDF | V = Q × 2/60 (HRT 2 min) | V = Q × rdfHRT_min/60 (默认 0.5 min v1.6, 可调 0.1-5) |
| 8.2 | V_BF (池总) | V = bioVolume × 1.3 (经验) | V = bioVolume / fillRatio (默认 50% → 2× bio) |
| 15.4 | CO₂ 单位换算 | 未明确 | 显式 × 10⁶ (kg/m³ → mg/L) |
| 29 | 双节点稳态 | 蒸发显热 Q_evap×λ 写在空气节点 | 移到水节点 (与代码一致) |
| 33.4 | 残值 | × 5% 笼统 | 设备 5% + 土建 20% (分别折旧) |
v1.6 之前, iRAS 在 UI 上已经有"主流路径 / 旁路(节能)"两个选项, 但 calcPumpPowerBreakdown / aerationSpec / OPEX
完全没区分 — 是"UI 假承诺"。v1.7 通过全网调研 (Linde SOLVOX cone / Pentair AES Speece / PR Aqua PPC / Global Seafood Advocate 2019)
确认: 国际主流大型 RAS 项目"more often plumbed in side stream configuration"。原因是氧锥操作压力 10-21 psi (玻璃钢上限) 或 1-3 bar (SOLVOX),
让主流全部过氧锥意味着主泵要承担额外 3-5 m 压头, 而旁路只让 10% 流量过高压锥, 主泵不过锥, 能耗显著下降。
v1.7 新增 5 个工艺字段 (PROCESS_DEFAULTS + UI 输入框 + 工程范围钳制):
| 字段 | 默认 | 钳制范围 | 工程对照 |
|---|---|---|---|
o2ConeTopology | mainline | mainline / bypass | — |
o2ConeHeadLoss_m | 3 m | [0, 15] | LHO 2-3 / Speece 5-10 / SOLVOX 110 至 15 |
o2BypassRatio (%) | 10 | [5, 30] | 国际主流 8-15% |
o2BypassPumpHead_m | 20 m | [5, 40] | 玻璃钢 20 / SOLVOX 25-30 |
o2BypassPumpEta (%) | 60 | [30, 85] | 高压泵典型 |
物理改动:
v1.7 之前, air 模式 (空气曝气) 只有 K-302 (BF 曝气风机), 缺鱼池主增氧风机。 这意味着温水鱼种 (罗非鱼 / 鳗鱼 / 对虾) 的大规模 RAS 设计无法用工具自动生成 — 而这是 80%+ 中国 RAS 项目的实际场景。
v1.7 加入 K-101 鱼池增氧鼓风机: 罗茨风机 + 微孔盘管曝气, 与 K-302 同口径 1+1 备 (鱼池主增氧故障即鱼窒息, 必须双机轮换)。P&ID / 设备清单 / 报告章节 / 财务测算 全链路同步, modulePerSpec 含完整规格 (风量 Nm³/min / 功率 kW / 风压 kPa / 效率 %)。
旧版工艺面板"RDF 反冲(%) 2%"是反冲管瞬时分流比, 但 4870 m³/d ÷ V_total = 101%/d 物理荒谬 (远超合理换水率 1-5%/d)。真相: RDF 反冲水绝大部分经污泥沉淀池回循环 (Sharrer 2010 实测 95-98% 清液回流), 真实穿越系统边界的废液由换水率决定。
v1.7 全面清理:
rdfBackwash / rdfBackwashPumpHead_m / rdfBackwashPumpEta 从 PROCESS_DEFAULTS / readStageProcFromInputs 删除V_total × exchangeDaily 算 (与"换水率"定义一致)v1.7 发布前进行了一次彻底审计, 覆盖 Level 1 (静态扫描) + Level 2 (jsdom 三工况数值验证) + Level 3 (核心计算函数逐项审查), 共发现并修复 27 项 bug:
| 类别 | 数量 | 代表问题 |
|---|---|---|
| 🔴 严重 | 8 项 | K-101 modulePerSpec 缺失 / 系统排水硬编码 7.5% / 报告增氧章节未区分拓扑 / air 模式无 K-101 描述 / DO 行硬编码 / #25 灾难性 bug(下文专述) / 23 处 *100 单位错误 |
| 🟡 中等 | 4 项 | pid.html isAirMode 反向判定脆弱 / v1.7 新字段未钳制 / TSS chip 标签不清晰 / finance-core.js OPEX 70/30 硬编码 |
| 🟠 精度优化 | 4 项 | 蛋分 DOM 移除公式重构为严格物料守恒 / AOP 臭氧剂量字段化 / CO2 风压钳制 [0.3, 10] 补全 / T_room 钳制 ±2°C → ±5°C |
| 🛡️ 鲁棒性 | 3 项 | 阶段计算 try/catch / calcCapex add() isFinite 保护 / 所有阶段崩溃 console.warn |
| 🟢 清理 | 8 项 | 液氧塔 silent fallback warn / 字符串补空格 / 删 P-602 死代码 / 注释更新 / drawMainPump 加 data-cx/cy / 删 skimmerWasteFlow 死字段 / IRAS_META.version 1.6.0 → 1.7.0 |
buildContext() 函数 return 时漏写 workflow 字段。workflow.* 引用全部失效。但因为 nunjucks 模板引擎"字段缺失即跳过"的优雅降级机制, 报告渲染不报错 — 模板里所有条件分支都默默走 fallback, 用户拿到的报告看起来正常但实际上增氧章节不区分液氧 / 空气曝气, 主泵参数走默认值不显示真实数值, DO 控制策略描述固定不变。*100 单位错误 (#25b) 的连锁修复。| 验证维度 | 结果 |
|---|---|
| jsdom 三工况主功能 (mainline / bypass / air) | ✅ 全通过 |
| P&ID 三工况渲染 (A-601 / V-901 / K-101 / P-602 / M-601 / K-302 各就各位) | ✅ 全通过 |
| 1000 t 大西洋三文鱼基准 vs SUMMARY 核心指标 | ✅ 100% 吻合 |
| JSON 加载兼容性 (v1.5 / v1.6 / v1.7 / 缺 aerationMode / 缺整个 proc 5 种降级场景) | ✅ 全通过 |
| finance 完整闭环 (buildPIDExport → calculate → sensitivity) | ✅ 全通过 |
| Level 3 审查 6 大块 (总线 / v1.6 同款 9 项 / 热平衡 / CAPEX / 站级 / 累加) | ✅ 全部已审 |
📌 历史数据:本章记录的是 v1.7 当时的成本基线,用于说明氧锥 mainline / bypass
两种拓扑的差异。这些数字已被 v1.9 / v1.9.2 / v1.9.3 / v2.0.0 / v2.1 多次重算覆盖,
不代表当前版本。当前基线见「v2.1 → v2.2」章节与主页自检基线
(?selftest=1)。结论层面的 mainline vs bypass 对比仍然成立。
对比 mainline 与 bypass 两种氧锥拓扑在挪威 Bergen 气候下的全工况成本:
| 项目 | mainline (主流串联) | bypass (旁路高压) | 差异 |
|---|---|---|---|
| 工艺指标 | |||
| 系统总水体 V_total | 5,183 m³ | 5,183 m³ | — |
| 循环流量 Q | 10,155 m³/h | 10,155 m³/h | — |
| 主泵 P-101 功率 | 610.4 kW | 488.3 kW | -122.1 kW |
| 旁路泵 P-602 功率 | 0 (无) | 92.2 kW | +92.2 kW |
| 综合泵功率 | 610.4 kW | 580.5 kW | -29.8 kW (节能) |
| o2DailyTotal (全场日峰值) | 1,113 kg/d | 1,112 kg/d | ~0 |
| A-601 峰值供氧 | 41.20 kg/h | 41.20 kg/h | — |
| CAPEX | |||
| 设备 CAPEX | 4,454 万元 | 3,842 万元 | -612 万元 |
| 工程总投资 CAPEX (× Lang 2.2) | 9,800 万元 | 8,454 万元 | -1,346 万元 |
| 运营成本 (元/kg) | |||
| 年总成本 (含折旧) | 3,670 万元/年 | 3,540 万元/年 | -129 万元/年 |
| OPEX (不含折旧) | 28.46 元/kg | 28.30 元/kg | -0.16 |
| 综合成本 (含折旧) | 36.70 元/kg | 35.41 元/kg | -1.29 |
| 财务指标 (售价 60 元/kg, 30/70 融资 @ 5%/8y, 折现 8%, 15 年) | |||
| 全投资 IRR | 14.90% | 17.31% | +2.41% |
| 自有资金 IRR | ~22% | 25.23% | +3% |
| 全投资 NPV (万元) | 5,779 | 7,031 | +1,252 |
| 静态回收期 | 6.19 年 | 5.57 年 | -0.62 年 |
| 动态回收期 | 8.63 年 | 7.42 年 | -1.20 年 |
| BEP (% 满产) | 62.3% | 57.9% | -4.3% |
工程结论: 1000 t 三文鱼项目采用 bypass 拓扑相对 mainline: 泵综合节能近 30 kW (年电费节省 17 万) + CAPEX 工程总投资节省 1,346 万 + 综合成本省 1.29 元/kg + 全投资 IRR 提升 2.4 个百分点 + 静态回收期缩短 0.62 年。 这与国际主流大型三文鱼 RAS 多采用 side stream 拓扑的工程实际一致 (Linde SOLVOX / PR Aqua PPC / Global Seafood Advocate 2019)。
| 工况 | 气温 | 源水 | v1.3 综合成本 | 对照 |
|---|---|---|---|---|
| 青岛冬季 | -7°C | 4°C | 35.96 元/kg | 国内沿海三文鱼试点 |
| 海南冬季 | 17°C | 22°C | 37.70 元/kg | — |
| 海南夏季 | 32°C | 27°C | 40.47 元/kg | 制冷成本上升 |
| 挪威 Bergen 冬 | 0°C | 4°C | 36.30 元/kg | Atlantic Sapphire 60-70 (含人工/苗) |
iRAS 不计算人工 / 苗种 / 管理费等"软成本" (合计 15-20 元/kg), 综合成本通常比文献项目实际偏低。 对照 Nordic Aqua 宁波 (中国境内唯一商业化运营的 RAS 三文鱼项目, AKVA Group 技术) 2024 年 Q2 实测生产成本 41 元/kg (EUR 5.23/kg) — iRAS 36.70 + 软成本 ~5 元/kg = 41.7 元/kg, 与 Nordic Aqua 实测完全吻合 ✓
v1.8 由英文版团队主导, 引入碳酸盐平衡求解和 o2 物理校准。v1.9 是 NTNU validation memo 全面验证后的稳定版。中文版直接从 v1.7 跳到 v1.9, 与英文版同步。
v1.7 之前 iRAS 只输出"碱度需求" (基于硝化耗碱 7.14 g CaCO₃/g N), 不计算 pH / NH₃ 物种 / 缓冲强度 / 方解石饱和度。这使得工具:
v1.9 引入完整的碳酸盐物种平衡求解模块 (carbonate.js, 226 行), 平衡常数全部来自国际权威数据库:
对照 PyCO2SYS 1.8.3 (国际标准实现) 严格验证:
| 项目 | 偏差 |
|---|---|
| 正向 pH (free 标度) | max|ΔpH| = 1×10⁻⁵ |
| 反向碱度求解 | 0.08 μmol/kg |
| NH₃ 占比 | 1.5×10⁻¹⁶ (机器精度) |
| 方解石饱和度 | 0.006% |
详见本手册第 4 章 §4.5 碳酸盐平衡章节。
v1.9 在工艺面板新增"pH 控制"下拉, 提供两种模式:
大型海水 RAS (如 Atlantic Sapphire / Salmon Evolution) 普遍用"持目标 pH"模式, 精确控 pH = 7.0-7.2 以同时防 NH₃ 毒性 + 防 CaCO₃ 沉积堵塞设备。商业项目实测碱度 237 mg/L CaCO₃ (Good et al. 2018), 显著高于淡水默认 150。
v1.9 修正了一个潜伏的物理建模不一致:
metabRefTemp (三文鱼 15°C, 罗非鱼 28°C 等). 同一个代谢率驱动 O₂ 消耗与代谢热, 两处必须用同一参考温度.metabRefTemp. 同时等价重写 o2BaseFactor — 让数值在物种典型温度下不变.8 鱼种 o2BaseFactor 校准对照:
| 鱼种 | tempOpt | v1.7 (Q10@20°C) | v1.9 (Q10@metabRefTemp) | 数值变化 |
|---|---|---|---|---|
| salmon (三文鱼) | 15°C | 0.32 | 0.2263 | 等价 (0.32 × 2^-0.5 = 0.2263) |
| turbot (大菱鲆) | 16°C | 0.28 | 0.1980 | 等价 |
| tilapia (罗非鱼) | 28°C | 0.16 | 0.2786 | 等价 (0.16 × 2^0.8 = 0.2786) |
| grouper (石斑鱼) | 27°C | 0.18 | 0.2924 | 等价 |
| bass (加州鲈) | 25°C | 0.19 | 0.2687 | 等价 |
| eel (鳗鲡) | 26°C | 0.13 | 0.1970 | 等价 |
| mandarin (鳜鱼) | 25°C | 0.18 | 0.2546 | 等价 |
| shrimp (对虾) | 28°C | 0.31 | 0.30 | -3% (轻微下调) |
v1.7 之前 co2Daily 公式只算呼吸 CO₂:
但实际硝化反应也产 CO₂:
v1.9 修正:
1000 t 三文鱼成鱼期实测:
| 项 | v1.7 | v1.9 | 变化 |
|---|---|---|---|
| o2FishDaily × 1.375 (呼吸) | 700 kg/d | 700 kg/d | — |
| tanDaily × 6.286 (硝化) | 0 (漏算) | 521 kg/d | +521 |
| co2Daily 总 | 700 kg/d | 1221 kg/d | +74% |
影响: CO₂ 脱气塔规格按循环流量 × G:L 选型 (Summerfelt 2003 / 工程惯例), 不直接随负荷上升, 故 CAPEX 不变。但稳态鱼池 CO₂ 浓度会上升, 是 v1.9 引入碳酸模型后能从物理层面捕捉到的关键工况指标。
v1.7 之前 buildLoanSchedule 函数在等额本息分支:
当 r = 0 (零利率贷款 / 政策性贴息项目) 时分母为 0, 产生 NaN, IRR 算不出。v1.9 修复: r = 0 时自动降级到等额本金分支 (此时两者数学等价)。这是个边界 case, 多数项目利率 > 0 不受影响。
| 验证项 | 状态 |
|---|---|
| carbonate.js 中英文版输出一致 (4 工况) | ✅ max|ΔpH| = 0 |
| 8 鱼种 + mainline/bypass jsdom 全工况 | ✅ 9/9 通过 |
| salmon 1000t mainline 综合成本 (基准 36.70 元/kg) | ✅ 完全一致 |
| 所有工况 pH 在合理区间 [6.0, 8.5] | ✅ 9/9 通过 |
| 海水方解石饱和度 Ω 计算 (5/5) | ✅ 全部正常 |
| 淡水 Ω 为 null (符合物理) | ✅ 4/4 正确 |
| salmon NH₃-N 1.94 μg/L < 12.5 限值 | ✅ 合规 |
v1.9.1 与 v1.9.2 不是新增功能, 而是四处物理口径修正。它们在与英文版 v2.0 对表 (PORTING_NOTES) 和用户实测中暴露, 共同特征是: 影响运行成本、消耗品采购量与制冷装机, 但不改变任何设备选型结果。 所有修正都做了回归验证 — 设备容量计算式逐字未变。
v1.9 之前, 液氧采购量沿用 o2Demand 计算, 而该字段是设备选型口径, 含两个容量系数:
peakFactor (日→小时峰值, 默认 1.5) 与 sAerator (设备老化余量, 默认 1.10) 都是容量系数:
它们回答"设备要多大", 不回答"一年买多少氧"。液氧是按量计费的消耗品, 采购量只应被吸收效率放大。
两者混用导致液氧成本系统性高估 1.5 × 1.10 = 1.65 倍 (65%)。
| 指标 | v1.9 (错误口径) | v1.9.1 (修正后) | 文献 / 对照 |
|---|---|---|---|
| 液氧强度 (kg O₂/kg 饲料) | 0.44 | 0.266 | 0.25–0.30 |
| 年液氧消耗 (1000 t 三文鱼) | 527 t | 319 t | — |
| 储罐规格 (按 7 日储备) | 10.1 t | 6.1 t | — |
| 基准值验收区间 | 0.25–0.95 | 0.20–0.45 | 收窄至文献带宽 |
o2PeakSupplyKgH 与 o2Demand 的计算式逐字未变。
氧锥流量、储罐峰值供氧能力、K-101 风量等一切设备选型结果与 v1.9 完全一致。
改的是"买多少氧", 不是"配多大设备"。详见 15.7。
v1.9 之前代码注释声称蒸发系数 β 取自 ASHRAE 的 0.045–0.075 m/s — 这是错误出处。 ASHRAE / Carrier 的池面蒸发系数确实在 0.045–0.089 这个数值区间, 但它是定义在蒸气压差上的英制系数 [lb/(h·ft²·inHg)], 不能当作 ΔW × ρair 形式的 β [m/s] 使用。两者量纲不同, 直接套用高估约 13 倍。
v1.9.1 改用 Lewis 传热传质类比重新推导 (手册第 29.3 节自 v1.2 起给出的就是这个公式, 是代码实现偏离了手册):
| 实测量 | 变化 | 说明 |
|---|---|---|
| β 取值 | 降 12.4–14.9 倍 | 回到物理合理区间 |
| 蒸发率 | 降 2–2.4 倍 | 非 13 倍 — 因 W_room 自洽求解存在自补偿 |
| RH = 99% 饱和告警 | 消失 | 原告警是虚警, 由虚高蒸发率造成 |
用户报告了一个反直觉现象: 养殖密度降低, 制冷装机容量反而暴增。根因是一条纯几何的放大链:
但鱼的数量没变, 新风需求本不该变。实测: 密度从 80 降到 15 kg/m³, 通风量被放大 5.33 倍。 v1.9.2 把新风量改为按需求确定, 不再单纯跟随房间体积:
详细推导、CO₂ 系数取值与"为什么除湿不计入新风"见 28.6。
v1.9 之前遇到高湿工况只能建议"加大 ACH", 但湿热气候下通风不能除湿 (室外比室内还湿), 这条建议是无效的。 v1.9.2 引入机械除湿机模型 (开关 / 目标 RH / SMER / 冷凝水回收 / 冷凝热去向), 与双节点求解器耦合求解。 海南夏季模型算例: RH 从 92% 降到 70%, 除湿机耗电 1365 kWh/d, 但凝结放热从 2152 降到 1222 kWh/d, 总电耗基本持平。
物种 o2BaseFactor(鲑鱼 0.2263 @15°C,依据 Atlantic Sapphire / Davidson 2014)
是清水条件下鱼本身的生理耗氧。但商业鲑鱼 smolt RAS 养殖池实测显示,
池内氧呼吸速率随池内 TSS 上升而显著增加——增量来自悬浮固体表面附着的异养菌在池内直接耗氧,
这部分同样必须由氧锥/液氧供给,不是生物滤池 o2DOMfactor 涵盖的范围。
实现上 calcStageLoad 增加可选第 4 参 tssTank;TSS 不依赖 O₂,
故管线在 pass 1 解出鱼池 TSS 后一次回代即收敛,无需迭代。不传该参数时附加为 0,行为与旧版一致。
| 微滤机去除率 | 成鱼池 TSS | 池内耗氧系数 | 液氧年耗 |
|---|---|---|---|
| 90% | 3.0 | 0.358 | 441 t |
| 默认 75% | 3.4 | 0.382 | 471 t |
| 55% | 4.1 | 0.428 | 527 t |
| 40% | 5.0 | 0.477 | 589 t |
v1.9.2 之前 Q_metab 用 Schrama 式 106 × Q10^((T−T_ref)/10) × N × W^0.85。
系数 106 kJ/(d·kg0.85) 源自 Saravanan & Schrama (2012, PLoS One) 虹鳟饱食投喂实测
(文献区间 77–160,其中一值即 107),但该式没有投饵率变量。
用饱食系数套商业投饵率(鲑鱼成鱼 0.95% 体重/日)高估约 3 倍。
| 指标 | 旧 (Schrama 106) | 新 (氧当量) | 对照基准 |
|---|---|---|---|
| Q_metab (1000 t 鲑鱼) | 11030 kWh/d | 4053 kWh/d | — |
| 单位体重 | 1.11 W/kg | 0.32 W/kg | 维持代谢 0.11 (van Dam),摄食鱼为其 2–4 倍 |
为什么必须绑定:同一个代谢过程同时决定耗氧与产热,两者由氧热当量刚性联系, 不能各取各的文献值。v1.9 曾把两处的参考温度对齐(validation memo F1),但未对齐量级, 留下 3.85 倍的内部矛盾直到 v1.9.2。
Q_metab 现在实际是池内生物总产热
= 鱼呼吸 + 池内悬浮固体异养菌呼吸(因 o2FishDaily 含 TSS 附加项)。
两者的热都进水,计入正确;但引用该字段时不要再当作纯鱼类生理值去对文献。v1.9.2 的 DO 包线体检(8 鱼种 23 阶段)暴露出旧的差异化饱和度设定撑不住自身工况:
旧设定下罗非(115%)、对虾(110%)、石斑(140%)的包线仅 3.5–4.7 mg/L, 而实际耗氧降幅已达 3.8–6.8 mg/L,5 个阶段击穿、4 个临界。 温水种 DO 饱和浓度本就低(30°C 仅 7.0 mg/L vs 15°C 的 8.4),再配低过饱和度,包线薄到没有余量。
| 统一饱和度 | 击穿 | 临界 | 最小余量 mg/L | TGP |
|---|---|---|---|---|
| 旧(各鱼种不同) | 5 | 4 | −2.11 | 各异 |
| 130% | 4 | 3 | −1.33 | 106.3% |
| 140% | 2 | 2 | −0.54 | 108.4% |
| 150% | 0 | 2 | +0.21 | 110.5% |
| 165%(采用) | 0 | 0 | +1.22 | 113.6% |
本表只在纯氧模式(aerationMode = 'o2')下生效;空气曝气模式走另一套逻辑,
不受影响——低密度养殖仍应优先选空气曝气。
旧告警文案为「建议: 提高循环倍数或 DO 目标饱和度」。统一到 165% 后, 「提高饱和度」已成为危险建议——会把用户导向刚刚规避的气泡病风险。 v1.9.2 改为逐条计算四条出路的当前值、所需值与卡点:
| 工况 | 气温 / 源水 | OPEX | 折旧 | 综合成本 | 比电耗 |
|---|---|---|---|---|---|
| 青岛冬 | -7°C / 4°C | 28.26 | 9.27 | 37.53 | 9.5 |
| 海南冬 | 17°C / 22°C | 29.57 | 9.37 | 38.94 | 11.9 |
| 海南夏 | 32°C / 27°C | 29.95 | 9.43 | 39.39 | 12.6 |
| 挪威 Bergen 冬 | 0°C / 4°C | 28.27 | 9.28 | 37.55 | 9.5 |
单位元/kg 鱼;电 0.7 元/kWh、液氧 1.2 元/kg、饲料 12 元/kg;比电耗单位 kWh/kg·yr。 年液氧消耗 471 t(四工况一致 —— 液氧只随鱼载荷与池内 TSS 变化,与气候无关)。 本表为工艺运行成本口径(v1.9.2 两层成本模型的下层,已含维护/保险/补水/排污/折旧;再加苗种+人工+管理费即企业全成本)。 v1.9.2 起工艺运行成本为 37.01 元/kg、企业全成本 41.97 元/kg,口径定义见 21.1。
| 对比项 | mainline | bypass | 差 |
|---|---|---|---|
| 主泵 P-101 | 369.0 kW | 258.3 kW | -110.7 kW |
| 旁路泵 P-602 | 0 | 92.2 kW | +92.2 kW |
| 综合泵功率 | 369.0 kW | 350.5 kW | -18.4 kW |
| 氧锥规格流量 | 10155 m³/h | 1015 m³/h | 缩 10× |
| 工程总投资 | 11026 万元 | 9771 万元 | -1255 万元 |
| 综合成本(工艺) | 37.53 元/kg | 35.94 元/kg | -1.59 元/kg |
bypass 节能幅度从 v1.7 的 29.8 kW 降到 18.4 kW —— 主泵扬程从 12 m 降到 7 m 后, "旁路让主泵不过锥"这个优势的绝对值随之变小(省下的是 3 m 氧锥压损,占比从 20% 升到 30%, 但基数变小)。CAPEX 节省基本不变(氧锥按小流量定价,与扬程无关), 仍是 bypass 的主要收益来源。
本版不改动任何计算模型。?selftest=1 的 14 项基线逐位不变,
设备选型亦逐位不变 (mainline/bypass 对照的主泵 369.0 / 258.3 kW、旁路泵 92.2 kW 与旧表一致)。
改动集中在两件事: 把对外发布的数字与真实产品路径对齐, 以及把验证过程固化成可自动运行的测试。
v1.9.2 发布的四工况表无法用产品路径复现。尝试过三种气候口径:
| 口径 | 青岛冬 | 海南冬 | 海南夏 | Bergen |
|---|---|---|---|---|
| ① 冬夏都取该行温度 (自检所用) | 35.59 | 36.95 | 37.37 | 35.61 |
| ② 只覆盖冬、夏留 UI 默认 | 35.74 | 37.00 | 37.37 | 35.75 |
| ③ 只覆盖冬、不动 RH | 35.74 | 36.99 | 37.33 | 35.75 |
| v1.9.2 已发布 | 35.63 | 37.39 | 37.94 | 35.65 |
三种口径全部对不上, 判定为成本模型两层化之前的旧脚本残留。 现按口径 ① 重测并替换。这与 v1.9.2 审计发现的 32.65 元/kg 问题同源 —— 根因都是「验证路径与产品路径不是同一条」, 只是这次残留在文档侧而非代码侧。
SELFTEST_BASELINE 的 11 个数值工况里, 4 个大西洋鲑工况带 climate 覆盖
(冬夏同温的隔离口径, 用于隔离气候单一变量), 其余 7 个鱼种不带覆盖
(走 UI 默认气候: 设计冬 −7/4、设计夏 32/24)。两种口径对同一鱼种相差 0.1–0.5 元/kg。
数值本身没错, 但引用时必须注明是哪一种。
新增 tests/ 目录,npm test(等价于 node tests/run_all.js)一条命令跑十三项,任一失败则非零退出,可直接挂 CI:
| 脚本 | 覆盖 | 判定 |
|---|---|---|
t1_selftest.js | 内置 ?selftest=1 | 14 工况全 PASS(4 个受检字段)+ 两类不变量断言 + 面板渲染断言 |
t2_roundtrip.js | 存/取方案 | 改 65 个数值控件后 summary 全字段零漂移 |
t3_downstream.js | 下游页面数据链路 | 导出载荷与 finance / report 渲染文本均无 NaN |
t5_partial_freecooling.js | 部分自然冷却 + 年化 | 连续性收敛判据、截止点等值、两端极限、闭式解 vs 360 点、Jensen 方向、边界有限性 |
t6_thermal_scan.js | 热工况稳健性 | 8 鱼种 × 9 气候 × 3 工况 = 648 次调用 + 14 组病态参数,无 NaN / 越界 |
t7_amplitude_calibration.js | 年化振幅校准锁定 | 季节振幅锁在实测气候常值区间;锁 k / 积分点数 / 按热源设计温差 |
t8_leverage_bounds.js | 参数杠杆 + 反悬崖 | 合理区间内成本极差不超上界;单步跳变 ≤ 总极差 45% |
t9_fc_switch_feedback.js | 自然冷却开关反馈 | 三态文字齐全;灰显范围仅限专属参数 |
t10_elec_closure.js | 用电汇总闭合性 | totalAvg == 电 + 非电;覆盖空气曝气路径 |
耗时约 2–3 分钟(t8 要做约 25 次全场重算)。CI 单步超时请设到 5 分钟以上,或 SKIP_SLOW=1 node tests/run_all.js 跳过最慢两项。
全部通过真实 recomputeAll() 取数, 注入的 CDN 桩只覆盖渲染层。
另有 gen_baseline.js 由产品路径生成文档表格 ——
基线表今后应粘贴它的输出, 手抄正是本轮全部旧数的唯一来源。
主要矛盾不是「逼近温差取几 K」, 而是判据「非 0 即 1」。
旧判据 冷源温度 + 逼近温差 < 目标水温 一旦跨过, EER 从 3.45 跳到 20、Q 从 0 跳到全量,
两个量同时跳变 —— 阈值附近出现 5.8 倍的成本悬崖, 几 K 的假设差就能翻出 1 元/kg 级的差异。
ΔT_avail = T_target − T_冷源 Q_fc = min(K_fc · ΔT_avail, Q_load) K_fc = Q_design / ΔT_design EER_fc = EER_design · min(ΔT_avail/ΔT_design, 1) 1/COP_eff = (1−g)/COP_cool + g/EER_design g = clamp((T_hi−T_冷源)/(T_hi−T_lo), 0, 1)
Q ∝ ΔT 是精确的而非线性化近似 —— 由 ε-NTU: Q = ε·C_min·ΔT_in,
流量固定时 NTU 与 C_r 固定, 故 ε 为常数。
EER 随温差衰减的物理: 容量受限时风机仍满转, 寄生功率固定而换到的热变少。
计量边界: EER 只算冷源侧增量寄生功率 (风机 / 冷源泵), 不含工艺侧循环泵 ——
后者已在 pumpKwhDaily, 且板换工艺侧阻力已计入主泵扬程的「UV/板换 0.5–2 m」预算。
不划这条线会双重计数, 量级达百 kW。
经济截止点自动涌现, 且恰好连续。 仅当 EER_fc > COP_cool 才值得开风机;
而在截止点 EER_fc = COP_cool, 于是
E = Q_fc/COP_cool + (Q−Q_fc)/COP_cool = Q/COP_cool ——
两侧完全相等。悬崖不是被磨平, 是不存在了, 因为切换点正是两条路径边际成本相等之处。
故无需为截止点引入任何参数。
参数 freeCoolingApproach_K 换为 fcDesignDT_K, 语义由「悬崖位置」变为
「自然冷却单独扛满设计负荷所需的温差」。它是换热链的串联损失:
| 冷源 | 换热链 | 总温差 |
|---|---|---|
| 空气源(干冷器) | 工艺水 → 板换 2–3 K → 乙二醇环路 → 干冷器对空气 5–10 K | 8–13 K |
| 水 / 开式海水 | 工艺水 → 钛板换 2–3 K → 冷源水(双屏障再 +2–3) | 3–6 K |
| 地源 | 板换 2 K + 埋管对土壤 3–5 K | 5–7 K |
空气侧温差大, 因为空气 ρ·cp 小、同样热量需巨大风量, 受风机功率约束; 水-水板换换热系数高一两个数量级, 1–3 K 即可实现。 反推自校验 (1000 t 鲑鱼, Q_load ≈ 1081 kW): 开式海水得 3.1 K、干冷器得 11.4 K, 寄生功率对应 EER 50 与 22 —— 与手册区间吻合。 UI 留空即按热源自动取 (空气 11 / 水·海水 4 / 地源 6)。
自然冷却本质是「全年有多少小时可用」, 而阈值函数在均值处取值 ≠ 函数的均值(Jensen 不等式)。 旧模型切设计冬 → 判定全年可用(系统性高估); 切年均 → 判定全年不可用(系统性低估); 真值在中间, 而单点评估永远给不出中间值。
不引入新气象数据 —— 用现有三个温度点拟合正弦 T = T̄ + A·cos θ,
A = k·(夏−冬)/2, 对 T_air 与 T_source 用各自振幅、同相位摆动
(两者都由季节驱动, 夏季同时达峰), 逐点跑真实热平衡再平均。
闭式解亦有解析形式并保留为诊断量:
ḡ = [Φ(u_hi) − Φ(u_lo)]/(u_hi − u_lo),
Φ(u) = u − [u·arccos u − √(1−u²)]/π。
实测闭式解对贡献率是精确的(青岛 0.3826 vs 收敛数值 0.3826),
但能耗偏乐观 1–7% —— 因为它假定 Q_load 恒定, 而 Q_load 与冷源温度同向变化、
与比能耗正相关, 故 E[Q·f] > E[Q]·E[f]。这正是改用数值积分的原因。
点数取 24(半月步长): 实测 Ē 相对 360 点的误差, N=12 为 −1.24%~+1.03%, N=24 降到 0.15% 以内。 g 是钳位函数, 12 点在拐点附近求积误差可达 3%, 与要修的相关性效应同量级, 故不能停在 12。 成本: 单次点函数 0.009 ms × 24 × 阶段数 ≈ 0.9 ms, 可忽略。
| 地区 | 热源 | 设计冬 | 年均 | 设计夏 | 年化贡献率 | 年化 COP |
|---|---|---|---|---|---|---|
| 挪威 Tromsø | 开式海水 | 37.62 | 37.64 | 37.67 | 98% | 18.14 |
| 挪威 Bergen | 开式海水 | 37.66 | 37.95 | 39.07 | 73% | 7.82 |
| 智利 Puerto Montt | 开式海水 | 37.67 | 38.13 | 39.07 | 59% | 5.95 |
| 加拿大 Halifax | 开式海水 | 37.69 | 38.20 | 39.42 | 65% | 5.85 |
| 青岛 | 空气源 | 37.75 | 38.54 | 39.35 | 35% | 4.64 |
| 上海 | 空气源 | 37.80 | 38.81 | 39.54 | 19% | 3.93 |
| 三亚 | 开式海水 | 39.62 | 39.98 | 40.42 | 0% | 2.30 |
| Doha | 水源 | 39.24 | 39.68 | 40.26 | 0% | 2.68 |
t7_amplitude_calibration.js 锁死 ——
日后改动 k 或区域温度预设会在该测试响亮失败。t8_leverage_bounds.js 锁死——谁把阈值判据改回去,它会立刻失败。_fcSink = T_hp_source)。
实际常见「海水源热泵 + 干冷器自然冷却」或反之, 应为两个独立选项 —— 属 P3。salmon_bergen_w FAIL ——
那是预期行为, 说明该基线确实压在全量自然冷却的边界上, 应同步复核而非直接改基线。比电耗(kWh/kg·yr)与热泵电费(元/kg)是对外发布的核心指标,但 summary 里
此前没有对应字段——页面上的 kwhPerKgYr 只是热泵单项且分阶段。
因此这两个数进不了 SELFTEST_BASELINE、无法自检,至今只是「碰巧还对着」。
这是当时唯一一处对外数字完全没有护栏的地方。
本版补上五个出口:kwhPerKg(全场综合比电耗)、elecCostPerKg、
hpCostPerKg(热泵+除湿电费)、pumpShareOfElec、loxTonsPerYear,
并把前两者写入全部 11 条数值基线。
| 指标 | 旧发布值 | 产品出口实测 | 差 |
|---|---|---|---|
| 比电耗(青岛冬) | 9.7 | 9.51 | −2% |
| 热泵电费(青岛冬) | 0.29 | 0.21 | −28% |
| 液氧年耗 | 473 t | 471 t | 核对无误 |
根因:旧手推口径对臭氧与 BF 风机取了峰值,而年成本按 totalAvg × 365 计算。
产品路径的均值口径才与成本模型自洽。四工况表的比电耗列已按产品出口更新
(9.5 / 11.9 / 12.6 / 9.5),泵占电 57–75%。
aerationMode === 'air' 时增氧费用是主风机电费,
纯氧时才是液氧。旧手推完全漏了这一项——只因大西洋鲑走纯氧才碰巧对上 9.7,
换成空气曝气的鱼种就是错的。ozoneCostAvgDaily = ozoneCostDaily × feedRatio)。故电量在成本函数内部、紧挨 totalAvg 那一行计算,
复用它已经用的成本项再除以电价:口径天然一致,且可与 totalAvg 逐项肉眼对照——
将来新增用电项若在这里漏加,对照即可发现。tests/gen_baseline.js 里那份
重复手推实现也已删除,统一到产品出口。
模型一直按 N+1 给每个模块配备用(applyModularization),设备清单也把备用台数展开成
「N 台+1 备 ×M 模块」,但 calcCapex 是按工艺容量计价的(元/kW、元/(m³/h))——
备机只选型、不花钱。实证:把「套数」由 1 改到 5,备用台数随之变化而设备直购恒为 4360 万。
不能用 (N+备)/N——它对 N+1 备用正确,但对超配并联失效:
UV 是 2×75% 并联(installedKw = 需求 × 1.5)而 sparesCount = 0,
(N+备)/N 会算成 1.00,于是实际装 150% 却只按 100% 计价。
这是 v1.3 就存在、因从未按装机量计价而一直未暴露的漏算,本版一并修正(+35 万)。
原为 1+1,而臭氧四个阶段的 N 恒为 1,意味着 100% 冗余——成鱼期单台 286 万、备机等额, 单项就占备用增量的 48%。臭氧停机不像主泵那样 15–30 min 致鱼窒息,多数项目按「可短时降容」处理。 改为 2×50% 后装机 = 需求,不额外增加投资,任一台故障仍维持 50% 氧化能力。
| 阶段 | 备用增量 | 主泵 / RDF / 热泵 / 臭氧 的 N | 说明 |
|---|---|---|---|
| 苗种期 | 33.4 万 | 1 / 1 / 1 / 2 | 规模小,多数设备 N=1 → 冗余 ×2.00 |
| 幼鱼期 | 121.3 万 | 1 / 2 / 1 / 2 | RDF 已可拆 2 台 → ×1.50 |
| 中鱼期 | 182.5 万 | 2 / 3 / 2 / 2 | — |
| 成鱼期 | 288.8 万 | 2 / 4 / 3 / 2 | RDF ×1.25,冗余摊得最薄 |
| 全场 | 626 万 | — | N 随规模增长 → 冗余系数由 ×2.00 降至 ×1.25 |
备机与主机同样乘 ×2.2 工程放大系数(安装备用:管路阀门电气全通,可自动切换)。 结果:设备直购 4360 → 4986 万,折旧 8.07 → 9.14 元/kg, 工艺运行成本 35.74 → 37.33 元/kg。
同时新增加药计量泵 CAPEX 条目(此前有 1+1 备用规格却无计价条目, 按台计价 5000 元/台;按 kW 计价会差一个数量级), 并补 CO₂ 脱气塔风机的模块化规格(环路内转动设备,此前无规格故无备用)。 鱼池增氧鼓风机 K-101 原本就有 1+1(仅空气曝气模式生成),本版只做计价映射。
items[].qty 保持工艺容量不变——
自检的不变量断言拿 CAPEX 热泵 qty 与 hpInstalledKwOf 统一公式比对,
把备用乘进 qty 会让该断言失败。冗余系数只作用于 cost,
另存 spareRatio / costRun 供追溯。Σmax(冬,夏) 恒等于 max(Σ冬,Σ夏),移动不改变任何数字。工况对比表用 heatPumpKWh / 16(电耗÷16h),而正上方热平衡卡片用
热功率 ÷ 22h——同屏两个数差 14 倍(38 vs 548 kW)。
数据层的不变量断言抓不到:sCap 是渲染层局部变量,不落任何数据结构。
这条通用教训催生了 I 节的单一出口改造。
Math.min(0.999, COP_cool/EER) 在 EER < COP_cool 时,把「自然冷却永不经济」
硬拉成「几乎总经济」。模型实算:
| freeCoolingEER | 修前电耗 kWh/d | 修后 | 关闭自然冷却 |
|---|---|---|---|
| 1 | 6277(多耗 3.45×) | 1819 | 1819 |
| 2 | 3138(多耗 1.72×) | 1819 | 1819 |
| 3 | 2092(多耗 1.15×) | 1819 | 1819 |
| 3.45 | 恰好等于机械制冷 COP,两侧相等 | ||
改为 x ≥ 1 直接置 g = 0;freeCoolingEER 钳到 [1, 60]
(此前无上界,填 1e6 得电耗 0 且不告警)。界面新增一档提示
「自然冷却不经济(EER ≤ 机械制冷 COP,已自动改走机械制冷)」——开关不该静默失效。
modulePerSpec.heatPump 有 sparesCount=1,设备清单与 P&ID 都按 N+1 展开,
唯独 CAPEX 按 N 计价——是备用政策下唯一不一致的转动设备。备用增量 626 → 725 万。
11 条数值工况全跑设计冬;而 4 条大西洋鲑用冬夏同温的隔离口径
(T_air_design_winter = T_air_design_summer)⇒ 年振幅 = 0、24 点积分退化成单点。
结果:FC_ANNUAL_POINTS = 24 这条核心路径在内置自检里一次都没被真正执行。
已新增 salmon_qingdao_annual(不带温度覆盖,冬夏有真实温差),自检 14 → 15 项。
P2:CAPEX 的「支路泵合计」含氧锥旁路泵,但冗余映射只列了另外四条支路。 bypass 拓扑下旁路泵占该项 46%,当前两边恰好都是 1+1 故无数值误差—— 但那是巧合,一旦某条支路拆成 2+1,46% 权重就会套上错误系数。已补。
本项目两次栽在 Math.max/min(…, 常数) 上,两次都是外部审计发现的:
| clamp | 后果 |
|---|---|
Math.max(1 − R, 0.001) | 典型 RAS 单次稀释率仅 0.056%,默认换水率 4% 就在触发,NO₃ 被硬钳成同一个值、完全不响应换水率(v1.0 起的静默错误) |
Math.min(0.999, COP/EER) | EER < COP 时电耗是关闭自然冷却的 3.45 倍 |
为什么现有断言抓不到:这类错误不产生 NaN、不越界、不让 golden-master FAIL—— 它只是安静地把物理算错。唯一的可观测特征是「在正常工况下正在改变结果」。
把常数改到「不可能生效」的值(max→−1e30、min→+1e30),比对全场输出指纹。 指纹变了 = 该 clamp 正在生效 → 人工判定是物理边界还是静默改写。
分组二分:整组无变化即整组归档,有变化才拆半递归。 126 项候选只用 38 次 jsdom(逐个跑需 128 次)——因为绝大多数 clamp 根本不触发。
| 类别 | 候选 | 正在生效 |
|---|---|---|
| C! 极小常数(典型防除零写法) | 20 | 0 |
| C 待判定 | 60 | 2 |
| B 物理边界 | 38 | 2 |
| A 数值保护(常数 0/1) | 65 | 未测 |
4 处生效项逐条判定后全部为有意设计:集水池容积区间 20/200 m³(两端都生效,
苗种期走下限、成鱼期走上限)、BF 风机日均负荷比下限 0.5(硝化菌群基础曝气)、
自然冷却贡献率封顶 1。没有发现第三个 0.001 那类错误。
最令人担心的 COP 下限 1.5/1.8/2.0、蒸发系数 β 区间、RH 域,在正常工况下全部不触发——
它们是留给极端工况的余量。
CLAMP_INVENTORY.md;
哨兵 t11_clamp_census.js 秒级检出「悄悄多了一个没人测过的 clamp」,
完整扰动测试 clamp_probe.js 约 4 分钟、手动跑。审计的通用建议是「让装机 kW 只有一个 formatter 出口」。普查后发现消费点 不是 4 个而是 5 个:
| 消费点 | 口径 | 判定 |
|---|---|---|
| 热平衡卡片 | hpThermalKWh(t) / hpUtilH | ✅ |
| 工况对比表 | (本版已修,见 G 节) | ✅ |
| 设备清单 / 模块化 | hpInstalledKwOf(sim, 0.75) | ✅ |
| CAPEX 计价 | hpInstalledKwOf(sim, 0.75) | ✅ |
| summary.totalHeatPumpCapacityKw | 电耗 ÷ 小时数 | 🔴 差 27 倍 |
模型实算:青岛 36.6 kW vs 统一公式 997.3 kW;三亚 359.9 vs 1061.7。
它在 summary 里,会流进导出载荷、下游页面与可研报告,
而不变量断言的比对范围里从来没有它(只比 capex.items[].qty 与 modulePerSpec)。
另发现热泵利用小时的解析逻辑(Math.max(8, Math.min(24, …)))
被复制了 4 份——复制即分叉隐患:任何一份改了钳制区间,其余三份不会跟。
已抽出 hpUtilHoursOf() 作为唯一出口。
新增 t12 三层断言:① 数据层 summary == Σ hpInstalledKwOf;
② 源码层无重复实现;③ 直接读渲染出的 DOM 文本抓「装机 kW」与数据层比对——
这一层正是原断言的盲区。突变验证:把工况对比表改回 /16,
会复现出审计原文里的 38 / 308 / 174 kW 并被立即捕获。
鱼种限值表 NH3_LIMIT_UG_L 早已存在(v1.9.2 为自检而加:
鲑 12.5 / 大菱鲆 20 / 石斑 30 / 加州鲈·鳜·对虾 50 / 鳗鲡 60 / 罗非 100 μg/L),
同一行 tooltip 也写着「三文鱼 12.5 μg/L」,但判据写死 > 0.025(25 μg/L)。
后果:最敏感的鲑科用了 2× 宽松阈值,NH₃ 在 12.5–25 μg/L 之间仍显示绿色「正常」。
现改为三档:超限值红 / 超半限值黄 / 其余绿。
此前界面上完全没有显示——不是「缺告警」,是连数字都看不到 (它已由碳酸盐平衡算出并进了导出载荷)。现补一行,按 <0.8 危险 / <1.0 警戒着色。
| 鱼种 | Ω 实测 | 判定 |
|---|---|---|
| 大西洋鲑(30‰) | 0.45 – 0.58 | 全程欠饱和 |
| 大菱鲆(28‰) | 0.37 – 0.56 | 全程欠饱和 |
| 对虾(15‰) | 1.29 / 0.85 / 0.78 | 仅苗种期达标 |
| 罗非鱼 / 鳗鲡(淡水) | — | 不适用,不显示该行 |
这是模型算出的真实状态,不是告警实现问题:高密度 RAS 中 CO₂ 累积压低 pH, CO₃²⁻ 占比骤降。工程后果:Ω < 1 时水对碳酸钙不饱和, 持续溶蚀混凝土池体与水泥基砂浆(长期导致池壁起砂、露筋), 对贝类/甲壳类还影响钙化。对策:提高碱度 / 强化脱气 / 投加碳酸盐。
比电耗与热泵电费没有产品出口。summary 里没有对应字段
(页面上的 kwhPerKgYr 只是热泵单项、且是分阶段的), 因此这两个对外发布的核心指标
进不了 SELFTEST_BASELINE、无法自检, 现在只是碰巧还对着。
建议下一版补 kwhPerKg / hpCostPerKg 并纳入基线。
stageDays 串行累加,比电耗会被低估 2.3 倍(4.2 vs 9.7 kWh/kg·yr)。
本次以已发布的年液氧 471 t 作独立锚点反查确认。本版是自 v1.2 引入双节点热平衡以来最大的一次模型改动。热平衡代码 净减少 65 行;全部 13 条数值基线重算;自检 14 → 16 项, 新增 t15–t17 三类断言。
v1.2–v1.9.3 把 T_room 作为空气节点能量方程的解,自由漂浮、
无任何调节系统。后果:热带鱼种算出车间 9–14 °C / RH 99%。
而实测与规范一致指向「空气 ≥ 水温」:摩洛哥 Amghass 站实测车间均值 16.0 °C(鳟鱼水温 12–16); 大连河豚车间实测 22–23 °C(水温 17);ASHRAE HVAC Applications Ch.6 与 CJJ 122-2017 均要求空气比水温高 1–2 °C、RH 50–70%。方向反了 15–20 K。
v2.0 改为 T_room = T_水温(暖通维持),roomRH_set 默认 65% 可调。
由此删除:Picard 迭代、闭式解、T_room 钳位与「钳位时静默丢弃能量」缺陷。
池面显热 Q_pool_loss ≡ 0(温差为零)。
v1.x 中 CO₂ 脱气塔与 MBBR 曝气的气水直接接触量完全不在水侧热平衡账内: 三文鱼 1000 t 全场达 96,287 m³/h,是机械新风的 4.2 倍。
出口空气按水温下饱和计算,无需任何标定系数, 有两个独立领域的实测支撑:
热量用 Mollier 焓差 Δh = h(T_水, 饱和) − h(T_进气, RH_进气)。
v2.0 接入气液接触器后,自然冷却在冷天基本失效 —— 而那正是它原本最有价值的场景。
原因:两者用的是同一个物理资源 —— 室外冷空气:
自然冷却:室外冷空气 → 干冷器/板换 → 排走水的热 接触器: 室外冷空气 → 填料塔 → 排走水的热(顺带脱 CO₂)
而接触器是必开的(脱 CO₂ 是刚需),自然冷却是可选的。青岛设计冬接触器 排走 21,266 kWh/d,已达内部产热的 82%,水侧净转为需制热 —— 此时自然冷却无负荷可排。
| 工况(三文鱼 1000 t 青岛) | 水侧方向 | FC 贡献 g | FC 开→关 比电耗 |
|---|---|---|---|
| 设计冬 | heat | 0.00 | 12.57 → 12.57,Δ 0 |
| 年均 | cool | 0.13 | 11.54 → 11.59,Δ 0.049 |
| 设计夏 | cool | 0.00(室外 32 °C 过热) | Δ 0 |
UI 保留自然冷却开关,理由有三:① 年均工况仍有 13% 贡献,而年均才是能耗口径; ② 作为可关的对照基准;③ 真实工程可冬季降 G:L 减少接触器排热、把负荷让给自然冷却 —— 这是优化空间,模型暂未建。
新增诊断字段 fcUnavailReason 区分四种「不可用」:
off(用户关闭)/ not_cool(水侧需制热,v2.0 新增的主因)/
uneconomic(经济截止)/ no_dt(温差不足或冷源过热)。
此前 UI 只显示 freeCoolingAvailable = false,用户会误以为都是温差不够。
车间温度受控后,三部分负荷现已全部计入电耗:
| 分项 | 字段 | 状态 |
|---|---|---|
| 水侧热泵 | thermalCostDaily | v1.x 即有 |
| 除湿机(潜热) | dehumCostDaily | v1.9.2 即有 |
| 车间围护 + 通风显热 | hvacCostDaily |
v2.0 新增 |
T_room = T_w 后,车间与室外温差恒等于「水温 − 气温」:正 = 失热需加热,
负 = 得热需制冷。加热与制冷 COP 不同,必须分别取温度修正后的
COP_heat_corr / COP_cool_corr,不可对绝对值统一折算。
该项在寒冷地区与水侧热泵同量级:Bergen 设计冬 3,355 vs 2,847 kWh/d。
新增 hvacEnabled(默认 true),若由暖通专业单独计列可置 false。
co2StripperGtoL 3 → 5,新增 co2PackingHeight_m
1.5 m。依据 Timmons & Ebeling《Recirculating Aquaculture》Ch.10 p.244–245:
CO₂ 汽提 G/L 为 5:1–20:1(常规曝气才 <3:1,增氧是 0.003:1–0.05:1,
三个用途差三个数量级);填料高度限于 1.0–1.5 m,超 1.5–2.0 m 后收益递减。
Karimi 2020 实测 GLR > 5 无额外去除增益,Summerfelt 2003 最优 5.1 —— 四个来源一致。
比功率随之 3.47 → 5.79 kW/1000 m³/h 循环水量,进入 Summerfelt 等 2009 的 5–15 区间 —— 顺带解决 v1.9.2 审计 P4 记录的「低于文献下限」遗留问题。
v1.x 中 co2StripperEff 与 co2StripperGtoL 是两个互相独立的
参数,调高 G:L 只增加风量与电耗、去除率不变,与物理相悖。
新增 co2StripperEffMode:manual(默认,与 v1.x 逐位一致)/
auto(按 Ch.10 Fig 10.13/10.14/10.17 曲线自动算)。脱气塔面板新增
5 个输入框(效率取值 / 填料高度 / 风机全压 / 风机效率 / 水力负荷)与
实时诊断行,同屏显示单次去除率与比功率对标 —— 只显示去除率会诱导用户
一路上调 G:L,电耗代价必须同屏可见。
另重现 Fig 10.17:进风 CO₂ 本底 350 → 1000 ppm 时去除率降 10%,5000 ppm 时降 70% —— 这是「尾气必须排室外、不得回车间」的量化依据。
依据 Timmons Ch.3 Table 3.1。v1.x 对全部鱼种统一取冷水标准 (TAN 1.0 / TSS 15),相当于把冷水鱼的标准套在温水鱼上 —— 对温水鱼种 TAN 严 3 倍、 CO₂ 严 2 倍,造成告警误报(罗非 TAN 实测 0.7–0.97,旧阈值 1.0 下逼近红线, 按教科书应为 3.0)。
| 参数 | 温水鱼 | 冷水鱼 | v1.x(统一) |
|---|---|---|---|
| CO₂ mg/L | 30 | 20 | 20 / 海水 15 |
| TAN mg/L | 3.0 | 1.0 | 1.0 |
| TSS mg/L | 20 | 10 | 15 |
温水/冷水按养殖水温 ≥ 20 °C 判定(教科书两类为 24–30 与 10–18 °C)。 ⚠ 水质限值在本工具中是告警层,不参与选型与流量计算 —— 与教科书 Ch.3 的 「约束驱动流量」方法论不同,本项修的是告警正确性。
新增的 t17 断言实测发现三处参数组合在物理上不可行。共同点:
density 或耗氧系数在某个版本被调高,而 turnover 未同步 ——
每次改动单独看都对,组合起来把参数推到物理不可行区。
| 鱼种/阶段 | 原状态 | turnover |
|---|---|---|
| 鳗鲡 养成期 | 出池 DO = 0.00 mg/L(完全耗尽),CO₂ 超阈值 44% | 2.5 → 5.0 |
| 鳗鲡 黑仔期 | 出池 DO 0.69(阈值 5.09) | 3.0 → 4.5 |
| 罗非 苗种期 | 出池 DO 3.20(阈值 4.70) | 6.0 → 8.0 |
| 大菱鲆 中鱼期 | 池内 CO₂ 15.2(阈值 15) | 2.5 → 3.0 |
以鳗鲡为例:v1.9.2 把养成期密度由 40 上调至 120 kg/m³(为修正 CAPEX 失真), 同版新增 TSS 附加耗氧项 —— 高密度下该项占总耗氧 67%, 两者叠加使出池溶氧归零。
v1.x 起有 7 条基线没有 climate 字段,因而全部跑在默认地区
青岛 —— 罗非(28 °C)/ 石斑(27 °C)/ 对虾(30 °C)在 −7 °C 的青岛过冬,
这些组合工程上不存在。接触器项接入前气候影响有限,该配对错误不显;
接入后气候成为主导项,温水鱼种比电耗被推到 15–30 kWh/kg(行业实测上限为
Atlantic Sapphire 丹麦的 13.6)。
现按实际配对:温水淡水(罗非/加州鲈/鳜鱼/鳗鲡)→ 上海; 温水海水(石斑/对虾)→ 三亚;冷水(三文鱼/大菱鲆)→ 青岛/Bergen/海南。 比电耗全部回到 9.8–19.6。
新增 salmon_sanya_annual —— 冷水鱼种 × 热带气候。
这是当前行业热点,也是接触器项最关键的场景,此前无任何基线覆盖。
t15 风量平衡 —— 断言 A:设备层独立扫描出的每个「会动风」设备必须已在 气路拓扑登记(判据只看字段名形态,不读登记表,否则退化成「把实现抄一遍」); 断言 B:拓扑中接触水的气流风量合计必须等于热平衡实际计入量。该断言在 v2.0 之前 会立刻失败,正是它把 96,287 m³/h 未入账固化为可执行测试。
t16 接触器物理锚 —— 复现 Karimi 2020 实测工况。采用有界检验 而非精确匹配:检验出口状态、潜热占比(>80%)、Δh 符号(湿热气候养冷水鱼 必须为负)与量级有界(0.9–1.5×)。理由:理想 Mollier 计算必然高于实测 (论文自身外推 y = 0.9361x),而结构错误会翻转工程结论,精度差 20% 只影响数值。
t17 鱼种参数库水质自洽性 —— 硬约束(出池 DO / 池内 CO₂ / TAN / TSS) + 余量哨兵(<10% 告警)+ 负荷指标(饲料/流量比)。
| 参数 | 默认 | 说明 |
|---|---|---|
roomRH_set | 65 % | 车间设定相对湿度。T_room = T_w 后,池面蒸发只依赖本参数 |
contactorRecovery | 0 | 接触器排气热回收率 0–0.95 |
hvacEnabled | true | 车间显热是否计入能耗 |
co2StripperEffMode | manual | 脱气效率取值方式 |
co2PackingHeight_m | 1.5 m | 填料层高度 |
co2MaxAttainableEff | 80 % | G:L=20 时最大可达去除率 |
co2IntakeCO2_ppm | 350 | 脱气塔进风 CO₂ 本底 |
| 气路拓扑对象 | — | airPath / airFlowM3h / collectAirStreams() |
本轮调查中曾判定有问题、经查规范与实测后确认模型正确:
| 曾判定 | 核实依据 |
|---|---|
| DO 判据口径错误 | Timmons Tab 3.1:鲑科出水 6–8 / 罗非 4–6 mg/L,本工具在区间内 |
| turnover 偏高 3 倍 | DB 21/T 2350-2024 §9.3 要求溶氧 8–12 mg/L, 三文鱼 turnover 3.0 是满足规范的最低值 |
| 耗氧强度偏高 | MO₂ 3.15 mg/(kg·min) @15 °C,文献 2–4 中部(Calabrese 2023 实测 2.4 @9.3 °C) |
| 主泵扬程未生效 | 参数正确(7 m + 氧锥 3 m = 10 m),反算 9.5 m 吻合 |
| 比电耗偏高 | 低于 Atlantic Sapphire 丹麦实测 13.6,高于挪威独立仿真 9.59 |
| 脱气塔风压偏低 | 与 G:L=5 组合后比功率 5.79,进入 Summerfelt 5–15 区间 |
| 围护 U 值缺失 | 早已完整:U_墙/顶/地/窗 + 4 档保温预设 + 热回收 + 窗墙比 |
⚠ v2.1 订正:本节记录的是 v2.0.0 当时的状态,其中四条已在 v2.1 解决或推翻,
原文保留作历史记录,当前状态请看 v2.0.1 → v2.1 章节与主页帮助区 §L:
• ① 接触器蒸发未计入水量平衡 → 已实现(补水拆换水股/蒸发股,盐平衡恒等成立)。
且原文三个数字均不准确:实测 −10.8% ~ +10.7%、双向(非「6.0%、单向」),
接触器净水汽约为池面蒸发 50 倍(非 29.5 倍)
• ② 凝结水对盐度的影响未建模 → 已给出诊断(海南设计夏稳态盐度 30 → 27.2‰)
• 暖通侧负荷标注界外、不计能耗 → 已推翻:v2.0 起计入能耗,v2.1 修正口径并补设备投资(AHU-1002)
• 蛋分有支路泵而无供气动力项 → 已实现(K-501,6.41 kW / 508 m³/h)
① 接触器蒸发未计入水量平衡。 气液接触器的热量已完整计入
(Δh 含潜热,t16 验证潜热占 86%),但其带走的水的质量尚未进入
V_makeup。实测三文鱼 1000 t 青岛设计冬:接触器蒸发
584.6 kg/h(14.03 m³/d),是池面蒸发 19.8 kg/h 的 29.5 倍,
占补水量的 6.0%。后果:补水量、补水加热、补水费与排污量均系统性低估约 6%,
且该偏差在高 G:L 或热带工况下会放大。属单向系统性偏差,已列入 v2.1。
② 凝结水对盐度的影响未建模。 湿热气候下接触器 Δh 为负时空气在填料上 结露、向系统净产水:三亚设计夏约 33 t/d。淡水场是白得的补水; 但海水场意味着持续被淡水稀释,会影响换水策略与盐度控制。
③ 暖通侧未含太阳辐射与人员负荷。 围护体系本身是完整的 —— U_墙/顶/地/窗四值可调,含 4 档保温预设(温室 3.5 / 标准车间 0.8 / 保温车间 0.30 / 近被动房 0.15)、通风热回收、窗墙比,地板对地温单独计算。但太阳辐射与采光带 得热未建模:大连一项 RAS 车间 CFD+实测研究显示,屋顶采光带可把墙体表面温度推到 29 °C(同期水温 17 °C)。因此高日照地区、尤其设有采光带的车间,夏季制冷负荷偏保守。 人员负荷(约 100 W/人)相对车间显热(千瓦级)可忽略。
其它遗留:contactorRecovery 默认 0(上海冬季接触器排
31,541 kWh/d 转制热,需实测定值);MBBR 流化下限与 bfTankDepth 参数缺失;
石斑三阶段 DO 余量仅 +2%/+3%/+10%;蛋分有支路泵而无供气动力项;
单池面积 DB 21/T 2350 规定 5–30 m²,本工具每阶段建模为一个池,池数由用户设置。
补丁版, 不改动任何计算模型 —— 13 条数值基线与 v2.0.0 逐位相同, 本手册第 2–29 章正文全部继续适用, 无需重读。自检 16 → 17 项。
A. 模块化聚合 totalKw_field 产出 NaN。 微滤机 RDF 是流量定额设备 (按 m³/h 选型), 不返回 installedKw; 而全场聚合循环对每个设备一律计算 installedKw × numModules, 得 NaN。同一处的 totalFlow_field 有守卫、本行没有 —— 不对称守卫。实测边界: 16 工况 × 全阶段仅此一条非有限路径, 且 NaN 经 JSON 序列化静默变 null、下游四页面均未消费, 线上无可见故障。已改为算不出即给 null。
B. 容积率 FAR 默认值两个口径并存。 「审计回合 7」已把默认值由 GB 50187 工业下限 0.7 改为水产实测主流 0.5, 但漏改三处 (存盘 fallback、注释、用户可见文案)。其中存盘 fallback 会导致存盘记 0.7 而导出用 0.5, 再次载入后总占地静默缩小 29%。三处已归一到 0.5。
C. 版本号改为单一事实源 + 自检锁定。 页脚与版本面板此前硬编码, 现从 IRAS_META 注入; 新增自检项 meta_version_consistency 校验三处 SEO 静态串与两处注入结果。该断言已用负对照验证会失败。
⚠ 本版未触碰 v2.1 候选项 (接触器蒸发进水量平衡、凝结水对盐度影响、MBBR 流化下限、蛋分供气动力等) —— 那些都要动模型, 不属补丁版范围。
源于第三方第四轮审计。13 条数值基线全部重算。
A. 车间显热能量守恒破口 (P0)。 v2.0 删除空气节点时, 挂在该节点上的产热项没有被重新安置: Q_air_gain_kW (泵/UV 电功率中进空气的那一份) 仍在计算、仍在返回, 但不进入任何一侧平衡。同因还有 dehumHeatDest='indoor' 的除湿冷凝热 —— 代码注释仍写「已在 T_room 迭代中计入」, 而该迭代在 v2.0 已删除。模型实算青岛设计冬丢失 1,617 kWh/d, 达 HVAC 显热负荷的 41.8%。
修法: Q_hvac_sens = Q_envelope + Q_vent_sens − Q_room_internal, 室内产热 = 设备废热 + 除湿冷凝热(入室时)。⚠ 第 29 章描述暖通显热负荷时应按此式, 原「围护 + 通风」二项式已不完整。
修复后成本变化的符号随工况方向翻转 —— 制热工况下降 (废热减轻供暖), 制冷工况上升 (废热加重制冷)。若为单向偏移反而说明修错方向。
B. 守恒类不变量断言落地。 A 项那类缺陷 golden-master 抓不到 (基线跟着变)、有限性断言抓不到 (数值正常)、口径一致断言也抓不到 (不涉同量两处换算) —— 只有守恒断言能抓。三条 (设备产热分配 / 车间显热闭合 / 水侧净热闭合) 已并入页内自检。修复前断言 B 在 56 个「工况×阶段」组合中 48 项失配, 残差与 Q_air_gain×24 逐位相等。
C. 自然冷却可见性回归。 freeCoolingSinkT 被单行编辑误并进行尾注释, UI 第四档永不触发; fcUnavailReason 全库无消费点; 且整段被困在 pumpDirection==='cool' 内, 而 v2.0 最常见的 not_cool 恰好落在分支外。三层一并修复, 改读枚举。
D. 口径与参数。 totalMax 补 hvacCostDaily; dehumEnabled 开关对成本无效却 gate 显示 (已对齐); 尾气入室比例默认 0.2→0 (对齐气路拓扑 A5); co2StripperGtoL 引擎侧钳到 [1,30]。
H. 第五轮审计: 风机热与登记表升级。 三台风机 (脱气 53.6 + BF 42.4 + 蛋分 11.7 = 107.7 kW) 的电功率此前既不在泵/UV 的电-热分配里, 也不在任何其它热流里。注释写了「不走 pumpHeatRatio 进水」—— 对, 但它也没走别的地方。方向与 v2.0 的 Q_air_gain 一致: 付电费让风机运转, 却让这些电产生的热凭空消失, 再付一次热泵的钱把水加热回来。修法: 轴功 (η=0.57) 抬高接触器进气温度 (青岛冬 −7 → −3.5°C, 等湿升温), 电机损失并入 Q_room_internal。
登记表升为唯一真相源。 同一缺陷已在三层各出现一次 (Q_air_gain → 蛋分气流漏登记 → 风机热无去处), 成因是计费/热/资本三个去向分散在三处机制。POWER_REGISTRY 现声明 path(支持嵌套)/billedVia/heatVia/capexVia 四项, 断言改为从登记表反向枚举 —— 旧断言用正向扫描 + 命名规则, 实测漏掉 co2StripperSpec.blowerKw(53.6 kW) 与 bfBlowerSpec.power(42.4 kW)。新增断言 A2 (全量电-热分配) 与 F4 (登记设备必须有 CAPEX 条目), F4 落地后立刻抓到蛋分风机「有电费无投资」。
断言 A3: 账目完整 ≠ 接入正确。 A2 校验了「风机电功率 = 轴功 + 电机损失」, 但负对照没转红 —— 把轴功参数传 0 (热完全不接入), 两边照样相等, 因为两个量照常算出、加起来也对。补 A3 (接触器进气温升必须与轴功自洽) 后才咬人:「进气温升 0.00 K ≠ 轴功推算的 3.76 K」。守恒断言容易只验证「账算得平」, 而不验证「钱真的付到那个地方」。
收尾两项。 ① 蛋分风机补 modulePerSpec 规格 + 1+1 备用, 三台风机备用政策至此一致 —— 与 v1.9.3 给脱气塔风机补规格时完全同一处境, 当时的原注释逐字适用。② v1.9.2 章节 G / I 两表加历史横幅: 数字 (37.53 / 比电耗 9.5) 原样保留为历史记录, 但同章节末尾「请以本节为当前基线」这句现在已指错 (当前基线是 v2.1), 会让读者把 37.53 当成当前值, 已加订正批注。
气候联动只覆盖点击路径。 applyDefaultClimateForSpecies 只挂在鱼种按钮的 click 处理器里, loadStagesFromDB() 不调用 —— 载入方案 / 下游导入 / 测试脚手架全部绕过。已移入 loadStagesFromDB。意外收获: 对虾基线 −3.58 元/kg —— 基线只覆盖年均字段而选型用设计冬/夏, 三亚的对虾场一直按青岛设计冬选热泵。
⚠ 与审计的两处不同判断: 「HVAC 潜热未计费」不成立 (潜热经 m_dehum → dehumKWhPerDay 计费, 海南夏模型实算 2,613 kWh/d, 两者同源再计一次是重复); 「买了 92 万除湿机一天不开」表述有误 (按设计夏峰值选型是正常做法)。经产品方确认, 除湿按独立机组处理。
F. 补齐三处漏项 (第二批)。 车间暖通机组 CAPEX (AHU-1002, 85.5 kW / 24.4 W/m²) —— v2.0 引入车间显热能耗却一直没有对应设备与投资; 制冷↔制热切换余量 regimeMarginPct (G:L=3 时仅 3.9%, 默认阶段 1 仅 0.5%); 蛋分供气风机 K-501 (6.41 kW / 508 m³/h) —— 泡沫分离效率由气量决定, 此前只有支路泵。
G. 登记完整性断言。 加蛋分风机时连犯三个同类错误而现有断言一个都没抓到: 并进 totalPumpKw (守恒断言等式两边同步放大, 残差为零)、漏加 elecCostAvgDaily (比电耗单向低估)、气流未登记 airPath (与 v2.0 的 Q_air_gain 孤儿项完全同类)。
守恒/平衡断言只能约束【已进入体系的量】, 无法发现【压根没进体系的量】。要抓后者, 必须从设备侧反向枚举。
新增 POWER_REGISTRY 与断言 D (气流登记完整性) / E (电功率登记完整性), 四条负对照全部精确转红。⚠ 仍有一层盲区: 登记表本身可以声明错, 未堵。
E. 鱼种默认气候联动。 v2.0 只修了自检基线的配对, 产品默认仍是青岛且切鱼种不联动。新增 DEFAULT_CLIMATE_BY_SPECIES, 罗非比电耗由 16.21 降到 13.48。
| 版本演进说明 (v1.0 → v1.9.2) | |
| 第一部分 RAS 基础 | |
| 第 1 章 循环水养殖概述 | — |
| 第 2 章 RAS 工艺流程 | — |
| 第 3 章 水质参数与控制标准 | — |
| 第 4 章 氮循环与碳循环 | — |
| 第二部分 工程设计方法 | |
| 第 5 章 养殖规模设计 | — |
| 第 6 章 污染物负荷计算 | — |
| 第 7 章 精确循环方程 | — |
| 第 8 章 系统体积建模 v1.3.x 增 S-101 | — |
| 第三部分 各处理单元设计 | |
| 第 9 章 固液分离 (转鼓微滤机 RDF) v1.7 系统排水重构 | — |
| 第 10 章 生物过滤 (MBBR 生物滤池) | — |
| 第 11 章 蛋白分离器 | — |
| 第 12 章 反硝化反应器 | — |
| 第 13 章 UV 紫外线消毒 | — |
| 第 14 章 高级氧化 (AOP) | — |
| 第 15 章 增氧与脱气 v1.9.1 液氧双口径 | — |
| 第 16 章 热负荷与温控 v1.2 重写 | — |
| 第 17 章 水泵与管道设计 | — |
| 第 18 章 电气与控制系统 | — |
| 第 19 章 生物安全与消毒策略 | — |
| 第 20 章 系统启动与调试 | — |
| 第四部分 经济评估 | |
| 第 21 章 运行成本 v1.9.2 两层口径 + 产业对标 | — |
| 第 22 章 投资概算 v1.7 旁路拓扑 CAPEX | — |
| 第五部分 设计案例 | |
| 第 23 章 案例: 三文鱼 1000 t/年 v1.7 数据 | — |
| 第 24 章 案例: 大菱鲆 500 t/年 | — |
| 第 25 章 案例: 对虾 100 t/年 | — |
| 第六部分 工程化与平台功能 (v1.3-v1.7) | |
| 第 26 章 多模块并联与 N+1 备用 v1.3 新章 | — |
| 第 27 章 鱼池配置与池深统一 v1.3 新章 | — |
| 第 28 章 全局气候与围护建模 v1.9.2 通风口径 | — |
| 第 29 章 双节点稳态热平衡求解 v1.9.2 除湿机 | — |
| 第 30 章 P&ID 工艺图自动生成 v1.3.x 新章 | — |
| 第 31 章 设备清单导出 v1.3.x 新章 | — |
| 第 32 章 4 工况成本对比基线 v1.3 新章 | — |
| 第 33 章 投资财务评价 (NPV/IRR + 8 张标准表) v1.4 新章 | — |
| 第 34 章 可研报告生成器 (16 章 + docx + 模板引擎) v1.5 新章 | — |
| 附录 | |
| 附录 A 完整符号表 | — |
| 附录 B 全局热配置参数表 | — |
| 附录 C 设备 tag 命名总表 | — |
| 附录 D 鱼种参数表 | — |
| 附录 E 参考文献 | — |
| 附录 F 免责声明 | — |
源于第三方第六轮审计。审计核心判断:「断言的质量已超过工况的覆盖面 —— 下一步的收益在加工况, 不在加断言」。本版照单全收: 自检 17 → 20 项, 13 条数值基线重算 (|Δ| ≤ 0.02 元/kg, 符号随工况方向翻转)。
此前 13 条数值工况全部「mainline 拓扑 + 脱气塔开启 + 纯氧增氧」。新增 edge_no_degasser / edge_bypass / edge_air_aeration 三条配置边界工况, 只跑不变量断言、不比数值。落地顺序刻意为先加工况 (转红) 再修缺陷 (转绿) —— 红→绿转换即工况有效性的负对照。
CAPEX 嵌套: 蛋分风机条目原嵌在脱气塔 if 条件分支两层内, 脱气关闭时蛋分照常运行照常计费、投资却消失 —— F4 目标模式第四次出现, 且在修复它的同一次提交里。现与各独立设备并列。
ΔT/mdot 不自洽: 风机温升按冷密度算、焓流按热密度算, 丢失 (1−mdot/mdot₀) 份轴功 —— 默认工况 1.2%, 脱气关闭时 ΔT≈30 K、丢 10.1%。现做不动点迭代解联立至 mdot·cp·ΔT ≡ Pshaft, 附录 B 的 dT_blower / mdot 自此严格同一状态点 (即「mdot 自洽」)。
旧口径 ΣkW × 0.57 与各风机效率参数脱节 (用户调高效率, 模型反而认为进气流的热更少)。物理上 kWi×ηi = Q·Δp 与 η 无关, η 只影响电机损失分成 —— η 逐台加权自动恢复该性质, η 与各功率公式严格同源 (co2 读 co2BlowerEfficiency, bf 取公式内常数 0.60, skimmer 读 skimmerBlowerEta, 鱼池增氧读 tankAirBlowerEfficiency)。
空气曝气模式的鱼池增氧鼓风机 K-101 此前登记表与气路都看不见 (计费有、CAPEX 有、热去向无、气路无) —— 与 Q_air_gain (v2.0)、蛋分气流 (v2.1)、风机轴功 (第五轮) 同族的第四次逃逸, 机制是关键功率藏在混合数值与格式化字符串的展示对象里。现全量接入 (airFlowM3h + airPath + 登记表 + 轴功加权)。新增断言 E2b 递归扫 *Spec 子对象封住该逃逸类; 治本方案 registerDevice 工厂化已立项 v2.3。
capexVia 由正则改精确名称数组: 旧正则假阴性 (删掉真目标仍绿) 与假阳性 (bypass 下 F4 四阶段误报) 双向皆错。五台支路泵显式声明共享「支路泵合计」聚合条目。精确化随即曝光被掩盖四版的存量不一致 —— BF/脱气塔风机 CAPEX 选型门槛 0.5 kW vs F4 的 0.05 kW, 现以 capexMinKw 显式声明进登记表, 与 CAPEX 侧选型门槛同源。
堵 v2.1 明示的最后盲区 (「billedVia 可以指向不存在的成本字段而断言不会发现」)。断言 G1 落地当天抓到 5 条活体: 声明写的是内部变量名 *CostDaily, cost 导出面是 *CostMax/*CostAvg —— 与第六轮审计连错两轮的 dehumCostDaily 同一个坑 (billedVia 声明必须真实存在于导出面, 设备活跃时非零)。G2 防同一 CAPEX 条目被重复认领。
skipClimate 删除: 全库零调用点的死参数 (restoreState 不经 loadStagesFromDB), 为不存在的调用方准备的开关只会在被忘传时静默伤人。渲染与计算解耦: 渲染抛错此前被计算 catch 吞掉伪装成「计算异常」并销毁结果, 现独立捕获、标注「渲染异常, 计算结果有效」—— 负对照双向实测 (修复前渲染故障使 13 条数值全灭为 0, 修复后零影响)。审计误报驳回: NH₃ 阈值与 Ω 告警两条「六轮未动」为第四轮已驳回误报的复发 (v1.9.3 起在位); 接触器进气节点不可选为记录在案的设计决策。
源于本版的首次 UI 专项审计。与第一批的登记表工作是同一个模式在 UI 侧的实例。自检 20 → 21 项, 13 条数值基线逐位不变 (纯重构)。
用户填 0 → 模型收 0 → 重渲染后输入框显示默认值 (模板把 0 当 falsy) → 再改任何别的字段, 全量读回时假显示值覆盖 proc, 用户设置无声消失。陷阱在三层 (渲染 / 读取 / 消费), 只修一层反而更糟: 实测只修渲染侧会造成「界面诚实显示 0、模型仍用默认值」, 而原状态至少界面与模型口径一致。三层必须同批落地。
取值约定此前散布四处 (默认值表 / 渲染模板 / 读取侧钳制 / 消费侧兜底), 实测已漂移四条: co2StripperEff 三处三值 (65/65/75)、co2StripperGtoL 事实源 v2.0 改 3→5 而副本停在 3、co2PackingHeight_m 1.5 vs 1.0、climateRegion 事实源与消费侧不同。这些副本平时是永不触发的死代码, 故漂移无人发现 —— 直到用户填 0 让它们复活。
FIELD_SPEC 只管范围 (min/max/step/clamp), 默认值仍归 PROCESS_DEFAULTS, 由断言 H 保证对齐。clamp 取 UI 范围与原钳制的并集 —— 机械规则, 不收紧现有能力, 无回归风险。同时消灭: UI 范围与代码钳制不一致 (7 字段)、22 字段无钳制、同字段多处渲染矛盾 (3 处)。
第一版 FIELD_SPEC 只收了原本带 min/max 属性的 34 个字段, 另有 22 个字段完全无钳制 —— 实测 mainPumpEta=0 使主泵报 1383.6 kW (成本 +6.6 元/kg)、VTR20=0 使成本 +12.0 元/kg, 全部有限无 NaN: 危害是「看起来正常的错误数字」, 会原样进可研报告, 比 NaN 难发现得多。现已全部接入 —— 依据取自各字段自己的 title 提示 (22 条无一缺失地写明了工程范围, 只是从未落到属性上)。本批 min/max 取 tooltip 的工程范围, clamp 取更宽的物理边界 (第一批那些字段的 UI 范围本身就是硬边界, 本批多为典型值区间, 当硬边界会挡掉合法探索)。
并集规则的缺陷: 第一批的 clamp = UI 范围 ∪ getNumClamped 漏了第三个来源 —— 消费处的 Math.max(x, 下限)。它与前两者性质不同: 前两者是允许区间 (并集 = 不收紧能力), 后者是物理硬保护 (必须遵守而非并入)。后果: co2BlowerEfficiency 的 clamp 是 [0,100] 而消费处写着 Math.max(η/100, 0.3) —— 用户填 0 时 proc 存 0、界面显示 0、模型实际用 30%, 而 t22 一直报「保真 ✅」(它检查的三个量全在 proc 层, 看不见消费处)。规则修正为 clamp_lo = max(消费处硬下限, 原下限), 并撤除全部 8 处隐式兜底。至此 66 个输入字段零裸奔。
删除死控件 sourceTemp: 双证据确认 —— 静态全库无消费点、动态填 -99 结果逐位不变。源水温自 v1.2 起归全局气候 (T_source_annual 等), 本字段是当时未清理的残留。给死控件加钳制等于承认它还活着, 故删而不修, 与第一批删 skipClimate 同一原则。
发布前对四条基本物质平衡做了产品路径实测 (三文鱼 1000 t): 氮 (TAN) 残差 0.08%、硝酸盐 0.00、CO₂ 0.13% (即换水那份)、TSS −1.8% —— 前三条闭合, 说明稳态方程是自洽解出的。TSS 的 −1.8% 四阶段同号且随规模成比例, 但未确证为模型缺陷 (更可能是核算漏了排污股)。
⚠ 需要明确记录的是: 现有断言覆盖能量 (A1/A2/A3/B/C)、水量 (F1/F2/F3)、登记 (D/E/G)、资本 (F4), 没有一条物质平衡断言。即今天闭合是因为公式恰好写对, 不是因为有东西防止它写错。氧平衡、碱度平衡、碳酸盐体系 (carbonate.js 与主模型的交叉一致性) 三项连"今天是否闭合"都未测过。已列为下一版首要工作。
新增自检项 field_spec_consistency (H1 渲染与表逐位一致 / H2 clamp ⊇ UI 范围 / H3 默认值存在且在范围内)。⚠ 记一条判据盲区: t22 检查的量全在 proc 层, 消费侧的 || 不影响 proc, 故 t22 结构上覆盖不了第三层 (负对照实测无反应), 另补静态判据 t23。一条判据绿了不等于该层被覆盖。
以下三章为 v2.2 发布【之后】的持续加固 —— 不改变 v2.2 的功能范围, 只增加护栏与修正: 第三方独立复核处置 → 物质平衡断言 M → 碳酸盐接口一致性 · a11y · CDN 加固。v2.2 本体的两批发布内容见上方「v2.1 → v2.2」与「v2.2 第二批」两章。
一份独立复核报告 (jsdom 走真实产品路径 + PyCO2SYS 1.8.3.4 / USGS·APHA 溶解氧表 / ASHRAE·IAPWS 湿空气数据 / 第一性原理手算) 提出三条模型误差, 全部落在本版自述的断言盲区 (氧侧 / 碳侧 / 水汽侧)。逐条实测核实: 一条采纳、一条部分采纳、一条驳回。
co2DailyAvg = o2FishDailyAvg × 1.375 只算呼吸, 缺硝化项 tanDailyAvg × 6.286 × (1 − BF_CO2_STRIP), 实测少算 34.5%–43.4%。设计口径 co2Daily 是对的 —— v1.9 memo F2 修过同一个 bug, 设计口径已修而日均口径未跟上。全库 0 消费点, 属死字段, 故删除而非修正 (与删 sourceTemp 同一原则)。带错误公式的死字段比空字段危险: 谁把它接进年度碳核算会静默低估三四成且不触发任何断言。
复核指出应使用冰面式, 数值属实 (−20°C 时水面式高 21.97%), 原注释的适用下界 −20°C 不成立。但本项目继续用水面式且自洽: RH 数据源为「WMO/Climate.gov 30 年均值」, 而 WMO 对 0°C 以下的 RH 以水面 (过冷水) 饱和压定义; humidityRatio 用同一相态还原分压, 前后一致。改冰面式而 RH 仍是水面口径, 反会使含湿量系统性偏低。相态必须与数据定义口径一致 —— 这是选水面式的理由, 不是疏忽。已订正注释区间为 [0, 60]°C 并写明依据。
复核建议「改用 Benson & Krause (1984)」—— 而代码用的就是该式本身: S ∈ {0,30} × T ∈ {10,15,20,25,28,30} 共 12 点, 与 B-K 标准式偏差全部 0.0000%。报告「参考值」反解出的盐度为 ≈35.5‰, 而对比的是 iRAS 在 S=30 的值 —— 拿 S=35 表值比 S=30 计算值, 差的 3.3% 正是盐度效应本身。报告自己写着工况盐度 28–30‰; 其 28°C 行「iRAS 6.410 / 参考 6.41」数值相同却标 +3.33%, 该 6.410 实为 T=30 的值, 表格行错位。
📌 此条与第六轮审计的 NH₃/Ω 误报同类: 基准取值与被测对象的工况参数不一致。复核方法本身正确, 出问题的是基准侧的参数对齐。
化学计量 8 项对第一性原理手算全部吻合 (硝化耗氧 4.57 / 耗碱 7.14 / 反硝化回碱 3.57 / 硝化产 CO₂ 6.286 / 呼吸产 CO₂ 1.375 等); 碳酸盐体系对 PyCO2SYS 1.8.3.4 共 1400 工况, 淡水 pH 一致到机器精度 8.88e-16、海水最大偏差 1.78e-05、Ω_calcite 相对误差 0.0082%; 能量守恒 B 断言残差 0.000e+0、A 断言 1.57e-14%。这些正是本版断言已覆盖的区域 —— 与「三条缺陷全在盲区」互为印证。
此前断言覆盖能量 (A1/A2/A3/B/C)、水量 (F1/F2/F3)、登记 (D/E/G)、资本 (F4), 唯独物质平衡一条没有 —— 而它是本工具的物理核心。第三方独立复核印证: 三条缺陷全部落在无断言区。实测确认今天全部闭合后立即固化 —— 闭合状态是免费拿到的验收基线。
M1 氧-构成 总需氧 = 鱼呼吸 + 硝化 + 异养 · M2 氧-硝化 硝化耗氧 = TAN × 4.57 · M3 氧-供给 液氧耗量 = 鱼呼吸耗氧 / 吸收率 · M4 碱度链条 净额 = 消耗 − 回收, 投加 = max(0, 净额 − 补水带入), 药剂 = 投加 / 0.595 · M6 碳-构成 CO₂ = 呼吸 × 1.375 + TAN × 6.286 × (1 − BF 内脱气)。
把过去修过的缺陷形态注回代码: M6 ← CO₂ 漏硝化项 (复核 BUG-2 形态) 报 −41.5%, 与报告实测同量级 —— 若 v1.9 之前就有这条断言, 那个 bug 根本写不出来; M3 ← 液氧用总需氧而非鱼呼吸 (v1.9.2 修过的口径混淆) 报 +104.7%, 与当年「高估 1.65 倍」同量级; M2 ← 4.57 改 4.60 报 +0.656%。
M4b 落地当场咬中 edge_yield_0 / edge_yield_tiny 八条: 零产量时补水带入碱度超过消耗, 净需求为负而 alkToAdd 钳到 0。核实后确认钳制正确 (不可能投负量药剂), 故改断言纳入下钳而非改代码。
外部核算这三条口径连续错了三次: 液氧误用设备选型口径 o2Demand (含容量系数, 报 −48% 假不闭合)、碱度消耗误用 tanDaily 而非被硝化的 TAN、碱度回收误用理论 3.57 而非代码里的工程系数 2.8。同族「猜口径」已达十次。这正是要把核算放进产品路径的理由 —— 断言从真实导出面取值, 不会像外部工具那样猜错口径。
第三方复核验证的是 carbonate.js 模块本身。但主模型与它之间隔着一层单位换算 (TA = 碱度/50043/ρ、CO₂ = 浓度/44010/ρ), 那一层从未验证 —— 三个因子任一错, pH 与 Ω 都会偏而无人察觉。
I1 往返自洽: solveAlk(pH*) → solve(TA) 还原 pH*, 240 点网格最大 |ΔpH| = 0。I2 换算层: 手工复算与模型逐位相同 (Δ = 0)。I3 双副本: 独立文件与内联块 20 个函数、63 个平衡常数, 归一化 md5 完全相同。
📌 真正的风险不是「当前是否一致」(是), 而是将来会不会漂移 —— 同一份求解器存在两处, 没有任何东西阻止有人只改一处。I3 即为此而设。
163 个 label 零个有 for, 输入框全部无 id —— 点击标签无法聚焦输入框, 是所有人都损失的常规交互 (工艺参数标签仅 10px)。现按 f_{idx}_字段名 生成 id 并关联 65 处。31 个表格中 12 个未包 overflow-x-auto, 已全部包裹。新增自检: 输入框必须有 id、for 不得悬空、表格必须可横向滚动。
📌 实施教训: 正则改了三轮仍漏 1 处 —— Python re 在超长 title 属性上回溯超限后静默放弃匹配。改线性扫描后一次到位。这与 t21 三次扩展全部落空同形态, 两次都是断言先报出数目不对才发现的。
Tailwind Play CDN 动态生成响应体, SRI 哈希无法预先计算 —— 技术限制而非疏忽。chart.js 是固定文件, 可以且应该加 SRI, 但本版不填哈希: 当前拿不到真实值, 而编造哈希会让浏览器拒绝执行脚本、图表直接消失, 比没有 SRI 更糟。只加 crossorigin 并把取真值的命令写进注释。📌 与「判据先负对照证明会红」同源: 安全措施也不能靠猜值上线。
第七轮独立审计报出两条严重回归, 共性诊断准确: 都是一次正确的重构越过了自己的边界, 且检测缺口同构 —— 现有断言查的是内容 (值对不对、几处一不一致), 失效发生在结构 (元素在哪个父节点、钳制覆盖哪些入口)。v2.3 逐条实测核实后处置, 并把「结构」维度补进断言体系。自检 21 → 22 项, 工况 22 → 23 条 (新增 edge_hostile_json)。
v2.2 构建期补丁写入的三处 description (meta / og / twitter) 行尾各多一个 >; HTML5 解析器在第一处提前闭合 <head>, 20 个 meta + canonical 掉进 <body> —— 爬虫只解析 head, canonical / robots / og / twitter 全部失效, 而 description 断言用 querySelector, 对父节点不敏感, 照样全绿。修三字符; 新增 head 结构断言 (元素必须在 document.head 内), 先转红再修复转绿 —— jsdom 内部即 parse5, 负对照免费。
v2.2 撤消费处 || 默认 时把 Math.max 取值域守卫一并删了 —— 前者是真相源问题、后者是校验边界问题, 写法相似但性质不同。clampByFieldSpec 只在 UI 读取路径调用, 载入越界方案 JSON 长驱直入 (实测 co2BlowerEfficiency=0 → NaN 遍布; co2StripperGtoL=1e6 → 成本 109 万元/kg)。修复: ensureStageProc 兑现自己注释宣称的不变式 —— 对 PROCESS_DEFAULTS 数值键逐一 clampByFieldSpec (非有限回落默认, 布尔/字符串原样)。它是 recomputeAll / rebuildStages 的公共入口, 「UI 有守卫而加载没有」自此在结构上写不出来。edge_hostile_json 修复前咬出 Infinity/NaN 于能量 A2/B/C、登记 E1、物质 M4a; 修复后转绿, 13 条数值基线逐位不变 (钳制对合法参数是纯守卫的实证)。
鱼池是车间内的敞开水面, 气泡在池面破裂 —— 尾气必然入室且已被水温饱和; OUTDOOR→OUTDOOR 只对有排风管的脱气塔成立。aerationSpec.airPath.sink 改 INDOOR, 车间湿平衡产湿侧新增 ṁ_air × (W_sat(T_w) − W_room)。实测罗非养成 (28°C/65%): 1,384 m³/h → 336.1 kg/d, 为池面蒸发 +29% (审计估 335 / 手算 337 / 实测 336, 三方吻合)。显热恰为零 (A3: T_room = T_w); 与接触器 netWater 无重复 (一记水体失水、一记车间得湿)。成本仅动 air 模式除湿设计选型 CAPEX (罗非 +0.007 元/kg), 年均电耗不变; 13 条数值基线全 o2 模式, 逐位不变。进气侧维持室外取气 (设计决策: 进气经风管自室外), 接触器进气继续用室外温湿度。开放项: air 模式气泡吹脱的 CO₂ 同样入室, 新风需求目前只计脱气塔份额。
默认值同时写在 GLOBAL_THERMAL_DEFAULTS 与读取函数的字面量 fallback 里, degasserExhaustIndoorFrac 已实际漂移 (表 0 / fallback 0.2; 0 正是 v2.1 为气路 A5 改的值)。实测更正: 缺失键为 4 个非审计所报 6 个 (三个 U 值在表内, 审计漏了 fcDesignDT_K); 另抓到审计未报的第三处副本 —— 消费点一处 : 0.2 死 fallback。处置: 补 4 键入表 → 32 处 fallback 一律引表 → 死 fallback 改引表 (保留 [0,1] 取值域守卫)。断言两条: 键集锁定 + 运行时 toString 扫源码禁字面量 fallback (首版正则漏 3 处对齐多空格行, 由脚本残留自查抓到 —— 故把这层也固化为断言), 双向负对照精确。
v2.2 注释预想「联网后 curl 原 URL 取哈希」—— 实测原 URL 的 chart.umd.min.js 在 npm 包内不存在, 是 jsDelivr 对缺失 .min.js 的动态压缩产物; 给动态生成物钉 SRI 与给 Tailwind Play 钉 SRI 是同类错误的温和版。处置: URL 改指包内真实发布件 chart.umd.js, 哈希链条 = registry 声明 sha512 → 本地 tarball 复算逐位一致 (供应链验证) → 发布件 sha384; integrity 与 crossorigin 成对上线。断言: jsdelivr 脚本必须成对、Tailwind Play 必须皆无 (防 v2.2 样式崩掉事故复发)。
海南低密度(石斑 20 kg/m³)鼓风曝气 + 关脱气塔是主流案例, 暴露两层缺口: ① 旧风量公式 SOTE 硬编码 0.18 为清水标准态值, 无水深/α β θ/驱动力修正, 实际 OTE 仅其 1/3–1/2; ② CO₂ 侧风量需求缺席, 关塔只有不联动的 fallback 旋钮(实测鱼池 CO₂ 55–179 mg/L 超阈 2.5–8 倍而选型无反应)。实装: tankAerationDesign 为选型与稳态的共同单源 —— O₂ 侧 OTE = SOTE(%/m)×水深×αβ×θ^(T−20)×(C*−DO_design)/C*; CO₂ 侧按 Henry 平衡载量(复用碳酸盐 K0_W74/ρ, 零副本), 风量取两侧 max 并标注控制侧; 关塔稳态 η = A·k·逼近/Q 反算。断言 M8(air+关塔 ⇒ 稳态 CO₂ ≤ 选型目标)红→绿: 旧 144–179 → 新 20.5 mg/L。DO 饱和与 CO₂ 阈值内联逻辑抽共享函数(逐字符不变), o2 基线逐位未动; 新工况 edge_air_no_stripper。新参数(JSON 可调, 经全路径钳制): sotePerMeter 6.5 %/m · aerationAlphaBeta 0.75 · co2StripApproach 0.5 · co2TargetMgL null=阈值。事故记录: K0_W74 入参为 Kelvin(Weiss 式 T/100), 首版传 °C 得 1e111 —— 第六次「猜接口」。海南石斑 200 t 案例落点: 风量 O₂/CO₂ 两侧收敛(1,095 vs 1,270 m³/h), CO₂ 控制选型, 全场风机 ~78 kW, 综合 60.4 元/kg · 21.5 kWh/kg(对照: 带塔 68.1/25.5, 旧旋钮虚算 57.5/18.8)。
v2.2 的 patches/ 与 tools/ 不可得, 自 v2.3 起直接在交付产物上编辑, 「从 v2.1 全量重建」的可复现性封存; 验证工具按 HANDOFF §4 规格重建并显式标注。编辑纪律不变: replace_once 强制唯一命中、断言先负对照转红、基线变动先预测符号量级。
国内多数循环水项目是简易棚: 无暖通无除湿, 车间温湿度由太阳、设备废热、池面与尾气换热、自然通风共同决定。此前该场景无表达路径 —— hvacEnabled=false 只是不收电费, A3 前提仍强制室温=水温。本批新增全局键 roomMode 三档: conditioned(恒温车间, 既有路径逐字保留)/ ventilated(简易棚·自然通风)。⚠ 本批原含第三档 open(露天), 因中国工厂化循环水无此实际场景, 后续批次已撤销(白名单/UI/派发分支/R4 枚举一并移除; 旧 JSON 写 open 者与非法值同路回落 conditioned)。13 条数值基线在恒温档下逐位不变(全精度导出比对); 自检 23 → 24 条(新增 edge_room_ventilated)。
车间温度自由求解正是 v1.2–v1.9.3 的做法, 热带鱼种曾算出车间 9–14°C / RH 99%, 与实测(摩洛哥温室 16°C / 大连简易棚 22–23°C / ASHRAE 水温+1~2K)方向反 15–20 K, v2.0 因此撤退到「暖通维持」。复盘结论: 方程没错, 热源清单漏了三类 —— ① 太阳辐射(全库无建模)② 设备废热(未进空气节点)③ 接触器尾气显热(被 A3 温差恰为零掩盖)。空气节点唯一热源只剩池水对流小项, 解被围护+通风大项拽向室外温度。三类补齐后重启求解。凡 A3 成立时「恰好为零/恰好抵消」的项, 求解器一上全部复活 —— 这是 A3 的隐藏依赖清单, 开工前逐条重审过。
九气候区各补 GHI 冬/夏/年(Global Solar Atlas / NASA POWER; 三亚 4.2/5.8/5.2, 多哈夏 7.2, 特罗姆瑟冬 0.0 极夜); 四档围护配窗 SHGC / 屋面 SHGC / 不透明面吸收率(ASHRAE Fundamentals Ch.15; 温室档透光屋面 SHGC 0.55 且不透明项置零, 近被动房 0.35/0.5)。不透明面按 sol-air 折算 U·A·α·GHI/h_o(h_o=22.7 W/m²K, 墙面另乘 0.5 朝向因子)。求解器对显热与湿平衡两线性式经结露潜热耦合做阻尼(0.5)不动点迭代, ≤50 轮; 不收敛回落 T_room=室外并置 converged:false(断言 R1 + 界面 danger 双通道)。池面显热系数由既有 evapCoeff 经 Lewis 类比反推(β 的钳制同步作用于显热 —— 蒸发与显热同一张换热面, 不另取 5 或 15 的常数); 通风显热直接吃 0.34 系数的 UA 项, 与报告口径同源(否则 ρ 口径差在大体积×高 ACH 下产生数百 kWh/d 虚假残差, 空气节点闭合断言会咬到工具误差而非真错)。超饱和钳到饱和线、结露潜热回注显热式、凝水量 kg/d 出腐蚀风险告警。
简易档下暖通显热与除湿电耗严格为 0, 由断言 R3 锁死 —— 该零是「设备不存在」而非「算了不计」。池面显热带符号接入水侧热平衡: 三亚设计夏车间解至 36.7°C(室外 35 + 太阳/内热推高、27°C 池水拉低), 池面转为得热, 水侧冷负荷 3,894 → 4,520 kWh/d。同基准三方对照(石斑/三亚/密度20/air/关塔/annual): 恒温 hvac-off 63.9 元/kg(仍计除湿 711 kWh/d 电 —— 那台机在该档真实存在)→ 简易棚 62.6 元/kg。热泵冷负荷确实上升(6,157 → 6,298 kWh/d, 与 A.4 预测机理一致), 总成本却略降 —— 除湿整机移除的省电压过池面得热代价, 这是把「假简易」(关电费开关)换成「真简易」(机器不存在)的正当结果; v1.x 失败特征(车间坍缩到室外之下、池面白捡散热)经标定确认未重演。
R1 收敛性 · R2 物理界(下界对规格原文做了推广: min(室外,水温,地温)−0.1 —— 冷水鱼种池面是合法低于室外的热汇)· R3 模式互斥 · R4 取值合法性与向后兼容(未设 roomMode 的旧 JSON 必落恒温档; 白名单守卫在 UI 读取与消费点两侧同口径)· R5 空气节点显热闭合(围护+通风流出 = 太阳+内热+池面+尾气+结露, 容差 max(2, 0.5%), 守恒断言 B 的自由节点版)。五组破坏性负对照逐一验证闸门: 强制不收敛→R1、撤暖通守卫→R3、求解器丢尾气项→R5、太阳归零→标定钩子、池面归零→标定钩子。标定探针(tools/probe_room_calib.js)固化三组实测锚点; 首版判据「命中实测点 ±2K」全数失败但逐项热流物理自洽 —— 偏差来自锚点场景重建不确定度(iRAS 建筑几何是成本驱动的紧凑型, 内热密度 200+ W/m², 与实测场几何不可比), 判据遂改为方向 + 有界偏移 + 三类热源在场且量级合理, 点值降级为诊断输出。追着实测点调工况旋钮 = 曲线拟合表演, 教训保留在探针头注。
关塔空气曝气的 CO₂ 新风份额(v2.3 遗留): 气泡把池水 CO₂ 吹入车间, 新风需求此前只按脱气塔份额计; 现关塔且曝气入室时份额取 1(零新常数)。对 air+关塔的恒温档工况有真实影响(三亚案例约 +0.3 元/kg); 13 条 o2 基线逐位不受影响。开塔时曝气残余份额未细分, 维持开放项。使用: 全局热工面板顶行「🏠 车间模式」三档; 简易棚建议 ACH 15–30(上限已放宽); 结露告警优先加大通风; 车间比水温低 >2 K 提示寒潮核对鱼种耐受下限。ventHR(通风热回收)在自然通风棚语义上应为 0, 模型不强制 —— 用户若留非零值等于假设有被动回收构造, 参数哲学是用户定参数、模型只管算。
本版全部起于一句产业侧提问: 空气曝气是直接加在池子里的, 曝气的时候鱼也在消耗, 所以空气用量要远大于 95% 饱和度。顺着这句话查下去, 发现模型对同一台鼓风机 K-101 用了两套互相矛盾的拓扑, 并连带挖出一处潜伏的跨模块不同源缺陷。13 条数值基线逐位不变, 自检 24 条工况不变, 新增断言 M9/M10/M11。
选型侧 tankAerationDesign 按池内曝气算, 完全正确: 池水维持 DO_design = max(DOmin_abs, 0.7×DO_sat) ≈ 5 mg/L, 推动力只剩 (C_sat−C)/C_sat ≈ 26%, OTE = SOTE/m × 水深 × αβ × 1.024^(T−20) × 推动力 折算后仅 2.2–4.5%, 风量据此反推 —— 这正是提问者说的"远大于饱和所需"。水质侧 simulateWaterQualityProcess 却写着 satTarget = 0.95(air 模式写死)、tankDO = DO_sat×0.95 − ΔDO_per_cycle, 这是氧锥/增氧塔在主管路上把水打到位再送进池子的拓扑。可 air 模式的设备是 鱼池增氧鼓风机 K-101, 气直接打进池子, 根本没有"进池浓度"这个概念 —— 增氧与耗氧在同一个控制体内同时发生。后果是鱼被"呼吸了两次": 选型侧已按维持 5 mg/L 配好风机, 水质侧又假设进池 95% 再扣一整个循环的耗氧量。
air 分支改为池内质量平衡: OTR(C) = A × 1.2 × 0.23 × OTE_base × (C_sat − C)/C_sat = OCR ⇒ C = C_sat − OCR × C_sat / (A × 1.2 × 0.23 × OTE_base)。与循环流量无关 —— 循环流量只管 TAN/CO₂/TSS 的移除, 不管 O₂。零新常数(1.2 与 0.23 与选型侧同源); OTE_base 是推动力折算之前的基础效率, 为保 13 条基线逐位不变, 原 OTE 表达式逐字符不动、此处独立重算一份。o2 分支逐字保留(氧锥确在主管路上, 原口径本就正确)。
修正前后对比(石斑/三亚/200t):
| 密度 | 阶段 | 修正前 DO | 修正后 DO | 选型侧 DO_design |
|---|---|---|---|---|
| 20 | 苗种期 | 2.70 | 5.41 | 5.00 |
| 31.2 | 苗种期 | 0.21 | 5.37 | 5.00 |
| 40 | 苗种期 | 0.00 | 5.31 | 5.00 |
| 40 | 成鱼期 | 2.73 | 5.38 | 5.00 |
修正后 DO 不再随密度崩塌, 且高出 DO_design 的那一点正是选型安全系数 safetyAerator=1.10 的效果。解析验算: 开塔(O₂ 控制)工况 deficit = (6.73−5.00)/1.10 = 1.573 ⇒ DO = 5.158, 模型三个阶段输出全为 5.158, 与手算逐位吻合。⚠ 修正前那个 0.00 是拓扑用错产生的伪值, 不是"会死鱼"的物理结论 —— 本手册特此记录, 防止后人把它当作历史结论引用。
诊断中发现探针复算与模型内部风量对不上(苗种期 222 vs 132 m³/h), 而成鱼期完全一致 —— 差异只出现在 O₂ 控制的阶段。根因: recDepth_m 是鱼种库的逐阶段字段, 而 tankAerationDesign 被两条路径各调一次:
| 路径 | 传参 | 拿到的水深 |
|---|---|---|
| 设备选型 / CAPEX | tankAerationDesign(stage, ...) | 真实值(石斑苗种期 1.5 m) |
| 水质链 / η_co2 / DO / 强度 | tankAerationDesign(sp, ...) | 白名单无此字段 ⇒ 静默兜底 3 m |
OTE ∝ 水深、风量 ∝ 1/OTE, 苗种期两侧差 1.68× —— CAPEX 买的机器与水质链假设的机器不是同一台。该白名单上方就挂着 v1.1.2 的注释「sp 必须包含 DOmin_satRatio 和 DOmin_abs, 否则鱼种内置 DO 阈值失效」: 同一个白名单、同一种漏字段、第三次复发。负对照(撤掉修复)证明24 条自检依然全绿 —— 因为两条路径各自内部自洽, 只是彼此不同源, 这正是它能潜伏至今的原因。故封在断言层(M11 跨模块风量同源), 不是注释层。
总风量由鱼的耗氧决定, 几乎不随密度变(密度 20→60 时 222→332 m³/h, 因鱼的总量由产量定); 而水体 V = 生物量/密度 ⇒ 强度 ∝ 密度, 密度 3 倍则强度 4.5 倍。新增派生量 sim.aerIntensity: 体积强度 m³/(m³·h)、池底布气 m³/(m²·h)、两口径各自反算的该阶段 air 模式可行密度上限(因 V 与密度严格反比, 反解精确而非外推; 唯一一阶近似是风量本身随密度的微弱变化, 偏差 <10%)。
阈值的出处与局限都写在 WATER_LIMITS 注释里, 使用者必须知道它们不是福利阈值的直接规定: ① 体积 2.0 —— 源自 33.3 m³ 池微孔曝气 CFD+实测, 30 m³/h 相对 60 m³/h 标准曝气效率高 32.1%(即 0.90 相对 1.80), 0.90 是能效拐点, 2.0 是在其上留工程余量的告警线; ② 池底 3.0 —— 由"纳米盘(孔径 80–100 μm)每 m² 池底 1 个 × 单盘常规工作气量 1.5–3 m³/h"反推的工程惯例, 非规范条文。定性佐证只入注释不入判据: 池底/穿孔管曝气的气泡上升对水体产生扰动与噪音、不利养殖生物生长, 且紊流会把残饵粪便搅碎成细颗粒使水质恶化(气提式无扰动曝气装置的研究动机); 三文鱼计算机视觉实验显示曝气开启时通气频率升高, 且与 DO/水温无关, 属对紊流与气泡流的行为响应 —— 即DO 达标不等于鱼没有代价。
石斑/三亚实算:
| 密度 | 阶段 | 水深 | 风量 m³/h | 体积强度 | 池底强度 | 可行密度上限 |
|---|---|---|---|---|---|---|
| 20 | 苗种期 | 1.5 | 222 | 2.65 ✗ | 3.97 ✗ | 15.1 |
| 20 | 成鱼期 | 3.0 | 1270 | 0.57 ✓ | 1.71 ✓ | 35.0 |
| 40 | 苗种期 | 1.5 | 267 | 6.37 ✗ | 9.55 ✗ | 12.6 |
| 40 | 成鱼期 | 3.0 | 1270 | 1.14 ✓ | 3.43 ✗ | 35.0 |
成鱼期可行上限 35 kg/m³ 与国际经验线接近 —— Global Seafood Alliance 的 RAS 综述指出密度高于 40 kg/m³ 时鱼与细菌的耗氧速率通常已超出常规曝气设备溶入大气氧的能力, 必须改用气态纯氧。差别在于 35 这个数是从曝气强度推导出来的, 不再是拍脑袋的门槛。苗种期上限只有 12–15, 但这更说明"把同一密度套在三个阶段上"本身不合理 —— 曝气强度约束的是"密度 × 阶段"的组合, 不是全场密度。
M9 气曝-DO 闭环(air 模式稳态 DO ≥ DO_design − 0.05; 与 M8 气曝-CO₂ 闭环成对, 一个锁 O₂ 侧、一个锁 CO₂ 侧) · M10a 体积/池底口径几何自洽 · M10b/c 可行密度反算自洽 · M11 设备侧/水质侧风量同源。四组负对照逐一验证闸门会咬人: 撤 DO 修正 → M9 红(三条 air 工况全咬, 罗非默认密度即报 2.08 vs 4.70) · 池底面积错水深 → M10a 红(7.240 ≠ 10.860) · 反算写成加法 → M10b 红(2.393 ≠ 2.000) · 池底口径误用体积阈值 → M10c 红(2.000 ≠ 3.000) · 撤 recDepth_m 白名单 → 修 M11 前无人咬住(24/24 全绿), 修后转红。另补车间高温告警, 与简易模式批次的寒潮告警对称: 比水温高 >5 K 管热泵冷负荷(池面转得热), 绝对 >38°C 管作业条件与风机/变频器降容。
本版的产业来源。石斑/三亚/200t/简易棚(ventilated, ACH 15)/关脱气塔/关臭氧与 AOP/放大系数 1.8: 密度 20 → 70.29 元/kg(35.1 元/斤), 密度 31.2 → 58.77, 密度 40 → 54.23(27.1 元/斤)。密度 40 下 DO 5.31–5.38 达标; CO₂ 20.45 mg/L 在阈值 22.5 内 —— air 模式的曝气本身即脱气, 不需另配脱气塔(反之 o2 模式关塔会让 CO₂ 冲到 257.91 mg/L、pH 掉到 5.67, 纯氧模式脱气塔是必需品); 全年凝水为零(海南冬季室外 18–20°C, 围护内表面始终高于露点, 简易模式批次的结露告警在此气候区空转, 要到青岛大连才有意义)。唯独曝气强度全线超限。真正的限制是夏季车间温度(设计夏 36–41°C, 池面转得热直接进热泵冷负荷; 加大 ACH 可降温但推高 RH, 热带自然通风无法同时降温除湿)与曝气强度 —— 不是 DO、不是 CO₂、不是湿负荷。
车间模式重新划分为三档: conditioned 恒温恒湿车间 / natural 自然通风车间 / mechanical 机械通风车间。分档判据只有一条: 能否自动调节温湿度 —— 不是"简易还是正式", 也不是"自然还是机械"。同时补上一台此前两档共同缺失的设备: 车间通风机 KV-1003。13 条数值基线因此全部重算。
本版起于产业侧一句反问: "恒温恒湿车间也有机械通风"。确实如此 —— 恒温档的 ACH 新风量一直参与计算(UA_vent_sens 进暖通负荷), 但从来没人给它配风机: 全场四台风机(脱气塔 / BF / 蛋分 / 池内增氧)没有一台是车间通风机。所以通风方式不是某一档的子类型, 而是横跨两档的独立事实。三档扁平命名后, "恒温恒湿 + 自然通风"这个物理上不成立的组合被天然排除 —— 你不可能一边花钱把室温压到 27°C, 一边让室外热风自由穿堂。
⚠ 键名变更: 简易模式批次的 ventilated 改名 natural; open(露天)已于池内曝气批次撤销。二者均不留别名 —— 留一条永远没人走的路径只会扩大审计面。旧方案 JSON 写这两个值的, 与任何非法值同路回落 conditioned(断言 R4b 覆盖)。
功率 = 风量(m³/s) × 全压 ÷ 效率, 与既有四台风机同一套公式。
易错点一 — 风量口径。 必须取 V_vent_eff_m3h = max(ACH×V_room, CO₂ 稀释需求), 不是 ACH×V_room。air 模式关脱气塔时 CO₂ 才是控制项; 负对照实测挂错口径低估 58–66%, 且只在 CO₂ 控制的工况暴露 —— 只测 o2 模式永远不会显形。由 M12a 锁住。
易错点二 — 全压。 独立键 ventFanPressure_Pa 默认 250 Pa, 绝不复用池内曝气盘的 70 kPa: 后者要克服水柱静压, 前者只克服风管与百叶阻力, 差两个数量级。实测 173,123 m³/h 下 250 Pa 给 21.9 kW, 误用 70 kPa 给 6,121 kW —— 与 HANDOFF 记录的 K0_W74 传摄氏度事故(airCO₂ 冲到 1e10)同族, 故独立成键并在两处留警示注释。
热去向为登记表新增的 exhaust 类别: 直驱轴流排风机电机在排风气流中, 空气离开车间后才经过电机 ⇒ 废热随排风带走, 既不进车间也不进水。与 external(臭氧发生器独立机组冷却介质带走)的区别在成因, 结果同为界外。⚠ 已知边界: 恒温恒湿车间若用送风式 AHU, 送风机废热确实进车间并需再制冷; 本版按单风机排风统一处理, 该情形下偏低。UI 提示: 送排平衡式请把全压按两台之和折算。
补一台真实存在的设备必然改变基线, 故按纪律先出预测表再改代码。预测: 全部 13 条上升、幅度 +0.01~+0.08 元/kg(≤0.1%)、最大为 turbot_500(水体大, 通风量 5 万 m³/h)。
| 工况 | 旧 | 新 | 实测 Δ | 预测 Δ |
|---|---|---|---|---|
| salmon ×6 | 37.69–44.15 | +0.010 | +0.010 | +0.01 ✓ |
| tilapia_1000 | 30.9163 | 30.9252 | +0.009 | +0.01 ✓ |
| turbot_500 | 56.1492 | 56.2340 | +0.085 | +0.08 ✓ |
| grouper_500 | 44.6083 | 44.6291 | +0.021 | +0.02 ✓ |
| bass_300 | 46.4027 | 46.4289 | +0.026 | +0.02 ⚠ |
| eel_200 | 61.0096 | 61.0276 | +0.018 | +0.02 ✓ |
| mandarin_200 | 58.6372 | 58.6792 | +0.042 | +0.04 ✓ |
| shrimp_100 | 50.4214 | 50.4856 | +0.064 | +0.06 ✓ |
方向 13/13 为正、量级 13/13 吻合, 最大偏差 0.006 元/kg(bass_300, 差在预测未计 CAPEX 折旧那一份)。幅度远小于口头估算的 +0.8 元/kg, 原因是基线默认 ACH 为 1 而非简易棚的 15 —— 同一台风机放到海南工况(ACH 15)是 21.9 kW(密度 20)/ 10.9 kW(密度 40), 密度高反而小, 因为车间体积减半, 这是高密度此前没算出来的一项红利。
恒温恒湿档下用空气曝气, 气泡带进车间的 CO₂ / 湿 / 热各有归宿(石斑/三亚/200t/密度20/年均实测):
| air 关塔 | air 开塔 | o2 对照 | |
|---|---|---|---|
| CO₂ → 新风需求 | 9,835 m³/h 成为控制项 | 0 | 0 |
| 实际新风 | 9,835 | 7,116 | 7,116 |
| 尾气入室产湿 | 290.8 kg/d | 250.7 | 0 |
| 除湿量 / 除湿电 | 1,776.9 / 710.8 | 1,629.3 / 651.7 | 1,378.6 / 551.4 |
| 尾气显热 | 0.0 | 0.0 | 0.0 |
CO₂ 经 fracIndoorCO2 → V_vent_fish_m3h 与 ACH 口径取大值, 关塔时把新风顶高 38%, 这部分新风的冷热负荷全压给暖通。湿按 ṁ_air × (W_sat(T_w) − W_room) 计入车间产湿, 除湿量较 o2 档 +29%。热的尾气显热恰好为零 —— 这不是漏算: A3 下 T_room = T_w, 而尾气离开水面时温度就是 T_w, 显热项数学上严格为零; 该零只在恒温档成立, 到通风档 T_room 是解出来的, 这一项立刻复活(海南夏季 −93 kWh/d, 冷尾气反过来给车间降温)。v1.x 当年正是被这个"恰好为零"骗过, 重写车间求解时漏掉了它。另有一段热记在别处: 进气自室外取, 被加热并饱和加湿到 T_w, 这段由水侧的气液接触器换热承担, 不进车间账本 —— 两本账各记一次, 不重不漏。
据此三条告警: ① 恒温恒湿 + 空气曝气(新风与除湿双重加价, 成鱼养成建议改纯氧)· ② 新风被 CO₂ 顶高(同一股 CO₂ 在通风车间只需付风机的钱, 为省一台脱气塔而关塔请核对这笔账)· ③ air 模式开塔冗余(曝气本身即脱气, 关塔后 CO₂ 20.5 仍在阈值 22.5 内)。
第 ③ 条有一个例外值得记住: 脱气塔在 air 模式下虽非 CO₂ 达标所需, 却是调节曝气强度的杠杆 —— 密度 40 成鱼期关塔时 CO₂ 侧需 1,270 m³/h 反超 O₂ 侧 1,095, 成为风量控制项, 把池底布气顶到 3.43(超 3.0); 开塔卸掉 CO₂ 负担后风量回落 1,095, 强度 2.96 合规。告警文案按阶段判断 sizedBy 分别措辞, 风量由 O₂ 控制时明说"开塔不会减少风量, 纯属多花钱"。
⚠ 三条告警都写明什么时候可以忽略它: 育苗 / 亲鱼车间本就是恒温恒湿 + 空气曝气的常态配置(密度天然低、水温与光周期要求精确、鱼苗对纯氧过饱和敏感 —— 模型里苗种期 TGP 阈值本就更严的 110%), 而 roomMode 是全局键、aerationMode 是逐阶段键, 该组合会自然出现, 不是误操作。若每次打开都见红字, 久了就没人看告警了。
此前几轮关于"空气曝气能撑多少密度"的推算, 全部依赖设备商配置反算与媒体报道。取得海南省地方标准 DB46/T 424—2017《豹纹鳃棘鲈工厂化养殖技术规程》正文后, 这条链才有了成文依据。
标准表 1 · 分规格养殖密度(直接给 kg/m³, 无需折算):
| 体长 cm | 体重 g | 尾/m³ | kg/m³ |
|---|---|---|---|
| 10–15 | 7–45 | 150–250 | 1–5 |
| 15–20 | 45–85 | 100–150 | 5–15 |
| 20–30 | 85–280 | 70–100 | 15–20 |
| 30–40 | 280–650 | ≤70 | ≥20 |
标准明写密度的约束条件: 「养殖密度与养殖设施、换水量、溶氧量密切相关, 换水量越大、溶氧量越高的养殖水体, 可适当增加养殖密度」—— 正是本模型一直在建的逻辑链。4.4 增氧设施「采用鼓风机+纳米管或纯氧统一供氧」, 二者并列为合规方案、未规定密度分界; 结合密度表, 20 kg/m³ 量级下鼓风机+纳米管是标准认可配置, 印证空气曝气承载量 20–25 的落点。6.2 水质指标 DO≥5 mg/L 与模型 DO_design = max(DOmin_abs 5, 0.7×DO_sat) 逐字相符; 修正后的池内曝气稳态 DO 5.16–5.41 正在标准线之上。
⚠ 换水率口径不可混用: 标准 6.1「流水养殖模式下日换水量一般控制在 200%~800%」是流水模式(日 2–8 倍水体), 循环水模式低两个数量级, 与模型 exchangeDaily 不是一个口径。
石斑成鱼期 recDepth_m 由 3.0 m 改为 1.5 m, 依据标准 4.2「养殖池面积 10–20 m²、池深 1.0 m–1.5 m」; 万宁在建工厂化项目实测池型 Ø8 m / 90 m³ ⇒ 水深 1.79 m, 亦远浅于原值 3.0。
⚠ 该字段是统一池深数据源: poolArea = V_tank / poolDepth → A_building = 1.6 × poolArea → V_room = A_building × H。改它会连锁改池面积、建筑面积、蒸发面与通风量, 故基线随之重算。按纪律先出预测再改: 池面积翻倍 ⇒ 蒸发↑、除湿↑、围护散热与通风量↑ ⇒ 仅 grouper_500 上升且幅度显著(远大于此前几次的 +0.01 量级), 其余 12 条逐位不变。
| grouper_500 | 旧 | 新 | Δ |
|---|---|---|---|
| 工艺成本 元/kg | 44.6291 | 44.8341 | +0.2050 |
| 企业全成本 元/kg | 54.3236 | 54.5412 | +0.2176 |
| 比电耗 kWh/kg | 14.1210 | 14.3427 | +0.2217 |
| 热泵成本 元/kg | 1.6019 | 1.7419 | +0.1400 (+8.7%) |
预测完全命中, 其余 12 条 diff = 0。热泵涨幅最大(+8.7%)正是蒸发面翻倍导致的潜热负荷。副效果: 成鱼期池底布气强度由 1.71 降至 1.48, 从超限转为合规; 可行密度上限 19.8 → 23.0 kg/m³, 与标准表 1「30–40 cm 段 ≥20」及产业口径 20–25 一致。
控光: 已知未建模维度。标准把控光列为要求项 —— 4.2「配备通风、控光、控温设施」(与通风、控温并列)、6.2「光照 2000 Lux~5000 Lux」(与 DO/pH/温度/盐度同级的受控参数)。产业侧佐证: 东星斑养殖场用蓝光、红光模拟 20–30 m 深的海底光照环境, 因为体色直接决定售价。iRAS 目前只有 UV 消毒(水处理), 没有养殖照明, 缺口有三: ① 灯具电耗未进 POWER_REGISTRY, 比电耗系统性低估; ② 灯具废热未进车间空气节点(与补 UV/泵废热同族的漏项); ③ 体色分级溢价未进财务侧 —— 这是唯一一条收入侧缺口, 其余全部遗留都在成本侧。不在本批建模: 需灯具选型口径(W/m² 或 Lux→W 换算)、光谱配比、光周期, 且体色-售价的量化关系无公开数据, 硬做即编造。
原限值 2.0 m³/(m³·h) 与 3.0 m³/(m²·h) 的依据是搅拌式反应器能效拐点与对虾育苗盘密度反推, 用在鱼身上偏松 2–3 倍。经产业配置反算后下调至鱼类档 1.0 / 1.7, 原值保留为甲壳类档 —— 工厂化对虾的正常工况就是"水面气泡成沸腾状", 絮团模式还需曝气维持颗粒悬浮, 二者不可共用一个限值。
标定口径写死为全压 20 kPa · 风机效率 0.60 —— 产业确认 1 m 深的池子 20 kPa 够用(罗茨风机压力经验 9.8 kPa/m 水深)。⚠ 刻意不写"20–30 kPa"这类区间: 全压取 20 与 50 kPa 结果相差 2.5 倍, 含糊比精确更危险, 复核时务必按此单一口径。
| 来源 | 配置 | 池底 m³/(m²·h) | 体积 m³/(m³·h) |
|---|---|---|---|
| 山东海水工厂化(空气悬浮增氧机) | 18 kW / 2000 m²(深 0.8) | 0.97 | 1.22 |
| 山东海水工厂化(老式罗茨) | 22 kW / 1440 m²(深 0.8) | 1.65 | 2.06 |
| 工厂化对虾 | 15 kW×2 / 1000 m³(深 1.2) | 3.89 | 3.24 ⚠水面沸腾状, 鱼类不适用 |
⚠ 二次修订: 两个判据曾自相矛盾, 这是本批最该记住的一条。一次修订把池底 1.7(来自养殖池真实配置反算)与体积 1.0(来自搅拌式生物反应器的能效拐点 0.9)并列当判据用 —— 两个数来源不同质。结果在 0.8 m 浅池上直接打架: 同一套真实运行的系统, 按池底判据合格(0.97 / 1.65 < 1.7), 按体积判据却超限(1.22 / 2.06 > 1.0)。因 池底 = 体积 × 水深, 池底 1.7 在 0.8 m 水深下隐含的体积上限本应是 2.1, 而当时设了 1.0。
现改为主/次判据结构: 池底为主判据(有真实工程配置支撑), 体积为次判据且阈值取在全部实测之上, 只拦极端情况。告警文案亦按主/次分别措辞。
| 池底(主判据) | 体积(次判据) | |
|---|---|---|
| 鱼类 | 1.7 | 2.5(实测 1.22–2.06 之上) |
| 甲壳类 | 4.0 | 3.5(实测 3.24 略上) |
注意甲壳类那档: 一次修订误设的 3.0 / 2.0 低于对虾的真实配置(3.89 / 3.24)—— 等于把一个正常运行的工况判成超限。这是"拿 A 场景的数字当 B 场景阈值"的第二个实例(第一个是拿反应器能效拐点当养殖池福利阈值)。
布气密度口径交叉印证: 纳米盘按每 m² 池底 1 个布置(孔径 80–100 μm, 曝气压力 0.02–0.03 MPa); 对虾池 5.5×5.5 m 配纳米管总长 28 m ≈ 每 m² 池底 0.93 m 管 —— 两者量级一致。
承载量交叉校验: 取鱼类 1.7 时, 石斑成鱼期反算可行密度 19.8 kg/m³。这与设备商系统参数吻合 —— 同一套海水工厂化循环水系统, 最大生物承载量为「半滑舌鳎 10 kg/m²(液氧 15)、大菱鲆等 20 kg/m²(液氧 40)」, 即空气曝气的承载量约为纯氧的一半; 亦与 GSA「密度 >40 kg/m³ 时耗氧速率超出常规曝气设备溶入大气氧的能力, 必须改纯氧」一致。三个独立来源收敛于空气曝气鱼类承载量 20–25 kg/m³, 产业侧确认 30–40 配空气曝气偏高。
⚠ 仍未解决的不确定度: 上述反算全部依赖假设的全压(20–30 kPa)与风机效率(0.6), 全压取 20 与 50 kPa 结果差 2.5 倍; 且多数来源未给出对应的养殖密度, 严格说不可直接互比。若能取得近两年新建海水鱼工厂化项目的完整设计参数(密度 + 增氧方式 + 风机配置三者齐备), 应据此重校。常量注释已完整记录出处与局限。
新增断言 M13 与工况 edge_shrimp_air(自检 24 → 25 条)。立此断言的直接原因值得记录: 新增鱼种字段 isCrustacean 后, 负对照证明把它从 recomputeAll 的 sp 白名单里撤掉, 24 条自检依然全绿 —— 与 recDepth_m 完全同一模式的第四次复发(前三次: v1.1.2 的 DOmin_*、本轮的 recDepth_m)。注释提醒挡不住, 只有断言能。凡"鱼种库有字段 → 白名单转发 → 消费点使用"这条链, 都应有一条断言校验消费点拿到的确实是鱼种的值。
⚠ 更值得记的是第二层: 断言写好后负对照仍然全绿。查明原因是没有工况能触发它 —— aerIntensity 仅在 air 模式下计算, 而 shrimp_100 基线走 o2 模式。补 edge_shrimp_air 工况后负对照才精确转红(实得 1/1.7, 应为 2/3)。新断言必须确认存在能走到它的工况, 否则等于没写 —— 这条教训与"断言先负对照转红"的纪律是一体两面。
交付后的一个提问("空气曝气对 CO₂ 的去除如何建模")牵出一处被误判为缺陷、实际是正确设计的地方, 特此记录以防后人"修正"它。
模型的 CO₂ 脱除走三步: ① 亨利平衡载量 kLoad = (1/44010/ρ/K0)×44.01/Vm(K0 用碳酸盐模块的 Weiss 1974 溶解度常数, 与 pH/Ω 求解同一套参数, 无第二份副本); ② 反推所需风量 airCO2 = CO₂日产量×安全系数 /(kLoad×目标浓度×逼近度)/24, 再与 O₂ 侧取大值并标注 sizedBy; ③ 稳态去除率由选定风量反算 η = 风量×kLoad×逼近度/循环流量, 而非独立旋钮 —— 这是 v2.3 二批修复的核心(旧版 fallback 旋钮与风量互不知晓, 海南石斑关塔实测池水 CO₂ 冲到 55–179 mg/L 而选型侧毫无反应), 断言 M8 锁住该闭环。
看似的不一致: O₂ 侧 OTE ∝ 水深, CO₂ 侧与水深无关。查证后确认这是两种传质机制的正确区分: O₂ 溶入是【速率控制】(推动力大, 气泡全程远未饱和, 接触时间越长溶入越多); CO₂ 脱除是【气相载量控制】(气泡在离开液面前已被 CO₂ 饱和, 再深也装不下更多)。生物反应器放大实测: O₂ 的 kLa 斜率随液深线性增长, 而 CO₂ 的 kLa 仅在液深 < 约 1000 mm 且最弱搅拌下线性, 更深/更强搅拌时出现明显饱和效应(气体停留时间足够长, 气泡出液前已被充分饱和); CFD 研究同样确认大型反应器中 CO₂ 吹脱时气泡在离开培养液前即饱和, 且放大过程中 O₂ 与 CO₂ 的 kLa 演化路径不同。若照"给 CO₂ 补上水深依赖"去改, 反而会把一个正确的模型改坏。
真正的问题在浅池: 饱和的前提是停留时间够。鱼种库里大菱鲆全程 0.8–1.0 m、石斑苗种期 1.5 m, 都在转折点附近或以下, 这些工况的 CO₂ 去除被系统性高估 —— 而大菱鲆是冷水鱼、CO₂ 阈值更严(20 而非 30 mg/L), 又常用平面浅池, 三重叠加。故新增浅池告警(水深 < 1.5 m 且 air 模式关塔时触发)。实测触发精确: 大菱鲆三阶段全触发, 石斑 1.5 m 及以上不触发, 开塔与 o2 模式均不触发。
⚠ 只告警不折减, 这是有意选择: 那个 ~1000 mm 转折点出自搅拌式生物反应器, 气泡尺寸、上升速度、湍流强度与养殖池微孔盘曝气都不同, 转折点位置未必能直接搬。拿一个来源不同的数字当阈值就是曲线拟合表演(与 probe_room_calib.js 头注记录的标定哲学同款教训)。宁可显式承认不确定, 也不假装知道折减多少。
⚠ 另记一条待查: 级联塔实测(淡水 0‰ vs 盐水 35‰, 15°C, 进水 10–60 mg/L)显示两者传质系数相近, 但盐水的 CO₂ 吹脱效率显著低于淡水, 归因于出水重建平衡时无机碳各形态电离分数的差异, 并直接指出海水循环水系统的 CO₂ 去除比淡水更困难。模型 kLoad 里的 ρ 与 K0 已含盐度, 但那是溶解度的盐度效应, 不是电离分数造成的额外损失。而现有 marineCO2Factor: 0.75 挂在 CO₂ 限值上, 其注释自承"代码中无出处标注、教科书亦未按盐度区分 CO₂ 限值、该系数应单独查证"—— 该系数可能挂错了位置: 海水该被区别对待的或许是去除效率而非限值。本版不动, 记入遗留。
M12a 通风机风量与热工侧真实通风量同源 · M12b 档位一致性(自然通风档必须无风机, 恒温恒湿 / 机械通风必须有 —— 后者正是"恒温恒湿本身即机械通风"这一判断的运行时证据)。负对照: 风量挂错口径 → M12a 红(429.5 ≠ 1023.3, −58%; 1944 ≠ 5762, −66%)· 恒温档不装风机 → M12b 红(FAIL 3/24)· 误用 70 kPa 全压 → 13 条基线红(FAIL 11/24)。
实施中另有一次真实被咬值得记录: CAPEX 选型门槛(if(_vf > 0.3))与登记表 capexMinKw 不同源时, 断言 F4 当场报出"ventFanKw 有电功率但 CAPEX 明细中无对应条目"—— 这正是 v2.2 为 BF 风机建立该机制时预期的用途。
〔本章含 v2.3.3 全部六批: A–F 一批(字段流转工厂化) · G 二批(aerationMode 硬告警) · H 三批(密度分界 40→30) · I 四/五批(设计工况点 + 哨兵盲区) · J 文档批(手册第 15 章追平代码)。 章标题此前只写一批主题, 与章内实际内容不符, J 批一并订正。〕
版本主题只有一件事: 治「权威源 → 转发 → 多消费点, 某个消费点没接上; 各自内部自洽故断言全绿」这一缺陷模式。它在本库已复发五次(v1.1.2 DOmin_* / recDepth_m / isCrustacean / 通风机风量口径 / 曝气侧池深不同源), 每次补断言只封住当次字段, 模式换个字段就复发——上一版交接文档已把"工厂化"列为遗留清单第 0 位。本版为纯结构重构, 13 条数值基线对【v2.3 新基线值】逐位不变(重构版的最强验收条件), 自检 26 → 27 条。
五次复发的案发现场是 recomputeAll 里的手写白名单: 每漏一个鱼种字段, 就多一处静默兜底。现每个字段在 SPECIES_FIELD_FLOW 声明 {scope, toSp, resolve?}——scope 标记权威源层级(阶段字段 / 鱼种级字段 / 派生), toSp 声明是否转发进水质侧, resolve 为解析函数(省略即原样转发)。buildWaterSp(stage) 按表生成 sp, 手写字面量退役。池深解析(用户设定 > 鱼种推荐 > proc 兜底 > 1.5, 下钳 0.3 m)收敛为 resolvePoolDepth 全库唯一副本——此前三副本且兜底不一致(3 vs 1.5)正是"池深修一半"事故的温床。
选静态扫描而非运行时校验, 是对既往两次教训(M13 / M14: 断言写好后负对照仍全绿, 因为没有工况能走到那条路径)的机制性回应: 对水质链四个消费函数做 .toString() 源码扫描, 不依赖工况, 每次自检对全部代码路径无条件全覆盖。M15a 消费面每个 sp.X 必须声明且转发; M15b 每个转发字段必须有消费点(抓死转发); M15c recomputeAll 的 sp 必须来自工厂; M15d 设备侧 tankAerationDesign 调用必须经同一工厂。落地顺序刻意为先加断言(转红)再处置(转绿), 且上断言前先以预飞探针(tools/probe_fieldflow.js)在真实页面环境跑同一套扫描、确认红名单恰为预期。
M15a 上线即红: isWarmWaterStage 支持鱼种显式声明温冷水类别 thermalClass(注释明写"优先用鱼种显式声明"), 但该字段从未进过白名单——同模式第六例, 与 recDepth_m 完全同型, 只因尚无鱼种声明它而未被踩响。已补声明转发(阶段显式 > 鱼种级; 现状无声明 ⇒ 数值逐位不变), 声明能力自此真正生效。M15b 同批咬出 protein 死转发: 白名单转发了它, 消费面(水质链四函数)零处读取——真实消费者是 calcStageLoad, 走 stage.protein 直连不经 sp。已撤转发, 条目以 toSp:false 存档("该字段存在, 有意不进 sp"是一条信息, 删掉条目就丢了)。
此前设备侧传完整 stage、水质侧传白名单 sp——两侧传参形状不同, M11 只能事后比对两侧风量。现设备侧改为 tankAerationDesign(buildWaterSp(stage), …), 两侧吃同一工厂产物, "两侧不同源"在结构上写不出来; 两侧解析规则的微分歧(设备侧原缺 0.3 m 下钳与 proc 兜底——被 UI 输入范围掩盖着的潜在分叉)一并消失。M11/M14 保留为纵深防御, 不撤。
红→绿全程: 批① 忠实等价替换(protein 照转、thermalClass 照漏), 自检 26/26 + 基线逐位不变 → 批② M15 入列, FAIL 26/27, 红项恰为预飞命中的两条 → 批③ 处置, PASS 27/27 + 基线仍逐位不变。四条人工负对照(临时副本上做)全部精确转红: 表删 DOmin_abs → M15a · 塞假字段 ghostField_xyz → M15b · 手写白名单复活 → M15c 两条且级联咬中 M11/M14 数值断言(23.5 条自检中 6 项转红——结构层与数值层的双重防御得到实证) · 设备侧退回 raw stage → M15d。
M15 只覆盖「鱼种/阶段 → sp」这条链——五次复发的案发地。派生中间量的流转不在射程(V_vent_eff 一类, 第四次复发所在), 仍由 M12a 数值断言压着; 那是另一个量级的依赖图, 有意不在本版摊开。消费点内残余的 || sp.recDepth_m || 1.5 兜底对工厂产物是死代码, 仅为诊断脚本手造 sp 时保留防御——已在声明表头注如实标注, 不假称"解析规则彻底单副本"。
遗留清单第 5 位。侦察修正了问题定义: 渲染层其实已有曝气强度告警与 CO₂ 超标告警——真实缺口是: ① 两条告警困在渲染层(A.6 家族: 无导出面、无断言、渲染改坏无人知, 报告照出成本不带任何"该方案不可行"标记); ② o2 关塔这一物理上必然积累 CO₂ 的配置(仅剩增氧锥附带解吸 ~5%)与"塔效率不足"共用一句"建议启用"的文案, 严重性被淡化; ③ 参数表 aerationMode 处无联动。
落地形态: sim 新增结构化导出 configWarns = [{code, level, …data, rootCause?}], 两个 code: AIR_INTENSITY_OVER(复用 aerIntensity 全部字段)与 CO2_OVER(rootCause 三分 stripperOff / airUnderperf / stripperUnderperf)。判据是结果级而非配置级——CO₂ 稳态实测超阈值才响, 而非"o2+关塔一律响": 高换水/低密度下 o2 关塔确实可达标, 配置级会天天误报, 而"天天见红字就没人看告警"是前一批刚写进文档的原则。判据只复用 sim 已算出的量(aerIntensity / 鱼池 CO₂ / CO2_threshold), 零新阈值(纪律: 不拿来源不同的数字当阈值)。渲染层两块改为消费该数组单源, o2 关塔文案升格为「物理上必然积累, o2 模式必须启用脱气塔」; 参数表联动: aerationMode 选择器随每次计算着色并在 title 给出可行密度上限, 只提示不自动切换(不替用户改配置——改配置是工程决策)。这也是遗留 2(A.6 十一类告警进导出面)未来迁移的目标形态: 新告警按结构化建, 旧的逐步迁。
预飞定锚(教训: 断言必须先确认存在能走到它的工况): 探针 tools/probe_warnmatrix.js 对六类工况出触发矩阵——W1 锚 edge_air_aeration(罗非三阶段池底布气 4.84–7.24 vs 限 1.7, 必超)、W2 锚 edge_no_degasser(鲑四阶段 CO₂ 124–148 vs 阈 15/20, 必超); 13 条基线两标志全假; edge_shrimp_air 天然提供 W1 的"合规不响"侧(甲壳类档 0.79–1.77 vs 4.0)。
断言设计: W0 导出存在性(数组) · W1/W2 标志与底层状态双向 ⇔(该响必响 + 不该响必不响, 防告警恒真化)· 两处工况锚定——锚定与 ⇔ 刻意不同源: ⇔ 查标志与数据的一致性(同函数内, 防重构漂移), 锚定查物理预期(预飞矩阵给出的独立事实)。W3 为静态 .toString() 扫描(与 M15 同机制, 免疫工况可达性问题): 渲染层必须消费 configWarns 且引用两个 code 字面量——若渲染悄悄退回旧读法(直接判 aerIntensity / tank.CO2), 就回到"数据层↔渲染层双源各自自洽", 正是复发六次那个模式的翻版。W0–W2 入逐工况不变量循环(自检行数不变), W3 为新自检行 config_warns_render(27 → 28 条)。
红→绿全程: 断言先行上线即 FAIL 3/27(W0 遍布全库——红仪式全量咬中)→ 数据层落地转绿(含零产量早退分支的空数组骨架: 导出面结构必须完整)→ 渲染单源化 + W3 入列, 28/28。负对照 3/3 精确转红: 撤数据层 AIR 标志 → W1⇔ + W1锚咬(FAIL 24/28)· 渲染退回旧读法 → W3 咬中 CO2_OVER 引用缺失 · CO₂ 判据改错(阈值×10)→ W2⇔ + 锚咬(FAIL 26/28)。13 条基线三次比对全程逐位不变。
📌 负对照 NC3 顺带核实一个边界事实: edge_yield_tiny 工况的鱼池 CO₂ 实际为 21.5–23.7 mg/L、略超阈值 20——真实构建里该工况 CO2_OVER 标志为真且 W2 一致性通过, 行为正确; 它说明 CO2_OVER 在既有工况集中并非只有 edge_no_degasser 一个触发点, ⇔ 断言对所有工况统一生效。
处置遗留第 5 位。侦察修正了问题定义: 渲染层已有曝气强度与 CO₂ 超标告警, 真实缺口是告警困在渲染层(无导出面、无断言——A.6 家族), 且 o2 关塔这一"物理上必然积累"的配置与"塔效率不足"共用一句轻文案。落地四件: ① sim.configWarns 结构化导出(AIR_INTENSITY_OVER + CO2_OVER 带 rootCause 三分; 结果级判据, 零新阈值, 全部复用水质链已算出的量); ② 断言 W0–W2 锁数据层(双向 ⇔ + 双工况锚定, 预飞探针 probe_warnmatrix.js 事先实测触发矩阵: edge_air_aeration 池底布气 4.84–7.24 vs 限 1.7, edge_no_degasser CO₂ 124–148 vs 阈 15/20) + W3 静态锁渲染挂钩(防数据层↔渲染层双源复活, 与 M15 同机制); ③ 渲染改吃单源, o2 关塔文案升格为"o2 模式必须启用脱气塔"; ④ 参数表联动(aerationMode 选择器着色 + 可行密度上限 title; 有意不做自动切换——不替用户改配置)。红→绿全程: 断言先行 FAIL 3/27 → 数据层落地 28/28; 负对照 3/3 精确转红。13 条基线逐位不变。顺带发现 edge_yield_tiny 的 CO₂ 处于 21.5–23.7、略超阈值 20 的边界超标状态——结构化导出上线第一天就多看见一件此前无人知道的事。
产业侧质疑 UI 的 40 kg/m³ 偏高。查证不仅确认判断, 还更正了本库自己的一处引用错误: 注释记「GSA >40 必须纯氧」, 原文实为区间 + 硬上限两句(仅靠曝气典型限于 30–40; >40 则耗氧超出曝气能力)。旧注释把硬上限抄成分界线, UI 据此写成"<40 都可用空气"——把区间上沿当成了推荐值。新分界 30 取自 SRAC-453(美南水产中心 RAS 设计实践综述: 密度 <30 kg/m³ 时气提可提供全部需氧, 满密度 60 时仅约一半)——⚠ 该装置为开放池气提(效率约 0.80), 与本模型池内微孔盘不完全同源, 已标明。另有 TheFishSite「>50 才常规上纯氧」更宽松, 但答的是经济性问题而非工程能力问题, 不并列取值。口径分层(项目方定): 30 进 UI 与参数表(物理上限)· 20–25 进选择器 title 与注释(国标 + 设备商 + 模型反算三源收敛, 国内浅池实配)· 任一阶段准确上限始终以 aerIntensity 反算为准(随水深/温度/鱼种变)。教训: 根因不是数字取错, 而是抄数字时丢了口径(范围/硬上限/推荐值)——失去口径的数在传递中会变成另一种含义("超 40 肯定不行"传成"低于 40 都行")。已立为纪律: 凡引用外部数字, 须连同原文口径一并记录。
由产业侧追问"关塔时是不是该让用户输 CO₂ 浓度"牵出的一串处置。(1) 加载路径防线判据错位: ensureStageProc 以「默认值是不是数字」决定钳不钳, 而哨兵字段(默认 null)的 typeof 是 object, 整类漏在防线外——注入 co2TargetMgL=0.0001 使关塔风量 4,239 → 12.7 亿 m³/h, 与第七轮 P1 的 co2StripperGtoL=1e6 同族同路径。判据改为「FIELD_SPEC 表内有无条目」, 空值仍保持 null(未设定≠设定为下限)。断言 S1/S2 构造注入复验。(2) 两侧都拿安全红线当设计目标: CO₂ 取阈值(上限)、DO 取 DOmin(下限), 同一毛病两面, 系统贴红线跑无裕量。补成对称一对: 设计 DO + 设计 CO₂, 留空回落鱼种值(基线逐位不变)。实测控制侧可翻转: 留空时 CO₂ 侧 4239 险胜 O₂ 侧 4228, 设计 DO 提到 6.0 立翻 O₂ 控制(7243), 提到 7.0 达 15993(近四倍)——该决策此前藏在鱼种库"最低允许值"里替用户做了。(3) 池内曝气与循环流量无关(产业侧指出的拓扑差别, 已实测): turnover 1→4 时 air 模式 DO 恒为 4.9813, 而 o2 模式由 0 → 8.39; 两参数算式均不含流量。⚠ 如实记录一处二阶耦合: 关塔 CO₂ 稳态随流量小幅变(23.7→27.3), 系经风量的间接效应(流量低→TSS 高→耗氧高→风量大→多吹脱)。(4) air ⇒ 塔默认关: 罗非1000t 模型实算开塔 31.25 元/kg 关塔 26.20(省 16%, 比电耗近腰斩), 水质守得住; 代价是 CO₂ 转入车间, ACH 1.0→6.05(恒温恒湿车间需掂量)。联动只在 UI 事件层——计算层猜意图会静默改用户显式配置并动基线, 断言 S3 静态锁; 用户手动过开关后不再被覆盖。(5) 教训: 批B 给 co2TargetMgL 加了输入框, 随即发现 readStageProcFromInputs 根本没读它——UI 加了但白加; 断言 S4 因此同时查"留空须回落"与"填了须生效"。另补反向灰显 data-aeration-air: 新字段在纯氧模式下填了不起作用, 常显是误导。
前五批把空气曝气路线的代码补完了, 文档没跟上——最直接的后果是界面写 30、手册第 15 章写 40, 用户按哪个都不对。本批只改文档与文档级注释, 不动任何计算: 自检 29/29, 13 条基线逐位不变(三次比对)。
(1) 15.2 对比表重修: 密度分界 40 → 30, 并把口径分层写进正文(30 = SRAC-453/GSA 物理上限 ·
20–25 = DB46/T 424—2017 + 设备商参数 + 模型反算三源收敛 · 任一阶段准确上限以 aerIntensity 反算为准)。
另修两处同源矛盾: air 行的"~95% 饱和度"是 v2.3 前旧拓扑的说法; 新增"池水 DO 是否随循环流量变"与"CO₂ 去向"两行。
(2) 「微孔盘 SOTE 18%」退役: 它是清水标准态(20 °C / 零盐度 / 洁净水 / 初始 DO=0)下的值, 养殖池四个条件一个都不满足;
手册把它列作"吸收效率", 正是二批修掉的那个硬编码 0.18 的文档孪生体。换成完整 OTE 公式并逐因子标注,
附实算链: 清水标称 9.75% → 加 αβ 7.31% → 加 θ 8.63%(OTE_base) → 加推动力 2.22%, 差 4.4 倍;
并点明 OTE(选型用)与 OTE_base(水质侧解稳态用)是两个量。
(3) 15.3 标注适用范围 + 新增 15.3b / 15.3c: 15.3 的 DO 公式只适用纯氧拓扑(前提是"存在进池浓度"),
此前无任何标注——而 v2.3 那次"选型侧说 5.00、水质侧说 0.00"的事故根因正是它被误用到 air 模式。
新增 15.3b(池内稳态方程 / 两侧取大 / 设计工况点 / 完整例题 / 守卫与局限)与 15.3c(硬规则与设计选择之分 /
结果级判据 / 实算对照 / 已知缺陷)。正文数字全部为本版模型实算, 取数探针 probe_manual_ch15.js
与 probe_manual_ch15b.js 随交付。
(4) 两条写进手册的实算结论: 安全系数的去向可解析——实算DO = C* − (C*−设计DO)/safetyAerator、
实算CO₂ = 设计CO₂/safetyAerator; 塔的价值随密度反向变化——关塔时池内 CO₂ 与密度无关
(石斑成鱼期恒 11.86, 因 CO₂ 产量与曝气风量都正比于生物量), 开塔时正比于密度(2.14 → 6.43, 因塔的去除能力
正比于循环流量而流量随水体缩小)。两条曲线走向相反 ⇒ 低密度段塔的优势最大, 而空气曝气恰只用在低密度段。
(5) 参数速查表 D 组补登五参数: designDO_mgL · co2TargetMgL ·
sotePerMeter · aerationAlphaBeta · co2StripApproach;
后三者标明无 UI 入口仅 JSON 可调, co2StripApproach 另标无成文出处、属待校准项。
(6) 一条失效的"已被断言覆盖"承诺(本批最值得记的一件): 手册封面口径散布四处(副标题 / 页脚 /
版本演进章标题 / 首段), v2.2 曾在本章上方留注称「已加入 t21 三文档判据, 下次漏改会转红」。
本批实测: 四处全部停在 v2.3, 而自检 29/29 全绿。查明当前 29 项里只有 meta_version_consistency
管版本, 且只查 index 页内 meta——页面内自检运行在 index.html 的 DOM 里, 读不到 manual.html 与 README.md,
这个判据在浏览器内原理上就做不成, "三次扩展全部落空"的根因在此, 不是写漏了。
现改由工具侧门禁 tools/check_doc_version.js 承担(node 能同时读三个文件), 四处口径一并订正。
⇒ 纪律 12: 注释里写"已被断言覆盖"不等于真被覆盖。声称某处有防线时, 必须同时给出该防线失败时的可见信号;
给不出, 就说明防线不在你以为的那一层。
清两条遗留。(1) 脱气塔默认值三处文档与代码不符: v2.0 对标 Timmons Ch.10 把
co2StripperGtoL 3→5、co2StripperLoadingRate 40→80、
co2PackingHeight_m 1.0→1.5, 而参数速查表、阶段卡片 title、手册 15.4.1 三处都没跟。
这是数值口径错不是排版问题: 用户照文档填 3, 模型按 5 跑, 风机功率差 1.67 倍
(手册例题写 35 kW, 实算 58.8 kW)。另修两处死 fallback(: 3 / : 1.0),
与第七轮审计咬中的 : 0.2 同型。
新增门禁 tools/check_defaults_sync.js, 判据对准 PROCESS_DEFAULTS 这张表
(D1 死 fallback / D2 title「默认: X」/ D3 参数速查表默认列), 上线当天咬出清单上没有的第四处:
denitriFlowPct 文档写 10、实际 2。负对照 4/4。
⚠ D1 另报 33 处同值副本, 有意不判红 —— 一次性改造属独立重构批次, 混进来会淹没
"数值口径错"这件事; 该计数应逐批下降而非上升。
(2) air + 开塔 入室 CO₂ 少算(遗留 §6-1)已修。缺陷本体见手册 15.3c.4。
要点: 曝气吹脱的 CO₂ 水侧不记移除、室侧不记入室, 两头都不记 = 孤儿项 ——
与 v2.0 Q_air_gain、v2.1 蛋分气流、v2.2 K-101 轴功同族, 第五次。
最能说明问题的对照: 修复前 air+开塔 与 o2+开塔 的池内 CO₂ 完全相同(罗非苗种期均 10.55),
尽管前者有 476 m³/h 空气打进池子。修法是取消特判而非补第三档: 入室份额由质量守恒导出,
o2 与 air+关塔 两档退化为原值逐位不变。方向标反的代价: 修复前该工况 CO₂ 新风需求恒为 0,
罗非 1000t 成鱼期新风 6,499 → 11,460 m³/h, 通风机原来选小 1.76 倍; 而综合成本只涨
0.09 元/kg —— 靠成本异常根本发现不了, 只能靠守恒。
补断言 X0–X3 + 锚定工况 edge_air_stripper_on, 自检 29 → 31, 负对照 6/6,
13 条基线逐位不变。
(3) 一个被负对照咬出的断言漏洞(本批最值得记的一件): X0 最初写成 X1 的守卫
if (sim.co2Removal) {…}, 于是"撤掉该导出"这一负对照竟然全绿 ——
导出没了, 整块断言直接被跳过。改为独立判定后当场转红, 并顺带咬出空场骨架漏导出
(与二批 W0 是同一课)。⇒ 纪律 14: 守卫会吞掉失败。导出面本身必须是受检对象,
不能是判定的前提 —— 凡写 if (X) { 判定 X 的性质 }, X 缺失时你得到的是绿, 不是红。
二批把告警做成结构化 configWarns 时, 交接文档记的是「报告侧消费未做」。
审计实测发现比这严重一档: 数据根本没过桥 —— configWarns /
aeration / aerIntensity / 入室 CO₂ 四组量全不在 payload 里,
下游想消费也没得消费。于是"报告照出成本、不带任何不可行标记"这句话是字面成立的。
(1) 先造审计器: index 与四个下游页之间此前没有任何契约 —— 下游多读一个字段
拿到 undefined 而不是报错, 上游删一个字段也没人知道。这是「转发断链」模式
在页面之间的翻版, 只是跨了 localStorage。audit_downstream_contract.js
把 payload 包成递归记录 Proxy 记下每页实际读了什么; 不用静态扫描, 因为下游大量
d[k] 动态取键。
(2) 过桥: 产出面 831 → 874 条, 纯搬运不加工; 断言 Y0–Y3 判逐位相等而非容差
—— 过桥中间任何差异都说明有人加工了, 而加工正是双源漂移的起点。
(3) 呈现: report 新增 15.5「设计边界与模型告警」节 + 第 5 章就地标注 +
第 16 章结论改条件式(原来无论如何都印「工艺技术上完全可行」, 现在检出 danger
级时降级并要求决策文件留痕)。取向是显式披露而非硬阻断: 不拒绝生成报告 ——
"我知道超标就是要出个初稿"是正常用法, 挡住只会让人绕过工具, 但白纸黑字。
(4) 顺带修 report.html 的 sproc.peakFactor || 1.5:
peakFactor 是阶段级字段不在 proc 下, 该行永远回落字面量 —— 读错层级 + 字面量兜底
= 静默错值, 与 recDepth_m 那六次同族。
(5) 本批最值得记的: 审计器自己被跑瘸了三次。
① jsdom 不加载外部脚本, finance/report 被跑成"只访问 9/14 条路径"的假空场,
差点得出「下游几乎不消费」的错误结论(注入本地依赖后 933/937 条);
② Y 断言首版写在逐工况循环外, 只看最后一个工况的 lastResults 而它恰好
没告警 ⇒ 负对照「截断 configWarns」全绿 —— M13/M14 陷阱第三次复发, 本批自己踩的;
③ 门禁用裸 nunjucks 渲染而 report 自注册了 wan 过滤器 ⇒ 报假红。
⇒ 纪律 17: 审计器把被审对象跑瘸了, 得到的"干净"是假的; 把自己跑瘸了, 得到的"红"
也是假的。出现"全绿"或"全红"这类整齐结果时, 先怀疑审计器, 再怀疑代码。
(6) 一个撤回的误报: stages[].subSystemCount 初报 56 次 orphan,
实测设成 3 就正常导出 3 —— 只是默认未设定的可选字段, 下游 || 1 兜得住。
审计器的判据不能区分"该有而没有"与"本来就可以没有", 其 ORPHAN 表须逐条复核,
不可直接当缺陷清单。
(1) pid 内嵌示例冻结四个版本: 点"载入内嵌示例"得到的是 irasVersion 1.1.0 /
pidSchema 1.0 的数据(G:L 3 / 塔风压 5 kPa / pumpHeatRatio 0.85, perStage 仅 8 键),
而 SUPPORTED_SCHEMA_MAJOR 只比大版本 ⇒ 照常载入、不报一句警。
根因不是"忘了更新", 是"有机制、无工具" —— 源码里本来就留了注入哨兵, 说明设计上
就该有注入工具, 但它从没被写出来, 注入成了一次性手工操作, 做完即失传。
现补 inject_pid_sample.js + 门禁 C6。⇒ 留了钩子不等于钩子会被拉。
(2) 设备清单少四台设备, 而总价对得平: equipment.html 的行是硬编码的,
冻结在写它那天的设备集合, 缺 K-501 蛋分供气风机 · DH-1001 除湿机 · AHU-1002 暖通机组 ·
KV-1003 车间通风机。⚠ 金额层面没有错 —— finance/report 用聚合值 capex.total,
这四台的钱一直在里面。错的是"清单少四台、总价却对得平": 对账对得平, 所以谁也发现不了,
只有拿这份清单去询价/招标时才会发现少买了设备。这类不一致比数值错更难查。
修法不是手工补四行, 而是 index 导出 capex.items、equipment 改为自 CAPEX 清单
反向补全 —— 以后新增任何设备都会自己出现。门禁 C7 锁位号集合包含关系。
(3) 让设备自己说清"为什么是这个规格": K-101 行补选型控制侧(O₂ 传质 / CO₂ 吹脱, 两侧风量并列)、设计 DO 及其来源、实际 OTE、池底布气强度与超限告警(含可行密度上限); KV-1003 行补控制项(CO₂ 稀释需求 / 换气次数)、车间稳态与限值, 由 CO₂ 顶大时明写 "改增氧方式或脱气塔配置后必须重选"。pid/finance 有意不消费 —— "未消费"是决定, 不是遗漏。
(4) 死负载 371 → 365 → 22 → 10, 前两个数都是量具错: 先拿运行时 CONSUMED 表反推(371),
但 Proxy 把 JSON.stringify/深拷贝这类深度枚举也记成"读取", 两个方向都虚高;
改静态文本判据后叶子名被 depth-6 截成 label…, 判据全军覆没, 365 里 308 条全是这一个 bug。
真实值 22, 消费落地后 10。现判据保守: 出现 ≠ 一定在用, 但不出现 = 一定没用。
加 C8 棘轮逼迫"过桥"与"消费"同批完成。
(5) 一条被推翻的旧结论: 批① 曾宣布"ventFan 单价下游同步已验证通过", 错的 —— 它在 finance.html 里一次都没出现。正确结论是分层的: 金额层面 ✓, 清单层面 ✗。 ⇒ 运行时"读过"不等于"在用"。
(6) 纪律 17 在两轮内被验证 7 次, 批② 又踩四次: 门禁只写 localStorage 而被审页读
sessionStorage; equipment.html 读完即 removeItem 而 jsdom 同源实例共享 storage,
门禁第二次打开就空手(⇒ 假定被审页面有副作用, 每实例独立 origin);
写门禁时掉了一层转义致正则退化, 而这次是被自己写的
catch(e){ return '[]' } 挡住的 —— 纪律 14 刚写完就又犯一次; 死负载三次报错全是量具问题。
⇒ 补充: "零脚本错误"不等于"渲染出了东西", 空页也零错。
项目方决定: 下游页版本号不再各自演进, 一律跟随主页面。四页此前是 equipment
v1.3 · pid v2.0(图签另写 v2.1)· report v1.7
(templateVersion 又是 v1.5-alpha-1)· finance 根本没有版本号
—— 四页四个口径, 现全部对齐 2.3.3, 各立 IRAS_PAGE_VERSION 作单一事实源。
(1) 判据必须分层 —— 有两类版本号不跟随。一刀切会改坏两样东西:
① 数据契约版本(pidSchema / pidSchemaMinSupported /
SUPPORTED_SCHEMA_MAJOR)表达的是"能读哪些格式", 与产品版本无关,
跟着改会直接破坏向后兼容; ② 史料标注(注释里的 // v1.7: ...)是
"这行代码是哪版加的", 改掉就抹掉了来历。三类在 docver 登记表里显式区分。
(2) 图签版本取方案自身而非页面。pid 图签的"版本"格优先取所载入方案的
irasVersion, 无数据时才回落页面版本 —— 图纸上的版本应当是"这张图是哪版
算出来的", 不是"看图的工具是哪版"。
(3) 补上此前四页都没有的一件事: 「方案版本」与「页面版本」不一致时显式提示。 二者是两回事; 旧方案在新页面上打开会走各处兼容回退, 结果看起来正常但口径是混的, 而此前没有任何信号。现 pid 走 toast, equipment 写进元信息行。
(4) 门禁: docver 登记表 10 → 19 项, 负对照 4/4。其中"主页面升版而下游七处 不动"这个发版全场景, 纳管前只咬中 8 处, 现咬中 17 处。⚠ 读取下游页时缺文件即判 工具异常退出, 不静默跳过 —— "文件不在就当它没问题"正是本轮反复咬出的那类假绿。
版本主题只有一件事: 把几个算在了错误位置的量放回它该在的节点。 起因是一份外部审计(第八轮), 七条 B 类问题, 复核后确认六条、升级一条、降级一条、新增两条。 13 条数值基线全程逐位不变, 自检 35 → 40。
沿程节点用 s = {...s, ...} 逐节点展开, 只覆写各自改变的 CO₂/TAN/TSS/NO₃/DO,
于是 pH / fNH3 / NH3_N / Ω / β 五个字段原封不动从鱼池复制到全部七个节点。
后果: 脱气塔节点 CO₂ 降 65%, 真实 pH 升 0.33、Ω 由 0.75 升到 1.52(跨过饱和线),
而界面上七个节点全标"欠饱和"; 生物滤池节点 TAN 降了 70% 而 NH₃-N 是绝对值没跟着变, 偏高 3.4 倍。
重算需要该节点的 (TA, CO₂) 两个量: TA 沿程不守恒, 生物滤池每硝化 1 mg/L TAN
消耗 ALK_PER_TANN = 7.14 mg/L CaCO₃(该系数同时提升为模块级单源常数,
此前 calcAlkalinity 里是个字面量)。鱼池节点用同一组 (TA, CO₂) 重算,
solve() 确定性 ⇒ 逐位复现原值, 故设计判据与导出面不受影响。
哨兵 IRAS_V25_CHAIN_PH。
呼吸产 CO₂ 在鱼池, 硝化产 CO₂ 在生物滤池, 而生物滤池位于鱼池下游、脱气塔上游。
链式质量平衡给出 C_塔前 = Δ_总/(η + η_换水)(恰好等于原集总式的值)与
C_鱼池 = C_塔前 − δ_n。空气曝气模式下两类汇点位置也不同, 需按
A = 1 − η_池内、B = 1 − η_下游 联立, 纯氧模式是 A = 1 的特例。
实测鱼池 CO₂ 降 15–28%(纯氧)/ 23–39%(空气曝气), pH 升 0.07–0.22, Ω 升约 30%。
CO2_OVER 告警无一翻转, 海水鱼种 Ω 仍多数 < 1。按 D1-c 双报落地:
鱼类福利判据取鱼池值, 同时导出 co2StripperInlet_mgL 作为设备选型口径 ——
原实现把两个工程量混在一个数里, 用鱼的限值去卡一个鱼接触不到的浓度。
哨兵 IRAS_V25_CHAIN_CO2。
A = 1 − η < 0 会给出负浓度。处置是下钳通过率到 0而非上钳 η ——
edge_yield_tiny 下 η_换水 达 196, 上钳会把 CO₂ 抬到 14.7 mg/L, 比不钳更离谱。模型把 pH/NH₃ 报在鱼池出水。该点对 CO₂ 与 Ω 最保守, 但对 NH₃ 不保守 —— 同一点 TAN 最高而 fNH₃ 最低, 两个偏差方向相反。缓冲区内 fNH₃ ∝ 1/[H⁺] ∝ 1/CO₂, 故:
忽略 δ_n 时退化为简洁判据 η_bio > η_co2; 计入后阈值由 63.4% 松到 54.8%。
判据在推荐输入范围内即可翻转(生物滤池推荐值与脱气塔可达效率区间重叠),
极端组合下塔后 NH₃ 达池值 4.9 倍。告警不引入新阈值, 直接取沿程实算最大值比对 ——
B1 修好之前这段做不了, 那时七个节点的 NH₃ 是同一个复制值。哨兵 IRAS_V25_NH3_PEAK。
原注释称"V_replace ≪ Q×24×η, 偏差 < 1%, 可忽略"—— 该论证只在高 η 下成立,
而 η = 5% 正是纯氧关塔时 co2FallbackEff 的默认值。实测偏差 0.13%(η=65%)/
1.63%(η=5%)。连带必须同批: 补回换水项后"产量 ≡ 塔移除 + 曝气移除"不再成立,
而 fracIndoorCO2 的第二项默认"剩下的全是塔的", 会把随排水离场的那部分
乘 degasFrac 送进车间。改为三份额分解 + 断言 X1b(三份额之和恒为 1)。
哨兵 IRAS_V25_CO2_DILUTION。
bfBlowerSpec.airPath.sink 原写死 OUTDOOR。澄清: MBBR 与鱼池同厅与否,
只决定风机电机废热去哪个房间, 不决定气去哪儿 —— 同厅照样可以加盖外排, 两个决策相互独立。
故开放为工艺选项 mbbrCovered(默认 true = 加盖外排 = 既有行为, 基线逐位不变)。
敞口时 0.50 t/d 水汽进厅 ≈ 342 kWh/d 潜热, 是池面蒸发项的 1.35 倍, 全库热泵电费最大变动 12.3%。
断言 V4 借此由"只认 K-101"推广为逐股白名单(比原判据更强)。哨兵 IRAS_V25_MBBR_COVER。
B2: biofilterTAN 是常数效率, 与 pH 无关, 而硝化速率对 pH 高度敏感 ——
模型会同时输出"pH 6.9"与"硝化效率 70%", 两者物理上不相容且偏差方向乐观。
本版只告警不折减(硬套一条来源不同的 f(pH) 曲线比明确宽带更糟)。
⚠ f(pH) 在实现上不成环: pH 只依赖 (alkTarget, co2_tank), 而 co2Daily 用的是
产生的 TAN 不是被硝化的 TAN, 故是单次前推 —— 留给下一版。
B7: 碳酸盐求解器在 pH 2–12 上二分, 真解在区间外会静默返回端点值。
加括号符号检查并随返回值带出 boundaryHit(不抛异常 —— 调用方是静默降级的,
抛出会把"可疑的数"换成"没有数")。⚠ 当前输入域够不到(alkTarget 钳在 [20,400],
CO₂ 恰为 0 时 alk=400 也只到 pH_sws 11.53), 属防御性; 故不写自检工况而用单元级断言 N1,
其中 N1a' 专查"够不到"这个前提本身 —— 前提失效时它会转红。
哨兵 IRAS_V25_PH_BRACKET。
B3: 新增 §4.5.3b 说明氮链为何不含 NO₂⁻ —— 这是稳态口径的固有边界, 不是待补功能。详见该节。
B8 把全库鱼池 CO₂ 动了 23–39%、Ω 动了约 30%, 而发布说明里 "实测海水鱼种 Ω 0.37–1.29 全部欠饱和"这句话一个字没跟着变, 而且定性结论已经反了 (对虾苗种期实测 1.63, 为过饱和)。当时 40 条自检全绿、25 项 docver 全绿 —— 因为没有任何门禁在看文案里的实算值, 是靠人眼发现的。
data-omega-min/max 机读属性, 自检直接跑四个海水鱼种
取 Ω 包线比对, N2b 连定性结论一起查(文案说没说"过饱和", 必须与实算 max>1 一致)。
两条负对照均精确转红。哨兵 IRAS_V25_DOC_ANCHOR。原 logo 是一个孤立的 R —— 读不出品牌名。改为 iR,几何定稿
R 0.98 · i 冻结(笔 53 / 点 r30)· 字距 34 · 整体右移 14,
逐档栅格化到 16/24/32/48/64/128 目视比选而定, 非拍脑袋。
为什么右移 14: 外框居中时留白 80/84 看似对称, 但墨迹重心在 x=241.9、偏左 14px —— 右下那条腿是细斜杠, 左上却是实心 i 竖笔加 R 的厚字碗。右移后重心 255.9 ≈ 画布中心 256。 i 有意比 R 主干细约 1/3: i 是前缀, 主体是 RAS, 等粗会读成两个并列字母而不是一个词。 全尺寸统一, 不设简化版 —— 16px 下 i 的点会与竖笔并成一根竖线, 这是有意接受的代价。
单一事实源为 logo-master.svg, 几何参数与取舍理由写在文件头部。派生出
favicon 的 data URI、三处可见内联 SVG(页头 / 「关于」面板 / 手册导航条)、
以及 favicon.ico(手工封装 PNG-in-ICO, 16/32/48/64/128 逐尺寸单独栅格化 ——
PIL 的 ICO 保存只会把一张图重采样到各尺寸)与两个 PNG。
check_logo_sync.js 首版只锁了 favicon 的 data URI。
若照那样收工, 把 logo 换成 iR 之后页头那两处仍是旧的孤立 R, 而任何门禁都不会响。
现改为逐份比对墨迹几何(归一化掉各拷贝不同的 gradient id / class / role / 宽高 / xmlns), 共 4 份。
⇒ 与 M15「登记表漏项」同族: 判据的强度取决于它看得见几份拷贝。
新增可见 logo 必须同步登记 INLINE 表。
负对照: 只改「关于」面板那一份的点半径 30→24, 门禁精确点名该份转红、另外三份仍绿。顺带修掉两个既有缺陷: ① apple-touch-icon 指向 favicon-180.png(带连字符),
而库内实际文件名无连字符 —— 线上必然 404, iOS 加主屏取不到图标; 已改指真实文件名,
并由门禁第③组断言「引用的图标文件必须真的在」锁死。这同时解释了 v2.4 MD5SUMS 里那个缺失文件。
② 手册导航条 logo 原为纯色方块内写 "iR" 文字, 背景 #00b4d8 与品牌渐变
#0C9ED5 → #1A5CD7 本就不一致, 已换成真标记。
⚠ 门禁证明不了的事: 三个栅格派生物无法逐字符比对, 只能校验存在与尺寸 ——
它们是否由最新母版生成, 本工具证明不了(与 MD5SUMS 头部第③条同理)。
改 logo 后必须重跑栅格派生, 这一条只能靠流程。
另: og-cover.png(社交分享卡片图)在服务器上不在库里, 仍是旧 R, 需服务器侧替换。
I-1 物质平衡断言(氧 O1–O3 / 碱度 A1–A3)。 本库此前没有一条物质平衡断言 ——
"今天闭合是因为公式恰好写对, 不是因为有东西防止它写错"。立断言的关键是
被比的两边必须来自不同的计算链: 既有的那条碱度断言把上一行的赋值原样验一遍,
永远绿, 与 bioVolume × VTR ≡ tanDaily × sBio(注释自己判过"校核没有意义")同类。
投加 = 消耗 − 回收 − 补水带入 + 【排水带出】,
最后一项全库零命中。补水按 100 mg/L 进、系统水按 150 mg/L 出 ⇒
换水实际是碱度净汇, 模型记成净源, NaHCO₃ 投加量低估 5–35%。
② tanNitrified 用鱼池浓度自算 TAN 外排, 而排水取自末节点, 两模块对同一股排水说法不一。
I-2 MBBR 曝气重构 —— 本版改动最深的一批。 原模型三处错:
① 风机按需氧选型而 SOTE 写死 8%, 但 SOTE 的标准定义是清水 20 °C、溶解氧为零(驱动力最大点),
实算冷水纯氧工况实际 SOTE 仅 0.35–0.5%;
② 沿程 BF 节点把全部需氧从水里扣掉(等于假设密闭罐无曝气), 而同一份已拿去选风机 —— 同一股氧算两遍;
③ Math.max(bfDOout, 2.0) 是 ② 的创可贴, 地板生效时凭空造氧。
新口径把因果倒过来: 风量由流化决定, DO 由质量平衡解出
DO_out = (Q·DO_in − R + M·k·β·Cs_水深)/(Q + M·k) ——
解是两端点的加权平均(风量 0 → ∞), 数学上跑不出窗口, 不需要钳制或地板。
反方向(输入目标 DO 反算风量)有 1/(Cs−DO) 渐近线, 且 DO=4 在 24 个工况里 18 个物理不可达, 故不采用。
四个新输入: bfAirFlux 10(2–20)· bfDepth 3 · bfDOMin 4 ·
bfAlpha 0.85(⚠ 无 RAS 出处, 待标定)。
DO 低于下限只告警、不自动加风, 告警给出"需把通量提到 X、届时功率 Y",
让用户做有标价的选择。风机压力改由水深导出, 替掉硬编码 50 kPa(≈5 m, 与 3 m 默认自相矛盾)。
基线变动 52/52, 最大 4.62%, 且方向分裂 —— 这正是改动的意义: 冷水鱼种电耗 +1.9~2.4%(池大、流化风量大), 暖水鱼种 −3.4~−4.6% (原来按清水 DO=0 的驱动力选型, 虚高三倍多)。
I-3 EBCT 判据分子用错(用户实测报出)。
"去除率与接触时间不自洽"告警用填料净体积当分子, 而
EBCT = Empty Bed Contact Time, 分子必须是空床即反应器容积
(V_BF = bioVolume / 填充率)。50% 填充率下 EBCT 低估整整一倍, 该告警系统性误报。
实例: 填料 791 m³ / 空床 1583 m³ / 流量 77,615 m³/h ⇒ EBCT 0.61 → 1.22 min, 告警消失。
单源取 eq.bfTankVolume, 不在告警层第三次重算填充率。
⚠ 只修分子, 阈值一个没动 —— 带界 1/2/5 min 是经验/文献口径, 用的就是标准定义。
修正后仍有 6 条告警(罗非、对虾), 那些是真的。
J-1 N3a/b/c —— 把 negA/negB 那两条抓不到的补上。 上一批的负对照里有 2 条没能转红: 把风机选型退回供氧驱动、或撤掉传氧的水深/α/温度三项。 根因是 O1/O2 锁的是各模块之间自洽, 而它们改的是全模型共同采用的物理口径 —— 两边同步退回, 自洽性依然成立。
N3 换一个抓法: 锁住"用户填的输入必须真的进入计算"。
N3a 风量 ≡ bfAirFlux × 池底面积; N3b 风压 ≡ bfDepth×9810+15000;
N3c 从导出量反解传氧系数, 须等于 0.012×水深×α×θ^(T−20)/9.09。
负对照 3/3 各自精确转红, 一一对应。
F_O2_MASS = 0.232, 差 0.216% ⇒ 断言因自己的字面量全库误报。
已改引具名常数。断言本身也必须单源。J-2 check_ledger.js 台账门禁。
本轮交接台账 §6「下次开工核对用」的门禁基线过期 3 次(anchors 计数 ×2、defsync ×1),
外加遗留表挂着已完成项。三次都是加完东西忘了同步, 而没有任何门禁在看台账 ——
check_doc_version 查的是版本号一致性不是新鲜度;
check_anchors 不查 HANDOFF 里抄的那个数。
新工具做五件事: L1 实测重数 anchors · L2 selftest 总数交叉 README 徽章 ·
L3 台账 §6 ⇄ MD5SUMS 头部 · L4 台账引用的文件必须存在 · L5 遗留表已完成项必须划掉。
一上来抓到 2 条真的: defsync 台账 171 而 MD5SUMS 头部仍是 167; 以及本工具自己的计数正则
与 check_anchors 不同导致的误报(已对齐)。
为什么此前写死 0, 以及那个 0 不算错。 v1.9 定 BF_CO2_STRIP = 0,
注释写"保守, 脱气塔选型偏安全"—— 该判断成立: 承认吹脱后塔前浓度实测由 9.53 降到 8.47,
塔确实可以选小一档。旧值是留了余量, 不是算错。
η = 风量 × kLoad × 逼近系数 / 水量 即可算出, 不引入新机理。逼近系数单开 bfCo2Approach = 0.23, 不复用脱气塔的 0.5。
塔是填料逆流, MBBR 是池内粗孔鼓泡; 本手册自记"粗孔盘仅达理论平衡约 23%、细孔盘 93%",
23% 正是为粗孔盘记的。复用塔的值等于宣称两者传质逼近程度相同, 属"拿来源不同的数字当系数"。
链式位置在 MBBR 节点 δ_n 加入之后、脱气塔之前 ⇒ 只需把稳态式的 B 换成 Bf·B, 形状不变。 实测 η_BF: 三文鱼成鱼期 7.5%(鱼池 CO₂ 7.39→7.02、塔前 9.53→8.47)、 大菱鲆成鱼期 9.9%(9.82→9.17、13.0→11.08)。基线 0/52 变动 —— 鱼池 CO₂ 不进成本链, 而脱气塔按 G:L 与水力负荷选型、不看进水浓度。
X1b 那条"假绿"同批修了: 四条移除路径此前只登记三条(塔/池内曝气/换水),
fracBF 现已进分解; 并接上 B9 —— 敞口 MBBR 时吹掉的 CO₂ 计入车间新风。
B8 归位 / B9 尾气去向 / B10 吹脱 至此在一个式子里闭合。
co2Removal 引用 eta_co2_bf, 而 let 声明放在它后面 ——
暂时性死区抛 ReferenceError, 整个水质计算失败: 基线 52/52 变动 100%、
方解石饱和度全线算不出、pH 告警全灭。
是 N2 / W5 / U2 三条断言同时报才定位到"这是异常, 不是算错" —— 单看基线只会以为数值变了。塔前−鱼池 ≡ δ_n 是"MBBR 只加不减"的前提;
X4b 的集总式回归锚只在不吹脱时成立(多了汇点, 全环稳态本就该下移);
X4d 的"塔前是全场最高点"不再成立 —— 这已是它第二次因过度特化而放宽,
⇒ 单调性类断言天生脆弱, 拓扑一变就要重审;
X1 的期望式没跟上第四支 —— 改了实现却没同步期望式, 被 edge_mbbr_open 咬出,
⇒ 断言的两边必须一起改, 否则修好的反被判红。同一个洞出现了四次: v2.0 Q_air_gain 孤儿项 · v2.1 蛋分气流未登记 ·
v2.5 MBBR 吹脱从未计入 · 蛋白分离器的 CO₂。每次都是"某台设备的某股气流, 一半算了一半没算":
风机选了型、电耗算了、气路登记了 contactsWater, 唯独 CO₂ 那份没人管。
蛋白分离器的登记结论(全网检索后): 文献确证蛋分对 CO₂ 脱除有正向贡献 (Barrut 2012; Orellana & Wecker 2013), 但未检索到可用的单程去除率 —— 能查到的是能效(0.023 kg CO₂/kWh)或标准传质速率, 几何依赖强, 不能直接折成去除率。 按 MBBR 同口径粗估约 2.6%, 属二阶项; 略去方向保守(脱气塔进水浓度偏高 ⇒ 塔选型偏大)。
co2Blower,
而气流 id 是 degasser ⇒ 全库误报。前两次是 skimmerHRT(实为
skimmerHRT_min)与断言里硬写 1.293×0.2315(实为 F_O2_MASS=0.232)。
库内早有记录的"第六次事故"(K0_W74 传 °C 而非 K)是同一类。问题: 按气相载量算出的 CO₂ 去除率(MBBR 曝气吹脱、空气曝气模式的池内曝气)
η = 风量 × kLoad × 逼近系数 / 水量 给出的是从总无机碳 DIC 里转移走的质量;
模型此前把它当作自由 CO₂ 的降幅使用 —— 等价于假设缓冲因子 = 1.0。
实际上 CO₂ 被吹走后碳酸盐平衡右移(HCO₃⁻ + H⁺ → CO₂ + H₂O), 重碳酸盐转回补上, 自由 CO₂ 的降幅小于被吹走的质量, 这两个去除率因此被系统性高估。
依据: Colt 等 2012 —— 基于总碳酸盐变化的真实脱碳量大于表观值, 海水高碱度下尤甚; 同时指出淡水条件下 CO₂ 吹脱不受酸碱平衡影响(碱度 ≤ 200 mg/L CaCO₃)。实测完全对上: 淡水缓冲因子 1.02(几乎不变), 海水 1.15–1.26。
新增两个碳酸盐函数: co2FromDIC(由总碱度与总无机碳反解自由 CO₂, 几何二分 ——
无闭式反函数, 因 DIC 是 CO₂ 与 [H⁺] 的耦合式)与 co2BufferFactor。
后者就是海洋化学 Revelle 因子的绝对量写法: 缓冲因子 = DIC/([CO₂] × Revelle)。
实测本工况 Revelle ≈ 13.9(pH 7.22 海水), 落在海洋典型 8–15 内 —— 独立口径的旁证。
实测影响: 三文鱼成鱼期 MBBR 吹脱率 7.5% → 5.94%, 鱼池 CO₂ 7.02 → 7.10; 大菱鲆 9.9% → 8.56%, 9.17 → 9.25; 罗非(淡水)几乎不变。基线逐位不变(不动成本链)。
let 暂时性死区 ⇒ 整个水质计算抛异常、
结果全为 null —— 同一会话第二次犯同一个错;
② 稳态解换成了修正后的通过率, 而沿程生物滤池节点漏改, 差 0.23% ——
断言「节点与导出面不同源」当场咬出, 该断言正是为此立的。
修完把未修正的中间量改名加 0 后缀并注明"任何节点与导出面都不得使用",
让误用在代码里显眼, 而不是靠记性。原缺陷: 钙由海水恒定比例反推 ⇒ 淡水盐度为 0 时钙恒为 0, 方解石饱和度 Ω 直接算不出。 罗非、加州鲈、鳜、鳗四个淡水鱼种全场 n/a, 占鱼种库一半 —— 而本手册自己写着淡水 RAS 的碳酸钙溶蚀(溶蚀混凝土池体、池壁起砂)是真实工程问题, 恰恰算不了。
新增两个输入: 钙口径(自动/手动)与钙硬度(默认 90 mg/L as CaCO₃)。 出处: USGS 硬度分级(0–60 软 / 61–120 中等 / 121–180 硬 / >180 极硬); 水产目标区间 SRAC 464(游离钙 40–100 即钙硬度 100–250, 其中 100 mg/L 游离钙恰与鱼血钙浓度相当); Boyd(鱼 >50、甲壳类 >80)。取 90(中等硬度地下水)—— RAS 补水多为井水。 海水档一个数没动: 海水反推给 412 mg/L Ca²⁺, 与文献典型海水约 400 直接吻合。
⚠ 残余不确定度(已写进代码与 UI 提示): K1/K2 在盐度 0 处的标度约定未经独立核对; 若它们也是活度标度, 则由其解出的碳酸根已含活度, 本修正会略微过头。 LSI 交叉验证表明总方向与量级正确, 但淡水 Ω 仍应视为 ±30% 量级的估计。 离子强度亦为估算(由碱度与钙硬度加电荷平衡推出, 未计镁与硫酸根)。
缺陷: 设计口径 CO₂ 产量式为「池内耗氧 × 1.375 + TAN × 6.286」。代码注释写着 「池内耗氧含池内异养耗氧, 故本式的 CO₂ 也自动含池内异养呼吸产的 CO₂」—— 关键词是「池内」。而生物滤池内的异养耗氧是单独一项, 参与生物滤池风机选型, 但它的 CO₂ 一分都没进产量式。 ⇒ 氧账本里有、碳账本里没有 —— 又一个「一半算了一半没算」。
实测锚定 —— 本版少数几条有实测支撑而非推导的修正。Summerfelt 等 2004 《Design implication of carbon dioxide production within biofilters contained in recirculating salmonid culture systems》(Aquacultural Engineering), Freshwater Institute 商业规模鲑鱼 RAS 实测: 滤池产 CO₂ 4.1 ± 0.2 mg/L, 同时去除 0.51 mg/L TAN 与 3.8 mg/L 溶解氧。 拆解为硝化项 3.0 mg/L(60%)与异养项 2.0 mg/L(40%)。 论文标题直指: 循环水系统中很大一部分 CO₂ 由生物滤池产生。
补项前后(生物滤池节点的 CO₂ 增量): 三文鱼成鱼期 2.14 → 3.41、 大菱鲆 3.12 → 4.68、罗非 1.67 → 3.11 mg/L —— 补项后落入实测区间 4.1 附近; 只算硝化则偏低 33–46%。系数 1.38 g CO₂/g O₂ 出处同上, 不是新的待标定项。
结果: 设计口径 CO₂ 产量上升 19.8%; 鱼池 CO₂ 7.10 → 7.71、脱气塔进水 8.69 → 10.44 (三文鱼成鱼期); 海水方解石饱和度包线 0.60–1.63 → 0.55–1.53。 数值基线 0/52 变动 —— 鱼池 CO₂ 不进成本链, 脱气塔按气水比选型不看进水浓度, 且 CO₂ 超标告警在所有基线工况下未被顶破。
缺陷: 原去除路径注释原文「溶解有机物: 蛋分(旁路) + 高级氧化(旁路) + 换水」——没有生物滤池。 异养菌吃掉的底物本该从水里消失(变二氧化碳 + 菌体污泥, 污泥经微滤机与换水排出); 模型算了异养耗氧、也补了异养产 CO₂ —— 唯独没扣底物, 产生与消耗各记各的。
落地结果(关蛋分 = 淡水实际工况): 罗非 277 → 37.2、加州鲈 → 35.1、 三文鱼 → 32.7、鳗 → 46.2 mg/L, 与文献 35.6 同量级。
⚠ 本值是等效值 = 可降解占比 × 可降解部分去除率, 两件事挤在一起。 正确做法是拆成可降解/难降解两层并与产率系数闭合, 已排入生物滤池模型重构大批次。 ⚠ 字段名沿用历史称谓; 该量以 mg O₂/L 计即溶解性 COD, 将与降解性拆分同批重命名 —— 不单独改名, 以免白付导出面变更的代价。
〔⚠ id 说明: 本节 id 是 rel_2_3_3_2_4 而非 rel_2_4 ——
后者已被占用, 指的是 2026-08-12 的内部特性批次「简易模式 · 自然通风与太阳辐射」。
本库两套编号并存: 发布版本号(v2.4)与内部特性批次号(v2.4/v2.5/v2.6, 均未独立发版)。
代码里 IRAS_V24_* 是后者, 本次发布批的新哨兵一律 IRAS_R24_*。
详见 index.html 顶部的编号说明块。〕
版本主题只有一件事: 给四个从来没有声明过口径的量建立单一事实源。
起因是一份热平衡专项审计, 它指出气液接触器的质量流量取错了状态点(用了风机加热后的密度);
复核后发现根因更深 —— airFlowM3h 从来没有声明过参考状态, 三个产气者各按一套隐含口径,
相加后再乘一个密度, 本就无解。
合并前热工侧写死 const co2Out_ppm = 450(无 UI、无默认表条目、无 FIELD_SPEC),
而 PROCESS_DEFAULTS.co2IntakeCO2_ppm = 350 是同一物理量的另一份 ——
值还不一样。后者更麻烦: 它有读取路径 getNumClamped('co2IntakeCO2_ppm', …, 300, 5000),
但 data-proc-field 命中 0 ⇒ 那句钳制从未执行过, 该字段只能改方案 JSON。
现统一为 GLOBAL_THERMAL_DEFAULTS.co2Outdoor_ppm = 450, UI 可调, 范围 300–5000,
两个消费点(车间新风稀释基准 dC = 限值 − 本底 · 脱气塔 auto 模式进风本底)
一律经 resolveCO2Outdoor()。钳制放 resolver 而非读取函数 ——
方案 JSON 经 restoreState 直写全局配置, 绕过 UI 约束(v2.3 P1 教训)。
唯一数值变化: 塔进风本底 350 → 450, 仅影响 co2StripperEffMode='auto' 的用户
(默认 manual), 塔效率降 0.74–1.33 个百分点。
⚠ 撤字段时把原注携带的 Fig 10.17 论证
(本底 1000 ppm 去除率降 10%、5000 ppm 降 70%)迁存到脱气塔 airPath 处 ——
那是「尾气必须排室外、不得回车间」的量化依据, 字段可撤, 依据不可撤。
裁决(项目方): airFlowM3h 全库一律为标准状态体积流量 (0 °C · 101.325 kPa),
因为对外向风机厂家提规格时给的就是 Nm³/h + 压力, 机器由厂家按此选型、质量由该单位本身锁定。
为什么必须显式声明: 参考态在选型式与接触器之间会抵消 ——
mass = airFlowM3h × ρ_ref = o2Peak·s / (f_O2 × OTE), 故对「由 O₂ 质量反算风量」的气流
(K-101 鱼池曝气 / BF 风机)取多少都不影响物理; 但对「体积比」气流
(脱气塔 flowM3h × G:L / 蛋分 skimmerFlow × skimGtoL)没有任何参考态可抵消。
不声明, 接触器的质量流量就无解。
| 气流 | 风量怎么来的 | 风量数字 | 接触器质量流 |
|---|---|---|---|
| K-101 鱼池曝气 · BF 风机 | 由 O₂ 质量反算 | 降 8.0% | 降 0.86%(f_O2 不抵消) |
| 脱气塔 · K-501 蛋分 | 体积比 G:L | 不变 | 由 ρ(T_air+ΔT) 改为常数 1.293 |
v2.2 的六次不动点迭代整段删除。 它当年确实让 ΔT 与质量流取了同一密度,
但统一到了「风机加热后的密度」这一侧 —— 而风机不改变质量流量。
现质量流是常数, mdot·cp·ΔT ≡ P_shaft 恒成立, 断言 A3 逐位不变。
⚠ 审计建议的断言 mdot×3600/air ≡ ρ(T_air) 不采纳 ——
它锁的是"实际进气体积"口径, 与标准态裁决相反。锁错口径比不锁更糟。
⚠ 全库 1.2 共 9 处, 只改 3 处:
Lewis 类比的车间空气密度(×2)· 除湿/暖通选型裕度(×4)· UA_vent 的建筑物理常数 0.34
(= 1.2×1006/3600)均不得改动, 由断言 A4d 反向保护。
0.23 同理: 它与鱼种耗氧系数 o2FishFactor(鲑 0.20–0.23)数值相近而物理无关。
禁止全局替换(本库有 v2.0.0 版本号全局替换污染历史叙述的先例)。
K-101 鱼池增氧鼓风的气路是 OUTDOOR → INDOOR —— 它吸室外空气、穿过池水、
从池面进车间(它没有风管)。进气侧为室外(项目方裁决: 所有风机进气都自室外)。
⇒ 这股空气就是新风, 而 v2.3.3 之前一分未计, 两笔账同时错:
Q_vent_sens 再按 T_air→T_room 收一遍 = 同一份热收两次。| 工况 | K-101 入室风量 m³/h | 占通风需求 |
|---|---|---|
| 罗非 air+开塔 · 恒温 ACH 1.0 | 476 / 1,752 / 4,228 | 44.5% / 44.5% / 36.9% |
| 罗非 air+关塔 · 恒温 ACH 1.0 | 476 / 1,752 / 4,239 | 16.6% / 12.7% / 10.8% |
| 自然通风 ACH 15 | 同上 | 4.3% |
| 任意 o2 拓扑 | 0 | 0%(13 条基线因此逐位不变) |
⚠ 与 v2.3.3 收尾批② 是同一股气流的两个方向:
当年补上了 CO₂ 的去向(fracIndoorCO2 由质量守恒导出), 但没回头问
承载 CO₂ 的空气本身该怎么记。
⚠ 不新增「超额排风热损」项: solveRoomAir 已把该气流作为独立股入解
(denomT 含 mEx·cp, 湿平衡含 mEx), 恒温档由 m_indoorExhaust 承载。
再加一项即把它的焓算第二遍 —— 那是收尾批② 的镜像(当年"两头都不记 = 孤儿项",
这次会变成"两头都记 = 双计"), 且守恒断言抓不到。
v2.3.3 之前自然通风档同样走 max(ACH×V_room, CO₂需求), 三个后果:
物理上站不住: 自然通风由风压/热压驱动, 不会因为室内 CO₂ 高就自己变大。 而且它随开口面积与天气跨近两个数量级 —— 温室夏季敞开设计取 45–60 ACH、冬季关口除湿约 3; 同一房间把固定窗玻璃拆掉可从 9 变 66。拿这样一个量去保证 CO₂ 限值(人员暴露口径)本身就不成立。
⇒ 现钳在用户填的 ACH 上, 缺口由 V_vent_shortfall_m3h 导出并告警:
| 设 ACH | CO₂ 需求 | 实际供风 | 缺口 | 车间 ppm | 室温 °C |
|---|---|---|---|---|---|
| 1 | 39,304 | 6,499 | 28,915 | 4,422 | 23.3 |
| 2 | 39,304 | 12,998 | 22,416 | 2,894 | 17.1 |
| 5 | 39,304 | 32,495 | 2,919 | 1,584 | 9.0 |
| 15 | 39,304 | 97,485 | 0 | 857 | 2.6 |
| 30 | 39,304 | 194,969 | 0 | 658 | 0.4 |
用户填的 ACH 终于有意义了。
⚠ 断言 X2(车间稳态 ≤ 限值)随之按车间档分派: 原措辞是 "新风量未按入室 CO₂ 校核(通风机选小)"——那是模型缺陷的判定, 而钳制后自然通风档超标是 用户配置的结果。但没有给该档发豁免(豁免会让 X2 在该档变成恒真), 改为替换义务: 超标时必须导出缺口(X2b), 不超标时不得报缺口(X2c)。 判据强度不降, 只是换了被判对象。
| code | 级别 | 判据 | 为什么是这个阈值 |
|---|---|---|---|
ROOM_ACH_TOO_LOW | warn | 自然通风档 且 ACH < 15 | 零新常数: 15 取自 ROOM_MODES 对该档的定义注释原文「简易棚取 15–30」, 判据与被判对象同源 |
NAT_VENT_SHORTFALL | warn | 自然通风档 且 缺口 > 0 | 给出两条出路: 把通风量调高到 X 次/h 以上, 或改用机械通风档 |
VENT_CTRL_BY_CO2 | info | 非自然通风档 且 ventBoostedByCO2 |
沿用已有标志, 零新阈值零新计算。通风由 CO₂ 控制本身不是错误, 高密度温水鱼就是会这样 |
⚠ ROOM_ACH_TOO_LOW 取 warn 而非 danger:
该组合有合法工况(冬季关闭通风口运行的简易棚), 按纪律 10 有合法工况就不判 danger,
措辞里必须写明"什么时候可以忽略我"。
⚠ VENT_CTRL_BY_CO2 的措辞里明确写着不要为了缩小通风机而开脱气塔 ——
实测在空气曝气下开塔使全场能耗上升 27–93%(罗非恒温 8.855 → 13.676 kWh/kg)。
脱气塔的作用是压低池水 CO₂(通常配液氧拓扑), 不是省车间通风。
这一条拦住的正是"只看通风机风量降了 71%、没看总账"这个推理。
⚠ 原遗留清单里的候选项「车间 CO₂ 超限告警」判据恒假, 已改写:
V_vent_fish 是"恰好把浓度压到限值的风量"的反解, 故 CO₂ 一旦成为控制项,
co2Room_ppm 恒等于限值(实测四组 air 工况全部精确 1500)。
照原样写会得到一条永远为假的判据、负对照全绿。真正要告警的不是浓度, 是为了不超标所要求的通风量。
立项时据 PROCESS_DEFAULTS.co2StripperEnabled: true 判断"air 模式默认开塔",
并据此算出默认配置使成本高 9.5–22.3%。核实后撤销: 该联动 v2.3.3 四批已在 UI 事件层实现
(切到 air 时脱气塔自动置 false, 带 auto-value 样式与提示语, 并以 dataset.userSet
尊重用户的显式选择), 且由断言 S3 静态锁住不得下沉到计算层 ——
计算层若按 aerationMode 猜用户意图, 用户显式选的"air+开塔"会被静默改掉。
⚠ 该行代码已就地留痕, 写明"勿据本行断言 air 模式默认开塔"以防第三次重开。 错因: 从一个位置的值推断了系统行为, 没查 UI 事件层。
check_defaults_sync 的三条判据 D1/D2/D3 全部对准 PROCESS_DEFAULTS 这一张表,
于是 GLOBAL_THERMAL_DEFAULTS 这一层从来没有门禁。本轮新增 G0–G4, 判据数 136 → 167。
上线即咬出两条(均 WARN 级, 结构性隐患非数值错, 与 D1 的"30+ 处同值副本"同一处置):
co2IndoorLimit_ppm: UI 的 min="800"(HTML 属性)与消费点
Math.max(…, 600)(代码字面量)分居两处, 无单一事实源;GLOBAL_THERMAL_DEFAULTS 的围护五项逐值等于 ENVELOPE_PRESETS.industrial_standard
—— 第二副本, 改预设表不会自动改默认值。U2 关掉了 U1 的结构性盲区: U1 是从"有框"一侧起判的三件套(UI 有框 ⇔ 读取路径认它 ⇔ 消费点真的用它),
对「无框 + 有读取路径 + 有消费点」这一类结构上判不到 —— 撤销的
co2IntakeCO2_ppm 正是此类。U2 要求: 凡出现在读取路径里的字段,
要么有框, 要么显式登记为 JSON-only 并写明理由。现 87 个读取字段中 4 个走登记表,
且登记表双向校验(表里有而读取路径无 ⇒ 该清理了)。
五批中只有 B(标准态口径)改基线, 52/52 项变动:
| 方向 | 工况 | Δ 元/kg |
|---|---|---|
| 制热工况下降 | 青岛冬 −0.102 · 鲈 −0.089 · 鳜 −0.084 · 海南冬 −0.063 · Bergen −0.013 | −0.10 ~ −0.01 |
| 制冷工况上升 | 海南夏 +0.358 · 三亚 +0.255 · 对虾 +0.175 · 大菱鲆 +0.113 | +0.01 ~ +0.36 |
成本变化符号随工况方向翻转 —— 与 v2.1/v2.2 守恒修复时一致。 单向偏移才说明修错方向, 这里没有。
salmon_bergen_w/hpCostPerKg 0.178 → 0.202, 绝对值仅 +0.024 元/kg,
是小分母造成的假象。立项复核时曾用它描述整批严重性 —— 引用变动幅度时必须看绝对值。本轮在六个不同位置犯了同一形态的错: 为判据或探针挑对象时用了记忆里的名字, 而不是先查。
| 位置 | 写的 | 实际 | 类型 |
|---|---|---|---|
| 断言 A4c 宿主 | simulateWaterQualityProcess | tankAerationDesign | 恒真型 |
| 断言 A4d 宿主 | contactorNetHeat | evapCoeff | 恒真型 |
| 断言作用域 | EQ | r.eq | 报错型 |
| air 判据字段 | aerationSpec.isAir | 该字段不存在 | 报错型 |
| 探针取设备 | x.equipment | x.eq | 量具型 |
| 探针取告警 | x.stageWarns | x.sim.stageWarns | 量具型 |
危险性分两档: 报错型当场红, 损失只是时间; 恒真型静默全绿, 会跟着交付, 且再也不会有人发现。 前两条若不跑负对照就会随本轮一起交付。⇒ 固化为三条纪律:
⚠ 另有一条判据本身写错的教训: G1 第一版写成"UI 范围必须等于 clamp",
于是把合规的 800/600 判成红。但 FIELD_SPEC 的既有设计就是
{min,max}(UI 引导)与 clamp[](消费点接受)分开存, 断言 H2 要的是
clamp ⊇ [min,max] —— 二者本就允许不等。差一点逼出一个错误的"修复"。
判据错比代码错更贵: 它会让人去改对的东西。
本轮的性质与前几轮不同。 逐项手算复核了 11 项物理关系 —— TAN 产率 0.092×蛋白、硝化耗氧 4.57 / 耗碱 7.14 / NaHCO₃ 0.595、CO₂ 呼吸 1.375 与硝化 6.29、鱼池 TAN/TSS/CO₂/NO₃ 沿程质量平衡、热平衡、 Benson-Krause 溶氧饱和、泵功 ρgQH/η、MBBR 曝气传氧质量平衡、面速率口径 —— 全部闭合,没有一处公式错误。 缺陷全部在别处:字段没接上、默认值与判据不自洽、诊断方法本身有问题。
主页面自 v1.9.2 起导出 annualOpexForFinance = annualOpex − 维护费 + 苗种费,手册与
finance.html 表 4 脚注都写着「基数已剔除维护费,此处不重复计算」。但 finance-core.js 读的是
annualOpex —— 没有任何一行代码读那个字段。手册那句「老版本不导出时回退」,实际是唯一在跑的路径。
后果两个方向:维护费(4.5%/yr)进了基数后又按 repairRate 再算一遍;苗种费一分没进财务。
实测(1000 t,默认财务参数,全投资 IRR):
| 鱼种 | 修复前 | 修复后 | 主导成因 |
|---|---|---|---|
| 大西洋鲑 | 10.71 % | 12.92 % | 维护费双算 |
| 鳗鲡 | 40.48 % | 22.38 % | 苗种费 4,439 万/yr 漏算 |
⚠ 此前为高苗种占比鱼种(鳗鲡、石斑)生成的可研报告,财务结论偏乐观近一倍,应重新生成。
门禁没抓到的原因:契约判据只查字段「在产出面」,不查「被消费」。新增 C10 为运行时判据 —— 同一载荷删掉该字段后结果必须改变。负对照已验红。
出厂默认诊断(不改任何输入)发现两个海水鱼种 6/6 阶段各带 2 条危险级,且高度雷同: 臭氧蛋分(海水中臭氧氧化 Br⁻ 生成溴酸盐)+ 设计 TAN 0.5 mg/L 不可达。后者的机理是海水硝化有 0.70× 盐度修正,沿用淡水的 0.5 需要 104–126% 的单程去除率,物理上不存在。
处置方案转了三次,每次都由证据推翻上一次,留痕如下:
bfDesignTAN 0.5→1.0 —— 被该字段自己的说明驳回:「不要填告警阈值」。NH₃ 不再用于反算,改作独立校验:由 pH 控制目标 + 水温 + 盐度算出设计 TAN 对应的非离子氨, 超过 0.0125 mg/L(Colt & Armstrong 1981;Meade 1985)报危险级。选型用行业惯例,安全用物理判据, 两者互不替代。实测九个鱼种落在 1.1–7.1 µg/L,最紧为罗非鱼 28 °C、pH 7.4(占限值 57%)。
同时把两条互相独立的约束分开报告,因为处方完全不同:
| 受限侧 | 稳态 TAN | 处方 |
|---|---|---|
| 面积侧 | Sn · sBio−1/0.7(闭式解,k/θ/盐度/负荷全约掉,不需要迭代) | 加大滤池有效 |
| 水力侧 | snMin = tanDaily·1000/(Q·24) | 滤池再大也无效,只能提循环量 |
副产物:淡水鱼种(加州鲈、鳗鲡、鳜鱼)几乎全是水力侧受限,海水鱼种多为面积侧 —— 这是此前 「η 显示 100%」说不清的事。⇒ 海水鱼种危险级 15 → 2。
⚠ 本次推翻了 2026-08-29 的一条裁决(保持 0.5 全局默认)。推翻依据是外部文献而非内部方便, 代价已量化:海水鱼种滤池面积 ×(0.5/0.7)0.7 = 0.79×。两条裁决同时保留在断言 N7 的注释里。
新增的「隐含峰均比」派生量(峰值投饵率 ÷ 由 FCR/增重/损耗反推的年均,正常 1.1–1.5)一眼指出八处偏离, 分两类、处方相反:峰均比 > 2 者峰值虚高,< 1 者物理不可能(峰值不能低于年均)。
偏离有两个可能来源(feedRate 错,或 FCR/体重区间/时长错),故先核对生长周期:
大菱鲆 16 °C 幼鱼 SGR 实测 0.92–1.4 %/d,库内 4 个月周期无问题;大西洋鲑 0+ 烟化路线 7–8 个月、
1+ 路线 16 个月,库内 6 个月落在 0+ 下沿,偏快但可行。⇒ 四处 > 2 判为 feedRate 偏高。
| 阶段 | 峰值投饵率 | 配套 o2SatTarget |
|---|---|---|
| salmon S1 / S2 | 3.00→1.42% / 1.50→0.96% | 145→100 / 165→115 |
| turbot S1 / S2 | 3.00→1.70% / 1.50→0.78% | — / 165→120 |
峰均比告警阈值 8 → 3.0。原值从未响过(2.75、2.49 全漏);3.0 不是新拍的数,而是这条告警 自己的文案就写着「工程设计建议峰均比 1.1–3.0(成鱼期可接近 1.1,苗种期通常 2–3)」—— 判据与自己的说明书对齐。取 2.0 反而会让它自带误报。
⚠ 本批暴露的隐含耦合。 投饵率下调后耗氧减半,而 o2SatTarget 仍是配合旧投饵率的
145/165%,池内 DO 冲到 13.8/14.2 mg/L(饱和度 128%/137%),生物滤池进水 DO 高过曝气平衡 DO,
稳态闭式解算出负的空气传氧,被自检 O2b 咬出。修法是按池内目标 DO 9 mg/L 反推饱和度。
这是收口做法 —— 硬编码的饱和度与投饵率之间仍无守卫,正解是由 designDO_mgL 反推,单独立批。
在那之前,改任一鱼种的投饵率都必须回来核对增氧饱和度。
未做的四处(罗非 S2/S3、石斑 S3、对虾 S3,峰均比 < 1):试改后负荷推上去,危险级从 1 涨到 4。 这些温水鱼种的默认配置本来就靠一个偏低的投饵率撑着,修对就必须同时动循环倍数或密度 —— 而循环倍数已由用户裁决不得再增。单独立批。
本轮调查(多来源一致):慢性型约 103%(维持即致生长下降;浅池中已与敏感鱼应激相关; BC 省水质导则对孵化场取 103%);急性型 110–115% 以上(一般水体导则取 110%)。 挪威 2026 年实验(n = 1440)显示大西洋鲑 parr 在 115–120% 出现急性病变,1–6 h 内鳃气栓与皮下气肿。
对照现状:salmon S3/S4 为 114/113%,turbot S3 为 113%,各鱼种末期普遍 113–114% —— 贴着急性阈值。
⚠ 并发现一处方向性错误:v1.9.2 的注释称「鱼苗对 TGP 最敏感、成鱼可到 <115%」,据此给苗种期 −20、成鱼期 −5。而文献显示相反 —— 急性病变出现在 parr(中大鱼),卵黄囊仔鱼与鱼苗反而耐受到 120%。 现行分档把最高过饱和度给了最敏感的阶段。
三条待处置:① O2_REC_BY_SPECIES 基线 165%(≈TGP 114%)整体过高;② TGP 告警分级
(>103 提示 / >110 警告 / >115 危险,现只有一条 110 线);③ 把水深纳入 TGP(poolDepth_m 已存在,
每米抵消约 10 个百分点,不计水深会系统性高估风险)。三条合起来是一次增氧口径重定,单独立项。
本轮自写的诊断脚本三次得出错误结论,每次都让判断跑偏一到两轮,而门禁全绿:
globalThermalConfig 覆盖 ——
六个不同气候的工况跑成了同一个默认气候,还据此报告「模型变化」。⇒ 纪律:自检已有的路径就用自检的路径,不要另写一份;任何为诊断而做的输入改动必须单列声明,
不得混进「现状」报告。并据此补了工具:run_selftest --print-actual 直接输出实测值
(数据本就在自检结果里,无需重跑)、check_md5 反向扫描(一跑抓出 5 个未登记文件,
含 C8 棘轮自己的比对基准)、package.json/version 登记进版本口径判据
(此前未登记,版本停在 2.5.0 两个版本而门禁全绿)。
两次口径改动,基线各重录一次:生物滤池设计 TAN(36/52 项,最大绝对差 2.870,
turbot_500 全成本 65.30→64.27)、投饵率校准(28/52 项,最大绝对差 1.032)。
判据:上下游契约 41 → 43(C10 两条)、默认值同步 193 → 194(U1:每个鱼种阶段字段必须有输入框)、
版本口径 25 → 26(package.json)。页面内自检维持 43/43。
changelog.html 的完整并入(v2.7)。此前逐版说明独立成页,与本章「版本演进说明」讲同一段历史而详略不同,两处维护。现统一到手册:本章前半部分讲「为什么这么设计」,本节讲「哪一版改了什么」,读者不同但不再分家。help-changelog-*)原样保留,旧链接仍可定位。本版主题只有一件事:把几个算在了错误位置的量放回它该在的节点。 外部审计七条 + 复核追加三条, 共十四个批次。自检 35 → 42, 13 条数值基线两次有意变更、 其余批次逐位不变。
本版最重要的一句话:集总口径下算出来的那个数, 未必是它标签上写的那个点的值。 与 v2.4 那族「取值来源型断言」治的是同一个病 —— 这次是取值位置。 守恒断言依然全绿, 因为账本两边同步变化; 标签错了, 守恒式看不见。
逐节点展开时只覆写各自改变的 CO₂/TAN/TSS/NO₃/DO, 五个碳酸盐字段原封不动复制。 后果: 脱气塔节点 CO₂ 降 65%, 真实 pH 升 0.33、Ω 由 0.75 升到 1.52(跨过饱和线), 而界面上七个节点全标"欠饱和"; 生物滤池节点 TAN 降了 70% 而 NH₃-N 是绝对值没跟着变, 偏高 3.4 倍。 重算需要该节点的 (碱度, CO₂) 两个量 —— 碱度沿程不守恒, 生物滤池每硝化 1 mg/L 氨氮耗 7.14 mg/L 碱度。
呼吸产 CO₂ 在鱼池、硝化产 CO₂ 在生物滤池, 而生物滤池位于鱼池下游、脱气塔上游。
链式重导给出 C_塔前 = Δ_总/(η + η_换水) —— 恰好等于原集总式的值 ——
与 C_鱼池 = C_塔前 − δ_n。即原式算的那个量, 标签贴错了地方。
鱼池 CO₂ 实测降 15–28%(纯氧)/ 23–39%(空气曝气)。
按双报落地: 鱼类福利判据取鱼池值, 同时导出脱气塔进水浓度作设备选型口径 ——
原实现把两个工程量混在一个数里, 用鱼的限值去卡一个鱼接触不到的浓度。
标准氧转移效率的定义条件是清水 20°C 溶解氧为零, 即驱动力最大点; 而实际 MBBR 内溶解氧 5–12 mg/L, 实算实际效率仅 0.35–0.5%, 按 8% 选出的风量与它能传的氧无关。 新口径把因果倒过来: 风量由载体流化决定(Norsk Vann 导则: 供气量不应低于 10–15 m³/h·m² 池底), 溶解氧由质量平衡算出来 —— 解是两端点的加权平均, 数学上跑不出窗口, 不需要任何钳制或地板。冷水鱼种电耗 +1.9~2.4%, 暖水鱼种 −3.4~−4.6%(原按清水口径虚高三倍多)。
本版十四批里有五批是同一个模式 —— 一个量在这个账本里有、在那个账本里没有:
⇒ 反复到第五次时才立了白名单断言: 凡接触水的气流, 要么在 CO₂ 分解里有份额, 要么显式登记为「有意不计 + 理由」。它不判"不计是否正确", 只判"有没有做过这个决定" —— 判据的力量在于把沉默的遗漏变成显式的取舍。
钙按海水恒定比例反推 ⇒ 淡水钙恒为 0, Ω 直接算不出, 四个淡水鱼种全场 n/a(占鱼种库一半)。 开放钙硬度输入后, 未加活度修正的实现给出 Ω = 1.22–1.76(过饱和, 会结垢), 而 Langelier 饱和指数独立算出 0.40–0.70(欠饱和, 会溶蚀)—— 方向相反。 而"溶蚀混凝土池体、池壁起砂"正是本模型该提示的工程问题, 不修正等于把它藏起来还反着说。 加 Davies 活度修正后落到 0.58–1.06, 与该指数同侧同量级。
本版新增两条拿库外通行量来对的断言 —— 缓冲因子换算成海洋化学的 Revelle 因子须落在典型区间 8–15(实测 13.9); 淡水 Ω 须与 Langelier 饱和指数同侧且在一个数量级内。 库内多数断言查的是内部自洽, 而内部自洽挡不住整套实现一致地偏离物理 —— 淡水 Ω 那一版方向反了的实现, 若只跑内部断言会全绿通过。
交接台账的门禁基线本版过期六次(锚点计数、断言总数、字段计数), 每次都是加完东西忘了同步, 而没有任何门禁在看台账 —— 版本一致性检查查的是一致性不是新鲜度。 新增台账门禁后, 其中三次是被工具抓的。同期发现 logo 有四份拷贝(favicon 内联 + 三处可见 SVG), 而首版门禁只锁了其中一份 —— 若照那样收工, 换 logo 后页头两处仍是旧图而全绿。
本版遗留: 生物滤池模型重构已立范围书(硝化面速率动力学 + 溶解性 COD 按降解性拆分 +
字段改名 + 淡水蛋分默认值, 四件事必须同批, 共用同一套化学计量);
三个待标定系数中 bfAlpha 是唯一进成本链的, 最该先标定。详见交接文档。
起因是一份热平衡专项审计: 它指出气液接触器的质量流量取错了状态点(用了风机加热后的密度)。复核后发现根因更深 —— airFlowM3h 从来没有声明过参考状态, 三个产气者各按一套隐含口径, 相加后再乘一个密度, 本就无解。本版把四个这样的量全部建立单一事实源。
本轮最重要的一句话(引自审计原文): 守恒断言保证账本自洽, 但保证不了记进账本的那个数是对的。 无论取哪个密度、扣不扣哪股风, 守恒式两边都会同步变化、残差恒为零 —— 这类缺陷守恒断言天然抓不到。本版因此新增一整族「取值来源」型断言, 它们不问账本平不平, 只问这个数是从哪儿来的。自检 32 → 35, 门禁判据 136 → 167。
热工侧写死 const co2Out_ppm = 450(无 UI、无默认表条目、无范围登记), 而 PROCESS_DEFAULTS.co2IntakeCO2_ppm = 350 是同一物理量的另一份 —— 值还不一样。后者更麻烦: 它有读取路径且带 300-5000 钳制, 但根本没有输入框, 那句钳制从未执行过。现统一为 co2Outdoor_ppm(默认 450, UI 可调 300-5000), 两个消费点一律经同一 resolver。⚠ 撤字段时把原注携带的 Fig 10.17 论证(本底 1000 ppm 去除率降 10%)迁存到脱气塔气路处 —— 那是「尾气必须排室外」的量化依据, 字段可撤, 依据不可撤。
全库风量一律为 0 °C · 101.325 kPa 下的体积流量(1.293 kg/m³ × 0.232 = 0.300 kg O₂/Nm³, 国内曝气设计手册经典常数)。理由: 对外向风机厂家提规格时给的就是 Nm³/h + 压力, 质量由该单位本身锁定, 故风量/压力/功率全部同口径、不做进气温度修正。
接触器质量流因此成为常数, v2.2 那段六次不动点迭代整段删除 —— 它当年确实统一了两侧密度, 但统一到了"风机加热后的密度"这一侧, 而风机不改变质量流量。
⚠ 全库 1.2 共 9 处只改 3 处: Lewis 类比的车间空气密度、除湿/暖通选型裕度、通风显热的 0.34(=1.2×1006/3600)均不得改动。0.23 同理 —— 它与鱼种耗氧系数(鲑 0.20–0.23)数值相近而物理无关。禁止全局替换, 由断言 A4d 反向保护(不该改的必须仍在原位)。
K-101 鱼池增氧鼓风机没有排气风管: 吸室外空气、气泡穿过池水、从池面进车间。⇒ 它就是新风, 而此前一分未计, 两笔账同时错 —— CO₂ 稀释侧让通风系统重复提供了这部分; 显热侧这股空气已被池水加热到水温饱和(水侧付过了), 通风显热又收了一遍。实测在恒温车间占通风需求 36.9%–44.5%。现按净额抵扣, 并把「机械换气」与「总换气」拆成两个报告口径。纯氧拓扑下抵扣量恒为 0 ⇒ 13 条数值基线逐位不变。
此前自然通风档同样走 max(ACH×V_room, CO₂需求), 于是用户填 ACH 1 / 2 / 5 结果完全相同(室温 8.4 °C · 车间 1500 ppm · 25.03 元/kg)——CO₂ 需求一直顶着, 用户的输入被架空; 而那 35,414 m³/h 没有风机、零电耗、零 CAPEX, 等于"选自然通风就能免掉通风机"。物理上站不住: 自然通风由风压/热压驱动, 不会因为室内 CO₂ 高就自己变大, 且随开口面积与天气跨近两个数量级(温室夏季敞开 45–60、冬季关口约 3)。
现钳在用户填的 ACH 上, 不足则让车间 CO₂ 真的算超标并给出缺口与两条出路(加大开口 / 改机械通风)。实测 ACH 1 → 4422 ppm、2 → 2894、5 → 1584、15 → 857、30 → 658 —— 用户填的 ACH 终于有意义了。
ROOM_ACH_TOO_LOW(warn, 阈值 15 取自该档自己的定义注释「简易棚取 15–30」, 零新常数)· NAT_VENT_SHORTFALL(warn, 给出缺口与出路)· VENT_CTRL_BY_CO2(info, 沿用已有标志, 零新阈值)。
⚠ 原遗留清单里的候选项「车间 CO₂ 超限告警」判据恒假, 已改写: 通风量本就是"恰好把浓度压到限值"的反解, 故 CO₂ 一旦成为控制项, 车间浓度恒等于限值(实测四组工况精确 1500)。照原样写会得到一条永远为假的判据。真正要告警的不是浓度, 是为了不超标所要求的通风量。
⚠ VENT_CTRL_BY_CO2 的措辞里明确写着不要为了缩小通风机而开脱气塔 —— 实测在空气曝气下开塔使全场能耗上升 27–93%。脱气塔的作用是压低池水 CO₂(通常配液氧拓扑), 不是省车间通风。这一条拦住的正是"只看通风机风量降了 71%、没看总账"这个推理。
默认值同步门禁的三条判据此前全部对准阶段工艺参数表, 于是全局热工配置层从来没有门禁。本版新增 G0–G4, 上线即咬出两条(均 WARN 级, 结构性隐患非数值错): co2IndoorLimit_ppm 的 UI min=800 与代码下钳 600 分居 HTML 属性与代码字面量; 全局默认里的围护五项逐值等于「一般工业车间」预设(改预设表不会自动改默认值)。
断言 U2 关掉了 U1 的结构性盲区: U1 是从"有框"一侧起判的三件套, 对「无框 + 有读取路径 + 有消费点」这一类结构上判不到。U2 要求凡出现在读取路径里的字段, 要么有框, 要么显式登记为 JSON-only 并写明理由。
五批中只有标准态口径改基线, 52/52 项变动, costPerKg −0.10 ~ +0.36 元/kg: 制热工况下降(青岛冬 −0.102 · 鲈 −0.089 · Bergen −0.013), 制冷工况上升(海南夏 +0.358 · 三亚 +0.255 · 对虾 +0.175)。与 v2.1/v2.2 守恒修复时一致 —— 单向偏移才说明修错方向。
⚠ 不要引用"最大相对差 13.68%": 那一项绝对值仅 +0.024 元/kg, 是小分母造成的假象。引用变动幅度时必须看绝对值。
计划中的第四批「air 模式默认关塔」核实后撤销 —— 该联动 v2.3.3 已在 UI 事件层实现(切到空气曝气时脱气塔自动关闭, 并尊重用户的显式选择), 且由断言 S3 锁住不得下沉计算层。立项时据一处默认值的字面量推断了系统行为, 没查 UI 事件层。该行代码已就地留痕防重开。
本轮在六个不同位置犯了同一形态的错: 为判据或探针挑对象时用了记忆里的名字而不是先查。其中两次是恒真型(断言宿主函数填错 ⇒ 写了、跑了、全绿, 但从未判过任何东西), 若不跑负对照就会随本版一起交付。⇒ 固化三条纪律: 静态断言必须核实宿主并在找不到目标时判红 · 探针读数"一半对一半空"时先怀疑量具 · 引用变动幅度必须看绝对值。
⚠ 另有一条判据本身写错的教训: 新门禁 G1 第一版写成"UI 范围必须等于消费点钳制", 于是把合规的 800/600 判成红 —— 而既有设计本就是「UI 引导范围」与「模型接受范围」分开存, 二者允许不等。差一点逼出一个错误的"修复"。判据错比代码错更贵: 它会让人去改对的东西。
代码里的 IRAS_V24_* / IRAS_V25_* / IRAS_V26_* 是内部开发批次号, 与发布版本号不是同一序列 —— 那三批成果都随 v2.3.x 发布, 从未独立发版。故本次发布批的新哨兵一律 IRAS_R24_*。旧哨兵一律不改名(它们是史料; 本库有过全局替换污染历史叙述的先例)。详见源码顶部的编号说明块。
项目方决定: 下游页版本号不再各自演进, 一律跟随主页面。四页此前是 equipment v1.3 · pid v2.0(图签另写 v2.1)· report v1.7(templateVersion 又是 v1.5-alpha-1)· finance 根本没有版本号 —— 四页四个口径, 全部对齐 2.3.3。
一刀切"全文版本号都改成 2.3.3"会改坏两样东西: (1) 数据契约版本——pidSchema / pidSchemaMinSupported / SUPPORTED_SCHEMA_MAJOR 表达的是"能读哪些格式", 与产品版本无关, 跟着改会直接破坏向后兼容; (2) 史料标注——注释里的 // v1.7: 鱼池增氧鼓风机 K-101 是"这行代码是哪版加的", 改掉就抹掉了来历。⇒ 只有"页面版本"跟随, 契约与史料原样保留, 这三类在 docver 登记表里被显式区分。
四页各加 const IRAS_PAGE_VERSION = '2.3.3', 标题字面量与它对齐, docver 同时登记两者 —— 二者不一致即转红。pid 图签的"版本"格优先取【所载入方案自身的 irasVersion】, 无数据时才回落到页面版本: 图纸上的版本应当是"这张图是哪版算出来的", 不是"看图的工具是哪版"。
「方案的 irasVersion」与「页面版本」不一致时显式提示。二者是两回事: 前者是"这份数据是哪版算的", 后者是"你在用哪版工具"。旧方案在新页面上打开会走各处兼容回退 —— 结果看起来正常, 但口径是混的, 而此前没有任何信号。现 pid 走 toast, equipment 写进元信息行(方案 v? / 本页 v2.3.3)。
负对照 4/4 精确转红。其中"主页面升版而下游七处不动"这个发版全场景, 纳管前只咬中 8 处, 现在咬中 17 处。⚠ 读取下游四页时缺文件即判工具异常退出, 不静默跳过——"文件不在就当它没问题"正是本轮反复咬出的那类假绿。
第二轮清掉 🔴「下游三页深审计」最后四条。三件实事 + 七次量具翻车——后者才是本批真正的收获。
点"载入内嵌示例"得到的是 irasVersion 1.1.0 / pidSchema 1.0 / savedAt 2026-04-30 的一份数据, 带 v1.1 口径(G:L 3 / 塔风压 5 kPa / pumpHeatRatio 0.85 / denitriFlowPct 10), perStage 只有 8 个键(现 17)。而 SUPPORTED_SCHEMA_MAJOR 只比大版本、它确实还是 1 ⇒ 照常载入、不报一句警。根因不是"忘了更新", 是"有机制、无工具": 源码里本来就留了注入哨兵 %%---SAMPLE-PAYLOAD-INJECT-HERE-<hex>---%%, 说明设计上就该有注入工具, 但工具从没被写出来 ⇒ 注入成了一次性手工操作, 做完即失传。现补 inject_pid_sample.js(savedAt 归一化以保证可重复生成)+ 门禁 C6, 载入标签也改为从示例自身读版本号。⇒ 留了钩子不等于钩子会被拉。
equipment.html 的行是硬编码的, 冻结在写它那天的设备集合, 缺 K-501 蛋分供气风机 · DH-1001 除湿机 · AHU-1002 暖通机组 · KV-1003 车间通风机——全是 v2.x 后加的。⚠ 金额层面没有错: finance/report 用聚合值 capex.total, 这四台的钱一直在里面。错的是"清单少四台、总价却对得平"——对账对得平, 所以谁也发现不了; 只有拿这份清单去询价/招标时才会发现少买了设备。这类不一致比数值错更难查。修法不是手工补四行(那只解决今天): index 导出 capex.items(逐项 + ISA 位号), equipment.html 改为自 CAPEX 清单反向补全——以后 index 新增任何设备都会自己出现, "两份清单各自维护"从根上消掉。门禁 C7 锁死位号集合包含关系。
过桥的 aeration / aerIntensity / indoorCO2 原本无人消费。现落在采购方真正需要它的地方: K-101 行写明选型控制侧(O₂ 传质 / CO₂ 吹脱, 两侧风量并列)、设计 DO 及其来源、实际 OTE 与清水基础、池底布气强度与超限告警(含该阶段可行密度上限); KV-1003 行写明控制项(CO₂ 稀释需求 / 换气次数, 两侧并列)、车间稳态与限值, 由 CO₂ 顶大时明写"改增氧方式或脱气塔配置后必须重选, 不可沿用"。采购方原来只看到"0.4 kW · 2863 m³/h", 看不出这台风机是被 CO₂ 顶大的。pid/finance 有意不消费(前者画水路, 后者用聚合值), "未消费"是决定, 不是遗漏。
先拿运行时 CONSUMED 表反推得 371——但 Proxy 会把 JSON.stringify/深拷贝这类深度枚举也记成"读取", CONSUMED 与 ORPHAN 两个方向都虚高。改静态文本判据后得 365——而叶子路径被 depth-6 上限截成 label…, 文本判据全军覆没, 365 里有 308 条全是这一个 bug。depth 提到 9 后真实值 22, 其中 17 条正是刚过桥尚无人消费的字段; 消费落地后 10。现判据是保守的: 出现 ≠ 一定在用, 但不出现 = 一定没用。加 C8 棘轮(只许降不许升), 目的是逼迫"过桥"与"消费"同批完成。
批① 曾据 CONSUMED 表宣布"ventFan 单价下游同步已验证通过, 该条销号"。错的——ventFan 在 finance.html 里一次都没出现。正确结论是分层的: 金额层面 ✓(用聚合值, 财务数字没错)· 清单层面 ✗(少四台设备)。⇒ 运行时"读过"不等于"在用"。
批② 又踩四次: (4) 门禁只写 localStorage 而 equipment.html 读 sessionStorage ⇒ 空页、C7 满屏假红; (5) equipment.html 读完即 removeItem(一次性消费), 而 jsdom 同源实例共享 storage ⇒ 门禁第二次打开就空手(修法: 每实例独立 origin, 假定被审页面有副作用); (6) 用 Python 写门禁时掉了一层转义, 模板字符串里 \\s 变成 s, 正则退化成 /^s*(...)s*$/——而这次是被我自己写的 catch(e){ return '[]' } 挡住的, 纪律 14 刚写完就又犯一次; (7) 死负载三次报错的数全是量具问题。⇒ 补充一条: "零脚本错误"不等于"渲染出了东西"——空页也零错, C5 已加最低渲染量判据并按各页形态分档(pid 画 SVG 无表格行)。
二批把告警做成结构化 configWarns 时, 交接文档记的是「报告侧消费未做」。审计实测发现比这严重一档: 数据根本没过桥——configWarns / aeration / aerIntensity / 入室 CO₂ 四组量全都不在 payload 里, 下游想消费也没得消费。于是"报告照出成本、不带任何不可行标记"这句话是字面成立的。本批打通三段。自检 31/31, 13 条基线逐位不变。
index 与四个下游页之间此前没有任何契约: 下游多读一个字段拿到的是 undefined 而不是报错, 上游删一个字段也没人知道——这是本库复发六次的「转发断链」模式在页面之间的翻版, 只是跨了 localStorage。audit_downstream_contract.js 把 payload 包成递归记录 Proxy, 记下每页实际访问的每条路径。不用静态扫描: 下游大量 d[k] 动态取键, 静态扫必漏。
产出面 831 → 874 条。结构与 sim 内部值逐字段一致, 不二次加工、不改判据、不新增阈值——呈现方式留给下游各页决定, 但数据必须先在。空值语义分两档: 无告警 → [](与 W0 同口径, 空场也要有骨架), o2 模式无曝气 → null(语义是"该拓扑下不存在这个量", 与"有但为零"不同)。断言 Y0–Y3 判逐位相等而非容差: 过桥是纯搬运, 任何差异都说明中间有人加工了, 而加工正是双源漂移的起点。
report 新增 warnings 命名空间与 15.5 设计边界与模型告警节(有则逐条列: 阶段/级别/实测与判据/建议处置; 无则明写"未检出配置级告警"), 含 15.5.1 车间 CO₂ 与新风量的设计边界; 第 5 章开头就地标注"本章参数是在哪些告警存在的前提下算出的"; 第 16 章结论改条件式——原来无论如何都印「工艺技术上完全可行」, 现在检出 danger 级时降级并要求决策文件留痕。取向是显式披露而非硬阻断: 不拒绝生成报告("我知道超标就是要出个初稿"是正常用法, 挡住只会让人绕过工具), 但白纸黑字。
report.html:3078 写的是 sproc.peakFactor || 1.5, 而 peakFactor 是阶段级字段、不在 proc 下 ⇒ 该行永远回落到字面量 1.5: 用户把峰值系数改成 2.0, 报告照印 1.5。与 recDepth_m 那六次同一形态: 读错层级 + 字面量兜底 = 静默错值, 没有任何信号。
(1) jsdom 不加载外部脚本, finance-core.js 与 nunjucks 都没进去 ⇒ finance/report 被跑成"只访问 9/14 条路径"的假空场, 差点得出「下游几乎不消费」的错误结论; 注入本地依赖后是 933/937 条。(2) Y 断言首版写在逐工况循环外, 只看最后一个工况留下的 lastResults, 而它恰好没告警 ⇒ 负对照「把 configWarns 截断成 []」全绿——这是 M13/M14 陷阱的第三次复发, 且是本批自己踩的; 移进循环后七个工况转红。(3) 门禁用裸 nunjucks.renderString 渲染, 而 report 自己注册了 wan 等过滤器 ⇒ 第 16 章报 filter not found, 判据报出假红; 必须走页面自己的 renderChapter。⇒ 纪律 17: 审计器把被审对象跑瘸了, 得到的"干净"是假的; 把自己跑瘸了, 得到的"红"也是假的。出现"全绿"或"全红"这类整齐结果时, 先怀疑审计器, 再怀疑代码。
stages[].subSystemCount 一开始报了 56 次 orphan(report 占 52), 看着最严重。实测设成 3 就正常导出 3——它只是默认未设定的可选字段, 下游 || 1 兜得住。不是缺陷, 是审计器的判据不能区分"该有而没有"与"本来就可以没有"。已在交接文档标注: 读该工具的 ORPHAN 表须逐条复核, 不可直接当缺陷清单。
清两条遗留。一条是文档写的默认值和代码跑的不是一个数, 一条是一股气流在模型里凭空消失。前者纯文档, 后者动计算——13 条基线仍逐位不变(全 o2 拓扑, 走退化档), 自检 29 → 31。
v2.0 对标 Timmons Ch.10 把 co2StripperGtoL 3→5、co2StripperLoadingRate 40→80、co2PackingHeight_m 1.0→1.5, 但参数速查表、阶段卡片 title、手册 15.4.1 三处都没跟。这不是排版问题而是数值口径错: 用户照文档填 3, 模型按 5 跑, 风机功率差 1.67 倍(手册例题 35 kW 实际是 58.8 kW)。另有两个 死 fallback(: 3 / : 1.0)——与第七轮审计咬中的 : 0.2 同型, 已改读 PROCESS_DEFAULTS。
判据对准 PROCESS_DEFAULTS 这张表(纪律 10c), 三条: D1 阶段卡片不得用字面量 fallback · D2 title 里的「默认: X」⇔ 实际 · D3 参数速查表「默认」列 ⇔ 实际。上线当天咬出清单上没有的第四处: denitriFlowPct 文档写默认 10、范围 5-20, 实际默认 2。负对照 4/4 精确转红(含"改默认值而文档不动"的真实发生场景)。⚠ D1 另报告 33 处同值副本(今天不错、改默认值时必漏), 有意不判红——一次性改造属独立重构批次, 混进来会淹没"数值口径错"这件事; 该计数应逐批下降。
开塔时入室 CO₂ 比例取脱气塔的 degasFrac(默认 0), 但曝气气流依然 sink=indoor 且接触水体。更彻底的一层是: 曝气吹脱在水侧的 η 里也没算——水侧不记移除、室侧不记入室, 两头都不记 = 孤儿项, 与 v2.0 的 Q_air_gain、v2.1 的蛋分气流、v2.2 的 K-101 轴功完全同族, 是第五次。最能说明问题的一个对照: 修复前 air+开塔 与 o2+开塔 算出的池内 CO₂ 完全相同(罗非苗种期均 10.55 mg/L)——尽管前者正有 476 m³/h 空气打进池子。
原写法是三分特判(o2→degasFrac / air+关塔→1 / air+开塔→degasFrac), 第三档错了, 而且错得"看起来已经考虑过了"——原注释还自称保守方向。现由质量守恒导出 入室份额 = fracAer×sAer + (1−fracAer)×degasFrac, 三档全部成为特例, 不再需要 if: o2 档 fracAer=0 退化为 degasFrac, air+关塔 档 fracAer=1 退化为 1, 两档逐位不变, 只有 air+开塔 得到修正。fracAer 取自水侧 sim.co2Removal 单源, 零新常数。方向标反的代价: 修复前该工况 CO₂ 新风需求恒为 0, 罗非 1000t 成鱼期新风 6,499 → 11,460 m³/h, 通风机原来选小 1.76 倍; 综合成本只涨 0.09 元/kg——靠成本异常根本发现不了, 只能靠守恒。
该链此前零导出量、零断言, 所以缺陷是手算发现的。现补 X0 导出面必须存在 · X1 入室份额 ⇔ 水侧移除分解(单源) · X2 车间稳态 ≤ 设计限值(守恒闭环) · X3 静态锁特判不得复活; 并补锚定工况 edge_air_stripper_on(air+开塔+机械通风车间)——全库既有 air 工况原本全部关塔, 不补工况 X 锚写了也走不到(M13/M14 同款教训)。⚠ X0 自身曾有漏洞: 它最初写成 X1 的守卫 if (sim.co2Removal) {…}, 于是"撤掉导出"这一负对照全绿——导出没了, 整块断言被跳过。改为独立判定后当场转红, 并顺带咬出空场骨架漏导出(与二批 W0 同一课)。⇒ 纪律 14: 守卫会吞掉失败——导出面本身必须是受检对象, 不能是判定的前提。负对照 6/6。
前五批把空气曝气路线的代码补完了, 文档没跟上——手册第 15 章还停在 v1.7 口径, 于是界面写 30、手册写 40, 用户按哪个都不对。本批只改文档与文档级注释, 不动任何计算: 自检 29/29, 13 条基线逐位不变(改前/改后/交付副本三次比对)。
三批已在代码与 UI 改到 30, 手册对比表仍写 40——同一事实两处不同源, 而用户看到的多半是手册。现补齐并把三层口径一并写明: 30(SRAC-453 / GSA 物理上限)进 UI 与参数表 · 20–25(DB46/T 424—2017 + 设备商参数 + 模型反算三源收敛)进选择器提示 · 任一阶段准确上限以 aerIntensity 反算为准。连同"抄外部数字时丢了口径"这条根因一并留档, 免得下一个人再把硬上限当分界线抄一遍。
SOTE 是清水标准态(20 °C、零盐度、洁净水、初始 DO=0)测出来的值, 养殖池四个条件一个都不满足。手册把它当"吸收效率"列在对比表里, 正是二批修掉的那个硬编码 0.18 的文档孪生体。现换成完整 OTE 公式并逐因子标注, 附实算链: 清水标称 9.75% → 加 αβ 7.31% → 加 θ 8.63%(OTE_base) → 加推动力 2.22%, 差 4.4 倍。同时点明 OTE 与 OTE_base 是两个量: 选型反推风量用前者, 水质侧解池内 DO 稳态用后者(后者要把对浓度 C 的依赖显式解出来)。
15.3 的 DO 公式只适用纯氧拓扑(前提是"存在进池浓度"), 此前无任何标注, 而 v2.3 那次"选型侧说 5.00、水质侧说 0.00"的事故根因正是它被误用到 air 模式。新增 15.3b 空气曝气风量选型与设计工况点(池内稳态方程 / O₂ 与 CO₂ 两侧取大 / 设计工况点 / 完整例题 / 守卫与局限)与 15.3c 空气曝气要不要上脱气塔(硬规则与设计选择之分 / 结果级判据 / 实算对照 / 已知缺陷)。正文每个数字都是本版模型实算, 为此建了取数探针 probe_manual_ch15.js 与 probe_manual_ch15b.js 随交付。
安全系数的去向可解析: 实算DO = C* − (C*−设计DO)/safetyAerator, 实算CO₂ = 设计CO₂/safetyAerator(CO₂ 控制时)——裕量看得见, 不是黑箱。塔的价值随密度反向变化: 关塔时池内 CO₂ 与密度无关(石斑成鱼期恒 11.86, 因 CO₂ 产量与曝气风量都正比于生物量), 开塔时正比于密度(2.14 → 6.43, 因塔的去除能力正比于循环流量而流量随水体缩小)。两条曲线走向相反 ⇒ 低密度段塔的优势最大, 而空气曝气恰只用在低密度段——这正是"要不要上塔"值得算一算的原因。
designDO_mgL · co2TargetMgL(哨兵字段, 标明留空回落语义与生效条件)· sotePerMeter · aerationAlphaBeta · co2StripApproach。后三者标明无 UI 入口、仅 JSON 可调但钳制全路径生效; co2StripApproach 另标无成文出处、属待校准项——参数表是用户查"这个数能不能信"的地方, 出处不明必须写在表里而不是只写在注释里。
手册封面口径散布四处(副标题 / 页脚 / 版本演进章标题 / 首段), v2.2 曾在原地留注称「已加入 t21 三文档判据, 下次漏改会转红」。本批实测: 四处全部停在 v2.3, 而自检 29/29 全绿——查明当前 29 项里只有 meta_version_consistency 管版本, 且只查 index 页内 meta。页面内自检读不到 manual.html 与 README.md, 这个判据在浏览器里原理上就做不成, 三次扩展落空的根因在此。现改由工具侧门禁 tools/check_doc_version.js 承担(node 能读三个文件), 并就地订正那条失效的注。⇒ 纪律: 注释里写"已被断言覆盖"不等于真被覆盖; 声称有防线时, 必须给出该防线失败时的可见信号。
「权威源 → 转发 → 多消费点, 某个消费点没接上; 各自内部自洽, 所以断言全绿」—— 这一 bug 模式在本库已复发五次(DOmin_* / recDepth_m / isCrustacean / 通风机风量口径 / 曝气侧池深不同源)。每次补断言都只封住当次的字段, 模式本身换个字段就复发。本版治本: 把「鱼种/阶段 → 水质侧 sp」这条链工厂化, 让"漏进白名单"成为写不出来的代码。纯结构重构, 13 条基线对【v2.3 新基线值】逐位不变, 自检 26 → 27 条。
新增 SPECIES_FIELD_FLOW 声明表(每字段声明 scope 权威源层级 / toSp 是否转发 / resolve 解析函数), recomputeAll 的 sp 改由 buildWaterSp(stage) 工厂按表生成, 五次复发的案发现场——那个手写白名单——退役。池深解析(兜底链 + 0.3 m 下钳)收敛为 resolvePoolDepth 唯一副本(曾有三副本且兜底不一致 3 vs 1.5 的前科)。历史教训注释(v1.1.2 DOmin、recDepth_m 1.68×、池深修一半)全部随迁到表处存档。
M13/M14 两次踩过同一个坑: 断言写好后负对照仍全绿, 因为没有工况能走到那条路径。本版的 M15 从机制上免疫它——对水质链四个消费函数(simulateWaterQualityProcess / isWarmWaterStage / co2ThresholdFor / tankAerationDesign)做 .toString() 静态源码扫描, 不依赖任何工况, 每次自检对全部代码路径无条件全覆盖。四条子断言: M15a 消费面每个 sp.X 读取必须在表中声明且转发(抓"消费了但没转发", 五次复发的标准形态); M15b 每个转发字段必须有消费点(抓死转发); M15c recomputeAll 的 sp 必须来自工厂、手写字面量不得复活; M15d 设备侧 tankAerationDesign 调用必须经同一工厂。
M15a 上线即红: isWarmWaterStage 的消费代码支持鱼种显式声明温冷水类别 thermalClass, 但该字段从未进过白名单——与 recDepth_m 完全同型的第六例, 只因尚无鱼种声明它、还没被踩响: 哪天有人给某鱼种加上 thermalClass: 'cool', 水质侧会静默无视、继续按 tempOpt 推断。已补声明转发(阶段显式 > 鱼种级), 声明能力自此真正生效; 现状无鱼种声明 ⇒ 数值逐位不变。同批 M15b 咬出 protein 死转发(消费面零读取, 真实消费者走 stage 直连), 已撤转发并以 toSp:false 存档。
此前设备侧传完整 stage、水质侧传白名单 sp, 两侧传参形状不同, M11 只能事后比对两侧风量是否相等。现设备侧改为 tankAerationDesign(buildWaterSp(stage), …)——两侧吃同一工厂产物, "两侧不同源"在结构上写不出来; 两侧解析规则的微分歧(设备侧原缺 0.3 m 下钳与 proc 兜底)一并消失。M11/M14 保留为纵深防御。
按纪律先红后绿: 批①忠实等价替换(基线逐位不变) → 批② M15 入列预期转红(红项恰为 thermalClass + protein, 预飞探针 tools/probe_fieldflow.js 事先命中) → 批③处置转绿 27/27。四条人工负对照全部精确转红: 表删 DOmin_abs → M15a · 塞假字段 → M15b · 手写白名单复活 → M15c 两条且级联咬中 M11/M14 数值断言(结构层与数值层双重防御实证) · 设备侧退回 raw stage → M15d。
遗留清单第 5 位落地。侦察修正了问题定义: 渲染层其实已有曝气强度告警与 CO₂ 超标告警, 真实缺口是三样——告警困在渲染层(A.6 家族: 无导出面、无断言、渲染改坏无人知, 报告照出成本不带"该方案不可行"标记); o2 关塔这一物理上必然积累 CO₂ 的配置与"塔效率不足"共用一句轻描淡写的文案; 参数表 aerationMode 处无联动。现 sim 新增结构化导出 configWarns: AIR_INTENSITY_OVER(复用 aerIntensity 全部字段)与 CO2_OVER(结果级判据 CO₂稳态>阈值 + rootCause 三分 stripperOff/airUnderperf/stripperUnderperf——不选"o2 关塔一律响"的配置级判据, 因为高换水/低密度下确实可达标, 天天误报就没人看告警了)。判据只复用已算出的量, 零新阈值。渲染两块改为消费该数组单源, o2 关塔文案升格为「物理上必然积累, o2 模式必须启用脱气塔」; 参数表联动落地(选择器随每次计算着色 + title 给可行密度上限, 只提示不自动切换——不替用户改配置)。这也是 A.6 十一类告警未来迁移的目标形态。
预飞探针 tools/probe_warnmatrix.js 先出触发矩阵定锚: W1 锚 edge_air_aeration(池底布气 4.84–7.24 vs 限 1.7)、W2 锚 edge_no_degasser(CO₂ 124–148 vs 阈 15/20), 13 条基线两标志全假, edge_shrimp_air 提供"合规不响"侧(甲壳类档 0.79–1.77 vs 4.0)。断言四条: W0 导出必须存在(红仪式之红: 断言先行上线即 FAIL 3/27, W0 遍布全库)· W1/W2 标志与底层状态双向一致(该响必响 + 不该响必不响, 防告警恒真化)+ 两处锚定(锚定与 ⇔ 不同源: ⇔ 查一致性, 锚定查物理预期)· W3 静态 toString 锁渲染层必须消费 configWarns 与两个 code 字面量——防"数据层↔渲染层双源各自自洽"这一复发六次模式的翻版(自检 27 → 28 条)。负对照 3/3 精确转红: 撤数据层标志 → W1⇔+锚咬(FAIL 24/28)· 渲染退回旧读法 → W3 咬· 判据改错阈值×10 → W2⇔+锚咬。13 条基线全程逐位不变。
📌 局限如实记录: M15 只覆盖「鱼种/阶段 → sp」这条链(五次复发的案发地)。派生中间量的流转(V_vent_eff 一类, 第四次复发所在)不在本表射程, 仍由 M12a 数值断言压着——那是另一个量级的依赖图, 有意不在本版摊开。消费点内残余的 || sp.recDepth_m || 1.5 兜底对工厂产物是死代码, 仅为诊断脚本手造 sp 保留防御。
由产业侧一句追问("关塔时是不是该让用户输 CO₂ 浓度")牵出的一串: 先是发现参数早已存在却无入口, 再顺藤查出加载路径防线的判据错位, 最后补成对称的一对设计输入。自检 29 项, 13 条基线全程逐位不变。
ensureStageProc 的钳制以「默认值是不是数字」为判据, 而哨兵字段(默认 null = 未设定)的 typeof 是 object, 整类字段漏在防线之外——表里登记了 clamp 也不生效。实测注入 co2TargetMgL=0.0001 原样通过, 关塔风量 4,239 → 1,271,584,656 m³/h(放大 30 万倍), 与第七轮审计 P1 的 co2StripperGtoL=1e6 同族同路径。修法是把判据改为「FIELD_SPEC 表里有没有条目」, 与默认值类型无关; 空值仍保持 null——"未设定"不能被钳成"设定为下限", 那是另一种静默错配。断言 S1/S2 直接构造注入复验, 不依赖工况。
查证发现这是同一个毛病的两面: CO₂ 侧拿鱼种阈值(安全上限)当选型目标, DO 侧拿 DOmin(安全下限)当设计 DO。两边都贴着红线设计, 没有裕量应对投饵高峰/水温波动/设备衰减。故补成对称的一对: 设计 DO 与 设计 CO₂, 留空则回落鱼种值(现状, 基线因此逐位不变)。二者共同决定风量并可看到控制侧翻转——实测罗非成鱼期留空时 CO₂ 侧 4239 险胜 O₂ 侧 4228, 设计 DO 提到 6.0 立刻翻成 O₂ 控制(7243); 设计 DO 7.0 时风量 15993, 是留空的近四倍。这个决策以前藏在鱼种库的"最低允许值"里替用户做了。
产业侧指出这与液氧拓扑的关键差别, 已实测确认: turnover 1→4(流量 4×)时 air 模式池内 DO 恒为 4.9813 纹丝不动, 而 o2 模式同一扫描 DO 由 0 → 8.39。两个设计参数的算式中都不含流量(O₂ 侧 ∝ 1/驱动力, CO₂ 侧 ∝ 1/(亨利载量×目标))。⚠ 如实记录一处间接耦合: air+关塔时 CO₂ 稳态会随流量小幅变化(23.7→27.3), 但那是经由风量的二阶效应(流量低→池内 TSS 高→耗氧高→O₂ 侧风量大→顺带多吹脱), 非直接依赖。
产业实际: 空气曝气用于低密度(苗种/小鱼期最常见), 该场景基本不另配脱气塔——曝气本来就在跑, CO₂ 顺带被吹脱, 一台设备干两件事。模型实测支持: 罗非1000t air 开塔 31.25 元/kg·14.23 kWh/kg, 关塔 26.20·8.35(省 16%, 比电耗近腰斩), 最高 CO₂ 27.3 < 阈值 30 守得住。⚠ 代价不是消失而是转移: 关塔后曝气吹脱的 CO₂ 全部入室, 车间通风 ACH 1.0 → 6.05——敞开式车间无妨, 恒温恒湿要掂量。故联动只做在 UI 切换事件层、不下沉计算层(计算层猜意图会静默改掉用户显式配置, 且会动基线), 且用户亲手动过塔开关后不再被覆盖。断言 S3 静态扫描计算层源码防止后人挪下去。
批B 给 co2TargetMgL 加输入框后随即发现 readStageProcFromInputs 根本没读这个字段——UI 加了也不生效。同型风险已写进断言 S4: 不仅查"留空必须回落鱼种值", 也查"填了必须真的生效"。另修一处误导: 新增字段最初无条件常显, 而它们在纯氧模式下填了完全不起作用(o2 模式根本不调 tankAerationDesign), 已补反向灰显标记 data-aeration-air, CO₂ 目标另加"仅关塔"二级条件。
产业侧质疑"UI 里 40 kg/m³ 太高"。查证结果不止确认了这个判断, 还更正了我们自己的一处引用错误: 代码注释记的是「GSA >40 kg/m³ 必须纯氧」, 而原文给的是区间 + 硬上限两句话——仅靠曝气的密度典型限于 30–40, 超过 40 则确定不足。旧注释把硬上限抄成了分界线, UI 又据此写成"<40 都可用空气", 等于把区间上沿当成了推荐值。纯文案与注释改动, 13 条基线逐位不变, 自检 28/28。
美南水产中心《RAS 设计实践综述》给出最明确的一条: 密度 <30 kg/m³ 时气提(airlift)可提供全部需氧, 而满密度 60 kg/m³ 时仅能满足约一半。这是"空气路线物理上限"的独立出处, 非经验感觉。⚠ 其装置为开放池气提(效率约 0.80), 与本模型池内微孔盘不完全同源, 已在注释标明。另有 TheFishSite 的「>50 kg/m³ 才常规上纯氧」明显更宽松, 但它答的是经济性问题(何时不得不上纯氧), SRAC 答的是工程能力问题(空气供不供得上)——两问不同, 故不并列取值。
三个数各有各的位置, 不混用: 30(物理上限, SRAC/GSA)进 UI 选项与参数表; 20–25(DB46/T 424—2017 + 设备商大菱鲆系统参数 + 本模型按池底布气 1.7 反算, 三源收敛的国内浅池实配)进选择器 title 与代码注释; 而任一阶段的准确上限始终以 aerIntensity 反算为准——它随水深/温度/鱼种变(石斑成鱼期 23.0, 甲壳类另档), 二批已把它接进选择器提示。三批后 title 在合规工况下也显示口径谱系, 不再只在超限时出现。
这次的根因不是数字取错, 而是抄数字时丢了它的口径(范围 / 硬上限 / 推荐值)。一个失去口径的数在传递中会自动变成另一种含义: GSA 的"超过 40 肯定不行"传成了"低于 40 都行"。已写入注释作为纪律: 凡引用外部数字, 须连同原文口径一并记录。这与"不拿来源不同的数字当阈值"是同一条纪律的两面——前者管来源, 后者管语义。
处置遗留清单第 5 位: 两条物理不可行/不合理配置(air 超密度、o2 关塔)此前"静默算出成本"。侦察发现真实缺口比清单文字更窄——渲染层其实已有曝气强度与 CO₂ 超标告警, 真正的问题是它们困在渲染层(A.6 家族: 无导出面、无断言、渲染改坏无人知, 报告照出成本不带任何标记), 且 o2 关塔与"塔效率不足"共用一句轻描淡写的文案。本批把两条判定提升为 sim 级结构化导出 configWarns + 断言 W0–W3 锁定。纯新增字段, 13 条基线逐位不变, 自检 27 → 28 条。
AIR_INTENSITY_OVER(复用 aerIntensity 全部字段与可行密度反算)与 CO2_OVER(结果级判据 CO₂稳态>阈值, 附 rootCause 三分: stripperOff / airUnderperf / stripperUnderperf)。选结果级而非"o2 关塔一律响"的配置级: 高换水/低密度下 o2 关塔确实可达标, 配置级会天天误报——"天天见红字就没人看告警"。判据只复用水质链已算出的量, 零新阈值(纪律: 不拿来源不同的数字当阈值)。渲染层改为消费本数组(单源), CO₂ 文案按根因三分——o2 关塔从"建议启用"升格为"物理上必然积累, o2 模式必须启用脱气塔"。这也是 A.6 十一类告警未来迁移的目标形态: 新告警按此建, 旧的逐步搬。
W0 导出必须存在(红仪式的红即由此: 断言先行上线, FAIL 3/27 全库咬中)· W1/W2 标志与底层状态双向 ⇔(该响必响、不该响必不响, 防告警恒真化)· 锚定: edge_air_aeration 必须有 W1 标志(预飞实测池底布气 4.84–7.24 vs 限 1.7)、edge_no_degasser 必须有 W2 标志(CO₂ 124–148 vs 阈 15/20)——锚定与 ⇔ 不同源: ⇔ 查一致性, 锚定查物理预期, 且是对"存在能走到断言的工况"的显式保证(M13/M14 教训, 本批以预飞探针 tools/probe_warnmatrix.js 事先确定触发矩阵)。W3 静态锁渲染挂钩(.toString() 扫描, 与 M15 同机制): 渲染层若退回"直接判 aerIntensity / tank.CO2"的旧读法, 就是复发六次那个模式在数据层↔渲染层之间的翻版, W3 当场咬。
aerationMode 选择器随每次计算结果着色, title 给出本阶段池底布气实测值与 air 模式可行密度上限(活数据, 经 renderStageWarnings 每次 recompute 刷新, 无陈旧问题)。有意不做自动切换: 不替用户改配置, 增氧方式是工程决策——模型的职责是把不可行性摆到明处, 不是代替拍板。
负对照 3/3 精确转红: 撤数据层标志 → W1⇔+锚咬(FAIL 24/28)· 渲染退回旧读法 → W3 咬 · 判据改错(阈值×10)→ W2⇔+锚咬。顺带发现: edge_yield_tiny 的鱼池 CO₂ 实际在 21.5–23.7 mg/L、略超阈值 20——该工况的 CO2_OVER 标志为真且 W2 一致性通过, 行为正确; 此前无人知道这个边界工况处于超标状态, 结构化导出的第一天就多看见了一件事。⚠ v2.5 补注: 链式重导 (审计 B8) 后该工况鱼池 CO₂ 已降到阈值内, 当前只有 edge_no_degasser 触发 CO2_OVER。本段保留为当时的记录, 结论不再描述现状。
车间模式重新划分为三档, 分档判据只有一条: 能否自动调节温湿度 —— 不是"简易还是正式", 也不是"自然还是机械"。conditioned 恒温恒湿车间 / natural 自然通风车间 / mechanical 机械通风车间。同时补上一台此前两档共同缺失的设备: 车间通风机 KV-1003。13 条数值基线因此全部重算(方向与量级逐条对预测表)。
这是本版的关键判断, 来自产业侧一句反问: "恒温恒湿车间也有机械通风"。确实如此 —— 恒温档的 ACH 新风量一直在参与计算(UA_vent_sens 进暖通负荷), 但从来没人给它配风机。全场四台风机(脱气塔/BF/蛋分/池内增氧)里没有一台是车间通风机。所以通风方式不是 ventilated 的子类型, 而是横跨两档的独立事实; 撤销三档并列后, "恒温恒湿 + 自然通风"这个物理上不成立的组合也被天然排除(一边花钱控温, 一边让室外热风穿堂)。
功率 = 风量(m³/s) × 全压 ÷ 效率, 与既有四台风机同一套公式。两个易错点都封在断言里: 其一, 风量必须取 V_vent_eff_m3h(= max(ACH×V_room, CO₂ 稀释需求))而非 ACH×V_room —— air+关塔 时 CO₂ 才是控制项, 挂错口径实测低估 58–66%, 且只在 CO₂ 控制的工况暴露, 只测 o2 模式永远不显形。其二, 全压走独立键 250 Pa, 绝不复用池内曝气盘的 70 kPa —— 后者要克服水柱静压, 差两个数量级(173,123 m³/h 下: 250 Pa 给 21.9 kW, 70 kPa 给 6,121 kW), 与 K0_W74 传摄氏度那次事故同族。热去向为新增的 exhaust 类别: 直驱轴流排风机电机在排风气流中, 空气离开车间后才经过电机, 废热随排风带走。⚠ 已知边界: 恒温恒湿若用送风式 AHU, 送风机废热确实进车间并需再制冷, 本版按单风机排风统一处理, 该情形偏低。
补一台真实存在的设备必然改变基线, 故按纪律先出预测表再改代码: 预测全部 13 条上升、幅度 +0.01~+0.08 元/kg(≤0.1%)、最大为 turbot_500(水体大、通风量 5 万 m³/h)。实测方向 13/13 为正、量级 13/13 吻合, 最大偏差 0.006 元/kg(bass_300 预测 +0.02 实测 +0.026, 差在预测未计 CAPEX 折旧那一份)。幅度之所以远小于口头估算的 +0.8 元/kg, 是因为基线默认 ACH 为 1 而非简易棚的 15; 同一台风机放到海南简易棚工况(ACH 15)是 21.9 kW(密度 20)/ 10.9 kW(密度 40) —— 密度高反而小, 因为车间体积减半。
实测(石斑/三亚/200t/密度20/年均, 恒温恒湿档) air+关塔 相对 o2: 新风 7,116 → 9,835 m³/h(+38%, CO₂ 成为控制项)、除湿量 1,378.6 → 1,776.9 kg/d(+29%)、除湿电 551 → 711 kWh/d; 尾气显热恰为零(A3 下 T_room=T_w, 数学上严格为零, 到通风档立刻复活)。据此三条告警: 恒温恒湿+空气曝气(新风与除湿双重加价)· 新风被 CO₂ 顶高(同一股 CO₂ 在通风车间只需付风机的钱)· air 模式开塔冗余(曝气本身即脱气, 唯一合理用途是当风量被 CO₂ 侧控制时降低曝气强度 —— 实测 d40 成鱼期开塔可把池底布气从 3.43 降到 2.96 而合规)。每条都写明什么时候可以忽略它: 育苗/亲鱼车间本就是恒温恒湿+空气曝气的常态配置(低密度、精确控温、鱼苗对纯氧过饱和敏感), 否则天天见红字就没人看告警了。
对本批全部改动做了一次系统审计, 查出三项, 其中一项是真 bug。
① 池深不同源(真 bug, 且是我上一批"只修了一半"留下的)。poolDepth_m 是阶段卡片上用户可编辑的字段(0.5–8 m), 注释明写它是「统一池深数据源」。但曝气侧三处全都绕过它、直接读鱼种推荐值 recDepth_m: tankAerationDesign 的 OTE、aerIntensity 的池底面积、浅池 CO₂ 告警; 而且兜底值也不一致(统一源 1.5 / 曝气侧 3)。实测: 用户把池深由 1.5 改到 5 m, 热工侧池面积 1348 → 404 m² 响应了, 曝气侧仍按 1348 算, 池底布气强度纹丝不动。上一批修 recDepth_m 白名单时只让它读到了推荐值, 没接到权威源 —— 修一半比不修更隐蔽。现三处统一改读 poolDepth_m || recDepth_m || proc.poolDepth || 1.5, 与热工侧同口径。13 条基线逐位不变(基线均未设 poolDepth_m, 走同一分支)。
新增断言 M14(池深单源): 曝气侧池面积必须等于热工侧池面积。⚠ M10a 抓不到它 —— M10a 校验「体积×水深=池底」, 两边用同一个 _depth, 自洽但不同源。这是本会话第五次同模式(DOmin_* / recDepth_m / isCrustacean / 风量口径 / 本项)。凡"权威源 → 转发 → 多消费点"的链, 断言必须跨消费点比对, 不能只查单侧自洽。
⚠ M14 写好后负对照仍全绿 —— 基线工况都没设 poolDepth_m, 两个源恰好相等, 没有工况能触发它。这正是 M13 那次教训的第二次复发, 根因是自检工况只能施加 proc 与 climate、无法施加阶段级字段。故补齐 c.stage 施加机制并新增工况 edge_pool_depth_override(自检 25 → 26 条), 负对照方精确转红(44.737 ≠ 13.421, 偏差 233%)。断言的表达能力受限于工况的表达能力 —— 这次是从工况层解决, 不是再写一条注释。
② heatVia 取值文档缺 'exhaust'(文档缺口)。登记表新增了该热去向类别但注释里的取值清单没同步, E1 断言只查是否声明、不查枚举, 故功能无碍但会误导后人。已补。③ 发布章小节编号乱序: 每次追加都插在前一节之前, 导致显示为 ①②③④⑧⑦⑥⑤。已重排。
审计中复核无误的部分: 通风机 CAPEX 实际入清单(14.3 kW → 28,595 元 @2000 元/kW, 苗种期 0.13 kW 低于 0.3 门槛未单列, 与 capexMinKw 一致); 风机风量在 CO₂ 控制工况下亦与热工侧同源(此前担心 pass-1 粗算 thermal 与最终值分叉, 实测多趟迭代已收敛); 档位白名单回落正常(open/非法值均落 conditioned, 与 conditioned 输出逐位一致); 自然通风档无风机、零产量边界不崩。
此前几轮关于"空气曝气能撑多少密度"的推算, 全部依赖设备商配置反算与媒体报道, 直到取得海南省地方标准 DB46/T 424—2017《豹纹鳃棘鲈工厂化养殖技术规程》正文 —— 这是本轮最硬的一份依据, 因为它是成文标准而非推算。
标准表 1 分规格养殖密度: 体长 10–15 cm → 150–250 尾/m³、1–5 kg/m³; 15–20 cm → 100–150 尾、5–15; 20–30 cm → 70–100 尾、15–20; 30–40 cm → ≤70 尾、≥20 kg/m³。标准同时明写密度的约束条件: 「养殖密度与养殖设施、换水量、溶氧量密切相关, 换水量越大、溶氧量越高的养殖水体, 可适当增加养殖密度」—— 正是本模型一直在建的那条逻辑链。增氧设施 (4.4) 规定「采用鼓风机+纳米管或纯氧统一供氧」, 二者并列为合规方案, 未规定密度分界 —— 结合密度表看, 20 kg/m³ 量级下鼓风机+纳米管是标准认可配置, 再次印证空气曝气承载量 20–25 的落点。另: 水质指标 DO≥5 mg/L 与模型 DO_design = max(DOmin_abs 5, 0.7×DO_sat) 逐字相符, 修正后的池内曝气稳态 DO 5.16–5.41 正在标准线之上。
石斑成鱼期 recDepth_m 由 3.0 m 改为 1.5 m, 依据标准 4.2「养殖池面积 10–20 m²、池深 1.0 m–1.5 m」; 万宁在建工厂化项目实测池型 Ø8 m / 90 m³ ⇒ 水深 1.79 m, 亦远浅于原值。⚠ 该字段是统一池深数据源(poolArea = V_tank/poolDepth → A_building = 1.6×poolArea → V_room), 改它会连锁改池面积、建筑面积、蒸发面与通风量, 故基线随之重算。按纪律先出预测: 池面积翻倍 ⇒ 蒸发↑、除湿↑、围护与通风↑ ⇒ 仅 grouper_500 上升且幅度显著, 其余 12 条逐位不变。实测完全命中: grouper_500 工艺成本 44.6291 → 44.8341(+0.2050)、企业全成本 +0.2176、比电耗 +0.2217 kWh/kg、热泵成本 +0.1400(+8.7%, 蒸发面翻倍导致的潜热负荷, 涨幅最大); 其余 12 条 diff = 0。副效果: 成鱼期池底布气强度由 1.71 降至 1.48, 从超限转为合规, 可行密度上限 19.8 → 23.0 kg/m³, 与标准表 1「30–40 cm 段 ≥20」及产业口径 20–25 一致。
控光作为已知未建模维度记入代码注释: 标准把控光列为要求项(4.2「配备通风、控光、控温设施」; 6.2「光照 2000–5000 Lux」, 与 DO/pH/温度/盐度同级)。产业侧佐证: 东星斑养殖场用蓝光红光模拟 20–30 m 深海光照, 因体色直接决定售价。iRAS 缺口有三: 灯具电耗未进 POWER_REGISTRY(比电耗系统性低估)、灯具废热未进车间空气节点(与补 UV/泵废热同族的漏项)、体色分级溢价未进财务侧 —— 这是唯一一条收入侧缺口, 其余遗留全在成本侧。不在本批建模: 需灯具选型口径、光谱配比、光周期, 且体色-售价的量化关系无公开数据。
原限值 2.0 / 3.0 m³/(m³·h) / m³/(m²·h) 的依据是搅拌式反应器能效拐点与对虾育苗盘密度反推, 用在鱼身上偏松 2–3 倍。经产业配置反算后下调至鱼类档 1.0 / 1.7, 并将原值保留为甲壳类档(工厂化对虾的正常工况就是"水面气泡成沸腾状", 絮团还需曝气维持颗粒悬浮)。
标定口径写死为全压 20 kPa · 效率 0.60(产业确认: 1 m 深的池子 20 kPa 够用; 罗茨风机压力经验 9.8 kPa/m 水深)。⚠ 不写"20–30 kPa"这类区间 —— 全压取 20 与 50 kPa 结果差 2.5 倍, 含糊比精确更危险。同口径反算: 山东海水工厂化空气悬浮 18 kW/2000 m²(深 0.8)→ 池底 0.97·体积 1.22; 老式罗茨 22 kW/1440 m²(深 0.8)→ 池底 1.65·体积 2.06; 工厂化对虾 15 kW×2/1000 m³(深 1.2)→ 池底 3.89·体积 3.24(该工况正常状态即水面沸腾, 鱼类不适用)。布气密度交叉印证: 纳米盘每 m² 池底 1 个; 对虾池 5.5×5.5 m 配纳米管 28 m ≈ 每 m² 0.93 m 管。承载量交叉校验: 鱼类取池底 1.7 时石斑成鱼期反算可行密度约 20 kg/m³ —— 与设备商系统参数(同一系统: 罗茨风机 20 kg/m²、液氧 40 kg/m², 大菱鲆)及 GSA「>40 kg/m³ 必须纯氧」一致, 三个独立来源收敛于空气曝气鱼类承载量 20–25 kg/m³; 产业侧确认 30–40 配空气曝气偏高。
⚠ 二次修订: 两个判据曾自相矛盾。一次修订把池底 1.7(来自养殖池实配反算)与体积 1.0(来自搅拌式生物反应器能效拐点 0.9)并列当判据用, 结果在 0.8 m 浅池上打架 —— 同一套真实运行的系统按池底判据合格(0.97/1.65 < 1.7)、按体积判据却超限(1.22/2.06 > 1.0)。因 池底 = 体积 × 水深, 池底 1.7 在 0.8 m 下隐含的体积上限本应是 2.1。现改为: 池底为主判据(有真实配置支撑), 体积为次判据且阈值取在实测之上只拦极端 —— 鱼类 池底 1.7 / 体积 2.5, 甲壳类 池底 4.0 / 体积 3.5(一次修订误设的 3.0/2.0 实际低于对虾真实配置 3.89/3.24)。告警文案按主/次判据分别措辞。⚠ 仍依赖假设的风机效率 0.60, 且多数来源未给对应密度, 属待校准项。
新增断言 M13 + 工况 edge_shrimp_air(自检 24 → 25 条)。立此断言的直接原因: 新增鱼种字段 isCrustacean 后, 负对照证明把它从 sp 白名单撤掉24 条自检依然全绿 —— 与 recDepth_m 完全同一模式的第四次复发, 注释提醒挡不住, 只有断言能。更值得记的是: 断言写好后负对照仍全绿, 查明是没有工况能触发它(aerIntensity 仅在 air 模式下计算, 而 shrimp 基线走 o2) —— 新断言必须确认存在能走到它的工况, 否则等于没写。补工况后负对照精确转红(实得 1/1.7, 应为 2/3)。
交付后有人问"空气曝气对 CO₂ 的去除如何建模", 顺带发现一处我误判为缺陷、实际是正确设计的地方, 特此记录以防后人"修正"它。模型对 O₂ 用 OTE ∝ 水深、对 CO₂ 用与水深无关的亨利平衡载量 kLoad —— 这看似不一致, 查证后确认是两种传质机制的正确区分: O₂ 溶入是【速率控制】(推动力大, 气泡全程远未饱和, 接触越久溶入越多); CO₂ 脱除是【气相载量控制】(气泡在离开液面前已被 CO₂ 饱和, 再深也装不下)。生物反应器放大实测显示 O₂ 的 kLa 随液深线性增长, 而 CO₂ 的 kLa 仅在液深 < 约 1 m 且最弱搅拌下线性, 更深时出现明显饱和效应; CFD 研究同样确认大型反应器中气泡在离开培养液前即被 CO₂ 饱和。若照"补上水深依赖"去改, 反而会把一个正确的模型改坏。
但饱和的前提是停留时间够, 浅池不成立。鱼种库里大菱鲆全程 0.8–1.0 m、石斑苗种期 1.5 m 均在转折点附近或以下 —— 这些工况的 CO₂ 去除被系统性高估, 而大菱鲆是冷水鱼、CO₂ 阈值更严(20 而非 30 mg/L), 三重叠加。本补丁新增浅池告警(水深 < 1.5 m 且 air 模式关塔时触发; 实测大菱鲆三阶段全触发、石斑 1.5 m 及以上不触发、开塔与 o2 模式均不触发)。只告警不折减: 那个 ~1 m 转折点出自搅拌式生物反应器, 气泡尺寸/上升速度/湍流强度与养殖池微孔盘曝气都不同, 硬套来源不同的数字比宽带更糟(与标定探针头注同款教训)。另记一条待查: 级联塔实测显示海水的 CO₂ 吹脱效率显著低于淡水(归因于无机碳电离分数差异), 而模型现有的 marineCO2Factor 挂在 CO₂ 限值上且注释自承"无出处、应单独查证"—— 该系数可能挂错了位置: 海水该被区别对待的或许是去除效率而非限值。
M12a 通风机风量与热工侧真实通风量同源 · M12b 档位一致性(自然通风档必须无风机, 恒温恒湿/机械通风必须有 —— 后者是"恒温恒湿本身即机械通风"的运行时证据)。负对照: 风量挂错口径 → M12a 红(429.5 ≠ 1023.3, −58%)· 恒温档不装风机 → M12b 红(FAIL 3/24)· 误用 70 kPa → 13 条基线红(FAIL 11/24)。实施中另有一次真实被咬: CAPEX 门槛 0.3 kW 与登记表 capexMinKw 不同源时, 断言 F4 当场报出"有电功率但 CAPEX 明细中无对应条目"。
本版起于一个产业侧提问: 空气曝气是直接打进鱼池的, 鱼在同时消耗氧, 所以风量必然远大于"把水打到 95% 饱和"所需。顺着这句话查下去, 发现模型对同一台鼓风机 K-101 用了两套互相矛盾的拓扑, 并连带挖出一个潜伏的跨模块不同源缺陷。13 条数值基线逐位不变, 自检 24 条工况不变, 新增断言 M9/M10/M11。
选型侧 tankAerationDesign 按池内曝气算, 是对的: 池水维持 DO_design(≈5 mg/L), 推动力只剩 (C_sat−C)/C_sat ≈ 26%, OTE 折算后仅 2.2–4.5%, 风量据此反推 —— 确实远大于饱和所需。水质侧却按主流增氧算: DO = DO_sat×0.95 − 单循环降幅, 假设水"进池时"已 95% 饱和。可 air 模式的气是直接打进池子的, 根本不存在"进池浓度"。后果: 同一台按 5.00 mg/L 选型的风机, 水质侧在密度 40 时算出 DO = 0.00, 密度 20 苗种期算出 2.70, 而成本照出、无人报错。本批改为池内质量平衡 C = C_sat − OCR·C_sat/(A·ρ·w_O₂·OTE_base), 与循环流量无关(循环流量只管 TAN/CO₂/TSS)。修正后密度 20/31/40 全部稳在 5.31–5.41, 且开塔工况解析验算 (6.73−1.73/1.10 = 5.158) 与模型三阶段输出逐位吻合。零新常数。
诊断中发现两条路径的风量对不上。根因: recDepth_m 是鱼种库逐阶段字段, 设备选型侧传完整 stage(有), 水质侧传 recomputeAll 构造的白名单 sp(没有) → 静默兜底 3 m。OTE ∝ 水深, 苗种期两侧风量差 1.68×(222 vs 132 m³/h) —— CAPEX 买的机器与水质链假设的机器不是同一台。该白名单上方就挂着 v1.1.2 的注释「sp 必须包含 DOmin_satRatio 和 DOmin_abs, 否则鱼种内置 DO 阈值失效」: 同一个白名单、同一种漏字段、第三次。负对照证明撤掉修复后24 条自检依然全绿(两条路径各自内部自洽, 只是彼此不同源), 故封在断言层 M11 而非注释层。
总风量由鱼的耗氧定, 几乎不随密度变(密度 20→60, 222→332 m³/h); 而水体 ∝ 1/密度 ⇒ 强度 ∝ 密度。新增派生量 aerIntensity(体积强度 m³/(m³·h) 与池底布气 m³/(m²·h)), 超限告警并反算该阶段 air 模式可行密度上限(因 V=生物量/密度, 反解精确而非外推)。阈值 2.0 / 3.0 的出处与局限均写在常量注释里: 前者源自 33.3 m³ 池 CFD+实测的能效拐点(30 vs 60 m³/h 效率差 32.1%, 即 0.90 vs 1.80), 是能效拐点而非福利阈值; 后者由纳米盘每 m² 1 个 × 单盘 1.5–3 m³/h 反推的工程惯例, 非规范条文。定性佐证(气泡扰动噪音不利生长、紊流碎化残饵、三文鱼通气频率随曝气升高且与 DO 无关)只入注释不入判据。实算: 石斑成鱼期可行上限 35 kg/m³ —— 与 40 kg/m³ 的国际经验线接近, 但这次是推导出来的。
M9 气曝-DO 闭环(与 M8 气曝-CO₂ 闭环成对: 一个锁 O₂ 侧、一个锁 CO₂ 侧) · M10a/b/c 曝气强度几何自洽与可行密度反算自洽 · M11 设备侧/水质侧风量同源。负对照逐一验证: 撤 DO 修正 → M9 红(三条 air 工况全咬, 罗非默认密度即 2.08 vs 4.70) · 池底面积错水深 → M10a 红 · 反算写成加法 → M10b 红 · 池底口径误用体积阈值 → M10c 红 · 撤 recDepth_m 白名单 → 修 M11 前无人咬住, 修后转红。另补车间高温告警(与简易模式批次的寒潮告警对称: 比水温高 >5 K 管热泵负荷、绝对 >38°C 管作业与设备降容)。
简易模式批次的车间模式做了三档, 其中 open(露天, 车间热工整体旁路)在中国工厂化循环水里没有实际工程场景 —— 该领域以简易棚为主。保留一个永不被选中的分支只会扩大维护面与审计面, 故本版连同白名单、UI 选项、派发分支、R4 断言枚举一并撤销。向后兼容按既有路径处理: 若方案 JSON 写着 roomMode='open', 白名单不认 ⇒ 与任何非法值同样回落 conditioned(断言 R4b 覆盖, 实测确认)。因该档从未随任何发布出厂, 实际不存在此类文件。
石斑/三亚/200t/简易棚/关塔/关臭氧与 AOP/放大系数 1.8: 密度 20 → 70.29 元/kg, 密度 40 → 54.23 元/kg。密度 40 下 DO 5.31–5.38 达标、CO₂ 20.45 mg/L 在阈值 22.5 内(曝气本身即脱气, 无需另配脱气塔)、全年凝水为零(海南冬季室外 18–20°C, 围护内表面始终高于露点) —— 唯独曝气强度全线超限。真正的限制是夏季车间温度(设计夏 36–41°C, 池面转得热进热泵)与曝气强度, 不是 DO、不是 CO₂、不是湿负荷。
国内多数循环水项目是简易棚: 无暖通无除湿, 车间温湿度由太阳、设备废热与自然通风共同决定。此前该场景无表达路径 —— 关掉暖通开关只是不收电费, 模型仍强制室温=水温。本版新增全局「车间模式」: conditioned(恒温车间, 既有路径逐字保留)/ ventilated(简易棚·自然通风, 新求解器)。(本批原含第三档 open 露天, 后续批次已撤销, 见下。)13 条数值基线在恒温档下逐位不变(全精度导出比对, 非仅容差级), 自检 23 → 24 条。
车间温度自由求解正是 v1.2–v1.9.3 的做法, 当年热带鱼种算出车间 9–14°C / RH 99%, 与摩洛哥温室实测 16°C、大连简易棚实测 22–23°C 方向反了 15–20 K, v2.0 因此撤退到「暖通维持」。本轮复盘确认: 方程没错, 是热源清单漏了三类 —— 太阳辐射(全库无建模)、设备废热(未进空气节点)、接触器尾气显热(被 A3 的温差恰为零掩盖)。空气节点唯一热源只剩池水对流小项, 围护+通风大项把解拽向室外温度。三类全部补齐后重启求解。
九个气候区各补 GHI 冬/夏/年(Global Solar Atlas / NASA POWER, 三亚年均 5.2 kWh/m²·d); 四档围护各配窗 SHGC / 屋面 SHGC / 不透明面吸收率(ASHRAE Fundamentals Ch.15, 温室档透光屋面 0.55, 近被动房 0.35); 不透明面按 sol-air 折算(h_o = 22.7 W/m²K, 墙面 ×0.5 朝向因子)。求解器 solveRoomAir 对显热与湿平衡两线性式经结露潜热耦合做阻尼不动点迭代; 池面显热系数不另取 5 或 15 的常数, 由既有蒸发系数经 Lewis 类比反推(蒸发与显热永远同一张换热面); 通风显热直接复用 0.34 系数的 UA 项, 与报告口径同源。超饱和时钳到饱和线、结露潜热回注、凝水量作腐蚀风险告警。
ventilated/open 档下暖通显热与除湿电耗严格为 0 并由断言 R3 锁死 —— 防「算了不计」复发。池面显热带符号接入水侧热平衡: 三亚设计夏车间解至 36.7°C(高于 27°C 水温), 池面转为得热, 水侧冷负荷 3,894 → 4,520 kWh/d。同基准三方对照(石斑/三亚/密度20/air/关塔/annual): 恒温车间 hvac-off 63.9 元/kg(仍计除湿 711 kWh/d 电, 那台机在该档真实存在)→ 简易棚 62.6 元/kg(除湿整机移除省电 > 池面得热代价, 而热泵冷负荷确实上升 6,157 → 6,298 kWh/d)。v1.x 失败特征(车间坍缩到室外之下、池面白捡散热)经三组实测锚点标定确认未重演。
R1 收敛性(不收敛即红, 界面同步 danger 告警)· R2 物理界(T_room ∈ [min(室外,水温,地温)−0.1, max(室外,水温)+30] —— 对规格原文下界做了推广: 冷水鱼种的池面是合法低于室外的热汇)· R3 模式互斥 · R4 取值合法性与向后兼容(未设 roomMode 的旧方案 JSON 必落恒温档)· R5 空气节点显热闭合(围护+通风流出 = 太阳+内热+池面+尾气+结露, 守恒断言 B 的自由节点版)。五组破坏性负对照逐一验证每道闸门真会咬人: 强制不收敛→R1 红、撤暖通守卫→R3 红、求解器丢尾气项→R5 红、太阳归零→标定钩子红、池面归零→标定钩子红。新增标定探针固化三组实测锚点(摩洛哥温室鳟场 / 大连河豚棚 / ASHRAE 自然通风泳池馆), 判据为方向+有界偏移+三类热源在场, 点值降级为诊断输出 —— 追着实测点调工况旋钮是曲线拟合表演, 探针头注保留了这条教训。
air 模式气泡把池水 CO₂ 吹入车间, 新风需求此前只按脱气塔份额计。现关塔且曝气入室时份额取 1(全部 CO₂ 产量入室, 零新常数)。该修复对 air+关塔的恒温档工况有真实影响(新风↑ → 除湿/暖通构成变化, 三亚案例约 +0.3 元/kg); 13 条数值基线全 o2 模式, 逐位不受影响。开塔时曝气残余吹脱份额仍未细分, 维持开放项。
全局热工面板顶行新增「🏠 车间模式」。选简易棚后建议把 ACH 调到 15–30(输入上限已放宽到 30); 简易档下若出现结露告警(围护内表面凝水 kg/d), 优先加大通风或对围护做防凝露处理; 车间比水温低超过 2 K 时提示寒潮核对鱼种耐受下限。恒温车间档行为与 v2.3 完全一致。
第七轮独立审计报出两条严重回归, 共性诊断准确: 都是一次正确的重构越过了自己的边界, 且检测缺口同构 —— 断言查的是内容, 失效发生在结构。本版逐条实测核实后处置 (两条属实且比报告更重、一条属实、一条含误报更正、一条按设计决策收窄), 并把「结构」维度补进断言体系。自检 21 → 22 项, 工况 22 → 23 条。
v2.2 构建期补丁写入的三处 description(meta / og / twitter)行尾各多一个 >。HTML5 解析器在第一处把 <head> 提前闭合, 20 个 meta + canonical 全部掉进 <body> —— 爬虫只解析 head, canonical / robots / og / twitter 全部失效; 而 v2.2 的 description 断言用 document.querySelector, 元素在哪个父节点它不关心, 照样全绿。修复三字符, 并新增 head 结构断言(元素必须真的在 document.head 内), 按「先转红再修复转绿」落地 —— jsdom 内部即 parse5, 负对照免费。
v2.2 撤消费处 || 默认 时把 Math.max 取值域守卫一并删了 —— 前者是真相源问题、后者是校验边界问题, 写法相似位置相邻但性质不同。而 clampByFieldSpec 只在 UI 读取路径调用, 载入越界方案 JSON 长驱直入(实测 co2BlowerEfficiency=0 → NaN 遍布, co2StripperGtoL=1e6 → 成本 109 万元/kg)。修复: ensureStageProc 兑现自己注释里宣称的不变式(对 PROCESS_DEFAULTS 数值键逐一钳制)—— 它是 recomputeAll / rebuildStages 的公共入口, 钳制放这里后「UI 有守卫而加载没有」在结构上写不出来。新增工况 edge_hostile_json(六个越界值), 修复前咬出 Infinity/NaN 于能量 A2/B/C、登记 E1、物质 M4a, 修复后转绿且 13 条数值基线逐位不变。
鱼池是车间内的敞开水面, 气泡上升后在池面破裂 —— 尾气必然进入车间且已被水温饱和; OUTDOOR→OUTDOOR 只对有排风管的脱气塔成立。sink 改 INDOOR, 车间湿平衡产湿侧新增 ṁ_air × (W_sat(T_w) − W_room)。实测罗非养成(28°C/65%): 1,384 m³/h → 336.1 kg/d, 为池面蒸发的 +29%(审计估 335, 手算 337, 三方吻合)。显热恰为零(A3: T_room = T_w); 水侧补水股无重复(接触器 netWater 记水体失水、本项记车间得湿, 两本账各一次)。成本影响: 仅 air 模式的除湿机设计选型 CAPEX(罗非 +0.007 元/kg), 年均电耗不变; 13 条数值基线全部 o2 模式, 逐位不变。进气侧维持室外取气(2026-08-10 设计决策: 进气经风管自室外), 接触器进气温湿度继续用室外值。开放项: air 模式气泡吹脱的 CO₂ 同样入室, 新风需求目前只计脱气塔份额, 二阶项未建模。
默认值同时写在 GLOBAL_THERMAL_DEFAULTS 与 readGlobalThermalConfig 的字面量 fallback 里, degasserExhaustIndoorFrac 已实际漂移(表 0 / fallback 0.2 —— 0 正是 v2.1 为气路 A5 改的值, 副本停在旧值, 输入框缺失即复活旧矛盾)。实测更正: 缺失键为 4 个非审计所报 6 个(三个 U 值在表内, 审计漏了 fcDesignDT_K); 另抓到审计未报的第三处副本 —— 消费点一处 : 0.2 死 fallback(合并链路保证键必在, 永不触发, 但停在旧值待复活)。处置: 补 4 键入表 → 32 处 fallback 一律引表 → 死 fallback 改引表(保留 [0,1] 取值域守卫)→ 两条断言: 键集锁定(配置出现表外键即红)+ 运行时 toString 扫函数源码禁字面量 fallback(首版正则曾漏 3 处对齐多空格行, 是脚本残留自查抓到的 —— 故把这层也固化为断言)。双向负对照精确。
v2.2 注释预想「联网后 curl 原 URL 取哈希」—— 实测该 URL 的 chart.umd.min.js 在 npm 包内不存在, 是 jsDelivr 对缺失 .min.js 的动态压缩产物, 给它钉 SRI 与给 Tailwind Play 钉 SRI 是同类错误的温和版。处置: URL 改指包内真实发布件 chart.umd.js, 哈希链条 = registry 声明 sha512 → 本地 tarball 复算逐位一致(供应链验证)→ 发布件 sha384。integrity 与 crossorigin 成对上线(v2.2 教训)。新增断言: jsdelivr 脚本必须两者成对、Tailwind Play 必须两者皆无(防 v2.2 样式崩掉事故复发), 双向负对照精确。
旧 air 模式风量 = O₂峰值 ÷ (1.2×0.23×SOTE 0.18) —— 0.18 是清水标准态值(20°C、DO=0), 无水深/α β θ/驱动力修正, 实际 OTE 只有它的 1/3–1/2, 风量系统性低估 2–4×; CO₂ 侧风量需求完全缺席, 关塔时只有一个与风量不联动的 fallback 旋钮(海南石斑 20 kg/m³ 关塔实测: 鱼池 CO₂ 55–179 mg/L 超海水阈值 2.5–8 倍, 选型侧毫无反应)。本批实装物理选型: OTE = SOTE(%/m)×水深×αβ×θ^(T−20)×驱动力, CO₂ 侧按 Henry 平衡载量(复用碳酸盐模块 K0_W74 与 ρ 口径, 零副本), 风量取 max(O₂侧, CO₂侧) 并标注控制侧; 关塔稳态 η 由风量反算(η = A·k·逼近/Q), 选型与稳态自此共源。新断言 M8(air+关塔 ⇒ 稳态 CO₂ ≤ 选型目标)按红→绿落地: 旧模型下 144–179 mg/L 转红, 实装后 20.5 mg/L 转绿; DO 饱和(Benson 1984)与 CO₂ 阈值两段内联逻辑抽为共享函数(表达式逐字符不变), 13 条 o2 数值基线逐位未动。新工况 edge_air_no_stripper(石斑/air/关塔), 自检 23 条工况。实施事故记录: 调 K0_W74 时未读函数体先传了 °C(其 Weiss 式入参为 Kelvin), airCO₂ 爆至 1e10 m³/h —— 本会话第六次「猜接口」, 已在调用处留 Kelvin 警示注释。
v2.2 的 patches/ 与 tools/ 目录不可得(无法从原环境下载)。自 v2.3 起直接在 v2.2 交付产物上编辑, 「从 v2.1 全量重建」的可复现性就此封存; 验证工具按 HANDOFF §4 规格重建并显式标注(run_selftest / probe / _edit 编辑纪律库, replace_once 强制唯一命中保留)。编辑纪律不变: 每处替换恰好命中一次、断言先负对照转红、基线变动先预测符号量级。
以下三节发生在 v2.2 发布之后, 不改变 v2.2 的功能范围, 只增加护栏与修正 —— 依次为: 碳酸盐接口一致性与 a11y/CDN、物质平衡断言 M、第三方独立复核处置。v2.2 本体的两批发布内容见下方「v2.2 第二批」与「v2.2 升级说明」。
第三方复核已用 PyCO2SYS 1400 工况验证 carbonate.js 模块本身(淡水 pH 一致到 8.88e-16)。但主模型与它之间隔着一层单位换算,那一层从未验证:TA = 碱度/50043/ρ、CO₂ = 浓度/44010/ρ(mg/L ↔ mol/kg-SW),三个因子任一错,pH 与 Ω 都会偏而无人察觉。
solveAlk(pH*) → solve(TA) 应还原 pH*。240 点网格(S∈{0,15,30,35} × T∈{10…30} × pH*∈{6.5…8} × CO₂∈{3,10,25}),最大 |ΔpH| = 0,零抛错work/carbonate.js 与 index 内联块,20 个函数、63 个平衡常数,归一化后md5 完全相同📌 真正的风险不是「当前是否一致」(是),而是将来会不会漂移 —— 同一份求解器存在两处,没有任何东西阻止有人只改一处。I3 即为此而设。
UI 审计发现 163 个 <label> 中零个有 for,输入框也全部无 id。后果不止屏幕阅读器:点击标签无法聚焦输入框 —— 这是所有人都损失的常规交互,而工艺参数标签只有 10px,点击目标本就很小。现按 f_${idx}_字段名 生成 id 并关联。另 31 个表格中 12 个未包 overflow-x-auto,窄屏撑破布局,已全部包裹(已验证表格无嵌套,配对包裹安全)。
新增自检三条:工艺参数输入框必须有 id、for 不得悬空、表格必须可横向滚动。
📌 实施过程的教训:正则版本改了三轮仍漏 1 处 —— 查明是 Python re 在超长 title 属性上回溯超限后【静默放弃匹配】(不报错,只是不匹配)。改为线性扫描后一次到位。这类「工具自己悄悄少做了事」与 t21 三次扩展全部落空是同一形态,而两次都是断言先报出数目不对才发现的。
两个 CDN 资源性质不同:Tailwind Play CDN 按页面内容动态生成响应体,SRI 哈希无法预先计算 —— 加了必然阻断加载,这是技术限制而非疏忽(要 SRI 须改为构建期产出静态 CSS)。chart.js 是固定版本文件,可以且应该加 SRI。
但本版不填 chart.js 的哈希:当前环境拿不到真实值,而编造哈希会让浏览器拒绝执行脚本、图表直接消失,比没有 SRI 更糟。故只做两件确定的事 —— 两个 script 都加 crossorigin(SRI 前置条件,且让跨域错误可见),并把取真值的一行命令写进代码注释供联网环境补上。
📌 与本项目「判据先负对照证明会红」同源:安全措施也不能靠猜值上线。
此前断言覆盖能量 (A1/A2/A3/B/C)、水量 (F1/F2/F3)、登记 (D/E/G)、资本 (F4) —— 唯独物质平衡一条没有,而它是本工具的物理核心。第三方独立复核给了这个判断一次印证:三条缺陷全部落在无断言区,断言覆盖区一条问题都没有。
实测确认今天全部闭合后立即固化 —— 此刻成本最低:闭合状态是免费拿到的验收基线;等日后有人改了硝化公式再来查,就得先分辨「是新改的破坏了平衡,还是本来就不平衡」。
M5/M7 适用域: 水体 ≥ 1 m³。实测产量 1000 t 时四阶段偏差 0.01–0.03%(方程完全成立),产量 0.001 t 时散乱在 −9.7% ~ +11.2% 且方向不一 —— 散乱而非单向偏置,说明是极小规模下的数值行为(水体仅 2 升级、源水本底与各种钳制浮现),不是方程实现有误。极小产量工况的价值在于测崩溃,不在测稳态精度。
v2.2 首测曾报「TSS 残差 −1.8%,四阶段同号且随规模成比例,未确证为缺陷」。查证结果:模型正确。TSS 单程残留是四条路径,而首测只算了微滤、蛋分、换水三条,漏了 η_bioTSS = 0.2 的生物滤池截留 —— 它是 PROCESS_FIXED 常数而非 proc 字段,按字段名扫描根本看不见。补齐第四路后残差降到 0.02–0.04%。质量侧另有独立证据:代码 6766 行 disch_TSS_kg_d = load.tssDaily,注释「守恒 — 生成 ≈ 排出(不溶不降解,全部最终出系统)」。
📌 这次漏项的形态与前十次不同:前十次错在取值的键名或单位,这次错在漏了一整条物理路径。教训相应更新 —— 核对稳态方程时应以方程本身为准逐项对齐,而不是从导出字段反推路径。建立 M5/M7 过程中另有两次同族错误:exchangeDaily 取值位置错(它是 stage 级字段,不在 proc 里,正是 t23 白名单三项之一)、以及首版适用域用比值而非物理条件。
把过去修过的缺陷形态人为注回代码,断言逐条咬住:
另有 M4b 落地当场咬中 edge_yield_0 / edge_yield_tiny 八条 —— 零产量时补水带入的碱度超过消耗,净需求为负而 alkToAdd 被钳到 0。经核实钳制是正确行为(不可能投负量药剂),故改断言纳入下钳而非改代码。
外部核算这三条口径连续错了三次:液氧误用设备选型口径 o2Demand(含 peakFactor 1.5 与 sAerator 1.10 两个容量系数,报出 −48% 的假不闭合)、碱度消耗误用 tanDaily 而非被硝化的 TAN、碱度回收误用理论值 3.57 而非代码里的工程系数 2.8(注释写明「理论 3.57,工程实测 2.5–3.0 取中位」)。加上此前物质平衡首测的三连错,同族「猜口径」已达十次。
📌 这正是要把核算放进产品路径的理由:断言从 load / sim / eq 的真实导出面取值,不会像外部工具那样猜错口径。「人工核对过所以没问题」不可信 —— 十次实证。
一份独立复核报告 (jsdom 走真实产品路径 + PyCO2SYS 1.8.3.4 / USGS·APHA 溶解氧表 / ASHRAE·IAPWS 湿空气数据 / 第一性原理手算) 提出三条模型误差。三条全部落在本版自述的断言盲区 (氧侧 / 碳侧 / 水汽侧) —— 该判断准确, 也正是 F 节所说「今天闭合是因为公式恰好写对, 不是因为有东西防止它写错」的直接印证。逐条实测核实后: 一条采纳、一条部分采纳、一条驳回。
co2DailyAvg = o2FishDailyAvg × 1.375 只算呼吸, 缺硝化项, 实测少算 34.5%–43.4%。而同文件的设计口径 co2Daily 是对的 —— v1.9 memo F2 修过同一个 bug「v1.7 之前只算呼吸, 漏算硝化产 CO₂, 导致脱气塔规格偏小 30-50%」, 设计口径已修而日均口径未跟上。这是「同一公式两处实现」的又一实例, 与本版反复处理的「分散重复声明」同族。
全库 0 消费点, 属死字段 ⇒ 删除而非修正。复核报告引用本版删 sourceTemp 时确立的原则「给死控件加钳制等于承认它还活着」来主张删除, 该引用恰当。其风险论证也成立: 带错误公式的死字段比空字段更危险 —— 谁把它接进年度碳核算, 会静默低估三四成且不触发任何现有断言。
复核指出 0°C 以下应使用冰面式, 数值全部属实 (−3.5°C 高 3.50% / −10°C 高 10.44% / −20°C 高 21.97%), 原注释「±0.4% in [−20,60]°C」的下界确实不成立。
但结论需改: 本项目继续用水面式, 且这是自洽的。本项目 RH 数据源标注为「WMO/Climate.gov 30 年均值」, 而 WMO 对 0°C 以下的相对湿度以水面 (过冷水) 饱和压定义, 是气象观测通行口径。humidityRatio(T, RH) 用同一相态把 RH 还原为分压, 前后一致 ⇒ 含湿量正确。改用冰面式而 RH 仍是水面口径, 反会使含湿量系统性偏低 —— 相态必须与数据定义口径一致。故只订正注释适用区间为 [0, 60]°C, 并在函数头写明相态选择依据, 避免下一位读者重复得出「用错相」的结论。
复核建议「改用 Benson & Krause (1984)」—— 而代码用的就是该式本身。逐点比对: S ∈ {0, 30} × T ∈ {10,15,20,25,28,30} 共 12 点, iRAS 与 B-K 标准式偏差全部为 0.0000% (盐度项写法 +S·(−a+b/T−c/T²) 与 −S·(a−b/T+c/T²) 代数等价)。
报告「参考值」反解出的盐度为 ≈35.5‰ (15°C 参考 8.11 → 35.5‰; 20°C 参考 7.38 → 35.4‰; 25°C 参考 6.75 → 35.6‰), 而它对比的是 iRAS 在 S=30 的计算值。拿 S=35 的表值比 S=30 的计算值, 差的 3.3% 正是盐度效应本身, 不是公式误差 —— 报告自己也写着「工况盐度 28-30‰」。「四个测点全部同号」确为系统性偏置, 但偏的是盐度输入。另有一处内部佐证: 报告 28°C 行「iRAS 6.410 / 参考 6.41」数值相同却标 +3.33%, 那个 6.410 实为 T=30 的值, 表格行错位。
📌 此条与第六轮审计的 NH₃/Ω 误报属同一类: 基准取值与被测对象的工况参数不一致。复核方法本身 (jsdom 走真实路径 + 外部权威基准) 是正确的, 出问题的是基准侧的参数对齐 —— 这与本版自己七次「猜接口」错误同源: 从外部取值时必须先确认口径。
towerFlowM3h 零值噪声: 复核实测加载时触发 8 次告警, 已自查为误报 (全部来自 edge_yield_0 / edge_yield_tiny, flowM3h = 0)。已加零值短路 —— 噪声会淹没这条告警要抓的真回归, 消除噪声本身就是在保护告警。自检项数陈述: 第一批章节的「17 → 20 项」是当时的准确记录, 第二批新增 field_spec_consistency 后总数为 21, 已加衔接说明。
复核报告的「复核通过项」值得一并记录: 化学计量 8 项对第一性原理手算全部吻合; 碳酸盐体系对 PyCO2SYS 1400 工况, 淡水 pH 一致到机器精度 8.88e-16、海水最大偏差 1.78e-05; 能量守恒 B 断言残差 0.000e+0。这些是本版断言已覆盖的区域, 复核未发现问题 —— 与「三条缺陷全在盲区」互为印证。
v2.2 分两批发布 (同版分批, 沿用 v2.1 先例)。
源于本版的首次 UI 专项审计。与第一批的登记表工作是同一个模式在 UI 侧的实例: 分散的重复声明必然漂移。自检 20 → 21 项, 13 条数值基线逐位不变 (纯重构)。
完整危害链 (已在真实事件路径复现): 用户填 0 → 模型收 0 → 任何触发重渲染的动作后输入框显示默认值 (模板 ${p.X || 默认} 把 0 当 falsy) → 再改任何别的字段, readStageProcFromInputs 全量读回时那个假显示值覆盖 proc, 用户的设置无声消失。这与 v1.9.2「对外发布数字与产品路径脱节」同族, 只是发生在 UI 层。
⚠ 关键教训: 陷阱在三层 (渲染 31 处 / 读取 / 消费 71 处), 只修一层反而更糟 —— 实测只修渲染侧会造成「界面诚实显示 0、模型仍用默认值」, 比原状态危害更大 (原状态至少界面与模型口径一致)。三层必须同批落地, 本批即如此。
同一字段的取值约定此前散布在四处: 默认值表、渲染模板的 min/max/step 与 || 默认值、读取侧的 getNumClamped、消费侧的 || 默认值。实测已漂移四条 —— co2StripperEff 在三处是三个不同的值 (65 / 65 / 75); co2StripperGtoL 的事实源在 v2.0 由 3 改为 5, 另两份副本停在 3; co2PackingHeight_m 同理 (1.5 vs 1.0); climateRegion 事实源 china_qingdao 而消费侧 custom。这些副本平时是永不触发的死代码 (默认表已填好值), 所以漂移了也无人发现 —— 直到用户填 0 让它们复活。
FIELD_SPEC 只管范围 (min/max/step/clamp), 默认值仍归 PROCESS_DEFAULTS, 由断言 H 保证两表对齐 —— 而不是再复制一份 (那会制造第五处声明)。三个消费方 (渲染 / 读取 / 断言) 从同一张表取值。clamp 取UI 范围与原代码钳制的并集: 这条规则是机械的, 不含逐字段工程判断, 且不收紧任何现有能力 ⇒ 无回归风险。
type=number 的 min/max 不阻止键盘输入)FIELD_SPEC.clamp 执行co2BlowerEfficiency 一处 max=90 一处 85 等, 用户在 A 面板能填的值到 B 面板填不进去。三处渲染同一张表后自动消失新增自检项 field_spec_consistency: H1 每个带范围的输入框 (含全部渲染实例) 的 min/max/step 必须与表逐位相等; H2 clamp ⊇ [min,max] (UI 能填的模型必须接受); H3 表内字段必须在 PROCESS_DEFAULTS 有默认值且落在 clamp 内。落地时精确抓出三处渲染矛盾, 负对照 (改回硬编码) 转红。
第一版 FIELD_SPEC 只收了原本带 min/max 属性的 34 个字段, 另有 22 个字段完全无钳制 —— 实测 mainPumpEta=0 使主泵报 1383.6 kW (成本 +6.6 元/kg)、VTR20=0 使成本 +12.0 元/kg, 全部有限无 NaN: 危害是「看起来正常的错误数字」, 会原样进可研报告。现已全部接入 —— 依据取自各字段自己的 title 提示 (22 条无一缺失地写明了工程范围, 只是从未落到属性上)。
本批 min/max 取 tooltip 的工程范围 (spinner 边界与用户指引), clamp 取更宽的物理边界 —— 与第一批规则不同, 因两批字段性质不同: 第一批多是效率/比例类硬边界, 本批多是「典型值区间」, 若当硬边界会挡掉合法探索 (大型轴流泵 η 可达 90 而 tooltip 写 60-85)。
并集规则的缺陷与修正: 第一批的 clamp = UI 范围 ∪ getNumClamped 漏了第三个来源 —— 消费处的 Math.max(x, 下限) 隐式约束。它与前两者性质不同: 前两者是允许区间 (取并集=不收紧能力), 后者是物理硬保护 (必须遵守而非并入)。后果: co2BlowerEfficiency 的 clamp 是 [0,100] 而消费处写着 Math.max(η/100, 0.3) —— 用户填 0 时 proc 存 0、界面显示 0、模型实际用 30%。现规则修正为 clamp_lo = max(消费处硬下限, 原下限), 并撤除全部 8 处隐式兜底。
⚠ 该缺陷是判据扩展后才发现的: t22 检查的三个量全在 proc 层, 看不见消费处, 故它一直报「保真 ✅」—— 这是第二次实证「一条判据绿了不等于该层被覆盖」。t23 现已扩展为同时禁止 || 默认 与已登记字段的 Math.max(x, 下限) 两种同族写法。
另删除死控件 sourceTemp: 双证据确认 —— 静态全库无消费点、动态填 -99 结果逐位不变。源水温自 v1.2 起归全局气候 (T_source_annual 等)。给死控件加钳制等于承认它还活着, 故删而不修, 与第一批删 skipClimate 同一原则。
发布前对四条基本物质平衡做了产品路径实测 (三文鱼 1000 t): 氮 (TAN) 残差 0.08% · 硝酸盐 0.00 · CO₂ 0.13% (即换水那份) · TSS −1.8%。前三条闭合, 说明稳态方程是自洽解出的; TSS 的 −1.8% 四阶段同号且随规模成比例, 但未确证为模型缺陷 (更可能是核算漏了排污股)。
⚠ 需明确记录: 现有断言覆盖能量 (A1/A2/A3/B/C)、水量 (F1/F2/F3)、登记 (D/E/G)、资本 (F4), 没有一条物质平衡断言 —— 今天闭合是因为公式恰好写对, 不是因为有东西防止它写错。氧平衡、碱度平衡、碳酸盐体系 (carbonate.js 与主模型的交叉一致性) 三项连「今天是否闭合」都未测过, 已列为下一版首要工作。
📌 该实测过程本身产出一条教训: 外部核算连续三次出错 (co2Eff 单位误除 100 倍、猜错反硝化字段名、NO₃ 以 N 计却做了 62/14 换算), 每次都差点报出巨额假不闭合。「人工核对过所以没问题」不可信, 只有跑在产品路径上的内建断言可信 —— 这正是应当把这四条平衡固化为断言的理由。
⚠ 判据盲区实录: t22 (显示保真) 检查的三个量全在 proc 层, 而消费侧的 || 不影响 proc —— t22 结构上覆盖不了第三层, 负对照实测它对恢复消费侧兜底毫无反应。故另补静态判据 t23 禁止 proc.X || 默认 复发。一条判据绿了不等于该层被覆盖。
本版源于第三方第六轮审计。审计的核心判断本版照单全收: 断言的质量已超过工况的覆盖面 —— 本轮两条真缺陷现有断言本可抓到, 只是 13 条数值工况全部「mainline + 脱气开 + 纯氧」, 断言从没机会跑到那条路径。自检 17 → 20 项 (新增三条配置边界工况), 13 条数值基线重算 (|Δ| ≤ 0.02 元/kg)。〔第二批另加 field_spec_consistency, 本版最终为 21 项〕
※ v2.1 变更日志曾写「本批并入 v2.1, 不另开 v2.2」—— 指的是当时那批补丁不单独成版, 与本版无冲突。
只跑不变量断言、不比数值。落地顺序刻意为先加工况 (转红) 再修缺陷 (转绿) —— 红→绿转换本身就是工况有效性的负对照。实测 edge_no_degasser 一个开关同时触发 F4 与 A3 两条断言 (审计称其为「目前最有信息量的未覆盖工况」), edge_bypass 精确复现 capexVia 假阳性 (92.2 kW 与审计逐位一致)。
CAPEX 嵌套: 蛋分风机条目嵌在脱气塔 if 两层内 —— 两套互不相干的设备, 脱气关闭时蛋分照常运行照常计费, 投资却随脱气塔消失。这是 F4 目标模式的第四次出现, 且出现在修复它的同一次提交里。现提出与各独立设备并列。
ΔT/mdot 密度不闭合: 风机温升 ΔT 按冷密度算、焓流按热密度算, 注入热 = 轴功 × (mdot/mdot₀), 丢失的那份默认工况仅 1.2% (藏在 A3 的 0.15 K 容差内), 脱气关闭时风量骤小、ΔT≈30 K, 丢 10.1%。现解联立方程做不动点迭代至 mdot·cp·ΔT ≡ Pshaft (6 次内收敛到 10⁻⁴ K)。
旧口径 ΣkW × 0.57 与各风机自身效率参数脱节 —— 用户把 co2BlowerEfficiency 从 30 调到 90, 电耗 174→95 kW, 模型轴功却恒按 0.57 折, 方向反直觉 (效率越高, 模型认为进气流的热越少)。物理上 kWi×ηi = Q·Δp (气侧有用功), 与 η 无关, η 只该影响电机损失分成 —— 逐台加权自动恢复该性质, η 与各功率公式严格同源。
空气曝气模式的鱼池增氧鼓风机此前「计费有、CAPEX 有、热去向无、气路登记无」—— 与 v2.0 的 Q_air_gain、v2.1 的蛋分气流、第五轮的风机轴功完全同族, 这是第四次。它鼓的气直接打进鱼池水体, 比脱气塔更无疑问地接触水。现补 airFlowM3h + airPath (OUTDOOR→OUTDOOR, 与 A5 一致)、进登记表、并入轴功加权。逃逸机制值得单独记一笔: 32.3 kW 藏在混合数值与格式化字符串的展示对象里, 所有「数值字段 + 命名规则」的扫描器集体失明。
封住 D 项那一类逃逸路径: 对每个 /Spec$/ 普通对象再扫一层, 数值且形如功率的字段, 其点路径必须出现在某登记项的 path 或 aliasPaths (同一设备的已知副本路径, 如 skimmerBlowerSpec.power = 顶层标量的同值副本 —— 声明而非豁免)。⚠ 这是治标; 治本是 registerDevice 工厂化 (登记成为设备定义入口而非事后清点, 「漏登记」变成写不出来的代码), 已立项 v2.3。
旧正则两个方向都错: /曝气|风机|鼓风/ 命中 4 条, 删掉真目标断言仍绿 (假阴性); bypass 下旁路泵计入「支路泵合计」无独立条目, 零命中导致 F4 四阶段误报。CAPEX 条目名全是字符串字面量, 正则无必要 —— 改精确名称数组, 五台支路泵显式声明共享聚合条目 (capexShared)。精确化随即曝光一条被误命中掩盖了四个版本的存量不一致: BF/脱气塔风机的 CAPEX 选型门槛是 0.5 kW (小于此并入 MBBR 曝气配件价), F4 却统一按 0.05 —— 鳗/虾苗种期 0.4 kW 恰落中间。门槛现显式化为登记表的 capexMinKw, 与 CAPEX 侧同源。
v2.1 HANDOFF 原话:「billedVia 可以指向一个不存在的成本字段而断言不会发现」。断言 G1 (billedVia 必须真实存在于 cost 导出、设备活跃时非零) 落地当天抓到 5 条活体 —— 声明写的全是内部变量名 (*CostDaily), cost 导出面是 *CostMax/*CostAvg。认识论上与第六轮审计连错两轮的 dehumCostDaily 是同一个坑: 靠字段名猜接口, 而不是以导出面为准。G2 校验非共享 capexVia 名称不被两条登记项重复认领 (防双计)。三条负对照 (拼错字段 / 指向零值 / 重复认领) 全部精确转红。
skipClimate: 全库零调用点 (restoreState 直接恢复 stagesState、不经 loadStagesFromDB) —— 为不存在的调用方准备的开关只会在将来被忘传时静默伤人, 已删。渲染解耦: 渲染函数抛错此前被计算 catch 吞掉, 报「阶段 N 计算异常」且销毁本已算好的结果 —— 渲染故障伪装成计算故障。现独立捕获, 计算结果保留, 错误明确标注「渲染异常, 计算结果有效」。负对照双向实测: 修复前人为渲染故障使 13 条数值全灭为 0, 修复后零影响。
13 条基线 |Δ| ≤ 0.02 元/kg, 符号随工况方向翻转 (制热 ↓ 青岛冬 −0.02 / Bergen −0.02, 制冷 ↑ 海南·三亚 +0.01) —— 与 v2.1 两轮同款的正确性旁证。另驳回审计三条: NH₃ 阈值「六轮未动」与 Ω 告警「六轮未动」均为第四轮已驳回误报的复发 (v1.9.3 起分别按鱼种三档着色、两级徽章告警, 本版实测在位); 「接触器进气节点不可选」为记录在案的设计决策而非漏项。
本版源于第三方第四轮审计。核心是修复 v2.0 架构重构时留下的能量守恒破口, 并补齐审计建议了三轮、唯一没落地的守恒类断言。13 条数值基线全部重算, 自检 17 → 17 项(新增三条守恒断言并入既有不变量)。
v1.x 的能量分配是自洽的: 泵/UV 电功率拆两份, 一份进水 (Q_pumps), 一份进车间空气 (Q_air_gain_kW), 相加恰为电功率。进空气那份在旧模型里进入空气节点能量方程。
v2.0 删除空气节点时, 挂在该节点上的产热项没有被重新安置。Q_air_gain_kW 仍在计算、仍在返回, 但不再进入任何一侧平衡 —— 既不在水侧, 也不在暖通侧。这部分能量从模型里凭空消失。
同因还有第二处 (本轮自查发现, 审计未列): dehumHeatDest === 'indoor' 时的除湿机冷凝热。第 5461 行注释写着「排入车间的部分已在 T_room 迭代中计入」—— 而那个迭代在 v2.0 已被删除, 注释与 UI 提示都停留在旧模型。
实测规模 (三文鱼 1000 t 青岛设计冬): 丢失 1,617 kWh/d, 达 HVAC 显热负荷 3,864 的 41.8%。模型一边说要给车间供暖, 一边把电机与灯管废热倒进同一个车间却不入账。
修法: Q_hvac_sens = Q_envelope + Q_vent_sens − Q_room_internal, 其中室内产热 = 设备废热 + 除湿冷凝热(入室时)。符号由 Q_hvac_sens 自身携带, 不需分支。
✅ 修复后成本变化的符号随工况方向翻转, 这是正确性的旁证: 制热工况下降 (青岛冬 −0.22, Bergen −0.15 元/kg, 废热减轻供暖), 制冷工况上升 (海南冬 +0.11, 青岛年均 +0.06, 废热加重制冷)。若为单向偏移, 反而说明修错了方向。
A 项那类缺陷现有三类断言全都抓不到: golden-master 抓不到 (基线跟着一起变)、有限性断言抓不到 (数值完全正常)、口径一致断言也抓不到 (不涉及同一量的两处换算)。只有守恒断言能抓。而同一版里出现两处同样成因的孤儿项, 说明这不是偶发失误, 是架构改动时缺少守恒护栏的系统性风险。
现已并入 ?selftest=1 的逐阶段不变量 (亦有外部脚本 t20_energy_closure.js 同源可挂 CI), 三条:
Q_pumps + Q_uv + Q_air_gain×24 = 泵电功率 + UV电功率。电功率 100% 终归变成热, 只有进水/进空气两个去处, 不得有第三个hvacSensible = Q_envelope + Q_vent_sens − Q_room_internal修复前实测: 断言 A、C 通过, 断言 B 在 56 个「工况×阶段」组合中 48 项失配, 残差与 Q_air_gain×24 逐位相等 —— 诊断被精确坐实。⚠ 新增任何进/出车间或水侧的热流时, 必须同步这三条式子, 那正是目的。
v2.0 新增 fcUnavailReason 时的单行编辑失误, 把同行的 freeCoolingSinkT: _fcSink, 并进了行尾注释 —— 该字段自 v2.0 起不再导出, UI 第四档分支因而永不触发。v1.9.3 加这一档的动机是「用户拨动开关看不到任何回应, 无法区分『因不可用而无效』和『坏了』」, 修好一版之后又回归了。而本该替代它的 fcUnavailReason 做好了却全代码库无消费点。
本轮另发现第三层: 整个状态段包在 pumpDirection === 'cool' 里, 而 v2.0 最常见的原因恰是 not_cool (接触器把热排光, 水侧转制热) —— 即便前两层都修好, 最该解释的情形仍然不说话。
现改为读 fcUnavailReason 枚举 (四档 + 显式 default), 并把 not_cool 提到方向判断之外。缺字段会落到显式分支而非静默跳过 —— 这类「注释吞代码」用眼睛复查很难发现, 改成枚举后才有护栏。
totalMax 补 hvacCostDaily —— 此前只有 totalAvg 含它, 而 totalMax 是面向用户的「小计·工艺运行成本」并导出下游。同为暖通电耗, 除湿计入而显热不计, 无理由 (青岛冬 1,166 元/d, 约 0.97%)dehumEnabled 开关对成本完全无效却仍 gate 显示 —— v2.0 把除湿改为无条件的暖通职责后, 用户设「不配置」照付 2,989 kWh/d (海南夏) 却看不到卡片。实测开/关成本一字不差。现改为按是否真有除湿负荷显示degasserExhaustIndoorFrac 默认 0.2 → 0 —— 与气路拓扑 A5「工艺气路全程不碰车间」对齐。同一股尾气此前算热时 0%、算 CO₂ 时 20% 进车间; v2.0 把暖通显热计入能耗后该矛盾首次影响成本co2StripperGtoL 引擎侧钳到 [1, 30] —— 旧式只有下界。UI 有 min/max 但可被载入方案 JSON 绕过, 填 1e6 得接触器排热 4.1×10⁹ kWh/d (有限但荒谬)v2.0 修正了自检基线的鱼种-气候配对, 但 UI 默认仍是青岛且切鱼种不联动 —— 用户点「罗非鱼」拿到的就是被修掉的那个组合 (28°C 的鱼在 −7°C 过冬)。测试修好了, 产品还在发同一个陷阱。
新增 DEFAULT_CLIMATE_BY_SPECIES (与 SEED_PRICE_BY_SPECIES 同样板), 切鱼种时联动。实测比电耗: 罗非 16.21 → 13.48, 对虾 36.85 → 18.84, 鳜鱼 28.56 → 22.95。仅改默认起点, 用户仍可自由切换。
⚠ 剩余差距来自产品默认工况是设计冬而基线用年均 —— 定容工况与运行工况的正当区别, 不是配对问题。
审计报「HVAC 潜热算出来但未计费, 海南夏 +0.42 元/kg」—— 经复算不成立。v2.0 已把 m_dehum_kgs 改为无条件计算的暖通除湿职责, dehumCostDaily 已进 totalMax/totalAvg; 海南夏模型实算潜热 5,117 kWh/d → 除湿电 2,989 kWh/d, 按 SMER 2.5 折算已计费。真正的问题是反向的 (见 D 项第二条: 开关无效却 gate 显示)。
在审计「仍然开放」表逐条实测复核后补上, 均为纯增项。
regimeMarginPct —— 审计指出默认工况正坐在制度切换边界上 (单项 +0.24~0.36 而合计 +2.49, 严重非线性)。而 v2.1 的守恒修复恰好移动了这个边界 (青岛冬 hvacSens 3,355 → 769), 边界挪了提示更该有。实测 G:L=3 时余量仅 3.9%, 默认阶段 1 仅 0.5%。余量 < 15% 时在阶段卡片提示加蛋分风机时连犯三个同类错误, 现有断言一个都没抓到:
totalPumpKw (废热错误地按 pumpHeatRatio 进水) —— 守恒断言 A 等式两边同步放大, 残差为零elecCostAvgDaily —— 比电耗单向低估, 该口径是手工枚举、无断言airPath —— 508 m³/h 的接触水气流不进接触器热湿交换; 风量平衡断言只校验已登记项之间是否自洽第三条与 v2.0 的 Q_air_gain 孤儿项完全同类。结论:
守恒/平衡断言只能约束已进入体系的量, 无法发现压根没进体系的量。要抓后者, 必须从设备侧反向枚举。
新增 POWER_REGISTRY 登记表与两条断言 (并入逐阶段不变量):
airFlowM3h > 0 的 spec, 必须 (a) airPath 三字段齐全 (b) 出现在 collectAirStreams() 输出中 (c) spec.power 与同名标量一致/Kw$|Power$/ 且 > 0 的字段必须在 POWER_REGISTRY 声明计费去向; 且 totalPumpKw 必须等于其声明成员之和四条负对照全部精确转红 (用上面三个真实犯过的错 + 缺 airPath 构造)。其中「风机并进 totalPumpKw」正是 t20 守恒断言抓不到而登记断言 E 抓住的那条。⚠ 新增任何风机/泵/用电设备时必须同步 POWER_REGISTRY —— 那正是目的。
⚠ 本断言仍有一层盲区: 登记表本身可以声明错 (如 billedVia 指向不存在的成本字段)。堵它需校验该字段真实存在且非零 —— 未做。
v2.0 把接触器的热计入了水侧平衡, 但水的质量一直没进 V_makeup。本版补上, 并顺带修掉一处已存在但从未显形的盐度错误。
V_total × exchangeDaily, 注释写着「质量守恒」而蒸发不在其中。与 v2.0.1 修的 totalKw_field 同族: 同一物理量的两个方向只守一边蒸发走掉的是纯水, 就补等量淡水, 独立成股, 不动换水份额:
体积平衡与盐平衡各自闭合, 盐度因此恒等守恒 —— 不需要盐度状态变量, 不需要「补水盐度」参数, 不需要补盐 OPEX。工程上这也是实际做法: 海水 RAS 的蒸发补水本就走独立的淡水补给管路。实测换水股与排水量逐阶段完全相等。
| 工况 | 换水股 | 淡水股 | 余纯水 | 净水汽 | 稳态盐度 |
| 青岛设计冬 | 461.2 | +29.6 | 0 | +29.6 | 30‰ |
| 青岛年均 | 461.2 | +11.7 | 0 | +12.5 | 30‰ |
| 海南设计夏 | 461.2 | 0 | 41.4 | −34.9 | 27.2‰ (−2.83) |
| 对虾三亚 | 126.8 | +4.6 | 0 | +5.7 | 15‰ |
⚠ HANDOFF v2.0.0 记的「584.6 kg/h, 占补水 6.0%, 单向系统性偏差」三点都不准确: 实测范围 −10.8% ~ +10.7%, 双向。湿热气候下净结露, 模型反而高估补水需求。字段因此命名 netWater 而非 evap —— 「热带养冷水鱼」正是 v2.0 新增的能力, 净结露是常态而非边角情形。
净结露时没有「补负淡水」这回事: 纯水先抵扣蒸发股, 抵到零仍有余量的转为排水, 并按现有假设推出稳态盐度 S × V_exch / (V_exch + V_surplus)。这不是新建模, 是把模型现有假设的推论说出来。
mdot / W_in / W_out 独立重推净水汽量并比对。若有人把它改成独立的经验蒸发系数, 立刻转红 —— 这是本方案的核心护栏⚠ F3 初版写成「潜热占比须在 [50%, 105%]」, 用 Karimi 2020 的 91% 做区间 —— 判据错了。那 91% 是近等温工况(出口气温与进水温差 0.77°C) 的实测值; 青岛冬进气 −7°C、水温 12°C 时显热 19.1 kJ/kg、潜热 18.0, 占比 48.5% 是物理正确的, 却被区间判红。用文献单点值当断言区间, 必须先确认该值的适用工况。
模型对泵与 UV 做了完整的电-热分配 (进水 Q_pumps + 进空气 Q_air_gain = 电功率), 但三台风机 (脱气 53.6 + BF 42.4 + 蛋分 11.7 = 107.7 kW) 的电功率既不在这个分配里, 也不在任何其它热流里。代码注释写了「不走 pumpHeatRatio 进水」—— 这是对的, 但它也没走别的任何地方。
后果: 风机轴功全部变成气流温升, 而这三台吹的正是接触水的那三股气流, 接触器却用原始室外温度。方向与 v2.0 的 Q_air_gain 完全一致 —— 模型付电费让风机运转, 却让这些电产生的热凭空消失, 然后再付一次热泵的钱把水加热回来。
修法: 轴功 (η=0.57) 抬高接触器进气温度 (青岛设计冬 −7 → −3.5°C, 升温 3.3–3.5 K), 电机损失并入 Q_room_internal。⚠ 加热是等湿过程, 绝对含湿量不变, 只有温度抬高。
✅ 成本变化符号随工况方向翻转 —— 制冷工况上升 (海南夏 +0.42 / 三亚 +0.41), 制热工况下降 (Bergen −0.23 / 鳜鱼 −0.36)。与 v2.1 守恒修复时一致, 单向偏移反而说明修错方向。
审计指出同一缺陷已在三个抽象层各出现一次: Q_air_gain (v2.0) → 蛋分气流漏登记 (v2.1 自查) → 风机热无去处 (本轮)。成因是计费去向、热去向、资本去向分散在三处不同机制里, 每处覆盖边界都是手工划的。
POWER_REGISTRY 每条现声明四项: path (支持嵌套) / billedVia / heatVia / capexVia。断言改为从登记表反向枚举 —— 旧断言 E 用 Object.keys(eq) 正向扫描 + 命名规则, 实测漏掉 co2StripperSpec.blowerKw (53.6 kW) 与 bfBlowerSpec.power (42.4 kW)。审计原话:
「为『漏了蛋分风机』而建的断言, 覆盖了蛋分风机, 却覆盖不了另外两台大 4–5 倍的风机。」
新增断言: A2 (全量电-热分配, 由登记表枚举 heatVia) 与 F4 (登记设备必须有 CAPEX 条目)。F4 落地后立刻抓到蛋分风机「有电费无投资」 —— 这是同一模式的第三次 (v1.9.3 加药计量泵 / v2.1 车间暖通机组 / 本项), 前两次只写了注释总结、没变成断言。
⚠ 实现过程中 A2 连报两次「已接入 0.00 kW」, 两次都是真错 (哨兵串被后续补丁注释污染导致静默跳过; const 块作用域导致变量在 return 处不可见)。若没有 A2, 第二个错会完全静默 —— 数值正常、无 NaN、守恒 B/C 照常通过, 风机热又一次凭空消失。
审计报「温水鱼种 × 青岛未修」—— 结论不成立 (字段真名是 DEFAULT_CLIMATE_BY_SPECIES, 点击鱼种实测罗非 13.83 / 对虾 19.27), 但他们给的数字恰好是没有联动时的值。查因: 联动只挂在鱼种按钮的 click 处理器里, loadStagesFromDB() 不调用 —— 载入方案 / 下游导入 / 测试脚手架全部绕过。审计撞到了真洞, 只是归因错了。
已移入 loadStagesFromDB()(所有切鱼种路径的必经之处),并加 skipClimate 开关 —— 载入用户保存的方案时不覆盖用户当初的显式选择。〔v2.2 订正: 该开关全库零调用点 —— restoreState 直接恢复 stagesState、不经 loadStagesFromDB, 开关从未被使用, 已于 v2.2 删除 (第六轮审计 P3)〕
📌 意外收获: 对虾基线 −3.58 元/kg (热泵费 2.77 → 1.90)。原因是基线只覆盖年均字段, 而设备选型用设计冬/夏 —— 三亚年均运行的对虾场一直按青岛设计冬选热泵。属选型工况与运行工况长期不一致的修正, 不是回归。
「HVAC 潜热未计费」不成立 (第二次报同一条)。实测海南夏潜热 4,473 → 除湿电 2,613 kWh/d / 1,829 元/d。hvacLatentKWhPerDay 与 dehumKWhPerDay 是同一个 m_dehum 的两种表达, 再计一次就是重复。
「买了 92 万除湿机一天不开」表述有误。CAPEX 按设计夏峰值选型是正常工程做法 (夏季峰值选型、冬季不运行), 默认视图是设计冬所以显示 0 电费。经产品方确认, 除湿按独立机组处理: 潜热由独立除湿机承担、AHU 只管显热, 二者不重复。
modulePerSpec 规格后, 三台风机的备用政策终于一致 (co2Blower / bfBlower / skimmerBlower 均 1+1)。与 v1.9.3 给脱气塔风机补规格时完全同一处境, 当时的原注释即适用:「此前没有模块化规格, 因而设备清单不显示备用、CAPEX 也不计备用。」<meta description> 自基线自动生成。⚠ 补丁顺序教训: 「meta 自基线生成」是构建期动作, 正确位置是链尾。第一次修复给了编号 48, 结果新增基线补丁 51 又排到它后面, 同一问题立刻重现 —— 现改为 99, 让「链尾」由编号本身保证, 而不是每次靠人记得。
isBlower 标志, 供下游区分泵与风机符号审计报「三处对外基线未跟上重算」—— 仅一处成立。<meta description> 确是当前对外事实, 已更新; 另两处 (行 1544「G. v1.9.2 成本基线」/ 行 1576「I. mainline vs bypass」) 都在 help-changelog-v192 章节内, 是 v1.9.2 变更日志的历史记录, 改它们等同于污染版本演进记录 —— 正是 v2.0.0 版本号全局替换踩过的坑。「常年需要制冷」那句按同一原则处理: 加 v2.0 订正批注, 不改原句。
补丁版。不改动任何计算模型 —— 13 条数值基线逐位不变, 与 v2.0.0 完全相同。全部改动是修两处缺陷、消一处口径分裂, 并把「发版后人工核对版本号」固化成自检项。自检 16 → 17 项。
totalKw_field 产出 NaN微滤机 RDF 是流量定额设备 (走 configureFlow(), 按 m³/h 选型), 不返回 installedKw。而全场聚合循环对每个设备一律计算 ms.installedKw × numModules, 得 NaN。同一对象字面量的下一行 totalFlow_field 有守卫, 本行没有 —— 不对称守卫。
影响面已实测边界: 16 个自检工况 × 全部阶段只有这一条非有限路径, 且 NaN 经 JSON.stringify 静默变成 null, 下游四页面均未消费该字段 —— 因此线上无可见故障, 属潜伏缺陷。修法与下一行同口径: 算不出就明确给 null, 不给 NaN。
v1.5 Bug 47 把 FAR 开放为参数时初值取 GB 50187 工业下限 0.7;「审计回合 7」认定水产按农业 / 乡镇企业用地分类, 改回实测主流 0.5, 并改了 UI 输入框与两处计算 fallback —— 但漏了三处:
collectState().farRatio 的 fallback 仍是 0.7 —— 唯一有实际后果的一处: 当输入框不可解析时, 存盘记 0.7 而导出用 0.5; 再次载入方案会把输入框刷成 0.7, 总占地静默缩小 29% (0.5/0.7), 无任何提示renderFarmSummary 上方注释仍写「默认 0.7」三处全部归一到 0.5, 与输入框 value="0.5" 同源。
页脚与「版本信息」面板此前是硬编码字面量, 不读 IRAS_META, 每次发版靠人记得手改。而本页 v2.0.0 出现 9 次, 只有 5 处指向当前版本, 其余是版本演进记录 —— v2.0.0 首版补丁全局替换过一次, 把历史叙述一并污染。靠人在 9 处里挑对 5 处, 每版重来。
现改为运行时从 IRAS_META 注入 (单一事实源); HTML 字面量保留为 no-JS / SEO 回退。新增自检项 meta_version_consistency 锁定四条: <title> / og:title / twitter:title 三处 SEO 静态串含当前版本号, 页脚与面板注入结果与 IRAS_META 一致。该断言已用负对照验证会失败 (改一处 SEO 串 / 删一个注入锚点, 均精确转红), 不是恒真判据。
⚠ 本版未触碰 HANDOFF §5 列出的 v2.1 候选项 (接触器蒸发进水量平衡、凝结水盐度、MBBR 流化下限、蛋分供气动力等) —— 那些都要动模型, 不属补丁版范围。
本版是自 v1.2 引入双节点热平衡以来最大的一次模型改动: 车间温度由「自由漂浮的因变量」改为「暖通维持 = 水温」的输入, 并首次把气液接触器 (CO₂ 脱气塔 + MBBR 曝气) 的热湿交换计入水侧热平衡。热平衡代码净减少 65 行。全部 13 条数值基线重算, 自检 14 → 16 项。
v1.2–v1.9.3 把 T_room 作为空气节点能量方程的解, 自由漂浮、无任何调节系统。后果: 热带鱼种算出车间 9–14°C / RH 99%, 而实测与规范一致指向「空气 ≥ 水温」——
摩洛哥 Amghass 站实测车间均值 16.0°C (鳟鱼水温 12–16); 大连河豚车间实测 22–23°C (水温 17); ASHRAE HVAC Applications Ch.6 与 CJJ 122 均要求空气比水温高 1–2°C、RH 50–70%。方向反了 15–20 K。
v2.0 改为 T_room = T_水温 (暖通维持), RH_set 默认 65% 可调。由此删除: Picard 迭代、闭式解、T_room 钳位与「钳位时静默丢弃能量」缺陷。池面显热 Q_pool_loss ≡ 0 (温差为零), 围护 / 通风 / 太阳辐射 / 池壁传导移出水侧, 归暖通并标注界外。
✅ 由此消失的长期争议: 水面传热系数取 5 还是 15 W/(m²·K)、太阳辐射要不要建模、钳位缺口去哪 —— 温差为零后全部无关。
v1.x 中 CO₂ 脱气塔与 MBBR 曝气的气水直接接触量完全不在水侧热平衡账内: 三文鱼 1000 t 全场达 96,287 m³/h, 是机械新风的 4.2 倍。
出口空气按水温下饱和计算, 有两个独立领域的实测支撑, 无需任何标定系数:
Karimi 等 2020 (Wageningen, 填料塔 8 组 GLR) 实测出口 RH 98–100%、与进水温差平均 0.77°C;
Talati & Stenstrom 1990 (ASCE) 鼓风曝气湿度因子 hf = 1, 经尾气实测确认。
热量用 Mollier 焓差 Δh = h(T_水, 饱和) − h(T_进气, RH_进气)。
Δh 可为负 —— 湿热空气遇冷水在填料上结露, 把潜热交给水。脱气塔在热带是凝结加热器而非冷却塔: 三亚年均每天向水中倒灌约 18,470 kWh, 设计夏达 53,482 kWh。这是 Atlantic Sapphire (佛州 Homestead)、宁波象山 Nordic Aqua 一类项目的核心成本, 行业内普遍未量化。
co2StripperGtoL 3 → 5, 新增 co2PackingHeight_m 1.5 m。依据 Timmons & Ebeling《Recirculating Aquaculture》Ch.10 p.244–245: CO₂ 汽提 G/L 为 5:1–20:1 (常规曝气才 <3:1, 增氧是 0.003:1–0.05:1, 三个用途差三个数量级); 填料高度限于 1.0–1.5 m, 超 1.5–2.0 m 收益递减。Karimi 2020 实测 GLR > 5 无额外去除增益, Summerfelt 2003 最优 5.1 —— 四个来源一致。
比功率随之 3.47 → 5.79 kW/1000 m³/h 循环水量, 进入 Summerfelt 等 2009 的 5–15 区间 —— 顺带解决 v1.9.2 审计 P4 记录的「低于文献下限」遗留问题。风压保持 2.5 kPa 不变: 原注释建议上调至 4.3–8.0 kPa 是把曝气风机档位误套到脱气塔 (曝气克服静水压约 10 kPa/m 水柱, 脱气只克服填料流动阻力, 化工准则 0.2–0.4 kPa/m, 液泛点才 1.3 kPa/m), 该注释已修正。
v1.x 中 co2StripperEff 与 co2StripperGtoL 是两个互相独立的参数, 调高 G:L 只增加风量与电耗、去除率不变, 与物理相悖。新增 co2StripperEffMode: manual (默认, 与 v1.x 逐位一致) / auto (按 Ch.10 Fig 10.13/10.14/10.17 曲线自动算)。
脱气塔面板新增 5 个输入框 (效率取值 / 填料高度 / 风机全压 / 风机效率 / 水力负荷) 与实时诊断行, 同屏显示单次去除率与比功率对标 —— 只显示去除率会诱导用户一路上调 G:L, 电耗代价必须同屏可见。
⚠ 另重现 Fig 10.17: 进风 CO₂ 本底 350 → 1000 ppm 时去除率降 10%, 5000 ppm 时降 70% —— 这是「尾气必须排室外、不得回车间」的量化依据。
依据 Timmons Ch.3 Table 3.1「冷水与温水代表种的水质设计参数」。v1.x 对全部鱼种统一取冷水标准 (TAN 1.0 / TSS 15), 相当于把冷水鱼的标准套在温水鱼上 —— 对温水鱼种 TAN 严 3 倍、CO₂ 严 2 倍, 造成告警误报 (罗非 TAN 实测 0.7–0.97, 旧阈值 1.0 下逼近红线, 按教科书应为 3.0)。
| 参数 | 温水鱼 | 冷水鱼 | v1.x (统一) |
|---|---|---|---|
| CO₂ mg/L | 30 | 20 | 20 / 海水 15 |
| TAN mg/L | 3.0 | 1.0 | 1.0 |
| TSS mg/L | 20 | 10 | 15 |
温水/冷水按养殖水温 ≥ 20°C 判定 (教科书两类为 24–30 与 10–18°C)。⚠ 水质限值在本工具中是告警层, 不参与选型与流量计算 —— 与教科书 Ch.3 的「约束驱动流量」方法论不同, 本项修的是告警正确性。
新增的 t17 断言实测发现三处参数组合在物理上不可行。共同点: density 或耗氧系数在某个版本被调高, 而 turnover 未同步 —— 每次改动单独看都对, 组合起来把参数推到物理不可行区。
| 鱼种/阶段 | 原状态 | turnover |
|---|---|---|
| 鳗鲡 养成期 | 出池 DO = 0.00 mg/L (完全耗尽), CO₂ 超阈值 44% | 2.5 → 5.0 |
| 鳗鲡 黑仔期 | 出池 DO 0.69 (阈值 5.09) | 3.0 → 4.5 |
| 罗非 苗种期 | 出池 DO 3.20 (阈值 4.70) | 6.0 → 8.0 |
| 大菱鲆 中鱼期 | 池内 CO₂ 15.2 (阈值 15) | 2.5 → 3.0 |
以鳗鲡为例: v1.9.2 把养成期密度由 40 上调至 120 kg/m³ (为修正 CAPEX 失真), 同版新增 TSS 附加耗氧项 —— 高密度下该项占总耗氧 67%, 两者叠加使出池溶氧归零。golden-master 基线对此无能为力: 它们从未 FAIL 过, 因为基线记录的正是错误状态本身。
v1.x 起有 7 条基线没有 climate 字段, 因而全部跑在默认地区青岛 —— 罗非 (28°C) / 石斑 (27°C) / 对虾 (30°C) 在 −7°C 的青岛过冬, 这些组合工程上不存在。接触器项接入前气候影响有限, 该配对错误不显; 接入后气候成为主导项, 温水鱼种比电耗被推到 15–30 kWh/kg (行业实测上限为 Atlantic Sapphire 丹麦的 13.6)。
现按实际配对: 温水淡水 (罗非/加州鲈/鳜鱼/鳗鲡) → 上海; 温水海水 (石斑/对虾) → 三亚; 冷水 (三文鱼/大菱鲆) → 青岛/Bergen/海南。比电耗全部回到 9.6–18.7。
新增 salmon_sanya_annual —— 冷水鱼种 × 热带气候。这是当前行业热点, 也是接触器项最关键的场景, 此前无任何基线覆盖。
t15 风量平衡 —— 断言 A: 设备层独立扫描出的每个「会动风」设备必须已在气路拓扑登记 (判据只看字段名形态, 不读登记表, 否则退化成「把实现抄一遍」); 断言 B: 拓扑中接触水的气流风量合计必须等于热平衡实际计入量。该断言在 v2.0 之前会立刻失败, 正是它把 96,287 m³/h 未入账这一事实固化为可执行测试。
t16 接触器物理锚 —— 复现 Karimi 2020 实测工况。采用有界检验而非精确匹配: 检验出口状态、潜热占比 (>80%)、Δh 符号 (湿热气候养冷水鱼必须为负) 与量级有界 (0.9–1.5×)。理由: 理想 Mollier 计算必然高于实测 (论文自身外推 y = 0.9361x), 而结构错误会翻转工程结论, 精度差 20% 只影响数值。
t17 鱼种参数库水质自洽性 —— 硬约束 (出池 DO / 池内 CO₂ / TAN / TSS) + 余量哨兵 (<10% 告警) + 负荷指标 (饲料/流量比)。这类缺陷 golden-master 无法察觉, 需面向工程约束的断言。
roomRH_set (车间设定湿度, 默认 65%) · contactorRecovery (接触器排气热回收率, 默认 0) · co2StripperEffMode · co2PackingHeight_m · co2MaxAttainableEff · co2IntakeCO2_ppm · 气路拓扑对象 (airPath / airFlowM3h / collectAirStreams())。
⚠ degasserExhaustIndoorFrac 在新拓扑下语义不完整 (只描述尾气去向, 未描述进气来源, 而二者对结果影响方向相反), 已标注废弃, 待「车间 CO₂ 源」问题查清后移除。
本轮调查中曾判定有问题、经查规范与实测后确认模型正确:
| 曾判定 | 核实依据 |
|---|---|
| DO 判据口径错误 | Timmons Tab 3.1: 鲑科出水 6–8 / 罗非 4–6 mg/L, 本工具落在区间内 |
| turnover 偏高 3 倍 | DB21/T 2350-2024 §9.3 要求溶氧 8–12 mg/L, 三文鱼 turnover 3.0 是满足规范的最低值 |
| 耗氧强度偏高 | MO2 3.15 mg/(kg·min) @15°C, 文献 2–4 中部 (Calabrese 2023 实测 2.4 @9.3°C) |
| 主泵扬程未生效 | 参数正确 (7 m + 氧锥 3 m = 10 m), 反算 9.5 m 吻合 |
| 比电耗偏高 | 落在实测区间: Atlantic Sapphire 丹麦实测 13.6 > 本工具 11.51 > 挪威独立仿真 9.59 |
| 脱气塔风压偏低 | 与 G:L=5 组合后比功率 5.79, 进入 Summerfelt 5–15 区间 |
📌 教训: 先查规范与实测, 再判断模型。本轮多次因先用论文反推、或跨温度跨鱼种直接比较而误判 —— 例如「turnover 偏高」绕了七八轮, 而辽宁省标准一条「溶氧 8–12 mg/L」即可定案。
Timmons & Ebeling《Recirculating Aquaculture》Ch.2/3/4/5/7–8/10/14 · Karimi 等 2020 Aquacultural Engineering 88:102042 (Wageningen, 开放全文) · Talati & Stenstrom 1990 J. Environ. Eng. ASCE 116(1):70–86 · Summerfelt 等 2000/2003/2009 · McQuarrie & Boltz 2011 (经 Ødegaard 确认) · Gorle/Terjesen/Mota/Summerfelt 2018 (挪威两个商业 smolt 场实测) · Calabrese 等 2023 · Mota 等 2019 · Good 等 2018 · ASHRAE HVAC Applications Ch.6 · CJJ 122-2017 · GB 50736 · SC/T 6093-2019 · DB 21/T 2350-2024 (海水鱼工厂化循环水养殖系统水处理技术规范) · AQUAIR 开放数据集 (摩洛哥, 84 天 23,856 条, CC-BY-4.0)。
✅ 接触器净水汽已计入水量平衡 (v2.1 补丁 25-27 完成)。补水拆为换水股(含盐, 与排污同量同盐度) + 蒸发股(补淡水), 两股各自闭合, 盐平衡恒等成立, 无需盐度状态变量。实测换水股与排水量逐阶段完全相等。
⚠ 原记载的三个数字均已订正: 旧文写「584.6 kg/h, 占补水 6.0%, 单向系统性偏差」—— 实测范围 −10.8% ~ +10.7%, 双向(青岛设计冬 +29.6 m³/d、海南设计夏 −34.9 m³/d 为净结露)。湿热气候下模型反而高估补水需求, 故字段命名 netWater 而非 evap。另: 接触器净水汽是池面蒸发的约 50 倍(设计冬), 高于旧文记的 29.5 倍。
✅ 凝结水对盐度的影响已给出诊断 (v2.1)。净结露时纯水先抵扣蒸发股, 抵到零仍有余量的转为排水, 并按现有假设推出稳态盐度 S × V_exch / (V_exch + V_surplus)。海南设计夏实测 30 → 27.2‰ (漂移 −2.83)。这不是新建模, 是把模型现有假设的推论说出来 —— 盐度仍非状态变量 (让它成为状态变量会波及 O₂ 溶解度、碳酸盐体系、NH₃ 解离等, 属架构级改动)。
③ 恒温车间档暖通侧未含太阳辐射与人员负荷。
围护体系本身是完整的 —— U_墙/顶/地/窗四值可调, 含 4 档保温预设
(温室 3.5 / 标准车间 0.8 / 保温车间 0.30 / 近被动房 0.15)、通风热回收、窗墙比,
地板对地温单独计算。v2.4 更新: 太阳辐射子系统已建成
(九气候区 GHI 冬/夏/年 + 四档围护 SHGC/吸收率, 不透明面走 sol-air 折算), 但只在
简易棚 (自然通风) 档参与求解; 恒温车间档 Q_solar 恒为 0 ——
这是为守住 13 条数值基线逐位不变而记录在案的模型边界, 非实现疏漏:
大连一项 RAS 车间 CFD+实测研究显示, 屋顶采光带可把墙体表面温度推到 29°C
(同期水温 17°C), 因此恒温车间档在高日照地区、尤其设有采光带时, 夏季制冷负荷仍偏保守。
人员负荷 (约 100 W/人) 相对车间显热 (千瓦级) 可忽略, 不单独建模。
contactorRecovery 默认 0 —— 实际配对下最紧的是上海冬季 (接触器排 31,541 kWh/d, 方向转制热); 真实工程会冬季降 G:L 或做尾气热回收, 默认值待实测反馈确定。
MBBR 流化下限与 bfTankDepth 参数缺失 (教科书填料层 1–5 m)。
暖通侧负荷 v2.0 标注界外, 不计入本工具能耗。 ⚠ 已过时: v2.0 起车间显热已计入能耗, v2.1 修正口径 (扣除室内产热) 并补设备投资 (AHU-1002); 第五轮审计后再补三台风机的电机损失。
三节点 / 结露判据推迟 (T_room 受控后风险大降)。
石斑三阶段 DO 余量仅 +2%/+3%/+10% (告警级)。
✅ 蛋分供气风机已建模 (v2.1, 位号 K-501): 气水比/风压/效率三参数, 气流已登记 airPath 并计入接触器热湿交换; 第五轮审计后补 CAPEX 条目 (由新增断言 F4 抓出)。
✅ 1+1 备用已补 (modulePerSpec 规格 + SPARE_MAP 映射), 三台风机备用政策至此一致。
⚠ 蛋分塔高度未建模: 塔体只按 HRT 定容积, 风压默认 25 kPa 是经验取值而非推导 (原注释写「2.5 m 水柱 + 5 kPa」= 29.5, 与默认值自相矛盾, 已订正为诚实表述)。
单池面积: DB21/T 2350 规定 5–30 m², 本工具每阶段建模为一个池 (66–2997 m²), 池数由用户设置。
记录在此是为了避免被反复当作漏项重新发现 —— 本版第三方审计的四处误报中, 有两处正是这么来的。
① 接触器进气节点不参数化, 恒取室外空气。
依据三条: (a) 与气路拓扑前提 A5「工艺气路全程不碰车间」自洽 —— 参数化反而会让 A5 变成有条件成立的假设;
(b) 避免引入耦合环路 (车间温度 → 接触器 → 水温 → 车间温度), 而 v2.0 删除双节点求解器正是为了消除这类环;
(c) 符合工程实际 —— 现代场脱气尾气本就管道直排室外, v2.1 已把 degasserExhaustIndoorFrac 默认改为 0。
② 盐度不作为状态变量。
补水拆两股后盐平衡恒等成立, 无需状态变量。若要建模真实盐度动态, 会波及 O₂ 溶解度、
碳酸盐体系 (carbonate.js 有 20 处函数签名带 S)、NH₃ 解离分数、密度与泵扬程 —— 属架构级立项, 不在补丁版范围。
③ 人员负荷不单独建模。约 100 W/人, 相对车间显热 (千瓦级) 可忽略。
本版不改动任何计算模型 —— ?selftest=1 的 14 项基线逐位不变。全部改动是把对外发布的数字与真实产品路径对齐, 并把验证过程固化成可自动运行的测试。
v1.9.2 发布的四工况表 (青岛冬 35.63 / 海南冬 37.39 / 海南夏 37.94 / Bergen 35.65) 无法用产品路径复现: 试过「冬夏同温」「只覆盖冬」「不动 RH」三种气候口径, 全部对不上。判定为成本模型两层化之前的旧脚本残留。现按真实 recomputeAll() 重测并替换 (index / 技术手册 / README 三处同步)。
设备选型完全未变 —— mainline/bypass 对照里主泵 369.0 / 258.3 kW、旁路泵 92.2 kW、综合泵功率 369.0 / 350.5 kW 与旧表逐位一致, 差异只出现在成本与投资两栏。
SELFTEST_BASELINE 的 11 个数值工况本身混了两种气候口径: 4 个大西洋鲑工况带 climate 覆盖 (冬夏同温的隔离口径), 其余 7 个鱼种不带 (走 UI 默认气候)。README 曾把这 11 个数放在同一个「青岛冬」表头下, 同一鱼种两口径差 0.1–0.5 元/kg。数字是对的, 表头已补注说明。
新增 tests/: npm test 一条命令跑十三项 —— 内置自检 (14 工况 × 4 个受检字段 + 两类不变量 + 面板渲染)、存/取方案 roundtrip、下游页面数据链路、部分自然冷却与年化、热工况组合稳健性 (648 次调用)、年化振幅校准锁定、参数杠杆与反悬崖、自然冷却开关反馈、用电汇总闭合性。全部通过真实 recomputeAll() 取数, 注入的 CDN 桩只覆盖渲染层。可直接挂 CI。另有 gen_baseline.js 由产品路径生成文档表格 —— 基线表今后应粘贴它的输出, 不要手抄, 手抄正是本轮全部旧数的来源。
问题不是"逼近温差取几 K", 而是判据"非 0 即 1"。 旧判据 冷源温度 + 逼近温差 < 目标水温 一旦跨过, EER 从 3.45 跳到 20、Q 从 0 跳到全量, 两个量同时跳变 —— 阈值附近出现 5.8 倍的成本悬崖, 几 K 的假设差就能翻出 1 元/kg 级的结果差。
P1: 换成容量判据。 Q_fc = min(K_fc·ΔT_avail, Q_load) —— Q ∝ ΔT 是精确的而非线性化 (由 ε-NTU: 流量固定时 ε 为常数)。EER 随温差衰减 (风机满转、寄生功率固定, 换到的热变少)。等效 COP: 1/COP_eff = (1−g)/COP_cool + g/EER_d。经济截止点自动涌现且恰好连续: 截止处 EER_fc = COP_cool, 两条路径边际成本相等, 故 E 两侧完全相等 —— 悬崖不是被磨平, 是不存在了, 且无需为它引入任何参数。
参数 逼近温差 换为 设计温差: 语义从"悬崖位置"变为"自然冷却单独扛满设计负荷所需的温差"。它是换热链串联损失, 链条越长、末端介质换热系数越差则越大 —— 空气源 (板换 2-3 + 干冷器对空气 5-10) = 8-13 K;水/开式海水 (钛板换 2-3) = 3-6 K;地源 5-7 K。UI 留空即按热源自动取 (空气 11 / 水·海水 4 / 地源 6)。填错几 K 只会让曲线挪一小段。
P2: 年均工况改为对真实模型做 24 点数值积分。 自然冷却本质是"全年有多少小时可用", 而阈值函数在均值处取值 ≠ 函数的均值 (Jensen) —— 旧模型切设计冬则判定全年可用 (高估), 切年均则判定全年不可用 (低估), 真值在中间而单点永远给不出。现按现有三个温度点拟合正弦 T = T̄ + A·cos θ, 对 T_air 与 T_source 用各自振幅、同相位摆动, 逐点跑真实热平衡再平均。
| 地区 | 热源 | 设计冬 | 年均 | 设计夏 | 年化贡献率 | 年化 COP |
|---|---|---|---|---|---|---|
| 挪威 Tromsø | 开式海水 | 37.62 | 37.64 | 37.67 | 98% | 18.14 |
| 挪威 Bergen | 开式海水 | 37.66 | 37.95 | 39.07 | 73% | 7.82 |
| 智利 Puerto Montt | 开式海水 | 37.67 | 38.13 | 39.07 | 59% | 5.95 |
| 加拿大 Halifax | 开式海水 | 37.69 | 38.20 | 39.42 | 65% | 5.85 |
| 青岛 | 空气源 | 37.75 | 38.54 | 39.35 | 35% | 4.64 |
| 上海 | 空气源 | 37.80 | 38.81 | 39.54 | 19% | 3.93 |
| 三亚 | 开式海水 | 39.62 | 39.98 | 40.42 | 0% | 2.30 |
| Doha | 水源 | 39.24 | 39.68 | 40.26 | 0% | 2.68 |
元/kg, 1000 t 大西洋鲑, 工艺运行成本。注意一个反直觉的反转: 直觉上青岛 −7°C 的冬天该是自然冷却之王, 但年度账上稳定的 9°C 海水赢两倍以上 (Bergen 73% vs 青岛 35%) —— 因为海水全年都冷, 而青岛的空气只冷一段时间。旧模型给不出这个结论, 它只会说两地设计冬都是 COP 20.00。年化改变的是选址与冷源方案的排序, 不只是把数字调准。
✅ 振幅校准已核验: 敏感性实测表明 ḡ 的主导不确定性只有季节振幅 A 一个量, 而 A 已对多个独立气候常值来源核验 —— 青岛空气 模型 12.7 vs 实测 12.1-13.1;Bergen 海水 4.5 vs 4.0-5.25;Halifax 海水 8.5 vs 8.2-8.9, 三处全部落在实测区间内。其余 5 个区域仅作合理性判断。校准已由 t7 锁死。
⚠ 剩余缺口: ① 昼夜与天气过程未计 —— 已降级为二阶: A 钉死后 ḡ 对 σ (1→6 K) 的剩余敏感性仅 0.1-2.2 pp (A 未钉死时为 8.4-17.7 pp);② RH 按年均值恒定 —— 实测为三阶, 不予实现: RH 季节数据本已在各区域预设里 (振幅 −2.5~+9.0 pp, 夏湿/夏干两种相位都有), 24 点积分只是没用它。按预设振幅摆动后年化热泵电耗仅变 −0.07%~+0.30%, 振幅翻倍也只 −0.15%~+0.60% —— RH 只作用于蒸发/潜热通路, 而净排热由恒定内热主导;③ 闭式解保留为诊断量, 它对贡献率是精确的, 但因未计 Q 与冷源温度的相关性, 能耗偏乐观 1-7% —— 这正是改用数值积分的原因。
P1 核心主张已验证 —— 参数杠杆确实被压平。 ΔT_design 在全合理区间内扫描: Bergen 海水 2→6 K 成本极差仅 0.35 元/kg (P1 之前 6→10 K 就 +1.20), 青岛空气 6→16 K 极差 0.20;单位 K 杠杆由 0.30 降至 0.087 / 0.02, 约降一个数量级。EER_design 12→30 (2.5 倍) 极差 0.11-0.22。设计冬工况极差为 0.0000 —— ΔT_avail 全区间远超 ΔT_design, 贡献率恒为 1, 这正是 14 项基线中性的根据。反悬崖指标: 扫描中最大单步跳变仅占总极差 30-31% (阈值判据会接近 100%), 已由 t8 锁死。
✅ 自检 14 项基线逐位不变: 四工况全是空气源且 ΔT_avail 远超 ΔT_design, 落在饱和区。最紧的是 Bergen 设计冬苗种期 (x = 12/11 = 1.09), 余量仅 9% —— 将来上调空气源设计温差会让 salmon_bergen_w FAIL, 那是【预期行为】, 说明该基线确实压在全量自然冷却的边界上, 应同步复核而非直接改基线。
比电耗 (kWh/kg·yr) 与热泵电费 (元/kg) 是对外发布的核心指标, 但 summary 里此前没有对应字段 —— 页面上的 kwhPerKgYr 只是热泵单项且分阶段。因此这两个数进不了 SELFTEST_BASELINE、无法自检, 至今只是"碰巧还对着"。本版补上 kwhPerKg / elecCostPerKg / hpCostPerKg / pumpShareOfElec / loxTonsPerYear 五个出口, 并把前两者写入全部 11 条数值基线。
纳入后立刻发现旧发布值偏高: 比电耗 9.7 → 9.51, 热泵电费 0.29 → 0.21 (差 28%)。根因是旧手推口径对臭氧与 BF 风机取了峰值, 而年成本按 totalAvg × 365 计算 —— 产品路径的均值口径才与成本模型自洽。四工况表的比电耗列已按产品出口更新。液氧年耗 471 t 经核对本就正确。
为什么不在汇总层手列 kWh 清单: ① 增氧可能是电 —— aerationMode==='air' 时是主风机电费, 纯氧时才是液氧;旧手推完全漏了这一项, 只因大西洋鲑走纯氧才碰巧对上。② 臭氧、BF 风机、增氧都有峰/均之分。故电量在成本函数内部、紧挨 totalAvg 那一行计算, 复用它已用的成本项再除以电价 —— 口径天然一致, 且可与 totalAvg 逐项肉眼对照, 将来新增用电项漏加即可发现。
⚠ v1.9.2 变更日志里"热泵费 1.68 → 0.29 元/kg"的叙述保留原样: 那是历史记述, 而 1.68 那一侧对应的旧代码已不存在、无法测量。改成 0.21 会让该叙述一半真一半编。当前值以本节与基线为准。
模型一直按 N+1 给每个模块配备用 (applyModularization), 设备清单也把备用台数展开成「N 台+1 备 ×M 模块」, 但 calcCapex 是按工艺容量计价的 (元/kW、元/(m³/h)) —— 备机只选型、不花钱。实证: 把「套数」由 1 改到 5, 备用台数随之变化而设备直购恒为 4360 万。同一方案里「清单说 2 台、投资按 1 台算」。
冗余系数 = 实际装机 / 工艺需求。不能用 (N+备)/N —— 它对 N+1 备用正确, 但对超配并联失效: UV 是 2×75% 并联 (装机 = 需求 ×1.5) 而备用数为 0, (N+备)/N 会算成 1.00, 于是实际装 150% 却只按 100% 计价。这是 v1.3 就存在、因从未按装机量计价而一直未暴露的漏算, 本版一并修正 (+35 万)。
臭氧发生器改 2×50% 并联: 原为 1+1, 而臭氧四个阶段的 N 恒为 1, 意味着 100% 冗余 —— 成鱼期单台 286 万、备机等额, 单项就占备用增量的 48%。臭氧停机不像主泵那样 15-30 min 致鱼窒息, 多数项目按「可短时降容」处理。改为 2×50% 后装机 = 需求, 不额外增加投资, 任一台故障仍维持 50% 氧化能力。
新增加药计量泵条目: 此前有 1+1 备用规格却没有 CAPEX 条目。按台计价 5000 元/台 (国产液压隔膜 + 耐腐泵头到场价;按 kW 计价会差一个数量级)。全场 8 台共 4 万, 对成本无实质影响, 价值在消除「清单有台数、投资 0 台」的矛盾。补 CO₂ 脱气塔风机的模块化规格 (环路内转动设备, 此前无规格故无备用)。
| 阶段 | 备用增量 | 主泵/RDF/热泵/臭氧 的 N |
|---|---|---|
| 苗种期 | 33.4 万 | 1 / 1 / 1 / 2 |
| 幼鱼期 | 121.3 万 | 1 / 2 / 1 / 2 |
| 中鱼期 | 182.5 万 | 2 / 3 / 2 / 2 |
| 成鱼期 | 288.8 万 | 2 / 4 / 3 / 2 |
| 全场 | 626 万 | N 随规模增长 → 冗余系数由 ×2.00 降至 ×1.25 |
备机与主机同样乘 ×2.2 工程放大系数 (安装备用: 管路阀门电气全通, 可自动切换)。结果: 设备直购 4360 → 4986 万, 折旧 8.07 → 9.14 元/kg, 工艺运行成本 35.74 → 37.33 元/kg。全部 11 条数值基线与三份文档的成本数字已同步重算。
⚠ 实现要点: items[].qty 保持工艺容量不变 —— 自检的不变量断言拿 CAPEX 热泵 qty 与 hpInstalledKwOf 统一公式比对, 把备用乘进 qty 会让该断言失败。冗余系数只作用于 cost, 另存 spareRatio / costRun 供追溯。
⚠ 已知未含备用: 机械除湿机 (全场设备, 不在模块环路内, 本版仅确认不配模块内备机, 未移入站级 —— 实测其分区选型不构成重复计算, 且移动不改变任何数字)。
P0 · 渲染层口径分歧: 工况对比表用 heatPumpKWh / 16 (电耗÷16h), 而正上方热平衡卡片用 热功率 ÷ 22h —— 同屏两个数差 14 倍 (38 vs 548 kW)。自然冷却把冬季电耗压掉一个数量级后尤为离谱。数据层的不变量断言抓不到: sCap 是渲染层局部变量, 不落任何数据结构。
P0 · 防除零 clamp 推翻经济截止判据: Math.min(0.999, COP_cool/EER) 在 EER < COP_cool 时把「自然冷却永不经济」硬拉成「几乎总经济」。实测 EER=1 时电耗 6277 vs 关闭自然冷却 1819 —— 多耗 3.45 倍, 且无任何提示 (EER=2 多耗 1.72×, EER=3 多耗 1.15×, EER=3.45 恰好相等)。改为 x ≥ 1 直接置 g = 0;EER 钳到 [1, 60] (此前无上界, 填 1e6 得电耗 0)。界面新增一档提示「自然冷却不经济 (EER ≤ 机械制冷 COP, 已自动改走机械制冷)」。
P1 · 热泵漏出 SPARE_MAP: modulePerSpec.heatPump 有 sparesCount=1, 设备清单与 P&ID 都按 N+1 展开, 唯独 CAPEX 按 N 计价 —— 是备用政策下唯一不一致的转动设备。P1 · 年均基线缺失: 11 条数值工况全跑设计冬, 而 4 条大西洋鲑用冬夏同温的隔离口径 ⇒ 年振幅为 0、24 点积分退化成单点, 该核心路径在内置自检里一次都没被执行。已新增 salmon_qingdao_annual, 自检 14 → 15 项。P2: 氧锥旁路泵补进支路泵冗余数组 (bypass 拓扑下占该项 46%)。
本项目两次栽在 Math.max/min(…, 常数) 上, 且两次都是外部发现的: Math.max(1−R, 0.001) 在默认换水率 4% 就在触发, 使 NO₃ 完全不响应换水率 (v1.0 起的静默错误);Math.min(0.999, …) 见上。这类错误不产生 NaN、不越界、不让基线 FAIL —— 现有三类断言结构上无能为力。
故引入扰动测试: 把常数改到「不可能生效」的值, 比对全场输出指纹。指纹变了 = 该 clamp 正在生效 → 人工判定是物理边界还是静默改写。采用分组二分: 126 项候选只用 38 次 jsdom (逐个跑需 128 次)。结论: 4 处正在生效, 逐条判定后全部为有意设计 —— 集水池容积区间 20/200 m³、BF 风机日均负荷比下限 0.5、自然冷却贡献率封顶 1。最令人担心的 COP 下限 1.5/1.8/2.0、蒸发系数 β 区间、RH 域, 在正常工况下全部不触发。
⚠ 覆盖边界: 指纹只覆盖三文鱼+罗非鱼、设计冬+年均, 只在极端参数下才越界的 clamp 会漏;A 类 (常数 0/1) 65 项未测。全表见 CLAMP_INVENTORY.md, 哨兵 t11 秒级检出「新增了没人测过的 clamp」。
审计建议「让装机 kW 只有一个 formatter 出口」。普查后发现消费点不是 4 个而是 5 个, 第五个更隐蔽: summary.totalHeatPumpCapacityKw 用电耗 ÷ 小时数而非热功率 ÷ 小时数, 实测青岛 36.6 vs 统一公式 997.3 kW —— 差 27 倍, 且它进导出载荷与下游页面。另发现利用小时的解析逻辑被复制了 4 份 (复制即分叉隐患)。已抽出 hpUtilHoursOf() 唯一出口, summary 改用 hpInstalledKwOf。新增 t12 三层断言, 其中一层直接读渲染出的 DOM 文本 —— 这一层正是原断言的盲区。
NH₃ 着色阈值: 鱼种限值表 NH3_LIMIT_UG_L 早已存在 (鲑 12.5 / 大菱鲆 20 / 石斑 30 / 鲈·鳜·虾 50 / 鳗 60 / 罗非 100 μg/L), 同一行 tooltip 也写着「三文鱼 12.5」, 但判据写死 25 μg/L —— 最敏感的鲑科用了 2× 宽松阈值。改为三档: 超限值红 / 超半限值黄 / 其余绿。
方解石饱和度 Ω: 此前界面上完全没有显示 —— 不是缺告警, 是连数字都看不到 (它已算出并进导出载荷)。现补一行并按 <0.8 危险 / <1.0 警戒着色。实测海水鱼种多数阶段欠饱和: 三文鱼 0.55–0.72、大菱鲆 0.56–0.75、石斑 0.63–0.81、对虾 0.90–1.53 (对虾苗种期 1.53 为过饱和, 其余全部 Ω < 1)。⚠ 本段数值随 v2.5 链式重导 (审计 B8) 更新过一次 —— 旧值 0.37–1.29 是集总口径下的鱼池 CO₂ 偏高所致。现由自检断言 N2 锚定, 数值再变会当场转红。这是模型算出的真实状态 —— 高密度 RAS 中 CO₂ 累积压低 pH、CO₃²⁻ 占比骤降。工程后果: Ω < 1 时水对碳酸钙不饱和, 持续溶蚀混凝土池体与水泥基砂浆。
⚠ 蒸发计入补水 (审计 P3 第三项) 经实测后决定不做: 蒸发仅占补水 0.06%–0.32% (青岛 1.48 / Doha 0.92 / 三亚 0.29 m³·d⁻¹ vs 补水 461), 折算成本 < 0.001 元/kg, 而改动会使 12 条基线与三份文档数字再重算一遍。⚠ 该结论依赖默认 poolCover=partial 且换水率 5%/d;敞开池面 + 干热气候 + 低换水率时占比会显著上升。
比电耗与热泵电费没有产品出口 —— summary 里没有对应字段 (页面上的 kwhPerKgYr 只是热泵单项、且是分阶段的), 因此进不了 SELFTEST_BASELINE, 无法自检。它们现在只是碰巧还对着。建议下一版补 kwhPerKg / hpCostPerKg 两个字段并纳入基线。
附: 年化基准是 365 天而非 stageDays —— 各生活阶段在场内全年并行运行。按 stageDays 串行累加会把比电耗低估 2.3 倍 (4.2 vs 9.7 kWh/kg), 已用年液氧 471 t 反查确认。
本版全部改动都是物理口径修正, 不是新增功能。共同特征: 影响运行成本与装机容量, 但不改变增氧设备选型 (o2PeakSupplyKgH / o2Demand / 氧锥流量逐位未变)。
液氧采购量原先误用设备选型口径 o2Demand, 其中含 peakFactor (1.5) 与 sAerator (1.10) 两个容量系数。液氧是按量计费的消耗品, 只应被吸收效率放大 —— 旧口径高估 1.65 倍。新增 o2ConsumptionDaily / o2ConsumptionDailyAvg 并行口径, 基准值 0.44 → 0.266 kg O₂/kg 饲料 (⚠ 此处对标关系有误, 见下段 v2.6 订正), 年耗 527 → 326 t (本项单独效果; 叠加 F 项的池内 TSS 附加与基础异养耗氧后为 473 t)。
v2.6 订正: 上述 473 t 仍然漏了生物滤池。拆两个口径时, 选型侧 o2PeakSupplyKgH 加进了 BF 由水供的那份氧, 采购侧却没跟上 —— 氧锥按「鱼 + MBBR」选, 液氧按「只有鱼」买。纯氧系统里水中溶氧是液氧供的, MBBR 取走多少就得补多少。补上 o2BFDaily × bfFromWaterFrac 后, 同一锚定工况 (大西洋鲑 1000 t) 年耗 471 → 790 t (+67.6%), costPerKg +0.38 元/kg。⚠ 与 co2DailyAvg「设计口径已修而日均口径未跟上」同族: 同一物理量两处实现, 一处改了另一处没跟上。现由自检 M3b 把两侧份额绑死。
v2.6 口径订正: 上段那句「0.266 kg O₂/kg 饲料 (文献 0.25-0.30)」拿错了对标物 —— 0.25-0.30 是鱼生理耗氧的文献区间, 而 0.266 是液氧采购量。当时采购量恰好只算了鱼, 两个不同的量数值撞在一起, 看起来验证通过。v2.6 补上 BF 后数字分开, 错配才暴露。现按口径分列 (1000 t 规模, 纯氧, 满负荷):
| 口径 | kg O₂/kg 饲料 | 对标 |
|---|---|---|
鱼生理 o2FishFactorBase | 0.20–0.32 | 文献 0.25–0.30 ✓ |
| 池内总 (含 TSS 异养) | 0.33–0.39 | — |
| 系统总耗氧 (池内+硝化+DOM) | 0.60–0.66 | 设计取值 (用户裁决 2026-08-26); 自检 M4 按逐阶段实测散布锚在 [0.40, 1.00] |
| 液氧采购 (÷吸收率, 已扣 BF 空气份额) | 0.64–0.75 | 无直接文献对标, 依赖吸收率与 bfAlpha |
旧注释称 β 取自 ASHRAE 的 0.045-0.075 m/s —— 错误出处。ASHRAE/Carrier 的池面蒸发系数定义在蒸气压差上 [lb/(h·ft²·inHg)], 不能当作 ΔW×ρ 形式的 β [m/s], 高估约 13 倍。改用 Lewis 传热传质类比 β = h_c/(ρ·c_p·Le^(2/3)) ≈ 0.0035-0.010 m/s。实测蒸发率降 2-2.4 倍 (非 13 倍, 因 W_room 自洽求解存在自补偿), RH=99% 饱和虚警消失。
原 通风量 = ACH × V_room 随车间体积线性增长, 导致降低养殖密度反而推高制冷装机 (实测密度 80→15 通风放大 5.33 倍), 而鱼没变、新风需求本不该变。改为 max(ACH × V_room, 鱼载荷 CO₂ 稀释需求), CO₂ 产量取 500 g/kg 饲料 (Terjesen 2013 / Vinci 2004 / Heinsbroek 1990), 限值默认 1500 ppm。除湿不计入新风 (湿热气候通风不能除湿; 干冷气候仅需 0.14 ACH), 改由新增的机械除湿机承担 —— 含目标 RH / SMER / 冷凝水回收 / 冷凝热去向 (排室外/排车间/热回收给水) 四个参数, 冷凝器排热与室温耦合时用欠松弛阻尼 0.25 求解 (直接 Picard 会在 22.5↔40°C 振荡)。
shaftKw = 9.81·Q·H/(3600·η泵) 算的是轴功率, 不含电机效率。原实现 (1) 把轴功率直接当电耗计费, 漏算电机损失; (2) pumpHeatRatio = 0.85 把 15% 轴功率送进车间空气 —— 那是把"电机效率 85%"错记在轴功率上, 而电机损失根本不在这个数里, 车间得热高估约 2.8 倍, 导致 T_room 顶穿物理钳位、RH 被人为压低到除湿机永不触发。修正: 新增 motorEta (0.95), 电耗 = 轴功率/motorEta; pumpHeatRatio 0.85 → 0.97; 空气得热 = 轴功率 × (1/motorEta − pumpHeatRatio)。T_room 钳位触发时不再静默截断, 改为报出未闭合能量缺口。
主泵扬程默认 12 m 取的是"多级跌落"布置, 与本工具自身 tooltip 给的"池底重力流 5-8"矛盾, 而重力回流是现代 RAS 标准布置。按扬程预算 (静提升 2.5-4 + 沿程/局部 1.5-3 + UV/板换 0.5-2 + 余量 0.5-1 = 5-10 m) 取中位 7 m; 支路泵 (反硝化/UV/AOP) 10 → 7 m; 主泵效率 68 → 75% (大流量低扬程工况选轴流/混流泵, 高效变频 75-82%)。蛋分泵保持 6 m (蛋分塔紧邻主流池), 旁路泵保持 20 m (需克服 2 bar 氧锥压力)。
(1) 池内耗氧新增 TSS 依赖项。 物种 o2BaseFactor (鲑鱼 0.2263 @15°C, 依据 Atlantic Sapphire / Davidson 2014) 是清水条件下的鱼生理耗氧。但商业鲑鱼 smolt RAS 养殖池实测显示: 池内氧呼吸速率随池内 TSS 从 3.0 mg/L (0.30 kg O₂/kg 饲料) 升到 10-12 mg/L (0.70) —— 翻倍, 增量来自悬浮固体上附着的异养菌在池内直接耗氧, 这部分同样要靠氧锥/液氧供给。v1.9.2 新增: 池内耗氧 = o2BaseFactor + 0.05 × (TSS_tank − 3) (钳制 TSS ≤ 15)。
工程含义: 微滤机去除率、换水率、蛋分投用与否现在会通过 TSS 直接反映到液氧账单上 —— RDF 从 90% 降到 40%, 池内 TSS 3.0 → 5.0, 液氧年耗 334 → 481 t (+44%)。这个耦合此前完全不可见。
(2) 代谢产热改由耗氧导出。 旧式用 Schrama 公式 106 × Q10^((T−T_ref)/10) × N × W^0.85, 系数 106 kJ/(d·kg^0.85) 源自 Saravanan & Schrama 2012 虹鳟饱食投喂实测 (文献区间 77-160), 而该式没有投饵率变量。用饱食系数套商业投饵率 (鲑鱼成鱼 0.95% 体重/日) 高估约 3 倍: 旧值 11030 kWh/d = 1.11 W/kg 鱼, 而 van Dam 综述的维持代谢基准换算到 15°C 仅 0.11 W/kg。
v1.9.2 改为 Q_metab = 池内耗氧 × 13.6 kJ/g O₂ (Brett & Groves 1979) —— 同一代谢过程同时决定耗氧与产热, 两者由氧热当量刚性绑定, 不再各取各的文献值。结果 11030 → 4053 kWh/d (−63%), 折合 0.32 W/kg (维持代谢的约 3 倍, 属摄食鱼合理区间)。
回归验证: 把 Q_metab 打到 0 做对照, 7 项设备选型 × 4 阶段 (主泵 / 峰值供氧 / 氧锥流量 / BF 风机 / RDF / UV / CO₂ 风机) 逐位一致 —— 代谢产热只影响热泵负荷, 不影响任何工艺设备选型。
📌 历史数据:本表是 v1.9.2 当时的实测基线,数字不代表当前版本。此后经 v1.9.3 / v2.0.0 / v2.0.1 / v2.1 / v2.2 多次重算(热平衡架构重构、气液接触器、能量守恒修复、风机热接入、风机温升自洽等)。当前基线见 v2.2 章节与主页自检(?selftest=1),亦已自动同步到本页 <meta description>。表中的结构性结论(各工况相对关系、bypass 收益方向)仍然成立。
| 工况 | 气温/源水 | OPEX | 折旧 | 综合成本 | 比电耗 |
|---|---|---|---|---|---|
| 青岛冬 | -7°C / 4°C | 28.26 | 9.27 | 37.53 | 9.5 |
| 海南冬 | 17°C / 22°C | 29.57 | 9.37 | 38.94 | 11.9 |
| 海南夏 | 32°C / 27°C | 29.95 | 9.43 | 39.39 | 12.6 |
| 挪威 Bergen 冬 | 0°C / 4°C | 28.27 | 9.28 | 37.55 | 9.5 |
单位元/kg 鱼, 电 0.7 元/kWh / 液氧 1.2 元/kg / 饲料 12 元/kg。比电耗单位 kWh/kg·yr。年液氧消耗 471 t (四工况一致 —— 液氧只随鱼载荷与池内 TSS 变化, 与气候无关)。
方法学: 每行按独立稳态点评估 —— 设计冬 / 设计夏两个热工况均取该行的气温与源水温, 以隔离气候单一变量。实际项目中热泵装机应按当地全年包线 (冬夏两端) 定容, 折旧会略高于本表 (实测约 +0.5%)。
与 v1.3 老基线的差异: 老表 (青岛冬 35.96 / 海南冬 37.70 / 海南夏 40.47 / Bergen 36.30) 跨气候跨度 4.51 元/kg, 新基线为 2.31 元/kg。压缩来自 B 项蒸发系数量纲修正 (凝结放热降 2-2.4 倍)、C 项通风口径, 以及 H 项代谢产热改由氧当量导出 —— 气候差异现在几乎全部体现在热泵费上 (0.29 → 2.53 元/kg), 饲料费 14.80 与泵电费 5.30 跨工况不变。
四工况全部为制冷工况: 气候无关的基础热负荷 (池内生物产热 5271 + 设备产热 20677 = 25948 kWh/d) 远超水侧散热能力, 青岛 -7°C 也不例外 —— 这是 RAS 常年需要制冷的结构性原因, 不是模型异常。 —— ⚠ v2.0 订正: 该结论是在气液接触器缺失时得出的。v2.0 接入接触器后, 脱气塔与 MBBR 曝气在冷天已把内部产热大量排走 (青岛设计冬 21,266 kWh/d, 达内部产热 82%), 青岛冬与 Bergen 冬四个阶段已全部翻为「制热」。「常年制冷」只对温暖气候或接触器排热受限的场景成立。见 v2.0.0 章节 B。
v1.9.2 主体完成后接受一轮第三方代码审计, 修复 8 项缺陷: o2FishFactor 回写污染 (含 TSS 附加的值被当作手填生理值读回, 每操作一次 +8% 无限累积) · 生物滤池节点氮不守恒 (低 η 时 NaHCO₃ 投加量算成 0, 给出"不用加碱"的危险结论) · 热泵按电功率计价 (2000 元/kW 是制冷量口径, CAPEX 缩到约 1/COP) · CO₂ 产量两个口径 (通风用常数 500, 模型自算 671-1084, 差 34%-117%) · 发散被静默钳制 (无去除路径时给出"看起来精确"的假数, 已改显式告警) · BF 去除率与接触时间无校核 (新增 EBCT 判据) · 空场 NaN 污染 (清空产量输入框即触发, 全场汇总显示 NaN 且无提示) · 方案 JSON 导入 DOM-XSS。 新增自然冷却路径 (冬季室外低温直接排热, 压缩机不启动, 寒冷气候热泵费 1.68 → 0.29 元/kg) —— ⚠ v2.0.0 订正: 该效益数是在气液接触器缺失时算出的。v2.0 接入接触器后, 脱气塔与 MBBR 曝气在冷天已把热排走 (青岛设计冬 21,266 kWh/d, 达内部产热 82%), 水侧转为需制热, 自然冷却无负荷可排。实测: 设计冬开关无差异, 年均贡献 g=0.13、全场省 0.049 kWh/kg。两者抢同一个物理资源(室外冷空气)且不叠加, 而接触器是必开的。见 v2.0.0 章节 B。 与 ?selftest=1 自检入口 (14 个工况走真实 recomputeAll 路径: 11 个数值工况 + 3 个边界工况)。 详见技术手册「版本演进 → I. 第三方审计修复」。
| 对比项 | mainline | bypass | 差 |
|---|---|---|---|
| 主泵 P-101 | 369.0 kW | 258.3 kW | -110.7 |
| 旁路泵 P-602 | 0 | 92.2 kW | +92.2 |
| 综合泵功率 | 369.0 kW | 350.5 kW | -18.4 |
| 氧锥流量 | 10155 m³/h | 1015 m³/h | 缩 10× |
| 工程总投资 | 11026 万 | 9771 万 | -1255 万 |
| 综合成本(工艺) | 37.53 | 35.94 | -1.59 元/kg |
bypass 节能幅度从 v1.7 的 29.8 kW 降到 18.4 kW —— 主泵扬程降低后, "旁路让主泵不过锥"这个优势的绝对值随之变小; 但 CAPEX 节省 (氧锥按小流量定价) 基本不变, 仍是 bypass 的主要收益来源。
中文版直接从 v1.7 跳到 v1.9, 与英文版同步。
持碱度 (默认, 设碱度目标 pH 涌现) / 持目标 pH (设目标 pH, 反推所需碱度). 大型海水 RAS (Atlantic Sapphire / Salmon Evolution) 建议用持目标 pH 模式, 控 pH=7.0 + 碱度提到 200-237 (Good et al. 2018)metabRefTemp (三文鱼 15°C, 罗非鱼 28°C 等). 同一个代谢率驱动 O₂ 消耗与代谢热, 两处必须用同一参考温度. v1.9 修正: Q10 参考温度对齐到 metabRefTemp.| 鱼种 | tempOpt | v1.7 | v1.9 | 关系 |
|---|---|---|---|---|
| salmon (三文鱼) | 15°C | 0.32 @ 20°C | 0.2263 @ 15°C | 0.32 × 2^-0.5 = 0.2263 ✓ |
| turbot (大菱鲆) | 16°C | 0.28 | 0.1980 | 等价 |
| tilapia (罗非鱼) | 28°C | 0.16 @ 20°C | 0.2786 @ 28°C | 0.16 × 2^0.8 = 0.2786 ✓ |
| grouper (石斑鱼) | 27°C | 0.18 | 0.2924 | 等价 |
| bass (加州鲈) | 25°C | 0.19 | 0.2687 | 等价 |
| eel (鳗鲡) | 26°C | 0.13 | 0.1970 | 等价 |
| mandarin (鳜鱼) | 25°C | 0.18 | 0.2546 | 等价 |
| shrimp (对虾) | 28°C | 0.31 | 0.30 | -3% 轻微下调 |
co2Daily = o2FishDaily × 1.375 只算呼吸. 但硝化反应 NH₄⁺ + 2HCO₃⁻ + 2O₂ → NO₃⁻ + 2CO₂ 也产 CO₂.co2Daily = o2FishDaily × 1.375 + tanDaily × 6.286 (硝化 6.286 g CO₂/g TAN-N)buildLoanSchedule 等额本息公式 a = r × (1+r)^n / ((1+r)^n − 1) 在 r = 0 时除零产生 NaN, IRR 算不出. v1.9 修复: r = 0 时自动降级到等额本金分支 (数学等价). 影响政策性贴息贷款 / 零利率工况.o2ConeTopology (主路/旁路) / o2ConeHeadLoss_m (主路时主泵附加压头, 默认 3 m, 钳 [0, 15]) / o2BypassRatio (旁路占比 %, 默认 10, 钳 [5, 30]) / o2BypassPumpHead_m (旁路泵扬程, 默认 20 m, 钳 [5, 40]) / o2BypassPumpEta. 物理改动: (1) 主泵实际扬程 = mainPumpHead + o2ConeHeadLoss (mainline) 或 = mainPumpHead (bypass), 旁路时主泵不过锥子; (2) 氧锥规格 towerFlowM3h 随拓扑变 (mainline=Q 全流量, bypass=Q×ratio 小流量); (3) 旁路泵 P-602 加入设备清单 / CAPEX / OPEX / 热平衡, 1+1 备用模块化; (4) UI 加"氧锥压损 / 旁路占比 / 旁路泵 H" 3 个输入框, 含工程对照 (LHO/Speece/SOLVOX) tooltip. 1000t 三文鱼模型算例: bypass 主泵 488.3 kW + P-602 92.2 kW = 580.5 kW vs mainline 610.4 kW, 节能 30 kW; CAPEX 设备节省约 612 万元 (氧锥按小流量定价 + bypass 设计省下来的 CAPEX)V_total × exchangeDaily 算 (与"换水率"定义一致), TAN/NO₃ 按 V_disch × C_tank (溶解残留), TSS 按质量守恒 (含污泥进沉淀池, tooltip 明确说明)🔴 严重 bug (8 项): K-101 modulePerSpec 缺失 (#14) · 系统排水硬编码 7.5% (#20) · 反冲排污率字段已删但模板还在 (#21) · 增氧章节未区分拓扑 (#22) · air 模式没有 K-101 描述 (#23) · DO 行硬编码 (#24) · #25 灾难性: report.html `buildContext` return 漏 `workflow` 字段, 影响 55 处引用全部失效, 此 bug 潜伏 1+ 年被 nunjucks 优雅降级机制完全掩盖, 一行修复 · 23 处 *100 单位错误 (#25b)
🟡 中等 bug (4 项): pid.html isAirMode 改正向判定 (#6) · v1.7 新字段加钳制 (#13) · 主页面 TSS chip 加"含污泥"标签 + tooltip (#16) · finance-core.js OPEX 70/30 改用 computeOpexSplit() 真实拆分 (#19)
🟢 清理 (8 项): 液氧塔 silent fallback 加 warn (#2) · o2cone 冗余字段加说明 (#3) · 字符串补空格 (#7) · 删 P-602 死代码 (#8) · 注释更新 (#9) · drawMainPump 加 data-cx/cy + lookupEquipPorts .pump fallback (#18) · 删 skimmerWasteFlow 死字段 (#27) · IRAS_META.version 1.6.0 → 1.7.0 (#30)
🟠 精度优化 (4 项): AOP 臭氧剂量暴露 PROCESS_DEFAULTS 字段 (#28, 默认 0.5 g/m³, v1.8 加 UI) · 蛋分 DOM 移除公式重构为严格物料守恒 (#29, 稳态差异 0.33%) · CO2 风压钳制 [0.3, 10] kPa (#34) · T_room 钳制 ±2°C → ±5°C, 与产热推高物理一致 (#35)
🛡️ 鲁棒性 (3 项): 阶段 forEach 加 try/catch (#32) · calcCapex add() 加 isFinite 保护 (#37) · 所有阶段崩溃时加 console.warn 不静默 (#39)
parseFloat() || default 在 0 值场景 fallback 系统重构 — 推 v1.8v1.4 之前的输出是工程数据 (P&ID + 设备清单 + 财务表 Excel), 用户拿到这些后需要手动整合到 Word 可研报告里:
v1.5 加入可研报告生成器 (report.html), 把 iRAS 的工程财务数据自动套到 16 章扩展版可研模板, 输出 .docx 文档。预期把可研撰写时间从 1-2 个月压缩到 1-2 周。
| 章 | 内容 | 自动化率 |
|---|---|---|
| 1 | 总论 (项目概况 + 主要技经指标 + 主要结论) | 85% |
| 2 | 项目背景与建设必要性 | 50% |
| 3 | 市场分析与建设规模 | 60% |
| 4 | 建设场址与建设条件 | 30% |
| 5 | 工艺技术方案 (含工艺流程图) | 95% |
| 6 | 主要设备方案 | 100% |
| 7 | 土建/总图/公用工程 | 50% |
| 8 | 节能节水 | 70% |
| 9 | 环境影响评价 | 60% |
| 10 | 劳动安全卫生与消防 | 40% |
| 11 | 项目实施与组织机构 | 65% |
| 12 | 投资估算与资金筹措 | 95% |
| 13 | 财务评价 (8 张标准表 + 累计现金流 + Tornado) | 100% |
| 14 | 国民经济 / 社会效益评价 | 50% |
| 15 | 风险分析 | 70% |
| 16 | 结论与建议 | 80% |
加权平均自动化率约 70%, 用户需要补充的主要是: 项目身份 (20 字段)、场址自然条件、土建详细设计、消防/环评/安评等专项内容 (后三者必须由有资质机构出具)。
图表生成路径: 浏览器侧 SVG → Canvas → PNG → docx ImageRun, 中文字体使用系统 SimHei/Microsoft YaHei, 高清 2× DPR 渲染。
三文鱼 1000 t/年项目典型输出:
v1.3 输出综合成本元/kg 已经能告诉用户"建得起 / 养得起"; 但项目能否立项还需要回答财务可行性:
v1.4 加入独立的投资财务评价页面 (finance.html), 主页面 "💰 投资财务评价" 按钮一键打开, 输出标准的项目财务评价报告。
输出按 IRR 摆动从大到小排序的 Tornado 图, 一眼看出项目最敏感因子。基于 RAS 项目工业经验, 售价通常排第一。
finance.html 顶部 "📊 导出 Excel" 按钮一键导出, 包含:
finance.html 提供 17 个可调参数, 涵盖:
v1.2 之前 iRAS 输出是单循环系统设计: 一套主泵 + 一套 BF + 一套 RDF 等。但实际工业项目几乎没有这样建的:
v1.3 把 "单循环" 升级为 多模块并联 + N+1 关键设备备用, 是工程化布局的核心。
关键设备配 N+1 备用 + 自动切换:
多模块如果各自独立车间, 散热是 N 倍; 但实际工程中各模块通常共用大车间, 散热 ≈ 单车间 × 0.65-0.90 (cover 系数)。v1.3.x 引入共用车间散热系数 0.75 默认值, 用户可调 0.65-0.90。
v1.1 用单点工况 (源水温 + 室温 + COP 常数) 在中等气候下精度可接受, 但在极端场景下严重失真:
v1.2 实现完整双节点稳态: T_room/W_room 内生 (闭式解), Q_envelope/Q_evap/Q_vent 全建模, COP 温度修正。
水的热平衡 (kWh/d, 正=向水加热):
Q_net_water = + Q_metab (鱼代谢, 沿用 v1.1)
+ Q_pumps + Q_uv (设备产热, 沿用 v1.1)
+ Q_makeup_signed (补水温差, 扣板换 + 凝结回收)
− Q_pool_loss (池水→车间空气, U·A·ΔT)
− Q_envelope (墙+顶+地板+窗, 多 U 多 ΔT)
− Q_vent_sens (通风显热, 含热回收)
− Q_evap_latent (蒸发潜热, 凝结时反号 +)
车间空气节点 (内生, 闭式解):
T_room = (UA_pool·T_w + UA_to_outdoor·T_air + UA_floor·T_ground)
/ (UA_pool + UA_to_outdoor + UA_floor)
W_room = (β·ρ·cover·A·W_w_sat + m_air·W_air)
/ (β·ρ·cover·A + m_air) [饱和约束 RH ≤ 99%]
蒸发率 m_evap [kg/s] = β · ρ_air · cover · A_pool · (W_w_sat − W_room)
正值 = 蒸发 (水散热); 负值 = 凝结 (水吸热)
热泵 COP 修正:
COP_real = COP_nom × (1 − k × |T_source − T_ref|)
ASHP heat: T_ref=7, k=0.030; cool: T_ref=35, k=0.025
WSHP/GSHP/海水开式: 见 correctedCOP() 函数
v1.2 起统一使用双节点稳态闭式解 (T_room/W_room 内生), 不再保留 v1.1 单点工况兼容模式。所有项目须在地区预设中选择 (含 ⚙️ 自定义), 并在详细参数里填写 9 个气象数据 (T_air/T_source/RH 各分冬/夏/年)。如确需快速估算, 选 ⚙️ 自定义 + 自定义工况即可。
v1.0 在 calcStageLoad 中用 feedDesign = feedMax × peakFactor 算所有"日产污染物", 但 feedMax 已是日峰值, 再乘 1.2-1.5 在量纲上是"日总量再放大", 所有下游负荷被一刀切偏大 17%。v1.1 严格分离三个时间尺度:
peakFactor 物理意义钉死: 代谢污染物 (TAN/O₂/CO₂) 小时峰值 / 全日均速率, 默认 1.5 (Timmons & Ebeling 2010)。
不同设备的物理响应特性不同, v1.1 按"快/慢动力学"分别选基准:
v1.0 增氧设备实际等效峰均比仅 1.2 (偏小), v1.1 用 1.5, 增氧装机大约 +37%, 反映现代化 RAS 投喂峰值响应需求。
aopDOMRemoval 默认 5%, 可调skimmerTSSEffo2DOMfactor (BF 风机选型相应增大)o2FishFactor = o2BaseFactor × Q10^((T-20)/10)。物种库新增 o2BaseFactor + o2Q10, 苗种期可显式覆盖。鲑鱼 ~0.22, 鳗鲡 0.20, 罗非 0.27, 石斑 0.30, 对虾 0.40。UI 工艺面板输入框默认显示自动算的值 (斜体表示自动), 用户改写后用用户值; 清空后恢复自动。v1.0 CO₂ 脱气仅在增氧节点扣 70% (写死), v1.1 升级为独立设备:
在小时峰值/日量之上, 按设备分别加运行裕度。默认值已校准, 不与 peakFactor 双重叠加:
| 设备 | 默认值 | 物理含义 |
| 生物滤池 | 1.15 | 滤料老化 + 投喂峰值缓冲 |
| 鱼池增氧 | 1.10 | 峰值响应快, peakFactor 已含裕度 |
| BF 曝气 | 1.10 | 同上 |
| 微滤/反硝化/蛋分/UV | 1.10 | 通用工程裕度 |
| CO₂ 脱气 | 1.15 | G:L 不确定性较大 |
修正后 25 个阶段 DO 全部达标, 不再误报警。
每个阶段卡片底部新增 "📊 文献基准对照", 8 个无量纲强度指标对照工业 RAS 实测/文献区间。本方案落入区间内显示 ✅, 偏离显示 ⬇️低/⬆️高。综合通过率 ≥75% 视为合理。
v1.0 用 V_tank (鱼池水体) 算稳态浓度和换水量, 忽略了工艺水体 (BF/RDF/管路/脱气塔等)。v1.1 引入完整 V_total 建模:
v1.0 热泵能耗只算"补水温差", 严重低估 80x 倍。v1.1 引入完整热平衡:
Q_net = Q_metab + Q_pumps + Q_uv + Q_makeup - Q_loss
iRAS 默认设备单价是 中国行情 (regionFactor=1.0)。不同地区工程总造价差异显著, 数值基于实测项目反推 (挪威 10000t 三文鱼 RAS 项目 15 亿元):
| 地区 | 系数 | 备注 |
|---|---|---|
| 🇨🇳 中国 (默认) | 1.0× | 国产设备 + 国内工程 |
| 🇻🇳 东南亚 | 1.1× | 设备进口少, 人工接近 |
| 🇨🇱 智利/南美 | 1.5× | 设备半进口, 工程标准中等 |
| 🇺🇸 北美 | 1.7× | 本地工业链 + 较高人工 |
| 🇳🇴 北欧/挪威 | 2.0× | 高标准 + 高人工 |
v1.0 是线性 CAPEX (产量 × 单位成本), 不符合工业经济学。 v1.1 引入 Lang factor 规模效应, 反映"项目越大, 单位 CAPEX 越低 (摊销自控/设计/管理)"的真实规律:
规模因子 = (1000 / 实际产能)^规模指数
| 年产能 | 规模因子 | 含义 |
|---|---|---|
| 500 t | ×1.07 | 小型试点, 略偏贵 7% |
| 1000 t (基准) | ×1.00 | iRAS 单价校准点 (国内中型) |
| 2000 t | ×0.93 | 中型, -7% |
| 5000 t | ×0.85 | 大型, 省 15% |
| 10000 t | ×0.79 | 超大型, 省 21% |
| 20000 t | ×0.74 | 巨型, 省 26% |
实测验证: 挪威 10000t × regionFactor 2.0 = 14.85 亿元, 与用户提供的实测数据 (15 亿) 偏差仅 -1% ✅。
v1.1 系列每一处参数都基于真实工业项目反推, 不是教科书估算:
循环水养殖系统 (Recirculating Aquaculture System, RAS) 是一种将养殖用水经过物理、化学和生物处理后循环使用的集约化水产养殖技术。与传统的流水式养殖不同, RAS 仅需补充少量新水 (通常每天换水量 5-15%), 其余 85-95% 的水经处理后循环回用。
RAS 的核心思想是: 在一个封闭或半封闭的系统中, 通过一系列水处理设备, 持续去除鱼类代谢产生的废物 (氨氮、悬浮固体、溶解有机物、二氧化碳), 同时补充溶解氧, 从而维持水质在鱼类健康生长的最适范围内。
一个典型的 RAS 系统由以下核心组件构成: 养殖池 (鱼池/虾池)、固液分离设备 (转鼓微滤机 RDF)、生物过滤器 (MBBR 生物滤池)、消毒设备 (UV 紫外线)、增氧设备 (液氧系统或曝气系统)、以及脱气设备 (CO₂ 脱气塔)。
| 对比维度 | 池塘养殖 | 流水式养殖 | RAS 循环水养殖 |
|---|---|---|---|
| 用水量 | 蒸发补水 | 大量取水+排放 | 仅补充 5-15%/天 |
| 养殖密度 | 0.5-5 kg/m³ | 10-30 kg/m³ | 30-100 kg/m³ |
| 水质控制 | 靠天然净化 | 靠水量稀释 | 精确工艺控制 |
| 占地面积 | 大 | 中 | 小 (是池塘的 1/10-1/50) |
| 环境影响 | 面源污染 | 排水污染 | 零排放或极少 |
| 选址限制 | 需靠近水源 | 需靠近水源 | 几乎不受限制 |
| 初始投资 | 低 | 中 | 高 |
| 运行成本 | 低 | 低 | 中高 (电费/液氧) |
| 产品质量 | 波动大 | 较稳定 | 最稳定 |
| 生物安全 | 低 | 低 | 高 (封闭) |
| 场景 | 典型品种 | 密度 kg/m³ | 水温 °C | 特点 |
|---|---|---|---|---|
| 冷水鱼工厂 | 三文鱼、虹鳟 | 50-80 | 12-15 | 淡水苗种+海水养成, 周期长 |
| 温水鱼工厂 | 加州鲈、鳜鱼 | 40-60 | 24-28 | 国内市场需求大, FCR 低 |
| 海水鱼工厂 | 大菱鲆、石斑 | 30-70 | 16-27 | 需海水/半咸水 |
| 鳗鲡工厂 | 日本鳗、欧洲鳗 | 40-60 | 26-28 | 粉料投喂 |
| 对虾工厂 | 南美白对虾 | 2-15 | 28-31 | 密度低但投饵率高 |
一个标准的 RAS 系统, 水流按以下顺序循环:
其中方括号 [ ] 表示可选单元, 根据品种和水质需求决定是否安装。
在 iRAS 平台中, 上述流程被精确建模为主流串联 + 旁路并联的混合模型, 每个处理单元的去除效率独立计算, 沿程浓度逐步递减。
| 处理单元 | 去除目标 | 原理 | 典型效率 |
|---|---|---|---|
| 转鼓微滤机 (RDF) | TSS (悬浮固体) | 60-90 μm 筛网物理拦截 | 60-90% |
| 蛋白分离器 | DOM + 细颗粒 TSS | 气浮泡沫分离, 可配臭氧 | DOM 40-70% |
| MBBR 生物滤池 | TAN (氨氮) | 硝化菌将 NH₄ 氧化为 NO₃ | 60-90% |
| 反硝化反应器 | NO₃ (硝酸盐) | 缺氧条件下还原 NO₃ 为 N₂ | 50-80% |
| UV 紫外线 | 细菌/病毒/寄生虫 | 紫外线破坏 DNA | 99-99.9% |
| AOP 高级氧化 | Geosmin/2-MIB (土腥味) | 臭氧+UV 协同氧化 | 80-95% |
| 增氧塔/曝气 | DO (溶解氧) | 液氧溶解或空气曝气 | 110-165% 饱和度 |
| 脱气塔 | CO₂ (二氧化碳) | 逆流空气吹脱 | 60-85% (G:L=3-7) |
TAN 是鱼类蛋白质代谢的主要含氮废物, 通过鳃排出。TAN 在水中以离子态 NH₄ 和分子态 NH₃ 两种形式存在, 其比例受 pH 和温度影响。NH₃ 对鱼有强毒性, pH 越高、温度越高, NH₃ 占比越大。RAS 中 TAN 浓度通常控制在 0.5-2.0 mg/L, NH₃ 应低于 0.02-0.05 mg/L。
硝化中间产物, 对鱼毒性仅次于 NH₃。RAS 中 NO₂ 应低于 0.5 mg/L。持续偏高说明硝化菌群不完整 (Nitrobacter 不足), 通常出现在系统启动初期。
硝化最终产物, 毒性较低, 但在闭合循环中持续积累。长期高浓度 NO₃ (> 100-200 mg/L) 抑制鱼生长。反硝化或换水是控制手段。
鱼类和硝化菌都需要充足 DO。鱼池 DO 通常要求 > 6 mg/L (冷水鱼) 或 > 5 mg/L (温水鱼)。纯氧系统可将 DO 提升至 110-165% 饱和度 (超饱和), 为高密度养殖提供保障。
DO 饱和度采用 Benson & Krause (1984) 公式精确计算, 详见第 7 章。
鱼呼吸产生 CO₂, 在封闭系统中积累会导致 pH 下降、鱼应激。脱气塔通过逆流空气吹脱去除; 空气曝气本身也在吹脱(见 15.3c)。
| 水温档 × 盐度 | 阈值 mg/L | 算式 |
|---|---|---|
| 温水 · 淡水 (< 5‰) | 30 | tankCO2_max_warm |
| 温水 · 海水 (≥ 5‰) | 22.5 | 30 × marineCO2Factor 0.75 |
| 冷水 · 淡水 | 20 | tankCO2_max_cool |
| 冷水 · 海水 | 15 | 20 × marineCO2Factor 0.75 |
marineCO2Factor = 0.75 无出处 —— v2.3.3 专项核查, 结论是暂不动。
它来自 iRAS 既有值(海水 15 / 淡水 20), 代码中无出处标注,
教科书亦未按盐度区分 CO₂ 限值; 0.75 实为从"想得到 15 这个结果"倒推。
"海水鱼对 CO₂ 更敏感"这一含义未找到生理学依据。maxEff × f(G:L) × f(填料高度) × f(进风CO₂),
三条曲线里没有一条含盐度。而级联塔实测显示海水吹脱效率显著低于淡水
(归因于无机碳电离分数差异)。这与上一条是两个独立问题, 只是表面上互相抵消 ——
限值压低 0.75 让海水更容易报超标, 看似"考虑了海水难处理", 但机理错 ⇒ 处置方向也错
(用户以为该压低浓度, 实际该加大 G:L 或加高填料)。
⇒ 两个错误方向相反、量级相当, 只撤其一反而更偏, 故维持现状待同口径实测。
iRASCarbonate.K1K2_M10 零新常数算出。本版实测:
| 工况 | T °C | S ‰ | pH | α₀ |
|---|---|---|---|---|
| 同温同 pH 对照 · 淡水 | 20 | 0 | 7.3 | 14.75% |
| 同温同 pH 对照 · 海水 | 20 | 30 | 7.3 | 5.24% |
| 罗非鱼(淡) | 28 | 0 | 7.3 | 13.74% |
| 三文鱼苗种(淡) | 12 | 0 | 7.56 | 9.71% |
| 三文鱼成鱼(海) | 15 | 30 | 7.17 | 7.59% |
| 大菱鲆(海) | 16 | 28 | 7.3 | 5.76% |
| 石斑鱼(海) | 27 | 30 | 7.3 | 4.70% |
海/淡比值 0.355 —— 比现挂在限值上的 0.75 严厉一倍。数据本身是对的, 但拿它当折减系数是错的:
水在填料塔内停留数秒至数十秒。CO₂(aq) 被气泡带走后, HCO₃⁻ 会持续再平衡补充,
所以塔实际带走的量远大于进塔那一刻的 α₀ 份额。而 co2StripperEff = 0.65
是实测填料塔的表观去除率, 本身已经包含了这份再平衡
(综述明确警告: 养殖界几乎所有 CO₂ 去除数据都是碳酸平衡重建后的表观值)。
再乘一次 α₀ 比值, 等于把再平衡算了两遍 —— 海水塔效率会被打到淡水的 36%。
⇒ α₀ 是上游约束, 不是去除上限。 正确模型是「再平衡速率 vs 塔内停留时间」
的动力学竞争, 需要碳酸再平衡速率常数 —— 本模型没有, 那是真正的建模工作而非改个系数。
⚠ 之所以把这条完整留档, 是因为它看起来太有道理了: 有物理机理、有现成模块、
零新常数。不留档, 下一个人极可能去做; 做完之后结果更偏, 却因"有物理依据"而更难被质疑。
isFry 已用于 TGP 气泡病阈值(苗种 110% vs 成鱼 115%),
说明苗种确有更高敏感性; 产业侧又指出空气曝气 + 关塔工况恰恰在苗种/小鱼期最常见
—— 也就是说, 这个问题正落在最常用的工况上。co2TargetMgL 设得比成鱼期更保守
(该参数有 UI 入口, 可逐阶段设定)。若日后取得成文出处再议。详见 15.3c.4。
包括残饵、粪便、脱落的生物膜碎片。高 TSS 会堵塞鱼鳃、消耗溶氧、滋生有害菌。RAS 中 TSS 通常控制在 < 15 mg/L。
包括溶解态的蛋白质、脂肪酸、腐殖酸等。DOM 不能被 RDF 拦截, 也不能被 BF 有效去除, 在闭合循环中会积累, 导致水色发黄、起泡、产生土腥味。蛋白分离器和 AOP 是 DOM 的主要去除手段。
| 参数 | 单位 | 三文鱼 | 加州鲈/鳜 | 罗非 | 对虾 | 石斑 | 大菱鲆 | 鳗鲡 |
|---|---|---|---|---|---|---|---|---|
| TAN | mg/L | < 1.0 | < 1.5 | < 2.0 | < 1.5 | < 1.0 | < 1.0 | < 1.5 |
| NO₂-N | mg/L | < 0.3 | < 0.5 | < 1.0 | < 1.0 | < 0.5 | < 0.5 | < 0.5 |
| NO₃-N | mg/L | < 80 | < 100 | < 200 | < 100 | < 80 | < 80 | < 100 |
| DO | mg/L | > 6 | > 5 | > 4 | > 5 | > 5 | > 6 | > 5 |
| CO₂ v2.3.3 校正 | mg/L | < 20/15① | < 30 | < 30 | < 22.5 | < 22.5 | < 15 | < 30 |
| TSS | mg/L | < 10 | < 15 | < 25 | < 15 | < 15 | < 10 | < 15 |
| pH | — | 6.5-7.5 | 6.8-7.8 | 6.5-8.5 | 7.5-8.5 | 7.5-8.2 | 7.5-8.2 | 7.0-8.0 |
| 温度 | °C | 10-16 | 22-28 | 25-32 | 28-32 | 24-30 | 14-18 | 24-28 |
| 盐度 | ‰ | 0→30 | 0 | 0-15 | 5-35 | 25-35 | 25-35 | 0-5 |
① 三文鱼跨盐度: 苗种/幼鱼期淡水 → 阈值 20; 中/成鱼期海水(12→30‰)→ 阈值 15。
CO₂ 行由本版按 3.1.5 的分档公式逐鱼种实算校正 —— 旧表七列错六列, 根因是 v2.0 改分档时本表没跟。
其余各行为文献耐受范围, 与模型阈值不是同一口径: 模型的 DO 判据是
max(DOmin_satRatio × DO饱和, DOmin_abs) 双判断(见 3.1.4 的 v1.1 注),
本表 DO 行只给 DOmin_abs 那一半。
RAS 水质管理的核心是"稳定"——参数在安全范围内的波动远比绝对值更危险:
理解 RAS 中的氮循环是工艺设计的基础。所有氮素来源于饲料蛋白, 经过一系列生物化学转化, 最终以 N₂ 气体形式离开系统。
鱼类摄食后, 饲料蛋白被消化吸收, 其中:
iRAS 中 TAN 产生量的计算公式:
其中 TAN 系数 (tanCoef) 默认 0.092 (Timmons & Ebeling 2010), 逐鱼种可覆盖:
| tanCoef | 鱼种 | 说明 |
|---|---|---|
| 0.085 | 罗非鱼 Tilapia tilapia | 耐高密度; 植物蛋白配方比例高, 氮排放低于肉食性鱼 |
| 0.092 | 三文鱼 Salmon salmon | 立体水柱泳鱼, 鲑科大池深, 商业 7-12 m; 跨盐度(淡水→海水) |
| 0.092 | 大菱鲆 Turbot turbot | 底栖鱼, 浅池取单层底面积, 不超过 1.2 m |
| 0.092 | 加州鲈 Largemouth Bass bass | 淡水温水肉食鱼, 立体水柱 |
| 0.092 | 鳗鲡 Eel eel | 底栖, 中等浅 |
| 0.092 | 南美白对虾 L.vannamei shrimp | 底栖 + 水柱, 浅于其他温水鱼 |
| 0.092 | 自定义鱼种 Custom custom | 通用缺省, 供用户自定义鱼种起步 |
| 0.100 | 鳜鱼 Mandarin Fish mandarin | 同加州鲈; ⚠ 本库只有两个阶段 |
| 0.110 | 石斑鱼 Grouper grouper | 半底栖; ⚠ 成鱼期池深回落而非加深 |
〔v2.3.3 校正〕旧文写「海水肉食鱼 tanCoef 略高(大菱鲆 0.092, 石斑 0.110, 鳜 0.100)」——
漏了罗非鱼 0.085 这个唯一的下偏值, 而且"海水肉食鱼"这个归类不成立:
鳜鱼是淡水鱼, 大菱鲆是海水鱼但取的正是默认值 0.092、并不偏高。现按实际取值重列。
⚠ tanCoef 是逐阶段字段(经鱼种库 → sp 白名单 → 消费点转发),
属本库反复出问题的那条链, 由断言 M15 压着。
硝化是 RAS 中最关键的生物过程, 由两类自养菌在有氧条件下完成:
从工程角度, 硝化的三个关键化学计量关系:
在 iRAS 中, 硝化耗氧由 BF 粗孔曝气独立供应, 不占用鱼池主增氧的额度。这一O₂ 按位置分配原则避免了传统计算中常见的氧气重复计算问题。
反硝化在缺氧条件下, 由异养菌利用外加碳源 (甲醇) 将 NO₃ 还原为 N₂ 气体:
反硝化的关键化学计量:
denitriAlkRecovery = 2.8 —— 部分碱度被反硝化菌
自身合成消耗, 且旁路里总有一部分水未完全缺氧, 工程实测普遍低于理论值。
⚠ 本项目物质平衡核算曾三次错在口径上, 其中一次正是"用了理论 3.57 而非工程 2.8"。
详见 12.2。iRAS 中反硝化作为旁路设计——分流一部分循环水进入缺氧反应器, 处理后汇回主流。
反硝化可以同时降低 NO₃ 浓度和减少碱度消耗。默认旁路比 denitriFlowPct = 2%
(可调 0-20; 设 0 表示无反硝化)。
〔v2.3.3 校正〕旧文写"分流 5-15%"是 v1.9.2 之前的口径(当时默认 10%)。
改小的原因见 12.4: iRAS 的换水率刻意压在产业下沿(极致节水取向) ——
在这套换水率下反硝化不是可选项而是必需项, 但旁路比并不需要很大就能压住 NO₃。
⚠ 反过来说: 若把 denitriFlowPct 设为 0, 鲑鱼稳态 NO₃-N 可达 414 mg/L
——那是真实后果不是算错(产业"无反硝化 RAS"通常 50-150 mg/L, 因其补水强度高 3-10 倍)。
denitriAlkRecovery, 非理论 3.57
如果净消耗 > 0, 需要投加碱源维持 pH:
其中 0.595 是 NaHCO₃ 到 CaCO₃ 的换算系数 (50/84 = 0.595)。
反硝化不仅降低 NO₃, 还能回收碱度、减少 NaHCO₃ 用量。一个设计良好的反硝化支路可以减少 30-50% 的碱度投加量。
鱼池 pH 不是一个独立的自由参数 — 它由碳酸盐系统确定。总碱度 TA (由 NaHCO₃ 投加维持设定值) 与溶解 CO₂ (来自呼吸 + 硝化产) 一起决定 pH、CO₂ / HCO₃⁻ / CO₃²⁻ 物种分布、非离子化 NH₃ 占比 (剧毒) 以及方解石饱和度 Ω。iRAS v1.9 对每个阶段调用专门的碳酸模块求解此平衡。
给定 TA 和溶解 CO₂, 碳酸模块求解质子平衡方程并反推完整物种分布:
解离常数:
内部求解在 SWS (Seawater Scale) 标度上进行, 但报告的 pH 转换到 free (自由 / 浓度) 标度。两者关系:
用 free 标度报告 pH 的优势: 避免 fH 修正导致的"NBS 探头在淡水中读数偏高 0.15"问题, 直接对应淡水探头读数。
溶解氨以两种形式共存: 离子化 NH₄⁺ (无毒) + 非离子化 NH₃ (剧毒)。两者占比由 pH 和 T 决定:
典型数值 (T = 15°C 三文鱼工况):
| pH | fNH3 (%) | TAN = 1 mg/L 时 NH₃-N |
|---|---|---|
| 6.5 | 0.05% | 0.5 μg/L |
| 7.0 | 0.16% | 1.6 μg/L |
| 7.5 | 0.50% | 5.0 μg/L |
| 8.0 | 1.55% | 15.5 μg/L |
| 8.5 | 4.66% | 46.6 μg/L |
工程意义: 同样的 TAN 浓度, pH 从 7.0 升到 8.0, NH₃ 浓度增加近 10 倍。这是为什么高 pH 工况 + 高 TAN 工况是急性死亡风险, 而 v1.7 之前 iRAS 无法识别此风险。
鱼种长期暴露 NH₃-N 上限 (基于 Fivelstad / Calabrese 等):
苗种期对 NH₃ 更敏感, 通常取上述限值的 50%。
Van Slyke 缓冲强度 β 定义为: 维持给定 pH 变化所需的碱度变化量。
工程意义: β 越大, 碱度抗酸冲击越稳, 投喂后 pH 波动越小。典型值:
| 工况 | β (mg/L CaCO₃ per pH) | 评价 |
|---|---|---|
| 淡水 苗种期 (TA=150) | 350 | 中等 |
| 淡水 罗非鱼成鱼 (TA=150) | 350 | 中等 |
| 海水 三文鱼成鱼 (TA=150) | 477 | 较强 (含硼酸盐) |
| 商业 Atlantic Sapphire 风格 (TA=237) | 700+ | 强 (推荐高密度工况) |
方解石饱和度 Ω (仅海水):
Ω = 1 为饱和, Ω > 1 过饱和有 CaCO₃ 沉积风险, Ω < 1 不饱和。海水 RAS 典型工况 Ω = 0.5-1.5, 接近饱和但避免沉积堵塞设备。
iRAS 的氮链只有 TAN 与 NO₃⁻ 两个态, 不含亚硝酸盐 NO₂⁻。 这是稳态设计口径的固有边界, 不是待补的功能缺口 —— 区别很重要, 下面说清楚。
硝化是两步反应, 由两类菌分别完成:
成熟菌群的稳态下, 第二步远快于第一步, NO₂⁻ 只是一个浓度极低的中间态,
把它显式建模对稳态设计结果没有影响 —— 这正是 iRAS 把两步合并为
TAN → NO₃⁻ 的依据, 与工程上按 TAN 负荷选填料容积的做法一致。
NO₂⁻ 真正危险的时候恰恰是非稳态: 系统启动培菌期 (AOB 先于 NOB 建立)、 投喂量阶跃、换水/换料/用药造成的菌群冲击 —— 此时两步失衡, NO₂⁻ 出现尖峰, 是 RAS 最主要的急性失效模式之一。此外 NO₂⁻ 的毒性形态 HNO₂ 会自抑制 NOB, 形成正反馈, 使尖峰更陡。
已具备的条件: v1.9 之后模型有了 pH 与 [H⁺], 因此 HNO₂ 占 NO₂⁻ 的比例 (pKa ≈ 3.15) 在数学上几乎是免费的。但这只是一个分数, 不是一个模型 —— 要表达 NO₂⁻ 尖峰, 需要 AOB/NOB 两步动力学 + 时间步进 + 菌群量状态变量, 那是另一个量级的工作, 且需要标定数据。列为架构级立项, 不在补丁版范围。
iRAS v1.9 在每个阶段提供两种控制模式 (UI 工艺参数面板"pH 控制"下拉选择):
| 模式 | 输入 | 输出 | 适用场景 |
|---|---|---|---|
| 持碱度 (alk) | 碱度目标 (mg/L CaCO₃, 默认 150) | pH 由碳酸盐平衡涌现 | 淡水中小项目, 运维简单, 碱度滴定即可 |
| 持目标 pH (ph) | 目标 pH (默认 7.0) | 工具反推所需碱度设定值 (Alk req) | 大型海水 RAS, 业主想精确控制 pH (实测 7.0-7.2 防 NH₃ + 防 CaCO₃ 沉积) |
商业实测数据 (Good et al. 2018) 显示大型 post-smolt 三文鱼 RAS 实际碱度约 237 mg/L CaCO₃ (远高于淡水默认 150), 这是因为高密度海水工况需要:
用户可在工艺面板把碱度目标改成 200-250 以匹配国际商业工程实际。
iRAS 碳酸模块与国际标准实现 PyCO2SYS 1.8.3 (opt_k_carbonic=14) 进行严格验证, 覆盖盐度 0-35 与温度 12-28°C 全范围:
| 验证项 | iRAS vs PyCO2SYS 偏差 |
|---|---|
| 正向 pH (free / NBS 标度) | max|ΔpH| = 1×10⁻⁵ |
| 反向碱度求解 (solveAlk) | 0.08 μmol/kg |
| NH₃ 占比 fNH3 | 1.5×10⁻¹⁶ (机器精度) |
| 方解石饱和度 Ω | 0.006% |
这是实验室级精度, 可用于学术研究和工程设计。
本章求解的 pH / NH₃ / CO₂ 都是日均稳态 (慢性暴露) 值, 不是投喂瞬时峰值。投喂后短期瞬态 (2-4h 窗口) 由:
与 DO 不同 — DO 必须按投喂瞬时峰值选型 (避免急性窒息), 而 CO₂/pH/NH₃ 按日均稳态合规即可 (慢性暴露阈值)。
RAS 工程设计的第一步是从年产量目标反推系统规模。这决定了后续所有水处理设备的选型依据。
iRAS 采用连续错峰养殖模式建模: 养殖场分批错峰投苗, 使每天都有成鱼出塘。稳态下, 系统内每个阶段同时存在不同大小的鱼群。
适用 Little's Law (排队论基本定理):
其中 L = 系统内平均数量 (尾), λ = 到达速率 (尾/年), W = 停留时间 (年)。
关键: Little's Law 应用于"尾数"而非"质量"。一尾三文鱼从 0.1g 长到 5000g, 体重变化 5 万倍; 如果用质量, 会严重高估上游阶段的存塘量。
多阶段 RAS 的尾数从最后阶段向前递推, 每一级通过损耗率放大:
损耗率包含死亡、淘汰、逃逸, 苗种期通常最高 (10-30%), 成鱼期最低 (2-5%)。
v1.0 用 feedDesign = feedMax × peakFactor 算所有"日产污染物", 偏大约 17%。v1.1 严格分离三个时间尺度:
biomass 是稳态存塘量, feedRate 是阶段末最大日投饵率。污染物日产量 (TAN/TSS/DOM/CO₂) 都按 feedMax 算 (不含 peakFactor)。
peakFactor 物理意义: 代谢污染物小时峰值/全日均速率, 默认 1.5。快动力学设备 (鱼池增氧、BF 风机) 按 xxxPeakHourly × safety 选型。
其中 yearGrowth 是阶段年鱼肉增重, FCR 是阶段饲料系数。
确定了投饵量后, 即可计算各类污染物的日产生量。v1.1 严格区分日量、小时峰值、日均三套字段。
其中 tanCoef 默认 0.092 (Timmons & Ebeling 2010), 海水肉食鱼略高 (0.10-0.11)。
PROCESS_DEFAULTS 里的可调字段(见附录 G)。数值未变,但「常数」与「默认值」在工程上是两回事——后者用户可以改,文档若写成常数会让人以为改不了。v1.1 把鱼生理耗氧按物种 + 温度自动算 (取代 v1.0 的 0.25 一刀切)。
| O₂ 来源 | 计算公式 | 供应设备 | 说明 |
|---|---|---|---|
| ① 鱼生理耗氧 | feedMax × o2FishFactor | 鱼池主增氧 | 物种特性 + Q10 自动算 |
| ② 硝化菌耗氧 | TAN_Daily × 4.57 | BF 粗孔曝气 | NH₄→NO₃ 化学计量 |
| ③ 异养菌耗氧 | feedMax × o2DOMfactor | BF 粗孔曝气 | v1.1 默认 0.10 (Boyd 2018) |
其中 1.375 = 44/32, 是 CO₂ 和 O₂ 的摩尔质量比 (RQ ≈ 1)。CO₂ 只按鱼虾生理耗氧计算, 不含硝化耗氧 (硝化反应不产生 CO₂)。
这是 iRAS 的核心计算引擎。传统 RAS 设计常用近似加法公式 C = Δ / Ση 估算稳态浓度, 但当系统包含多个串联和旁路处理单元时, 加法公式会产生显著误差。iRAS 采用精确乘法循环方程, 确保质量守恒严格成立。
考虑一个稳态循环系统: 水从鱼池流出, 经过 n 个处理单元后回到鱼池。每个处理单元有各自的"通过率" (1 − η)。
设:
稳态条件:
联立求解:
R 越小 (总去除率越高), C_out 越低, 水质越好。
全流量通过, 注意是乘法:
即总去除率 92.5%。加法 0.75 + 0.70 = 1.45 > 100% 物理上不可能。
以蛋分为例, 旁路流量比 α=20%, 单次去除 η=70%:
物理含义: 80% 的水不经处理 + 20% 的水去除了 70% → 混合后整体去除 14%。
精确循环方程的优美性质: 沿程浓度递减后, 最终回水浓度恰好等于 C_in。iRAS 在每次计算后内部验证此闭合条件 (误差 = 0)。
| 参数 | 处理路径 | R 表达式 |
|---|---|---|
| TAN | BF 硝化 + 换水 | (1−η_bio)(1−d) |
| TSS | RDF + 蛋分(旁路) + BF + 换水 | (1−η_rdf)(1−η_skim)(1−η_bioTSS)(1−d) |
| DOM | 蛋分(旁路) + AOP(旁路) + 换水 | (1−η_skim_sys)(1−η_aopDOM_sys)(1−d) |
| NO₃ | 反硝化(旁路) + 换水 | (1−η_denitri_sys)(1−d) |
| CO₂ | 脱气塔 + 池内曝气 + 换水 | (1−η_co2)(1−d), 其中 η_co2 = η_塔 + η_曝气 |
| Geosmin | AOP(旁路) + 换水 | (1−η_aop_sys)(1−d) |
dilution 在不同参数中的影响差异巨大:
| 参数 / 工艺配置 | η_total | dilution 是否主导? | dilution 敏感度 |
|---|---|---|---|
| TAN (BF 70%) | 70% | 否 | < 0.1% |
| TSS (RDF + 蛋分 + BF) | 82% | 否 | < 0.1% |
| CO₂ (脱气塔 65%) | 65% | 否 | < 0.1% |
| NO₃ (反硝化 6%) | 6% | 边缘 | ~1% |
| NO₃ (无反硝化) | 0% | 是 | 缩放为 V_tank/V_total |
| Geosmin (无 AOP) | 0% | 是 | 缩放为 V_tank/V_total |
| DOM (无蛋分) | 0% | 是 | 缩放为 V_tank/V_total |
当 η = 0 时, R = 1 − dilution, 1−R = dilution, C_out = Δ/dilution。dilution 翻倍, 浓度减半。这是 v1.1 系统体积建模 + 换水率口径修正的关键意义。
传统 RAS 设计常把整个系统简化为"鱼池水体", 忽略了:
这些工艺水体合计 V_process 通常占 V_tank 的 30-60%, 是不可忽略的。
| 工艺单元 | 计算公式 | 物理依据 |
|---|---|---|
| V_RDF v1.5+ 修正 | Q × rdfHRT_min / 60 | RDF 集水池 HRT, 默认 rdfHRT_min = 0.5 分钟 (v1.6 中位, 兼顾紧凑与缓冲); 紧凑型 0.3 (YUTANK/Hydrotech 工业实测 18s); 设计院传统 1.5-2 min (含外置缓冲池) |
| V_BF (含填料水) v1.5+ 修正 | bioVolume / fillRatio | bioVolume 是填料净体积, fillRatio 默认 0.5 (Rusten 2006 工业惯例): V_BF = 2 × bioVolume; fillRatio 0.7 (高密度): V_BF = 1.43 × bioVolume |
| V_skim | skimmerVolume | 蛋分塔水容积 (已是水量) |
| V_UV | 5 m³ (固定) | UV 流通式, 内部水量极小 |
| V_AOP | aopVolume | AOP 反应池水容积 (已是水量) |
| V_denitri | denitriVolume | 反硝化反应器 |
| V_co2 v1.5+ 修正 | degasArea × co2VolFactor | 脱气塔水容积, 默认 co2VolFactor = 0.7 (集水 0.5m + 填料湿水 0.2m, 国内中型项目); 可调 1.2 (1m 集水 + 0.2m 填料水, 鲑鱼场深塔) |
| V_aerator | Q × 0.5 / 60 | 增氧锥 HRT ≈ 30s |
| V_sump v1.3.x | clamp(Q/30, 20, 200) | 集水池, 工程惯例 |
| V_pipes | V_tank × 5% | 管路+集水井+缓冲池, 工程经验 |
× 1.3 是经验估计 (假设填料 35% + 水 65%), 但工业上 fillRatio 是设计变量, 应该用代码统一。
总系统体积:
对稳态浓度 C_out = Δ/(1−R) 影响:
因此 V_total 影响稳态浓度的程度取决于参数处理工艺:
用户填的"exchangeDaily 5%/d"在不同口径下含义不同:
| 口径 | 含义 | 实际换水量 | 使用方 |
|---|---|---|---|
| V_tank (v1.0) | 鱼池每天换 5% | V_tank × 5% | 国内传统养殖户 |
| V_total (v1.1) | 系统总水体每天换 5% | V_total × 5% (多 50%) | Timmons 教科书 / 国家海水鱼体系 / 大型工业项目 |
| 工艺单元 | 体积 (m³) |
|---|---|
| 鱼池水体 V_tank | 3,385 |
| BF 含水 | 570 |
| CO₂ 脱气 | 350 |
| RDF 集水 | 338 |
| 集水池 S-101 v1.3.x | 200 |
| 管路 + 缓冲 | 169 |
| 反硝化 | 129 |
| 增氧锥 | 85 |
| 蛋分塔 | 74 |
| AOP 反应池 | 17 |
| UV | 5 |
| V_process 合计 | 1,938 (V_tank 的 57%) |
| V_total = V_tank + V_process | 5,323 |
转鼓微滤机 (RDF) 是 RAS 中的第一道防线, 通过 60-90 μm 不锈钢筛网物理拦截水中的悬浮固体。工作原理: 养殖水从转鼓内侧流向外侧, 固体颗粒被拦截。当筛网两侧压差达到设定值时, RDF 内嵌反冲机构自动启动反冲洗 — v1.7 起反冲泵不再作为独立设备列项, 因为工程实际中所有商用 RDF (Hydrotech / Faivre 等) 整机出厂均含反冲泵, 反冲水绝大部分经污泥沉淀池回循环 (Sharrer 2010 实测 95-98% 清液回流)。
| 参数 | 典型值 | 说明 |
|---|---|---|
| 筛网孔径 | 60-90 μm | 越小去除率越高, 但易堵塞 |
| TSS 去除率 | 60-90% | iRAS 默认 75% |
| 处理流量 | 循环流量 × safetyRDF | v1.1: 默认 1.10 |
| RDF 集水池 HRT | 0.1-5 min | iRAS v1.6 默认 0.5 min (中位) |
v1.6 之前, iRAS 工艺面板有 "RDF 反冲(%) 2%" 输入, 但 4870 m³/d ÷ V_total = 101%/d 物理荒谬 (远超合理换水率 1-5%/d)。问题根源: 把"反冲管瞬时分流比"误当作"穿越系统边界的排水比"。
v1.7 全面清理这个语义混淆:
rdfBackwash / rdfBackwashPumpHead_m / rdfBackwashPumpEta 从 PROCESS_DEFAULTS / readStageProcFromInputs 删除| 故障现象 | 可能原因 | 处理措施 |
|---|---|---|
| 出水 TSS 偏高 | 筛网破损 / 孔径变大 | 更换筛网 (寿命 2-3 年) |
| 反冲频繁启动 | 进水 TSS 过高 / 筛网堵塞 | 清洗筛网; 检查投饵量 |
| 排污水清澈 | 反冲喷嘴堵塞 / 水压不足 | 清洗喷嘴; 检查 RDF 内嵌反冲机构 |
| 转鼓不转 | 电机故障 / 链条断裂 | 检查电机和传动 |
运维要点: ① 每周检查筛网完整性; ② 每月清洗反冲喷嘴; ③ 海水系统注意筛网腐蚀。
MBBR 是 RAS 最关键的处理单元。HDPE 悬浮填料 (比表面积 500-800 m²/m³) 在曝气搅动下悬浮于水中, 表面附着硝化菌群, 将有毒的 TAN 氧化为低毒的 NO₃。硝化是缓慢的自养过程, 菌群建立需 4-8 周。
iRAS 默认 VTR₂₀ = 0.5 kg TAN/(m³·d)、θnit = 1.10; 反硝化对应 VDR₂₀ = 0.8 kg NO₃-N/(m³·d)、θden = 1.08。
VTR20 / VDR20 / thetaNit / thetaDen)随
填料型号、比表面积、运行 TAN 浓度、曝气强度、菌群成熟度变化很大,
不同来源的实测值可相差数倍。iRAS 内置的是通用工程取值,
用于方案比选与量级估算;具体项目应以填料厂家实测数据或设计单位参数覆盖默认值,
不应直接作为施工图依据。
① 未做 TAN 浓度修正。
硝化速率在高 TAN 时呈零级(速率恒定),低 TAN 时转为一级(速率随浓度下降)。
文献与厂家给出的最大速率通常在氨饱和条件下测得,
而真实 RAS 池内 TAN 常低于 1 mg/L,处于一级动力学区。
本模型只做温度与盐度修正,不随 TAN 浓度衰减——
这意味着在低 TAN 工况下算出的 BF 池容积可能偏小。
保守设计应下调 VTR₂₀,或依靠 safetyBio(默认 1.15)吸收这部分不确定性。
② 未区分氨限制与氧限制。 θ 描述的是温度对生物活性的影响,但该影响的强弱取决于反应受什么限制: 氨限制时温度效应显著,氧限制时温度效应明显减弱。 本模型统一使用单一 θ,在低温 + 供氧不足的工况下会高估温度惩罚,把 BF 池算得偏大。 若生物滤池曝气不足或填料过厚,应据实调低 θ。
③ 低温外推需谨慎。 单一 Arrhenius 系数在很低的温度下会偏离实测。iRAS 内置鱼种最低 tempOpt 为 12°C(三文鱼苗种), 在常规冷水鱼范围内可用;若用于更低温物种或北欧低温工况,需另行校核。
| 温度 °C | 修正系数 θ^(T−20) | VTR kg/(m³·d) | 典型物种 |
|---|---|---|---|
| 10 | 0.386 | 0.193 | 冷水鱼苗种 |
| 12 | 0.467 | 0.234 | 三文鱼苗种 |
| 15 | 0.621 | 0.310 | 三文鱼成鱼 |
| 16 | 0.683 | 0.341 | 大菱鲆全周期 |
| 20 | 1.000 | 0.500 | 基准 |
| 25 | 1.611 | 0.805 | 加州鲈 / 鳜鱼 |
| 28 | 2.144 | 1.072 | 罗非鱼 |
| 30 | 2.594 | 1.297 | 对虾 |
盐度修正:fsal = max(1 − 0.01 × S, 0.3)。盐度 30‰ 时硝化效率降至 70%。 下限 0.3 是防零保护,不代表物理极限。
填料体积 = TAN_Daily × safetyBio / [VTR₂₀ × θ^(T−20) × f_sal]。其中 T′ 为封顶后的温度(bfArealTempCap,默认 25 °C)——MBBR 厂商设计手册明写
「不建议在 20–25 °C 以上继续按温度上修面负荷」,θ 是经验外推系数,超出标定域无依据。
封顶只增不减,对温水鱼种影响显著(对虾 30 °C 原被高估 1.54×)。
Sn 是设计输入而非运行实测值,含义是「要把池内 TAN 控制在这个值以下,需要多大滤池」。
它不是告警阈值:库内 TAN 告警线为冷水 1.0 / 温水 3.0 mg/L,拿告警线当 Sn 等于按「池内 TAN 刚好顶到
告警线」选池,滤池会明显偏小。
| 水体 | 默认 Sn | 依据 |
|---|---|---|
| 淡水(盐度 < 5‰) | 0.5 mg/L | 保守端常规值 |
| 海水(盐度 ≥ 5‰) | 0.7 mg/L | Nofima NCRA 研究型 RAS 设计条件(最大投饲负荷下 TAN < 0.7–1);滤池成熟判据 TAN < 0.7(Rojas & Pedersen, 2016) |
分档按阶段盐度而非鱼种——大西洋鲑跨盐度(0/0/12/30‰),其成鱼期自动取海水档,苗种期取淡水档。 用户显式修改过该字段时以用户值为准。
毒鱼的是非离子氨而非 TAN,NH₃/TAN 的比例由 pH、水温、盐度决定。因此 Sn 用行业口径选型,
另由碳酸盐模块独立校验:以 pH 控制目标(而非池内实算 pH,后者随 CO₂ 波动会让选型抖动)
+ 水温 + 盐度算出 Sn 对应的 NH₃-N,超过 0.0125 mg/L(Colt & Armstrong 1981;Meade 1985)报危险级。
选型用行业惯例,安全用物理判据,两者互不替代。pHControlMode = 'alk'(不控 pH)时无目标可用,
不做此校验。
| 受限侧 | 稳态池内 TAN | 含义与处方 |
|---|---|---|
| 面积侧 | Sn × safetyBio−1/0.7 | 面积按 r(Sn) 选出后的稳态解。k、θ、盐度修正、日负荷在代数上全部约掉,只剩安全系数决定实际 TAN 比设计目标低多少(safetyBio = 1.15 时为 0.82×)。加大滤池有效。 |
| 水力侧 | Snmin = TAN_Daily × 1000 / (Q × 24) | 单程去除率不能超过 100%,故池内 TAN 不可能低于此值。滤池再大也突破不了,只能提高循环倍数。 |
实际稳态 TAN 取两者较大值。界面与告警会指明本阶段受限于哪一侧——两者处方相反,混为一谈会导致错误的 扩建决策。实测分布:淡水鱼种(加州鲈、鳗鲡、鳜鱼)多为水力侧受限,海水鱼种多为面积侧。
DO_out = (a·DO_in − R_BF + M·k·DO_eq)/(a + M·k),
其中 k = 1.2 %/m × 水深 × α × 1.024^(T−20) / 9.09。1.2 %/m 对粗孔盘在标准区间内
(Metcalf & Eddy 0.9–1.8 %/m)。bfDOMin,模型只告警不自动加风——自动加风会悄悄改掉
用户设定的通量,且代价极大(曾实测需提到 40 m³/(h·m²),远超合理区间)。
DO_out = (a·DO_in − R_BF + M·k·DO_eq) / (a + M·k),
其中 a = Q·24/1000(水携氧)、R_BF = BF 耗氧、M = 进风口氧量、
k = 1.2 %/m × 水深 × α × 1.024(T−20) / 9.09、DO_eq = 0.95 × DO_sat × 中点压力修正。
该解在风量→0 时落到不曝气值、风量→∞ 时趋于平衡 DO,不会跑出物理窗口。
1.2 %/m 对粗孔曝气盘在标准区间内(Metcalf & Eddy 0.9–1.8 %/m),3 m 水深清水零 DO 下约 3.9%。
旧文档中的「SOTE = 8%」已废弃。bfAirFlux 默认 10 m³/(h·m²池底),Norsk Vann 168/2009 建议 10–15)选定。
高负荷工况下若出口 DO 低于 bfDOMin,模型只告警不自动加风——自动加风会悄悄改掉用户
设定的通量,且代价极大(曾实测需提到 40 m³/(h·m²),远超合理区间)。
BF 启动需要 4-8 周, 启动期管理不当会导致 TAN/NO₂ 飙升, 大量死鱼。
| 故障 | 原因 | 措施 |
|---|---|---|
| TAN 突然升高 | BF 过载/停电/pH 过低 | 减少投饵; 补碱度; 检查曝气 |
| NO₂ 持续偏高 | Nitrobacter 不足/pH<6.5 | 补碱度; 降低负荷 |
| 填料沉底 | 曝气不足/气管堵塞 | 检查风机和气管 |
| 出水浑浊 | 生物膜脱落 | 正常现象 |
蛋白分离器利用泡沫分离原理去除 DOM 和细颗粒 TSS (<30μm)。空气或臭氧以微细气泡注入接触塔, 表面活性有机物吸附在气泡表面, 随泡沫溢出。
| 参数 | 空气模式 | 臭氧模式 |
|---|---|---|
| DOM 单次去除率 | 30-50% (默认 40%) | 60-80% (默认 70%) |
| TSS 单次去除率 | ~40% | ~40% |
| 额外效果 | 无 | 杀菌+脱色+氧化 |
| 成本 | 低 | 高 (臭氧发生器) |
| 海水风险 | 无 | 溴酸盐 BrO₃ (盐度>5‰需控制) |
HRT 默认 2 min (Sanders Helgoland LE-315 商业实测 1.8-2.2 min, ScienceDirect 2023)。物理: DOM 吸附在气泡表面是秒级反应, HRT 主要保证泡沫稳定形成, 不是反应时间, 长 HRT 无收益。用户可在 1.5-4 min 范围调整。
| 故障 | 原因 | 措施 |
|---|---|---|
| 不产泡沫 | DOM 太低/气量不足 | 正常 (新水); 增加气量 |
| 泡沫太湿 | 气量过大/液位过高 | 减小气量; 调低液位 |
| 臭氧泄漏 | 密封不严 | 检查; 加活性炭尾气破坏 |
| 溴酸盐过高 | 海水中臭氧过量 | 降低剂量; 监测 BrO₃ |
在缺氧条件下 (DO < 0.5 mg/L), 异养菌利用甲醇将 NO₃ 还原为 N₂ 气体。这是 RAS 中唯一能真正"去除"氮素的过程。
methanolSafetyFactor(默认 1.3)= × 3.21 kg/ddenitriAlkRecovery = 2.8。methanolSafetyFactor 1.3 得 3.21 g/g,
与文献中位一致 —— 这里的安全系数不是保守裕量, 而是把化学计量比校到实测口径。
反硝化配多大,取决于换水率能带走多少硝酸盐。这两个参数不能孤立设定, 但用户常常只调其中一个,然后对 NO₃ 结果感到意外。本节说明 iRAS 的默认取向。
换水率用 %/日表示不便于横向比较,产业通用口径是单位投饵补水量(m³/kg 饲料)。 iRAS 各鱼种默认值折算如下:
| 鱼种 | 换水率 %/d | 单位投饵补水量 m³/kg 饲料 |
|---|---|---|
| 鳗鲡 | 6 | 0.055 |
| 罗非鱼 | 6 | 0.060 |
| 大西洋鲑 | 4 | 0.092 |
| 大菱鲆 | 4 | 0.105 |
| 加州鲈 | 5 | 0.106 |
| 石斑鱼 | 6 | 0.123 |
| 鳜鱼 | 6 | 0.165 |
| 对虾 | 8 | 0.216 |
| 产业口径 | m³/kg 饲料 |
|---|---|
| 极集约 RAS | 0.1 – 0.3 |
| 常规商业 RAS | 0.3 – 1.0 |
| 半流水 | > 3 |
稳态下 NO₃ 的去除只有两条路:反硝化与换水稀释。补水强度低意味着后者几乎不起作用。
以 1000 t/yr 大西洋鲑成鱼期为例(系统水体 5178 m³、TAN 日产 82.8 kg/d):
| 反硝化旁路比例 | 反硝化流量 m³/h | 稳态 NO₃-N mg/L |
|---|---|---|
| 0%(不设反硝化) | 0 | 414 |
| 0.5% | 51 | 70.2 |
| 1% | 102 | 38.5 |
| 2%(v1.9.2 默认) | 203 | 20.2 |
| 3% | 305 | 13.7 |
| 10%(v1.9.2 前的旧默认) | 1015 | 4.2 |
denitriFlowPct 调到 0 时模型给出的 NO₃-N 414 mg/L 是真实后果,不是算错。
产业上「无反硝化 RAS」通常只有 50–150 mg/L,是因为它们的补水强度高 3–10 倍——
用换水把硝酸盐冲走,而不是用反硝化把它还原掉。v1.9.2 之前 denitriFlowPct 默认 10%,对应稳态 NO₃-N 仅 4.2 mg/L。三点问题:
改为 2% 后对应反应器 203 m³/h、NO₃-N 20.2 mg/L,落在「配了反硝化的 RAS」的合理区间。
| 故障 | 原因 | 措施 |
|---|---|---|
| NO₃ 不降 | 甲醇不足/DO 过高 | 增加甲醇; 检查缺氧 DO<0.5 |
| 出水发白臭味 | 甲醇过量 | 减少甲醇 |
| pH 过高 | 反硝化产碱过多 | 减少流量比 |
运维要点: ① 甲醇按 NO₃ 实时调节; ② 甲醇属易燃危化品, 单独储存; ③ 反硝化器启动比 BF 快 (1-2 周)。
UV-C (254 nm) 穿透微生物细胞壁, 破坏 DNA 胸腺嘧啶二聚体, 使其丧失复制能力。优点: 无化学残留, 不改变水质, 杀菌快。
| 病原体 | k (cm²/mJ) | D=40 灭活率 | 建议剂量 |
|---|---|---|---|
| 细菌 (E.coli, 弧菌) | 0.10-0.20 | 99.7% | 30-40 mJ/cm² |
| 鱼类病毒 (IPNV, IHNV) | 0.05-0.10 | 86-98% | 60-100 mJ/cm² |
| 原虫 (小瓜虫包囊) | 0.15-0.25 | 99.7-99.99% | 30-40 mJ/cm² |
| 水霉孢子 | ~0.30 | 99.999% | 20-30 mJ/cm² |
① 灯管运行时间计数器记录, 寿命 8000-12000h;
② 石英套管每月用稀盐酸擦拭除垢;
③ UV 前 TSS < 10 mg/L 才能保证效果。
臭氧 + UV 协同产生羟基自由基 (·OH), 氧化分解 geosmin 和 2-MIB (土腥味物质, ng/L 级)。单独臭氧或 UV 效果有限, 协同效率 80-95%。
HRT 按 AOP 类型默认值:
物理: 羟基自由基 ·OH 寿命 < 1 ms, 反应是光化学秒级。Schrader (2010) 实测 1 min 接触, geosmin 去除 86-92%。用户可在 1-15 min 范围内手动调整。
① AOP 出水必须经活性炭或 UV 消除残留臭氧再回主流;
② 不是所有 RAS 都需要 AOP——仅品种对土腥味敏感时才需要。
| 温度 °C | 淡水 DO_sat | 海水 30‰ | 降幅 |
|---|---|---|---|
| 10 | 11.29 | 9.32 | -17% |
| 15 | 10.08 | 8.39 | -17% |
| 16 | 9.86 | 8.21 | -17% |
| 20 | 9.09 | 7.62 | -19% |
| 25 | 8.26 | 6.97 | -18% |
| 28 | 7.83 | 6.62 | -18% |
| 30 | 7.56 | 6.41 | -18% |
| 对比项 | 纯氧 (液氧 + 锥形塔 / PPC) | 空气 (罗茨风机 + 池内微孔盘 K-101) |
|---|---|---|
| 增氧发生位置 | 主管路 — 水在锥内被打到位, 再送进鱼池 | 池内 — 气直接打进养殖池, 增氧与耗氧在同一控制体内同时发生 |
| DO 目标 | 出锥 110-165% 饱和度 (按物种, o2SatTarget) | 没有"目标饱和度"这个量 — 池水 DO 是解出来的; 设计点由 designDO_mgL 给 (见 15.3b) |
| 池水 DO 是否随循环流量变 | 是 — 流量越大, 单循环降幅越小 (15.3) | 否 — 与循环流量无关 (15.3b) |
| 适用密度 | ≥ 30 kg/m³ | < 30 kg/m³ (口径见下) |
| 氧转移效率 | 锥形塔吸收效率 80-90% (o2AbsorptionEff 默认 85) | 不是常数 — 逐工况由 OTE 公式算出, 实算多落在 2.2-4.5% (见下) |
| CO₂ 去向 | 锥内基本不吹脱 ⇒ 必须配脱气塔 | 曝气本身就在吹脱 ⇒ 上不上塔是个真问题 (见 15.3c) |
| 运行成本 | 液氧 1.2 元/kg + 主泵附加扬程 (mainline 拓扑) | 仅电费, 但风机常年满负荷运行 |
aerIntensity 反算为准。它随水深/温度/鱼种变
(石斑成鱼期实算 23.0 kg/m³, 甲壳类另分一档)。固定数字给量级, 活数据给本阶段的准数。SOTE 硬编码 0.18。
清水 SOTE 现在只作为公式里的一个入参 (sotePerMeter, 默认 6.5 %/m 水深, EPA/ASCE 典型 5-7)。
例 (石斑鱼成鱼期, 27 °C / 30‰ / 池深 1.5 m, 设计 DO 5.0 mg/L, 本模型实算):
同一台设备: 清水标称 6.5 × 1.5 = 9.75%, 工艺水实际 2.22% — 差 4.4 倍。 OTE_base 与 OTE 是两个不同的量, 不可互换: 选型 (反推风量) 用 OTE, 而水质侧解池内 DO 稳态用 OTE_base — 因为后者要把对浓度 C 的依赖显式解出来, 见 15.3b。
aerationMode = 'o2' (纯氧拓扑)。aerationMode = 'air') 不适用本式 — K-101 把气直接打进鱼池,
增氧与耗氧在同一个控制体内同时发生, 根本不存在"进池浓度", 池水 DO 由「传质速率 = 耗氧速率」
的池内质量平衡决定, 与循环流量无关。见 15.3b。
v1.1 用小时峰值评估 DO 降幅 (而不是 v1.0 的日均), 反映投喂后代谢尖峰。
本节是 aerationMode = 'air' 的完整设计口径。选型与水质稳态共用同一个单源函数
tankAerationDesign — 这是 v2.3 二批之后的架构约束: 同一台 K-101, 不允许"选型说 5.00、水质说 0.00"。
池内曝气没有"进池浓度", 稳态由传质速率与耗氧速率相等给出。传质速率对池水浓度 C 有显式依赖 (C 越高推动力越小), 所以这里必须用推动力折算之前的基础效率 OTE_base:
式中不含循环流量。循环流量只管 TAN / CO₂ / TSS 的移除, 不管 O₂。 模型实测 (石斑成鱼期, 500 t/yr, 20 kg/m³, 关塔):
| turnover | 循环流量 m³/h | air 模式池水 DO | o2 模式池水 DO (同工况) |
|---|---|---|---|
| 1 | 5,559 | 5.158 | 4.77 |
| 2 | 11,118 | 5.158 | 8.03 |
| 3 | 16,678 | 5.158 | 8.94 |
| 4 | 22,237 | 5.158 | 9.40 |
流量放大 4 倍, air 模式 DO 逐位不动, o2 模式从 4.77 一路涨到 9.40。 这是两种拓扑最直观的分野, 也是设计时最容易搞混的一点: 空气曝气场加大水泵不会提高池内 DO, 要提高 DO 只能加风量或降密度。
风量需求有两个互相独立的来源, 取大者控制, 设备卡片会标出控制侧是「O₂ 传质控制」还是「CO₂ 吹脱控制」。
K0 为 Weiss (1974) 亨利常数, ρ_w 为水密度 — 两者复用碳酸盐模块 iRASCarbonate.K0_W74 的口径,
不另设副本。co2StripApproach (默认 0.5) 是气泡出水时对亨利平衡的逼近系数: 气泡在池内停留时间有限,
离开水面时并未达到平衡载量。
designDO_mgL 与 co2TargetMgL这一对参数在 v2.3.3 四批/五批补齐, 是对称的一对。补齐它们的理由是一个共同的毛病:
DOmin — 那是安全下限, 低于它鱼会出问题;| 字段 | 留空时回落 | 生效条件 | 对风量的作用 |
|---|---|---|---|
designDO_mgL | 鱼种 max(DOmin_abs, DOmin_satRatio × C*) | air 模式 | 推动力 = (C* − 本值)/C* ; 本值越高 → 推动力越小 → 风量越大 |
co2TargetMgL | 鱼种阈值 (温水/冷水分档 × 海水折减) | air 模式 且 脱气塔关闭 | 风量 ∝ 1/(载量 × 本值) ; 本值越低 → 风量越大 |
两者都与循环流量无关 — 算式里根本没有流量这一项。它们是纯粹的曝气侧设计点。 工程上 DO 通常设计在 5-7 mg/L (高于最低允许值, 留出投饵高峰与水温波动的余地), CO₂ 通常按阈值的 60-80% 设计。
safetyAerator (默认 1.10), 所以实配之后池水实际会比设计点更好一点。
本模型可解析验证这一关系:实算池水 DO = C* − (C* − DO_design) / safetyAerator ·
实算池水 CO₂ = co2Target / safetyAerator (CO₂ 控制时)| 步骤 | 取值 | 来源 |
|---|---|---|
| 水温 / 盐度 / 池深 | 27 °C / 30‰ / 1.5 m | 鱼种库 + 阶段卡片 poolDepth_m |
| DO 饱和 C* | 6.73 mg/L | Benson-Krause (15.1) |
| 设计 DO | 5.00 mg/L | designDO_mgL 留空 ⇒ 回落 DOmin_abs |
| OTE_base / OTE | 8.63% / 2.22% | 15.2 公式 |
| 峰值耗氧 OCR | 30.55 kg O₂/h | 负荷模型 (o2FishPeakHourly) |
| O₂ 侧风量 | 30.55 × 1.10 / (1.293 × 0.232 × 0.0222) = 5,038 Nm³/h v2.4 标准状态口径 (0.300 kg O₂/Nm³)。v2.3.3 及以前按 1.2×0.23=0.276 得 5,476 m³/h —— 数字降 8.0%, 但送出的氧质量不变: 参考态在选型式与接触器之间会抵消, 见 15.6b.2 | — |
| CO₂ 日产 | 1,115 kg/d | 负荷模型 (co2Daily) |
| 设计 CO₂ | 22.5 mg/L | co2TargetMgL 留空 ⇒ 温水阈值 30 × 海水折减 0.75 |
| 亨利载量 kLoad | 1.430 g/m³ per mg/L | K0_W74 (27 °C, 30‰) |
| CO₂ 侧风量 | 1115 × 1000 × 1.10 / (1.430 × 22.5 × 0.5) / 24 = 3,176 m³/h | — |
| 选型风量 | max(5476, 3176) = 5,476 m³/h 控制侧 = O₂ | — |
| K-101 轴功率 | 177.5 kW | 1+1 备, 见 15.6 |
| 水质侧回算池水 DO / CO₂ | 5.158 / 11.86 mg/L | 15.3b.1 稳态式 + 关塔 CO₂ 平衡 |
控制侧会翻转, 而翻转点就是这套曝气系统的能力边界。同一工况把设计 CO₂ 从 22.5 往下调:
| 设计 CO₂ mg/L | O₂ 侧风量 | CO₂ 侧风量 | 控制侧 | K-101 kW | 实算池水 CO₂ |
|---|---|---|---|---|---|
| 22.5 (回落值) | 5,476 | 3,176 | O₂ | 177.5 | 11.86 |
| 15.0 | 5,476 | 4,764 | O₂ | 177.5 | 11.86 |
| 13.0 | 5,476 | 5,496 | CO₂ (翻转) | — | — |
| 10.0 | 5,476 | 7,145 | CO₂ | 231.6 | 9.09 |
| 8.0 | 5,476 | 8,932 | CO₂ | 289.4 | 7.27 |
| 6.0 | 5,476 | 11,909 | CO₂ | 385.9 | 5.45 |
注意 O₂ 控制段内 (22.5 / 15.0) 实算 CO₂ 恒为 11.86 — 因为风机已经比 CO₂ 需求大, 调低目标没有实际作用; 一旦翻到 CO₂ 控制侧, 实算值才开始跟着目标走。把设计 CO₂ 从 22.5 收到 6.0, 风机电耗从 177.5 涨到 385.9 kW —— 这个代价应当在选型阶段看见, 而不是投产后才发现。
designDO_mgL
的钳制上限设为 20 而非某个"看起来合理"的固定值 — 不拿一个固定数字假装知道边界。| 增氧方式 | 脱气塔 | 结论 |
|---|---|---|
| 纯氧 o2 | 关闭 | 不允许 — 物理上必然积累 CO₂。氧锥/PPC 只溶氧、几乎不吹脱,
CO₂ 唯一去路只剩换水稀释 (co2FallbackEff 默认 5%)。v2.3.3 二批已把此处文案从"建议启用"升格为
「物理上必然积累, o2 模式必须启用脱气塔」。 |
| 空气 air | 关闭 | 可能可行, 要看实算 — 曝气气流本身就在吹脱 CO₂, 风量又是按峰值耗氧配的, 在低密度下往往已经够用。这才是一个真正的设计选择。 |
iRAS 不采用"air + 关塔一律报警"这种配置级判据。理由是它会误报: 高换水 / 低密度下 air + 关塔确实能达标, 配置级判据会天天亮红字, 而天天见红字就没人看告警了。
实际判据是结果级的 — 拿模型算出的池内 CO₂ 稳态浓度比鱼种阈值,
超了才响 (结构化告警 CO2_OVER), 并按根因三分:
| rootCause | 含义 | 处置方向 |
|---|---|---|
stripperOff | 塔关着, 且现有曝气吹脱不够 | 开塔, 或降密度, 或调低设计 CO₂ 把风量顶上去 (代价见 15.3b.4) |
airUnderperf | 塔开着, 但曝气侧本身不达标 | 查风量与 OTE 假设 |
stripperUnderperf | 塔开着且在工作, 但塔效率/G:L 不足 | 提 G:L、加填料高度、检查布水 |
判据只复用水质链已经算出的量, 零新阈值 — 不引入来源不同的数字当门槛。
石斑鱼 500 t/yr, air 模式, 成鱼期阶段密度扫描 (阈值 22.5 mg/L):
| 阶段密度 kg/m³ | 关塔池内 CO₂ | 开塔池内 CO₂ | 是否达标 | 曝气强度告警 |
|---|---|---|---|---|
| 10 | 11.86 | 2.14 | 均达标 | — |
| 15 | 11.86 | 3.21 | 均达标 | — |
| 20 | 11.86 | 4.29 | 均达标 | — |
| 25 | 11.86 | 5.36 | 均达标 | ⚠ 池底布气 1.85 > 1.7 |
| 30 | 11.86 | 6.43 | 均达标 | ⚠ 池底布气 2.22 > 1.7 |
两条曲线的走向相反, 这一点值得记住:
成本侧的量级 (同上工况, 20 kg/m³, 工艺运行成本 / 比电耗):
| 工况 | 综合成本 元/kg | 比电耗 kWh/kg | 差额 |
|---|---|---|---|
| 石斑 20 kg/m³ · air + 关塔 | 57.94 | 22.99 | — |
| 石斑 20 kg/m³ · air + 开塔 | 67.71 | 29.87 | +9.77 元/kg (+16.9%) |
| 罗非鱼 20 kg/m³ · air + 关塔 | 58.38 | 28.45 | — |
| 罗非鱼 20 kg/m³ · air + 开塔 | 82.02 | 55.56 | +23.64 元/kg (+40.5%) |
co2TargetMgL 回落到阈值 30, 除以 1.10 安全系数即 27.27)。同时风量控制侧已经翻到 CO₂ 侧,
说明风机已经在替塔干活 — 省下的塔钱有一部分变成了更大的风机。
⇒ 判断"要不要上塔"时, 必须同时看三个量: 实算池内 CO₂ 距阈值还剩多少裕量、
控制侧是不是已经翻到 CO₂、曝气强度是否已经超限。只看成本一栏会得出错误结论。
可操作的决策顺序:
degasFrac (默认 0, 即尾气排室外),
但曝气气流依然是 sink = indoor 且接触水体 — 池内浓度只是被塔降低了、不是归零,
这股气照样把 CO₂ 带进车间。更彻底的一层是: 曝气吹脱在水侧的 η 里也没算 —
水侧不记移除、室侧不记入室, 两头都不记 = 孤儿项, 与 v2.0 的 Q_air_gain、
v2.1 的蛋分气流、v2.2 的 K-101 轴功完全同族。V_vent_fish 恒为 0,
新风全靠 ACH 兜底。原注释自称"保守方向"是方向标反 —
少算入室 CO₂ ⇒ 少算新风 ⇒ 通风机选小, 对车间空气质量是激进方向。
罗非鱼 1000 t 实测: 成鱼期新风 6,499 → 11,460 m³/h, 风机原来选小了 1.76 倍;
若不加大新风, 车间稳态可达 1,639–2,301 ppm (设计限值 1,500)。原写法是一个三分特判 (o2 → degasFrac / air+关塔 → 1 /
air+开塔 → degasFrac), 第三档错了, 而且错得"看起来已经考虑过了"。
改成守恒式之后三档全部成为特例, 不再需要 if:
| 拓扑 | fracAer | 入室份额 | 与原口径 |
|---|---|---|---|
| 纯氧 o2 | 0 | degasFrac | 逐位一致 |
| 空气 + 关塔 | 1 | 1 | 逐位一致 |
| 空气 + 开塔 | 0 < f < 1 (实测 0.27–0.48) | 按两条路径实际份额加权 | 本次修正 |
edge_air_stripper_on (air + 开塔 + 机械通风车间) —— 全库既有 air 工况原本
全部关塔, 不补工况的话 X 锚写了也走不到。自检 29 → 31, 负对照 6/6。if (sim.co2Removal) {…}), 于是"撤掉导出"这一负对照全绿 ——
导出没了, 整块断言直接被跳过。改为独立判定后当场转红, 并顺带咬出空场骨架漏导出
(与二批 W0 是同一课)。⇒ 守卫会吞掉失败: 导出面本身必须是受检对象, 不能是判定的前提。
isFry 已经用于 TGP 气泡病阈值(苗种 110% vs 成鱼 115%), 说明苗种确有更高敏感性;
产业侧又指出 air + 关塔工况恰恰在苗种/小鱼期最常见 —— 问题正落在本节最常用的工况上。co2TargetMgL 设得比成鱼期更保守
(该参数有 UI 入口, 可逐阶段设定)。若日后取得成文出处再议。
CO₂ 脱气塔在 v1.1 作为独立设备建模。v1.0 没有此模型 (仅在增氧节点扣 70% 写死, 不存在独立的塔/风机/CAPEX/OPEX)。v1.1 用户首次看到此设备会有独立的设备投资和运行成本——这是新增的成本项, 不是"修正"。
| 参数 | 当前默认 | 依据 / 工业实测 | v1.1 旧默认 |
|---|---|---|---|
G:L 气液比 co2StripperGtoL | 5 | Timmons Ch.10 p.244: CO₂ 汽提推荐 5:1-20:1 (<3:1 是常规曝气口径, 不是汽提); Karimi 2020 实测 G:L>5 无显著额外去除; Summerfelt 2003 最优 5.1 | 3 |
水力负荷 co2StripperLoadingRate | 80 m³/(m²·h) | Timmons Ch.10 p.245: 17-24 L/(m²·s) = 61-86 m³/(m²·h); Summerfelt 2003 / Moran 2003 实测 87-187, 取保守端 | 40 |
填料层高度 co2PackingHeight_m | 1.5 m | Timmons Ch.10 p.245: 设计高度一般限于 1.0-1.5 m, 超过 1.5-2.0 m 后收益递减 | 1.0 |
风压 co2BlowerPressure_kPa | 2.5 kPa (可调) | Delta Cooling Towers 实测 0.87-1.12 kPa; 浅塔 0.5-1.5 / 中塔 1.5-3 / 深塔 3-5 | 2.5 |
风机效率 co2BlowerEfficiency | 0.60 | 罗茨风机 0.5-0.7, 离心风机 0.65-0.8 | 0.60 |
单次脱气率 co2StripperEff | 65% | G:L=3 浅塔实际值; 填料 ≥3 m + G:L ≥5 可达 80% | 65% |
tools/check_defaults_sync.js 锁定 —— 判据直接对准 PROCESS_DEFAULTS 这张表,
文档写的默认值与实际默认值不符即转红 (负对照 4/4)。
整机功率对标 Summerfelt (2009) 文献区间 5-15 kW per 1000 m³/h 循环水量: 本模型 1000 t 三文鱼成鱼期 Q=10,155 m³/h 时脱气塔风机 58.8 kW, 折合 5.79 kW/1000 m³/h, 落在区间下沿。 ⚠ 该比值与产量规模无关, 可直接横比; 而"全场合计多少 kW"随鱼种与产量组合变, 不宜作为对标口径。
举例 (三文鱼成鱼期 Q=10,155 m³/h, 当前默认 G:L=5 / 风压 2.5 kPa / 风机效率 0.60):
⚠ 本例此前写的是 10155 × 3 … = 35 kW —— 那是 v1.1 的 G:L=3 口径, v2.0 改默认值后未同步 (见 15.4.1 警示框)。
按比功率对标: 58.8 / 10.155 = 5.79 kW per 1000 m³/h, 落在 Summerfelt (2009) 的 5-15 区间下沿。
单位推导: CO₂_Daily [kg/d] × 10⁶ [mg/kg] = mg/d ÷ (Q × 24) [m³/d ÷ 1000=L/d? 注意]
等价等式: CO₂_tank (mg/L) = CO₂_Daily(kg/d) × 1000 (g/kg) × 1000 (mg/g) / [流量(m³/h) × 24 (h/d) × 1000 (L/m³) × η_co2]
化简: CO₂_tank (mg/L) = CO₂_Daily(kg/d) × 10⁶ / [流量(m³/h) × 24,000 × η_co2]
即代码中的: co2Tank = co2Daily × 10^6 / (flowM3h × 24 × 1000 × eta_co2)
海水阈值 15 mg/L, 淡水阈值 20 mg/L。脱气塔关闭时 η_co2 改为 co2FallbackEff (默认 5%)。
× 10 是单位换算错误 (kg/d → mg/L 必须 × 10⁶, 即 1 kg = 10⁶ mg)。
代码一直是对的, 仅手册书写错误。
v1.6 之前 iRAS 在 UI 上已经有"主流路径 / 旁路(节能)"两个选项, 但 calcPumpPowerBreakdown / aerationSpec / OPEX
完全没区分 — 是"UI 假承诺"。v1.7 通过全网调研 (Linde SOLVOX cone / Pentair AES Speece / PR Aqua PPC / Global Seafood Advocate 2019)
确认: 国际主流大型 RAS 项目 "more often plumbed in side stream configuration"。
| 对比项 | mainline (主流串联) | bypass (旁路高压) |
|---|---|---|
| 主流路径 | 全部循环水过氧锥 | 主流不过锥, 旁路 5-30% 流量过高压锥后回流 |
| 主泵附加压头 | + 2-15 m (锥子压损) | 0 (主泵不过锥) |
| 氧锥规格流量 | = 全循环流量 Q | = Q × bypassRatio (小流量) |
| 氧锥操作压力 | 低压 10-21 psi (LHO) | 高压 1-3 bar (SOLVOX / PPC) |
| 典型 DO 出锥 | 130-170% 饱和度 | 200-400% 饱和度 |
| 额外设备 | 无 | 旁路泵 P-602 + 混合点 M-601 |
| 代表设备 | Pentair AES LHO | Linde SOLVOX cone / PR Aqua PPC |
| 适用规模 | 中小型项目 (Q < 5000 m³/h) | 大型项目 (Q > 5000 m³/h) |
| 字段 | 默认 | 钳制范围 | 工程对照 |
|---|---|---|---|
o2ConeTopology | mainline | mainline / bypass | — |
o2ConeHeadLoss_m | 3 m | [0, 15] | LHO 2-3 / Speece 5-10 / SOLVOX 110 至 15 |
o2BypassRatio (%) | 10 | [5, 30] | 国际主流 8-15% |
o2BypassPumpHead_m | 20 m | [5, 40] | 玻璃钢 20 / SOLVOX 25-30 |
o2BypassPumpEta (%) | 60 | [30, 85] | 高压泵典型 |
P-602 加入设备清单 / CAPEX / OPEX / 热平衡, 1+1 备用模块化 (与主泵 P-101 同口径)。
📌 v2.2:K-101 全量接入热平衡与气路登记。v1.7 加入本机时只做了选型、计费与 CAPEX,热去向与气路登记都缺 —— 它鼓的空气直接打进鱼池水体,比脱气塔更无疑问地接触水,却从未进入 collectAirStreams,其电功率也不在热平衡的任何一侧。这与 v2.0 的 Q_air_gain 孤儿项、v2.1 的蛋分气流、第五轮审计的风机轴功完全同族,是第四次。逃逸机制值得记一笔:32.3 kW 藏在一个混合了数值与格式化字符串的展示对象(aerationSpec)里,所有「数值字段 + 命名规则」的扫描器集体失明。
v2.2 补齐四件套:airFlowM3h 归一单位 + airPath(OUTDOOR→OUTDOOR,contactsWater,与气路拓扑 A5 一致)+ POWER_REGISTRY 登记(tankAirBlowerKw)+ 并入轴功逐台加权。新增断言 E2b 递归扫 *Spec子对象封住该逃逸类。
v1.7 之前 air 模式 (空气曝气) 只有 K-302 (BF 曝气风机), 缺鱼池主增氧风机。 温水鱼种 (罗非鱼 / 鳗鱼 / 对虾) 的大规模 RAS 设计无法用工具自动生成 — 而这是 80%+ 中国 RAS 项目的实际场景。
v1.7 加入 K-101 鱼池增氧鼓风机:
| 参数 | 当前实值 | 说明 | v1.7 旧文 |
|---|---|---|---|
| 设备类型 | 罗茨风机 + 微孔盘管曝气 | 清水 SOTE 由 sotePerMeter 给 (6.5 %/m 水深), 不直接充当吸收效率 | SOTE 18-22% |
| 风量基准 | max(O₂ 侧, CO₂ 侧) | 由 tankAerationDesign 单源给出, 见 15.3b.2 | o2FishPeakHourly × safety / SOTE |
风压 tankAirBlowerPressure_kPa | 9.81 × 池深 + 盘阻管阻 (1.5 m 池 → 24.7 kPa) | v2.3.3 改为与池深关联。留空自动算, 填了则显式覆盖(哨兵模式)。下钳 5 kPa | 15-25 kPa |
盘阻+管阻 tankAirDiffuserLoss_kPa | 10 kPa(盘 5 + 管 5) | ⚠ 待产业校准: 随盘型跨一个数量级 —— 低阻膜盘 2.2-4.8 · 常规微孔/刚玉盘 3.5-5 · 纳米管等高阻型厂家明示总压需 ≥50。管路 ≤50 m 取 5, 过长或弯头多取 8-10 | (无此参数) |
风机效率 tankAirBlowerEfficiency | 60% | v1.1.2 由 0.55 提到 0.60 (现代离心/罗茨中位)。下钳 30% | 60% |
| 备用 | 1+1 备 | 鱼池主增氧, 故障即鱼窒息, 必须双机轮换 | 同 |
| P&ID tag | K-101 | 与 K-302 (BF 风机) 区分 | 同 |
风压 = 9.81 × 池深 + 盘阻管阻 计算, 并取消原 30 kPa 下钳
—— 它正是压住浅池真值的那道坎(1.0 m 池真值约 19.8 kPa 会被抬到 30)。
断言 B1/B2 锁死(B2 是可达性锚: 13 条基线全 o2, 无锚则 B1 走不到, 负对照实测把风压改回 70 仍全绿)。co2BlowerPressure_kPa 2.5 kPa)、车间通风机 (ventFanPressure_Pa 250 Pa)
差两到三个数量级。代码中已就此立注:「全压绝不可复用 tankAirBlowerPressure_kPa」。其中 OTE 是逐工况算出的实际氧转移效率 (清水 SOTE × 水深 × α·β × θ 温度 × 推动力), 不是清水标称值 —— 完整推导、守卫与实算例题见 15.2 与 15.3b。
K-101 加入 modulePerSpec (与 K-302 同口径 1+1 备), P&ID / 设备清单 / 报告章节 / 财务测算 全链路同步。
📌 v2.4: 全库风量声明为标准状态。
此前 airFlowM3h 从来没有声明过参考状态, 而三个产气者各按一套隐含口径:
鱼池曝气按 ρ=1.2(20 °C)、关塔 CO₂ 侧按水温的摩尔体积、脱气塔与蛋分是纯体积比、没有状态。
气液接触器把这几股相加再乘一个密度 —— 这个问题本就无解。
为什么取标准状态: 对外向风机厂家提规格时给的就是 Nm³/h + 压力, 机器由厂家按此选型、质量由该单位本身锁定。故模型的风量、压力、功率全部 Normal 口径, 不做任何进气温度修正 —— 这不是"接受一个偏差", 是对外提规格的正确口径。
| 量 | 公式 | v2.4 变化 |
|---|---|---|
| K-101 曝气风量 | o2Peak × safety ÷ (RHO_STD_AIR × F_O2_MASS × OTE) | 数字降 8.0%(0.276 → 0.300) |
| BF 曝气风量 | 同上(用粗气泡 SOTE) | 数字降 8.0% |
| 脱气塔 / 蛋分风量 | 水流量 × 气水比 | 不变(体积比, 无参考态) |
| 接触器质量流 | airFlowM3h × RHO_STD_AIR ÷ 3600 | 常数, 与温度无关 |
对「由 O₂ 质量反算风量」的气流(K-101 / BF), 参考态在选型式与接触器之间会自动抵消,
取多少都不影响物理, 只影响报出来的那个数字。
但对「体积比」气流(脱气塔 flowM3h × G:L、蛋分 skimmerFlow × skimGtoL),
没有任何参考态可抵消 —— 不声明, 接触器的质量流量就无解。
v2.2 的六次不动点迭代随之整段删除。 它当年确实让温升与质量流取了同一密度
(修的是第六轮审计 P1: 两侧取不同密度、丢失部分轴功), 但统一到了物理上错误的那一侧。
现在质量流是常数, mdot·cp·ΔT ≡ P_shaft 恒成立, 无需迭代, 守恒断言 A3 逐位不变。
全库 1.2 共 9 处, 只有 3 处是本量; 0.23 同理。禁止全局替换
(本库有 v2.0.0 版本号全局替换污染历史叙述的先例)。
| 字面量 | 出现处 | 是什么 | 处置 |
|---|---|---|---|
| 1.2 | 曝气 / BF 选型式 · 池内 DO 稳态 | 工艺风量参考态 | ✅ 改 |
| β = h_c/(1.2×1006×0.91) | Lewis 类比的车间空气密度(20–28 °C) | ❌ 不改 | |
| 除湿机 / 暖通 ×1.2 | 选型安全裕度, 不是密度 | ❌ 不改 | |
| UA_vent 的 0.34 | = 1.2×1006/3600, 建筑物理常数 | ❌ 不改 | |
| 0.23 | 三处选型式 | 空气含氧质量分数 | ✅ 改 0.232 |
| o2FishFactor(鲑 0.20–0.23) | 鱼的耗氧系数, 数值相近而物理无关 | ❌ 绝不能碰 |
⚠ 上表由断言 A4b(产气侧禁字面量)与 A4d(反向保护: 不该改的必须仍在原位)锁住。
A4a 则直接锁质量流的取值来源: mdot × 3600 / airFlowM3h ≡ RHO_STD_AIR ——
这是个常数比值判据, 不依赖工况可达性。
⚠ 热平衡审计建议的判据 mdot×3600/air ≡ ρ(T_air) 不采纳:
它锁的是"实际进气体积"口径, 与标准态裁决相反。锁错口径比不锁更糟, 它会淹没真红。
液氧在 iRAS 里有两个不能混用的口径。这是 v1.9.1 修正的核心, 也是 RAS 工程里一个普遍被忽略的概念错误。
| 口径 | 字段 | 回答的问题 | 用途 | 含容量系数? |
|---|---|---|---|---|
| 设备容量 | o2PeakSupplyKgHo2Demand | 设备要多大 | 氧锥选型 / 储罐峰值供氧能力 / CAPEX | ✅ peakFactor × sAerator |
| 消耗量 | o2ConsumptionDailyo2ConsumptionDailyAvg | 一年买多少氧 | OPEX / 液氧采购 / 基准值 / 储罐容积 | ❌ 仅吸收效率 |
peakFactor (默认 1.5) 是"投喂后 30 min 内的小时耗氧峰值 ÷ 全日平均速率"。
它描述的是时间分布, 不是总量 — 一天之内峰谷会互相抵消, 日总耗氧并不因为存在峰值而变多。
把它乘进日消耗量, 等于认为鱼一天 24 小时都在以峰值速率呼吸。sAerator (默认 1.10) 是设备老化裕度。设备按 110% 能力配置, 是为了 8 年后填料污染、
密封件老化时仍能满足需求; 但今天的鱼不会因为设备有余量就多吃 10% 的氧。两者叠加使液氧采购量高估 1.5 × 1.10 = 1.65 倍。液氧是按 kg 计费的消耗品, 在 OPEX 中占 5–12%, 这个误差足以让整个项目的运行成本测算失真。
| 指标 | v1.9 (错误口径) | v1.9.1 (修正后) | 文献 / 说明 |
|---|---|---|---|
| 液氧强度 (kg O₂ / kg 饲料) | 0.44 | 0.266 | 文献 0.25–0.30, 修正后落入区间 |
| 年液氧消耗 | 527 t | 319 t | −208 t/yr |
| 储罐规格 (7 日储备) | 10.1 t | 6.1 t | 按消耗量而非峰值能力定容积 |
| 基准值验收区间 | 0.25–0.95 | 0.20–0.45 | 旧区间被迫放宽以容纳错误值 |
注意旧的验收区间上限 0.95 — 它是被错误口径倒逼出来的: 因为计算值 0.44 落在文献区间 0.25–0.30 之外, 只能把区间上限一路放宽到 0.95 才不报警。这是"用宽容的验收区间掩盖模型错误"的典型症状。 修正后区间收窄到 0.20–0.45, 重新具备了发现异常的能力。
o2PeakSupplyKgH 选, 罐容按
o2ConsumptionDailyAvg × 储备天数 选。合并成单一口径必然会在其中一侧过度设计。
| 故障 | 原因 | 措施 |
|---|---|---|
| DO 偏低 | 液氧用完 / 增氧塔堵塞 | 检查液氧; 清洗增氧塔 |
| CO₂ 偏高 | 脱气塔风量不足 | 增加风量; 清洗填料 |
| 液氧蒸发过快 | 储罐真空层失效 | 联系厂商检修 |
| 微孔盘气泡变大 | 盘面堵塞 / 老化 | 酸洗或更换 |
| bypass 模式 DO 不均匀 | M-601 混合点设计不当 / 旁路比过高 | 检查混合管段长度; 旁路比降到 10-15% |
| K-101 跳闸 (air 模式) | 1+1 备用未启动 / 双机故障 | 立即手动切换备用; 鱼池含氧 15-30 min 内告急 |
下列六条是 v2.4 评审后有意留下的决定, 不是缺陷。之所以单列成节, 是因为 每一条都曾被当作"待修项"提出过至少一次 —— 不写明来由, 下一轮还会被重新提出。
| 条目 | 裁决 | 理由 |
|---|---|---|
| air 模式池面蒸发系数未随曝气扰动修正 | 不修 | 模型实算接触器路径 44,173 kWh/d 是池面路径 807 kWh/d 的 55 倍 —— 气泡自身携带的水汽已由接触器完整计入, 未修正的只是"气泡之外被扰动加强的表面蒸发", 量级在数百 kWh/d 以内。air 模式下池面蒸发已非主导路径, β 的精度不再重要。 |
| 风机功率不做进气温度修正 | 不做 | 对外向厂家提规格时给的就是标准状态 Nm³/h + 压力, 机器由厂家按此选型、 质量由该单位本身锁定, 报回的功率即 P = Q_normal × Δp / η。 ⚠ 曾被误判为"热气候低估 9.2%"—— 那是混淆了【运行级电耗】与【选型级机器大小】: 定容积式风机 P ≈ 排量 × Δp, 与进气密度无关, 热天不是更费电而是送出的质量变少。 |
| ACH 拆成"渗透风 + 通风"两个维度 | 不做 | 真拆两维需要围护气密性参数 (n50 鼓风门实测值换算), 本库四档围护预设里没有任何 气密性数据, 现填即是编 —— 与"苗种期 CO₂ 无出处新增一档"同一形态。 现有 ACH 字段语义已是新风换气次数(标签与 title 均如此), 渗透风未建模。 |
| air 模式默认关塔改到计算层 | 不做 | 该联动 v2.3.3 四批已在 UI 事件层实现 (切到 air 时脱气塔自动置 false, 带 auto-value 样式与提示语, 并以 dataset.userSet 尊重用户显式选择), 由断言 S3 静态锁住 不得下沉到计算层 —— 计算层若按 aerationMode 猜用户意图, 用户显式选的 "air+开塔" 会被静默改掉。⚠ v2.4 立项时曾据 PROCESS_DEFAULTS 的字面量误判为"默认开塔", 核实后撤销。 |
| 脱气塔进风 CO₂ 本底单独分层 | 不做 | 脱气塔气路硬编码 OUTDOOR → OUTDOOR 且无 UI 可改 ⇒「塔吸车间空气」这个场景在模型里 不可达。保留一个服务于不可达场景的旋钮, 与 v2.5 撤销 roomMode='open' 同一理由。 已统一为 co2Outdoor_ppm 单一事实源。 |
| 自然通风给驱动力建模 | 不做 | 需要开口面积、风速、热压等本库没有的参数。v2.4 改为钳在用户填的 ACH 上: 不足时报 CO₂ 超标并给出缺口, 由用户去加大开口或改机械通风。 ⚠ 自然通风 ACH 随开口与天气跨近两个数量级 (温室夏季敞开设计 45–60, 冬季关口除湿约 3; 同一房间拆掉固定窗玻璃可从 9 变 66), 以它保证 CO₂ 限值 (人员暴露口径) 本身风险较高。 |
〔v2.2 注: 热平衡架构未变。v2.2 对本章相关的两处数值级修正 —— 风机温升 ΔT 与 mdot 不动点自洽、轴功 η 逐台加权 —— 见「v2.1 → v2.2」版本演进章 B/C 节。〕
本节是当前有效的模型描述。 第 29 章与本章 16.5 保留的是 v1.2–v1.9.3 的双节点求解器推导, 已于 v2.0.0 删除,仅作历史参考。
v2.0 起车间温度不再由空气节点方程求解,而是由暖通维持:
T_room = T_水温 ← 输入,非解 RH_room = roomRH_set ← 默认 65%,可调 Q_pool_loss ≡ 0 ← 温差为零,池面显热消失
改动理由见第 29 章章首:旧模型对热带鱼种算出车间 9–14 °C / RH 99%,而实测与规范一致指向 「空气 ≥ 水温」,方向反了 15–20 K。
Q_net_to_water = Q_metab + Q_equip + Q_makeup_signed
− Q_pool_loss (≡ 0)
− Q_evap_latent
+ Q_dehum_to_water
− Q_contactor_net ← v2.0 新增
气液接触器(脱气塔 + MBBR 曝气 + 蛋分供气)按出口水温饱和计算焓差
Δh = h(T_水, 饱和) − h(T_进气, RH_进气),Δh 可为负
(湿热空气遇冷水结露放热给水)。
Q_hvac_sens = Q_envelope + Q_vent_sens − Q_room_internal
T_room 受控后,暖通承担的是围护失热 + 通风失热 − 室内产热。
Q_room_internal 有三个组成,每一项都曾是孤儿:
| 组成 | 来源 | 补上的版本 |
|---|---|---|
Q_air_gain_kW × 24 | 电机 / 灯管废热 | v2.1(v2.0 删空气节点时成孤儿,带走 HVAC 显热负荷的 41.8%) |
Q_dehum_to_room | 除湿冷凝热(仅 dehumHeatDest==='indoor') |
v2.1(注释仍写「已在 T_room 迭代中计入」,而该迭代已删除) |
Q_blower_motor_kWh_d | 四台风机的电机损失(v2.2 起含 K-101) | v2.1(第五轮审计 P0)· v2.2 逐台加权 |
四台风机(脱气塔 + BF 曝气 + 蛋分供气 + 鱼池增氧 K-101;前三台在纯氧模式下 运行,K-101 为空气曝气模式专属。三文鱼 1000 t 成鱼期前三台合计约 107.7 kW) 的电功率逐台按各自效率拆两份:
轴功 P_shaft = Σ (P_elec,i × η_i) → 抬高接触器进气温度 电机损失 P_elec,total − P_shaft → Q_room_internal η_i 与各风机自身的功率公式同源: 脱气塔 proc.co2BlowerEfficiency (默认 60%) BF 曝气 0.60 (bfBlowerPower 公式内常数) 蛋分供气 proc.skimmerBlowerEta (默认 55%) K-101 proc.tankAirBlowerEfficiency (默认 60%)
📌 v2.2 修订一:由 ΣkW × 0.57 改为逐台加权。旧口径与各风机自身的效率参数脱节 ——
用户把 co2BlowerEfficiency 从 30 调到 90,电耗 174→95 kW,而模型轴功恒按 0.57 折,
方向反直觉(效率越高,模型认为进气流的热越少)。物理上
kWi × ηi = Q·Δp 即气侧有用功,与 η 无关;η 只该影响电机损失分成。
逐台加权自动恢复该性质。
进气温升 ΔT 与质量流量 mdot 互为因变量(温升改变密度、密度改变 mdot), 须解联立:
mdot · c_p · ΔT = P_shaft mdot = V̇_air · RHO_STD_AIR / 3600 ← v2.4: 常数, 与温度无关 ΔT = P_shaft / (mdot · c_p) ← 直接求, 无需迭代
mdot·c_p·ΔT ≡ P_shaft 恒成立, 断言 A3 逐位不变。
mdot = V̇_air · ρ(T_air + ΔT)/3600 的六次不动点迭代
(压缩因子 ≈ ΔT/T_abs ≈ 0.1, 6 次后误差 < 1e-4 K)。它当年修的是第六轮审计 P1
——温升按冷密度算、焓流按热密度算, 丢失部分轴功。迭代确实让两侧统一了,
但统一到了「风机加热后的密度」这一侧, 而风机不改变质量流量;
关塔工况风量骤小、温升可达 30 K, 该取法使质量流偏低 10.4%。
根因不是"用了哪个密度", 是风量当时没有声明参考状态。
⚠ v2.2 修订二:ΔT 与 mdot 必须取同一密度。旧实现 ΔT 按冷密度 mdot₀ 算、
焓流按热密度 mdot 算,注入气流的热 = P_shaft × (mdot/mdot₀),
丢失 (1 − mdot/mdot₀) 份轴功 —— 默认工况 1.2%(藏在断言 A3 的 0.15 K 容差内),
脱气塔关闭时风量骤小、ΔT ≈ 30 K,丢 10.1%。由边界工况 edge_no_degasser
触发 A3 显形。修复后 mdot · c_p · ΔT ≡ P_shaft 恒等成立。
⚠ 加热是等湿过程:绝对含湿量 W_in 不随温升变化,变的是相对湿度。
⚠ v2.1 之前这部分电功率没有任何去处 —— 既不在泵/UV 的电-热分配里,也不在其它热流里。 后果是接触器用原始室外温度算焓差,从水里多取约 18% 的热: 模型付电费让风机运转,却让这些电产生的热凭空消失,再付一次热泵的钱把水加热回来。
换水股 补水 V_exch (同盐度) ←→ 排污 V_exch (同盐度) 蒸发股 补淡水 E ←→ 蒸发失纯水 E V_makeup = V_exch + E
拆股后盐平衡恒等成立,无需盐度状态变量。净结露时(湿热气候养冷水鱼)没有
「补负淡水」,纯水先抵扣蒸发股,余量转排水并按
S × V_exch / (V_exch + V_surplus) 推出稳态盐度漂移。
| 项 | 字段 | 说明 |
|---|---|---|
| 水侧热泵 | thermalCostDaily | 调水温 |
| 除湿机 | dehumCostDaily | 潜热,独立机组,按设计冬/夏峰值选型 |
| 车间暖通 | hvacCostDaily | 显热,v2.0 新增;设备为 AHU-1002 |
⚠ 三者不重复:热泵调水温,AHU 维持室温(只管显热),除湿机承担潜热。
热平衡有十条页内不变量断言(?selftest=1)。改动本节任一式子时,
对应断言会转红 —— 那正是目的:
| 断言 | 锁什么 |
|---|---|
| A1 / A2 / A3 | 电-热分配完整(泵/UV 恒等式、由登记表枚举全量设备、轴功真的到达接触器) |
| B | 车间显热闭合 = 围护 + 通风 − 室内产热 |
| C | 水侧净热闭合(六项) |
| D / E | 登记完整性:有气量必须登记 airPath,有电功率必须在 POWER_REGISTRY |
| F1 / F2 / F3 | 水量闭合、盐平衡、热质同源 |
| F4 | 登记设备必须有 CAPEX 条目 |
⚠ 新增任何进/出车间或水侧的热流、任何用电设备、任何有气量的设备时,
必须同步 POWER_REGISTRY 与上述式子。这套断言正是为「热流成为孤儿」这类缺陷而设 ——
它在 v2.0(Q_air_gain)、v2.1(蛋分气流、风机热)已抓到三次。
v1.1 把热平衡参数(气温/源水温/U 值/换气率)放在每个阶段的 proc 字段里, 用户必须在每个阶段重复设置。
v1.2 把所有热平衡参数挪到顶部全局配置区 globalThermalConfig(项目级常量影响所有阶段)。具体参数表见第 28 章和附录 B。
T_room = T_水温,RH_room = roomRH_set(默认 65%),不再联立求解;池面显热 Q_pool_loss ≡ 0。
同时新增气液接触器项(脱气塔 + MBBR 曝气,出口按水温饱和)。
详见 v1.9.3 → v2.0.0 与第 29 章章首说明。
本节保留作推导与历史参考。
v1.1 假设池热散到一个无限大"室外", 实际上车间空气会被池水加热到比室外高 5-12°C, 导致池散热小于"对室外气温散热"; 同时湿度积累让蒸发率下降。v1.2 引入双节点稳态:
详细模型、求解算法和输出字段见第 29 章。
Q_evap × λ 从空气节点移到水体节点。物理: 蒸发夺走的是水体显热 (水分子带走能量),
空气节点只接收 潜热增量 (W_room 上升), 不直接接收 λ 项。
旧手册写在空气节点是 v1.2 推导笔误, 代码一直把 λ 项放在水节点的能量平衡里 (正确)。
| 类型 | COP_heat | COP_cool | 源温 | 适用 |
|---|---|---|---|---|
| 空气源 air | 3.5-4.0 | 2.5-3.0 | T_air | 常规, 气温 > -10°C |
| 水源 water | 4.5-5.5 | 3.5-4.5 | T_source | 有大量地下水/河水 |
| 地源 ground | 4.0-5.0 | 3.5-4.5 | T_ground (≈年均) | 有埋管空间 |
| 海水开式 seawater_open | 4.5-5.5 | 3.5-4.5 | T_seawater | 沿海/海上养殖, 钛板换热 |
| 泵 | 流量 | 默认扬程 m | 默认效率 | 说明 |
|---|---|---|---|---|
| 主循环泵 | 循环流量 Q | 12 | 68% | 全流量, 功率最大 |
| 反硝化支路泵 | Q × 反硝化比 | 10 | 60% | 分流到缺氧反应器 |
| UV 支路泵 | Q × UV 比 | 10 | 60% | |
| AOP 支路泵 | Q × AOP 比 | 10 | 60% | |
| 蛋分支路泵 | Q × 蛋分比 | 6 | 60% | 蛋分塔近距离 |
| RDF 反冲泵 | Q × 反冲比 | 8 | 55% | 间歇运行 |
主循环泵功率通常占全场电费 30-40%, 是最大单一用电设备。变频泵可节能 15-25%。
| 管道类型 | 推荐流速 m/s | 说明 |
|---|---|---|
| 吸水管 | 0.8-1.2 | 流速太高→气蚀 |
| 压水管 | 1.5-2.5 | 流速太高→水锤 |
| 排污管 | 1.0-2.0 | 需自清洗流速防沉积 |
| 溢流管 | 0.5-1.0 | 重力流 |
| 组成 | 典型值 | 说明 |
|---|---|---|
| 静水头 | 0.5-2 m | 鱼池到处理间高差 |
| 管道摩阻 | 2-4 m | 管长和管径决定 |
| 设备阻力 | 3-5 m | RDF+BF+UV 各约 1-2m |
| 安全余量 | 1-2 m | 10-20% |
| 合计 | 8-15 m | iRAS 默认 12m |
| 参数 | 传感器 | 精度 | 价格 | 位置 |
|---|---|---|---|---|
| DO | 荧光法 | ±0.1 mg/L | 5,000-15,000 | 鱼池+BF 出水 |
| pH | 玻璃电极 | ±0.01 | 2,000-5,000 | 鱼池+BF |
| 温度 | Pt100 | ±0.1°C | 500-1,000 | 鱼池+源水 |
| TAN | 离子选择 | ±0.1 mg/L | 20,000-50,000 | 鱼池 (可选) |
| ORP | 铂金电极 | ±5 mV | 3,000-8,000 | 蛋分 (臭氧控制) |
| 液位 | 超声波 | ±1 cm | 1,000-3,000 | 鱼池/集水井 |
| 报警项 | 阈值 | 响应 |
|---|---|---|
| DO 低 | < 5 一级 / < 3 紧急 | 启动备用风机/氧气瓶 |
| pH 低 | < 6.5 | 加 NaHCO₃; 减投饵 |
| TAN 高 | > 2.0 mg/L | 减投饵; 检查 BF |
| 温度异常 | 偏离 ±2°C | 检查热泵 |
| 液位低 | 低于设定 | 补水; 检查泄漏 |
| 停电 | 市电中断 | 柴油发电机 30 秒启动 |
| 泵故障 | 电流异常 | 切换备用泵 |
必备: ① 柴油发电机 (全场 100% 负荷); ② UPS (PLC + 传感器); ③ 短信报警; ④ 每月演练应急切换。
RAS 的封闭特性天然具有高生物安全性, 但一旦病原体进入会因循环水快速传播。"防进来"比"治病"更重要。新建项目应在投产前建立完整的生物安全 SOP。
| 对象 | 消毒剂 | 浓度/方法 | 频率 |
|---|---|---|---|
| 工具 | 碘伏 | 100 ppm 浸泡 10 min | 每次使用后 |
| 脚池 | 次氯酸钠 | 200 ppm 每周换液 | 每天 |
| 车间地面 | 过氧化氢 | 3% 喷洒 | 每周 |
| 鱼池 (空池) | 高锰酸钾 | 50 ppm 浸泡 24h | 批次间 |
| 进水 | UV | 60 mJ/cm² | 持续 |
新建 RAS 满负荷需要 8-12 周。急于满负荷投鱼是新手最常犯错误——BF 处理能力是逐步建立的, 超过 BF 能力 = TAN 暴涨 = 大量死鱼。
| 阶段 | 时间 | 操作 | 关键指标 |
|---|---|---|---|
| 设备调试 | 第 0-1 周 | 空载运行; 试压 | 设备无故障 48h |
| BF 培菌 | 第 1-4 周 | 加菌剂; 投 NH₄Cl 至 TAN 2-4 | TAN 下降, NO₂ 出现 |
| 硝化成熟 | 第 4-6 周 | 继续培菌 | TAN<0.5 且 NO₂<0.3 持续 3 天 |
| 低负荷放鱼 | 第 6-8 周 | 放容量 20-30% | TAN<1.0 稳定 |
| 加负荷 | 第 8-12 周 | 每周加 15-20% | 指标安全 |
| 满负荷 | 第 12+ 周 | 正常生产 | TAN<1, NO₂<0.3, DO>6 |
| 问题 | 原因 | 措施 |
|---|---|---|
| TAN 不降 | 温度太低/pH 太低 | 升温 25-30°C; 补碱度 |
| NO₂ 持续高 | Nitrobacter 未建立 | 正常! 耐心等待 |
| 放鱼 TAN 暴涨 | 投鱼太多/投饵太猛 | 减投饵 50%; 部分换水 |
| pH 快速下降 | 碱度耗尽 | 加 NaHCO₃ |
| 鱼不吃食 | 应激 | 检查水质; 减投饵 |
为什么分两层:工艺侧每一项都能追到物理量与公式(补水量来自 V_makeup、
排污量来自 V_discharge、维护保险来自 CAPEX);企业侧本质是经济估算,
定员与管理费率没有物理依据。混进一个总数会拉低整个模型的可追溯性,
故分别输出,可研报告中也应分别列示。
| 成本项 | 计算基础 | 实算 元/kg | 占企业全成本 |
|---|---|---|---|
| 人工 v1.9.2 | 定员 × 人均年成本 ÷ 365 定员 = max(最小班组, 年产量 ÷ 劳动生产率) | 2.55 | 6.1% |
| 管理费 v1.9.2 | (工艺运行成本 + 苗种 + 人工) × 费率 | 2.00 | 4.8% |
| 苗种 v1.9.2 | 首阶段年进塘尾数 × 苗种单价 只有首阶段采购,后续为场内转group | 0.41 | 1.0% |
| 企业全成本合计 | 41.97 | 100% | |
工况:1000 t/yr 大西洋鲑、青岛冬、mainline 拓扑;电 0.7 元/kWh、饲料 12 元/kg、液氧 1.2 元/kg。 定员 17 人(= max(8, 1000/60)),年采购苗种 27.5 万尾。 工艺运行成本占企业全成本 88.2%。
基数:维护对象横跨 CAPEX 的两个层次,而土建部分基本不产生年度维护:
| 维护对象 | 所在层次 | 是否计入 |
|---|---|---|
| 泵、风机、UV 灯管、微滤机滤网、氧锥、膜件、仪表 | 设备直购 | ✅ |
| 阀门、管件、泵密封、变频器、控制柜、池体防腐 | 总包系数(管道/电气/自控/安装) | ✅ |
| 厂房结构、场地、道路 | 总包系数(土建) | ❌ |
总包系数 2.2 中土建约占 0.4–0.6,其余 0.6–0.8 为管道/电气/自控/安装。
故默认基数取 设备直购 × 1.6(maintenanceBase = 'equipPlusInstall'),
另可选 'equipOnly'(仅设备直购)或 'totalProject'(工程总投资,偏保守)。
费率:iRAS 的设备单价库是国内设备口径——基数比进口交钥匙小得多, 但国产设备故障率与更换频次通常更高,费率应相应上调:
| 设备来源 | 基数 | 费率 | 说明 |
|---|---|---|---|
| 进口高端交钥匙(如 AKVA) | 大 | 2–3% | Nordic Aqua 宁波即此类 |
| 国产设备(iRAS 默认) | 小 | 4.5% | 可调 4–6% |
两者的绝对额可能反而接近——低造价换来高维护率,这是国产化方案在全生命周期上需要正视的权衡, 而不是单看 CAPEX 就能下结论的。
峰值成本通常是日均的 1.5-2.5 倍。设备必须能承受峰值, 但日常运行接近日均。
o2Demand,
其中含 peakFactor (1.5) 与 sAerator (1.10) 两个容量系数, 导致液氧成本高估
1.65 倍。v1.9.1 起液氧 OPEX 改用 o2ConsumptionDailyAvg。v1.1 引入双年限折旧:
1000 t/yr 三文鱼基准, 4 工况下综合成本对比(v1.3):
| 工况 | 气温/源水 | OPEX | 折旧 | 综合 元/kg | 对照文献 |
|---|---|---|---|---|---|
| 青岛冬 | -7°C/4°C | 22.4 | 13.6 | 35.96 | — |
| 海南冬 | 17°C/22°C | 24.1 | 13.6 | 37.70 | — |
| 海南夏 | 32°C/27°C | 26.9 | 13.6 | 40.47 | — |
| 挪威 Bergen 冬 | 0°C/4°C | 22.7 | 13.6 | 36.30 | Atlantic Sapphire 60-70(含人工/苗) |
其他鱼种(v1.1 数据, 单一工况):
| 鱼种 | OPEX 元/kg | 折旧 | 综合 | 文献 |
|---|---|---|---|---|
| 大菱鲆 500t | 31.9 | 16.2 | 48.1 | 46.32 (海水鱼体系) |
| 罗非鱼 1000t | 19.9 | 9.5 | 29.3 | 25-30 |
| 石斑鱼 300t | 27.4 | 12.7 | 40.1 | 60-100 (不含苗) |
| 加州鲈 500t | 27.9 | 12.7 | 40.6 | 30-50 |
| 鳜鱼 300t | 35.9 | 16.0 | 51.9 | 80-100 |
| 鳗鲡 300t | 44.6 | 15.2 | 59.8 | 60-100 (含苗) |
| 对虾 100t | 25.7 | 16.2 | 41.9 | 25-35 |
注: 上表为 v1.3 旧口径(仅饲料 + 工艺电耗 + 工艺消耗品 + 折旧)。 v1.9.2 已补齐维护/保险/补水/排污(工艺侧)与苗种/人工/管理(企业侧),口径定义见 21.1, 产业实绩对标见 21.5。仍未计入包装/物流/加工、疫苗药物、顾问技术服务费, 按 Nordic Aqua 结构反推约 6 元/kg 量级,做可研时须另行估算。
这是目前唯一一个中国本土、商业规模、公开披露财务数据的大西洋鲑 RAS 项目, 对国内做可研的人参考价值最高。数据取自 Nordic Aqua Partners AS(Euronext Growth,代码 NOAP) 2025 年第四季度暨全年中期报告,非二手报道。
| 项 | 内容 |
|---|---|
| 厂址 | 浙江省宁波市象山县高塘岛珠门村坑头山 |
| 业主 | 诺帝克水产(宁波)有限公司;母公司挪威 Nordic Aqua Partners AS |
| 技术方 | RAS 系统由挪威 AKVA Group 交钥匙总包;饲料 Skretting(Nutreco) |
| 规模 | 一期 4,000 t + 二期 4,000 t(HOG);三期规划至 20,000 t,用地长期潜力 5 万 t |
| 进度 | 2021 Q1 开工;2024 年 4 月首次收获;二期 2026 年 9 月首收,下半年满负荷 |
| 土地厂房 | 由象山海峡经济技术合作公司租赁提供(租至 2056 年,含购买选择权) |
| 期间 | 生物量产出(活重 LW) | 商业收获(HOG) | 均重 |
|---|---|---|---|
| 2024 全年 | 3,511 t | 523 t + 1,669 t 整鱼 | — |
| 2025 全年 | 3,981 t | 2,026 t | 3.9 kg HOG / 4.7 kg LW,优品率 97% |
| 2026 Q1 | 2,161 t(历史新高) | 771 t | 4.4 kg HOG / 5.4 kg LW |
| 2026 全年指引 | — | 5,000–6,000 t | 目标提至 7.0 kg LW |
yieldTons 是活重口径(由阶段末体重 weightEnd 反推,那是活鱼体重)。
若按 HOG 报的产能对标,需除以 0.83 换算。混用是可研报告中的常见错误。
公司披露的单位成本(2025):转入存货成本 5.8 EUR/kg(当期生产边际成本)、 期末存栏成本 5.7 EUR/kg、全年存货结转成本 8.4 EUR/kg(含早期高成本批次与异味事件影响)、 公司指引 2026 Q1 结转成本降至 7.0 EUR/kg 以下。
从损益表反推全年成本结构(产量 3,981 t 活重,汇率按 7.8 元/EUR):
| 项目 | M EUR | 元/kg | 占比 |
|---|---|---|---|
| 原料(饲料 + 鱼卵) | 7.126 | 14.0 | 21.3% |
| 其他外部费用(生产相关) | 14.657 | 28.7 | 43.7% |
| 人工 | 6.264 | 12.3 | 18.7% |
| 折旧 | 5.482 | 10.7 | 16.4% |
| 合计 | 33.529 | 65.7 | 100% |
| 分项 | iRAS 实算 | NOAP | 解读 |
|---|---|---|---|
| 饲料 | 14.80 | 12.9 | 差 15%,全在 FCR:iRAS 加权 1.188,NOAP 约 1.05–1.10 |
| 折旧 | 7.86 | 10.7 | 同量级,差异由进口设备解释 |
| 其他 OPEX | 10.04* | 28.7 | 差 2.9 倍——见下方归因 |
| 企业全成本 | 41.97 | 65.7 | — |
* 指 v1.9.2 补齐维护/保险/补水/排污之前的旧口径值,用于说明差距来源。
把 NOAP 的「其他外部费用」28.7 元/kg 按行业常规比例拆开(财报只披露合计):
| 去向 | 估算 元/kg | iRAS v1.9.2 是否建模 |
|---|---|---|
| 维护与备件 | 3.7 | ✅ 已补 |
| 补水(海水取水 + 淡化) | 1.8 | ✅ 已补 |
| 废水处理与排污 | 1.4 | ✅ 已补 |
| 保险 | 1.0 | ✅ 已补 |
| 包装 / 物流 / 加工外包 | 3.5 | ❌ 项目特有,不内置 |
| 顾问 / 技术服务费 | 1.6 | ❌ 取决于是否引进外方技术 |
| 疫苗 / 药物 / 化验 | 1.0 | ❌ 取决于病害压力 |
| 死鱼与固废处置 | 0.6 | ❌ |
| 残差(异味事件 1,900 万欧元整改摊销等一次性) | 4.1 | ❌ 一次性事件,绝不建模 |
v1.9.2 主体完成后接受了一轮第三方代码审计,共修复 8 项缺陷, 并新增自然冷却路径与自检入口。本节记录这些改动,因为其中数项会改变计算结果。
UI 会把自动算出的 o2FishFactor 回写进输入框的 value,
而读取端判断「用户是否手填」的依据是 value === ''。
v1.9.2 之前两者是幂等的(该字段就是纯生理值,写回再读出仍是同一个数)。
但 v1.9.2 把它的语义改成了池内总耗氧系数(= 生理值 + TSS 依赖附加), 幂等性被打破:回写含附加的值 → 用户碰任一工艺参数 → 该值被当作「手填的纯生理值」读回 → 再叠一次 TSS 附加。
修法:自动值改走 placeholder,不再写 value。
自动值与用户手填值在数据结构上彻底分开 —— value 保持为空即永远走自动公式,
除非用户真的键入数字。这样无论该字段的语义将来怎么变,都不会再出现回写污染。
同一节点里 TAN 只去除 η,NO₃ 却按 100% 增加 —— 单节点凭空多出 (1−η)×TANin 的氮。
(「稳态下 TAN 几乎全部硝化」这层意思已由独立的 no3PerCycle 表达,不应在沿程节点上再算一遍。)
biofilterTAN=0 且换水=0 时,
旧式给出反硝化进水 NO₃ = 115.7 mg/L(应为 4.25),进而使碱度回收 > 硝化消耗,
NaHCO₃ 投加量被算成 0 —— 模型给出「不用加碱」的危险结论,而实际 pH 会崩。
修复后同工况 NaHCO₃ 为 604 kg/d。
heatPumpKWh 是耗电量(= 热负荷 ÷ COP);用它除以利用小时得到的是电功率,
而国内冷水机组/空气源热泵的报价惯例是元/kW 制冷(制热)量,
EQUIP_PRICES_DEFAULTS.heatPump 的 2000 元/kW 正是这个口径。
(反推校核:若按电功率理解,等效制冷量单价仅约 580 元/kW,与市场不符。) 旧实现按电功率计价,使热泵 CAPEX 缩到约 1/COP。UI 上「热泵 xx kW」工程师也必然当制冷量读,口径必须一致。 修复后综合成本 +0.27~0.70 元/kg,设备清单与单价单位均标注为「kW 制冷/制热量」「元/kW(热)」。
通风新风量按 CO₂ 反算时固定用文献常数 500 g/kg 饲料,
而同一模型的 load.co2Daily 是自算的(呼吸 RQ≈1 + 硝化产 CO₂)。
两者相差 34%–117%(鲑鱼 671、大菱鲆 749、石斑 861、鳗鲡 1084 g/kg 饲料),
且差异随鱼种、水温、池内 TSS 变化。已改为优先取模型自算值,老数据回退到 500。
稳态解 Cout = Δ/(1−R) 只在 R < 1 时成立。当某污染物无有效去除路径
(η=0 且换水=0)时 R → 1,浓度随时间线性发散、无稳态;
而 Math.max(1−R, 0.001) 只是防除零,却把发散变成一个看起来精确的有限值
(如 TAN 339.89 mg/L)。
v1.9.2 新增 divergent 检测(R ≥ 0.999),UI 显式告警
「该污染物没有稳态解,相关浓度均不可信」,而非静默给数。
biofilterTAN(单次通过去除率 η,决定池内浓度)与 VTR₂₀/θ
(容积速率,决定填料容积)是两套独立参数,模型不校验其自洽性。
注意 bioVolume 本就是从 tanDaily 与 VTR 反算的,故
bioVolume × VTR ≡ tanDaily × sBio 恒成立,校核它没有意义。
真正的隐患是:η 受接触时间约束,而接触时间由填料容积与过滤流量决定。 用户可以填 η=95% 却配一个空床停留时间只有几十秒的 BF。新增 EBCT 校核:
| 空床接触时间 EBCT | 单级经验可达 η |
|---|---|
| < 1 min | 约 55% |
| 1–2 min | 约 70% |
| 2–5 min | 约 85% |
| > 5 min | 约 92% |
判据留了较大余量 —— 单次去除率还强烈依赖进水 TAN 浓度: 低浓度下反应处于一级动力学区,同样 EBCT 可达更高的百分比去除率。 iRAS 默认 70% + EBCT≈2.4 min 是国内常见配置,不报警;90%/95% 才告警。
产量输入框被清空(yieldTons=0)是必然出现的中间态 —— 用户改产量时必然先清空。
此时 biomass=0,feedAvg/biomass = 0/0 = NaN,并沿
load → sim.alk → naHCO₃ 成本 → totalAvg → 管理费 → 企业全成本 一路污染,
最终使全场汇总、成本卡片、财务评价全部显示 NaN 且无任何提示。
已在源头(比值计算)与两处出口(碱度、成本)做有限性兜底。
方案 JSON 导入路径会把 stage.name、鱼种名等完全来自文件的字符串
直接拼进 innerHTML,无转义。构造恶意 name 即可在本站源上执行脚本,
读取或篡改 localStorage 里的全部方案数据。而「设计院之间互发方案 JSON」正是本工具的预期用法,
故这不是理论风险。已新增 escapeHtml() 并修复 6 处注入点。
旧模型在任何需要制冷的工况下都走机械压缩制冷,COP 封顶 3.45。 但 RAS 是常年制冷型负荷,而冬季室外 −7°C 时完全可以用干冷器/板换直接把热排给室外空气或冷源水 —— 压缩机不启动,只跑风机和泵,能效比可达 15–30。
freeCoolingApproach_K 默认 6 K(干冷器 5–8,板换 2–3) ⚠ 已于 v1.9.3 被 fcDesignDT_K 取代(判据由阈值改为容量,语义与默认值均已变,见「v1.9.2 → v1.9.3 → D 节」)freeCoolingEER 默认 20
| 工况 | 气温 | 自然冷却 | COP | 热泵电耗 kWh/d |
|---|---|---|---|---|
| 青岛冬 | −7 °C | ✅ | 20.00 | 634 |
| Bergen 冬 | 0 °C | ✅ | 20.00 | 646 |
| 海南冬 | 17 °C | 否 | 3.45 | 4272 |
| 海南夏 | 32 °C | 否 | 3.11 | 5118 |
寒冷气候热泵费从 1.68 降至 0.29 元/kg,比电耗 12.2 → 10.2 kWh/kg。 跨气候成本差由 0.99 拉大到 1.83 元/kg —— 寒冷气候本就该因免费制冷而占优势,旧模型把这个优势完全抹掉了。
未做部分:部分自然冷却。冷源温度接近但不足时,实际可做预冷 + 压缩机补足; 本模型按「全有或全无」处理(保守,达不到判定就全走机械制冷)。 CAPEX 不额外计 —— 自然冷却复用热泵已有的排热侧,热泵仍按最不利工况(通常夏季)定容。
roomTemp(车间室温)—— v2.0 起不再生效。v1.2–v1.9.3 期间该输入框
虽可编辑,但值从未被 calcThermalLoad 消费(返回时被求解值覆盖)。
v2.0 起车间温度由暖通维持 = 水温,该输入已停用。degasserExhaustIndoorFrac(尾气入室比例)—— 已废弃。新气路拓扑下
该参数语义不完整:只描述尾气去向、未描述进气来源,而二者对结果影响方向相反。
工艺气路进气取室外、排气排室外,全程不碰车间。poolUValue(水面传热系数)—— v2.0 起无关。
T_room = T_w 后池面温差为零,Q_pool_loss ≡ 0。
访问 index.html?selftest=1 会跑固定工况并与内置基线比对。 ⚠ v1.9.3 已扩展为 14 项(11 数值 + 3 边界),受检字段由 2 个增至 4 个,见「v1.9.2 → v1.9.3 → C / E 节」。
calcCostEstimate 时少传三个参数 —— 它算的是旧口径。
这个数被写进主页面、本手册、README 三处对外发布,直到第三方审计才发现,误差 3.41 元/kg。recomputeAll()、读真实的
lastResults.summary,不得重新实现任何计算管线。基线值也全部来自这条路径的实测。
改动模型后若自检报 FAIL,先确认是否为有意的修改;若是,需同步更新
SELFTEST_BASELINE 与三处文档,避免再次出现文档与代码脱节。
上述修复完成后又接受了一轮复审验证(对修复版逐行 diff、重建复算环境、 对 8 项缺陷逐条设计用例复跑)。复审确认 6 项完整修复、1 项半修复、1 项记录在案, 但发现一个由「修了一半」造成的新问题,量级比原缺陷更大。
I.3 修复热泵计价时只改了 CAPEX,其余三处消费点没跟上, 导致同一台热泵在页面上出现 4 个数(三文鱼成鱼期):
| 出现位置 | 原公式 | 值 |
|---|---|---|
| 热平衡卡片「装机容量」 | heatPumpKWh / 16(电功率、当前工况、无共用系数) | 40 kW |
| 工况对比表「装机」 | 各工况 heatPumpKWh / 16 | 冬 40 / 夏 321 kW |
| 设备清单 / N+1 模块化 / P&ID | max(冬,夏) 电 / 22 × 0.75 | 175 kW |
| CAPEX 计价 | max(冬,夏) 热 / 22 × 0.75 | 545 kW |
最大与最小差 13.6 倍。/16 vs /22 的分歧是 v1.5 遗留(当时只改了一处),
电功率 vs 热功率是 I.3 修复引入的新分歧——而 I.3 的注释自己写的就是「口径必须一致」。
heatPumpKWh 被 EER=20 压掉一个数量级,于是设备清单的定容工况从冬悄悄切到夏,
而 CAPEX 那边因为用热功率、冬夏都没变——两条链的主导工况都不一样了。
对出图与报价的杀伤力比原来「CAPEX 少算 3 倍」更大。
修法:抽出统一函数 hpInstalledKwOf() / hpThermalKWh(),
四处全部改用热功率(制冷/制热量)÷ 22 h,并在自检中加入断言
「设备清单热泵 kW == CAPEX 热泵 kW」,防止再次分裂。
I.7 的空场防护只清干净了成本链,沿程水质节点仍为 NaN:
flowM3h = 0 → cyclesPerDay = 0 → tanPerCycle = 0/0。
而水质面板的格式化函数是 (typeof n === 'number' ? n.toFixed(d) : n)——
NaN 也是 number,于是界面上最显眼的那块面板直接显示「NaN mg/L」。
成本卡片干净了,反而更容易让人以为只是水质模块出错。
已在 simulateWaterQualityProcess 入口加零流量短路,返回全 0 骨架并置 emptyFarm: true。
null,但渲染层守卫是 st.pH !== undefined——
null 通过守卫后 .toFixed() 直接抛异常,整个 renderFlow 崩掉。改为省略字段。sim.skimmer ? sim.skimmer.ozoneDemand : 0 取值,对象存在但字段缺失得到 undefined,
参与加法即 NaN。骨架必须把下游会读的字段补全为 0,而不只是给个空对象。
稳态物料守恒:TAN 产生 = TAN 硝化 + TAN 随换水排出。正常工况下池内 TAN < 1 mg/L, 换水排出可忽略,硝化量 ≈ 100% 产生量——旧式成立。 但 η 很低时 TAN 浓度飙升,换水带走的份额不再可忽略:
| η_bio | 池 TAN mg/L | 稳态 NO₃-N | NaHCO₃ kg/d | 换水带走 TAN kg/d |
|---|---|---|---|---|
| 70% | 0.49 | 20.2 | 582 | 0.1 |
| 30% | 1.13 | 20.1 | 581 | 0.2 |
| 5% | 6.69 | 19.9 | 572 | 1.4 |
| 0% | 414 | 0.0 | 0 | 82.8(全部) |
旧式在 η=0 时一边报告 TAN 发散、一边照常按全量产 NO₃ 并消耗全额碱度—— 没有硝化菌却在硝化。修复后 TAN 日产 82.8 kg/d 全部经换水排出,NO₃ 产生量与碱度消耗同步归零。
边界处理:η=0 且 换水=0 时 TAN 本身发散,此时 tanOut 是钳制产物、
换水导出项又恒为 0,公式会退化回「全量硝化」。已将 NO₃ 一并标记为随 TAN 发散,碱度侧同步,
由发散告警统一提示「相关浓度均不可信」。
0.001 看似无害的防除零,实际是「单次循环去除率下限 0.1%」。
而单次稀释率 = 日换水率 ÷ 日循环次数:典型工况(5178 m³ 水体 / 10155 m³·h⁻¹ → 47 次/日、换水 4%/d)
只有 0.085%,本来就低于该下限。
| 换水率 %/d | 单次稀释 | 旧式 NO₃-N | 理论值 |
|---|---|---|---|
| 1% | 0.000205 | 339.9 | 1657 |
| 2% | 0.000410 | 339.9 | 829 |
| 4%(默认) | 0.000820 | 339.9 | 414 |
| 6% | 0.001231 | 276.2 ✅ | 276.2 |
| 10% | 0.002051 | 165.7 ✅ | 165.7 |
换水率 ≤ 约 4.8%/d 时被硬钳成同一个值、完全不响应换水率,而 iRAS 默认换水率正是 4%。 影响的是只靠换水去除的组分(旁路小时的 NO₃、无 AOP 时的 geosmin); TAN 有 BF(70%)、TSS 有微滤机(75%),单次去除率远高于 0.1%,碰不到下限——这也是它藏了这么久的原因。
R ≥ 0.999,这些被钳制的工况全被标成「无稳态解」。
表面上是「模型诚实地告警了」,实际是用一个错误的告警盖住了一个错误的数。
把阈值改到 1 − 1e-9(真正的发散只在完全无去除路径时出现,此时 R 恰为 1)后告警消失,
数值错误才暴露出来。过于宽松的告警阈值比没有告警更危险——它让人以为问题已被发现并处理。
| 项 | 处理 |
|---|---|
| NH₃ 着色阈值写死 25 μg/L | 改为按鱼种取值(鲑科 12.5 / 大菱鲆 20 / 石斑 30 / 加州鲈·鳜·对虾 50 / 鳗鲡 60 / 罗非 100)。原值对冷水鲑科偏松一倍、对温水种偏严 2–4 倍,而同一个 tooltip 自己写着「三文鱼 12.5、温水鱼 50–100」 |
| 方解石饱和指数 Ω 无告警 | 新增欠饱和告警(Ω < 1 警告、< 0.6 严重)。实测四个海水鱼种 Ω 0.55–1.53(v2.5 链式重导后;多数阶段欠饱和,对虾苗种期 1.53 过饱和)——长期溶蚀混凝土池体与砂浆、不利于甲壳类蜕壳与贝类钙化,是海水 RAS 的真实关切 |
| 自然冷却无 UI 露出 | 热平衡卡片与工况对比表加 ❄️ 标记;三个参数(启用/逼近温差/EER)接入围护区,UI/读取/载入/监听全链路贯通(原先只在 PROCESS_DEFAULTS,等于硬编码) |
| 标题成本未标工况 | 头条数字旁标注 [设计冬工况]。自然冷却使设计冬变成全年最省(35.59 / 年均约 36.9 / 设计夏 37.37),不标注读者易当年均值 |
| EBCT 校核的 fallback 是死代码 | stageFarm.flowM3h 字段不存在,改 load.flowM3h |
复审指出:11 条基线全是 golden-master(硬编码期望值),只能锁行为、不能发现系统性错误—— 一个常数错了它会安静地一直通过。这次审计的 8 项缺陷里只有 1 项能被原形式的自检抓到。
已补两类不依赖「当前值是对的」这个前提的断言:
load/thermal/eq/capex/cost
与全部沿程水质节点的每一个数值字段,不得出现 NaN/Infinity——正是②那类问题的通用捕手外加三个边界工况(yieldTons = 0 / 0.001 / 100000),只跑断言不比对数值。
这套断言加上当场就抓出了②的 5 个 NaN 字段,修完才转 PASS。
const 暂时性死区、删变量未查引用、补丁静默未写入),
三次都是自检抓到的——表现为「全部工况返回 0」或「XX is not defined」。
没有自检的话这三个都会带到浏览器才发现,其中「常量未定义」在无头环境还会被 try/catch 吞掉,更难查。
| 项 | 原因 |
|---|---|
| CDN 无 SRI | cdn.tailwindcss.com 是运行时编译,内容随访问变化,无稳定 hash 可做 SRI;内联需构建步骤,与「单文件双击即用」定位冲突。已在 index.html 头部写明风险与建议方案(内联 Tailwind 产物 + chart.js,一并解决 SRI/FOUC/离线三个问题),属部署决策 |
| 抽出 engine.js + 单元测试 | 这是根治「验证脚本与模型脱节」的唯一办法,但属重构。核心 13 个计算函数中 12 个已是纯函数(零 DOM 引用),依赖的模块级标识符仅 14 个,其中 8 个是常量表 —— 抽取难度不大,主要障碍是 5 个可变全局(stagesState 等)。建议在浏览器实测通过、代码稳定后,以自检为金标准再做 |
鳗鲡是本工具内置鱼种中参数不确定性最大的一个,v1.9.2 对其做了整体重做。 本节说明哪些参数有据可查、哪些查不到,供做鳗鲡项目的使用者判断可信边界。
| 参数 | 旧值 | 新值 | 依据 |
|---|---|---|---|
| 养成期密度 | 40 kg/m³ | 120 | 欧洲 RAS「120 kg/m³ 不罕见」;50 g 入池后可达 100–150 |
| 白仔 / 黑仔期密度 | 10 / 25 | 12 / 50 | 玻璃鳗隔离期仅 0.3–0.5 kg/m³,逐级提高 |
| 上市规格 | 200 g (5P) | 300 g (3P) | 3P 美洲鳗批发 92 元/kg;美洲鳗为国内主养品种 |
| 换水率(养成) | 4%/d | 6% | 国际 RAS 5–8%/日 |
| 各阶段月数 | 3/4/5 | 2/6/7 | 单尾生长期 10–14 月至商品规格 |
| 综合成活率 | 70% | 75% | 国际口径反推 92%(偏乐观)、中国口径 70–80%,取中 |
| 苗种单价 | — | 10 元/尾 | 美洲鳗;缅因州玻璃鳗配额独立反推 10.8 元/尾 |
months 填单尾生长期(合计 15 月)。工艺参数可以逐条查证,但单位养殖成本找不到可用的现代公开数据:
| 数据源 | 为什么用不了 |
|---|---|
| 国内上市公司年报 | 出池量中自用转加工占比高(2026 Q1 为 86%),营收 ÷ 产量反推严重失真;单位养殖成本属商业机密,不单列 |
| 欧洲龙头(Nijvis、ALBE 等) | 均为私营企业,不披露财务 |
| FAO 各国成本数据 | 过时约二十年,且早于鳗苗价格暴涨(同期欧洲玻璃鳗 300–750 EUR/kg,今约 5–13 倍);其中丹麦鳗鱼产量已由 2020 年萎缩至 2024 年的 101 吨、年均降 37% |
| 设备 | 计价单位 | 默认单价 | 推荐范围 | 说明 |
|---|---|---|---|---|
转鼓微滤机rdf | 元/(m³/h) | 500 | 300 - 800 | |
MBBR 池系统 (填料+曝气配件, 不含池体/风机)biofilter | 元/m³ 填料 | 4500 | 3000 - 6000 | |
UV 消毒器uv | 元/kW | 10000 | 8000 - 15000 | |
蛋白分离器skimmer | 元/m³ | 25000 | 15000 - 40000 | |
臭氧发生器ozone | 元/(kg/d) | 100000 | 80000 - 150000 | |
AOP 反应池aop | 元/m³ | 35000 | 20000 - 50000 | |
反硝化反应器denitri | 元/m³ | 5500 | 4000 - 8000 | |
脱气塔degas | 元/m² | 20000 | 15000 - 30000 | |
主循环泵+变频mainPump | 元/kW | 3500 | 2500 - 5000 | |
支路泵 (各)branchPump | 元/kW | 3000 | 2000 - 4000 | |
加药计量泵 (每台)dosingPump | 元/台 | 5000 | 2000 - 15000 | ⚠ 按台计价 —— 计量泵按 kW 计价会差一个数量级 |
罗茨风机blower | 元/kW | 4000 | 3000 - 6000 | 罗茨风机 (脱气塔 / BF / 蛋分供气 / 鱼池曝气) |
车间通风机 (轴流)ventFan | 元/kW | 800 | 300 - 1500 | ⚠ 待产业校准: 估值, 未取自报价单; 不可复用罗茨口径 |
液氧增氧塔o2tower | 元/(m³/h) | 350 | 200 - 500 | |
热泵 (空气源)heatPump | 元/kW(热) | 2000 | 1500 - 3000 | ⚠ 口径为制冷/制热量, 非电功率 |
板式换热器heatExch | 元/m² | 1200 | 800 - 2000 | |
机械除湿机dehumidifier | 元/(kg/h) | 1500 | 800 - 3000 | 按额定除湿量计价 (工业整机含风道/控制) |
车间暖通机组hvacUnit | 元/kW(冷热) | 400 | 250 - 800 | 整机口径; 处理空气显热, 单位容量造价低于热泵一个量级 |
capex.total, 但本表与设备清单页都没跟 ——
这就是下游审计咬出的"清单少四台、总价却对得平"(另一台是 K-501
蛋分供气风机, 归在上表"罗茨风机 元/kW"口径内)。详见 31.7。ventFan 单价 2,000 元/kW 属待校准项: 轴流风机与罗茨风机
(4,000 元/kW)是两类设备, 该值取自轴流量级估算, 尚无报价样本支撑。
放大系数涵盖: 管道阀件 (15-20%)、电气仪表 (10-15%)、自控 (5-10%)、安装调试 (10-15%)、土建厂房 (30-40%)、设计监理 (5-8%)。
概算精度约 ±40%, 实际造价以厂商报价为准。iRAS 投资概算用于项目可行性初判, 不能替代正式造价。
v1.7 引入氧锥拓扑 mainline / bypass 区别建模, 对 CAPEX 有显著影响 (1000 t 大西洋三文鱼实测):
| 设备项 | mainline | bypass | 差异 | 说明 |
|---|---|---|---|---|
| 液氧增氧塔 A-601 | 355 万 (Q=10155 m³/h) | 36 万 (Q×10% = 1015 m³/h) | -319 万 | 规模缩 10× (按小流量定价) |
| 主泵 P-101 | 213 万 (610 kW) | 171 万 (488 kW) | -42 万 | 主泵不过锥, 扬程降低 |
| 旁路泵 P-602 | 0 | 28 万 (92 kW) | +28 万 | v1.7 新增独立设备 |
| 液氧储罐 V-901 | ≈ 相同 | ≈ 相同 | ~0 | 站级 CAPEX 按日耗推算, 拓扑不影响日耗 |
| 设备 CAPEX 小计 | 4,454 万 | 3,842 万 | -612 万 | — |
| 工程总投资 (× Lang 2.2) | 9,800 万 | 8,454 万 | -1,346 万 (-14%) | 含放大系数 |
本案例使用 iRAS v1.7 默认的大西洋三文鱼参数, 演示完整计算并对比两种氧锥拓扑。气候选用挪威 Bergen 冬季工况 (T_air=0°C, T_source=4°C, T_target=15°C), 这是工程实际三文鱼项目最具代表性的气候。
本章表格由模型实算生成(tools/gen_case_chapters.js), 不再手写 —— 案例章通篇是实算数字, 手写则模型每改一次就整章过期且无任何信号。
salmon_bergen_w(T_air 0 °C / T_source 4 °C / RH 75%)。⚠ 它是「冬季设计工况」的隔离口径, 夏冬同温, 不是 Bergen 的真实年度气候 —— 立此基线是为了压住全量自然冷却的边界(余量仅 9%)。不应据本章数字做年度经济性判断; 年度口径请在软件里选气候预设后自行计算。另注: CLIMATE_PRESETS 里没有 Bergen(只有 Tromsø), 本章不为此新造预设 —— 无出处的气候数据不进模型。基准工况: 大西洋三文鱼 1000 t/yr · 挪威 Bergen 冬季工况 · 设计阶段 成鱼期 · 门禁基线 salmon_bergen_w
| 参数 | 苗种期 | 幼鱼期 | 中鱼期 | 成鱼期 |
|---|---|---|---|---|
| 体重 (g) | 0.1→50 | 50→500 | 500→2000 | 2000→5000 |
| 月数 | 6 | 8 | 6 | 4 |
| FCR | 1 | 1.1 | 1.2 | 1.2 |
| 蛋白 (%) | 50 | 45 | 42 | 40 |
| feedRate (%) | 1.42 | 0.96 | 1.00 | 0.95 |
| 水温 (°C) | 12 | 14 | 15 | 15 |
| 密度 (kg/m³) | 30 | 50 | 60 | 70 |
| 盐度 (‰) | 0 | 0 | 12 | 30 |
| 推荐池深 (m) | 1.5 | 3 | 5 | 7 |
| 换水/turnover | 4 | 3 | 2.5 | 3 |
| 损耗 (%) | 15 | 8 | 4 | 3 |
关键计算结果 (模型实算):
| 参数 | 苗种期 | 幼鱼期 | 中鱼期 | 成鱼期 |
|---|---|---|---|---|
| 存塘量 (t) | 3.2 | 41.1 | 131.6 | 236.9 |
| 峰值投饵 (kg/d) | 45 | 394 | 1316 | 2251 |
| TAN 产生 (kg/d) | 2.1 | 16.3 | 50.8 | 82.8 |
| CO₂ 产生 (kg/d) | 36 | 312 | 1105 | 1822 |
| 鱼峰值耗氧 (kg/h) | 0.8 | 7.0 | 27.5 | 45.0 |
| 循环流量 (m³/h) | 424 | 2465 | 5481 | 10155 |
| 系统水体 (m³) | 106 | 822 | 2193 | 3385 |
| 池内 CO₂ (mg/L) | 3.5 | 5.2 | 8.7 | 7.7 |
| 池内 NH₃-N (mg/L) | 0.0097 | 0.0073 | 0.0030 | 0.0024 |
| 池内 pH | 8.02 | 7.83 | 7.29 | 7.26 |
| 泵功率合计 (kW) | 20.0 | 116.3 | 258.7 | 479.2 |
| 阶段设备投资 (万元) | 122.2 | 654.9 | 1308.6 | 2383.9 |
| 模型告警条数 | 2 | 2 | 3 | 3 |
全场汇总:
| 指标 | 数值 | 指标 | 数值 |
|---|---|---|---|
| 工艺运行成本 | 37.12 元/kg | 企业全成本 | 42.09 元/kg |
| 比电耗 | 10.35 kWh/kg | 其中热泵 | 0.23 元/kg |
| OPEX | 28.82 元/kg | 折旧 | 8.31 元/kg |
| 工程总投资 | 9877 万元 | 峰值流量 | 10155 m³/h |
| 系统总水体 | 9732 m³ | 用地 | 16.2 亩 |
成本构成 · 口径: 成鱼期(大西洋三文鱼 1000 t/yr · 挪威 Bergen 冬季工况)· 全周期日均 元/日
| 成本项 | 计算基础 | 元/日 | 占比 |
|---|---|---|---|
| 饲料 | 日投饵量 × 饲料单价 | 24037 | 42.0% |
| CAPEX 折旧 | 设备/8年 + 土建/20年 ÷ 365 | 12083 | 21.1% |
| 电费(泵/UV/杂项) | 主泵+支路泵 ÷ motorEta + UV + 照明控制 | 8168 | 14.3% |
| 维护+保险+补水+排污 | processExtraDaily(四项之和, 见 21.1.3) | 6371 | 11.1% |
| 增氧(液氧或风机) | o2 模式=液氧; air 模式=K-101 电费 | 1505 | 2.6% |
| NaHCO₃ | 碱度投加 ÷ 0.595 × 单价 | 1411 | 2.5% |
| 电费(CO₂ 风机) | 脱气塔风机 × 24h | 987 | 1.7% |
| 电费(BF 风机) | BF 粗孔曝气 × 24h | 860 | 1.5% |
| 甲醇 | 反硝化需求 × 单价 | 800 | 1.4% |
| 电费(热泵) | 热泵电耗 × 电价 | 456 | 0.8% |
| 电费(车间暖通) | 车间显热 ÷ COP × 电价 | 249 | 0.4% |
| 电费(蛋分风机) | K-501 × 24h | 215 | 0.4% |
| 电费(臭氧) | 臭氧发生器 × 24h | 38 | 0.1% |
| 电费(车间通风机) | KV-1003 × 24h | 10 | 0.0% |
| 电费(除湿机) | 除湿量 ÷ SMER × 电价 | 0 | 0.0% |
| 分项合计 | — | 57190 | 100.0% |
| 模型 totalAvg | 含折旧的工艺运行成本 | 57190 | 100% |
✅ 分项合计 ⇔ totalAvg 闭合(差 < 0.5%), 说明成本明细已全部过桥。
下表是 v1.7 工具实际输出值 (jsdom 跑测,默认气候即挪威 Bergen 冬季, 默认价格电 0.7 元/kWh / 液氧 1.2 元/kg / 饲料按各阶段单价):
| 项目 | mainline (主流串联) | bypass (旁路高压) | 差异 |
|---|---|---|---|
| CAPEX 设备直购 | 4,455 万元 | 3,843 万元 | -612 万元 |
| CAPEX 工程总投资 (× Lang 2.2) | 9,800 万元 | 8,454 万元 | -1,346 万元 |
| 年折旧 (设备 8 年 / 土建 20 年) | 824 万元/年 | 711 万元/年 | -113 万元/年 |
| 年 OPEX (不含折旧) | 2,846 万元/年 | 2,830 万元/年 | -16 万元/年 |
| 年综合成本 (含折旧) | 3,670 万元/年 | 3,541 万元/年 | -129 万元/年 |
| OPEX (元/kg) | 28.46 元/kg | 28.30 元/kg | -0.16 |
| 折旧 (元/kg) | 8.24 元/kg | 7.11 元/kg | -1.13 |
| 综合成本 (元/kg 鱼, 含折旧) | 36.70 元/kg | 35.41 元/kg | -1.29 |
| 对照文献 | Atlantic Sapphire (Florida) 60-70 元/kg (含人工/苗/管理) Nordic Aqua 宁波 (中国境内) Q2 2024 实测生产成本 41 元/kg ≈ EUR 5.23/kg | — | |
| 偏差说明 | iRAS 不含人工 (~6-8 元/kg) / 苗种 (~5 元/kg) / 管理与营销 (~3-5 元/kg)。 iRAS 36.70 + 软成本 ~16 元/kg ≈ 53 元/kg,与挪威 Salmon Evolution 目标"与海水网箱打平"(NOK 50-60/kg ≈ 35-42 元/kg) 量级一致。 | — | |
| 工况 | OPEX 元/kg | 综合 元/kg | 差异原因 |
|---|---|---|---|
| 青岛冬 | 22.4 | 35.96 | 基准 (v1.3 数据) |
| 海南冬 | 24.1 | 37.70 | 仍需制冷 (气温 > 水温) |
| 海南夏 | 26.9 | 40.47 | 32 → 15°C 制冷温差大 |
| 挪威 Bergen 冬 | 22.7 | 36.30 | 气温温和 + 源水冷 |
关键观察: 三文鱼养殖目标水温 12-15°C, 海南夏季气温 32°C, 制冷温差 17-20°C, 制冷电费暴增。不建议在海南养三文鱼。挪威成本接近青岛, 长期运行更优。
1000 t 大西洋三文鱼成鱼期 (Q=10155 m³/h, V_total ≈ 5183 m³, 4 模块) 在 Bergen 冬季工况下的两种拓扑全工况对比:
| 对比项 | mainline (主流串联) | bypass (旁路高压) | 差异 |
|---|---|---|---|
| 动力消耗 | |||
| 主泵 P-101 功率 | 610.4 kW | 488.3 kW | -122.1 kW |
| 旁路泵 P-602 功率 | 0 (无) | 92.2 kW | +92.2 kW |
| 综合泵功率 | 610.4 kW | 580.5 kW | -29.8 kW (节能) |
| 年电费节省 (8000 h × 0.7 元/kWh) | — | — | ~17 万元/年 |
| 设备规格 | |||
| 液氧增氧塔 A-601 流量 | 10155 m³/h (全流量) | 1015 m³/h (10% 旁路) | 缩 10× |
| 主泵扬程 H_main | 12 m + 3 m (锥子) = 15 m | 12 m (主泵不过锥) | -3 m |
| 旁路泵扬程 H_bypass | — | 20 m | +20 m (高压锥) |
| CAPEX (设备直购) | |||
| 主泵 P-101 | 213 万元 | 171 万元 | -42 万 |
| 液氧增氧塔 A-601 | 355 万元 | 36 万元 | -319 万 |
| 旁路泵 P-602 | 0 | 28 万元 | +28 万 |
| 液氧储罐 V-901 (站级) | ~ 相同 | ~ 相同 | ~0 |
| 设备 CAPEX 小计 | 4,454 万元 | 3,842 万元 | -612 万 |
| 工程总投资 (× Lang 2.2) | 9,800 万元 | 8,454 万元 | -1,346 万 (-13.7%) |
| 财务指标 (售价 60 元/kg, 30%自有/70%贷款 @ 5%/8年, 折现率 8%, 项目 15 年) | |||
| 全投资 IRR | 14.90% | 17.31% | +2.41% |
| 自有资金 IRR | ~22% | 25.23% | +3% |
| 全投资 NPV (万元) | 5,779 | 7,031 | +1,252 |
| 静态回收期 (年) | 6.19 | 5.57 | -0.62 |
| 动态回收期 (年) | 8.63 | 7.42 | -1.20 |
| BEP (% 满产) | 62.3% | 57.9% | -4.3% |
基准工况: 大菱鲆 500 t/yr · 默认气候 (青岛) · 设计阶段 成鱼期 · 门禁基线 turbot_500
| 参数 | 苗种期 | 中鱼期 | 成鱼期 |
|---|---|---|---|
| 体重 (g) | 3→50 | 50→250 | 250→600 |
| 月数 | 4 | 8 | 6 |
| FCR | 0.9 | 1.1 | 1.3 |
| 蛋白 (%) | 55 | 50 | 48 |
| feedRate (%) | 1.70 | 0.78 | 0.90 |
| 水温 (°C) | 16 | 16 | 16 |
| 密度 (kg/m³) | 25 | 50 | 60 |
| 盐度 (‰) | 28 | 28 | 28 |
| 推荐池深 (m) | 0.8 | 1 | 1 |
| 换水/turnover | 3.5 | 3 | 2 |
| 损耗 (%) | 15 | 6 | 3 |
关键计算结果 (模型实算):
| 参数 | 苗种期 | 中鱼期 | 成鱼期 |
|---|---|---|---|
| 存塘量 (t) | 8.8 | 88.7 | 179.8 |
| 峰值投饵 (kg/d) | 149 | 691 | 1618 |
| TAN 产生 (kg/d) | 7.6 | 31.8 | 71.5 |
| CO₂ 产生 (kg/d) | 127 | 568 | 1436 |
| 鱼峰值耗氧 (kg/h) | 2.7 | 12.4 | 34.7 |
| 循环流量 (m³/h) | 1230 | 5319 | 5994 |
| 系统水体 (m³) | 351 | 1773 | 2997 |
| 池内 CO₂ (mg/L) | 4.2 | 4.4 | 10.0 |
| 池内 NH₃-N (mg/L) | 0.0048 | 0.0045 | 0.0021 |
| 池内 pH | 7.52 | 7.49 | 7.15 |
| 泵功率合计 (kW) | 58.0 | 251.0 | 282.8 |
| 阶段设备投资 (万元) | 371.4 | 1412.6 | 1760.2 |
| 模型告警条数 | 2 | 3 | 3 |
全场汇总:
| 指标 | 数值 | 指标 | 数值 |
|---|---|---|---|
| 工艺运行成本 | 57.19 元/kg | 企业全成本 | 66.31 元/kg |
| 比电耗 | 21.05 kWh/kg | 其中热泵 | 2.31 元/kg |
| OPEX | 43.06 元/kg | 折旧 | 14.13 元/kg |
| 工程总投资 | 8404 万元 | 峰值流量 | 5994 m³/h |
| 系统总水体 | 7447 m³ | 用地 | 55.4 亩 |
成本构成 · 口径: 成鱼期(大菱鲆 500 t/yr · 默认气候 (青岛))· 全周期日均 元/日
| 成本项 | 计算基础 | 元/日 | 占比 |
|---|---|---|---|
| 饲料 | 日投饵量 × 饲料单价 | 15823 | 37.3% |
| CAPEX 折旧 | 设备/8年 + 土建/20年 ÷ 365 | 9562 | 22.6% |
| 电费(泵/UV/杂项) | 主泵+支路泵 ÷ motorEta + UV + 照明控制 | 4836 | 11.4% |
| 维护+保险+补水+排污 | processExtraDaily(四项之和, 见 21.1.3) | 4822 | 11.4% |
| 电费(车间暖通) | 车间显热 ÷ COP × 电价 | 1955 | 4.6% |
| 电费(热泵) | 热泵电耗 × 电价 | 1913 | 4.5% |
| NaHCO₃ | 碱度投加 ÷ 0.595 × 单价 | 903 | 2.1% |
| 增氧(液氧或风机) | o2 模式=液氧; air 模式=K-101 电费 | 800 | 1.9% |
| 电费(CO₂ 风机) | 脱气塔风机 × 24h | 583 | 1.4% |
| 甲醇 | 反硝化需求 × 单价 | 495 | 1.2% |
| 电费(BF 风机) | BF 粗孔曝气 × 24h | 481 | 1.1% |
| 电费(蛋分风机) | K-501 × 24h | 127 | 0.3% |
| 电费(车间通风机) | KV-1003 × 24h | 61 | 0.1% |
| 电费(臭氧) | 臭氧发生器 × 24h | 16 | 0.0% |
| 电费(除湿机) | 除湿量 ÷ SMER × 电价 | 0 | 0.0% |
| 分项合计 | — | 42376 | 100.0% |
| 模型 totalAvg | 含折旧的工艺运行成本 | 42376 | 100% |
✅ 分项合计 ⇔ totalAvg 闭合(差 < 0.5%), 说明成本明细已全部过桥。
| 对比维度 | 清水 RAS | Biofloc (BFT) |
|---|---|---|
| 水处理核心 | 微滤机 + 生物滤池 | 靠异养菌絮团原位处理 TAN |
| 有无生物滤池 | 有 (MBBR) | 无 (最大区别) |
| 水色 | 清澈 | 褐色 (絮团 300-800 mg/L) |
| 碳氮比 | 无要求 | C:N ≥ 15:1 关键 |
| DO 需求 | 按 RAS 标准 | 极高 (异养菌+硝化菌+虾) |
| 密度 | 2-15 kg/m³ | 3-8 kg/m³ |
| 投资 | 高 | 低 |
| 运行难度 | 中等 | 高 (絮团管理, 翻塘风险) |
| iRAS 支持 | ✓ | ✗ |
基准工况: 南美白对虾 100 t/yr · 默认气候 (青岛) · 设计阶段 养成后期 · 门禁基线 shrimp_100
| 参数 | 苗种期 | 养成前期 | 养成后期 |
|---|---|---|---|
| 体重 (g) | 0.01→1 | 1→10 | 10→30 |
| 月数 | 1 | 1.5 | 1.5 |
| FCR | 1 | 1.3 | 1.6 |
| 蛋白 (%) | 45 | 42 | 38 |
| feedRate (%) | 10.00 | 5.00 | 3.00 |
| 水温 (°C) | 30 | 30 | 30 |
| 密度 (kg/m³) | 2 | 8 | 15 |
| 盐度 (‰) | 15 | 15 | 15 |
| 推荐池深 (m) | 1 | 1.2 | 1.5 |
| 换水/turnover | 2 | 2.5 | 2.5 |
| 损耗 (%) | 30 | 15 | 10 |
关键计算结果 (模型实算):
| 参数 | 苗种期 | 养成前期 | 养成后期 |
|---|---|---|---|
| 存塘量 (t) | 0.2 | 2.8 | 8.8 |
| 峰值投饵 (kg/d) | 22 | 139 | 264 |
| TAN 产生 (kg/d) | 0.9 | 5.4 | 9.2 |
| CO₂ 产生 (kg/d) | 21 | 127 | 236 |
| 鱼峰值耗氧 (kg/h) | 0.5 | 3.4 | 6.4 |
| 循环流量 (m³/h) | 223 | 866 | 1466 |
| 系统水体 (m³) | 111 | 346 | 586 |
| 池内 CO₂ (mg/L) | 4.3 | 6.7 | 7.5 |
| 池内 NH₃-N (mg/L) | 0.0128 | 0.0083 | 0.0075 |
| 池内 pH | 7.47 | 7.28 | 7.23 |
| 泵功率合计 (kW) | 10.5 | 40.9 | 69.2 |
| 阶段设备投资 (万元) | 69.7 | 232.1 | 385.9 |
| 模型告警条数 | 3 | 5 | 5 |
全场汇总:
| 指标 | 数值 | 指标 | 数值 |
|---|---|---|---|
| 工艺运行成本 | 51.06 元/kg | 企业全成本 | 164.27 元/kg |
| 比电耗 | 19.21 kWh/kg | 其中热泵 | 2.52 元/kg |
| OPEX | 34.58 元/kg | 折旧 | 16.48 元/kg |
| 工程总投资 | 1960 万元 | 峰值流量 | 1466 m³/h |
| 系统总水体 | 1366 m³ | 用地 | 11.0 亩 |
成本构成 · 口径: 养成后期(南美白对虾 100 t/yr · 默认气候 (青岛))· 全周期日均 元/日
| 成本项 | 计算基础 | 元/日 | 占比 |
|---|---|---|---|
| CAPEX 折旧 | 设备/8年 + 土建/20年 ÷ 365 | 2462 | 30.6% |
| 饲料 | 日投饵量 × 饲料单价 | 1851 | 23.0% |
| 电费(泵/UV/杂项) | 主泵+支路泵 ÷ motorEta + UV + 照明控制 | 1209 | 15.0% |
| 维护+保险+补水+排污 | processExtraDaily(四项之和, 见 21.1.3) | 1150 | 14.3% |
| 电费(热泵) | 热泵电耗 × 电价 | 501 | 6.2% |
| 增氧(液氧或风机) | o2 模式=液氧; air 模式=K-101 电费 | 270 | 3.4% |
| NaHCO₃ | 碱度投加 ÷ 0.595 × 单价 | 189 | 2.4% |
| 电费(CO₂ 风机) | 脱气塔风机 × 24h | 143 | 1.8% |
| 电费(车间暖通) | 车间显热 ÷ COP × 电价 | 95 | 1.2% |
| 甲醇 | 反硝化需求 × 单价 | 95 | 1.2% |
| 电费(BF 风机) | BF 粗孔曝气 × 24h | 46 | 0.6% |
| 电费(蛋分风机) | K-501 × 24h | 31 | 0.4% |
| 电费(车间通风机) | KV-1003 × 24h | 8 | 0.1% |
| 电费(臭氧) | 臭氧发生器 × 24h | 6 | 0.1% |
| 电费(除湿机) | 除湿量 ÷ SMER × 电价 | 0 | 0.0% |
| 分项合计 | — | 8057 | 100.0% |
| 模型 totalAvg | 含折旧的工艺运行成本 | 8057 | 100% |
✅ 分项合计 ⇔ totalAvg 闭合(差 < 0.5%), 说明成本明细已全部过桥。
对于年产量 > 1000 t/yr 的大型 RAS 项目, 工程上不会建一个超大的循环系统, 而是拆成多个模块并联。原因:
典型工业项目模块数(参考 Atlantic Sapphire / Stolt Sea Farm / 国内大型项目):
| 规模 | 典型模块数 | 单模块产能 |
|---|---|---|
| < 500 t/yr | 1 套 | 全场 1 模块 |
| 500-1500 t/yr | 2-3 套 | 200-500 t/yr/模块 |
| 1500-5000 t/yr | 3-6 套 | 500-1000 t/yr/模块 |
| > 5000 t/yr | 5+ 套 | 1000+ t/yr/模块 |
v1.3.x 中, 每个阶段的模块数完全由用户决定。在阶段卡片头部"🔧 套数" subSystemCount输入(默认 1, 范围 1-10):
不同阶段可以有不同模块数。比如:
这种"阶段递增"的配置反映了大型 RAS 的实际工程: 苗种期对单一系统依赖性高, 成鱼期产量大需要分散风险。
每个模块内部按以下规则配置备用:
| 设备 | 单机容量上限 | 配置规则 | 备用 |
|---|---|---|---|
| 主循环泵 P-101 | 75 kW | ceil(模块流量功率 / 75) | +1 台备用 |
| BF 风机 K-302 | 30 kW | ceil(BF 风量功率 / 30) | +1 台备用 |
| RDF 微滤 F-201 | 600 m³/h | ceil(模块流量 / 600) | +1 台备用 |
| UV D-401 | 8 kW | 2 套并联各设计 75% 余量 | 1 台坏 → 另 1 台加大流量 |
| 热泵 H-801 | 200 kW | ceil(热泵装机 / 200) | +1 台备用 |
| 支路泵(UV/蛋分/反硝化/AOP) | 30 kW | ceil(支路功率 / 30) | +1 台备用 |
| 加药计量泵 | 1 kW | ceil(加药功率 / 1) | +1 台备用 |
| O3 发生器 G-901 | 50 kW | ceil(O3 功率 / 50) | +1 台备用 |
不按模块拆分, 全场共用 1 套(站级设备):
| 设备 | 配置 | 说明 |
|---|---|---|
| 液氧储罐 V-901 | 2 罐(主+备) | 双罐设计, 切换不停产 |
| 应急柴油机 | 1 台 100% 全场负荷 | 30 秒启动 + 自动切换 |
| 变压器 | 2 套(高/低压双套分列) | 故障切换 |
| UPS | 1 套(PLC + 传感器 + 关键阀门) | 10-30 分钟续航 |
模块化的设备成本变化: 单台机组容量变小 → 单价(元/kW)略升, 但数量增加 → 总成本基本不变(±5%)。 真正的成本影响来自备用机组数: 4 个模块各配 N+1 备用, 比 1 个大模块配 N+1 备用多备 3 台。 典型规模(1000 t/yr, 4 模块)备用成本约占 CAPEX 5-10%。
RAS 鱼池设计常见形状: 圆形(Cornell 双流式)/ 八角 / 方形带圆角。圆形最常见, 因为:
圆形池的关键尺寸:
给定阶段总水体 V_tank、每套池数 poolsPerSet、套数 numModules, 反推单池直径:
iRAS 在反推后自动检查工程合理性, 给出建议:
| 条件 | 告警内容 |
|---|---|
| D < 4 m | 反推单池直径偏小, 建议减少每套池数或减少并联套数 |
| D > 30 m | 反推单池直径偏大, 建议增加每套池数或增加并联套数 |
| D > 20 m 且 H < 3 m | 大池配浅池(H/D < 0.15), 流场易死角, 建议加深至鱼种推荐值 |
| poolsPerSet = 1 | 每套仅 1 池, 无主备/检修轮替, 工程惯例 ≥ 2 |
v1.3 在 SPECIES_DB 各鱼种各阶段加入推荐池深字段。这反映不同鱼种的生物学特性和工程惯例:
| 鱼种 | 阶段数 | 各阶段 recDepth_m (m) | 生物学 / 工程说明 |
|---|---|---|---|
三文鱼 Salmonsalmon | 4 | 1.5 → 3.0 → 5.0 → 7.0 | 立体水柱泳鱼, 鲑科大池深, 商业 7-12 m; 跨盐度(淡水→海水) |
大菱鲆 Turbotturbot | 3 | 0.8 → 1.0 → 1.0 | 底栖鱼, 浅池取单层底面积, 不超过 1.2 m |
罗非鱼 Tilapiatilapia | 3 | 1.5 → 2.0 → 2.5 | 耐高密度; 植物蛋白配方比例高, 氮排放低于肉食性鱼 |
石斑鱼 Groupergrouper | 3 | 1.5 → 2.0 → 1.5 | 半底栖; ⚠ 成鱼期池深回落而非加深 |
加州鲈 Largemouth Bassbass | 3 | 1.5 → 2.0 → 2.5 | 淡水温水肉食鱼, 立体水柱 |
鳗鲡 Eeleel | 3 | 1.0 → 1.5 → 2.0 | 底栖, 中等浅 |
鳜鱼 Mandarin Fishmandarin | 2 | 1.5 → 2.0 | 同加州鲈; ⚠ 本库只有两个阶段 |
南美白对虾 L.vannameishrimp | 3 | 1.0 → 1.2 → 1.5 | 底栖 + 水柱, 浅于其他温水鱼 |
自定义鱼种 Customcustom | 1 | 2.0 | 通用缺省, 供用户自定义鱼种起步 |
〔v2.3.3 校正〕本表由 SPECIES_DB 实测重写, 旧表九行错五行:
① 旧表按"苗种/幼鱼/中鱼/成鱼"四列排, 但各鱼种阶段数不同(鳜 2 段, 多数 3 段, 仅三文鱼 4 段),
四列硬排会把值错位到相邻阶段;
② 石斑旧写 1.2/—/2.5/3.0, 实为 1.5 → 2.0 → 1.5 —— 成鱼期是回落而非加深, 旧表把趋势写反了;
③ 罗非旧写 1.0 起, 实为 1.5; 鳗鲡旧写 0.8 起, 实为 1.0; 对虾旧写 1.5/2.0/2.5, 实为 1.0/1.2/1.5;
④ 加州鲈与鳜旧表合并为一行, 但二者阶段数不同, 已拆开;
⑤ 漏了 custom 自定义鱼种。
⚠ recDepth_m 是本库复发六次的那条链上的字段(鱼种库逐阶段值 → sp 白名单转发 → 消费点),
现由断言 M11/M15 压着, 详见 27.5。
用户可在阶段卡片头部"🐟 每套 X 池 × Y m 深"调整 Y 值, 默认填入鱼种推荐值。
v1.3 早期版本中, 池深有两个独立输入:
stage.poolDepth_m: 用于池径反推stage.proc.poolDepth: 用于估算池表面积 → 车间面积 → 散热这种双输入容易让用户混淆: 调了一处, 另一处没调, 结果池形和散热模型用了两个不同的池深。 v1.3.x 统一为一个数据源:
同时删除了热平衡区的"池水深"输入, UI 上只在阶段卡片头部出现一次。同步更新加载老方案 JSON 的逻辑: 若老方案缺 recDepth_m, 加载时从 SPECIES_DB 按阶段名/index 自动补充, 保证池径反推和热平衡用同一个推荐值。
给定参数:
反推:
结果: 8 个 Φ8.8m × 7m 圆池, 每池 423 m³。无告警。
v1.1 把热平衡参数放在每个阶段的 proc 字段里。同一个项目有 4 个阶段, 用户必须在 4 个阶段重复设置:
这些是项目级常量(同一个厂房无论养什么阶段都是同一份)。
v1.2 把它们挪到顶部全局配置区 globalThermalConfig, 一处设置, 所有阶段使用。
v1.2 提供常见地区的气候预设, 选择后自动填入气温/源水温/RH 设计值:
| 地区 | 冬 气温/源水 °C | 夏 气温/源水 °C | 年均 气温/源水 °C | RH 冬/夏 | 日照 冬/夏 kWh/(m²·d) | 推荐热泵 | 说明 |
|---|---|---|---|---|---|---|---|
| 挪威 Tromsø (北极圈) | -12 / 3 | 18 / 10 | 3 / 6 | 75% / 70% | 0.0 / 5.0 | 海水开式 | 北极圈, 冬季极冷; 推荐海水开式源 |
| 中国青岛 (北方海岸) | -7 / 4 | 32 / 24 | 13 / 14 | 60% / 78% | 2.3 / 4.8 | 空气源 | 默认预设; 13 条数值基线中 6 条建立于此 |
| 中国上海 (华东沿海) | -2 / 8 | 35 / 28 | 17 / 18 | 70% / 80% | 2.0 / 4.6 | 空气源 | 华东沿海, 夏季高温高湿 |
| 中国海南三亚 (热带) | 16 / 22 | 35 / 30 | 25 / 26 | 75% / 85% | 4.2 / 5.8 | 海水开式 | 热带, 全年高温, 制冷主导 |
| 智利 Puerto Montt (三文鱼陆基) | 2 / 8 | 22 / 14 | 11 / 11 | 80% / 75% | 0.9 / 5.8 | 海水开式 | 三文鱼陆基主产区, 全年温和 |
| 中东 Doha (沙漠养虾/罗非) | 12 / 18 | 45 / 35 | 27 / 27 | 50% / 55% | 4.2 / 7.2 | 水源 | 沙漠气候, 夏季 45 °C, 制冷极端工况 |
| 加拿大 Halifax (东海岸) | -15 / 1 | 26 / 18 | 7 / 8 | 75% / 78% | 1.6 / 5.2 | 海水开式 | 北美东海岸, 冷温带 |
〔v2.3.3 校正〕本表由 CLIMATE_PRESETS 实测重写。旧表六个地区没有一个与代码对得上 —— 旧写"青岛/海南/挪威 Bergen/法罗群岛/北方内陆/华南", 而代码是挪威 Tromsø / 青岛 / 上海 / 三亚 / 智利 Puerto Montt / 中东 Doha 六个(其中只有青岛名称重合, 且数值也已不同)。旧表另缺两列: 日照强度(sol_w/sol_s, 进太阳辐射子系统)与推荐热泵型式(hpRecommend, 决定源侧温度取气温还是水温)。⚠ 默认预设为中国青岛, 13 条数值基线中的 6 条建立在该预设上。
用户选地区后仍可微调任何参数。
| 预设 | U_wall | U_roof | U_floor | U_window | 窗墙比 | ACH | 热回收 | 说明 |
|---|---|---|---|---|---|---|---|---|
| 阳光板/温室 (国内南方常见) | 3.5 | 3.0 | 1.0 | 5.0 | 0.30 | 2.0 | 0 | 阳光板/温室, 国内南方常见; 保温最差但造价最低 |
| 一般工业车间 (50mm 岩棉, 国内多数 RAS) | 0.8 | 0.6 | 0.8 | 2.5 | 0.05 | 1.0 | 0 | 默认预设; 50 mm 岩棉, 国内多数 RAS |
| 保温车间 (100-150mm 聚氨酯, 北欧标准) | 0.30 | 0.20 | 0.50 | 1.4 | 0.03 | 0.5 | 0.75 | 100-150 mm 聚氨酯, 北欧标准; 带 75% 热回收 |
| 近被动房 (200mm+ 真空保温) | 0.15 | 0.10 | 0.25 | 0.8 | 0.02 | 0.3 | 0.85 | 200 mm+ 真空保温; 带 85% 热回收 |
〔v2.3.3 校正〕本表由 ENVELOPE_PRESETS 实测重写。旧表只有 3 档
(工业标准 / 北欧高保温 / 简易厂房), 而代码是 4 档:
① 漏了近被动房一档; ② "简易厂房"实为阳光板/温室, U 值也不同(旧写 2.0/1.5/1.5/5.0, 实为 3.5/3.0/1.0/5.0);
③ 北欧档的 U_floor 旧写 0.30(实 0.50)、U_window 旧写 1.2(实 1.4);
④ 旧表完全没有窗墙比 / ACH / 热回收三列 —— 而这三项恰恰随预设变化, 且直接进热平衡与通风计算。
v1.2 引入3 工况对比(可扩展为更多), 每次计算同时跑:
| 工况 | 用途 |
|---|---|
| 设计冬季 (design_winter) | 冬季最冷月用电峰值, 决定热泵装机 |
| 设计夏季 (design_summer) | 夏季最热月用电峰值, 决定制冷机装机 |
| 全年均值 (annual) | 年化电费, 用于成本核算和投资决策 |
当前选中的工况(thermalScenario)用于主显示, 其他工况结果在阶段卡片底部以对比表呈现。
热泵装机容量取冬/夏极值的较大者(装机定容)。
池盖直接影响蒸发率, 是热平衡的关键变量:
| 池盖类型 | 系数 | 典型蒸发率 | 适用场景 |
|---|---|---|---|
| 无盖 (none) | 1.0 | 开放水面全蒸发 | 室外或简易车间 |
| 部分覆盖 (partial) | 0.40 | 约 40% 蒸发 | 常规工业 RAS, 部分孔/进料口开 |
| 密闭 (full) | 0.10 | 约 10% 蒸发 | 北欧/严寒地区, 节能高保温 |
蒸发是潜热(2257 kJ/kg @100°C, 2502 kJ/kg @0°C), 是冬季最大的散热项之一。密闭池盖能省 20-40% 的暖气电费。
RAS 车间通风同时承担三个功能, 但它们的决定性负荷完全不同, 混为一谈是设计错误的常见来源:
| 功能 | 负荷来源 | 随什么变化 | v1.9.2 处理 |
|---|---|---|---|
| 空气质量 (CO₂) | 鱼呼吸 + 脱气塔尾气入室 | 鱼载荷 (投饵量) | 新风量下限 |
| 除湿 | 水面蒸发 | 水面积 / 池盖 / 室内外湿差 | 不由新风承担 |
| 显热排除 | 设备产热 + 池水散热 | 装机功率 | 由 ACH_eff 一并计算 |
v1.9.2 之前只有单一口径 通风量 = ACH × V_room。而 V_room 是自动估算出来的:
于是产生了一条纯几何的放大链: 降低养殖密度 → 同样产量需要更大水体 → 池面积↑ → 车间↑ → 通风量↑。 在湿热气候养冷水鱼时, 更多新风意味着带入更多湿空气, 在冷水面凝结放热, 制冷负荷随之暴增。 实测: 密度从 80 降到 15 kg/m³, 通风量被放大 5.33 倍, 制冷装机同步暴涨。
但这不成立 — 鱼的数量没变, 呼吸产生的 CO₂ 没变, 新风需求本不该变。房间大一倍只是稀释体积大一倍, 需要的新风流量并不会翻倍。
⚠ v2.4 起本式已被 28.7 取代, 本节保留为口径演进记录。 两点变化: (1) 风机送进车间的室外空气计入本式, 通风系统只补差额(28.7.1); (2) 自然通风档不再取 max —— 供风量钳在用户填的 ACH 上, 不足则报 CO₂ 超标(28.7.3)。
ACH 保留为用户可调的设计参数 (默认 1.0), CO₂ 稀释需求作为下限, 保证空气质量不会因为车间估小而失守:
co2Outdoor_ppm, 范围 300–5000; 城市/工业区实测常年 500–700, 取小是不安全方向)
| 参数 | 默认值 | 依据 |
|---|---|---|
| CO₂ 产量系数 | 500 g/kg 饲料 | 大西洋鲑 409 (Terjesen 2013) / smolt 550 (Vinci 2004) / 鳗鲡 536 (Heinsbroek 1990), 统一取值 |
| 车间 CO₂ 限值 | 1500 ppm | OSHA 法定 8h 限值 5000 过宽松; ASHRAE 舒适 1000–1200 是办公室标准, 对工业厂房间歇作业过严; 1500 落在"空气沉闷"与"头痛嗜睡"的分界 |
| 脱气塔尾气入室比例 | 0.2 | 现代场脱气塔尾气管道直排室外, 仅少量泄漏。老场或敞开式脱气应调高至 0.6–1.0 |
| ACH 默认值 | 1.0 | 泳池馆新风标准 0.48 CFM/ft² 湿面积 = 8.78 m³/(h·m²), 按本模型几何换算约 0.9–1.5 ACH。 ⚠ 该值是「新风换气次数」, 不是围护渗透风; 自然通风档的设计口径是 15–30, 与本默认值差一个量级 —— 见 28.7.3 与 15.9(拆两维已决定不做, 缺气密性数据) |
ACH 默认 1.0 在 v1.9.2 之前是没有出处的经验值, 现在有了可追溯的标准依据。
这是本次修正里最反直觉的一条, 但两种气候下结论一致:
两头都不是决定项, 所以除湿从新风量计算中整体移除, 改由机械除湿机承担 (详见 29.7)。 这与泳池馆的成熟实践一致: 新风管只管空气质量, 除湿机走 4–6 ACH 的内循环, 不带新风热负荷。
通风换气产生显热 + 潜热散热 (冬季 T_air 比 T_room 低很多)。热回收可回收 70–85% 的显热 (板式或转轮换热器):
显热计算 (UA_vent_sens) 与湿平衡 (m_air_flow) 必须共用同一个 ACH_eff —
否则质量守恒与能量守恒会互相矛盾: 用一个风量算带走的水汽, 用另一个风量算带走的热量, 结果不自洽。
北欧项目通常 ventHeatRecovery = 0.7–0.85, 国内项目多为 0 (无热回收)。
max() 而非 min() 意味着 降低密度仍会让通风量增加 (ACH 项仍随 V_room 线性增长),
只是不再无上限地主导结果。若项目实际是通过加深池子而非扩大占地来降密度,
车间面积不应跟着水体线性放大 — 此时请在围护区手工填写"车间面积"覆盖
A_building = 1.6 × poolArea 的自动估算, 或相应调低 ACH。
28.6 把新风量定成 max(ACH × V_room, V_CO₂), 但它默认这份风全部由通风系统提供。
在空气曝气拓扑下这一点不成立: K-101 鱼池增氧鼓风机没有排气风管,
它吸室外空气、气泡穿过池水、从池面进入车间 —— 气路是 OUTDOOR → INDOOR。
v2.4 之前这股风一分未计, 两笔账同时错:
V_CO₂, 而其中一部分已经由风机送进来了;Q_vent_sens 再按"从室外温度加热到室温"收一遍, 等于同一份热收两次。| 工况 | K-101 入室风量 m³/h(苗种/中鱼/成鱼) | 占通风需求 |
|---|---|---|
| 罗非 air + 开塔 · 恒温 ACH 1.0 | 476 / 1,752 / 4,228 | 44.5% / 44.5% / 36.9% |
| 罗非 air + 关塔 · 恒温 ACH 1.0 | 476 / 1,752 / 4,239 | 16.6% / 12.7% / 10.8% |
| 石斑 air + 开塔 · 机械通风 | 555 / 2,245 / 5,476 | 41.4% / 23.1% / 15.4% |
| 自然通风 ACH 15 | 同上 | 4.3% |
| 任意纯氧拓扑 | 0 | 0% |
⚠ 抵扣量单源自气流登记表 collectAirStreams, 不在别处另算一份 ——
否则新增气流时两处会漂移。断言 V3 静态锁住这一点。
⚠ 不新增"超额排风热损"项: 自由空气节点求解器已把该气流作为独立股入解
(温度平衡分母含 mEx·cp, 湿平衡含 mEx), 恒温恒湿档由 m_indoorExhaust 承载
且显热恰为零(该档室温 ≡ 水温)。再加一项即把它的焓算第二遍。
⚠ 纯氧拓扑下抵扣量恒为 0 ⇒ 13 条数值基线逐位不变。
这既是"可以放心改"的理由, 也意味着基线在这里什么都保证不了 —— 必须靠空气曝气锚定工况。
抵扣后 ACH_eff 会失真 —— 它可能报出"换气 0.3 次/h"而车间实际有 K-101 那股在穿堂。故拆成两个:
| 量 | 定义 | 用途 |
|---|---|---|
ACH_eff(机械) | V_vent_supply / V_room | 通风机选型 · 风管 CAPEX · 通风显热 UA · 湿平衡 |
ACH_total | V_vent_total / V_room | 界面显示 · 结露判定的语境 · CO₂ 稀释 |
⚠ 通风显热与湿平衡只能用机械那一份 —— 风机送进来的那股在接触器与尾气项里已各自记账, 不得重复。
v2.4 之前, 自然通风档同样走 max(ACH × V_room, V_CO₂)。这带来三个后果:
物理上站不住: 自然通风由风压与热压驱动, 不会因为室内 CO₂ 高就自己变大。 而且它不是一个设计常数, 是个结果 —— 由开口面积 × 驱动力决定, 跨度接近两个数量级:
| 场景 | ACH |
|---|---|
| 温室 · 夏季峰值降温设计 | 45–60(每分钟换一次); 澳洲口径至少 30 |
| 温室 · 冬季/夜间除湿 | 约 3(每 20 分钟一次) |
| 自然通风房间 · 改造前后实测 | 2.7–11 → 加开窗/天窗后 12–66 |
| 教学建筑 · 不同开窗策略实测 | 3.7–39.8 |
同一栋房子把固定窗玻璃拆掉就能从 9 变 66。拿这样一个量去保证 CO₂ 限值 (人员暴露口径)本身就不成立。
| 设 ACH | CO₂ 需求 | 实际供风 | 缺口 | 车间 ppm | 室温 °C |
|---|---|---|---|---|---|
| 1 | 39,304 | 6,499 | 28,915 | 4,422 | 23.3 |
| 2 | 39,304 | 12,998 | 22,416 | 2,894 | 17.1 |
| 5 | 39,304 | 32,495 | 2,919 | 1,584 | 9.0 |
| 15 | 39,304 | 97,485 | 0 | 857 | 2.6 |
| 30 | 39,304 | 194,969 | 0 | 658 | 0.4 |
缺口 > 0 时模型不再替用户变出风量, 而是让车间 CO₂ 真的算超标, 并给出两条出路: ① 把自然通风量调高到所需次数以上(靠加大开口面积); ② 改用机械通风档, 由通风机承担这份风量。
⚠ 由此用户填的 ACH 终于有意义了 —— 从 4,422 ppm 一路到 658 ppm。
⚠ 附带效果: 车间 CO₂ 浓度此前恒等于设计限值(因为通风量是"恰好压到限值"的反解),
在自然通风档现在终于能报超标。
⚠ 本节不给自然通风建驱动力模型(需要开口面积、风速、热压等本库没有的参数) ——
见 15.9 已决取舍。
| 项 | v1.2–v1.9.3 | v2.0.0 |
|---|---|---|
| T_room | 空气节点方程的解,自由漂浮 | 暖通维持 = 水温(输入) |
| RH_room | 湿平衡的解 | = roomRH_set(默认 65%,可调) |
| 求解方式 | 三节点联立 + Picard 迭代 / 闭式解 | 无需求解(已删除) |
| 池面显热 Q_pool_loss | UA_pool × (T_w − T_room) | ≡ 0(温差为零) |
| 钳位与能量丢弃 | T_room 钳位时静默丢弃缺口 | 不存在 |
| 围护 / 通风 / 池壁 | 混在水侧平衡 | 归暖通侧,折算电耗后计入总账(hvacKWhPerDay) |
| 气液接触器 | 完全未计入 | 新增:脱气塔 + MBBR 曝气,出口按水温饱和 |
Q_net_to_water = Q_metab + Q_equip + Q_makeup_signed
− Q_pool_loss (≡ 0)
− Q_evap_latent
+ Q_dehum_to_water
− Q_contactor_net ← v2.0 新增
其中接触器项 Δh = h(T_水, 饱和) − h(T_进气, RH_进气),
Δh 可为负(湿热空气遇冷水结露放热给水)。v1.1 的热平衡是单点能量平衡: 给定 T_w(目标水温)和 T_air(室外气温), 直接算补水加热量 + 池散热量 + 鱼代谢热 + 设备产热, 平衡后给热泵装机。 这个模型忽略了车间空气节点, 默认池的热散到一个无限大的"室外"。问题在于:
v1.2 引入双节点稳态求解器, 联立水节点能量、空气节点显热、空气节点湿度三个平衡:
+ Q_evap × λ 写在空气节点(节点 1)能量平衡里 — 这是 v1.2 推导笔误。
物理: 蒸发夺走的是水体显热(水分子蒸发吸热), 空气节点只接收水蒸气的湿度增量(W_room↑),
不直接接收 λ 项。代码 (calcThermalLoad) 一直把 λ 项放在水节点的能量平衡里, 物理正确。
v1.6 把手册 16.5 节和 29.2 节统一改为与代码一致的写法 — 水节点含 Q_evap × λ, 空气节点只有显热。
耦合: T_room 影响 W_sat, W_room 影响 m_evap。Picard 迭代求解(实际代码用闭式解):
蒸发率 m_evap 用Lewis 传热传质类比简化。同一个系数有面积口径与体积口径两种写法, 差一个空气密度, 混用是量纲错误的常见来源, 这里两种都给出:
W 为含湿量 (humidity ratio, kg 水/kg 干空气, 无量纲), 因此面积口径的 β_A 量纲必然是 kg/(m²·s), 而 h_c/c_p 恰好就是这个量纲 — 这是 Lewis 类比在工程上好用的原因: 只要知道对流换热系数, 传质系数就出来了。
| 实测量 (v1.9 → v1.9.1) | 变化 | 说明 |
|---|---|---|
| β 取值 | 降 12.4–14.9 倍 | 0.06 → 0.0035–0.010 m/s |
| 蒸发率 | 降 2–2.4 倍 | 不是 13 倍 — W_room 自洽求解存在自补偿: β 降低使 W_room 下降, 而 (W_sat − W_room) 随之变大, 部分抵消 |
| RH = 99% 饱和告警 | 消失 | 原告警是虚警, 由虚高蒸发率造成 |
当 W_sat(T_w) > W_room: 蒸发(从池水夺热, 减少水温), m_evap > 0 当 W_sat(T_w) < W_room: 凝结(空气中水蒸气在冷池面凝结, 给池水放热), m_evap < 0
凝结情况典型: 海南夏季水温 12-15°C(冷水鱼)远低于室内空气 32°C/RH 80%, 大量凝结。 凝结水自动加到补水量减项, 反映节水效益:
| 字段 | v1.x | v2.0.0 |
|---|---|---|
T_room | 求解输出,T_air + 5 ~ +12 °C | 输入 = 水温(暖通维持) |
RH_room | 求解输出 55–80% | 输入 = roomRH_set,默认 65% |
Q_pool / Q_pool_loss | 5–30 kW | ≡ 0(温差为零) |
T_room_raw / T_room_clamped /Q_clamp_gap_kW / iterCount |
钳位与迭代诊断 | 保留为常量(null / false / 0),仅为下游载荷向后兼容 |
| 字段 | 含义 | 典型值 |
|---|---|---|
contactorAirFlowM3h | 接触水的气流合计(脱气塔 + MBBR 曝气) | 三文鱼 1000 t 全场 96,287 m³/h |
contactorDeltaH_kJ_kg | Mollier 焓差,可为负 | 青岛冬 +45.7 / 三亚年均 −23.8 |
contactorGrossKWhPerDay | 接触器毛排热(回收前) | — |
contactorNetKWhPerDay | 接触器净排热(进水侧平衡) | 三亚年均 −18,470 kWh/d |
hvacSensibleKWhPerDay |
车间暖通显热负荷(热量,带符号) v2.1 起 = 围护 + 通风 − 室内产热。v2.0 只有前两项, Q_air_gain_kW 与入室的除湿冷凝热是孤儿项(IRAS_V21_HVAC_CLOSURE) |
Bergen 设计冬 +769 kWh/d (围护 935 + 通风 1,450 − 室内产热 1,617; v2.0 为 +3,355,其中围护+通风降到 2,385 是尾气入室比例 0.2→0 的效果) |
Q_room_internal v2.1 |
室内产热 = 设备废热 Q_air_gain_kW×24 + 入室的除湿冷凝热,恒 ≥ 0 |
三文鱼 1000 t 全场 1,617 kWh/d |
Q_dehum_to_room v2.1 |
其中除湿机部分(仅 dehumHeatDest === 'indoor' 时非零) |
默认 0(冷凝热排至室外) |
regimeMarginPct v2.1 |
距制冷↔制热翻转的结构余量(%)。Q_net_to_water 是若干量级相当、
符号相反的大项相减的小差值;余量小 = 系统坐在制度切换边界上,成本对参数的响应
不连续。这不是误差估计,是结构敏感性指标 |
青岛冬默认 G:L=5 阶段 3 为 49%;G:L=3 时仅 3.9% |
skimmerBlowerKw / skimAirFlow_m3h v2.1 |
蛋分供气风机(K-501)功率与气量。泡沫分离效率由气量决定而非水量,
v2.1 前无此项。气水比 skimmerGtoL 默认 0.5(Timmons Ch.5 典型 0.3–0.8) |
三文鱼成鱼期 6.41 kW / 508 m³/h |
skimmerBlowerSpec.airPath v2.1 |
蛋分气路登记。气鼓入水柱,contactsWater = true,
与脱气塔/MBBR 同属接触器热湿交换的气流。
⚠ 凡有气量的设备都必须登记 airPath,否则自检断言 D 报错 |
OUTDOOR → OUTDOOR |
V_exchange_m3d / V_fresh_makeup v2.1 |
补水两股:换水股(含盐,与排污同量同盐度)/蒸发股(补淡水)。
V_makeup = 两股之和。拆股使盐平衡恒等成立,
无需盐度状态变量。⚠ 断言 F1 锁定此恒等式 |
青岛设计冬 461.2 / 29.6 m³/d |
E_net_m3d / V_pure_surplus v2.1 |
净水汽(带符号,+蒸发 −结露)/净结露时的多余纯水(转排水)。 ⚠ 湿热气候养冷水鱼时常态为负 —— 这正是 v2.0 新增的能力 | 青岛冬 +29.6;海南夏 −34.9 / 余 41.4 |
S_target / S_steady / S_drift v2.1 |
目标盐度/净结露稀释后的稳态盐度/漂移量。
S_steady = S × V_exch / (V_exch + V_surplus)。
非新建模,是现有假设(换水补水与排污同盐度)的推论 |
海南设计夏 30 → 27.2‰(−2.83) |
contactorNetWater_kg_d v2.1 |
接触器净水汽质量,与 Δh 同源(同状态点、同 mdot)。
⚠ 断言 F3 由 mdot/W_in/W_out 独立重推并比对 ——
若改成独立的经验蒸发系数会立刻转红。
不受 recovery 折减:热可回收,水汽已离开水面,质量不会回来 |
青岛设计冬全场约 +29,600 kg/d |
contactorLatentFrac v2.1 |
潜热占毛焓差的比例,仅供诊断显示,不作断言区间。 随进气温度大幅变化:青岛冬 ~48%、近等温 ~91%(Karimi 2020 实测工况)。 ⚠ 勿用文献单点值当区间断言 —— 会把正确结果判红 | 青岛冬 48% / 海南夏更高 |
blowerElecKw / blowerShaftKw v2.1 |
四台风机(脱气 + BF 曝气 + 蛋分供气 + 鱼池增氧 K-101)的电功率与轴功。 v2.2 起轴功 = Σ(kW_i × η_i) 逐台加权,不再用统一的 η=0.57。 轴功抬高接触器进气温度,电机损失进 Q_room_internal。
⚠ v2.1 第五轮审计前,这三台的热【完全没有去处】 |
三文鱼成鱼期 57.5 / 32.8 kW |
contactorT_air_in / contactorDT_blower v2.1 |
接触器实际进气温度与风机温升。⚠ 加热是等湿过程,绝对含湿量 W_in
不随温升变化,变的是相对湿度 |
青岛设计冬 −3.5 °C(升温 3.3–3.5 K) |
Q_blower_motor_kWh_d v2.1 |
风机电机损失,Q_room_internal 的第三个组成
(前两个是设备废热与入室冷凝热) |
三文鱼成鱼期 594 kWh/d |
POWER_REGISTRY v2.1 |
用电设备登记表(唯一真相源)。每条声明四项:path(支持嵌套,
如 co2StripperSpec.blowerKw)/billedVia 计费去向/
heatVia 热去向/capexVia 资本去向。
断言 从本表反向枚举去实现里找 —— 旧版正向扫描 + 命名规则会漏掉嵌套字段。
⚠ 新增风机/泵/用电设备时必须同步,否则自检断言 E 报错。
注意 uvPower 单位是 W 不是 kW(历史字段) |
现登记 9 项 |
hvacKWhPerDay | 暖通显热折算电耗 | — |
hvacDirection / hvacCOP |
heat / cool / none / off;对应温度修正后的 COP | — |
Q_makeup_signed | 带符号补水项(v2.0 补出口,此前仅局部变量) | — |
roomRH_set | 车间设定湿度 | 65% |
以下为 v1.x 双节点求解器的输出表,保留作历史参考:
双节点求解器输出:
| 输出字段 | 含义 | 典型值范围 |
|---|---|---|
| T_room | 车间空气温度 | T_air + 5 ~ +12°C |
| RH_room | 车间相对湿度 | 55-80% |
| W_room | 车间含湿量 | 0.008-0.020 kg/kg |
| m_evap_kg_h | 蒸发率(负值=凝结) | ±5 ~ ±50 kg/h |
| UA_envelope | 围护总 UA(无含地板) | 500-2000 W/K |
| Q_envelope | 围护总散热 | 5-50 kW |
| Q_pool | 池散热 | 5-30 kW |
| Q_vent | 通风散热 | 2-15 kW |
| Q_makeup | 补水加热 | 5-30 kW |
| Q_internal | 内部产热(鱼+设备) | 10-100 kW |
| heatPumpKWhPerDay | 热泵日电耗 | 100-3000 kWh/d |
| heatPumpAvgKw | 热泵平均功率 | 5-200 kW |
| cop | 当前工况 COP | 2.5-5.5 |
| ACH_eff v1.9.2 | 等效换气次数 (max 口径反算) | 1.0-3.0 |
| ventBoostedByCO2 v1.9.2 | CO₂ 需求是否已顶替 ACH 口径 | true / false |
| m_dehum_kg_d v1.9.2 | 机械除湿量 | 0-3000 kg/d |
| dehumKWhPerDay v1.9.2 | 除湿机日电耗 | 0-1500 kWh/d |
| Q_dehum_reject_kWh_d v1.9.2 | 除湿机冷凝器排热量 | 0-4000 kWh/d |
| V_dehum_recovery v1.9.2 | 冷凝水回收量 | 0-4 m³/d |
| iterCount / converged v1.9.2 | 外层阻尼迭代次数与收敛标志 | 1-12 / true |
当车间 RH > 85% 时应加除湿措施 (否则结构件腐蚀、电气故障、霉菌)。iRAS 在 RH 接近饱和时给出醒目提示。 四条可选路径, 但它们的有效性强烈依赖气候:
| 路径 | 湿热气候 (海南夏) | 干冷气候 (挪威冬) | 代价 |
|---|---|---|---|
| 增加 ACH | ❌ 无效 — 室外更湿, 通风越多越湿 | ✅ 有效但用不上 — 仅需 0.14 ACH, 远低于 CO₂ 需求 | 通风加热/制冷能耗 |
| 加密闭池盖 | ✅ 有效 — 直接砍蒸发源头 | ✅ 有效 | 操作不便, 巡池/投饵受限 |
| 机械除湿机 | ✅ 主力手段 | 一般不需要 | 电耗 + 冷凝热去向 (见 29.7) |
| 排风热回收 | ❌ 帮助有限 | ✅ 有效 (显热为主) | 初投资 |
v1.2 拆出 4 种热泵, 各自的 COP 和源温模型:
| 类型 | COP_heat | COP_cool | 源温 | 适用 |
|---|---|---|---|---|
| 空气源 air | 3.5-4.0 | 2.5-3.0 | T_air | 常规, 气温 > -10°C |
| 水源 water | 4.5-5.5 | 3.5-4.5 | T_source | 有大量地下水/河水 |
| 地源 ground | 4.0-5.0 | 3.5-4.5 | T_ground (≈年均) | 有埋管空间 |
| 海水开式 seawater_open | 4.5-5.5 | 3.5-4.5 | T_seawater | 沿海/海上养殖, 钛板换热 |
不同热泵类型的源温和 COP 在 globalThermalConfig 中可独立设置。
湿热气候养冷水鱼 (海南 / 华南养大西洋鲑、虹鳟) 是国内 RAS 的典型场景, 也是湿度问题最尖锐的场景: 水温 12–15°C 远低于室内空气露点, 水面持续凝结, 车间 RH 长期在 90% 以上。 而如 28.6.4 所述, 这种气候下通风不能除湿 — 唯一可行的手段是机械除湿。
| 字段 | 默认值 | 范围 | 说明 |
|---|---|---|---|
dehumEnabled | false | 开 / 关 | 是否配置机械除湿机 |
dehumTargetRH | 70 % | 40–90 | 控制目标相对湿度。泳池馆 ASHRAE 建议 50–60%; RAS 车间可放宽到 65–75% (兼顾能耗); >85% 有霉菌与腐蚀风险 |
dehumSMER | 2.5 kg/kWh | 0.5–6 | 比除湿效率 (Specific Moisture Extraction Rate)。冷凝式典型 2–3, 转轮式较低, 热泵型可更高 |
dehumCondRecovery | true | 开 / 关 | 冷凝水是否回收作补水 |
dehumHeatDest | outdoor | outdoor / indoor / water | 冷凝器排热去向 — 对制冷负荷影响极大, 见 29.7.4 |
除湿机投入后, 车间含湿量被锁定在目标值 (而非由蒸发与通风自由平衡), 除湿量由湿平衡反推:
即: 除湿机只承担通风排不走的那部分湿负荷。这保证了两种手段不重复计算, 也解释了为什么干冷气候下除湿机自动退出 (通风已足够, m_dehum 算出来 ≤ 0)。
| 去向 | 对应设备形式 | 模型处理 | 后果 |
|---|---|---|---|
outdoor (默认) | 独立风冷机组, 冷凝器在室外 | 不参与热平衡 | 不影响车间温度 |
indoor | 移动式 / 吊装式除湿机 | 参与 T_room 求解 | 车间显著升温, 制冷负荷大增 |
water | 高端热回收机组 | 计入水侧净热 | 冬季可省加热能耗 |
| 指标 | 不配除湿机 | 配除湿机 (目标 70%) |
|---|---|---|
| 车间 RH | 92 % | 70 % |
| 水面凝结放热 | 2152 kWh/d | 1222 kWh/d |
| 除湿机电耗 | 0 | 1365 kWh/d |
| 冷凝水回收 | 0 | 3.4 t/d |
| 总电耗 | 基本持平 (省下的制冷 ≈ 除湿机耗电) | |
当 dehumHeatDest = indoor 时, 除湿机与空气节点构成强负反馈回路:
直接用 Picard 迭代 (每次把新值原样代入) 会发散振荡: 实测 T_room 在 22.5 ↔ 40°C 之间来回跳, 6 次迭代后取最后一次值完全不可信 — 取到哪个值纯粹取决于迭代次数的奇偶。
每次只向新解移动 25%, 把振荡压成单调收敛。实测 5 次以内收敛到 T_room = 30.2°C、除湿量 2012 kg/d。
阻尼法有一个固有风险: 它总能"收敛"到某个值, 但那个值未必是真实物理解 — 阻尼系数取得越小, 越像收敛, 也越可能只是在原地不动。验证方法是用四组不同阻尼系数分别求解, 若都收敛到同一点, 则该点是方程组的真实不动点, 而非阻尼参数的产物。本模型四组参数结果一致。
dehumEnabled = false), 界面上一切正常, 振荡只在特定参数组合下才暴露。converged = false 或 iterCount 顶到上限 12,
说明该工况下解未收敛, 输出的 T_room / 除湿量不应直接采信, 需检查参数是否落在合理范围。
P&ID(Piping & Instrumentation Diagram, 工艺管道仪表流程图)是化工/环保工程的核心设计文档, 描述工艺单元、管道连接、流向、关键仪表和控制逻辑。一份完整的 P&ID 应包含:
v1.3.x 提供独立 P&ID 查看器 pid.html, 主页面"📐 输出 P&ID"按钮一键打开。
数据流:
v1.3.x P&ID 采用两层布局:
主流层(上半部 y=560):
旁路(从主流 T 接头取水):
公用工程层(下半部 y=900):
v1.3 早期版本中, LOX 储罐显示的氧耗是全场总和 (summary.totalLOXKgD), 不论用户切换到哪个阶段都不变。 v1.3.x 修复为当前阶段氧耗 (stage.load.o2DailyTotal), 切换阶段时同步更新。
右上角元数据"全场氧耗"保持不变(那本来就是全场总和的语义, 用于储罐选型)。
P&ID 底部自动生成设备表, 含 tag/中文名/规格/数量列表:
| tag | 名称 | 规格示例(成鱼期) |
|---|---|---|
| T-101 | 鱼池 | 8 池 × Φ8.8 × 7m, 423 m³/池 |
| F-201 | 微滤机 | Q 11170 m³/h, η_TSS 75% |
| B-301 | MBBR 生物滤池 | V 438 m³, η_TAN 70%, 填充率 50% |
| C-501 | CO₂ 脱气塔 | G:L 3, η 65% |
| S-101 | 集水池 | 200 m³ |
| P-101 | 主循环泵 | 488 kW @ 12m H, 68% η, VFD |
| A-601 | 增氧锥 | 41.2 kg O₂/h, η 85% |
| S-701 | 蛋白分离器(旁路) | α 20%, V 74 m³ |
| D-401 | UV 消毒(旁路) | α 10%, 38 kW @ 40 mJ/cm² |
| R-801 | 反硝化反应器(旁路) | α 10%, V 129 m³ |
| V-901 | LOX 储罐 | 1113 kg/d (成鱼期), 3 t 储罐 |
| X-901 | AOP 高级氧化(公用工程) | α 5%, V 17 m³ |
主泵 P-101 由鱼池 DO-101 通过 PID 闭环控制 VFD 频率, 维持鱼池 DO ≥ 鱼种最低饱和度 × DO_sat。 联锁线在 P&ID 中表示为虚线箭头从 DO-101 指向 P-101_VFD。
类似的联锁包括:
pid.html 支持SVG 直接打印(浏览器 Ctrl+P → 保存 PDF) 或SVG 文件下载(右键保存)。 SVG 矢量格式, 缩放无损, 可在 AutoCAD/Visio 中导入用作工程图基础。
设备清单是工程设计的核心交付物之一, 用于:
v1.3.x 提供独立设备清单页面 equipment.html, 主页面"📋 导出设备清单"按钮一键打开。结构:
P-202 RDF 反冲泵自 v1.6 起
不再独立列项(RDF 厂家整体出厂含反冲泵); 项目元信息行现另带
方案版本 / 本页版本两个版本号(见 31.8)。
清单中每个设备按"主用 + 备用"展开。例如成鱼期 4 模块, 每模块主泵需要 P-101 75 kW × 2 台, 加 1 台备用:
| 模块号 | 设备 | 规格 | 数量 |
|---|---|---|---|
| 模块 1 | P-101 主泵(主) | 75 kW × 488/4=122 / 75 ≈ 2 台 | 2 |
| 模块 1 | P-101 主泵(备用) | 同上 | 1 |
| 模块 2 | P-101 主泵(主) | 同上 | 2 |
| 模块 2 | P-101 主泵(备用) | 同上 | 1 |
| …(其他模块)… | |||
| 全场 | P-101 主泵 合计 | 75 kW | 12 台(8 主 + 4 备) |
设备单价在主页面"单价配置"区设置, equipment.html 自动读取并计算:
放大系数 2.2 涵盖管道阀件 / 电气仪表 / 自控 / 安装调试 / 土建厂房 / 设计监理(详见第 22 章)。
某些设备虽然容积大、价值高, 但不需要 N+1 备用, 而是单列 + 旁路阀设计。例如:
| 设备 | 不需备用的原因 | 故障应对 |
|---|---|---|
| MBBR 生物滤池 B-301 | 填料缓冲数小时, 故障时减投饵 | 旁路阀让水绕过, 投菌剂时再开 |
| 反硝化反应器 R-801 | NO₃ 累积慢, 可承受数日停机 | 旁路阀让水绕过 |
| 蛋白分离器 S-701 | DOM 积累慢 | 旁路阀 |
| CO₂ 脱气塔 C-501 | 风机有 N+1, 塔体本身没动 | 风机切换 |
| 液氧储罐 V-901 | 主+备双罐设计 | 切换 |
设备清单上这些标识为"1 套 (单列 + 旁路阀)", 不展开成多份。
主页面和 equipment.html 之间的数据通过 localStorage 共享(iRAS_equipmentExport key), 跨 tab 同步:
v1.3.x 把 P&ID 和设备清单的 key 拆成两份(iRAS_pidExport 和 iRAS_equipmentExport),
让两个独立窗口可以同时开着, 各自显示最新数据互不干扰。
下游审计发现: 本页各组的行此前是硬编码的, 于是清单冻结在写它那天的设备集合。 实测缺 四台 —— 全是 v2.x 之后新加的:
| 位号 | 设备 | 何时加入模型 |
|---|---|---|
K-501 | 蛋分供气风机 | v2.1 (蛋白分离器供气独立成项) |
DH-1001 | 机械除湿机 | v1.9.2 (车间湿负荷建模) |
AHU-1002 | 车间暖通机组 | v2.2 (车间模式三档) |
KV-1003 | 车间通风机 | v2.6 车间通风机建模 |
capex.total, 这四台的钱一直在里面 ——
所以对账对得平, 谁也发现不了; 只有拿这份清单去询价/招标时, 才会发现少买了设备。
这类不一致比数值错更难查: 数值错会在某处露出破绽, 而"清单与总价各自正确、
只是内容对不上"没有任何破绽。
修法不是手工补四行(那只解决今天)。主页面 calcCapex 内部一直有一份
逐项清单 items, 只是从未导出; 现导出该清单(含从设备名抽出的 ISA 位号),
本页改为自 CAPEX 清单反向补全 —— 凡计入投资、带位号、而上方各组未渲染的设备,
一律自动列入「🧾 其他设备(自 CAPEX 逐项清单补全)」组。以后主页面新增任何设备都会自己出现,
"两份清单各自维护"这个结构性问题从根上消掉。
门禁 tools/check_downstream_contract.js 的判据 C7 锁死这一点:
本页渲染出的位号集合必须包含 CAPEX 逐项清单中所有带位号的条目, 否则转红。
采购方拿到清单, 看到的往往只有风量与功率, 看不出这台设备为什么是这个规格 —— 而这决定了后续处置。两处已补:
| 设备 | 补充的信息 | 为什么采购方需要它 |
|---|---|---|
K-101 鱼池增氧鼓风机 | 选型控制侧(O₂ 传质 / CO₂ 吹脱, 两侧风量并列)· 设计 DO 及其来源(用户设定 / 留空回落)· 实际 OTE 与清水基础 · 池底布气与体积曝气强度 | 被 O₂ 顶大与被 CO₂ 顶大, 后续处置完全不同: 前者降密度或加深池, 后者上脱气塔。曝气强度超限时另给出该阶段可行密度上限 |
KV-1003 车间通风机 | 控制项(CO₂ 稀释需求 / 换气次数 ACH, 两侧并列)· 车间稳态浓度与设计限值 | 由 CO₂ 顶大的风机, 一旦改增氧方式或脱气塔配置就必须重选, 不可沿用。此前只显示"0.4 kW · 2863 m³/h", 看不出这一点 |
⚠ 这两组数据全部取自主页面已导出的 aeration / aerIntensity /
indoorCO2 三个块, 本页不重算任何一个数 —— 否则就又造出了第二个数据源。
RAS 项目选址决定了气候/水温, 不同地区的成本差异巨大。v1.3 提供 4 个典型工况的标准化对比, 帮助:
使用 v1.3 默认参数, 4 工况下综合成本(含 CAPEX 折旧, 不含人工/苗种):
| 工况 | 气温 / 源水 | OPEX | 折旧 | 综合 元/kg |
|---|---|---|---|---|
| 青岛冬季 设计冬 | -7°C / 4°C | 22.4 | 13.6 | 35.96 |
| 海南冬季 设计冬 | 17°C / 22°C | 24.1 | 13.6 | 37.70 |
| 海南夏季 设计夏 | 32°C / 27°C | 26.9 | 13.6 | 40.47 |
| 挪威 Bergen 设计冬 | 0°C / 4°C | 22.7 | 13.6 | 36.30 |
| 文献来源 | 项目 | 综合成本 元/kg | iRAS 偏差 |
|---|---|---|---|
| Atlantic Sapphire (2023) | 迈阿密 RAS 三文鱼 | 60-70(含人工/苗) | iRAS 不含软成本, 偏低 25-30 |
| Stolt Sea Farm | 欧洲大菱鲆 | 40-50 | iRAS 大菱鲆 48.1, 接近 |
| 国家海水鱼体系 2019 | 大菱鲆 500 t | 46.32 | iRAS 偏 +4% |
| 国内罗非 RAS | 规模 1000 t | 25-30 | iRAS 29.3, 接近 |
| 南方对虾 RAS | 100 t | 25-35 | iRAS 41.9, 偏高(规模效应未建模) |
整体精度: iRAS 与文献偏差 ±10-20%, 对于工程概算用途(±40% 精度)足够。
iRAS v1.3 之前的输出停在工程概算: CAPEX 万元 / 年 OPEX 万元 / 综合成本元/kg。 对于设计院做可研报告、业主做投资决策、银行做贷款评审来说, 这些数据只是起点—— 真正的关键问题是:
v1.3 之前用户必须自己导出数据到 Excel, 手算这些指标, 一份可研里财务评价部分通常占 30% 篇幅, 设计院做一份要花 1-2 周。v1.4 加入独立的投资财务评价页面 (finance.html), 把这部分自动化, 把 1-2 周压缩到几小时。
finance.html 是个独立页面, 与主页面通过 localStorage 数据共享:
这个架构有两个优点:
v1.9.2 主页面新增了维护、保险、补水、排污(工艺侧)与苗种、人工、管理费(企业侧)七个成本项,
与本模块自带的 repairRate / laborCost / adminRate 三个参数产生交叉。
分工如下:
| 成本项 | 谁算 | 处理 |
|---|---|---|
| 维护与备件 | 财务模块(repairRate) | 主页面导出的 annualOpexForFinance 已剔除维护费,避免重复;保留财务模块单独使用时的完整性 |
| 苗种 | 主页面 | 财务模块没有这一项,主页面已将其并入 annualOpexForFinance。漏算会让 IRR 严重失真——鳗鲡苗种占企业全成本 43%,漏算相当于每公斤少算 42 元 |
| 人工 | 财务模块(laborCost) | 默认值由主页面提供(定员 × 人均年成本),用户仍可在本模块覆盖 |
| 管理费 | 财务模块(adminRate) | 不冲突。注意两边口径不同:财务模块 = 收入 × adminRate;主页面 = 成本 × overheadRate |
| 保险 / 补水 / 排污 | 主页面 | 财务模块无对应项,随 annualOpexForFinance 流入,不冲突 |
finance-core.js 读的一直是 annualOpex,
从未读过 annualOpexForFinance——即下面这条「回退路径」是唯一在跑的路径,
维护费双算、苗种费漏算,存活七个版本而门禁全绿(契约判据只查字段「在产出面」,不查「被消费」;
v2.7 新增 C10 运行时判据补此缺口)。实测全投资 IRR:鲑鱼 10.71 % → 12.92 %,鳗鲡 40.48 % → 22.38 %。
用 v2.6 及以前版本生成的可研报告,高苗种占比鱼种(鳗鲡、石斑)财务结论偏乐观近一倍,应重新生成。annualOpexForFinance 时,财务模块回退到 annualOpex。
此时维护费会重复计算、苗种费缺失——两者方向相反:
鲑鱼以维护重复为主(成本高估约 2.65 元/kg),鳗鲡以苗种缺失为主(成本低估约 42 元/kg)。
使用旧方案数据做财务评价时须注意此差异。
用户在 finance.html 顶部填写 17 个财务参数, 分 3 组:
| 组 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| 📈 销售与产能 | |||
| 📈 | 售价 (元/kg) | 按鱼种 (鲑 60 / 大菱鲆 80 / 罗非 22 / ...) | 出厂价 |
| 📈 | 项目年限 (年) | 15 | 评价期, 5-30 可调 |
| 📈 | 第 1 年达产率 (%) | 30 | BF 培菌 + 鱼苗培育期 |
| 📈 | 第 2 年达产率 (%) | 70 | 逐步加负荷 |
| 📈 | 第 3 年起达产率 (%) | 100 | 满产 |
| 📈 | 建设期 (年) | 1 | 含调试期 |
| 💵 投资与筹资 | |||
| 💵 | 流动资金 (% × 年 OPEX) | 15 | 启动期周转金, 末年回收 |
| 💵 | 自有资金比例 (%) | 30 | 剩余 70% 银行贷款 |
| 💵 | 贷款利率 (% 年) | 5 | 国内项目贷款典型 |
| 💵 | 还款方式 | 等额本息 | 或等额本金 |
| 💵 | 还款年限 (年) | 8 | 通常短于项目年限 |
| 📊 评价参数 | |||
| 📊 | 折现率 (% 年) | 8 | 用于 NPV, 国内项目典型 8-10% |
| 📊 | 所得税率 (%) | 25 | 企业所得税 |
| 📊 | 销售税金附加 (%) | 0 | 农产品免征, 其他 6-13% |
| 📊 | 修理费率 (% × 设备) | 2 | 工程惯例 |
| 📊 | 管理费率 (% × 销售) | 3 | 典型工业项目 |
| 📊 | 人工成本 (万元/年) | 由主页面导出 | v1.9.2 主页面按定员 × 人均年成本计算(定员 = max(最小班组, 年产量 ÷ 劳动生产率),三个参数在主页面 UI 可调,默认 8 人 / 60 t·人⁻¹·yr⁻¹ / 15 万元)。旧版用写死的阶梯函数(5 万元/人·年口径),与主页面相差 1.1-2 倍,会使同一份可研的成本表与财务章出现两个人工成本。老版本主页面未导出时回退到阶梯函数 |
财务评价的核心是逐年现金流。每年有 4 类现金流入流出:
fixedAsset × 5% 是经验值, 但设备和土建残值率不同:
设备(8 年折旧周期, 通常 10-15 年报废) 残值 ≈ 5% (机电二手价值);
土建(20 年折旧周期, 通常 30-50 年使用) 残值 ≈ 20% (建筑物结构残值)。
v1.5 起拆分计算: 残值 = totalCapexEquip × 5% + totalCapexCivil × 20%。
对千吨级三文鱼项目, 旧公式低估末年残值约 8-12%, 即 NPV 偏低 0.3-0.5 个百分点(对回收期/IRR 影响小)。
IRR (Internal Rate of Return) 是让 NPV = 0 的折现率:
这是非线性方程, iRAS 用 Newton-Raphson 迭代求解:
当 Newton-Raphson 发散(典型场景: 多重 IRR 解或符号变化异常),自动切换到二分法兜底: 在 [-0.5, 5.0] 区间求 NPV=0 的根。两种算法配合, 能稳定处理常见的 RAS 项目现金流。
遵循国家发改委《建设项目可行性研究报告编制规范》要求:
| 表 | 名称 | 主要内容 |
|---|---|---|
| 1 | 投资估算 | 设备 + 土建/安装/电气/自控/设计 + 流动资金 = 项目总投资 |
| 2 | 资金来源运用 + 还款计划 | 自有/贷款比例 + 逐年利息/本金 |
| 3 | 总成本费用估算 (满产年) | 经营成本 + 修理 + 管理 + 人工 + 折旧 + 利息 |
| 4 | 销售收入和税金 | 逐年: 达产率 → 产量 × 单价 → 销售收入 / 税金 |
| 5 | 损益表 | 逐年: 销售收入 − 各项成本 − 税 = 净利润 |
| 6 | 现金流量表 (全投资) | 逐年净 CF + 累计 CF + 累计折现 NPV → IRR |
| 7 | 现金流量表 (自有资金) | 含贷款流入 + 还本付息, 算股东 IRR |
| 8 | 敏感性分析 | 5 因子各 ±20% 对 IRR 影响, 按摆动排序 |
| 指标 | 定义 | 判断标准 |
|---|---|---|
| 全投资 IRR (税后) | 项目所有现金流(不含贷款)的内部收益率 | > 折现率 (8%) → 财务可行 |
| 自有资金 IRR | 股东视角 IRR (项目 CF + 贷款流入 − 还本付息) | 有杠杆放大效应 |
| NPV (净现值) | 按折现率折算到 t=0 的累计 CF 现值 | > 0 → 项目可行 |
| 静态投资回收期 | 累计净 CF 首次 ≥ 0 的年份(线性插值) | RAS 项目典型 5-8 年 |
| 动态投资回收期 | 累计折现 CF 首次 ≥ 0 的年份 | 静态值 + 折现影响 |
| 盈亏平衡点 (BEP) | 满产年净利润 = 0 时的产量比例 | < 75% 满产 → 安全裕度大 |
对项目 IRR 进行单因子敏感性分析, 5 个常用因子:
| 因子 | 变化幅度 | 典型 IRR 摆动 (1000 t 三文鱼) |
|---|---|---|
| 售价 | ±20% | ±5-7% (最敏感) |
| CAPEX | ±20% | ±3-4% |
| 产量 | ±10% | ±1-2% |
| 饲料成本 | ±20% × share_feed | ±1-1.5% |
| 电费 | ±20% × share_elec | ±0.4-0.6% |
share_feed = feedCost / annualOpex。
对虾项目 share_feed 可能仅 35%, 罗非鱼项目可能 65%, 不同鱼种敏感性表会自动调整。
注意 share 是说明 项目特定 的敏感性, 不是计算公式 (计算还是 OPEX × ±20%, 只是用 share 解释"为什么饲料 ±20% 只让 IRR 摆动 ±1.5%而不是 ±5%")。
注: 折现率不影响 IRR (IRR 是让 NPV=0 的折现率, 与折现率参数无关), 故不在敏感性表中。 但折现率会影响 NPV——折现率越高, NPV 越低。
结果按 IRR 摆动从大到小排序, 自动绘制 Tornado 图 (横向条形图)。 设计院通常拿这张图给业主看"这个项目的最大风险因子是什么"——RAS 项目永远是售价。
用 v1.3 默认参数计算的方案数据 (CAPEX 14681 万 / 年 OPEX 2236 万 / 年折旧 1360 万), 售价 60 元/kg, 30% 自有 + 70% 贷款 (5%, 8 年), 折现率 8%, 项目 15 年:
| 指标 | 数值 | 解读 |
|---|---|---|
| 全投资 IRR | 14.0% | > 折现率 8%, 财务可行 ✓ |
| 自有资金 IRR | 20.5% | 贷款杠杆放大 6.5% |
| NPV @ 8% | 6878 万元 | 正值, 创造 6878 万元股东价值 |
| 静态投资回收期 | 6.3 年 | RAS 项目典型水平 |
| 动态投资回收期 | 9.0 年 | 含折现影响 |
| 盈亏平衡产量 | 63.4% 满产 | 实际产量打 7 折也能保本, 安全裕度大 |
| 因子 | 低值 IRR | 基准 IRR | 高值 IRR | 摆动 |
|---|---|---|---|---|
| 售价 ±20% | 8.0% | 14.0% | 19.1% | 11.1% |
| CAPEX ±20% | 17.6% | 14.0% | 11.3% | 6.3% |
| 产量 ±10% | 12.3% | 14.0% | 15.6% | 3.3% |
| 饲料成本 ±20% | 15.2% | 14.0% | 12.7% | 2.5% |
| 电费 ±20% | 14.4% | 14.0% | 13.5% | 0.9% |
用同样的 1000 t 规模, 不同鱼种和价格:
| 鱼种 | 售价 元/kg | 全投资 IRR | 自有 IRR | NPV 万元 | 回收期 | 结论 |
|---|---|---|---|---|---|---|
| 三文鱼 | 60 | 14.0% | 20.5% | 6878 | 6.3 年 | 主流, 可行 |
| 三文鱼 (高端) | 80 | 22.2% | 37.1% | 18150 | 4.5 年 | 有溢价能力, 优秀 |
| 大菱鲆 | 80 | 38.0% | 73.2% | 28873 | 3.0 年 | 毛利高 (国内底栖鱼供需) |
| 罗非鱼 | 22 | −2.5% | −6.1% | −6798 | 不回本 | RAS 不适合罗非, 池塘已够便宜 |
这张表能直接告诉投资人: 不要用 RAS 养罗非鱼 — 不是技术问题, 是经济问题。 RAS 适合高单价 (> 40 元/kg) + 集约化要求高 (海水/北方/特殊品种)的鱼种。
finance.html 用 SheetJS 库 (CDN 加载) 实现一键导出 Excel, 输出 7 个工作表:
设计院拿到 Excel 后可以:
v1.4 财务评价的当前局限:
未来 v1.5+ 可能扩展的方向:
但所有扩展之前的前提是: v1.4 当前版本被实际用户用过, 反馈了真实问题。设计院、咨询公司、业主用一个月, 告诉我们哪里反人类、哪里数字对不上、哪里需要补字段——这才是优先级最高的下一步。
v1.4 之前的 iRAS 输出层级是工程数据(P&ID + 设备清单 + 财务评价 Excel), 用户拿到这些数据后还需要手动整合到 Word 可研报告里。 这是 RAS 项目从"概念"到"立项"过程中的最大手工劳动:
v1.5 加入可研报告生成器 (report.html), 把 iRAS 的工程和财务数据自动套到 16 章扩展版可研模板中, 输出 .docx 文档。 设计院拿到后只需补充项目身份、场址自然条件、土建详细设计等"必须人工填写"的内容即可。 预期能把可研撰写时间从 1-2 个月压缩到 1-2 周。
v1.5 在设计阶段做了 10 个产品决策, 每个决策都直接影响实现方式:
<script type="text/njk-template">(保持 iRAS 单文件部署传统)v1.5 覆盖发改委可研编制规范的扩展 16 章。各章自动化率(数据来自 iRAS 自动填充的比例):
| 章 | 名称 | iRAS 自动化率 | 主要数据来源 |
|---|---|---|---|
| 1 | 总论 | 85% | 项目元数据(20 字段)+ 工程财务汇总 |
| 2 | 项目背景与建设必要性 | 50% | 鱼种条件分支 + 用户填地区描述 |
| 3 | 市场分析与建设规模 | 60% | 鱼种市场概述 + 规模配置 |
| 4 | 建设场址与建设条件 | 30% | 大量 placeholder, 用户填具体场址 |
| 5 | 工艺技术方案 | 95% | iRAS 工艺数据完整覆盖 |
| 6 | 主要设备方案 | 100% | iRAS 设备清单完整覆盖 |
| 7 | 土建/总图/公用工程 | 50% | 车间面积/电力负荷自动 + 详细土建用户填 |
| 8 | 节能节水 | 70% | 用水量/电耗自动 + 节能措施模板 |
| 9 | 环境影响评价 | 60% | 排放估算自动 + 现状用户填 |
| 10 | 劳动安全卫生与消防 | 40% | 危险源识别 + 应急预案模板, 不替代安评 |
| 11 | 项目实施与组织机构 | 65% | 进度甘特表 + 人员配置(规模分支) |
| 12 | 投资估算与资金筹措 | 95% | iRAS 投资数据完整覆盖 |
| 13 | 财务评价 | 100% | iRAS finance.html 数据完整覆盖(8 张标准财务表 + NPV/IRR + 敏感性) |
| 14 | 国民经济 / 社会效益评价 | 50% | 就业/税收/产业链估算(简化版社会效益) |
| 15 | 风险分析 | 70% | 4 类风险识别 + 敏感性 + 风险等级条件分支 |
| 16 | 结论与建议 | 80% | 整体结论模板 + 关键指标条件分支 |
加权平均自动化率约 70%, 用户需要补充的主要是: 项目身份(20 字段)、场址自然条件、土建详细设计、消防/环评/安评等专项内容(后三者必须由有资质机构出具)。
模板里所有变量按以下命名空间组织:
| 命名空间 | 来源 | 主要字段 |
|---|---|---|
{{ project }} | 用户在 report.html 表单填写 | 项目名/业主/地址/编制单位/资质等 20 字段 |
{{ farm }} | iRAS 主页面方案 | 鱼种/规模/各阶段配置/池数/池径反推/总存塘等 |
{{ workflow }} | iRAS perStage 工艺数据 | RDF/BF/UV/CO₂/增氧锥/蛋分/反硝化/AOP/集水池 |
{{ thermal }} | iRAS 热平衡求解(预留) | 气候/围护/COP/工况(v1.5.x 完善) |
{{ capex }} | iRAS 投资估算 | 设备直购/土建/流动资金/总投资 |
{{ opex }} | iRAS 运行成本 | 年 OPEX/综合成本/折旧/电耗/液氧 |
{{ finance }} | finance.html 计算逻辑 | params(17 个用户参数)+ indicators(6 个 KPI)+ tables(8 张表) |
{{ meta }} | 报告元信息 | 生成时间/iRAS 版本/模板版本 |
二批把模型告警做成结构化 configWarns 时就写明"报告侧消费"是目标形态。
下游审计发现实际情况比"未消费"更严重一档:
configWarns / aeration /
aerIntensity / 入室 CO₂ 四组量全都不在导出 payload 里 ——
报告侧想消费也没得消费。于是"报告照出成本、不带任何不可行标记"这句话
是字面成立的: 用户拿着一份 CO₂ 超标、曝气强度超限的方案,
可研报告里一个字都不提, 而经济指标照算照印。
v2.3.3 打通三段: 主页面过桥(断言 Y0–Y3 判逐位相等 —— 过桥是纯搬运,
任何差异都说明中间有人加工了, 而加工正是双源漂移的起点)→ 报告侧
warnings 命名空间归集 → 正文呈现。
| 命名空间 | 来源 | 主要字段 |
|---|---|---|
{{ warnings }} | iRAS perStage[].configWarns + indoorCO2 | items(逐条: 阶段/级别/问题/实测与判据/建议处置)· count · hasDanger · room(车间 CO₂ 与新风量) |
⚠ 本层只归集与措辞, 不判定。判据全在主页面数据层(结果级 + 零新阈值); 若日后有人在报告侧加一条"报告独有"的判定, 那就是双源的开始。
三种取向都考虑过, 最终取显式披露:
| 取向 | 做法 | 为什么没选 / 选了 |
|---|---|---|
| 硬阻断 | 检出严重告警就拒绝生成报告 | 没选。"我知道超标, 就是要出个初稿"是正常用法; 挡住它只会让人绕过工具, 而绕过之后连告警都看不到了 |
| 显式披露 | 固定新增一节, 有则逐条列、无则明写"未检出配置级告警" | 选了。让"这份报告有没有被检出问题"成为读者一定会看到的事实, 而不是需要去翻的东西 |
| 就地标注 | 相关章节旁注 | 一并选了。保证"看得见的地方就是该看的地方" |
落地为三处:
check_downstream_contract.js 的 C3 与 C4 有意不同源 ——
C3 是静态判据(代码里写了 warnings 命名空间、15.5 小节、hasDanger 分支),
C4 是运行时判据(拿一份必然带告警的方案真的渲染一遍, 检查正文里确实印出了告警条目)。
C3 防"删代码", C4 防"写了但被某个 if 挡住、谁也没发现"。
C4 另配两份取样: A 只带 warn 级、B 必带 danger 级, 后者专验结论章的措辞降级 ——
只有 A 时该判据没有工况能走到。
| 图 | 位置 | 内容 |
|---|---|---|
| 图 5-1 | 第 5 章 5.2 工艺流程 | 6 个主流程方框 + 主循环 + 旁路单元(条件显示)+ 关键参数表 |
| 图 13-1 | 第 13 章 13.6.1 全投资现金流 | 实线全投资 + 虚线自有资金, 含 0 轴线、网格、节点标记 |
| 图 13-2 | 第 13 章 13.11 敏感性分析 | 5 因子 Tornado 图, 按 IRR 摆动从大到小排序 |
图表生成路径: 浏览器侧 SVG → Canvas → PNG → docx ImageRun。中文字体使用系统 SimHei/Microsoft YaHei, 高清 2× DPR 渲染。
三文鱼 1000 t/年项目, 用 v1.5 生成的可研报告大致规格:
| 项目 | 数值 |
|---|---|
| 文件大小 | 约 200-400 KB(含 3 张 PNG 图) |
| 章节数 | 16 章 + 封面 |
| 段落数 | 约 800 段 |
| 表格数 | 约 50 个 |
| 列表项 | 约 380 个 |
| 粗体强调 | 约 600 处 |
| 页数(Word 默认排版) | 约 60-80 页 |
v1.5 当前局限:
未来 v1.5.x / v1.6+ 可能扩展:
但所有扩展前提是: v1.5 当前版本被实际用户使用过, 反馈了真实问题。
本附录列出 iRAS 所有版本 (v1.0 → v1.7) 使用的全部符号。
| 符号 | 含义 | 单位 | 默认值 / 范围 |
|---|---|---|---|
| 质量平衡 + 浓度 | |||
| Δ | 每循环污染物增量 | mg/L | — |
| R | 总通过率 | — | — |
| C_out | 鱼池出水浓度 | mg/L | — |
| C_in | 回水浓度 | mg/L | — |
| η_rdf | RDF TSS 去除率 | % | 75 |
| η_bio | BF TAN 硝化率 | % | 70 |
| η_bioTSS | BF TSS 去除率 | % | 20 |
| VTR₂₀ | BF @20°C 容积去除率 | g/(m³·d) | 500 |
| VDR₂₀ | 反硝化 @20°C | g/(m³·d) | 800 |
| θ_nit / θ_den | 温度系数 | — | 1.10 / 1.08 |
| f_sal | 盐度修正 | — | max(1−0.01S, 0.3) |
| SOTE | 氧传质效率 | % | 粗孔 8% / 微孔 18% |
| tanCoef | TAN 系数 | — | 0.092 (淡) / 0.110 (海水肉食) |
| RQ | 呼吸商 | — | 1.0 |
| v1.1 物理框架 | |||
| o2BaseFactor | 20°C 基准 | — | 0.13-0.32 (按物种) |
| o2Q10 | 温度敏感 | — | 2.0 (鱼) / 1.3 (虾) |
| o2FishFactor | 生效值 | — | base × Q10^((T−20)/10) |
| o2DOMfactor | 异养菌耗氧 | — | 0.10 (可调 0.05-0.20) |
| peakFactor | 日内峰均比 | — | 1.5 |
| safety* | 工程安全系数 | — | 1.10-1.15 |
| COP_heat / cool | 热泵 | — | 4.0 / 3.0 |
| η_HX | 板换回收率 | % | 75 |
| co2BlowerPressure | CO₂ 风压 | kPa | 2.5 |
| co2BlowerEfficiency | CO₂ 风机效率 | % | 60 |
| depYearsEquip | 设备折旧 | 年 | 8 |
| depYearsCivil | 土建折旧 | 年 | 20 |
| V_tank | 鱼池水体 | m³ | biomass / density |
| V_process | 工艺水体 | m³ | 各设备水量合计 |
| V_total | 系统总水体 | m³ | V_tank + V_process |
| v1.2 全局气候 + 围护 | |||
| T_air_design_winter | 设计冬季气温 | °C | -7 (青岛) |
| T_air_design_summer | 设计夏季气温 | °C | 32 (青岛) |
| T_air_annual | 年均气温 | °C | 13 (青岛) |
| T_source_design_winter | 设计冬季源水温 | °C | 4 |
| T_source_design_summer | 设计夏季源水温 | °C | 24 |
| T_source_annual | 年均源水温 | °C | 14 |
| T_ground | 地温(年均近似) | °C | = T_air_annual |
| RH_winter / summer / annual | 3 工况相对湿度 | % | 60 / 78 / 70 |
| U_wall | 墙保温系数 | W/(m²·K) | 0.8 |
| U_roof | 屋顶保温系数 | W/(m²·K) | 0.6 |
| U_floor | 地板保温系数 | W/(m²·K) | 0.8 |
| U_window | 窗保温系数 | W/(m²·K) | 2.5 |
| windowRatio | 窗墙比 | — | 0.05 |
| airChangeRate (ACH) | 通风换气次数 | 1/h | 1.0 |
| ventHeatRecovery | 排风热回收效率 | — | 0 (国内) / 0.7-0.85 (北欧) |
| poolCover | 池盖类型 | — | none(1.0)/partial(0.4)/full(0.1) |
| buildingArea_user | 用户指定车间面积 | m² | 0(自动 = 1.6 × poolArea) |
| buildingHeight | 车间净高 | m | 6 |
| thermalScenario | 当前工况 | — | design_winter / design_summer / annual |
| climateRegion | 地区预设 | — | china_qingdao / china_hainan / norway_bergen / … |
| envelopePreset | 围护预设 | — | industrial_standard / nordic_premium / cheap |
| hpType | 热泵类型 | — | air / water / ground / seawater_open |
| v1.2 双节点稳态求解 | |||
| T_room | 车间空气温度(求解输出) | °C | T_air + 5~12 |
| RH_room | 车间相对湿度(求解输出) | % | 55-80 |
| W_room | 车间空气含湿量(求解输出) | kg/kg | 0.008-0.020 |
| m_evap | 蒸发率(负值=凝结) | kg/(m²·s) | ±2-50 ×10⁻⁵ |
| UA_envelope | 围护总 UA(墙+顶+窗) | W/K | 500-2000 |
| UA_pool | 池散热 UA | W/K | poolU × poolArea |
| poolU | 池水对空气换热系数 | W/(m²·K) | 5(室内)/ 18(室外) |
| v1.3 模块化 + 鱼池配置 | |||
| subSystemCount | 阶段并联套数(用户输入) | — | 1-10, 默认 1 |
| numModules | 实际模块数 = subSystemCount | — | ≥ 1 |
| poolsPerSet | 每套池数(用户输入) | — | 1-10, 默认 1 |
| poolDepth_m | 单池深度(用户输入, 统一数据源) | m | 0.5-8, 默认 = recDepth_m |
| recDepth_m | 鱼种推荐池深(SPECIES_DB) | m | 0.8-7.0(按鱼种和阶段) |
| v1.3.x 新增 | |||
| thermalSharingFactor | 共用车间散热系数 | — | 0.5-1.0, 默认 0.75 |
| V_sump | 集水池容积 | m³ | clamp(Q/30, 20, 200) |
| v1.4 投资财务评价 (finance.html) | |||
| price (元/kg) | 售价 | 元/kg | 按鱼种 (鲑 60, 大菱鲆 80, 罗非 22, 等) |
| years | 项目评价年限 | 年 | 5-30, 默认 15 |
| ramp1/2/3 | 逐年达产率 | % | 30 / 70 / 100 (默认) |
| buildYears | 建设期 | 年 | 0.5-3, 默认 1 |
| workingCap | 流动资金 (% × 年 OPEX) | % | 0-50, 默认 15 |
| ownPct | 自有资金比例 | % | 0-100, 默认 30 |
| loanRate | 贷款利率 | % 年 | 0-15, 默认 5 |
| loanMethod | 还款方式 | — | 等额本息 / 等额本金 |
| loanYears | 还款年限 | 年 | 1-20, 默认 8 |
| discount | 折现率 (用于 NPV) | % 年 | 0-20, 默认 8 |
| taxRate | 所得税率 | % | 0-35, 默认 25 |
| salesTax | 销售税金附加 | % | 0-20, 默认 0 (农产品免征) |
| repairRate | 修理费率 | % × 设备/年 | 0-10, 默认 2 |
| adminRate | 管理费率 | % × 销售收入 | 0-20, 默认 3 |
| laborCost | 人工成本 | 元/年 | 按规模估, 30-360 万元/年 |
| NPV | 净现值 | 元 | = Σ CF[t]/(1+r)^t, r=discount |
| IRR | 内部收益率 | % | 令 NPV=0 的折现率, Newton-Raphson 求解 |
| BEP | 盈亏平衡产量 | % 满产 | 满产年净利润=0 时的产量比例 |
| v1.7 氧锥拓扑 + 系统排水 | |||
| o2ConeTopology | 氧锥工艺拓扑 | — | mainline / bypass, 默认 mainline |
| o2ConeHeadLoss_m | 主路时氧锥附加压头 | m | 3, 钳 [0, 15] |
| o2BypassRatio | 旁路占比 (bypass 模式) | % | 10, 钳 [5, 30] |
| o2BypassPumpHead_m | 旁路泵 P-602 扬程 | m | 20, 钳 [5, 40] |
| o2BypassPumpEta | 旁路泵效率 | % | 60, 钳 [30, 85] |
| aopO3Dose_gm3 | AOP 臭氧投加剂量 | g O₃/m³ | 0.5, 钳 [0.1, 3.0] (v1.7 暴露字段, UI v1.8) |
| sim.discharge.V_m3_d | 系统排水日流量 | m³/d | = V_total × exchangeDaily (v1.7 重构) |
| sim.discharge.TSS_kg_d | 系统排水 TSS 日量 | kg/d | = load.tssDaily (质量守恒, 含污泥) |
| sim.discharge.TAN_mg_L | 系统排水 TAN 浓度 | mg/L | = C_tank (溶解态) |
| sim.discharge.NO3_mg_L | 系统排水 NO₃ 浓度 | mg/L | = C_tank (溶解态) |
iRAS 全局热配置(globalThermalConfig)字段一览 (含 v1.9.2 新增的通风与除湿参数、v1.9.3 换代的自然冷却参数、v2.0.0 新增的车间与接触器参数):
| 字段名 | 类型 | 默认值 | UI 位置 | 说明 |
|---|---|---|---|---|
| climateRegion | 下拉 | china_qingdao | 地区预设 | 选择后自动填 T_air/T_source/RH |
| thermalScenario | 下拉 | design_winter | 当前工况 | 3 个工况切换 |
| envelopePreset | 下拉 | industrial_standard | 围护预设 | 选择后自动填 U 值 |
| hpType | 下拉 | air | 热泵类型 | 4 种 |
| T_air_design_winter | 数值 | -7 | 气温区 | °C |
| T_air_design_summer | 数值 | 32 | 气温区 | °C |
| T_air_annual | 数值 | 13 | 气温区 | °C |
| T_source_design_winter | 数值 | 4 | 源水温区 | °C |
| T_source_design_summer | 数值 | 24 | 源水温区 | °C |
| T_source_annual | 数值 | 14 | 源水温区 | °C |
| RH_winter | 数值 | 60 | 湿度区 | % |
| RH_summer | 数值 | 78 | 湿度区 | % |
| RH_annual | 数值 | 70 | 湿度区 | % |
| U_wall | 数值 | 0.8 | 围护区 | W/(m²·K) |
| U_roof | 数值 | 0.6 | 围护区 | W/(m²·K) |
| U_floor | 数值 | 0.8 | 围护区 | W/(m²·K) |
| U_window | 数值 | 2.5 | 围护区 | W/(m²·K) |
| windowRatio | 数值 | 0.05 | 围护区 | 窗墙比 |
| airChangeRate | 数值 | 1.0 | 围护区 | ACH (1/h) |
| ventHeatRecovery | 数值 | 0 | 围护区 | 0-0.85 |
| VTR20 | 数值 | 500 | 工艺参数区 | 20°C 容积 TAN 去除率 g/(m³·d)。工程经验取值,具体项目应按填料厂家或设计单位数据覆盖。见 10.2 |
| thetaNit | 数值 | 1.10 | 工艺参数区 | 硝化温度修正系数。见 10.2 |
| VDR20 | 数值 | 800 | 工艺参数区 | 20°C 容积反硝化速率 g NO₃-N/(m³·d)。见 10.2 |
| thetaDen | 数值 | 1.08 | 工艺参数区 | 反硝化温度修正系数。见 10.2 |
| maintenanceRate v1.9.2 | 数值 | 4.5 | 运营费率区 | 维护与备件 %/年。国产设备口径;进口高端交钥匙取 2-3 |
| maintenanceBase v1.9.2 | 下拉 | equipPlusInstall | 运营费率区 | 维护费基数:equipOnly / equipPlusInstall(×1.6,剔土建) / totalProject |
| insuranceRate v1.9.2 | 数值 | 0.8 | 运营费率区 | 保险 %/年,按工程总投资计 |
| overheadRate v1.9.2 | 数值 | 5.0 | 运营费率区 | 管理费 %,基数含苗种与人工 |
| laborProductivity v1.9.2 | 数值 | 60 | 运营费率区 | 劳动生产率 t/(人·年)。NOAP 约 22,FI 美国场约 127 |
| laborCostPerPerson v1.9.2 | 数值 | 150000 | 运营费率区 | 人均年成本 元,含社保福利 |
| laborBaseCrew v1.9.2 | 数值 | 8 | 运营费率区 | 最小班组人数(24h 值守下限) |
| waterPriceFresh / Seawater v1.9.2 | 数值 | 3.0 / 0.5 | 单价区 | 补水单价 元/m³,按阶段盐度自动选用 |
| dischargePrice v1.9.2 | 数值 | 2.0 | 单价区 | 排污处理 元/m³ |
| seedPrice v1.9.2 | 数值 | 随鱼种 | 单价区 | 苗种 元/尾。切换鱼种自动带出默认值(鲑鱼卵 1.5 / 玻璃鳗 20 / 虾苗 0.03 等) |
| co2IndoorLimit_ppm v1.9.2 | 数值 | 1500 | 围护区 | 车间 CO₂ 设计限值 ppm, 800-5000。用于按鱼载荷反算新风需求下限 |
| degasserExhaustIndoorFrac v1.9.2 v2.0 废弃 | 数值 | 0.2 | 围护区 | 脱气塔尾气入室比例 0-1。0 = 管道直排室外, 1 = 全部排入车间 |
| dehumEnabled v1.9.2 | 开关 | false | 围护区 | 是否配置机械除湿机 |
| dehumTargetRH v1.9.2 | 数值 | 70 | 围护区 | 除湿控制目标 RH %, 40-90 |
| dehumSMER v1.9.2 | 数值 | 2.5 | 围护区 | 比除湿效率 kg水/kWh, 0.5-6 |
| dehumCondRecovery v1.9.2 | 开关 | true | 围护区 | 冷凝水是否回收作补水 |
| dehumHeatDest v1.9.2 | 下拉 | outdoor | 围护区 | 冷凝热去向: outdoor / indoor / water |
| poolCover | 下拉 | partial | 围护区 | none / partial / full |
| buildingArea_user | 数值 | 0(自动) | 围护区 | 0 = 自动估算 |
| buildingHeight | 数值 | 6 | 围护区 | m |
| thermalSharingFactor | 数值 | 0.75 | 围护区 | 0.5-1.0, 共用车间散热系数 |
| freeCoolingEnabled | 下拉 | true | 围护区 | 自然冷却开关。关闭则强制全部走机械压缩制冷(保守) |
| roomRH_set v2.0.0 | 数值 | 65 | 围护区 | 车间设定相对湿度 %。T_room = T_w 后,池面蒸发只依赖本参数。区间依据:ASHRAE Ch.6 泳池馆 50–60%;CJJ 122 与国际泳池标准 50–70%;实测 RAS 车间(AQUAIR 开放数据集)中位 87% |
| contactorRecovery v2.0.0 | 数值 | 0 | 围护区 | 气液接触器排气热回收率 0–0.95。排气为水温饱和空气、焓值高,适合回收。⚠ 默认 0 = 不回收 |
| hvacEnabled v2.0.0 | 布尔 | true | 围护区 | 车间围护+通风显热是否计入能耗。置 false 退回「界外」口径(供暖通专业单独计列的项目) |
| co2StripperEffMode v2.0.0 | 枚举 | manual | 脱气塔 | manual = 沿用 co2StripperEff(与 v1.x 逐位一致);auto = 按 Timmons Ch.10 Fig 10.13/10.14/10.17 曲线自动算 |
| co2PackingHeight_m v2.0.0 | 数值 | 1.5 | 脱气塔 | 填料层高度 m,范围 0.3–3.0。Ch.10 p.245:设计高度限于 1.0–1.5 m,超 1.5–2.0 m 收益递减。⚠ 填料深度超 1 m 时建议水力负荷取偏低端以降低风机背压 |
| co2MaxAttainableEff v2.0.0 | 数值 | 80 | 脱气塔 | 该装置在 G:L = 20 时的最大可达单次去除率 %(Fig 10.13 约 80%) |
| co2Outdoor_ppm v2.4 | 数值 | 450 | 全局 | 室外 CO₂ 本底 ppm,范围 300–5000。两个消费点:车间新风稀释基准 dC = 车间限值 − 本底;脱气塔 auto 模式的进风本底。⚠ v2.4 起本字段替代已撤销的 co2IntakeCO2_ppm(原默认 350,无 UI 框,其钳制从未执行过)—— 二者本是同一物理量的两份口径、值还不一样。合并前提:工艺气路全程不碰车间,塔进风即室外空气(Fig 10.17:进风本底 1000 ppm 时去除率降 10%、5000 ppm 降 70%,这是「尾气必须排室外、不得回车间」的量化依据;若日后允许塔进风取自车间,须拆回两层)。⚠ 取小是不安全方向:本底越小 dC 越大、通风量算得越小。全球本底≈420 且逐年 +2.5;城郊 450–500;城市/工业区实测常年 500–700 |
| fcDesignDT_K v1.9.3 | 数值 | 留空=自动 | 围护区 | 自然冷却设计温差 K —— 单独扛满设计负荷所需的冷源-水温差。留空按热源自动取:空气 11 / 水·海水 4 / 地源 6。取代 v1.9.2 的 freeCoolingApproach_K(语义由「阈值」变为「换热能力刻度」) |
| fcAnnualK_air v1.9.3 | 数值 | 0.65 | 围护区 | 年化正弦振幅折减,仅作用于空气源;水/海水/地源固定 1.0。见 D 节 |
| freeCoolingEER | 数值 | 20 | 围护区 | 自然冷却设计点 EER,仅含冷源侧风机与泵的增量功率。干冷器 15-25,板换+冷源水可更高 |
iRAS 完全采用 ISA-5.1 规范 tag 命名(字母+数字), 字母含义:
| 首字母 | 含义 | 示例 |
|---|---|---|
| T | Tank 储罐 / 池 | T-101 鱼池 |
| F | Filter 过滤器 | F-201 微滤 |
| B | Biofilter / Bio-reactor 生物反应器 | B-301 MBBR |
| K | Kompressor 压缩机/风机 | K-101 鱼池增氧风机 v1.7 / K-201 CO₂ 风机 / K-302 BF 风机 |
| D | Disinfection 消毒 | D-401 UV |
| C | Column 塔/柱 | C-501 CO₂ 脱气塔 |
| S | Separator / Sump 分离 / 集水 | S-101 集水池, S-701 蛋分 |
| A | Aerator / Absorber 增氧 / 吸收 | A-601 增氧锥 |
| R | Reactor 反应器 | R-801 反硝化 |
| X | eXtra / 高级处理 | X-901 AOP |
| G | Generator 发生器 | G-901 O₃ |
| V | Vessel 大型容器 / 储罐 | V-901 液氧站级储罐 |
| H | Heat 热相关 | H-801 热泵 |
| P | Pump 泵 | P-101 主循环泵 / P-602 氧锥旁路泵 v1.7 |
| M | Mixer 混合点 / 管段配件 v1.7 | M-601 bypass 模式氧锥旁路混合点 (T 接头) |
| tag 前缀 | 类型 | 示例 |
|---|---|---|
| DO | 溶解氧 | DO-101 鱼池 DO 探头 |
| pH | pH 计 | pH-102 鱼池 pH |
| TT | 温度变送器 | TT-103 鱼池温度 |
| LT | 液位变送器 | LT-104 鱼池液位 |
| PDS | 压差开关 | PDS-201 RDF 压差 |
| AT | 分析变送器 | AT-302 BF 出口 TAN |
| FT | 流量变送器 | FT-101 主管流量 |
iRAS 内置 9 个物种 (含 custom), 本表展示其中 4 种, 完整参数见软件或附录 G。
⚠ feed% 为峰值投饵率 (%/d)。v2.7 校准: 三文鱼苗种 3.0→1.42、幼鱼 1.5→0.96、大菱鲆苗种 3.0→1.70、中鱼 1.5→0.78 —— 原值使隐含峰均比达 2.0–2.75 (正常 1.1–1.5), 经生长周期文献核对后判为峰值虚高。同批配套下调这几个阶段的增氧饱和度 o2SatTarget (三文鱼苗种 145→100、幼鱼 165→115、大菱鲆中鱼 165→120)。
| 品种 | 阶段 | 体重(g) | 月 | FCR | 蛋白% | feed% | 密度 | T°C | 盐‰ | recDepth_m |
|---|---|---|---|---|---|---|---|---|---|---|
| 三文鱼 | 苗种 | 0.1→50 | 6 | 1.0 | 50 | 1.42 | 30 | 12 | 0 | 1.5 |
| 幼鱼 | 50→500 | 8 | 1.1 | 45 | 0.96 | 50 | 14 | 0 | 3.0 | |
| 中鱼 | 500→2000 | 6 | 1.2 | 42 | 1.0 | 60 | 15 | 12 | 5.0 | |
| 成鱼 | 2000→5000 | 4 | 1.20 | 40 | 0.95 | 70 | 15 | 30 | 7.0 | |
| 大菱鲆 | 苗种 | 3→50 | 4 | 0.9 | 55 | 1.70 | 25 | 16 | 28 | 0.8 |
| 中鱼 | 50→250 | 8 | 1.1 | 50 | 0.78 | 50 | 16 | 28 | 1.0 | |
| 成鱼 | 250→600 | 6 | 1.3 | 48 | 0.9 | 60 | 16 | 28 | 1.0 | |
| 加州鲈 | 苗种 | 1→50 | 2 | 0.9 | 50 | 3.5 | 25 | 25 | 0 | 1.5 |
| 中鱼 | 50→250 | 4 | 1.1 | 46 | 1.8 | 40 | 25 | 0 | 2.5 | |
| 成鱼 | 250→600 | 4 | 1.3 | 42 | 1.2 | 50 | 25 | 0 | 3.0 | |
| 对虾 | 苗种 | 0.01→1 | 1 | 1.0 | 45 | 10 | 2 | 30 | 15 | 1.5 |
| 养前 | 1→10 | 1.5 | 1.3 | 42 | 5 | 8 | 30 | 15 | 2.0 | |
| 养后 | 10→30 | 1.5 | 1.6 | 38 | 3 | 15 | 30 | 15 | 2.5 |
完整 9 物种 (含罗非鱼/石斑鱼/鳗鲡/鳜鱼) 见 iRAS 软件内置数据库。recDepth_m 是 v1.3 新增的鱼种推荐池深字段。
本节列出 iRAS 全部 108 个阶段级参数的完整定义、典型范围和调整建议。按工程师的工作流程分为 9 组(A-I),每个参数包含字段名(代码 ID)、中文显示名、单位、默认值、典型范围、物理含义和调整建议。
💡 使用提示:工艺参数面板有「常用 / 全部」切换 tab;常用模式只显示 17 个最关键参数。如需更多参数,切到「全部」即可。
描述每个阶段鱼/虾的生物学特性、密度、饲料配方等。这些参数主要由物种特性决定,工程上通常按物种库默认值,仅在特殊项目(实验配方、变温试养)需要调整。
| 字段 | 中文 | 单位 | 默认 | 范围 | 物理含义 | 调整建议 |
|---|---|---|---|---|---|---|
| weightStart | 进塘体重 | g | 物种库默认 | 0.01-2000 | 该阶段进入时单尾鱼/虾的重量 | 不调(按养殖工艺确定) |
| weightEnd | 出塘体重 | g | 物种库默认 | 1-5000 | 该阶段结束时单尾重量;对虾 PL 期 1g, 鲑鱼成鱼 5000g | 不调 |
| months | 阶段周期 | 月 | 物种库默认 | 1-8 | 该阶段从开始到结束所需时长;对虾 1-1.5月, 鲑鱼成鱼 4-6月 | 不同投喂策略可调(高 protein 缩短) |
| FCR | 饲料系数 | — | 物种库默认 | 0.9-1.6 | 饲料消耗量 / 鱼增重;值越小饲料效率越高 | 高 protein 配方降低;鳗鲡养成期 / 对虾后期可达 1.5-1.6 |
| protein | 饲料蛋白率 | 小数 | 物种库默认 | 0.30-0.55 | 饲料中蛋白质质量比例;影响 TAN 排泄量 | 海水肉食鱼 0.45-0.55,温水淡水 0.30-0.40,对虾 0.35-0.42 |
| feedRate | 阶段末投饵率 | 小数 | 物种库默认 | 0.005-0.10 | 阶段末单日饲料/鱼体重比例 | 不调;对虾苗种 0.05-0.10, 鲑鱼成鱼 0.0095 |
| peakFactor | 日内峰均比 | × | 1.5 | 1.3-2.0 | Timmons & Ebeling 2010 标准:代谢污染物小时峰值/全日均速率比值 | 自动投喂 12+ 次/日 → 1.3;4-6 次/日 → 1.5;2-4 次/日 → 1.8-2.0 |
| tempOpt | 适宜水温 | °C | 物种库默认 | 12-30 | 该阶段目标水温;决定降温/加热能耗与硝化效率 | 物种库已按物种生理给出,特殊场景可调(试养、研究) |
| salinity | 盐度 | ‰ | 物种库默认 | 0-35 | 0=淡水, ≥5=咸水/海水;影响 DO 饱和、硝化效率、CO₂ 阈值 | 不调(按物种) |
| density | 养殖密度 | kg/m³ | 物种库默认 | 2-100 | 稳态存塘量/水体;决定鱼池容积 | 工业 RAS 实测:鲑鱼 30-70, 罗非 50-100, 对虾 2-15, 鳗白仔 10. 调高可减少水体投资但增加水质风险 |
| mortality | 阶段死亡率 | 小数 | 物种库默认 | 0.03-0.30 | 该阶段累积死亡率;影响进出塘尾数差 | 不调(运营经验值);对虾苗种期 0.20-0.30 偏高正常 |
| turnover | 循环倍数 | 次/h | 物种库默认 | 2-6 | 每小时循环换水次数;决定循环流量 | 冷水鱼 2-3, 温水鱼 4-6, 高密度温水(罗非成鱼)需 6+ |
| exchangeDaily | 换水率 | %/d | 物种库默认 | 3-15 | 每天换入新水占池水百分比;决定补水量与化学品稀释 | 低盐场降低(节水),高蛋白场提高(稀释 NO₃⁻) |
| feedPrice | 饲料单价 | 元/kg | 12 | 8-25 | 该阶段饲料价格;影响 OPEX | 按实际采购价 |
| tanCoef | TAN 排泄系数 | g TAN/g N 蛋白 | 物种 0.085-0.110 | 0.080-0.120 | 物种代谢系数:单位摄入蛋白氮排泄成 TAN 的比例 | 物种特性,不调(鲑科 0.092,温水淡水 0.085-0.095,海水肉食 0.100-0.110) |
决定每个工艺单元单次通过的污染物去除率,是工艺方案设计的核心选择。
| 字段 | 中文 | 单位 | 默认 | 范围 | 物理含义 | 调整建议 |
|---|---|---|---|---|---|---|
| rdfTSS | 微滤机 TSS 去除率 | % | 75 | 60-85 | RDF 单次通过对 TSS 的去除率;筛网 60-80μm 典型 70-80% | 筛目越细去除率越高(但反冲增多),低密度场可降到 60 |
| 生物滤池单次硝化效率 (BF-N 起已停用为输入) | % | —(输出) | — | 已改为输出:η 由滤池面积与设计浓度算出(η = TAN日负荷×safetyBio×1000 /(Q×24×Sn)),显示在设备清单与报告 | 停用原因:它与滤池尺寸各管一头、互不校验(v1.9.2 审计 P3)—— 用户可以填 η=95% 却配一个空床接触时间几十秒的池,模型照单全收。现在两者是同一条曲线的两端。历史方案 JSON 里的该键被直接忽略,不报错。⚠ 若算出的 η 超过 100%,说明该流量下 TAN 压不到设计目标,卡住的是 turnover 不是面积,由阶段告警显式报出 | |
| denitriEff | 反硝化单次去除率 | % | 80 | 60-90 | 反硝化反应器单次通过 NO₃⁻ 去除率 | C/N 比例足够 + 缺氧好时可达 90,温度低时降低 |
| denitriFlowPct | 反硝化支路流量比 | % | 2 | 0-20 | 反硝化支路流量占循环总流量百分比 | 不需脱氮可设 0;需要严格控 NO₃⁻ 用 15-20。⚠ 本模型换水率刻意压在产业下沿(极致节水取向),故反硝化不是可选项而是必需项——旁路设 0 时鲑鱼稳态 NO₃-N 可达 414 mg/L(产业"无反硝化 RAS"通常 50-150,因其补水强度高 3-10 倍),那是真实后果不是算错。本行曾长期写"默认 10 / 范围 5-20",与实际默认值 2 不符 |
| uvDose | UV 剂量 | mJ/cm² | 40 | 20-60 | 紫外线杀菌剂量;≥30 杀细菌,≥40 灭活病毒,≥60 灭活孢子 | 一般 40 够用;病害高发或孢子虫风险用 60 |
| uvFlowPct | UV 旁路流量比 | % | 10 | 5-20 | UV 处理流量占循环总流量 | 健康场 10%,疾病防控 15-20% |
| skimmerEnabled | 蛋白分离器启用 | T/F | true | — | 是否上蛋分;DOM/细颗粒 TSS 主要去除单元 | 海水强烈推荐启用;淡水低密度可不启 |
| skimmerMode | 蛋分气源 | air/ozone | ozone | — | air=空气曝气, ozone=臭氧曝气;臭氧 DOM 去除率高 70-80% | 海水启 ozone 注意溴酸盐风险;淡水首选 ozone |
| skimmerFlowPct | 蛋分旁路流量比 | % | 20 | 15-30 | 蛋分支路流量占循环总流量 | 高密度场 25-30,低密度 15 |
| skimmerDOMEffAir | 空气蛋分 DOM 单次去除 | % | 40 | 30-50 | 空气蛋分单次通过对 DOM 去除率 | 取决于鱼种产 DOM 类型,海水鱼蛋白多 → 40-50。⚠ 待标定:30-50 区间无单程溶解态实测支撑——文献多报颗粒物单程去除(海水 12-40%、低盐 6.5-38.5%)或系统级 BOD₅ 降幅,均非本参数口径,不可直接套用。 淡水不必下调:de Jesus Gregersen 2021 淡水 RAS 重复对照实测(颗粒数 −58%、浊度 −62%、BOD₅ −51%)与海水系统同区间;离子强度/气泡尺寸/盐析的机制差异真实,但工程后果不显著。 |
| skimmerDOMEffOzone | 臭氧蛋分 DOM 单次去除 | % | 70 | 60-80 | 臭氧蛋分单次通过对 DOM 去除率 | 臭氧投加充分时 75-80 |
不影响主流程但影响成本和水质细节的参数。
| 字段 | 中文 | 单位 | 默认 | 范围 | 物理含义 | 调整建议 |
|---|---|---|---|---|---|---|
| skimmerTSSEff | 蛋分 TSS 单次去除率 | % | 40 | 30-50 | 蛋分对 TSS 的去除率;主要 < 30μm 细颗粒(< RDF 筛目) | 调高反映蛋分对细颗粒去除强(v1.0 硬编码 0.4,v1.1 开放) |
| skimmerHRT_min | 蛋分塔 HRT | min | 2 | 1.5-4 | 蛋分塔水力停留时间 | Sanders Helgoland LE-315 商业实测 1.8-2.2 min (ScienceDirect 2023); 物理: DOM 吸附是秒级反应, 长 HRT 无收益 |
| ozoneDose | 臭氧投加率 | g O₃/g 饲料 | 0.010 | 0.005-0.015 | 蛋分臭氧投加比;过高会产生溴酸盐 | 海水严控 ≤ 0.010,淡水可 0.012-0.015 |
| aopEnabled | AOP 高级氧化启用 | T/F | true | — | 是否上 AOP 处理土腥味(geosmin、2-MIB) | 土腥味不严重的场可不启;养殖周期长(鳟、鲑)必启 |
| aopFlowPct | AOP 旁路流量比 | % | 5 | 3-15 | AOP 支路流量占循环总流量 | 土腥味重时调 10-15 |
| aopGeosminEff | AOP geosmin 去除率 | % | 90 | 85-95 | AOP 单次对 geosmin/2-MIB 去除率 | 通常不调(设备工艺决定) |
| aopDOMRemoval | AOP DOM 去除率 | % | 5 | 5-15 | AOP 单次对总 DOM 的去除率(v1.1 修复,v1.0 误用 90%) | 保守 5%;优化 AOP 系统可达 10-15 |
| aopType | AOP 类型 | — | integrated | integrated/separated | AOP 反应器类型 | 集成型 (UV+O3 一体, ULTRAAQUA 等主流方案), HRT 1-3 min; 分体型 (O3 接触池 + UV 反应器, 大型项目), HRT 5-10 min |
| aopHRT_min | AOP 反应池 HRT | min | 2 / 8 | 1-15 | AOP 反应池水力停留时间 (按 AOP 类型自动取默认) | 集成型默认 2 min (UV 反应器内反应秒级); 分体型默认 8 min (含 O3 接触池); Schrader 2010 实测 1 min 接触 geosmin 去除 86-92% |
| bfAirFlux | MBBR 流化通量 | m³/(h·m²) | 10 | 2–20 | v2.5 决定 BF 风机选型;MBBR 内 DO 由此反算而非输入 | Norsk Vann 168/2009:为保证良好混合,供气量不应低于 10–15 m³/h·m² 池底(随载体而定)⇒ 10–15 是下限区间不是典型值。次级参考:Aquacultural Engineering 实测表观气速 < 5 m/h 时 TAN 去除率下降。⚠ 表观气速不是合格的放大准则,深池浅池同通量下混合强度不同,本模型未修正 |
| bfDepth | MBBR 池水深 | m | 3 | 2–6 | v2.5 三处同源:池底面积、气液平衡(中点压力)、风机压力 | v2.5 前风机压力硬编码 50 kPa(≈5 m 水柱),与 3 m 默认自相矛盾,现已单源化 |
| bfDOMin | MBBR 最低运行 DO | mg/L | 4 | 2–8 | v2.5 算出的 DO 低于此值只告警,不自动加风 | 告警给出「需把通量提到 X、届时功率 Y」,让用户做有标价的选择。有意不自动调整:自动加风会悄悄改掉用户设定的流化通量 |
| bfAlpha | BF 传氧修正 α | — | 0.85 | 0.5–1.0 | v2.5 实际 SOTE = 1.2%/m × 水深 × α × 驱动力 × θ^(T−20) | ⚠ 待标定项,无 RAS 直接出处。市政取 0.5–0.7,RAS 水质更洁净故取 0.85。与 co2StripApproach 同处境。驱动力项是 v2.5 新增——此前 SOTE 写死 8%,而 8% 的标准定义是清水 20°C DO=0,等价于按驱动力最大点选型 |
| bfCo2Approach | BF 吹脱逼近系数 | — | 0.23 | 0–1 | v2.5 MBBR 曝气对 CO₂ 的气液平衡逼近程度 | ⚠ 待标定项,有出处但样本单一。手册实测「粗孔盘仅达理论平衡约 23%、细孔盘 93%」,0.23 正是为粗孔盘记的。 ⚠ 与脱气塔的 co2StripApproach(0.5)有意分开:塔是填料逆流,MBBR 是池内粗孔鼓泡,共用一个数等于宣称两者传质逼近程度相同 |
| mbbrCovered | MBBR 加盖外排 | T/F | true | — | v2.5 曝气尾气去向;true=加盖接风管外排,false=敞口入室 | 与布置无关——同厅照样可加盖外排;敞口时 0.50 t/d 水汽进厅 ≈ 342 kWh/d 潜热(池面蒸发项的 1.35 倍),全库热泵电费最大变动 12.3% |
| co2StripperEnabled | CO₂ 脱气塔启用 | T/F | true | — | v1.1 独立设备;关闭时 CO₂ 仅靠换水稀释 | 高密度场必启用 |
| co2StripperEff | 脱气塔单次效率 | % | 65 | 50-85 | CO₂ 脱气塔单次脱气效率 | G:L=3 浅塔 60-70%; 填料≥3m + G:L≥5 可达 80% |
| co2StripperGtoL | 气液比 G:L | × | 5 | 1-20 | 脱气塔风量/水量比;越大效率越高但风机大 | Timmons Ch.10 p.244 CO₂ 汽提推荐 5:1-20:1(<3:1 是常规曝气口径,不是汽提);Karimi 2020 实测 G:L>5 无显著额外去除,Summerfelt 2003 最优 5.1。⚠ 热损与 G:L 成线性(Karimi 2020, R²=0.97),调高同时增大风机电耗与接触器热损。本行曾长期写"默认 3 / 范围 2-10",是 v2.0 对标教科书改默认值时文档没跟 |
| co2StripperLoadingRate | 水力负荷 | m³/(m²·h) | 80 | 20-250 | 脱气塔截面积水力负荷,决定塔截面积 → CAPEX | Timmons Ch.10 p.245: 17-24 L/(m²·s) = 61-86 m³/(m²·h);Summerfelt 2003 / Moran 2003 实测 87-187,默认取保守端 80。填料深度超 1 m 时建议取偏低端(降低风机背压)。本行曾长期写"默认 40 / 范围 30-50",与上一行同因 |
| co2BlowerPressure_kPa | 脱气塔风压 | kPa | 2.5 | 0.5-10 | CO₂ 风机出口压力 | 浅塔(<2m) 0.5-1.5, 中塔(2-4m) 1.5-3, 深塔(>4m) 3-5; Delta Cooling Towers 工业项目实测 0.87-1.12 kPa |
| co2BlowerEfficiency | 脱气塔风机效率 | % | 60 | 50-80 | CO₂ 风机机械效率 | 罗茨风机 50-70, 离心风机 65-80, 工业惯例 60-70 |
| co2FallbackEff | 关闭时附带解吸率 | % | 5 | 2-15 | 脱气塔关闭时增氧塔附带解吸的等效效率 | 高 G:L 锥可达 10-15;液氧锥仅 3-5 |
决定鱼池供氧方式和容量,是 RAS 设备投资中权重最大的部分之一。
| 字段 | 中文 | 单位 | 默认 | 范围 | 物理含义 | 调整建议 |
|---|---|---|---|---|---|---|
| aerationMode | 增氧方式 | o2/air | o2 | — | o2=纯氧锥/PPC 增氧塔, air=空气曝气 | 密度 ≥ 30 kg/m³ 建议纯氧(空气路线物理上限,SRAC-453);国内浅池实配多在 20–25 kg/m³,本阶段准确上限由池底布气强度反算(见增氧方式下拉框提示) |
| o2SatTarget | DO 目标饱和度 | % | 130 | 95-180 | 增氧后水的目标 DO 饱和度;纯氧模式有效,空气模式锁定 95% | 鲑科 165, 海水温水 140, 温水淡水 110-125, 罗非/对虾 100-115 |
| o2AbsorptionEff | 液氧吸收效率 | % | 85 | 70-95 | 锥形塔/PPC 对液氧的吸收效率;剩余排气 | 低压锥 80-88,高压 PPC 90-95,DAF 75-80 |
| o2FishFactor | 鱼生理耗氧系数 | kg O₂/kg 饲料 | 自动公式 | 0.18-0.45 | 物种特性 + 温度自动算(base × Q10^((T-20)/10)) | 鲑 0.20-0.23,鳗 0.20,罗非 0.27,石斑 0.30,对虾 0.40 |
| o2DOMfactor | 异养菌耗氧系数 | kg O₂/kg 饲料 | 0.10 | 0.05-0.20 | 残饵+粪便被异养菌分解的耗氧(由 BF 风机供) | ⚠ 出处 2026-08-29 订正:旧说法「Boyd 2018 实测 0.10–0.20」是假的——追溯 v1.1 原始记录,0.10 来自一条自推链(Boyd 理论上限 0.45 ×「RDF 移除 70% ⇒ 残留 30%」≈0.135 →「保守取」0.10),Boyd 报的是 0.45,那个「实测区间」不是他报的。 现出处(可复算):商业 RAS 满负荷实测系统总氧 ≈0.5 kg O₂/kg 饲料,扣除鱼生理(≈0.25)与硝化(≈0.14)后,异养余项 ≈0.11——与本默认值几乎重合。数值不变,换的是它凭什么是这个数。 ⚠ 该余项不区分固体相与溶解相,是「总氧减两项」剩下的全部异养耗氧。日后若再给溶解 bCOD 单加一项氧化耗氧,就是把同一份氧算两遍。 RAS 优化场 0.08-0.10;对虾/鳗鱼粉料场 0.15-0.20。⚠ 口径:本系数是异养分项,不是系统总耗氧。文献对标须找异养分项值——不可拿"总耗氧/饲料"的区间(商业 RAS 约 0.5、Boyd 理论 1.25、iRAS 实测 0.60-0.66)来校它,那是分项对标总量。 ⚠ 该系数还决定「系统总氧」外部锚点的动态区间上下限,改它会同时移动那条锚点。 |
| designDO_mgL | 池内设计 DO | mg/L | 留空 = DOmin | 4-9 | 空气曝气的 DO 设计工况点;驱动力 = (DO饱和 − 本值)/DO饱和,越高则风量越大。仅 air 模式参与选型,与循环流量无关 | 留空回落的 DOmin 是安全下限不是设计目标,等于零裕量;工程上建议填 5-7,并留出至少 1 mg/L 到饱和值的距离(逼近饱和时驱动力趋零、风量发散,由 5% 下钳兜住) |
| co2TargetMgL | 池内设计 CO₂ | mg/L | 留空 = 鱼种阈值 | 5-30 | 关塔时的 CO₂ 侧选型目标;风量 = CO₂日产×安全系数 /(亨利载量×本值×逼近系数)/24。仅 air + 脱气塔关闭时参与(开塔时 CO₂ 走塔) | 留空回落的阈值是安全上限,建议按其 60-80% 设计;调小到某点会把风量控制侧由 O₂ 翻到 CO₂(石斑成鱼期实算翻转点约 13 mg/L),此后电耗随之陡增 |
| sotePerMeter | 微孔盘清水 SOTE | %/m 水深 | 6.5 | 3-9 | 清水标准态氧转移效率,按水深归一;它不是实际效率,需再经 αβ / θ / 驱动力折算成 OTE | EPA/ASCE 典型 5-7;粗孔盘取低端。⚠ 旧版曾把 SOTE 硬编码 18% 直接当实际效率,会把风机选到实际需要的 1/3-1/2(手册 15.2)。v2.3.3 起有 UI 入口 |
| aerationAlphaBeta | α·β 综合折减 | — | 0.75 | 0.4-1 | α(工艺水污染对传质的折减)× β(盐度对饱和浓度的折减)的合并系数 | RAS 一般 0.7-0.85;高 DOM / 高投饵负荷取低端,淡水清洁系统取高端。v2.3.3 起有 UI 入口 |
| co2StripApproach | 池内曝气 CO₂ 亨利平衡逼近系数 ⚠ 脱气塔用的是 co2StripperEff,勿混 |
— | 0.5 | 0.2-0.9 | 气泡离开水面时对亨利平衡载量的逼近程度(停留时间有限,出水时并未达到平衡) | 工程 0.4-0.7。⚠ 无成文出处,属待校准项;本质由气泡尺寸与停留时间决定而非通用常数——实测粗孔盘仅达理论平衡约 23%、细孔盘可达 93%(非养殖场景,仅供判断调整方向)。⚠ 文献里的"CO₂ 吹脱效率"多为碳酸平衡重建后的表观值,与本系数不同口径,不可直接套用。敏感度:0.5→0.3 则 CO₂ 侧风量涨 1.67 倍。⚠ v2.3.3 起它同时决定 air+开塔 的入室 CO₂ 份额 ⇒ 车间新风与通风机选型,不再只影响关塔风量。已补 UI 入口 |
决定水质 pH/碱度调节和化学品消耗。
| 字段 | 中文 | 单位 | 默认 | 范围 | 物理含义 | 调整建议 |
|---|---|---|---|---|---|---|
| alkTarget | 鱼池目标碱度 | mg/L CaCO₃ | 150 | 100-200 | 维持 pH 稳定的目标碱度;硝化消耗后投 NaHCO₃ 维持 | 海水 ≥ 150,淡水 100-150 |
| alkSource | 源水碱度 | mg/L CaCO₃ | 100 | 50-200 | 源水/补水的碱度 | 海水多 150-200,软水 50-80,硬水 ≥ 150 |
| sourcePH | 源水 pH | — | 7.5 | 6.5-8.5 | 源水/补水 pH;鱼池目标 7.0-8.0 | 不调(按水质实测) |
决定 BF 在不同温度/盐度下的实际处理能力。不熟悉 Arrhenius 公式的用户保持默认即可。
| 字段 | 中文 | 单位 | 默认 | 范围 | 物理含义 | 调整建议 |
|---|---|---|---|---|---|---|
| VTR20 | 标准 VTR @ 20°C | g/m³·d | 500 | 300-800 | ⚠ BF-N 起已停用:硝化选型改用面速率 bfArealK,本值不再进入任何计算 |
保留仅为兼容历史方案 JSON。停用原因:体积速率口径没有浓度项——文献 VTR 是在投加 NH₄Cl 使 TAN≈2.9 mg/L 的零级饱和区测得,而真实 RAS 池内 TAN <1 mg/L 深在一级区,旧注释自记「VTR20=500 偏乐观、滤池可能选小」却没有任何机制修正它。旧参考值(已失效):MBBR 高比表面积填料 600-800;普通 K1 400-600;固定膜 300-500 |
| VDR20 | 标准 VDR @ 20°C | g/m³·d | 800 | 500-1200 | 反硝化反应器在 20°C 的基准 NO₃⁻ 去除速率 | 生物膜固定床 600-1000;流化床 1000-1200 |
| bfFillRatio | MBBR 填料填充率 | % | 50 | 30-70 | 填料净体积占 BF 池总容积比例,决定 BF 池总容积 V_BF = bioVolume / fillRatio | K1/K3 标准 50% (Rusten 2006);高密度装填 60-65%;低密度均匀曝气 35-40%;50% → V_BF/bio = 2.00, 60% → 1.67, 70% → 1.43 |
| bfArealK | 硝化面速率系数 k | g N/(m²·d) | 0.58 | 0.30-1.20 | r = k × Sn^0.7 × 1.09^(T−10) × (1−0.01S);A_硝化 = TAN日负荷 × safetyBio / r | 按上游处理程度分档 0.40/0.47/0.53/0.58 —— BOD 越高异养菌抢占越多生物膜,表观 k 越低。RAS 经转鼓+蛋分后 BOD 极低,取最高档。⚠ 0.58 的前提是两池串联分级;改单池混合须下调,否则与 BF-A 批的 COD 面积构成双重计算。形式 r=k·S^n 见 Ødegaard / Rusten et al. 2006。这是滤池尺寸最大的杠杆:k 减半,体积翻倍 |
| bfDesignTAN | 设计目标池内 TAN (Sn) | mg/L | 0.5(淡水)/海水 0.7 | 0.2-2.0 | 【v2.7】按阶段盐度自动取 (≥5‰ 取 0.7, 依据 Nofima NCRA 设计条件 / Rojas & Pedersen 2016); 用户改过则用用户值。「要把池内 TAN 控制在此值以下需要多大滤池」——设计输入,不是运行实测值 | ⚠ 不要填告警阈值(冷水 1.0 / 温水 3.0):那等于按「TAN 刚好顶到告警线」选池,冷水种体积掉到 0.70×,而旧模型注释自记 VTR20=500 已「偏乐观、池可能偏小」。【v2.7 订正】此处原写「本模型不迭代(Sn^0.7 无解析解)」——把两步连起来后 Sn 可以约掉:面积 A = 负荷·sBio·1000/(k·Sn^0.7·θ·f_sal),稳态要求 A·k·TAN^0.7·θ·f_sal/1000 = 负荷,两式相除得 TAN = Sn · sBio^(−1/0.7)(sBio=1.15 时为 0.82×),k/θ/盐度/负荷全部约掉,有闭式解,不需要迭代。另有一条独立的水力约束:单程去除率 ≤ 1 ⇒ TAN ≥ 负荷·1000/(Q·24),实际稳态 TAN 取两者较大值(详见 10.3.3);实际运行 TAN 更低时速率更慢,但负荷也更低 ⇒ 天然保守 |
| bfSALRDesign | COD 设计面负荷 | g COD/(m²·d) | 12 | 5-25 | A_COD = bCOD 日负荷 / SALR;A_总 = A_硝化 + A_COD | ⚠ 分配面积用的约定值,不是滤池实际见到的面负荷——实测各阶段仅 0.7–3.2,因为硝化面积占大头。量级旁证:MBBR-Pro 工程口径「有机物 SALR 典型 5–25」。⚠ 另加这块面积不算重复计算的前提是两池串联分级;改单池混合则 k 必须下调 |
| bfSALRTheta | COD 温度系数 θ_h | — | 1.06 | 1.00-1.10 | SALR_T = SALR × θ_h^(min(T, 温度上限) − T_ref) | 厂商设计手册 Ed.2 §5.1.2 有机物去除·温度原文:r_T = r_10·θ^(T−10),θ = 1.06(10–20 °C)、θ = 1.07(5–10 °C),并注明 "recommended not to temperature-correct the loading rate above 20-25 °C"。 ⚠ 这是好氧异养有机物去除的 θ 本身,不是从别处借来的。(前一版曾误判为"取自反硝化的代用值",已撤回——两处数值相同是巧合。) ⚠ 残留缺口:θ 只声明到 20 °C,而温度上限取 25,20→25 这一段是外推 |
| tssYield | TSS 产率 | % of 饲料 | 30 | 20-40 | 日产 TSS = 饲料 × 本值 | ⚠ 本值直接决定「TSS 强度」锥点:该锥点 ≡ 本值×1000 g/kg,区间 250–350 ⇒ 本值超出 25–35% 会被拦下。 开成输入之前它写死 0.30,那条锥点恒等于 300.0、永远绿、从未判定过任何东西(与 DOM 强度 同型,由锥点诊断探针查出) |
| codDissYield | 溶解 COD 总产率 | % of 饲料 | 10 | 5-20 | 日产溶解 COD = 饲料 × 本值;其中难降解那一份由 codDissRefracYield 给定 |
⚠ 与 o2DOMfactor 同为 0.10 是巧合,两者物理对象不同:本值是溶解态 COD(进水质稳态),o2DOMfactor 是残饼粪便分解耗氧(进氧平衡)。⚠ 曾拟换成废物矩阵口径,核完原文后发现那套矩阵不存在“每 kg 饲料一个常数”(净产生量随投喂率在 0.103–0.250 变),且需饲料与鱼体 COD 成分。故维持 10% 口径,只把它开成输入。 ⚠ 本值直接决定「DOM 强度」锥点:该锥点 ≡ 本值×1000 g/kg,区间 80–120 ⇒ 本值超出 8–12% 会被它拦下——这是该锥点第一次能拦住东西 |
| codDissRefracYield | 难降解溶解 COD 产率 | % of 饲料 | 0.18 | 0.05-1.0 | 溶解 COD 拆两层:可降解 codDiss_b(滤池+蛋分+AOP+换水都去除)/ 难降解 codDiss_r(滤池不去除)。难降解日产 = 饲料 × 本值 |
⚠⚠ 0.18% 是反推出来的,不是实测:由「关蛋分工况稳态要落在 30 mg/L」反解得到。⇒ 不得拿「关蛋分对上文献区间」当作模型验证通过——那是用被标定量去验证标定结果(循环验证)。 结构拆分批内本值只决定切分比例,由滤池效率反解抵消,基线逐位不变;它真正开始影响数值是在下一批(bCOD 产生量换成废物矩阵口径) |
| bfSALRRefTemp | COD 参考温度 | °C | 10 | 5-25 | θ_h 的参考温度 | 手册 §5.1.2 的 r_10 即以 10 °C 为参考。⚠ 它与 θ_h 是一对,必须同时改;单独改本值等于改了参考态而没改系数 |
| bfArealTempCap | 硝化温度修正上限 | °C | 25 | 20-30 | 超过此温度不再做 θ=1.09 外推,按本值取值 | MBBR 厂商设计手册 Ed.2 原文:recommended not to correct the loading rate above 20-25 °C。原文给的是区间不是单点,故开为输入、默认取上端。⚠ θ 是经验外推系数,超出标定域继续外推没有依据:不封顶时 30 °C 速率高估 1.54 倍、滤池相应算小。只影响温水种(shrimp 1.539× · tilapia/eel 1.295× · grouper 1.188× · mandarin 1.090×),冷水种 ≤25 °C 一点不动 |
| bfCarrierPSA | 载体比表面 PSA | m²/m³ | 500 | 200-1200 | 填料体积 = A_硝化 / PSA | K1 500 · K3 350 · K5 800。⚠ 本参数此前不在模型里——被吸收进 VTR20 的体积口径,所以换载体型号从来不影响体积;改面速率口径后它才成为一等输入。与 bfFillRatio 是两回事:PSA 决定多少填料,填充率决定多大池子装它们 |
| thetaNit | 硝化温度修正系数 | — | 1.10 | 1.06-1.12 | Arrhenius θ:温度每变 10°C,VTR 按 θ^(ΔT/10) 倍变化 | ⚠ BF-N 起已不参与硝化选型(改用 bfArealK 的 θ=1.09@10°C —— 与本行 1.10@20°C 不是同一个数,不得混用)。本值仅供旧导出面展示等效 VTR。不调(标准 1.10) |
| thetaDen | 反硝化温度修正系数 | — | 1.08 | 1.05-1.10 | 反硝化的温度修正 θ | 不调 |
决定升温/降温能耗。
| 字段 | 中文 | 单位 | 默认 | 范围 | 物理含义 | 调整建议 |
|---|---|---|---|---|---|---|
| sourceSS | 源水 TSS | mg/L | 10 | 0-50 | 源水悬浮物含量;影响微滤机/水质 | 清洁水源 5-10,地表水/海水 20-50 |
| 源水温度 | °C | 18 | 5-30 | 源水年均温度;与目标温度差决定能耗 | 北方井水 12-15,南方井水 22-25,海水按地区 | |
| hxEff | 板换回收率 | % | 75 | 60-90 | 板式换热器对补水热回收效率 | 常规 70-80,钛板换热器(海水)75-85,高效逆流式 ≥ 85 |
| heatPumpCOP_heat | 制热 COP | — | 4.0 | 3.0-5.5 | 热泵制热效率系数;现代工业级 4-5 | 空气源 3.5-4.0,水源 4.5-5.5 |
| heatPumpCOP_cool | 制冷 COP | — | 3.0 | 2.0-4.0 | 热泵制冷效率系数;热带降温场景大温差时降至 2.5-3.0 | 常规 3.0-3.5,大温差(28→12°C)2.5 |
| metabBasalRate | 鱼基础代谢热 | kWh/kg鱼/d | 0 | 0-0.035 | v1.1: 默认 0 表示用 Schrama 2012 严谨公式 (推荐); 设 >0 启用旧公式 basal+HIE 双项 (兼容) | 推荐保持 0; 用 Schrama: H = 106 × Q10^((T-T_ref)/10) × N × W^0.85 / 3600 |
| metabFeedFactor | 饲料代谢热 (兼容) | kWh/kg饲料 | 1.5 | 0.5-3.0 | 仅当 metabBasalRate>0 时生效 (老公式) | 推荐用 Schrama 公式 (basal=0), 此项不生效 |
| tankIndoor | 车间环境 | T/F | true | — | 室内 RAS (true) vs 室外 (false), 决定池散热系数 U | 国内 RAS 95% 室内, 设 true; 室外散热大, U 自动 18 |
| roomTemp | 车间室温 | °C | 20 | 5-35 | 车间空气温度, 影响池体散热 | 工业 RAS 通常 20°C 左右; 与水温差决定散热方向 |
| poolDepth | 池水深 | m | 1.5 | 0.3-3.0 | 用于估算池表面积 A = V_tank / depth | 鲆鲽底栖鱼浅池 0.5-1.0, 鲑鱼立体水柱 2-3 |
| poolUValue | 池散热系数 | W/m²·K | 5 | 3-25 | 池体传热系数, 室内 5, 室外 18 | 室内带顶 3-5, 室内开放 5-8, 室外有风 15-25 |
在小时峰值/日量基础上的设备运行裕度。v1.1 默认值已校准,避免与 peakFactor 双重叠加;保守用户可手动调高。
| 字段 | 中文 | 单位 | 默认 | 范围 | 物理含义 | 调整建议 |
|---|---|---|---|---|---|---|
| safetyBio | 生物滤池 | × | 1.15 | 1.10-1.30 | 滤料老化 + 投喂峰值缓冲裕度 | 高负荷场调 1.2,长期运行场 1.25 |
| safetyAerator | 鱼池增氧 | × | 1.10 | 1.05-1.20 | 液氧/纯氧设备老化裕度(peakFactor 已含峰值响应) | 关键设备调 1.15 |
| safetyBFblow | BF 风机 | × | 1.10 | 1.05-1.20 | BF 粗孔曝气风机裕度 | 同上 |
| safetyRDF | 微滤机 | × | 1.10 | 1.05-1.20 | RDF 流量裕度 | 保守可 1.15 |
| safetyDenitri | 反硝化 | × | 1.10 | 1.05-1.20 | 反硝化反应器裕度 | 一般 1.10 |
| safetySkimmer | 蛋白分离器 | × | 1.10 | 1.05-1.20 | 蛋分容积裕度 | 一般 1.10 |
| safetyCO2 | CO₂ 脱气 | × | 1.15 | 1.10-1.30 | 脱气塔截面积/风机裕度(G:L 不确定性较大) | G:L 取低值时调 1.20 |
| safetyUV | UV | × | 1.10 | 1.05-1.20 | UV 灯管老化裕度(不是剂量增加) | 灯管寿命短的项目调 1.15 |
5 路泵:主循环、反硝化、UV、AOP、蛋分;每路有扬程 + 效率。典型工程默认值都已合理,仅有特殊水力学需求时调整。(v1.6 起 RDF 反冲泵不再独立列项, 随 RDF 整机出厂)
| 字段 | 中文 | 单位 | 默认 | 范围 | 物理含义 | 调整建议 |
|---|---|---|---|---|---|---|
| mainPumpHead_m | 主泵扬程 | m | 7 | 5-20 | 主循环泵扬程;决定主泵功率 | 默认 7 = 重力回流布置 (静提升 2.5-4 + 沿程 1.5-3 + 设备 0.5-2 + 余量);地下池/多级跌落 12-20 |
| mainPumpEta | 主泵效率 | % | 75 | 60-85 | 主循环泵的水力效率 | 大流量低扬程轴流/混流泵 78-85,普通离心泵 65-72;不含电机效率(见全局热配置 motorEta) |
| denitriPumpHead_m | 反硝化泵扬程 | m | 7 | 4-15 | 反硝化支路泵扬程 | |
| denitriPumpEta | 反硝化泵效率 | % | 60 | 50-70 | 反硝化支路泵效率 | |
| uvPumpHead_m | UV 泵扬程 | m | 7 | 4-15 | UV 支路泵扬程 | |
| uvPumpEta | UV 泵效率 | % | 60 | 50-70 | UV 支路泵效率 | |
| aopPumpHead_m | AOP 泵扬程 | m | 7 | 4-15 | AOP 支路泵扬程 | |
| aopPumpEta | AOP 泵效率 | % | 60 | 50-70 | AOP 支路泵效率 | |
| skimmerPumpHead_m | 蛋分泵扬程 | m | 6 | 3-10 | 蛋分支路泵扬程;蛋分塔在主流池旁边,扬程相对较低 | |
| skimmerPumpEta | 蛋分泵效率 | % | 60 | 50-70 | 蛋分支路泵效率 | |
| miscElecKWhPerDay | 杂项电耗 | kWh/d 每套RAS | 50 | 20-200 | 照明/控制柜/备用/仪表等本套 RAS 杂项电耗 | 小规模 20-50, 中规模 50-100, 大规模 100-200 |
| freeCoolingEnabled | 自然冷却开关 | 开关 | true | true/false | 制冷工况下允许用干冷器/板换直接排热, 压缩机旁通。关闭则强制全部走机械压缩制冷 | 仅在冷源温度高于目标水温的暖区无实际影响 (界面会提示不可用原因) |
| fcDesignDT_K | 自然冷却设计温差 | K | 留空=自动 | 0-30 | 自然冷却单独扛满设计负荷所需的冷源-水温差。不是开关阈值 —— 温差不足时按比例做部分自然冷却 | 留空按热源自动取: 空气 11 / 水·海水 4 / 地源 6。填错几 K 只让曲线挪一小段 |
| fcAnnualK_air | 年化振幅折减 k | — | 0.65 | 0.2-1.5 | 年均工况把逐时温度近似为正弦 T = T̄ + A·cos θ, A = k·(夏−冬)/2。仅作用于空气源 | 设计冬/夏是百分位极值而非正弦峰值故需折减;水/海水/地源固定 k=1 |
| freeCoolingEER | 自然冷却能效比 | — | 20 | 2-50 | 设计点能效比, 仅含冷源侧风机与循环泵的增量功率 (不含工艺侧循环泵, 后者已在泵电耗内) | 干冷器方案 15-25;板换+冷源水方案可更高 |
部分参数有多级查找逻辑,UI 用户改的优先级最高,物种库 stage 显式值次之,公式自动算最后兜底。例如 o2FishFactor:
base × Q10^((T-20)/10)💡 工艺面板输入框中显示的斜体淡青色值表示"自动算";用户改写后变正常字体,下次切换鱼种/温度不会被覆盖。清空输入框即恢复"自动"。
本工具(iRAS)和本手册的计算结果仅供工程概算参考。
— 本手册全文完 —
© 2026 孙程
iras.cn · iras.dengdengtech.cn (国内) · github.com/chengsunmail/iras · 6881509@qq.com
本手册整合 iRAS v1.0 → v1.5 全部内容 · 完整版