iRAS 资料库
iRAS
循环水养殖系统 (RAS)
工程设计技术手册
完整版 · v2.5
版本: v2.5 · 2026 年 8 月
物理框架重构 · 文献校准 · 工业实测对齐
全局气候 + 围护 · 多模块并联 · P&ID 自动生成 · 投资财务评价
可研报告生成 · 站级设备 · UI 重构 · 工程逻辑精化
氧锥拓扑建模 · 系统排水重构 · 全面审计修复
碳酸盐平衡 · 液氧消耗口径 · 蒸发系数量纲 · 通风口径 · 机械除湿机
部分自然冷却 · 年均工况数值积分 · 比电耗与热泵电费出口 · 无头测试套件
热平衡架构重构 · 气液接触器 · 车间显热能量守恒 · 守恒类断言
工况覆盖补盲 · 登记表声明自校验 · UI 审计 · 字段范围单一事实源
字段流转工厂化 · 结构化配置告警 · 空气曝气设计工况点与脱气塔决策
v2.5 · 沿程碳酸盐逐节点重算 · CO₂ 按产生位置链式重导 · NH₃ 峰值判据 · MBBR 尾气去向可选 · 文案实算值锚定

版本演进说明 (v1.0 → v2.5)

iRAS 项目从 2026 年初首发以来, 经历了 16 次重大版本升级, 每次都基于公开文献或工业项目实测数据校准, 不是经验调整。 本手册整合 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 章追平代码) —— 的全部内容, 是 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 → v1.1: 物理框架重构 + 文献校准

A. 严格分离三个时间尺度

v1.0 在 calcStageLoad 中用 feedDesign = feedMax × peakFactor 算所有"日产污染物"。但 feedMax 已是日峰值, 再乘 1.2-1.5 在量纲上是"日总量再放大", 所有下游负荷被一刀切偏大约 17%。v1.1 严格分离三个时间尺度:

peakFactor 物理意义钉死: 代谢污染物 (TAN/O₂/CO₂) 小时峰值/全日均速率, 默认 1.5 (Timmons & Ebeling 2010 标准)。

B. 设备按动力学分类选型

类别设备选型基准物理理由
慢动力学BF 滤池、反硝化、CO₂ 脱气、微滤、蛋分、UV日量 × safety菌膜代谢有惯性, HRT 数小时缓冲峰值
快动力学鱼池增氧 (液氧)、BF 曝气风机小时峰值 × safety氧气即时消耗, 投喂 30min 内 DO 可见底

C. 鱼生理耗氧按物种 + 温度自动算

v1.0 用 0.25 一刀切违背物种特性差异。v1.1 改为按物种 + 温度自动算:

o2FishFactor = o2BaseFactor × Q10^((tempOpt − 20) / 10)
物种o2BaseFactoro2Q10典型值依据
鲑鱼0.322.00.20-0.23Atlantic Sapphire / Davidson 2014
大菱鲆0.282.00.21-0.22黄海所 / 莱州东方海洋实测
罗非鱼0.162.00.26-0.30Blue Ridge / FAO 实测
石斑鱼0.182.00.28-0.32南海所 实验数据
加州鲈0.192.00.26-0.28广东海大
鳗鲡0.132.00.20-0.22福建天马 (粉料代谢慢)
对虾0.311.30.40Boyd 2018 (Q10 偏低反映高温饱和)

D. CO₂ 脱气塔独立建模

v1.0 没有 CO₂ 脱气塔模型 (仅在增氧节点扣 70% 写死)。v1.1 作为独立设备建模, 默认参数与 Delta Cooling Towers 工业项目实测对齐: G:L=3, 风压 2.5 kPa, 风机效率 0.60, 单次脱气率 65%。

E. 大菱鲆密度修正

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%。

F. CAPEX 折旧 + 系统体积建模

v1.1 设备 8 年 + 土建 20 年分别折旧, 加到日运行成本。引入完整 V_total = V_tank + V_process 建模 (典型 V_process 占 V_tank 的 30-60%)。换水率口径改为 V_total (行业标准 Timmons 2010 / 国家海水鱼体系)。详见第 8 章。


v1.1 → v1.2: 全局气候 + 双节点稳态求解

G. 项目级常量管理

v1.1 把热平衡参数(气温/源水温/U 值/换气率) 放在每个阶段的 proc 字段里, 用户必须在每个阶段重复设置。 工程现实中这些是项目级常量。v1.2 把所有热平衡参数挪到顶部全局配置区 globalThermalConfig, 作为项目级常量影响所有阶段。新增地区预设(青岛/海南/挪威 Bergen/法罗群岛)、围护预设、4 工况对比(冬/夏/年均)。详见第 28 章。

H. 双节点稳态求解器

v1.1 用单点能量平衡, 忽略车间空气节点。v1.2 改为双节点 Picard 迭代同时求解空气热平衡 + 空气湿平衡, 输出 T_room、RH、蒸发率/凝结率、热泵装机。详见第 29 章。

📌 v1.2 物理一致性提升
v1.1 在挪威/北方冬季工况(气温 -10°C, 源水 5°C)热泵电费可能低估 30-50%, 因为没考虑车间空气节点和围护散热。 v1.2 双节点求解器修正后, 1000 t/yr 三文鱼项目挪威冬季工况综合成本从 v1.1 的 32.5 元/kg 修正到 36.30 元/kg。

I. 围护结构详细建模

v1.2 引入完整车间围护参数: U_wall / U_roof / U_floor / U_window / windowRatio / airChangeRate / ventHeatRecovery / poolCover。详见第 28 章。


v1.2 → v1.3: 多模块并联 + 工程化

J. 模块化与 N+1 备用

大型项目(>1000 t/yr)拆成多模块并联: 每模块独立循环, 模块间共用液氧站/应急电源/控制中心。每模块内部按容量上限自动配 N+1 备用 (主泵/风机/RDF/UV/热泵)。模块数完全由用户在阶段卡片"🔧 套数" subSystemCount 决定。详见第 26 章。

K. 鱼池配置反推

用户给"每套池数 + 池深", 工具按总水体反推单池直径 D = √(4V/πH)。自动检查工程合理性: D < 4m / D > 30m / D > 20m 配 H < 3m 给告警。SPECIES_DB 各鱼种各阶段加入推荐池深 recDepth_m。详见第 27 章。

L. P&ID 工艺图自动生成 (v1.3.x)

独立的 pid.html 查看器, 主页面"📐 输出 P&ID"一键打开, 自动渲染主流串联 + 3 条旁路 + 公用工程 + 仪表泡泡 + 联锁线 + 设备表。LOX 跟随阶段切换。详见第 30 章。

M. 设备清单导出 (v1.3.x)

独立的 equipment.html 页面, 一键导出当前方案完整设备规格表, 含 N+1 备用展开 + 单价 + 合计金额, 支持打印/导出 PDF。详见第 31 章。

N. 池深统一数据源 (v1.3.x)

v1.3 早期版本中池深有两个独立输入(阶段卡片头 + 热平衡区), 容易混淆。v1.3.x 统一为一个数据源: stage.poolDepth_m → recDepth_m → proc.poolDepth → 1.5。同时用于池径反推 + 热平衡。详见第 27.5 节。

O. 共用车间散热系数 (v1.3.x)

各阶段独立估算的散热相加 × thermalSharingFactor (默认 0.75) = 全场总散热, 反映多阶段共享车间的工程现实(共享外墙节省散热约 25%)。详见第 29.7 节。

P. 集水池建模 (v1.3.x)

V_process 加入集水池项 V_sump = clamp(Q/30, 20, 200) m³, P&ID 加入 S-101 标识。


v1.3 → v1.4: 投资财务评价

Q. 8 张标准财务表 + NPV/IRR + 敏感性分析

v1.3 输出停在工程概算 (CAPEX 万元 / OPEX 元/kg), 用户拿这个数据再去 Excel 手算财务评价 (NPV/IRR/回收期) 是当前主要的工作流痛点——一份可研报告里财务评价占 30% 篇幅, 设计院通常要花 1-2 周做完。 v1.4 加入独立的投资财务评价页面 (finance.html), 主页面"💰 投资财务评价"按钮一键打开, 按发改委可研编制规范输出 8 张标准财务表:

  1. 投资估算表 (设备 / 土建 / 流动资金)
  2. 资金来源运用 + 还款计划 (等额本息 / 等额本金)
  3. 总成本费用估算表 (满产年, 含折旧+利息)
  4. 销售收入和税金表 (按爬坡逐年)
  5. 损益表 (逐年净利润)
  6. 现金流量表 — 全投资 (项目本身 IRR)
  7. 现金流量表 — 自有资金 (股东 IRR, 含贷款杠杆)
  8. 敏感性分析 (5 因子 ±20% 对 IRR 影响)

用户在页面顶部填 17 个参数 (售价、项目年限、产能爬坡、自有资金比例、贷款利率、折现率、所得税等), 计算引擎用逐年现金流模型 + Newton-Raphson 求 IRR, 实时输出关键指标。 支持一键导出 Excel (用 SheetJS, 7 个工作表) 和打印为 PDF。详见第 33 章。

📌 v1.4 设计原则
财务评价模型是个独立外置层: 主页计算的 CAPEX/OPEX/折旧 → 通过 localStorage 共享给 finance.html → 用户在 finance.html 里独立调财务参数 → 不影响主页计算。这种解耦让设计院可以"工程评估和财务评价分人协作": 工程师管主页, 财务管 finance.html, 同一份方案两人各自迭代。

R. 关键指标定义对齐国内规范

v1.4 财务评价 6 个关键指标的定义全部按国内可研规范:

指标定义判断
全投资 IRR (税后)项目所有现金流(不含贷款本息)的内部收益率> 折现率 = 财务可行
自有资金 IRR股东视角现金流(项目 CF + 贷款流入 − 还本付息)的 IRR有杠杆放大效应
NPV (净现值)按折现率折算到 t=0 的累计现金流现值> 0 = 可行
静态投资回收期累计净现金流首次 ≥ 0 的年份(线性插值)RAS 项目典型 5-8 年
动态投资回收期累计折现现金流首次 ≥ 0 的年份静态 + 折现影响
盈亏平衡点 (BEP)满产年净利润 = 0 时的产量比例< 75% = 安全裕度大

S. iRAS 整体架构演进

从 v1.0 到 v1.5 共 1 年多时间, iRAS 完成了从"单页工程概算"到"完整可研工作流"的演进:

版本发布核心能力用户工作流
v1.02026-04 初稳态浓度计算 + 设备选型看几个数,自己再 Excel 加工
v1.12026-04 末+ 物理框架重构 + CAPEX/OPEX + V_total能给出综合成本元/kg
v1.22026-05 初+ 全局气候 + 双节点热平衡 + 4 工况对比挪威/海南都能算
v1.32026-05 中+ 多模块并联 + N+1 备用 + P&ID + 设备清单工程化的设计输出
v1.3.x2026-05UI 整理 + 池深统一 + 共用车间散热用户体验细节打磨
v1.42026-05 末+ 投资财务评价 (NPV/IRR + 8 张表 + Excel 导出)报告级输出
v1.52026-05 末+ 可研报告生成器 (16 章扩展版 + 模板 + docx 输出 + 图表嵌入)从工具到工作流

v1.4 → v1.5: 可研报告生成器

T. 16 章扩展版可研报告自动生成

v1.4 之前的输出层级停在工程数据 (P&ID / 设备清单 / 财务表 Excel), 用户需要把这些数据手动整合到一份 Word 可研报告里。 一份政府版可研通常 80-150 页, 设计院做一份要花 1-2 个月。v1.5 加入可研报告生成器 (report.html), 按发改委编制规范输出 16 章扩展版可研, .docx 格式, 大幅压缩可研撰写时间。

v1.5 严格遵循以下技术决策:

  1. 结构化内容输出, 不替设计院排版 — 生成的 docx 是"内容产品", 用户复制粘贴到自己院的 Word 模板即可
  2. 纯模板 + 条件分支, 不用 LLM — 可研是法律文件, 模板生成有可追溯性, 不能赌幻觉
  3. nunjucks 模板引擎 — Jinja2 JS 移植, 语法标准, 可后续移植到 Python 后端
  4. docx.js 文档生成 — 浏览器侧生成, 无后端依赖, 单文件部署
  5. 模板内嵌 script 标签 — 保持 iRAS"双击 HTML 即用"的传统

U. 16 章覆盖范围与自动化率

名称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 字段)、场址自然条件、土建详细设计、消防/环评/安评等专项内容(这些必须由有资质机构出具)。

V. 工艺流程图 + 财务图嵌入

v1.5 在 docx 中嵌入 3 张自动生成的图:

  1. 图 5-1 工艺流程示意图 — 6 个主流程方框 + 主循环回流 + 旁路单元(蛋分/反硝化/AOP, 按是否启用动态显示)+ 关键工艺参数表
  2. 图 13-1 累计现金流曲线 — 实线全投资 + 虚线自有资金, 含 0 轴线、网格、图例、节点标记
  3. 图 13-2 敏感性 Tornado 图 — 5 个因子按 IRR 摆动从大到小排序的横向条形图

图表生成路径: 浏览器侧 SVG → Canvas → PNG → docx ImageRun。中文字体使用系统 SimHei/Microsoft YaHei, 高清 2× DPR 渲染。

📌 v1.5 设计原则
"不替设计院排版" 是 v1.5 最重要的产品决策。商业级可研生成器(如某些 SaaS)倾向于做"成品 Word", 但实际上每个设计院都有自己的模板(红头、字体、目录格式各不相同), iRAS 替他们决定版式反而帮倒忙。 v1.5 输出"结构化内容", 用户拿到后复制到自己院的模板里, 是更尊重设计院工作习惯的做法。

v1.5 → v1.6: 站级设备 + UI 重构 + 工程逻辑精化

W. 液氧储罐站级化(核心改动)

v1.5 之前, 液氧储罐 (V-901) 作为阶段级设备计入 calcCapex, 每个阶段独立挂一笔储罐 CAPEX。 但 RAS 工程实际是全场单点供应: 多个阶段共用同一座液氧站, 计 4 次显然错误。 4 阶段千吨级项目可虚报约 30 万元 CAPEX。

v1.6 把液氧储罐从阶段 CAPEX 剔除, 挪到全场"③ 站级设备"区域, 增加 calcSiteCapex(stages, eqPrices, allResults) 函数计算站级 CAPEX 并加入工程总投资。用户可在 ③ 区调整规格 / 数量 / 单价, iRAS 按全场日耗自动推荐:

推荐算法: 日耗 < 3,000 kg/d (小/中项目) → 1 主 + 1 备 = 2 罐 日耗 3,000-15,000 kg/d (大项目) → 2 主 + 1 备 = 3 罐 日耗 > 15,000 kg/d (超大项目) → 3 主 + 1 备 = 4 罐 单罐容量 = 总日耗 × 7 天储备 / 主罐数 → 凑到标准档 (1/3/5/10/20/30/50 t)

单价按规模指数公式 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) / 设备清单 / 可研报告 全部同步显示规格 + "全场共用"标注。

X. UI 整体重构

v1.6 把 iRAS 主页面从"一长条信息流"重构为可扫描的工程师视角:

Y. 工程逻辑精化

项目v1.5 旧v1.6 新
MBBR 单价标签"生物滤池单价 (元/m³)""MBBR 池系统 (填料+曝气配件, 不含池体/风机) — 元/m³ 填料净体积"
设备规格清单 MBBR仅显示净填料体积净填料 + 池总容积 (按 fillRatio 反推)
投资概算单价"500 /h"(单位 bug)"500 元/(m³/h)"(正确显示)
设备选型上限硬编码 (8 RDF / 60 m³ MBBR ...)按 modFlow 自适应(支持千吨级单模块)
液氧需求量显示仅在站级备注阶段成本明细 / 设备清单 / 站级备注 共 3 处
B45 边界钳制百分比字段可超 10019 个百分比字段强制 [0, 100] 钳制
报告 FCR 显示没有每阶段表加 FCR 列
打印优化简单 hide buttonA4 + 1.5cm 边距 + 阶段独立分页 + 灰阶图表

Z. v1.5 → v1.6 公式订正表

v1.5 代码已经修复但本手册之前未同步的几处公式:

章节项目v1.5 旧手册v1.6 正确
4.2NO₃ 产生率NO₃ = TAN × η_bioNO₃ = TAN × 1.0 (稳态质量守恒)
8.2V_RDFV = Q × 2/60 (HRT 2 min)V = Q × rdfHRT_min/60 (默认 0.5 min v1.6, 可调 0.1-5)
8.2V_BF (池总)V = bioVolume × 1.3 (经验)V = bioVolume / fillRatio (默认 50% → 2× bio)
15.4CO₂ 单位换算未明确显式 × 10⁶ (kg/m³ → mg/L)
29双节点稳态蒸发显热 Q_evap×λ 写在空气节点移到水节点 (与代码一致)
33.4残值× 5% 笼统设备 5% + 土建 20% (分别折旧)
📌 v1.6 工程哲学
v1.6 的主题是 "把对的事情做对": 液氧站级化解决长期的重复计算 bug, UI 重构让多阶段切换效率提升 ~40%, 工程逻辑精化把"工程师早就发现但容忍的小问题"逐个修掉。 没有添加新功能, 但千吨级项目 CAPEX 概算精度提升约 3% (剔除重复+单位修正), 输出可靠性提升。

v1.6 → v1.7: 氧锥拓扑 + K-101 + 系统排水重构 + 全面审计修复

A. 氧锥工艺拓扑 mainline / bypass 真实区别对待

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 输入框 + 工程范围钳制):

字段默认钳制范围工程对照
o2ConeTopologymainlinemainline / bypass
o2ConeHeadLoss_m3 m[0, 15]LHO 2-3 / Speece 5-10 / SOLVOX 110 至 15
o2BypassRatio (%)10[5, 30]国际主流 8-15%
o2BypassPumpHead_m20 m[5, 40]玻璃钢 20 / SOLVOX 25-30
o2BypassPumpEta (%)60[30, 85]高压泵典型

物理改动:

1000 t 大西洋三文鱼实测对比 (Q = 10,155 m³/h, V_total = 5,183 m³, jsdom 跑测 v1.7): 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 设备 CAPEX 4,454 万元 3,842 万元 节省 612 万 工程总投资 9,800 万元 8,454 万元 节省 1,346 万 综合成本 (元/kg) 36.70 元/kg 35.41 元/kg 省 1.29 元/kg 全投资 IRR 14.90% 17.31% +2.41%

B. K-101 鱼池增氧鼓风机 (air 模式专属)

v1.7 之前, air 模式 (空气曝气) 只有 K-302 (BF 曝气风机), 缺鱼池主增氧风机。 这意味着温水鱼种 (罗非鱼 / 鳗鱼 / 对虾) 的大规模 RAS 设计无法用工具自动生成 — 而这是 80%+ 中国 RAS 项目的实际场景。

v1.7 加入 K-101 鱼池增氧鼓风机: 罗茨风机 + 微孔盘管曝气, 与 K-302 同口径 1+1 备 (鱼池主增氧故障即鱼窒息, 必须双机轮换)。P&ID / 设备清单 / 报告章节 / 财务测算 全链路同步, modulePerSpec 含完整规格 (风量 Nm³/min / 功率 kW / 风压 kPa / 效率 %)。

C. 系统排水重构 (RDF 反冲废水 → 系统排水)

旧版工艺面板"RDF 反冲(%) 2%"是反冲管瞬时分流比, 但 4870 m³/d ÷ V_total = 101%/d 物理荒谬 (远超合理换水率 1-5%/d)。真相: RDF 反冲水绝大部分经污泥沉淀池回循环 (Sharrer 2010 实测 95-98% 清液回流), 真实穿越系统边界的废液由换水率决定

v1.7 全面清理:

D. 全面审计修复 (27 项 bug)

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
⚠️ #25 灾难性 bug
问题: report.html 的 buildContext() 函数 return 时漏写 workflow 字段。
影响: 可研报告里 55 处 workflow.* 引用全部失效。但因为 nunjucks 模板引擎"字段缺失即跳过"的优雅降级机制, 报告渲染不报错 — 模板里所有条件分支都默默走 fallback, 用户拿到的报告看起来正常但实际上增氧章节不区分液氧 / 空气曝气, 主泵参数走默认值不显示真实数值, DO 控制策略描述固定不变。
修复: 一行修复, 但触发 23 处下游 *100 单位错误 (#25b) 的连锁修复。
意义: 这是长期潜伏的关键 bug。报告生成器对用户来说之前实际不能放心用, 但用户和作者从未察觉 — 因为报告"看起来正常"。教训: 优雅降级机制让 bug 隐藏起来, 生产级工具应该有"严格模式", 缺字段就报错而不是静默跳过。

E. v1.7 验证状态

验证维度结果
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 工程哲学
v1.7 主要意义不在于"加了多少功能", 而在于把工具从"演示原型"推进到"可工程使用的设计平台": (1) 氧锥拓扑与国际主流接轨, 让国内设计院的项目能直接对标挪威/加拿大大型三文鱼 RAS 工程; (2) K-101 补齐让 air 模式从"半残"变为"可用", 覆盖了中国 RAS 实际项目 80%+ 的鱼种; (3) 系统排水重构把陈旧的"RDF 反冲废水"语义清理为质量守恒口径的"沉淀池入口废液"; (4) 报告生成器修复 (#25) 让 16 章可研报告真正可用

v1.7 工况成本基线 (1000 t 大西洋三文鱼)

📌 历史数据:本章记录的是 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_total5,183 m³5,183 m³
循环流量 Q10,155 m³/h10,155 m³/h
主泵 P-101 功率610.4 kW488.3 kW-122.1 kW
旁路泵 P-602 功率0 (无)92.2 kW+92.2 kW
综合泵功率610.4 kW580.5 kW-29.8 kW (节能)
o2DailyTotal (全场日峰值)1,113 kg/d1,112 kg/d~0
A-601 峰值供氧41.20 kg/h41.20 kg/h
CAPEX
设备 CAPEX4,454 万元3,842 万元-612 万元
工程总投资 CAPEX (× Lang 2.2)9,800 万元8,454 万元-1,346 万元
运营成本 (元/kg)
年总成本 (含折旧)3,670 万元/年3,540 万元/年-129 万元/年
OPEX (不含折旧)28.46 元/kg28.30 元/kg-0.16
综合成本 (含折旧)36.70 元/kg35.41 元/kg-1.29
财务指标 (售价 60 元/kg, 30/70 融资 @ 5%/8y, 折现 8%, 15 年)
全投资 IRR14.90%17.31%+2.41%
自有资金 IRR~22%25.23%+3%
全投资 NPV (万元)5,7797,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)。

历史 4 工况成本基线 (v1.3 数据, 沿用)

工况气温源水v1.3 综合成本对照
青岛冬季-7°C4°C35.96 元/kg国内沿海三文鱼试点
海南冬季17°C22°C37.70 元/kg
海南夏季32°C27°C40.47 元/kg制冷成本上升
挪威 Bergen 冬0°C4°C36.30 元/kgAtlantic Sapphire 60-70 (含人工/苗)
📝 注 上述 4 工况基线是 v1.3 数据 (2026 年 4 月, mainline 拓扑)。 v1.3 挪威 Bergen 36.30 元/kg vs v1.7 jsdom 实测 36.70 元/kg 完美吻合 (偏差 +1%), 说明 v1.7 物理修复 (氧锥拓扑 / K-101 / 系统排水) 未改变综合成本量级, 仅在 bypass 拓扑下能省 1.29 元/kg。 SUMMARY 路线图已规划 v1.8 用 bypass + v1.7 字段重新生成 4 工况基线 JSON。

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.7 → v1.9: 碳酸盐平衡求解 + o2 物理校准 + finance 零利率修复

v1.8 由英文版团队主导, 引入碳酸盐平衡求解和 o2 物理校准。v1.9 是 NTNU validation memo 全面验证后的稳定版。中文版直接从 v1.7 跳到 v1.9, 与英文版同步。

A. 碳酸盐平衡求解 (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 碳酸盐平衡章节。

B. 两种 pH 控制策略

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。

C. o2 物理校准 (validation memo F1)

v1.9 修正了一个潜伏的物理建模不一致:

8 鱼种 o2BaseFactor 校准对照:

鱼种tempOptv1.7 (Q10@20°C)v1.9 (Q10@metabRefTemp)数值变化
salmon (三文鱼)15°C0.320.2263等价 (0.32 × 2^-0.5 = 0.2263)
turbot (大菱鲆)16°C0.280.1980等价
tilapia (罗非鱼)28°C0.160.2786等价 (0.16 × 2^0.8 = 0.2786)
grouper (石斑鱼)27°C0.180.2924等价
bass (加州鲈)25°C0.190.2687等价
eel (鳗鲡)26°C0.130.1970等价
mandarin (鳜鱼)25°C0.180.2546等价
shrimp (对虾)28°C0.310.30-3% (轻微下调)
📝 重要 这是数学等价重写, 不是数值校准。新 o2BaseFactor 现在直接是 "tempOpt = metabRefTemp 时的 O₂:feed 比", 语义更清晰, 与 Timmons (2010) 文献口径一致。 1000 t 三文鱼成鱼期 o2DailyTotal 仍是 1113 kg/d, 综合成本仍是 36.70 元/kg (与 v1.7 完全相同)。

D. CO₂ 公式修正 — 加入硝化产 CO₂ (validation memo F2)

v1.7 之前 co2Daily 公式只算呼吸 CO₂:

co2Daily_v1.7 = o2FishDaily × 1.375 (RQ ≈ 1, 仅生理呼吸)

但实际硝化反应也产 CO₂:

NH₄⁺ + 2HCO₃⁻ + 2O₂ → NO₃⁻ + 2CO₂ + 3H₂O
∴ 2 mol CO₂ / mol TAN-N × 44.01/14.01 = 6.286 g CO₂ / g TAN-N

v1.9 修正:

co2Daily_v1.9 = o2FishDaily × 1.375 + tanDaily × 6.286

1000 t 三文鱼成鱼期实测:

v1.7v1.9变化
o2FishDaily × 1.375 (呼吸)700 kg/d700 kg/d
tanDaily × 6.286 (硝化)0 (漏算)521 kg/d+521
co2Daily 总700 kg/d1221 kg/d+74%

影响: CO₂ 脱气塔规格按循环流量 × G:L 选型 (Summerfelt 2003 / 工程惯例), 不直接随负荷上升, 故 CAPEX 不变。但稳态鱼池 CO₂ 浓度会上升, 是 v1.9 引入碳酸模型后能从物理层面捕捉到的关键工况指标。

E. finance-core.js 零利率 bug 修复

v1.7 之前 buildLoanSchedule 函数在等额本息分支:

a = r × (1+r)^n / ((1+r)^n − 1)

当 r = 0 (零利率贷款 / 政策性贴息项目) 时分母为 0, 产生 NaN, IRR 算不出。v1.9 修复: r = 0 时自动降级到等额本金分支 (此时两者数学等价)。这是个边界 case, 多数项目利率 > 0 不受影响。

F. v1.9 验证状态

验证项状态
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 工程意义
v1.9 让 iRAS 从"工程算成本工具"升级为"工程算成本 + 水化学合规工具": (1) pH 不再是输入 — 工具按碳酸盐平衡求出来, 业主可信度大幅提升; (2) NH₃ 物种识别 — 高密度温水工况 (罗非 70+ kg/m³, 鳗鱼) 的剧毒 NH₃ 风险首次被工具捕捉, 是国内 RAS 项目"莫名死鱼"问题的解答; (3) 对接国际学术规范 — 碳酸模块 vs PyCO2SYS 实验室级精度 (max|ΔpH| = 1e-5), 工具输出可直接用于 NTNU / 中国海洋大学等学术研究; (4) 商业海水 RAS 设计能力 — Atlantic Sapphire / Nordic Aqua / Salmon Evolution 等国际旗舰项目的高碱度 (237 mg/L) + 控 pH 实践, iRAS 工具可对标。

v1.9 → v1.9.2: 液氧消耗口径 + 蒸发系数量纲 + 通风口径 + 机械除湿机

v1.9.1 与 v1.9.2 不是新增功能, 而是四处物理口径修正。它们在与英文版 v2.0 对表 (PORTING_NOTES) 和用户实测中暴露, 共同特征是: 影响运行成本、消耗品采购量与制冷装机, 但不改变任何设备选型结果。 所有修正都做了回归验证 — 设备容量计算式逐字未变。

A. 液氧消耗口径修正 (v1.9.1)

v1.9 之前, 液氧采购量沿用 o2Demand 计算, 而该字段是设备选型口径, 含两个容量系数:

o2Demand = o2FishPeakHourly × sAerator / 吸收效率 × 24
    其中 o2FishPeakHourly = o2FishDaily / 24 × peakFactor

peakFactor (日→小时峰值, 默认 1.5) 与 sAerator (设备老化余量, 默认 1.10) 都是容量系数: 它们回答"设备要多大", 不回答"一年买多少氧"。液氧是按量计费的消耗品, 采购量只应被吸收效率放大。 两者混用导致液氧成本系统性高估 1.5 × 1.10 = 1.65 倍 (65%)

指标v1.9 (错误口径)v1.9.1 (修正后)文献 / 对照
液氧强度 (kg O₂/kg 饲料)0.440.2660.25–0.30
年液氧消耗 (1000 t 三文鱼)527 t319 t
储罐规格 (按 7 日储备)10.1 t6.1 t
基准值验收区间0.25–0.950.20–0.45收窄至文献带宽
回归保证: o2PeakSupplyKgHo2Demand 的计算式逐字未变。 氧锥流量、储罐峰值供氧能力、K-101 风量等一切设备选型结果与 v1.9 完全一致。 改的是"买多少氧", 不是"配多大设备"。详见 15.7。

B. 蒸发系数 β 量纲修正 (v1.9.1)

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 起给出的就是这个公式, 是代码实现偏离了手册):

β = h_c / (ρair × cp,air × Le2/3)  [m/s]
h_c = 4.0 + 6.0 × v_air  [W/(m²·K)], v_air 为室内空气流速 (默认 0.15 m/s)
→ β ≈ 0.0035 – 0.010 m/s (原实现约 0.06)
实测量变化说明
β 取值降 12.4–14.9 倍回到物理合理区间
蒸发率降 2–2.4 倍非 13 倍 — 因 W_room 自洽求解存在自补偿
RH = 99% 饱和告警消失原告警是虚警, 由虚高蒸发率造成

C. 通风量口径修正 (v1.9.2)

用户报告了一个反直觉现象: 养殖密度降低, 制冷装机容量反而暴增。根因是一条纯几何的放大链:

密度↓ → 水体↑ → poolArea = V_tank / 池深 ↑
  → A_building = 1.6 × poolArea ↑ (自动估算)
  → V_room ↑ → 通风量 = ACH × V_room ↑
  → 湿热气候下带入更多湿空气 → 冷水面凝结↑ → 制冷↑

鱼的数量没变, 新风需求本不该变。实测: 密度从 80 降到 15 kg/m³, 通风量被放大 5.33 倍。 v1.9.2 把新风量改为按需求确定, 不再单纯跟随房间体积:

新风量 = max( ACH × V_room , 鱼载荷 CO₂ 稀释需求 )

详细推导、CO₂ 系数取值与"为什么除湿不计入新风"见 28.6。

D. 机械除湿机 (v1.9.2 新增)

v1.9 之前遇到高湿工况只能建议"加大 ACH", 但湿热气候下通风不能除湿 (室外比室内还湿), 这条建议是无效的。 v1.9.2 引入机械除湿机模型 (开关 / 目标 RH / SMER / 冷凝水回收 / 冷凝热去向), 与双节点求解器耦合求解。 海南夏季实测: RH 从 92% 降到 70%, 除湿机耗电 1365 kWh/d, 但凝结放热从 2152 降到 1222 kWh/d, 总电耗基本持平

E. 池内耗氧的 TSS 依赖、代谢产热重构与气泡病约束

E.1 池内耗氧 = 鱼生理 + TSS 依赖的池内异养

物种 o2BaseFactor(鲑鱼 0.2263 @15°C,依据 Atlantic Sapphire / Davidson 2014) 是清水条件下鱼本身的生理耗氧。但商业鲑鱼 smolt RAS 养殖池实测显示, 池内氧呼吸速率随池内 TSS 上升而显著增加——增量来自悬浮固体表面附着的异养菌在池内直接耗氧, 这部分同样必须由氧锥/液氧供给,不是生物滤池 o2DOMfactor 涵盖的范围。

池内耗氧系数 = o2BaseFactor + 0.074 + 0.05 × (TSS_tank − 3.0)   [kg O₂/kg 饲料]
            = 鱼生理 + 基础异养(截距)+ TSS 增量异养(斜率)
  斜率由实测两点定: TSS 3.0 → 0.30;TSS 10–12 → 0.70,k = 0.40/8 = 0.05
  TSS 钳制在 [3.0, 15],超出实测区间后 held flat

实现上 calcStageLoad 增加可选第 4 参 tssTank;TSS 不依赖 O₂, 故管线在 pass 1 解出鱼池 TSS 后一次回代即收敛,无需迭代。不传该参数时附加为 0,行为与旧版一致。

微滤机去除率成鱼池 TSS池内耗氧系数液氧年耗
90%3.00.358441 t
默认 75%3.40.382471 t
55%4.10.428527 t
40%5.00.477589 t
📌 工程意义
固体管理直接决定液氧账单。 微滤机从 90% 掉到 40%,液氧年耗上升 34%(441 → 589 t)。 这个耦合在 v1.9.2 之前完全不可见——固体管理只影响水质指标,不影响供氧成本。

E.2 代谢产热改由耗氧导出

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 倍。

Q_metab = 池内耗氧 (kg O₂/d) × 1000 × 13.6 / 3600  [kWh/d]
  13.6 kJ/g O₂ = 氧热当量 (Brett & Groves 1979)
指标旧 (Schrama 106)新 (氧当量)对照基准
Q_metab (1000 t 鲑鱼)11030 kWh/d4053 kWh/d
单位体重1.11 W/kg0.32 W/kg维持代谢 0.11 (van Dam),摄食鱼为其 2–4 倍

为什么必须绑定:同一个代谢过程同时决定耗氧与产热,两者由氧热当量刚性联系, 不能各取各的文献值。v1.9 曾把两处的参考温度对齐(validation memo F1),但未对齐量级, 留下 3.85 倍的内部矛盾直到 v1.9.2。

命名提示Q_metab 现在实际是池内生物总产热 = 鱼呼吸 + 池内悬浮固体异养菌呼吸(因 o2FishDaily 含 TSS 附加项)。 两者的热都进水,计入正确;但引用该字段时不要再当作纯鱼类生理值去对文献。

回归验证:把 Q_metab 打到 0 做对照,7 项设备选型 × 4 阶段 (主泵 / 峰值供氧 / 氧锥流量 / BF 风机 / RDF / UV / CO₂ 风机)逐位一致—— 代谢产热只影响热泵负荷,不影响任何工艺设备选型。

E.3 纯氧进池饱和度统一 165% 与气泡病约束

v1.9.2 的 DO 包线体检(8 鱼种 23 阶段)暴露出旧的差异化饱和度设定撑不住自身工况:

可用降幅包线 = 进池 DO − 允许最低出池 DO
  进池 DO = DO_饱和 × o2SatTarget;最低出池 = max(DO_饱和 × DOmin_satRatio, DOmin_abs)

旧设定下罗非(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/LTGP
旧(各鱼种不同)54−2.11各异
130%43−1.33106.3%
140%22−0.54108.4%
150%02+0.21110.5%
165%(采用)00+1.22113.6%

本表只在纯氧模式(aerationMode = 'o2')下生效;空气曝气模式走另一套逻辑, 不受影响——低密度养殖仍应优先选空气曝气。

E.4 总溶解气压 TGP 与苗种期反向修正

TGP (%) ≈ 100 + (o2SatTarget − 1) × 20.95
  纯氧增氧只抬 O₂ 分压,N₂ 不变;空气中 O₂ 体积分数 20.95%
  阈值: 一般鱼 < 115%;鱼苗 / 敏感期 < 110%(Colt 1986;USEPA 水质基准)
⚠ 阶段微调方向曾与风险相反
旧的阶段微调是苗种期 +5 / 成鱼期 −5,使苗种期成为全场最高过饱和度。 而鱼苗对总溶解气压最敏感(要求 TGP < 110%,对应 DO 上限约 148%),成鱼反而可到 < 115%。 统一到 165% 后该问题凸显(苗种期将达 170%,TGP 114.7%)。
v1.9.2 改为苗种/白仔期 −20(→145%,TGP 109.4%)、成鱼期 −5(→160%)、其余 165%

E.5 DO 击穿告警改为按约束诊断

旧告警文案为「建议: 提高循环倍数或 DO 目标饱和度」。统一到 165% 后, 「提高饱和度」已成为危险建议——会把用户导向刚刚规避的气泡病风险。 v1.9.2 改为逐条计算四条出路的当前值、所需值与卡点:

实例(罗非鱼苗种期,28°C、密度 50 kg/m³、turnover 6.0):出池 DO 4.54 < 阈值 4.70,缺口 0.15 mg/L。 四条出路中改善固体管理可减少降幅 1.34 mg/L,是缺口的九倍—— 最省力的解不是降密度也不是提流量,而是把微滤机管好。这个结论在 TSS 与耗氧解耦时无法得出。

F. v1.9.2 成本基线 (1000 t/yr 大西洋鲑, mainline)

工况气温 / 源水OPEX折旧综合成本比电耗
青岛冬-7°C / 4°C28.269.2737.539.5
海南冬17°C / 22°C29.579.3738.9411.9
海南夏32°C / 27°C29.959.4339.3912.6
挪威 Bergen 冬0°C / 4°C28.279.2837.559.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。

方法学说明
每行按独立稳态点评估:设计冬与设计夏两个热工况均取该行的气温与源水温, 目的是隔离气候这一单一变量,使各行可直接横向比较。
实际项目中热泵装机应按当地全年包线(冬夏两端取大)定容,折旧会略高于本表—— 实测差异约 +0.3%(青岛全年包线口径下工艺运行成本 36.17 vs 本表 36.06 元/kg)。 做具体项目投资测算时应以工具的实际输出为准,本表仅用于版本间与气候间的对比。
与 v1.3 老基线的差异
老表(青岛冬 35.96 / 海南冬 37.70 / 海南夏 40.47 / Bergen 36.30)跨气候跨度 4.51 元/kg, 新基线为 2.31 元/kg。压缩来自蒸发系数量纲修正(凝结放热降 2–2.4 倍)、通风口径改动, 以及代谢产热改由氧当量导出。气候差异现在几乎全部体现在热泵费上(0.29 → 2.53 元/kg), 而饲料费 14.80 与泵电费 5.30 跨工况完全不变。

四工况全部为制冷工况——气候无关的基础热负荷(池内生物产热 5271 + 设备产热 20677 = 25948 kWh/d) 远超水侧散热能力,青岛 −7°C 也不例外。水只通过池面耦合到车间空气,而车间被设备产热烘着, 与室外的冷是隔绝的。这是 RAS 常年需要制冷的结构性原因,不是模型异常。

第 21.4、23.3、23.4、32.2 各节保留 v1.3 / v1.7 当时版本的实测数据作为历史记录, 数值与本表不同属正常 —— 请以本表为当前基线

G. mainline vs bypass 拓扑对比(青岛冬)

对比项mainlinebypass
主泵 P-101369.0 kW258.3 kW-110.7 kW
旁路泵 P-602092.2 kW+92.2 kW
综合泵功率369.0 kW350.5 kW-18.4 kW
氧锥规格流量10155 m³/h1015 m³/h缩 10×
工程总投资11026 万元9771 万元-1255 万元
综合成本(工艺)37.53 元/kg35.94 元/kg-1.59 元/kg

bypass 节能幅度从 v1.7 的 29.8 kW 降到 18.4 kW —— 主泵扬程从 12 m 降到 7 m 后, "旁路让主泵不过锥"这个优势的绝对值随之变小(省下的是 3 m 氧锥压损,占比从 20% 升到 30%, 但基数变小)。CAPEX 节省基本不变(氧锥按小流量定价,与扬程无关), 仍是 bypass 的主要收益来源。

📌 v1.9.2 工程意义
配除湿机不是为了省电, 而是为了避免霉菌、结构件腐蚀与电气故障。 这是 RAS 车间与泳池馆共通的工程现实: 湿度是可靠性问题, 不是能耗问题。 模型的价值在于把这笔账算清楚 — 让设计者看到"多花 1365 kWh/d 换 22 个百分点湿度"这个交换是否值得, 而不是被一个虚高的 RH 告警吓住。详见 29.7。

v1.9.2 → v1.9.3: 基线对齐与验证自动化

本版不改动任何计算模型?selftest=1 的 14 项基线逐位不变, 设备选型亦逐位不变 (mainline/bypass 对照的主泵 369.0 / 258.3 kW、旁路泵 92.2 kW 与旧表一致)。 改动集中在两件事: 把对外发布的数字与真实产品路径对齐, 以及把验证过程固化成可自动运行的测试。

A. 四工况基线为何要改

v1.9.2 发布的四工况表无法用产品路径复现。尝试过三种气候口径:

口径青岛冬海南冬海南夏Bergen
① 冬夏都取该行温度 (自检所用)35.5936.9537.3735.61
② 只覆盖冬、夏留 UI 默认35.7437.0037.3735.75
③ 只覆盖冬、不动 RH35.7436.9937.3335.75
v1.9.2 已发布35.6337.3937.9435.65

三种口径全部对不上, 判定为成本模型两层化之前的旧脚本残留。 现按口径 ① 重测并替换。这与 v1.9.2 审计发现的 32.65 元/kg 问题同源 —— 根因都是「验证路径与产品路径不是同一条」, 只是这次残留在文档侧而非代码侧。

B. 自检基线本身混了两种气候口径

SELFTEST_BASELINE 的 11 个数值工况里, 4 个大西洋鲑工况带 climate 覆盖 (冬夏同温的隔离口径, 用于隔离气候单一变量), 其余 7 个鱼种不带覆盖 (走 UI 默认气候: 设计冬 −7/4、设计夏 32/24)。两种口径对同一鱼种相差 0.1–0.5 元/kg。 数值本身没错, 但引用时必须注明是哪一种

C. 无头测试套件

新增 tests/ 目录,npm test(等价于 node tests/run_all.js)一条命令跑十三项,任一失败则非零退出,可直接挂 CI:

脚本覆盖判定
t1_selftest.js内置 ?selftest=114 工况全 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 由产品路径生成文档表格 —— 基线表今后应粘贴它的输出, 手抄正是本轮全部旧数的唯一来源。

D. 部分自然冷却与年化年平均(P1 + P2)

主要矛盾不是「逼近温差取几 K」, 而是判据「非 0 即 1」。 旧判据 冷源温度 + 逼近温差 < 目标水温 一旦跨过, EER 从 3.45 跳到 20、Q 从 0 跳到全量, 两个量同时跳变 —— 阈值附近出现 5.8 倍的成本悬崖, 几 K 的假设差就能翻出 1 元/kg 级的差异。

P1 容量判据

Δ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 K8–13 K
水 / 开式海水工艺水 → 钛板换 2–3 K → 冷源水(双屏障再 +2–3)3–6 K
地源板换 2 K + 埋管对土壤 3–5 K5–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)。

P2 年平均: 24 点数值积分

自然冷却本质是「全年有多少小时可用」, 而阈值函数在均值处取值 ≠ 函数的均值(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, 可忽略。

三工况对照(1000 t 大西洋鲑, 工艺运行成本 元/kg)

地区热源设计冬年均设计夏年化贡献率年化 COP
挪威 Tromsø开式海水37.6237.6437.6798%18.14
挪威 Bergen开式海水37.6637.9539.0773%7.82
智利 Puerto Montt开式海水37.6738.1339.0759%5.95
加拿大 Halifax开式海水37.6938.2039.4265%5.85
青岛空气源37.7538.5439.3535%4.64
上海空气源37.8038.8139.5419%3.93
三亚开式海水39.6239.9840.420%2.30
Doha水源39.2439.6840.260%2.68
一个反直觉的反转:直觉上青岛 −7°C 的冬天该是自然冷却之王, 但年度账上稳定的 9°C 海水赢两倍以上(Bergen 73% vs 青岛 35%)—— 因为海水全年都冷,而青岛的空气只冷一段时间。
旧模型给不出这个结论,它只会说两地设计冬都是 COP 20.00。 年化改变的是选址与冷源方案的排序,不只是把数字调准。
另一条结构性观察:二值化恰好在最稳定的冷源上误差最小(海水、地源), 在摆动最大的空气上误差最大——而空气源正是国内项目的主流选择。

已知缺口(刻意标注, 未修)

  1. 振幅折减 k 待标定已核验, 无需改动。 敏感性实测表明, ḡ 的主导不确定性只有季节振幅 A 一个量; 而 A 已对多个独立气候常值来源核验: 青岛空气 模型 12.7 vs 实测 12.1–13.1(ERA5 长期月均 1月约1.4°C / 8月约25.6°C); Bergen 海水 4.5 vs 4.0–5.25(海温 3月5.5 / 8月15°C); Halifax 海水 8.5 vs 8.2–8.9(海温 2月0.8 / 8月17.1°C, 年均8.1–9.0)。 三处全部落在实测区间内。 其余 5 个区域仅作合理性判断, 尚未独立核验。 校准已由 t7_amplitude_calibration.js 锁死 —— 日后改动 k 或区域温度预设会在该测试响亮失败。
  2. 昼夜与天气过程未计降级为二阶。 实测: A 由实测月均钉死后, ḡ 对短期噪声 σ(1→6 K)的剩余敏感性仅 0.1–2.2 pp (A 未钉死时为 8.4–17.7 pp)。忽略昼夜变化是有依据的, 不是将就。
    附一条否定结果: 曾尝试改用「季节正弦 ⊗ 短期噪声, 振幅由设计冬=1% 分位反解」的两尺度参数化, 以消掉 k。结果 ḡ 对 σ 的敏感性达 8.4–17.7 pp、对百分位定义 p 达 6.2–13.6 pp —— 新参数化自身的不确定度比它要修的偏差还大, 且把一个参数变成两个。故不采用。
  3. RH 按年均值恒定实测为三阶, 不予实现。 RH 的季节数据本已在各区域预设里(振幅 −2.5~+9.0 pp,且两种相位都有: 青岛/上海/三亚 夏湿同相,Bergen/Tromsø/智利 夏干反相),24 点积分只是没用它。 按预设振幅摆动 RH 后,年化热泵电耗变化仅 −0.07%~+0.30%; 即使振幅翻倍也只有 −0.15%~+0.60%。 原因:RH 只作用于蒸发/潜热通路,而净排热由恒定内热主导(泵 + 代谢约 25948 kWh/d)。 0.3% 远低于本模型自身的精度等级,实现它属过度工程。
  4. P1 核心主张已验证 —— 参数杠杆确实被压平。
    ΔT_design 全合理区间扫描:Bergen 海水 2→6 K 成本极差仅 0.35 元/kg (P1 之前 6→10 K 就 +1.20),青岛空气 6→16 K 极差 0.20; 单位 K 杠杆由 0.30 元/kg 降至 0.087(Bergen)/ 0.02(青岛),约降一个数量级。 EER_design 12→30(2.5 倍)极差 0.11–0.22。 设计冬工况极差为 0.0000——ΔT_avail 全区间远超 ΔT_design、贡献率恒为 1, 这正是 14 项基线中性的根据。
    反悬崖指标:扫描中最大单步跳变仅占总极差 30–31%(阈值判据会接近 100%)。 已由 t8_leverage_bounds.js 锁死——谁把阈值判据改回去,它会立刻失败。
  5. 自然冷却冷源与热泵冷源仍绑死(_fcSink = T_hp_source)。 实际常见「海水源热泵 + 干冷器自然冷却」或反之, 应为两个独立选项 —— 属 P3。
  6. 蒸发冷的冷源应为湿球而非干球(干热气候是量级差别)—— 属 P3。
  7. 热侧温度用目标水温: 实测回水温升 ΔT_loop = Q/(ṁ·cp) 仅约 0.09 K, 可忽略, 故此项无需再改
✅ 自检 14 项基线逐位不变:四工况全是空气源, 且 ΔT_avail 远超设计温差, 落在饱和区。
最紧的是 Bergen 设计冬苗种期(目标 12°C、气温 0°C, x = 12/11 = 1.09), 余量仅 9%。将来上调空气源设计温差会让 salmon_bergen_w FAIL —— 那是预期行为, 说明该基线确实压在全量自然冷却的边界上, 应同步复核而非直接改基线。

E. 比电耗与热泵电费:补出口,纳入自检

比电耗(kWh/kg·yr)与热泵电费(元/kg)是对外发布的核心指标,但 summary此前没有对应字段——页面上的 kwhPerKgYr 只是热泵单项且分阶段。 因此这两个数进不了 SELFTEST_BASELINE无法自检,至今只是「碰巧还对着」。 这是当时唯一一处对外数字完全没有护栏的地方。

本版补上五个出口:kwhPerKg(全场综合比电耗)、elecCostPerKghpCostPerKg(热泵+除湿电费)、pumpShareOfElecloxTonsPerYear, 并把前两者写入全部 11 条数值基线。

纳入后立刻发现旧发布值偏高

指标旧发布值产品出口实测
比电耗(青岛冬)9.79.51−2%
热泵电费(青岛冬)0.290.21−28%
液氧年耗473 t471 t核对无误

根因:旧手推口径对臭氧与 BF 风机取了峰值,而年成本按 totalAvg × 365 计算。 产品路径的均值口径才与成本模型自洽。四工况表的比电耗列已按产品出口更新 (9.5 / 11.9 / 12.6 / 9.5),泵占电 57–75%

为什么不在汇总层手列 kWh 清单

  1. 增氧可能是电。 aerationMode === 'air' 时增氧费用是主风机电费, 纯氧时才是液氧。旧手推完全漏了这一项——只因大西洋鲑走纯氧才碰巧对上 9.7, 换成空气曝气的鱼种就是错的。
  2. 臭氧、BF 风机、增氧都有峰/均之分ozoneCostAvgDaily = ozoneCostDaily × feedRatio)。

故电量在成本函数内部、紧挨 totalAvg 那一行计算, 复用它已经用的成本项再除以电价:口径天然一致,且可与 totalAvg 逐项肉眼对照—— 将来新增用电项若在这里漏加,对照即可发现。tests/gen_baseline.js 里那份 重复手推实现也已删除,统一到产品出口。

⚠ v1.9.2 变更日志里「热泵费 1.68 → 0.29 元/kg」的叙述保留原样: 那是历史记述,而 1.68 那一侧对应的旧代码已不存在、无法测量, 改成 0.21 会让该叙述一半真一半编。当前值以本节与基线为准。

F. 备用设备计入设备投资

模型一直按 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 万)。

臭氧发生器改 2×50% 并联

原为 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 / 2RDF 已可拆 2 台 → ×1.50
中鱼期182.5 万2 / 3 / 2 / 2
成鱼期288.8 万2 / 4 / 3 / 2RDF ×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 供追溯。
已知未含备用:机械除湿机属全场设备、不在模块环路内, 本版仅确认其不配模块内备机,未移入站级——实测其分区选型不构成重复计算 (各阶段 qty 各不相同且已乘共用车间系数 0.75),且因除湿需求只在夏季出现, Σmax(冬,夏) 恒等于 max(Σ冬,Σ夏),移动不改变任何数字。

G. 第三轮外部审计修复(P0 / P1 / P2)

P0 · 渲染层口径分歧

工况对比表用 heatPumpKWh / 16(电耗÷16h),而正上方热平衡卡片用 热功率 ÷ 22h——同屏两个数差 14 倍(38 vs 548 kW)。 数据层的不变量断言抓不到sCap 是渲染层局部变量,不落任何数据结构。 这条通用教训催生了 I 节的单一出口改造。

P0 · 防除零 clamp 推翻经济截止判据

Math.min(0.999, COP_cool/EER) 在 EER < COP_cool 时,把「自然冷却永不经济」 硬拉成「几乎总经济」。实测:

freeCoolingEER修前电耗 kWh/d修后关闭自然冷却
16277(多耗 3.45×18191819
23138(多耗 1.72×)18191819
32092(多耗 1.15×)18191819
3.45恰好等于机械制冷 COP,两侧相等

改为 x ≥ 1 直接置 g = 0freeCoolingEER 钳到 [1, 60] (此前无上界,填 1e6 得电耗 0 且不告警)。界面新增一档提示 「自然冷却不经济(EER ≤ 机械制冷 COP,已自动改走机械制冷)」——开关不该静默失效

P1 · 热泵漏出 SPARE_MAP

modulePerSpec.heatPumpsparesCount=1,设备清单与 P&ID 都按 N+1 展开, 唯独 CAPEX 按 N 计价——是备用政策下唯一不一致的转动设备。备用增量 626 → 725 万

P1 · 年均工况基线缺失

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% 权重就会套上错误系数。已补。


H. 数值钳制(clamp)普查

本项目两次栽在 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! 极小常数(典型防除零写法)200
C 待判定602
B 物理边界382
A 数值保护(常数 0/1)65未测

4 处生效项逐条判定后全部为有意设计:集水池容积区间 20/200 m³(两端都生效, 苗种期走下限、成鱼期走上限)、BF 风机日均负荷比下限 0.5(硝化菌群基础曝气)、 自然冷却贡献率封顶 1。没有发现第三个 0.001 那类错误。 最令人担心的 COP 下限 1.5/1.8/2.0、蒸发系数 β 区间、RH 域,在正常工况下全部不触发—— 它们是留给极端工况的余量。

覆盖边界:指纹只覆盖三文鱼 + 罗非鱼、设计冬 + 年均, 只在极端参数下才越界的 clamp 会漏(极低换水率、极高盐度、空气曝气模式); A 类 65 项未测。全表与判定依据见 CLAMP_INVENTORY.md; 哨兵 t11_clamp_census.js 秒级检出「悄悄多了一个没人测过的 clamp」, 完整扰动测试 clamp_probe.js 约 4 分钟、手动跑。

I. 热泵装机:收敛到单一出口

审计的通用建议是「让装机 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[].qtymodulePerSpec)。

另发现热泵利用小时的解析逻辑(Math.max(8, Math.min(24, …))被复制了 4 份——复制即分叉隐患:任何一份改了钳制区间,其余三份不会跟。 已抽出 hpUtilHoursOf() 作为唯一出口。

新增 t12 三层断言:① 数据层 summary == Σ hpInstalledKwOf; ② 源码层无重复实现;③ 直接读渲染出的 DOM 文本抓「装机 kW」与数据层比对—— 这一层正是原断言的盲区。突变验证:把工况对比表改回 /16, 会复现出审计原文里的 38 / 308 / 174 kW 并被立即捕获。


J. 水质告警:NH₃ 按鱼种 + Ω 方解石饱和度

NH₃ 着色阈值按鱼种

鱼种限值表 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 时水对碳酸钙不饱和, 持续溶蚀混凝土池体与水泥基砂浆(长期导致池壁起砂、露筋), 对贝类/甲壳类还影响钙化。对策:提高碱度 / 强化脱气 / 投加碳酸盐。

蒸发计入补水(审计 P3 第三项)经实测后决定不做: 蒸发仅占补水 0.06%–0.32%(青岛 1.48、Doha 0.92、三亚 0.29 m³·d⁻¹, 对比补水 461 m³·d⁻¹),折算成本 < 0.001 元/kg; 而改动会使 12 条基线与三份文档的成本数字再重算一遍,换来小数点后第四位。
⚠ 该结论依赖默认 poolCover = partial 且换水率 5%/d。 敞开池面 + 干热气候 + 低换水率时占比会显著上升,届时需重新评估。 排水面板 tooltip 已注明「含蒸发以外的全部出水」。

K. 已修: 上述盲区

比电耗与热泵电费没有产品出口。summary 里没有对应字段 (页面上的 kwhPerKgYr 只是热泵单项、且是分阶段的), 因此这两个对外发布的核心指标 进不了 SELFTEST_BASELINE、无法自检, 现在只是碰巧还对着。 建议下一版补 kwhPerKg / hpCostPerKg 并纳入基线。

年化基准的坑:全场年耗电与年液氧应按 日值 × 365 累加,因为各生活阶段在场内全年并行运行。 若按 stageDays 串行累加,比电耗会被低估 2.3 倍(4.2 vs 9.7 kWh/kg·yr)。 本次以已发布的年液氧 471 t 作独立锚点反查确认。

v1.9.3 → v2.0.0: 热平衡架构重构 · 气液接触器 · 规范对标

本版是自 v1.2 引入双节点热平衡以来最大的一次模型改动。热平衡代码 净减少 65 行;全部 13 条数值基线重算;自检 14 → 16 项, 新增 t15–t17 三类断言。

A. 车间温度:从因变量改为输入

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(温差为零)。

由此消失的长期争议:水面传热系数取 5 还是 15 W/(m²·K)、太阳辐射要不要建模、 钳位缺口去哪 —— 温差为零后全部无关

B. 气液接触器 —— 本版核心新增

v1.x 中 CO₂ 脱气塔与 MBBR 曝气的气水直接接触量完全不在水侧热平衡账内: 三文鱼 1000 t 全场达 96,287 m³/h,是机械新风的 4.2 倍

出口空气按水温下饱和计算,无需任何标定系数, 有两个独立领域的实测支撑:

热量用 Mollier 焓差 Δh = h(T_水, 饱和) − h(T_进气, RH_进气)

Δh 可为负 —— 湿热空气遇冷水在填料上结露,把潜热交给水。 脱气塔在热带是凝结加热器而非冷却塔:三亚年均每天向水中倒灌约 18,470 kWh,设计夏达 53,482 kWh。这是 Atlantic Sapphire(佛州 Homestead)、 宁波象山 Nordic Aqua 一类项目的核心成本,行业内普遍未量化。

C0. 自然冷却与接触器:抢同一个资源,不叠加

v2.0 接入气液接触器后,自然冷却在冷天基本失效 —— 而那正是它原本最有价值的场景。

原因:两者用的是同一个物理资源 —— 室外冷空气

自然冷却:室外冷空气 → 干冷器/板换 → 排走水的热
接触器:  室外冷空气 → 填料塔     → 排走水的热(顺带脱 CO₂)

接触器是必开的(脱 CO₂ 是刚需),自然冷却是可选的。青岛设计冬接触器 排走 21,266 kWh/d,已达内部产热的 82%,水侧净转为需制热 —— 此时自然冷却无负荷可排

工况(三文鱼 1000 t 青岛)水侧方向FC 贡献 gFC 开→关 比电耗
设计冬heat0.0012.57 → 12.57,Δ 0
年均cool0.1311.54 → 11.59,Δ 0.049
设计夏cool0.00(室外 32 °C 过热)Δ 0
⚠ v1.9.2 的自然冷却效益结论已订正。 该版发布的「寒冷气候热泵费 1.68 → 0.29 元/kg、 比电耗 12.2 → 10.2」是在接触器缺失时算出的 —— 那部分「省下的电」 其实早已被脱气塔省掉,两者不叠加

UI 保留自然冷却开关,理由有三:① 年均工况仍有 13% 贡献,而年均才是能耗口径; ② 作为可关的对照基准;③ 真实工程可冬季降 G:L 减少接触器排热、把负荷让给自然冷却 —— 这是优化空间,模型暂未建。

新增诊断字段 fcUnavailReason 区分四种「不可用」: off(用户关闭)/ not_cool水侧需制热,v2.0 新增的主因)/ uneconomic(经济截止)/ no_dt(温差不足或冷源过热)。 此前 UI 只显示 freeCoolingAvailable = false,用户会误以为都是温差不够。

C. 暖通能耗计入

车间温度受控后,三部分负荷现已全部计入电耗:

分项字段状态
水侧热泵thermalCostDailyv1.x 即有
除湿机(潜热)dehumCostDailyv1.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。

D. 脱气塔默认值对标教科书

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)。该注释已修正。

E. 脱气效率与 G:L 耦合(新能力,默认关闭)

v1.x 中 co2StripperEffco2StripperGtoL两个互相独立的 参数,调高 G:L 只增加风量与电耗、去除率不变,与物理相悖。

新增 co2StripperEffModemanual(默认,与 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% —— 这是「尾气必须排室外、不得回车间」的量化依据。

F. 水质限值按温水/冷水鱼种分档

依据 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/L302020 / 海水 15
TAN mg/L3.01.01.0
TSS mg/L201015

温水/冷水按养殖水温 ≥ 20 °C 判定(教科书两类为 24–30 与 10–18 °C)。 ⚠ 水质限值在本工具中是告警层,不参与选型与流量计算 —— 与教科书 Ch.3 的 「约束驱动流量」方法论不同,本项修的是告警正确性。

G. 鱼种参数库水质自洽性修正

新增的 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 过,因为基线记录的 正是错误状态本身。这类缺陷需要面向工程约束的断言才能捕捉。

H. 基线工况按【鱼种 × 地区】实际配对重设

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 —— 冷水鱼种 × 热带气候。 这是当前行业热点,也是接触器项最关键的场景,此前无任何基线覆盖

I. 新增三项断言(自检 14 → 16 项,测试 t15–t17)

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% 告警)+ 负荷指标(饲料/流量比)。

J. 新增参数

参数默认说明
roomRH_set65 % 车间设定相对湿度。T_room = T_w 后,池面蒸发只依赖本参数
contactorRecovery0接触器排气热回收率 0–0.95
hvacEnabledtrue车间显热是否计入能耗
co2StripperEffModemanual脱气效率取值方式
co2PackingHeight_m1.5 m填料层高度
co2MaxAttainableEff80 %G:L=20 时最大可达去除率
co2IntakeCO2_ppm350脱气塔进风 CO₂ 本底
气路拓扑对象 airPath / airFlowM3h / collectAirStreams()

K. 经核实【无需修改】的七项

本轮调查中曾判定有问题、经查规范与实测后确认模型正确

曾判定核实依据
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 档保温预设 + 热回收 + 窗墙比
教训:先查规范与实测,再判断模型。 本轮多次因先用论文反推、或跨温度跨鱼种 直接比较而误判 —— 「turnover 偏高」绕了七八轮,而辽宁省标准一条「溶氧 8–12 mg/L」即可定案。

L. 已知限制与后续

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²,本工具每阶段建模为一个池,池数由用户设置。


v2.0.0 → v2.0.1: 缺陷修复 · 版本号自检 v2.0.1

补丁版, 不改动任何计算模型 —— 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 流化下限、蛋分供气动力等) —— 那些都要动模型, 不属补丁版范围。

v2.0.1 → v2.1: 能量守恒修复 · 守恒断言落地 v2.1

源于第三方第四轮审计。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. 口径与参数。 totalMaxhvacCostDaily; 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_dehumdehumKWhPerDay 计费, 海南夏实测 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 免责声明
第 一 部 分
RAS 基础

v2.1 → v2.2: 工况覆盖补盲 · 登记表声明自校验 v2.2

源于第三方第六轮审计。审计核心判断:「断言的质量已超过工况的覆盖面 —— 下一步的收益在加工况, 不在加断言」。本版照单全收: 自检 17 → 20 项, 13 条数值基线重算 (|Δ| ≤ 0.02 元/kg, 符号随工况方向翻转)。

A. 三条配置边界工况

此前 13 条数值工况全部「mainline 拓扑 + 脱气塔开启 + 纯氧增氧」。新增 edge_no_degasser / edge_bypass / edge_air_aeration 三条配置边界工况, 只跑不变量断言、不比数值。落地顺序刻意为先加工况 (转红) 再修缺陷 (转绿) —— 红→绿转换即工况有效性的负对照。

B. 蛋分风机 CAPEX 解嵌套 + ΔT/mdot 不动点迭代

CAPEX 嵌套: 蛋分风机条目原嵌在脱气塔 if 条件分支两层内, 脱气关闭时蛋分照常运行照常计费、投资却消失 —— F4 目标模式第四次出现, 且在修复它的同一次提交里。现与各独立设备并列。

ΔT/mdot 不自洽: 风机温升按冷密度算、焓流按热密度算, 丢失 (1−mdot/mdot₀) 份轴功 —— 默认工况 1.2%, 脱气关闭时 ΔT≈30 K、丢 10.1%。现做不动点迭代解联立至 mdot·cp·ΔT ≡ Pshaft, 附录 B 的 dT_blower / mdot 自此严格同一状态点 (即「mdot 自洽」)。

C. 轴功 η 逐台加权

旧口径 ΣkW × 0.57 与各风机效率参数脱节 (用户调高效率, 模型反而认为进气流的热更少)。物理上 kWi×ηi = Q·Δp 与 η 无关, η 只影响电机损失分成 —— η 逐台加权自动恢复该性质, η 与各功率公式严格同源 (co2 读 co2BlowerEfficiency, bf 取公式内常数 0.60, skimmer 读 skimmerBlowerEta, 鱼池增氧读 tankAirBlowerEfficiency)。

D. 第四台风机接入 + 断言 E2b

空气曝气模式的鱼池增氧鼓风机 K-101 此前登记表与气路都看不见 (计费有、CAPEX 有、热去向无、气路无) —— 与 Q_air_gain (v2.0)、蛋分气流 (v2.1)、风机轴功 (第五轮) 同族的第四次逃逸, 机制是关键功率藏在混合数值与格式化字符串的展示对象里。现全量接入 (airFlowM3h + airPath + 登记表 + 轴功加权)。新增断言 E2b 递归扫 *Spec 子对象封住该逃逸类; 治本方案 registerDevice 工厂化已立项 v2.3。

E. capexVia 精确名称数组 + capexMinKw

capexVia正则改精确名称数组: 旧正则假阴性 (删掉真目标仍绿) 与假阳性 (bypass 下 F4 四阶段误报) 双向皆错。五台支路泵显式声明共享「支路泵合计」聚合条目。精确化随即曝光被掩盖四版的存量不一致 —— BF/脱气塔风机 CAPEX 选型门槛 0.5 kW vs F4 的 0.05 kW, 现以 capexMinKw 显式声明进登记表, 与 CAPEX 侧选型门槛同源。

F. 断言 G: 登记表声明自校验

堵 v2.1 明示的最后盲区 (「billedVia 可以指向不存在的成本字段而断言不会发现」)。断言 G1 落地当天抓到 5 条活体: 声明写的是内部变量名 *CostDaily, cost 导出面是 *CostMax/*CostAvg —— 与第六轮审计连错两轮的 dehumCostDaily 同一个坑 (billedVia 声明必须真实存在于导出面, 设备活跃时非零)。G2 防同一 CAPEX 条目被重复认领。

G. 其他

skipClimate 删除: 全库零调用点的死参数 (restoreState 不经 loadStagesFromDB), 为不存在的调用方准备的开关只会在被忘传时静默伤人。渲染与计算解耦: 渲染抛错此前被计算 catch 吞掉伪装成「计算异常」并销毁结果, 现独立捕获、标注「渲染异常, 计算结果有效」—— 负对照双向实测 (修复前渲染故障使 13 条数值全灭为 0, 修复后零影响)。审计误报驳回: NH₃ 阈值与 Ω 告警两条「六轮未动」为第四轮已驳回误报的复发 (v1.9.3 起在位); 接触器进气节点不可选为记录在案的设计决策。

v2.2 第二批: UI 审计 · 字段范围单一事实源 v2.2

源于本版的首次 UI 专项审计。与第一批的登记表工作是同一个模式在 UI 侧的实例。自检 20 → 21 项, 13 条数值基线逐位不变 (纯重构)。

A. 填 0 → 界面回显默认值 → 输入被静默丢弃

用户填 0 → 模型收 0 → 重渲染后输入框显示默认值 (模板把 0 当 falsy) → 再改任何别的字段, 全量读回时假显示值覆盖 proc, 用户设置无声消失。陷阱在三层 (渲染 / 读取 / 消费), 只修一层反而更糟: 实测只修渲染侧会造成「界面诚实显示 0、模型仍用默认值」, 而原状态至少界面与模型口径一致。三层必须同批落地。

B. FIELD_SPEC —— 范围的单一事实源

取值约定此前散布四处 (默认值表 / 渲染模板 / 读取侧钳制 / 消费侧兜底), 实测已漂移四条: 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 处)。

C2. 覆盖扩展与 clamp 规则修正

第一版 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 同一原则。

C3. 物质平衡实测 (本版仅验证, 未建断言)

发布前对四条基本物质平衡做了产品路径实测 (三文鱼 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 与主模型的交叉一致性) 三项连"今天是否闭合"都未测过。已列为下一版首要工作。

C. 断言 H 与判据盲区

新增自检项 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 第二批」两章。

v2.2 第三方独立复核处置 2026-08-08

一份独立复核报告 (jsdom 走真实产品路径 + PyCO2SYS 1.8.3.4 / USGS·APHA 溶解氧表 / ASHRAE·IAPWS 湿空气数据 / 第一性原理手算) 提出三条模型误差, 全部落在本版自述的断言盲区 (氧侧 / 碳侧 / 水汽侧)。逐条实测核实: 一条采纳、一条部分采纳、一条驳回。

✅ 采纳: co2DailyAvg 漏硝化产 CO₂ (已删除)

co2DailyAvg = o2FishDailyAvg × 1.375 只算呼吸, 缺硝化项 tanDailyAvg × 6.286 × (1 − BF_CO2_STRIP), 实测少算 34.5%–43.4%。设计口径 co2Daily 是对的 —— v1.9 memo F2 修过同一个 bug, 设计口径已修而日均口径未跟上。全库 0 消费点, 属死字段, 故删除而非修正 (与删 sourceTemp 同一原则)。带错误公式的死字段比空字段危险: 谁把它接进年度碳核算会静默低估三四成且不触发任何断言。

◐ 部分采纳: 0°C 以下饱和水蒸气压 (只订正注释)

复核指出应使用冰面式, 数值属实 (−20°C 时水面式高 21.97%), 原注释的适用下界 −20°C 不成立。但本项目继续用水面式且自洽: RH 数据源为「WMO/Climate.gov 30 年均值」, 而 WMO 对 0°C 以下的 RH 以水面 (过冷水) 饱和压定义; humidityRatio 用同一相态还原分压, 前后一致。改冰面式而 RH 仍是水面口径, 反会使含湿量系统性偏低。相态必须与数据定义口径一致 —— 这是选水面式的理由, 不是疏忽。已订正注释区间为 [0, 60]°C 并写明依据。

✗ 驳回: 海水 DO 饱和度「单向偏高 3.3%」

复核建议「改用 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%。这些正是本版断言已覆盖的区域 —— 与「三条缺陷全在盲区」互为印证。

物质平衡断言 M v2.2 后续

此前断言覆盖能量 (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 内脱气)。

负对照复现了历史上真实发生过的 bug

把过去修过的缺陷形态注回代码: 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。同族「猜口径」已达十次。这正是要把核算放进产品路径的理由 —— 断言从真实导出面取值, 不会像外部工具那样猜错口径。

碳酸盐接口一致性 · a11y · CDN 加固 v2.2 后续

A. 碳酸盐模块的【接口】验证

第三方复核验证的是 carbonate.js 模块本身。但主模型与它之间隔着一层单位换算 (TA = 碱度/50043/ρCO₂ = 浓度/44010/ρ), 那一层从未验证 —— 三个因子任一错, pH 与 Ω 都会偏而无人察觉。

I1 往返自洽: solveAlk(pH*) → solve(TA) 还原 pH*, 240 点网格最大 |ΔpH| = 0I2 换算层: 手工复算与模型逐位相同 (Δ = 0)I3 双副本: 独立文件与内联块 20 个函数、63 个平衡常数, 归一化 md5 完全相同。

📌 真正的风险不是「当前是否一致」(是), 而是将来会不会漂移 —— 同一份求解器存在两处, 没有任何东西阻止有人只改一处。I3 即为此而设。

B. a11y 与窄屏

163 个 label 零个for, 输入框全部无 id —— 点击标签无法聚焦输入框, 是所有人都损失的常规交互 (工艺参数标签仅 10px)。现按 f_{idx}_字段名 生成 id 并关联 65 处。31 个表格中 12 个未包 overflow-x-auto, 已全部包裹。新增自检: 输入框必须有 id、for 不得悬空、表格必须可横向滚动。

📌 实施教训: 正则改了三轮仍漏 1 处 —— Python re 在超长 title 属性上回溯超限后静默放弃匹配。改线性扫描后一次到位。这与 t21 三次扩展全部落空同形态, 两次都是断言先报出数目不对才发现的。

C. CDN 加固 〔v2.3 注: 本节「不填哈希」的状态已被 v2.3 关闭 —— SRI 已按 npm 包内真实发布件落地, 且原 URL 的 .min.js 实为 jsDelivr 动态压缩产物、包内不存在, 详见「v2.2 → v2.3」章 E 节〕

Tailwind Play CDN 动态生成响应体, SRI 哈希无法预先计算 —— 技术限制而非疏忽。chart.js 是固定文件, 可以且应该加 SRI, 但本版不填哈希: 当前拿不到真实值, 而编造哈希会让浏览器拒绝执行脚本、图表直接消失, 比没有 SRI 更糟。只加 crossorigin 并把取真值的命令写进注释。📌 与「判据先负对照证明会红」同源: 安全措施也不能靠猜值上线

v2.2 → v2.3: 第七轮审计处置 · 结构断言 v2.3 · 2026-08-10

第七轮独立审计报出两条严重回归, 共性诊断准确: 都是一次正确的重构越过了自己的边界, 且检测缺口同构 —— 现有断言查的是内容 (值对不对、几处一不一致), 失效发生在结构 (元素在哪个父节点、钳制覆盖哪些入口)。v2.3 逐条实测核实后处置, 并把「结构」维度补进断言体系。自检 21 → 22 项, 工况 22 → 23 条 (新增 edge_hostile_json)。

A. P0 · <head> 提前闭合 (实测三处, 审计报一处)

v2.2 构建期补丁写入的三处 description (meta / og / twitter) 行尾各多一个 >; HTML5 解析器在第一处提前闭合 <head>, 20 个 meta + canonical 掉进 <body> —— 爬虫只解析 head, canonical / robots / og / twitter 全部失效, 而 description 断言用 querySelector, 对父节点不敏感, 照样全绿。修三字符; 新增 head 结构断言 (元素必须在 document.head 内), 先转红再修复转绿 —— jsdom 内部即 parse5, 负对照免费。

B. P1 · 方案 JSON 加载路径绕过钳制

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 条数值基线逐位不变 (钳制对合法参数是纯守卫的实证)。

C. P2 · 鱼池曝气尾气入车间 (进气维持室外, 设计决策)

鱼池是车间内的敞开水面, 气泡在池面破裂 —— 尾气必然入室且已被水温饱和; 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₂ 同样入室, 新风需求目前只计脱气塔份额。

D. P3 · 全局热工配置单源化 (含审计误报更正)

默认值同时写在 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 处对齐多空格行, 由脚本残留自查抓到 —— 故把这层也固化为断言), 双向负对照精确。

E. chart.js SRI 落地 (对 v2.2 注释的事实更正)

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; integritycrossorigin 成对上线。断言: jsdelivr 脚本必须成对、Tailwind Play 必须皆无 (防 v2.2 样式崩掉事故复发)。

F2. 第二批: 曝气风量物理选型 (2026-08-10)

海南低密度(石斑 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)。

F. 交付方式变更: 补丁链封存

v2.2 的 patches/ 与 tools/ 不可得, 自 v2.3 起直接在交付产物上编辑, 「从 v2.1 全量重建」的可复现性封存; 验证工具按 HANDOFF §4 规格重建并显式标注。编辑纪律不变: replace_once 强制唯一命中、断言先负对照转红、基线变动先预测符号量级。

[v2.3 第四批] 简易模式 · 自然通风与太阳辐射 2026-08-12

国内多数循环水项目是简易棚: 无暖通无除湿, 车间温湿度由太阳、设备废热、池面与尾气换热、自然通风共同决定。此前该场景无表达路径 —— hvacEnabled=false 只是不收电费, A3 前提仍强制室温=水温。本批新增全局键 roomMode 三档: conditioned(恒温车间, 既有路径逐字保留)/ ventilated(简易棚·自然通风)。⚠ 本批原含第三档 open(露天), 因中国工厂化循环水无此实际场景, 后续批次已撤销(白名单/UI/派发分支/R4 枚举一并移除; 旧 JSON 写 open 者与非法值同路回落 conditioned)。13 条数值基线在恒温档下逐位不变(全精度导出比对); 自检 23 → 24 条(新增 edge_room_ventilated)。

A. 决定性考古: v1.x 的失败根因

车间温度自由求解正是 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 的隐藏依赖清单, 开工前逐条重审过。

B. 太阳辐射子系统与 solveRoomAir

九气候区各补 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 出腐蚀风险告警。

C. 「零」的语义与成本方向

简易档下暖通显热与除湿电耗严格为 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 失败特征(车间坍缩到室外之下、池面白捡散热)经标定确认未重演。

D. 断言 R1–R5 · 分层负对照 · 标定哲学

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², 与实测场几何不可比), 判据遂改为方向 + 有界偏移 + 三类热源在场且量级合理, 点值降级为诊断输出。追着实测点调工况旋钮 = 曲线拟合表演, 教训保留在探针头注。

E. 遗留修复与使用要点

关塔空气曝气的 CO₂ 新风份额(v2.3 遗留): 气泡把池水 CO₂ 吹入车间, 新风需求此前只按脱气塔份额计; 现关塔且曝气入室时份额取 1(零新常数)。对 air+关塔的恒温档工况有真实影响(三亚案例约 +0.3 元/kg); 13 条 o2 基线逐位不受影响。开塔时曝气残余份额未细分, 维持开放项。使用: 全局热工面板顶行「🏠 车间模式」三档; 简易棚建议 ACH 15–30(上限已放宽); 结露告警优先加大通风; 车间比水温低 >2 K 提示寒潮核对鱼种耐受下限。ventHR(通风热回收)在自然通风棚语义上应为 0, 模型不强制 —— 用户若留非零值等于假设有被动回收构造, 参数哲学是用户定参数、模型只管算。

[v2.3 第五批] 池内曝气拓扑 · 曝气强度约束 2026-08-13

本版全部起于一句产业侧提问: 空气曝气是直接加在池子里的, 曝气的时候鱼也在消耗, 所以空气用量要远大于 95% 饱和度。顺着这句话查下去, 发现模型对同一台鼓风机 K-101 用了两套互相矛盾的拓扑, 并连带挖出一处潜伏的跨模块不同源缺陷。13 条数值基线逐位不变, 自检 24 条工况不变, 新增断言 M9/M10/M11。

A. 两套物理: 选型侧对、水质侧错

选型侧 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% 再扣一整个循环的耗氧量。

B. 修正: 传质 = 耗氧的稳态

air 分支改为池内质量平衡: OTR(C) = A × 1.2 × 0.23 × OTE_base × (C_sat − C)/C_sat = OCRC = 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.705.415.00
31.2苗种期0.215.375.00
40苗种期0.005.315.00
40成鱼期2.735.385.00

修正后 DO 不再随密度崩塌, 且高出 DO_design 的那一点正是选型安全系数 safetyAerator=1.10 的效果。解析验算: 开塔(O₂ 控制)工况 deficit = (6.73−5.00)/1.10 = 1.573 ⇒ DO = 5.158, 模型三个阶段输出全为 5.158, 与手算逐位吻合。⚠ 修正前那个 0.00 是拓扑用错产生的伪值, 不是"会死鱼"的物理结论 —— 本手册特此记录, 防止后人把它当作历史结论引用。

C. 潜伏缺陷: sp 白名单漏 recDepth_m(同模式第三次复发)

诊断中发现探针复算与模型内部风量对不上(苗种期 222 vs 132 m³/h), 而成鱼期完全一致 —— 差异只出现在 O₂ 控制的阶段。根因: recDepth_m 是鱼种库的逐阶段字段, 而 tankAerationDesign 被两条路径各调一次:

路径传参拿到的水深
设备选型 / CAPEXtankAerationDesign(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 跨模块风量同源), 不是注释层。

D. 曝气强度: DO 与 CO₂ 都达标后先撞线的那一项

总风量由鱼的耗氧决定, 几乎不随密度变(密度 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.52222.65 ✗3.97 ✗15.1
20成鱼期3.012700.57 ✓1.71 ✓35.0
40苗种期1.52676.37 ✗9.55 ✗12.6
40成鱼期3.012701.14 ✓3.43 ✗35.0

成鱼期可行上限 35 kg/m³ 与国际经验线接近 —— Global Seafood Alliance 的 RAS 综述指出密度高于 40 kg/m³ 时鱼与细菌的耗氧速率通常已超出常规曝气设备溶入大气氧的能力, 必须改用气态纯氧。差别在于 35 这个数是从曝气强度推导出来的, 不再是拍脑袋的门槛。苗种期上限只有 12–15, 但这更说明"把同一密度套在三个阶段上"本身不合理 —— 曝气强度约束的是"密度 × 阶段"的组合, 不是全场密度。

E. 断言与负对照

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 管作业条件与风机/变频器降容。

F. 海南简易棚实证与使用要点

本版的产业来源。石斑/三亚/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₂、不是湿负荷。

[v2.3 第六批] 车间模式三档 · 车间通风机 2026-08-13

车间模式重新划分为三档: conditioned 恒温恒湿车间 / natural 自然通风车间 / mechanical 机械通风车间。分档判据只有一条: 能否自动调节温湿度 —— 不是"简易还是正式", 也不是"自然还是机械"。同时补上一台此前两档共同缺失的设备: 车间通风机 KV-1003。13 条数值基线因此全部重算。

A. 关键判断: 恒温恒湿车间本身就是机械通风的

本版起于产业侧一句反问: "恒温恒湿车间也有机械通风"。确实如此 —— 恒温档的 ACH 新风量一直参与计算(UA_vent_sens 进暖通负荷), 但从来没人给它配风机: 全场四台风机(脱气塔 / BF / 蛋分 / 池内增氧)没有一台是车间通风机。所以通风方式不是某一档的子类型, 而是横跨两档的独立事实。三档扁平命名后, "恒温恒湿 + 自然通风"这个物理上不成立的组合被天然排除 —— 你不可能一边花钱把室温压到 27°C, 一边让室外热风自由穿堂。

⚠ 键名变更: 简易模式批次的 ventilated 改名 natural; open(露天)已于池内曝气批次撤销。二者均不留别名 —— 留一条永远没人走的路径只会扩大审计面。旧方案 JSON 写这两个值的, 与任何非法值同路回落 conditioned(断言 R4b 覆盖)。

B. 通风机 KV-1003: 两个易错点都封在断言里

功率 = 风量(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 提示: 送排平衡式请把全压按两台之和折算。

C. 13 条基线重算: 预测先行, 逐条吻合

补一台真实存在的设备必然改变基线, 故按纪律先出预测表再改代码。预测: 全部 13 条上升、幅度 +0.01~+0.08 元/kg(≤0.1%)、最大为 turbot_500(水体大, 通风量 5 万 m³/h)。

工况实测 Δ预测 Δ
salmon ×637.69–44.15+0.010+0.010+0.01 ✓
tilapia_100030.916330.9252+0.009+0.01 ✓
turbot_50056.149256.2340+0.085+0.08 ✓
grouper_50044.608344.6291+0.021+0.02 ✓
bass_30046.402746.4289+0.026+0.02 ⚠
eel_20061.009661.0276+0.018+0.02 ✓
mandarin_20058.637258.6792+0.042+0.04 ✓
shrimp_10050.421450.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), 密度高反而小, 因为车间体积减半, 这是高密度此前没算出来的一项红利。

D. 空气曝气 × 车间模式: 三样东西的去向与三条告警

恒温恒湿档下用空气曝气, 气泡带进车间的 CO₂ / 湿 / 热各有归宿(石斑/三亚/200t/密度20/年均实测):

air 关塔air 开塔o2 对照
CO₂ → 新风需求9,835 m³/h 成为控制项00
实际新风9,8357,1167,116
尾气入室产湿290.8 kg/d250.70
除湿量 / 除湿电1,776.9 / 710.81,629.3 / 651.71,378.6 / 551.4
尾气显热0.00.00.0

CO₂fracIndoorCO2V_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 是逐阶段键, 该组合会自然出现, 不是误操作。若每次打开都见红字, 久了就没人看告警了。

H. 成文标准 DB46/T 424—2017 与石斑成鱼期池深修正(2026-08-13)

此前几轮关于"空气曝气能撑多少密度"的推算, 全部依赖设备商配置反算与媒体报道。取得海南省地方标准 DB46/T 424—2017《豹纹鳃棘鲈工厂化养殖技术规程》正文后, 这条链才有了成文依据。

标准表 1 · 分规格养殖密度(直接给 kg/m³, 无需折算):

体长 cm体重 g尾/m³kg/m³
10–157–45150–2501–5
15–2045–85100–1505–15
20–3085–28070–10015–20
30–40280–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Δ
工艺成本 元/kg44.629144.8341+0.2050
企业全成本 元/kg54.323654.5412+0.2176
比电耗 kWh/kg14.121014.3427+0.2217
热泵成本 元/kg1.60191.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 换算)、光谱配比、光周期, 且体色-售价的量化关系无公开数据, 硬做即编造。

G. 曝气强度限值下调并按养殖对象分档(2026-08-13)

原限值 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.971.22
山东海水工厂化(老式罗茨)22 kW / 1440 m²(深 0.8)1.652.06
工厂化对虾15 kW×2 / 1000 m³(深 1.2)3.893.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.72.5(实测 1.22–2.06 之上)
甲壳类4.03.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 后, 负对照证明把它从 recomputeAllsp 白名单里撤掉, 24 条自检依然全绿 —— 与 recDepth_m 完全同一模式的第四次复发(前三次: v1.1.2 的 DOmin_*、本轮的 recDepth_m)。注释提醒挡不住, 只有断言能。凡"鱼种库有字段 → 白名单转发 → 消费点使用"这条链, 都应有一条断言校验消费点拿到的确实是鱼种的值。

⚠ 更值得记的是第二层: 断言写好后负对照仍然全绿。查明原因是没有工况能触发它 —— aerIntensity 仅在 air 模式下计算, 而 shrimp_100 基线走 o2 模式。补 edge_shrimp_air 工况后负对照才精确转红(实得 1/1.7, 应为 2/3)。新断言必须确认存在能走到它的工况, 否则等于没写 —— 这条教训与"断言先负对照转红"的纪律是一体两面。

F. 补丁: CO₂ 脱除的机制澄清与浅池告警(2026-08-13, 无数值变动)

交付后的一个提问("空气曝气对 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₂ 限值、该系数应单独查证"—— 该系数可能挂错了位置: 海水该被区别对待的或许是去除效率而非限值。本版不动, 记入遗留。

E. 断言 M12 与三组负对照

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 → v2.3.3: 字段流转工厂化 + 空气曝气路线补完 v2.3.3 · 2026-08-13/14 · 六批

〔本章含 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 条。

A. 声明表 SPECIES_FIELD_FLOW + 工厂 buildWaterSp

五次复发的案发现场是 recomputeAll 里的手写白名单: 每漏一个鱼种字段, 就多一处静默兜底。现每个字段在 SPECIES_FIELD_FLOW 声明 {scope, toSp, resolve?}——scope 标记权威源层级(阶段字段 / 鱼种级字段 / 派生), toSp 声明是否转发进水质侧, resolve 为解析函数(省略即原样转发)。buildWaterSp(stage) 按表生成 sp, 手写字面量退役。池深解析(用户设定 > 鱼种推荐 > proc 兜底 > 1.5, 下钳 0.3 m)收敛为 resolvePoolDepth 全库唯一副本——此前三副本且兜底不一致(3 vs 1.5)正是"池深修一半"事故的温床。

B. 断言 M15a–d: 静态源码扫描

选静态扫描而非运行时校验, 是对既往两次教训(M13 / M14: 断言写好后负对照仍全绿, 因为没有工况能走到那条路径)的机制性回应: 对水质链四个消费函数做 .toString() 源码扫描, 不依赖工况, 每次自检对全部代码路径无条件全覆盖。M15a 消费面每个 sp.X 必须声明且转发; M15b 每个转发字段必须有消费点(抓死转发); M15c recomputeAll 的 sp 必须来自工厂; M15d 设备侧 tankAerationDesign 调用必须经同一工厂。落地顺序刻意为先加断言(转红)再处置(转绿), 且上断言前先以预飞探针(tools/probe_fieldflow.js)在真实页面环境跑同一套扫描、确认红名单恰为预期。

C. 断言落地当天的收获: 第六例 thermalClass + 死转发 protein

M15a 上线即红: isWarmWaterStage 支持鱼种显式声明温冷水类别 thermalClass(注释明写"优先用鱼种显式声明"), 但该字段从未进过白名单——同模式第六例, 与 recDepth_m 完全同型, 只因尚无鱼种声明它而未被踩响。已补声明转发(阶段显式 > 鱼种级; 现状无声明 ⇒ 数值逐位不变), 声明能力自此真正生效。M15b 同批咬出 protein 死转发: 白名单转发了它, 消费面(水质链四函数)零处读取——真实消费者是 calcStageLoad, 走 stage.protein 直连不经 sp。已撤转发, 条目以 toSp:false 存档("该字段存在, 有意不进 sp"是一条信息, 删掉条目就丢了)。

D. 设备侧接入同一工厂

此前设备侧传完整 stage、水质侧传白名单 sp——两侧传参形状不同, M11 只能事后比对两侧风量。现设备侧改为 tankAerationDesign(buildWaterSp(stage), …), 两侧吃同一工厂产物, "两侧不同源"在结构上写不出来; 两侧解析规则的微分歧(设备侧原缺 0.3 m 下钳与 proc 兜底——被 UI 输入范围掩盖着的潜在分叉)一并消失。M11/M14 保留为纵深防御, 不撤。

E. 验证记录

红→绿全程: 批① 忠实等价替换(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。

F. 局限(如实记录)

M15 只覆盖「鱼种/阶段 → sp」这条链——五次复发的案发地。派生中间量的流转不在射程(V_vent_eff 一类, 第四次复发所在), 仍由 M12a 数值断言压着; 那是另一个量级的依赖图, 有意不在本版摊开。消费点内残余的 || sp.recDepth_m || 1.5 兜底对工厂产物是死代码, 仅为诊断脚本手造 sp 时保留防御——已在声明表头注如实标注, 不假称"解析规则彻底单副本"。

G. 二批(同日): aerationMode 硬告警 —— configWarns 结构化导出

遗留清单第 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 十一类告警进导出面)未来迁移的目标形态: 新告警按结构化建, 旧的逐步迁。

H. 二批断言 W0–W3 与验证记录

预飞定锚(教训: 断言必须先确认存在能走到它的工况): 探针 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 一个触发点, ⇔ 断言对所有工况统一生效。

G. 二批: aerationMode 硬告警(2026-08-13, 同版追加)

处置遗留第 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 的边界超标状态——结构化导出上线第一天就多看见一件此前无人知道的事。

H. 三批: 空气曝气密度分界 40 → 30(2026-08-13, 纯文案/注释)

产业侧质疑 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 都行")。已立为纪律: 凡引用外部数字, 须连同原文口径一并记录

I. 四/五批: 空气曝气设计工况点 + 加载路径哨兵盲区(2026-08-13)

由产业侧追问"关塔时是不是该让用户输 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: 新字段在纯氧模式下填了不起作用, 常显是误导。

J. 文档批: 手册第 15 章与参数速查表追平代码(2026-08-14)

前五批把空气曝气路线的代码补完了, 文档没跟上——最直接的后果是界面写 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.jsprobe_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: 注释里写"已被断言覆盖"不等于真被覆盖。声称某处有防线时, 必须同时给出该防线失败时的可见信号; 给不出, 就说明防线不在你以为的那一层。

K. 收尾批: 默认值口径清账 + 入室 CO₂ 守恒修复(2026-08-14)

清两条遗留。(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 缺失时你得到的是绿, 不是红。

L. 下游审计批①: 告警链从 sim 打通到可研报告(2026-08-14)

二批把告警做成结构化 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.htmlsproc.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 表须逐条复核, 不可直接当缺陷清单。

M. 下游审计批②: 设备清单少四台、总价却对得平(2026-08-14)

(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 刚写完就又犯一次; 死负载三次报错全是量具问题。 ⇒ 补充: "零脚本错误"不等于"渲染出了东西", 空页也零错。

N. 版本口径批: 下游页版本号跟随主页面(2026-08-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 处。⚠ 读取下游页时缺文件即判 工具异常退出, 不静默跳过 —— "文件不在就当它没问题"正是本轮反复咬出的那类假绿。

⭐ 最新 v2.4 → v2.5: 沿程口径归位 v2.5 · 2026-08-23 · 第八轮审计

版本主题只有一件事: 把几个算在了错误位置的量放回它该在的节点。 起因是一份外部审计(第八轮), 七条 B 类问题, 复核后确认六条、升级一条、降级一条、新增两条。 13 条数值基线全程逐位不变, 自检 35 → 40。

本轮最重要的一句话: 集总口径下算出来的那个数, 未必是它标签上写的那个点的值。 CO₂ 稳态式把鱼类呼吸与硝化合并为单一源项, 于是它给出的是脱气塔进水浓度而非鱼池浓度, 两者相差整整一个 δ_n(15–39%); 沿程七个节点的 pH / Ω / NH₃ 则是从鱼池复制过去的, 从未重算。两类缺陷的共同点: 数值自洽, 守恒闭合, 标签错了 —— 与 v2.4 那族 「取值来源型断言」治的是同一个病, 这次是「取值位置」。

A. 沿程碳酸盐逐节点重算 (B1)

沿程节点用 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

B. CO₂ 按产生位置链式重导 (B8) —— 本批唯一改数的一处

呼吸产 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

η > 1 的处置改了口径: v2.3.3 注释明确"不钳制", 该处置在集总式下无害, 链式下 A = 1 − η < 0 会给出负浓度。处置是下钳通过率到 0而非上钳 η —— edge_yield_tiny 下 η_换水 达 196, 上钳会把 CO₂ 抬到 14.7 mg/L, 比不钳更离谱。

C. NH₃ 峰值位置判据 (B5)

模型把 pH/NH₃ 报在鱼池出水。该点对 CO₂ 与 Ω 最保守, 但对 NH₃ 不保守 —— 同一点 TAN 最高而 fNH₃ 最低, 两个偏差方向相反。缓冲区内 fNH₃ ∝ 1/[H⁺] ∝ 1/CO₂, 故:

NH₃(塔后)/NH₃(池) ≈ (1 − η_bio) · C_鱼池 / [ (C_鱼池 + δ_n)(1 − η_co2) ]

忽略 δ_n 时退化为简洁判据 η_bio > η_co2; 计入后阈值由 63.4% 松到 54.8%。 判据在推荐输入范围内即可翻转(生物滤池推荐值与脱气塔可达效率区间重叠), 极端组合下塔后 NH₃ 达池值 4.9 倍。告警不引入新阈值, 直接取沿程实算最大值比对 —— B1 修好之前这段做不了, 那时七个节点的 NH₃ 是同一个复制值。哨兵 IRAS_V25_NH3_PEAK

D. 换水稀释补回 CO₂ 稳态式 (B4)

原注释称"V_replace ≪ Q×24×η, 偏差 < 1%, 可忽略"—— 该论证只在高 η 下成立, 而 η = 5% 正是纯氧关塔时 co2FallbackEff 的默认值。实测偏差 0.13%(η=65%)/ 1.63%(η=5%)。连带必须同批: 补回换水项后"产量 ≡ 塔移除 + 曝气移除"不再成立, 而 fracIndoorCO2 的第二项默认"剩下的全是塔的", 会把随排水离场的那部分 乘 degasFrac 送进车间。改为三份额分解 + 断言 X1b(三份额之和恒为 1)。 哨兵 IRAS_V25_CO2_DILUTION

E. MBBR 尾气去向可选 (B9)

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

F. pH 与硝化的不一致 · 求解器边界 · 亚硝酸盐边界 (B2 / B7 / B3)

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₂⁻ —— 这是稳态口径的固有边界, 不是待补功能。详见该节。

G. 文案实算值锚定 (扫尾)

B8 把全库鱼池 CO₂ 动了 23–39%、Ω 动了约 30%, 而发布说明里 "实测海水鱼种 Ω 0.37–1.29 全部欠饱和"这句话一个字没跟着变, 而且定性结论已经反了 (对虾苗种期实测 1.63, 为过饱和)。当时 40 条自检全绿、25 项 docver 全绿 —— 因为没有任何门禁在看文案里的实算值, 是靠人眼发现的。

纪律: 与 v2.4 的「登记表漏项」同族 —— 判据的强度取决于它看得见什么。 docver 查的是版本号一致性, 不是新鲜度; 四处版本号一致地停在旧版, 它照样全绿。 现新增断言 N2: 声明句带 data-omega-min/max 机读属性, 自检直接跑四个海水鱼种 取 Ω 包线比对, N2b 连定性结论一起查(文案说没说"过饱和", 必须与实算 max>1 一致)。 两条负对照均精确转红。哨兵 IRAS_V25_DOC_ANCHOR

H. logo 改版: 孤立 R → iR(独立于水质线)

原 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. 物质平衡断言 · MBBR 曝气重构 · EBCT 分子修正

I-1 物质平衡断言(氧 O1–O3 / 碱度 A1–A3)。 本库此前没有一条物质平衡断言 —— "今天闭合是因为公式恰好写对, 不是因为有东西防止它写错"。立断言的关键是 被比的两边必须来自不同的计算链: 既有的那条碱度断言把上一行的赋值原样验一遍, 永远绿, 与 bioVolume × VTR ≡ tanDaily × sBio(注释自己判过"校核没有意义")同类。

断言当场咬出两个既有缺陷: ① 碱度收支缺整项 —— 投加 = 消耗 − 回收 − 补水带入 + 【排水带出】, 最后一项全库零命中。补水按 100 mg/L 进、系统水按 150 mg/L 出 ⇒ 换水实际是碱度净汇, 模型记成净源, NaHCO₃ 投加量低估 5–35%。 ② tanNitrified 用鱼池浓度自算 TAN 外排, 而排水取自末节点, 两模块对同一股排水说法不一。

M4b 曾把 bug 锁在里面: 它照抄了当时的公式, 缺陷期间永远绿, 公式一改对反而全库转红。同义反复型断言不校验正确性, 它把当时的写法固化成规范, 并在纠错时反过来挡路。

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 个物理不可达, 故不采用。

流化通量出处
Norsk Vann Rapport 168/2009(Ødegaard, Rusten, Storhaug, Paulsrud): "为保证良好混合, 供气量不应低于 10–15 m³ 空气/h·m² 反应器池底(随载体类型而定)", 并明确混合需求可能成为供气量的控制性因素。⇒ 10–15 是下限区间而非典型值
次级参考: Aquacultural Engineering 实测, 表观气速低于 5 m/h 时 TAN 去除率下降 —— 那是性能劣化点, 导则的 10–15 在其上留了余量。两者层级不同, 勿混用。

Limitations: 同一篇实测明确指出表观气速不是水产 MBBR 合适的放大准则 —— 保持几何相似放大时注入深度增加, 相同表观气速下所需能量更高。本模型把水深开为输入, 但通量本身不随水深修正, 属固有近似。

四个新输入: 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 条告警(罗非、对虾), 那些是真的。

本批最诚实的一条记录: 负对照 6 条里有 2 条没能转红 —— 把风机选型退回供氧驱动、或撤掉驱动力项, 这两个正是本批核心, 而现有断言一条都抓不到。 根因: O1/O2 锁的是"各模块之间自洽", 而它们改的是全模型共同采用的物理口径, 两边同步退回则自洽性依然成立 —— 守恒断言看不见标签错误(与 v2.5 B8 同一教训)。 需一条取值来源型静态断言补上, 已记入 HANDOFF 遗留。

J. 补捕手: 曝气口径断言 + 台账门禁

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 各自精确转红, 一一对应

不夸大它的性质: 这不是"独立验证物理正确"——做不到。 它锁的是输入必须被消费, 与 O2c、死负载棘轮同族。

写这条断言时它自己犯了要防的错: 初版硬写 1.293×0.2315, 而库内 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 不同导致的误报(已对齐)。

边界: L3/L4 是交叉引用, 抓不到"两处一起过期"; 只有 L1/L2 是实测重算。 本工具不重跑门禁, 故 L3 覆盖的数字仍可能整体陈旧 —— 真兜底仍是跑完门禁照 §6 逐条核对, 工具只能缩小那一步的范围, 替不了它。

纪律: 台账是快照, 而快照会被下一次改动作废。判据的强度取决于它是重算还是对抄

K. MBBR 曝气对 CO₂ 的吹脱(原 B10)

为什么此前写死 0, 以及那个 0 不算错。 v1.9 定 BF_CO2_STRIP = 0, 注释写"保守, 脱气塔选型偏安全"—— 该判断成立: 承认吹脱后塔前浓度实测由 9.53 降到 8.47, 塔确实可以选小一档。旧值是留了余量, 不是算错。

为什么现在能算了 —— CO₂ 与 O₂ 的推动力差一个数量级
O₂: 水中 5–12 mg/L, 与空气平衡 6–12(饱和附近)⇒ 推动力几乎为零
CO₂: 水中 7–13 mg/L, 与空气平衡约 0.6 ⇒ 推动力几乎是全量

同一股气几乎加不进氧, 却能有效吹走 CO₂。 曝气改流化驱动后风量已知(且比旧的供氧驱动风量大 69%), 用手册现成的气相载量式 η = 风量 × 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 三条断言同时报才定位到"这是异常, 不是算错" —— 单看基线只会以为数值变了。
断言的价值不只在"抓错", 还在区分"算错"与"根本没算"。
四条断言因本批重审, 全是原先写得过度特化: X4a 的 塔前−鱼池 ≡ δ_n 是"MBBR 只加不减"的前提; X4b 的集总式回归锚只在不吹脱时成立(多了汇点, 全环稳态本就该下移); X4d 的"塔前是全场最高点"不再成立 —— 这已是它第二次因过度特化而放宽, ⇒ 单调性类断言天生脆弱, 拓扑一变就要重审; X1 的期望式没跟上第四支 —— 改了实现却没同步期望式, 被 edge_mbbr_open 咬出, ⇒ 断言的两边必须一起改, 否则修好的反被判红。

L. 接触水气流 ⇄ CO₂ 分解登记表(N4)

同一个洞出现了四次: v2.0 Q_air_gain 孤儿项 · v2.1 蛋分气流未登记 · v2.5 MBBR 吹脱从未计入 · 蛋白分离器的 CO₂。每次都是"某台设备的某股气流, 一半算了一半没算": 风机选了型、电耗算了、气路登记了 contactsWater, 唯独 CO₂ 那份没人管

⇒ 一条条补补不完。改为白名单登记: 凡接触水的气流, 要么在 CO₂ 分解里有对应份额, 要么显式登记为「有意不计 + 理由」。本条不判"不计是否正确", 只判"有没有做过这个决定" —— 判据的力量在于把沉默的遗漏变成显式的取舍

蛋白分离器的登记结论(全网检索后): 文献确证蛋分对 CO₂ 脱除有正向贡献 (Barrut 2012; Orellana & Wecker 2013), 但未检索到可用的单程去除率 —— 能查到的是能效(0.023 kg CO₂/kWh)或标准传质速率, 几何依赖强, 不能直接折成去除率。 按 MBBR 同口径粗估约 2.6%, 属二阶项; 略去方向保守(脱气塔进水浓度偏高 ⇒ 塔选型偏大)。

⚠ N4b 当场咬出一个结构性易漏点
空场骨架(产量为 0 的早返回路径)的 CO₂ 分解停在 v2.3.3 的形状 —— 换水稀释批加的三个字段、MBBR 吹脱批加的两个字段, 两次都没同步。 而该处注释上方正记着"X0 上线当天即咬中此处缺失"—— 同一位置, 第二次
⇒ 空场骨架是手写的字段清单, 主路径每加一个字段它就落后一次。 治本是让骨架由主路径的字段集派生, 而不是两处各写一份(已记入遗留)。
本轮第三次"猜字段名不读定义": 登记表键名初版写设备名 co2Blower, 而气流 id 是 degasser ⇒ 全库误报。前两次是 skimmerHRT(实为 skimmerHRT_min)与断言里硬写 1.293×0.2315(实为 F_O2_MASS=0.232)。 库内早有记录的"第六次事故"(K0_W74 传 °C 而非 K)是同一类。
凡引用他处定义的标识符, 先 grep 出定义点, 不凭印象写。

M. 碳酸盐缓冲修正: 表观 vs 真实脱碳量

问题: 按气相载量算出的 CO₂ 去除率(MBBR 曝气吹脱、空气曝气模式的池内曝气) η = 风量 × kLoad × 逼近系数 / 水量 给出的是从总无机碳 DIC 里转移走的质量; 模型此前把它当作自由 CO₂ 的降幅使用 —— 等价于假设缓冲因子 = 1.0。

实际上 CO₂ 被吹走后碳酸盐平衡右移(HCO₃⁻ + H⁺ → CO₂ + H₂O), 重碳酸盐转回补上, 自由 CO₂ 的降幅小于被吹走的质量, 这两个去除率因此被系统性高估。

⚠ 脱气塔【不】修正 —— 本条最容易搞错的地方
脱气塔与关塔时增氧锥附带解吸的效率来自实测进出水自由 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 内 —— 独立口径的旁证

新增断言 N5a–d 中的 N5d 值得单说: 它把算出的缓冲因子换算成 Revelle 因子, 要求落在海洋化学的典型区间。库内其他断言查的都是"内部自洽", 而它拿一个几十年的外部通行量来对 —— 这正是本版负对照里 negA/negB 抓不到的那类: 整套实现自洽, 但物理上偏离

实测影响: 三文鱼成鱼期 MBBR 吹脱率 7.5% → 5.94%, 鱼池 CO₂ 7.02 → 7.10; 大菱鲆 9.9% → 8.56%, 9.17 → 9.25; 罗非(淡水)几乎不变。基线逐位不变(不动成本链)。

本批犯了两个错, 都被断言当场咬住: ① 缓冲块引用了下方才声明的变量, 命中 let 暂时性死区 ⇒ 整个水质计算抛异常、 结果全为 null —— 同一会话第二次犯同一个错; ② 稳态解换成了修正后的通过率, 而沿程生物滤池节点漏改, 差 0.23% —— 断言「节点与导出面不同源」当场咬出, 该断言正是为此立的。 修完把未修正的中间量改名加 0 后缀并注明"任何节点与导出面都不得使用", 让误用在代码里显眼, 而不是靠记性

N. 淡水方解石饱和度: 钙输入 + 活度修正(B6)

原缺陷: 钙由海水恒定比例反推 ⇒ 淡水盐度为 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 直接吻合。

活度修正 —— 不做则定性结论相反
Mucci 的 Ksp 在盐度 >0 时是该盐度下的化学计量常数(活度已含在拟合里); 盐度为 0 时盐度项归零, 退化为活度标度的热力学常数。故淡水必须乘活度系数才能与之对齐。

实证: 不修正时模型给淡水 Ω = 1.22–1.76(过饱和, 会结垢), 而 Langelier 饱和指数独立算出 Ω ≈ 0.40–0.70(欠饱和, 会溶蚀)—— 方向相反。 乘 Davies 活度系数 γ² ≈ 0.58 后落到 0.58–1.06, 与 LSI 同侧同量级。
⇒ 而"溶蚀混凝土池体"正是本模型该提示的那个问题, 不修正等于把它藏起来还反着说
N6 与 N5d(Revelle)同族: 外部口径交叉验证
库内多数断言查的是内部自洽, 而内部自洽挡不住"整套实现一致地偏离物理"B6 正是被这类断言救回来的 —— 若只跑内部断言, 那版方向反了的 Ω 会全绿通过。
负对照: 撤掉活度修正 ⇒ N6 精确转红, 报文即症状描述(「模型 Ω 与 LSI 口径分处饱和线两侧 —— 定性结论相反」)。

残余不确定度(已写进代码与 UI 提示): K1/K2 在盐度 0 处的标度约定未经独立核对; 若它们也是活度标度, 则由其解出的碳酸根已含活度, 本修正会略微过头。 LSI 交叉验证表明总方向与量级正确, 但淡水 Ω 仍应视为 ±30% 量级的估计。 离子强度亦为估算(由碱度与钙硬度加电荷平衡推出, 未计镁与硫酸根)。

校核时借错了一次口径: 曾用"海水总硬度 6000 × 2/3"去对钙, 得出"差 4 倍"的假结论。 实际海水硬度以镁为主(Mg²⁺ ≈ 1290 vs Ca²⁺ ≈ 412), 钙只占总硬度约 1/5, 而 2/3 是淡水的经验比例。 ⇒ 借经验比例前先确认它是哪种水的。

O. 生物滤池异养呼吸的 CO₂(整项缺失)

缺陷: 设计口径 CO₂ 产量式为「池内耗氧 × 1.375 + TAN × 6.286」。代码注释写着 「池内耗氧含池内异养耗氧, 故本式的 CO₂ 也自动含池内异养呼吸产的 CO₂」—— 关键词是「池内」。而生物滤池内的异养耗氧是单独一项, 参与生物滤池风机选型, 但它的 CO₂ 一分都没进产量式。 ⇒ 氧账本里有、碳账本里没有 —— 又一个「一半算了一半没算」。

断言抓不到它: 气流登记表(N4)查的是移除路径有没有进分解, 这是产生项, 不在其视野。这一条是全网检索实测数据时撞出来的, 不是断言查出来的。

实测锚定 —— 本版少数几条有实测支撑而非推导的修正。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₂ 出处同上, 不是新的待标定项

⚠ 与鱼池侧 1.375 数值接近但口径不同
鱼池侧的 1.375 是呼吸商(RQ≈1)换算, 本项是同一篇实测拆解出的滤池异养项。 两者同源于 RQ≈1 的化学计量, 故数值相近是意料之中, 但引用出处必须分开写, 不可互相顶替

结果: 设计口径 CO₂ 产量上升 19.8%; 鱼池 CO₂ 7.10 → 7.71、脱气塔进水 8.69 → 10.44 (三文鱼成鱼期); 海水方解石饱和度包线 0.60–1.63 → 0.55–1.53数值基线 0/52 变动 —— 鱼池 CO₂ 不进成本链, 脱气塔按气水比选型不看进水浓度, 且 CO₂ 超标告警在所有基线工况下未被顶破。

M6 第二次因缺项而过期: 原判据写死「呼吸 + 硝化」两项, 补入第三项后 公式一改对, 断言反而全库转红。与当年碱度断言把缺陷锁在里面是同一形态 —— 照抄实现的断言, 在纠错时会反过来挡路
但 M6 并非同义反复: 它锁的是「产量式的构成项一个不少」, 正是靠它, 本次补项才没有悄悄改变总量口径而无人知晓。 ⇒ 改法是把新项写进期望式, 而不是放宽容差。

P. 生物滤池对溶解性 COD 的去除(整项缺失)

缺陷: 原去除路径注释原文「溶解有机物: 蛋分(旁路) + 高级氧化(旁路) + 换水」——没有生物滤池。 异养菌吃掉的底物本该从水里消失(变二氧化碳 + 菌体污泥, 污泥经微滤机与换水排出); 模型算了异养耗氧、也补了异养产 CO₂ —— 唯独没扣底物, 产生与消耗各记各的。

⚠ 为什么默认只有 2.5% 而不是 50%
去除率是单程值, 而水一天通过生物滤池 60–144 次。 50%/程 意味着日削减 2^60 量级, 稳态被压到 1.8–2.6 mg/L, 比文献低 20 倍
实测扫描(关蛋分): 2% → 45–63 · 2.5% → 36–50 · 5% → 18–26 · 10% → 9–13 · 50% → 1.8–2.6 mg/L
文献锚: 丹麦技术大学水产研究所淡水虹鳟中试 RAS 实测溶解态 COD = 35.6 mg O₂/L, 反推约 2.6%。

落地结果(关蛋分 = 淡水实际工况): 罗非 277 → 37.2、加州鲈 → 35.1、 三文鱼 → 32.7、鳗 → 46.2 mg/L, 与文献 35.6 同量级。

为什么它比氨氮去除率(70%)小 30 倍却不矛盾: 氨氮处于一级动力学区, 0.5 mg/L 时生物膜远未吃饱, 单程能吃掉一大截; 而溶解性 COD 大部分是难降解组分, 易降解的很快吃光, 剩下的过多少次都不动。 ⇒ 不是"滤池效率低", 是"底物大部分吃不动"。

与蛋分的量纲对照(同为系统级单程, 可直接比): 蛋分 = 旁路 20% × 单程 40% = 8%/程; 生物滤池 2.5%/程, 约为其三分之一。蛋分靠气泡吸附表面活性组分(效率高但只处理旁路), 生物滤池靠生物膜吃可降解组分(全流量但底物吃不动)。

本值是等效值 = 可降解占比 × 可降解部分去除率, 两件事挤在一起。 正确做法是拆成可降解/难降解两层并与产率系数闭合, 已排入生物滤池模型重构大批次。 ⚠ 字段名沿用历史称谓; 该量以 mg O₂/L 计即溶解性 COD, 将与降解性拆分同批重命名 —— 不单独改名, 以免白付导出面变更的代价。

v2.3.3 → v2.4: 四个量的口径单一事实源 v2.4 · 2026-08-18 · 五批

〔⚠ 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 从来没有声明过参考状态, 三个产气者各按一套隐含口径, 相加后再乘一个密度, 本就无解

本轮最重要的一句话(引自审计原文): 守恒断言保证账本自洽, 但保证不了记进账本的那个数是对的。 无论取哪个密度、扣不扣哪股风, 守恒式两边都会同步变化, 残差恒为零 —— 这类缺陷守恒断言天然抓不到。本轮因此新增一整族「取值来源」型断言 (R1 / A4 / V1–V4 / W4 / G0–G4 / U2), 它们不问账本平不平, 只问这个数是从哪儿来的

A. 室外 CO₂ 本底: 同一物理量的两份口径

合并前热工侧写死 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 处 —— 那是「尾气必须排室外、不得回车间」的量化依据, 字段可撤, 依据不可撤

B. 工艺风量的参考状态: 声明为标准状态 Nm³/h

裁决(项目方): airFlowM3h 全库一律为标准状态体积流量 (0 °C · 101.325 kPa), 因为对外向风机厂家提规格时给的就是 Nm³/h + 压力, 机器由厂家按此选型、质量由该单位本身锁定。

RHO_STD_AIR = 1.293 kg/m³ · F_O2_MASS = 0.232 ⇒ 0.300 kg O₂/Nm³ (国内曝气设计手册经典常数)

为什么必须显式声明: 参考态在选型式与接触器之间会抵消 —— 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 版本号全局替换污染历史叙述的先例)。

C. 风机送进车间的那股空气: 它就是新风

K-101 鱼池增氧鼓风的气路是 OUTDOOR → INDOOR —— 它吸室外空气、穿过池水、 从池面进车间(它没有风管)。进气侧为室外(项目方裁决: 所有风机进气都自室外)。 ⇒ 这股空气就是新风, 而 v2.3.3 之前一分未计, 两笔账同时错:

工况K-101 入室风量 m³/h占通风需求
罗非 air+开塔 · 恒温 ACH 1.0476 / 1,752 / 4,22844.5% / 44.5% / 36.9%
罗非 air+关塔 · 恒温 ACH 1.0476 / 1,752 / 4,23916.6% / 12.7% / 10.8%
自然通风 ACH 15同上4.3%
任意 o2 拓扑00%(13 条基线因此逐位不变)
V_vent_mech = max(V_vent_required − V_blower_indoor, 0)  V_vent_total = V_vent_supply + V_blower_indoor

⚠ 与 v2.3.3 收尾批② 是同一股气流的两个方向: 当年补上了 CO₂ 的去向(fracIndoorCO2 由质量守恒导出), 但没回头问 承载 CO₂ 的空气本身该怎么记。
不新增「超额排风热损」项: solveRoomAir 已把该气流作为独立股入解 (denomTmEx·cp, 湿平衡含 mEx), 恒温档由 m_indoorExhaust 承载。 再加一项即把它的焓算第二遍 —— 那是收尾批② 的镜像(当年"两头都不记 = 孤儿项", 这次会变成"两头都记 = 双计"), 且守恒断言抓不到。

D. 自然通风: 从"需要多少给多少"改为钳在用户填的 ACH 上

v2.3.3 之前自然通风档同样走 max(ACH×V_room, CO₂需求), 三个后果:

物理上站不住: 自然通风由风压/热压驱动, 不会因为室内 CO₂ 高就自己变大。 而且它随开口面积与天气跨近两个数量级 —— 温室夏季敞开设计取 45–60 ACH、冬季关口除湿约 3; 同一房间把固定窗玻璃拆掉可从 9 变 66。拿这样一个量去保证 CO₂ 限值(人员暴露口径)本身就不成立。

⇒ 现钳在用户填的 ACH 上, 缺口由 V_vent_shortfall_m3h 导出并告警:

设 ACHCO₂ 需求实际供风缺口车间 ppm室温 °C
139,3046,49928,9154,42223.3
239,30412,99822,4162,89417.1
539,30432,4952,9191,5849.0
1539,30497,48508572.6
3039,304194,96906580.4

用户填的 ACH 终于有意义了。

⚠ 断言 X2(车间稳态 ≤ 限值)随之按车间档分派: 原措辞是 "新风量未按入室 CO₂ 校核(通风机选小)"——那是模型缺陷的判定, 而钳制后自然通风档超标是 用户配置的结果。但没有给该档发豁免(豁免会让 X2 在该档变成恒真), 改为替换义务: 超标时必须导出缺口(X2b), 不超标时不得报缺口(X2c)。 判据强度不降, 只是换了被判对象。

E. 三条车间通风告警

code级别判据为什么是这个阈值
ROOM_ACH_TOO_LOWwarn自然通风档 且 ACH < 15 零新常数: 15 取自 ROOM_MODES 对该档的定义注释原文「简易棚取 15–30」, 判据与被判对象同源
NAT_VENT_SHORTFALLwarn自然通风档 且 缺口 > 0 给出两条出路: 把通风量调高到 X 次/h 以上, 或改用机械通风档
VENT_CTRL_BY_CO2info非自然通风档 且 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)。 照原样写会得到一条永远为假的判据、负对照全绿。真正要告警的不是浓度, 是为了不超标所要求的通风量

F. 一个被撤销的批次: air 模式默认关塔

立项时据 PROCESS_DEFAULTS.co2StripperEnabled: true 判断"air 模式默认开塔", 并据此算出默认配置使成本高 9.5–22.3%。核实后撤销: 该联动 v2.3.3 四批已在 UI 事件层实现 (切到 air 时脱气塔自动置 false, 带 auto-value 样式与提示语, 并以 dataset.userSet 尊重用户的显式选择), 且由断言 S3 静态锁住不得下沉到计算层 —— 计算层若按 aerationMode 猜用户意图, 用户显式选的"air+开塔"会被静默改掉。

⚠ 该行代码已就地留痕, 写明"勿据本行断言 air 模式默认开塔"以防第三次重开。 错因: 从一个位置的值推断了系统行为, 没查 UI 事件层。

G. 门禁: 防线扩到全局配置层, 并补 U1 的反方向

check_defaults_sync 的三条判据 D1/D2/D3 全部对准 PROCESS_DEFAULTS 这一张表, 于是 GLOBAL_THERMAL_DEFAULTS 这一层从来没有门禁。本轮新增 G0–G4, 判据数 136 → 167。 上线即咬出两条(均 WARN 级, 结构性隐患非数值错, 与 D1 的"30+ 处同值副本"同一处置):

U2 关掉了 U1 的结构性盲区: U1 是从"有框"一侧起判的三件套(UI 有框 ⇔ 读取路径认它 ⇔ 消费点真的用它), 对「无框 + 有读取路径 + 有消费点」这一类结构上判不到 —— 撤销的 co2IntakeCO2_ppm 正是此类。U2 要求: 凡出现在读取路径里的字段, 要么有框, 要么显式登记为 JSON-only 并写明理由。现 87 个读取字段中 4 个走登记表, 且登记表双向校验(表里有而读取路径无 ⇒ 该清理了)。

H. 基线变动与正确性旁证

五批中只有 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 守恒修复时一致。 单向偏移才说明修错方向, 这里没有。

不要引用「最大相对差 13.68%」: 那一项是 salmon_bergen_w/hpCostPerKg 0.178 → 0.202, 绝对值仅 +0.024 元/kg, 是小分母造成的假象。立项复核时曾用它描述整批严重性 —— 引用变动幅度时必须看绝对值

I. 本轮的方法论教训

本轮在六个不同位置犯了同一形态的错: 为判据或探针挑对象时用了记忆里的名字, 而不是先查

位置写的实际类型
断言 A4c 宿主simulateWaterQualityProcesstankAerationDesign恒真型
断言 A4d 宿主contactorNetHeatevapCoeff恒真型
断言作用域EQr.eq报错型
air 判据字段aerationSpec.isAir该字段不存在报错型
探针取设备x.equipmentx.eq量具型
探针取告警x.stageWarnsx.sim.stageWarns量具型

危险性分两档: 报错型当场红, 损失只是时间; 恒真型静默全绿, 会跟着交付, 且再也不会有人发现。 前两条若不跑负对照就会随本轮一起交付。⇒ 固化为三条纪律:

⚠ 另有一条判据本身写错的教训: G1 第一版写成"UI 范围必须等于 clamp", 于是把合规的 800/600 判成红。但 FIELD_SPEC 的既有设计就是 {min,max}(UI 引导)与 clamp[](消费点接受)分开存, 断言 H2 要的是 clamp ⊇ [min,max] —— 二者本就允许不等。差一点逼出一个错误的"修复"。 判据错比代码错更贵: 它会让人去改对的东西。

第 1 章循环水养殖概述

1.1 什么是循环水养殖 (RAS)

循环水养殖系统 (Recirculating Aquaculture System, RAS) 是一种将养殖用水经过物理、化学和生物处理后循环使用的集约化水产养殖技术。与传统的流水式养殖不同, RAS 仅需补充少量新水 (通常每天换水量 5-15%), 其余 85-95% 的水经处理后循环回用。

RAS 的核心思想是: 在一个封闭或半封闭的系统中, 通过一系列水处理设备, 持续去除鱼类代谢产生的废物 (氨氮、悬浮固体、溶解有机物、二氧化碳), 同时补充溶解氧, 从而维持水质在鱼类健康生长的最适范围内。

一个典型的 RAS 系统由以下核心组件构成: 养殖池 (鱼池/虾池)、固液分离设备 (转鼓微滤机 RDF)、生物过滤器 (MBBR 生物滤池)、消毒设备 (UV 紫外线)、增氧设备 (液氧系统或曝气系统)、以及脱气设备 (CO₂ 脱气塔)。

1.2 RAS 与传统养殖的对比

对比维度池塘养殖流水式养殖RAS 循环水养殖
用水量蒸发补水大量取水+排放仅补充 5-15%/天
养殖密度0.5-5 kg/m³10-30 kg/m³30-100 kg/m³
水质控制靠天然净化靠水量稀释精确工艺控制
占地面积小 (是池塘的 1/10-1/50)
环境影响面源污染排水污染零排放或极少
选址限制需靠近水源需靠近水源几乎不受限制
初始投资
运行成本中高 (电费/液氧)
产品质量波动大较稳定最稳定
生物安全高 (封闭)

1.3 RAS 的优势与挑战

优势

挑战

1.4 国内外发展现状

1.5 典型应用场景

场景典型品种密度 kg/m³水温 °C特点
冷水鱼工厂三文鱼、虹鳟50-8012-15淡水苗种+海水养成, 周期长
温水鱼工厂加州鲈、鳜鱼40-6024-28国内市场需求大, FCR 低
海水鱼工厂大菱鲆、石斑30-7016-27需海水/半咸水
鳗鲡工厂日本鳗、欧洲鳗40-6026-28粉料投喂
对虾工厂南美白对虾2-1528-31密度低但投饵率高
📌 v1.1 修订 大菱鲆密度从 v1.0 的 15/30/40 改为 25/50/60 kg/m³, 与莱州东方海洋等国内循环水项目实测一致。

第 2 章RAS 工艺流程

2.1 标准 RAS 工艺流程

一个标准的 RAS 系统, 水流按以下顺序循环:

鱼池 → 微滤机(RDF) → [蛋分] → 生物滤池(BF) → UV → CO₂ 脱气塔 → 增氧 → 鱼池
旁路: [反硝化] / [AOP]

其中方括号 [ ] 表示可选单元, 根据品种和水质需求决定是否安装。

📌 v1.1 CO₂ 脱气塔在 v1.1 中作为独立设备建模 (v1.0 隐藏在增氧节点)。CAPEX 含塔体 + 配套风机, OPEX 含风机 24h 电费。

在 iRAS 平台中, 上述流程被精确建模为主流串联 + 旁路并联的混合模型, 每个处理单元的去除效率独立计算, 沿程浓度逐步递减。

2.2 各处理单元的作用

处理单元去除目标原理典型效率
转鼓微滤机 (RDF)TSS (悬浮固体)60-90 μm 筛网物理拦截60-90%
蛋白分离器DOM + 细颗粒 TSS气浮泡沫分离, 可配臭氧DOM 40-70%
MBBR 生物滤池TAN (氨氮)硝化菌将 NH₄ 氧化为 NO₃60-90%
反硝化反应器NO₃ (硝酸盐)缺氧条件下还原 NO₃ 为 N₂50-80%
UV 紫外线细菌/病毒/寄生虫紫外线破坏 DNA99-99.9%
AOP 高级氧化Geosmin/2-MIB (土腥味)臭氧+UV 协同氧化80-95%
增氧塔/曝气DO (溶解氧)液氧溶解或空气曝气110-165% 饱和度
脱气塔CO₂ (二氧化碳)逆流空气吹脱60-85% (G:L=3-7)
📌 v1.1 增氧目标饱和度按鱼种类别推荐: 鲑科 165%, 海水温水鱼 140%, 温水淡水肉食鱼 110-125%, 罗非/对虾 100-115%。

2.3 淡水 vs 海水系统差异

第 3 章水质参数与控制标准

3.1 关键水质参数

3.1.1 氨氮 (TAN)

TAN 是鱼类蛋白质代谢的主要含氮废物, 通过鳃排出。TAN 在水中以离子态 NH₄ 和分子态 NH₃ 两种形式存在, 其比例受 pH 和温度影响。NH₃ 对鱼有强毒性, pH 越高、温度越高, NH₃ 占比越大。RAS 中 TAN 浓度通常控制在 0.5-2.0 mg/L, NH₃ 应低于 0.02-0.05 mg/L。

3.1.2 亚硝酸盐 (NO₂-N)

硝化中间产物, 对鱼毒性仅次于 NH₃。RAS 中 NO₂ 应低于 0.5 mg/L。持续偏高说明硝化菌群不完整 (Nitrobacter 不足), 通常出现在系统启动初期。

3.1.3 硝酸盐 (NO₃-N)

硝化最终产物, 毒性较低, 但在闭合循环中持续积累。长期高浓度 NO₃ (> 100-200 mg/L) 抑制鱼生长。反硝化或换水是控制手段。

3.1.4 溶解氧 (DO)

鱼类和硝化菌都需要充足 DO。鱼池 DO 通常要求 > 6 mg/L (冷水鱼) 或 > 5 mg/L (温水鱼)。纯氧系统可将 DO 提升至 110-165% 饱和度 (超饱和), 为高密度养殖提供保障。

📌 v1.1 DO 阈值改为 max(satRatio × DO_sat, DO_abs) 双判断, 鱼种内置 satRatio 和 abs 阈值。例如鲑科 0.75+6.0 mg/L, 罗非 0.60+4.0 mg/L。避免了 v1.0 单值 6.0 在罗非高温场景下过严的问题。

DO 饱和度采用 Benson & Krause (1984) 公式精确计算, 详见第 7 章。

3.1.5 二氧化碳 (CO₂)

鱼呼吸产生 CO₂, 在封闭系统中积累会导致 pH 下降、鱼应激。脱气塔通过逆流空气吹脱去除; 空气曝气本身也在吹脱(见 15.3c)。

📌 v2.0 起 · 阈值分档已改 本节旧文写的「< 15 mg/L(海水) / < 20 mg/L(淡水)」是 v1.x 单一口径, 自 v2.0 对标 Timmons 后改为温水/冷水分档 + 海水折减:
CO₂ 阈值 = (温水鱼 ? 30 : 20) × (盐度 ≥ 5‰ ? 0.75 : 1) [mg/L]
     └ tankCO2_max_warm / _cool ┘  └ marineCO2Factor ┘
水温档 × 盐度阈值 mg/L算式
温水 · 淡水 (< 5‰)30tankCO2_max_warm
温水 · 海水 (≥ 5‰)22.530 × marineCO2Factor 0.75
冷水 · 淡水20tankCO2_max_cool
冷水 · 海水1520 × marineCO2Factor 0.75
⚠ 两条必须知道的保留意见
(1) marineCO2Factor = 0.75 无出处 —— v2.3.3 专项核查, 结论是暂不动。 它来自 iRAS 既有值(海水 15 / 淡水 20), 代码中无出处标注, 教科书亦未按盐度区分 CO₂ 限值; 0.75 实为从"想得到 15 这个结果"倒推。 "海水鱼对 CO₂ 更敏感"这一含义未找到生理学依据
但真正的缺口在别处: 本模型的 CO₂ 去除率对盐度完全不敏感。 manual 模式是常数 0.65; auto 模式是 maxEff × f(G:L) × f(填料高度) × f(进风CO₂), 三条曲线里没有一条含盐度。而级联塔实测显示海水吹脱效率显著低于淡水 (归因于无机碳电离分数差异)。这与上一条是两个独立问题, 只是表面上互相抵消 —— 限值压低 0.75 让海水更容易报超标, 看似"考虑了海水难处理", 但机理错 ⇒ 处置方向也错 (用户以为该压低浓度, 实际该加大 G:L 或加高填料)。 ⇒ 两个错误方向相反、量级相当, 只撤其一反而更偏, 故维持现状待同口径实测。
⚠⚠ 一个看起来很有道理、但会出错的做法 —— 请勿实施 v2.3.3 核查留档
既然"海水难吹脱"源于无机碳电离分数差异, 很自然会想到: 用 α₀ 做折减系数。
α₀ = CO₂(aq) / DIC —— 溶解无机碳分 CO₂(aq) / HCO₃⁻ / CO₃²⁻ 三态, 气泡只能带走 CO₂(aq), α₀ 就是此刻可被吹脱的那一份。它由 pH / 温度 / 盐度决定, 可用本模型已有的 iRASCarbonate.K1K2_M10 零新常数算出。本版实测:
工况T °CS ‰pHα₀
同温同 pH 对照 · 淡水2007.314.75%
同温同 pH 对照 · 海水20307.35.24%
罗非鱼(淡)2807.313.74%
三文鱼苗种(淡)1207.569.71%
三文鱼成鱼(海)15307.177.59%
大菱鲆(海)16287.35.76%
石斑鱼(海)27307.34.70%

海/淡比值 0.355 —— 比现挂在限值上的 0.75 严厉一倍。数据本身是对的, 但拿它当折减系数是错的:

水在填料塔内停留数秒至数十秒。CO₂(aq) 被气泡带走后, HCO₃⁻ 会持续再平衡补充, 所以塔实际带走的量远大于进塔那一刻的 α₀ 份额。而 co2StripperEff = 0.65实测填料塔的表观去除率, 本身已经包含了这份再平衡 (综述明确警告: 养殖界几乎所有 CO₂ 去除数据都是碳酸平衡重建后的表观值)。 再乘一次 α₀ 比值, 等于把再平衡算了两遍 —— 海水塔效率会被打到淡水的 36%。

α₀ 是上游约束, 不是去除上限。 正确模型是「再平衡速率 vs 塔内停留时间」 的动力学竞争, 需要碳酸再平衡速率常数 —— 本模型没有, 那是真正的建模工作而非改个系数。
⚠ 之所以把这条完整留档, 是因为它看起来太有道理了: 有物理机理、有现成模块、 零新常数。不留档, 下一个人极可能去做; 做完之后结果更偏, 却因"有物理依据"而更难被质疑。

(2) 没有苗种档 —— 这是有意的取舍, 不是遗漏 v2.3.3 结案
现阈值只按温水/冷水 + 海水折减分。支持分档的间接证据确实存在: 模型里 isFry 已用于 TGP 气泡病阈值(苗种 110% vs 成鱼 115%), 说明苗种确有更高敏感性; 产业侧又指出空气曝气 + 关塔工况恰恰在苗种/小鱼期最常见 —— 也就是说, 这个问题正落在最常用的工况上。
但仍决定不分档: 没有成文的苗种 CO₂ 限值出处。 在无出处的情况下新增一档, 等于用一个猜的数去覆盖一个有出处的数 (温水 30 / 冷水 20 出自 Timmons)—— 那比不分档更糟, 因为它会以 "模型已经考虑了苗种"的样子出现, 反而挡住用户自己判断。
设计苗种阶段时, 请手工把 co2TargetMgL 设得比成鱼期更保守 (该参数有 UI 入口, 可逐阶段设定)。若日后取得成文出处再议。详见 15.3c.4。

3.1.6 悬浮固体 (TSS)

包括残饵、粪便、脱落的生物膜碎片。高 TSS 会堵塞鱼鳃、消耗溶氧、滋生有害菌。RAS 中 TSS 通常控制在 < 15 mg/L。

3.1.7 溶解有机物 (DOM)

包括溶解态的蛋白质、脂肪酸、腐殖酸等。DOM 不能被 RDF 拦截, 也不能被 BF 有效去除, 在闭合循环中会积累, 导致水色发黄、起泡、产生土腥味。蛋白分离器和 AOP 是 DOM 的主要去除手段。

3.2 各品种耐受范围

参数单位三文鱼加州鲈/鳜罗非对虾石斑大菱鲆鳗鲡
TANmg/L< 1.0< 1.5< 2.0< 1.5< 1.0< 1.0< 1.5
NO₂-Nmg/L< 0.3< 0.5< 1.0< 1.0< 0.5< 0.5< 0.5
NO₃-Nmg/L< 80< 100< 200< 100< 80< 80< 100
DOmg/L> 6> 5> 4> 5> 5> 6> 5
CO₂ v2.3.3 校正mg/L< 20/15< 30< 30< 22.5< 22.5< 15< 30
TSSmg/L< 10< 15< 25< 15< 15< 10< 15
pH6.5-7.56.8-7.86.5-8.57.5-8.57.5-8.27.5-8.27.0-8.0
温度°C10-1622-2825-3228-3224-3014-1824-28
盐度0→3000-155-3525-3525-350-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 那一半。

3.3 水质恶化的后果

RAS 水质管理的核心是"稳定"——参数在安全范围内的波动远比绝对值更危险:

第 4 章氮循环与碳循环

理解 RAS 中的氮循环是工艺设计的基础。所有氮素来源于饲料蛋白, 经过一系列生物化学转化, 最终以 N₂ 气体形式离开系统。

4.1 饲料蛋白到氮的转化

鱼类摄食后, 饲料蛋白被消化吸收, 其中:

iRAS 中 TAN 产生量的计算公式:

TAN (kg/d) = 日投饵量 × 蛋白含量 × 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 压着。

4.2 硝化作用

硝化是 RAS 中最关键的生物过程, 由两类自养菌在有氧条件下完成:

NH₄ + 1.5 O₂ → NO₂ + 2H + H₂O (Nitrosomonas)
NO₂ + 0.5 O₂ → NO₃ (Nitrobacter)
总反应: NH₄ + 2O₂ → NO₃ + 2H + H₂O

从工程角度, 硝化的三个关键化学计量关系:

在 iRAS 中, 硝化耗氧由 BF 粗孔曝气独立供应, 不占用鱼池主增氧的额度。这一O₂ 按位置分配原则避免了传统计算中常见的氧气重复计算问题。

📌 v1.5+ 公式订正
稳态下 NO₃ 产生速率 ≈ TAN 产生速率 × 1.0 (近似 100% 硝化), 不是 × η_bio (70%)。 物理原因: 稳态质量守恒 — 鱼产 TAN = BF 累积硝化 + 换水排出 TAN, 换水排出通常 < 1% 鱼产 TAN, 所以"全部 TAN 都变 NO₃"在工程精度内成立。旧版本 (v1.0-v1.4) 用 × η_bio 是历史 bug, 导致 NO₃ 稳态浓度低估 30%, 反硝化设备容积/甲醇用量偏小。

4.3 反硝化作用

反硝化在缺氧条件下, 由异养菌利用外加碳源 (甲醇) 将 NO₃ 还原为 N₂ 气体:

6 NO₃ + 5 CH₃OH → 3 N₂↑ + 5 CO₂ + 7 H₂O + 6 OH

反硝化的关键化学计量:

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 倍)。

📌 v1.1 反硝化进水 NO₃ 取 BF 出口浓度 (P&ID 规范), 不再用鱼池浓度。影响实测约 11.5%。

4.4 碱度消耗与回收

碱度净消耗 = 硝化消耗 − 反硝化回收 − 换水补偿
= TAN_硝化 × 7.14 − NO₃_反硝化 × 2.8 − 换水量 × 源水碱度
     ↑ 被硝化的 TAN, 不是产生的 TAN   ↑ 工程值 denitriAlkRecovery, 非理论 3.57

如果净消耗 > 0, 需要投加碱源维持 pH:

NaHCO₃ 投加量 (kg/d) = 碱度缺口 / 0.595

其中 0.595 是 NaHCO₃ 到 CaCO₃ 的换算系数 (50/84 = 0.595)。

📌 v1.1 换水补偿用 V_total (系统总水体), 不是 V_tank。换水量自动 +50% 左右, 碱度补偿增大, NaHCO₃ 投加略减。

反硝化不仅降低 NO₃, 还能回收碱度、减少 NaHCO₃ 用量。一个设计良好的反硝化支路可以减少 30-50% 的碱度投加量。

4.5 碳酸盐平衡: pH / CO₂ 物种分布 / 非离子化氨 v1.9 新增

鱼池 pH 不是一个独立的自由参数 — 它由碳酸盐系统确定。总碱度 TA (由 NaHCO₃ 投加维持设定值) 与溶解 CO₂ (来自呼吸 + 硝化产) 一起决定 pH、CO₂ / HCO₃⁻ / CO₃²⁻ 物种分布、非离子化 NH₃ 占比 (剧毒) 以及方解石饱和度 Ω。iRAS v1.9 对每个阶段调用专门的碳酸模块求解此平衡。

📌 v1.9 物理建模升级
v1.7 之前 iRAS 只输出碱度需求 (基于 7.14 g CaCO₃/g N 硝化耗碱), 不计算 pH / NH₃ 物种 / 缓冲强度。这使得工具无法识别"低 pH 抑制硝化"或"高 NH₃ 毒性"等关键工况问题。 v1.9 引入完整碳酸盐平衡求解, 平衡常数全部来自国际权威数据库 PyCO2SYS 1.8.3, 经 jsdom 验证中英文版输出完全一致 (max|ΔpH| = 1e-5)。

4.5.1 控制方程

给定 TA 和溶解 CO₂, 碳酸模块求解质子平衡方程并反推完整物种分布:

TA = [HCO₃⁻] + 2[CO₃²⁻] + [B(OH)₄⁻] + [OH⁻] − [H⁺]

解离常数:

内部求解在 SWS (Seawater Scale) 标度上进行, 但报告的 pH 转换到 free (自由 / 浓度) 标度。两者关系:

S = 0 (淡水) 时: pH_free = pH_sws = pH_nbs (NBS 探头读数)
S > 0 (海水) 时: pH_free > pH_sws (差异 0.05-0.15 pH 单位)

用 free 标度报告 pH 的优势: 避免 fH 修正导致的"NBS 探头在淡水中读数偏高 0.15"问题, 直接对应淡水探头读数。

4.5.2 非离子化氨 NH₃ (剧毒)

溶解氨以两种形式共存: 离子化 NH₄⁺ (无毒) + 非离子化 NH₃ (剧毒)。两者占比由 pH 和 T 决定:

fNH3 = [NH₃] / TAN = K_a / (K_a + [H⁺])

典型数值 (T = 15°C 三文鱼工况):

pHfNH3 (%)TAN = 1 mg/L 时 NH₃-N
6.50.05%0.5 μg/L
7.00.16%1.6 μg/L
7.50.50%5.0 μg/L
8.01.55%15.5 μg/L
8.54.66%46.6 μg/L

工程意义: 同样的 TAN 浓度, pH 从 7.0 升到 8.0, NH₃ 浓度增加近 10 倍。这是为什么高 pH 工况 + 高 TAN 工况是急性死亡风险, 而 v1.7 之前 iRAS 无法识别此风险。

鱼种长期暴露 NH₃-N 上限 (基于 Fivelstad / Calabrese 等):

苗种期对 NH₃ 更敏感, 通常取上述限值的 50%。

4.5.3 缓冲强度 β 与方解石饱和度 Ω

Van Slyke 缓冲强度 β 定义为: 维持给定 pH 变化所需的碱度变化量。

β = dTA / d(pH) (mg/L CaCO₃ per pH 单位)

工程意义: β 越大, 碱度抗酸冲击越稳, 投喂后 pH 波动越小。典型值:

工况β (mg/L CaCO₃ per pH)评价
淡水 苗种期 (TA=150)350中等
淡水 罗非鱼成鱼 (TA=150)350中等
海水 三文鱼成鱼 (TA=150)477较强 (含硼酸盐)
商业 Atlantic Sapphire 风格 (TA=237)700+强 (推荐高密度工况)

方解石饱和度 Ω (仅海水):

Ω = [Ca²⁺][CO₃²⁻] / K_sp

Ω = 1 为饱和, Ω > 1 过饱和有 CaCO₃ 沉积风险, Ω < 1 不饱和。海水 RAS 典型工况 Ω = 0.5-1.5, 接近饱和但避免沉积堵塞设备

4.5.3b 氮物种的建模边界: 为什么没有亚硝酸盐 v2.5

iRAS 的氮链只有 TANNO₃⁻ 两个态, 不含亚硝酸盐 NO₂⁻。 这是稳态设计口径的固有边界, 不是待补的功能缺口 —— 区别很重要, 下面说清楚。

硝化是两步反应, 由两类菌分别完成:

NH₄⁺ --(AOB 氨氧化菌)--> NO₂⁻ --(NOB 亚硝酸氧化菌)--> NO₃⁻

成熟菌群的稳态下, 第二步远快于第一步, NO₂⁻ 只是一个浓度极低的中间态, 把它显式建模对稳态设计结果没有影响 —— 这正是 iRAS 把两步合并为 TAN → NO₃⁻ 的依据, 与工程上按 TAN 负荷选填料容积的做法一致。

NO₂⁻ 真正危险的时候恰恰是非稳态: 系统启动培菌期 (AOB 先于 NOB 建立)、 投喂量阶跃、换水/换料/用药造成的菌群冲击 —— 此时两步失衡, NO₂⁻ 出现尖峰, 是 RAS 最主要的急性失效模式之一。此外 NO₂⁻ 的毒性形态 HNO₂ 会自抑制 NOB, 形成正反馈, 使尖峰更陡。

⚠ 边界声明
iRAS 是稳态设计工具, 原则上不表达任何瞬态过程。 NO₂⁻ 尖峰、DO 骤降、投喂脉冲后的 TAN 波动, 属于同一类现象 —— 它们需要的是动态 (时间步进) 模型, 而不是在稳态解上多加一个物种。 在稳态口径下补一个 NO₂⁻ 浓度, 只会得到一个恒定的小数字, 既不反映风险、 又会让使用者误以为工具已经涵盖了启动期, 比不给更危险。

使用者须知: 本工具算出的水质结果只适用于菌群成熟后的稳定运行期。 启动期的 NO₂⁻ 管理 (延长培菌、降低初始投喂、提高换水、加盐抑制 NO₂⁻ 毒性) 必须另行按运行规程处置, 不在本工具的设计包线内。第 22 章的启动期运行建议 (培菌 4–8 周、TAN 处理能力从 0 逐步爬升) 是对这一边界的运行侧补充。

已具备的条件: v1.9 之后模型有了 pH 与 [H⁺], 因此 HNO₂ 占 NO₂⁻ 的比例 (pKa ≈ 3.15) 在数学上几乎是免费的。但这只是一个分数, 不是一个模型 —— 要表达 NO₂⁻ 尖峰, 需要 AOB/NOB 两步动力学 + 时间步进 + 菌群量状态变量, 那是另一个量级的工作, 且需要标定数据。列为架构级立项, 不在补丁版范围。

4.5.4 两种 pH 控制策略

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 以匹配国际商业工程实际。

4.5.5 与 PyCO2SYS 的验证

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₃ 占比 fNH31.5×10⁻¹⁶ (机器精度)
方解石饱和度 Ω0.006%

这是实验室级精度, 可用于学术研究和工程设计。

4.5.6 稳态 vs 瞬态

本章求解的 pH / NH₃ / CO₂ 都是日均稳态 (慢性暴露) 值, 不是投喂瞬时峰值。投喂后短期瞬态 (2-4h 窗口) 由:

与 DO 不同 — DO 必须按投喂瞬时峰值选型 (避免急性窒息), 而 CO₂/pH/NH₃ 按日均稳态合规即可 (慢性暴露阈值)。

📌 工程使用建议
1. 三文鱼项目: 海水成鱼期建议碱度提升到 200-237 mg/L CaCO₃ (匹配 Atlantic Sapphire / Salmon Evolution 商业实际), 用"持目标 pH"模式控 pH = 7.0
2. 温水鱼 + 高密度 (罗非鱼 70+ kg/m³, 对虾): pH 容易偏高 (7.5-7.8), NH₃ 风险高, 务必检查工具输出 NH₃-N 是否超鱼种限值
3. 苗种期: 限值取成鱼期的 50% (鱼种敏感期), 工具自动收紧
4. 淡水低密度: 默认碱度 150 mg/L 够用, 用"持碱度"模式
5. 反硝化支路: 部分恢复硝化耗碱, 减少 NaHCO₃ 投加 (v1.6 加入), 但不改变 pH 平衡 (碱度变化经碳酸盐重新分配)
第 二 部 分
工程设计方法

第 5 章养殖规模设计

RAS 工程设计的第一步是从年产量目标反推系统规模。这决定了后续所有水处理设备的选型依据。

5.1 Little's Law 与稳态建模

iRAS 采用连续错峰养殖模式建模: 养殖场分批错峰投苗, 使每天都有成鱼出塘。稳态下, 系统内每个阶段同时存在不同大小的鱼群。

适用 Little's Law (排队论基本定理):

L = λ × W

其中 L = 系统内平均数量 (尾), λ = 到达速率 (尾/年), W = 停留时间 (年)。

关键: Little's Law 应用于"尾数"而非"质量"。一尾三文鱼从 0.1g 长到 5000g, 体重变化 5 万倍; 如果用质量, 会严重高估上游阶段的存塘量。

📌 v1.1 修正了稳态在塘公式, 加入 mortality 衰减: N_steady = N_inflow × (months / 12) × (1 − mort/2)。mortality 修正反映线性死亡假设下的平均尾数 (高 mort 阶段如苗种期偏高 8-11%)。

5.2 尾数流守恒与损耗率递推

多阶段 RAS 的尾数从最后阶段向前递推, 每一级通过损耗率放大:

年出塘尾数 = 年产量 (kg) / 出塘个体重 (kg)
本级进塘尾数 = 下级进塘尾数 / (1 − 本级损耗率)

损耗率包含死亡、淘汰、逃逸, 苗种期通常最高 (10-30%), 成鱼期最低 (2-5%)。

5.3 投饵量: 三套口径 v1.1 重大修正

v1.0 用 feedDesign = feedMax × peakFactor 算所有"日产污染物", 偏大约 17%。v1.1 严格分离三个时间尺度:

① 日峰值投饵量 (feedMax) — 负荷计算基准

feedMax = biomass × feedRate (kg/d)

biomass 是稳态存塘量, feedRate 是阶段末最大日投饵率。污染物日产量 (TAN/TSS/DOM/CO₂) 都按 feedMax 算 (不含 peakFactor)。

② 小时峰值 (xxxPeakHourly) — 设备选型基准

xxxPeakHourly = xxxDaily / 24 × peakFactor

peakFactor 物理意义: 代谢污染物小时峰值/全日均速率, 默认 1.5。快动力学设备 (鱼池增氧、BF 风机) 按 xxxPeakHourly × safety 选型。

③ 全周期日均 (feedAvg) — OPEX 年化基准

feedAvg = yearGrowth × FCR / 365 (kg/d)

其中 yearGrowth 是阶段年鱼肉增重, FCR 是阶段饲料系数。

峰均比校验 峰均比 = feedRate / (feedAvg/biomass)。如果峰均比 < 1.1, 设备可能选型偏小, iRAS 会发警告。

第 6 章污染物负荷计算

确定了投饵量后, 即可计算各类污染物的日产生量。v1.1 严格区分日量、小时峰值、日均三套字段。

6.1 TAN 产生量

TAN_Daily = feedMax × protein × tanCoef
TAN_PeakHourly = TAN_Daily / 24 × peakFactor
TAN_DailyAvg = feedAvg × protein × tanCoef

其中 tanCoef 默认 0.092 (Timmons & Ebeling 2010), 海水肉食鱼略高 (0.10-0.11)。

6.2 TSS / DOM 产生量

TSS_Daily = feedMax × 0.30
DOM_Daily = feedMax × 0.10

6.3 O₂ 需求三部分 v1.1 按位置分配

v1.1 把鱼生理耗氧按物种 + 温度自动算 (取代 v1.0 的 0.25 一刀切)。

O₂ 来源计算公式供应设备说明
① 鱼生理耗氧feedMax × o2FishFactor鱼池主增氧物种特性 + Q10 自动算
② 硝化菌耗氧TAN_Daily × 4.57BF 粗孔曝气NH₄→NO₃ 化学计量
③ 异养菌耗氧feedMax × o2DOMfactorBF 粗孔曝气v1.1 默认 0.10 (Boyd 2018)
关键设计原则 鱼池主增氧 (①) 和 BF 曝气 (②+③) 是两套独立系统, 不重叠。v1.0 之前常把三项合并算总量, 然后全部由鱼池增氧供应, 导致 BF 缺氧或鱼池增氧过度设计。

6.4 CO₂ 产生量

CO₂_Daily = o2FishDaily × 1.375

其中 1.375 = 44/32, 是 CO₂ 和 O₂ 的摩尔质量比 (RQ ≈ 1)。CO₂ 只按鱼虾生理耗氧计算, 不含硝化耗氧 (硝化反应不产生 CO₂)。

第 7 章精确循环方程

这是 iRAS 的核心计算引擎。传统 RAS 设计常用近似加法公式 C = Δ / Ση 估算稳态浓度, 但当系统包含多个串联和旁路处理单元时, 加法公式会产生显著误差。iRAS 采用精确乘法循环方程, 确保质量守恒严格成立。

7.1 质量守恒推导

考虑一个稳态循环系统: 水从鱼池流出, 经过 n 个处理单元后回到鱼池。每个处理单元有各自的"通过率" (1 − η)。

设:

稳态条件:

C_out = C_in + Δ (鱼池内产生增量)
C_in = C_out × R (经全部处理后回到 C_in)

联立求解:

C_out = Δ / (1 − R) (鱼池出水, 设备选型依据)
C_in = Δ × R / (1 − R) (回水, 最低浓度)

7.2 总通过率 R

R = Π(1 − η) × (1 − dilution)

R 越小 (总去除率越高), C_out 越低, 水质越好。

7.3 串联 vs 旁路建模

串联通过率 (RDF / BF / CO₂ 脱气)

全流量通过, 注意是乘法:

串联通过率 = (1−η_rdf) × (1−η_bio) = 0.25 × 0.30 = 0.075

即总去除率 92.5%。加法 0.75 + 0.70 = 1.45 > 100% 物理上不可能。

旁路通过率 (蛋分 / AOP / 反硝化)

以蛋分为例, 旁路流量比 α=20%, 单次去除 η=70%:

系统等效去除率 η_sys = α × η_single = 0.20 × 0.70 = 14%

物理含义: 80% 的水不经处理 + 20% 的水去除了 70% → 混合后整体去除 14%。

7.4 闭合验证

精确循环方程的优美性质: 沿程浓度递减后, 最终回水浓度恰好等于 C_in。iRAS 在每次计算后内部验证此闭合条件 (误差 = 0)。

7.5 各参数的 R 计算路径

参数处理路径R 表达式
TANBF 硝化 + 换水(1−η_bio)(1−d)
TSSRDF + 蛋分(旁路) + 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 = η_塔 + η_曝气
GeosminAOP(旁路) + 换水(1−η_aop_sys)(1−d)
⚠ 两条本章方程不适用的情形 —— 设计时最容易搞混的地方
(1) 空气曝气模式下的 DO 不走本章方程。 本章的推导前提是"水从鱼池流出 → 经处理 → 回到鱼池", 因此存在「进池浓度」这个量。纯氧拓扑符合(氧在主管路上加), 但空气曝气把气直接打进鱼池, 增氧与耗氧在同一控制体内同时发生, 根本不存在 进池浓度 —— 池水 DO 由「传质速率 = 耗氧速率」的池内质量平衡决定, 与循环流量无关。 实测 turnover 1→4(流量放大 4 倍), air 模式 DO 逐位不动, 而 o2 模式从 4.77 涨到 9.40。 详见 15.3 与 15.3b。
(2) CO₂ 的 η 在 air 模式下含两项。 曝气气泡同样吹脱 CO₂ —— 开塔时也在吹, 气泡不会因为旁边多了一座塔就不带走 CO₂。 v2.3.3 之前该项只在关塔时求解, 于是 air+开塔 工况下这部分 CO₂ 在模型里凭空消失: 水侧不记移除、室侧不记入室。现 η_co2 = η_塔 + η_曝气(两者都对同一池内浓度成正比, 移除速率可加), 且曝气移除的那份按 sink=INDOOR 全部计入车间。⚠ η_co2 可能 > 1: 它是"等效单程移除系数", >1 只表示移除快于一个循环周期, 稳态式 C = Δ/(1−R) 仍成立。
📌 v1.1 修复 AOP DOM 系数: v1.0 误把 90% geosmin 系数当 DOM 去除率, v1.1 用 aopDOMRemoval 默认 5% (可调 5-15%)。

7.6 dilution 敏感性 v1.1 重要发现

dilution 在不同参数中的影响差异巨大:

参数 / 工艺配置η_totaldilution 是否主导?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 系统体积建模 + 换水率口径修正的关键意义。

第 8 章系统体积建模 v1.1 新章 + v1.3.x 增 S-101

📌 v1.1 本章是 v1.1 全新内容。v1.0 把整个系统简化为"鱼池水体 V_tank", 忽略了工艺水体 (BF/RDF/管路等)。v1.1 引入完整 V_total = V_tank + V_process 建模。v1.3.x 在 V_process 中加入集水池 V_sump。

8.1 为什么要建模工艺水体?

传统 RAS 设计常把整个系统简化为"鱼池水体", 忽略了:

这些工艺水体合计 V_process 通常占 V_tank 的 30-60%, 是不可忽略的。

8.2 V_process 各部分计算公式

工艺单元计算公式物理依据
V_RDF v1.5+ 修正Q × rdfHRT_min / 60RDF 集水池 HRT, 默认 rdfHRT_min = 0.5 分钟 (v1.6 中位, 兼顾紧凑与缓冲); 紧凑型 0.3 (YUTANK/Hydrotech 工业实测 18s); 设计院传统 1.5-2 min (含外置缓冲池)
V_BF (含填料水) v1.5+ 修正bioVolume / fillRatiobioVolume 是填料净体积, fillRatio 默认 0.5 (Rusten 2006 工业惯例): V_BF = 2 × bioVolume; fillRatio 0.7 (高密度): V_BF = 1.43 × bioVolume
V_skimskimmerVolume蛋分塔水容积 (已是水量)
V_UV5 m³ (固定)UV 流通式, 内部水量极小
V_AOPaopVolumeAOP 反应池水容积 (已是水量)
V_denitridenitriVolume反硝化反应器
V_co2 v1.5+ 修正degasArea × co2VolFactor脱气塔水容积, 默认 co2VolFactor = 0.7 (集水 0.5m + 填料湿水 0.2m, 国内中型项目); 可调 1.2 (1m 集水 + 0.2m 填料水, 鲑鱼场深塔)
V_aeratorQ × 0.5 / 60增氧锥 HRT ≈ 30s
V_sump v1.3.xclamp(Q/30, 20, 200)集水池, 工程惯例
V_pipesV_tank × 5%管路+集水井+缓冲池, 工程经验
📌 v1.5+ V_BF 推导
RAS 体积建模时, BF 池总容积 (含填料 + 水) 才是稳态稀释的有效水量, 不只是填料净体积。 若 fillRatio = 50% (典型 MBBR), 填料净体积 100 m³ 对应池总容积 200 m³ (因 50% 是填料、50% 是水间隙)。 旧版 × 1.3 是经验估计 (假设填料 35% + 水 65%), 但工业上 fillRatio 是设计变量, 应该用代码统一。

8.3 V_total 与稳态浓度

总系统体积:

V_total = V_tank + V_process

对稳态浓度 C_out = Δ/(1−R) 影响:

因此 V_total 影响稳态浓度的程度取决于参数处理工艺:

8.4 换水率口径 v1.1 改为 V_total

用户填的"exchangeDaily 5%/d"在不同口径下含义不同:

口径含义实际换水量使用方
V_tank (v1.0)鱼池每天换 5%V_tank × 5%国内传统养殖户
V_total (v1.1)系统总水体每天换 5%V_total × 5% (多 50%)Timmons 教科书 / 国家海水鱼体系 / 大型工业项目
📌 v1.1 改为 V_total 是物理一致性优先。v1.0 老方案加载到 v1.1 后, 换水量自动 +50% 左右, 仅靠换水稀释的参数 (无反硝化的 NO₃, 无 AOP 的 Geosmin) 浓度自动下降 ~37%。这是物理修正后的真实值, 不是 bug。

8.5 三文鱼成鱼 1000t/yr V_process 实例

工艺单元体积 (m³)
鱼池水体 V_tank3,385
BF 含水570
CO₂ 脱气350
RDF 集水338
集水池 S-101 v1.3.x200
管路 + 缓冲169
反硝化129
增氧锥85
蛋分塔74
AOP 反应池17
UV5
V_process 合计1,938 (V_tank 的 57%)
V_total = V_tank + V_process5,323
第 三 部 分
各处理单元设计

第 9 章固液分离 (转鼓微滤机 RDF) v1.7 系统排水重构

9.1 原理

转鼓微滤机 (RDF) 是 RAS 中的第一道防线, 通过 60-90 μm 不锈钢筛网物理拦截水中的悬浮固体。工作原理: 养殖水从转鼓内侧流向外侧, 固体颗粒被拦截。当筛网两侧压差达到设定值时, RDF 内嵌反冲机构自动启动反冲洗 — v1.7 起反冲泵不再作为独立设备列项, 因为工程实际中所有商用 RDF (Hydrotech / Faivre 等) 整机出厂均含反冲泵, 反冲水绝大部分经污泥沉淀池回循环 (Sharrer 2010 实测 95-98% 清液回流)。

9.2 设计参数

参数典型值说明
筛网孔径60-90 μm越小去除率越高, 但易堵塞
TSS 去除率60-90%iRAS 默认 75%
处理流量循环流量 × safetyRDFv1.1: 默认 1.10
RDF 集水池 HRT0.1-5 miniRAS v1.6 默认 0.5 min (中位)

9.3 计算公式

RDF 处理流量 = 循环流量 × safetyRDF (m³/h)
RDF 集水池 V = 流量 × rdfHRT_min / 60 (m³)

9.4 系统排水 (v1.7 重构)

v1.6 之前, iRAS 工艺面板有 "RDF 反冲(%) 2%" 输入, 但 4870 m³/d ÷ V_total = 101%/d 物理荒谬 (远超合理换水率 1-5%/d)。问题根源: 把"反冲管瞬时分流比"误当作"穿越系统边界的排水比"。

v1.7 全面清理这个语义混淆:

系统排水流量 (m³/d) = V_total × exchangeDaily (与"换水率"定义一致, 不再依赖反冲)
系统排水 TSS (kg/d) = load.tssDaily (质量守恒, 含污泥固相)
系统排水 TAN_eff (mg/L) = C_tank (溶解态稳态浓度)
系统排水 NO₃_eff (mg/L) = C_tank (溶解态稳态浓度)
⚠️ TSS 口径说明
iRAS 输出的"系统排水 TSS"是沉淀池入口浓度 (含污泥, 质量守恒口径), 不是污水管口浓度。 1000 t 三文鱼工况下 TSS ≈ 3257 mg/L, 是合理的沉淀池入口悬浮固体浓度 (典型 RAS 1000-5000 mg/L 范围)。 不可直接对照 GB 8978 (污水管口标准, 一级 70 mg/L)。沉淀池设计 + 上清液处理由污水 工程单独完成, iRAS 边界止于"沉淀池入口"。

9.5 常见故障与运维

故障现象可能原因处理措施
出水 TSS 偏高筛网破损 / 孔径变大更换筛网 (寿命 2-3 年)
反冲频繁启动进水 TSS 过高 / 筛网堵塞清洗筛网; 检查投饵量
排污水清澈反冲喷嘴堵塞 / 水压不足清洗喷嘴; 检查 RDF 内嵌反冲机构
转鼓不转电机故障 / 链条断裂检查电机和传动

运维要点: ① 每周检查筛网完整性; ② 每月清洗反冲喷嘴; ③ 海水系统注意筛网腐蚀。

第 10 章生物过滤 (MBBR 生物滤池)

10.1 硝化原理

MBBR 是 RAS 最关键的处理单元。HDPE 悬浮填料 (比表面积 500-800 m²/m³) 在曝气搅动下悬浮于水中, 表面附着硝化菌群, 将有毒的 TAN 氧化为低毒的 NO₃。硝化是缓慢的自养过程, 菌群建立需 4-8 周。

10.2 容积去除率 (VTR) 与温度修正

VTR(T, S) = VTR₂₀ × θnit(T−20) × fsal
  fsal = max(1 − 0.01 × S, 0.3)  (S = 盐度 ‰)

BF 池填料容积 = TAN 负荷 ÷ VTR(T, S)

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 内置的是通用工程取值, 用于方案比选与量级估算;具体项目应以填料厂家实测数据或设计单位参数覆盖默认值, 不应直接作为施工图依据。

10.2.1 三条必须知道的模型限制

① 未做 TAN 浓度修正。 硝化速率在高 TAN 时呈零级(速率恒定),低 TAN 时转为一级(速率随浓度下降)。 文献与厂家给出的最大速率通常在氨饱和条件下测得, 而真实 RAS 池内 TAN 常低于 1 mg/L,处于一级动力学区。 本模型只做温度与盐度修正,不随 TAN 浓度衰减—— 这意味着在低 TAN 工况下算出的 BF 池容积可能偏小。 保守设计应下调 VTR₂₀,或依靠 safetyBio(默认 1.15)吸收这部分不确定性。

② 未区分氨限制与氧限制。 θ 描述的是温度对生物活性的影响,但该影响的强弱取决于反应受什么限制: 氨限制时温度效应显著,氧限制时温度效应明显减弱。 本模型统一使用单一 θ,在低温 + 供氧不足的工况下会高估温度惩罚,把 BF 池算得偏大。 若生物滤池曝气不足或填料过厚,应据实调低 θ。

③ 低温外推需谨慎。 单一 Arrhenius 系数在很低的温度下会偏离实测。iRAS 内置鱼种最低 tempOpt 为 12°C(三文鱼苗种), 在常规冷水鱼范围内可用;若用于更低温物种或北欧低温工况,需另行校核。

10.2.2 温度修正对照表

温度 °C修正系数 θ^(T−20)VTR kg/(m³·d)典型物种
100.3860.193冷水鱼苗种
120.4670.234三文鱼苗种
150.6210.310三文鱼成鱼
160.6830.341大菱鲆全周期
201.0000.500基准
251.6110.805加州鲈 / 鳜鱼
282.1441.072罗非鱼
302.5941.297对虾

盐度修正:fsal = max(1 − 0.01 × S, 0.3)。盐度 30‰ 时硝化效率降至 70%。 下限 0.3 是防零保护,不代表物理极限。

为什么冷水鱼的 BF 池特别大
三文鱼成鱼 15°C 的 VTR 只有 20°C 基准的 62%,而对虾 30°C 达到 259%——相差 4.2 倍。 温度以指数形式作用在一个直接决定池容的速率上,这是同产量下冷水鱼 RAS 生物滤池 造价远高于温水鱼的主要原因。做冷水鱼项目时,BF 池的容积与造价对水温设定特别敏感。

10.3 填料体积计算

BF 填料体积 = TAN_Daily × safetyBio / [VTR₂₀ × θ^(T−20) × f_sal]

10.4 BF 粗孔曝气 v1.1

BF O₂ = TAN × 4.57 + feedMax × o2DOMfactor
风量 = O₂_Peak × safetyBFblow / (RHO_STD_AIR × F_O2_MASS × SOTE) SOTE=8%
v2.4: 1.293 × 0.232 = 0.300 kg O₂/Nm³ (标准状态 Nm³/h 口径, 见 15.6b); v2.3.3 及以前为 1.2 × 0.23 = 0.276
风机功率 = 风量(m³/s) × 50000 / (0.60 × 1000) (50kPa, η=0.60)
📌 v1.1 风机效率从 0.55 提到 0.60。o2DOMfactor 默认 0.10 (v1.0 偏低 0.05, Boyd 2018 实测)。

10.5 启动期管理

BF 启动需要 4-8 周, 启动期管理不当会导致 TAN/NO₂ 飙升, 大量死鱼。

启动步骤

注意事项

10.6 常见故障

故障原因措施
TAN 突然升高BF 过载/停电/pH 过低减少投饵; 补碱度; 检查曝气
NO₂ 持续偏高Nitrobacter 不足/pH<6.5补碱度; 降低负荷
填料沉底曝气不足/气管堵塞检查风机和气管
出水浑浊生物膜脱落正常现象

第 11 章蛋白分离器

11.1 原理

蛋白分离器利用泡沫分离原理去除 DOM 和细颗粒 TSS (<30μm)。空气或臭氧以微细气泡注入接触塔, 表面活性有机物吸附在气泡表面, 随泡沫溢出。

11.2 空气 vs 臭氧

参数空气模式臭氧模式
DOM 单次去除率30-50% (默认 40%)60-80% (默认 70%)
TSS 单次去除率~40%~40%
额外效果杀菌+脱色+氧化
成本高 (臭氧发生器)
海水风险溴酸盐 BrO₃ (盐度>5‰需控制)
📌 v1.1 蛋分 TSS 去除率 skimmerTSSEff 开放为可调参数 (默认 40%)。

11.3 设计计算

系统等效去除率 = 流量比 × 单次效率 = 0.20 × 0.70 = 14%
蛋分容积 = 旁路流量 (m³/h) × HRT (min) / 60 × safetySkimmer

HRT 默认 2 min (Sanders Helgoland LE-315 商业实测 1.8-2.2 min, ScienceDirect 2023)。物理: DOM 吸附在气泡表面是秒级反应, HRT 主要保证泡沫稳定形成, 不是反应时间, 长 HRT 无收益。用户可在 1.5-4 min 范围调整。

臭氧需求 = feedMax × 0.010 g O₃/g 饲料

11.4 常见故障

故障原因措施
不产泡沫DOM 太低/气量不足正常 (新水); 增加气量
泡沫太湿气量过大/液位过高减小气量; 调低液位
臭氧泄漏密封不严检查; 加活性炭尾气破坏
溴酸盐过高海水中臭氧过量降低剂量; 监测 BrO₃

第 12 章反硝化反应器

12.1 原理

在缺氧条件下 (DO < 0.5 mg/L), 异养菌利用甲醇将 NO₃ 还原为 N₂ 气体。这是 RAS 中唯一能真正"去除"氮素的过程。

6 NO₃ + 5 CH₃OH → 3 N₂↑ + 5 CO₂ + 7 H₂O + 6 OH

12.2 设计计算

旁路流量 = 循环流量 × 流量比 (默认 2%)
系统去除率 = 流量比 × 单次效率 = 2% × 80% = 1.6%
VDR(T) = VDR₂₀(0.8 kg N/(m³·d)) × 1.08^(T−20)
反硝化容积 = NO₃去除量 × safetyDenitri / VDR(T)
甲醇 = NO₃去除量 × 2.47 × methanolSafetyFactor(默认 1.3)= × 3.21 kg/d
碱度回收 = NO₃去除量 × 2.8 kg CaCO₃/d ← 工程值, 非理论值 3.57
⚠ 碱度回收系数: 2.8 是工程值, 3.57 是理论值 —— 本节旧文写的是后者。
3.57 g CaCO₃/g NO₃-N 由化学计量式直接推出(每还原 1 mol NO₃⁻ 产 1 mol OH⁻), 但工程实测普遍低于理论值: 部分碱度被反硝化菌自身合成消耗, 且旁路里总有一部分水未完全缺氧。 模型取 denitriAlkRecovery = 2.8
⚠ 本项目的物质平衡断言组当年建立时, 外部核算连错三次, 三次都是口径问题, 其中一条正是"碱度回收系数用了理论值 3.57 而非工程值 2.8"。 ⇒ 凡引用系数, 先问一句: 这是化学计量给的上限, 还是工程实测的取值?
另: 甲醇 2.47 是化学计量比, 模型再乘 methanolSafetyFactor 1.3 得 3.21 g/g, 与文献中位一致 —— 这里的安全系数不是保守裕量, 而是把化学计量比校到实测口径。

12.4 换水率、NO₃ 与反硝化的耦合 v1.9.2 新增

反硝化配多大,取决于换水率能带走多少硝酸盐。这两个参数不能孤立设定, 但用户常常只调其中一个,然后对 NO₃ 结果感到意外。本节说明 iRAS 的默认取向。

12.4.1 iRAS 的换水率是「极致节水」取向

换水率用 %/日表示不便于横向比较,产业通用口径是单位投饵补水量(m³/kg 饲料)。 iRAS 各鱼种默认值折算如下:

鱼种换水率 %/d单位投饵补水量 m³/kg 饲料
鳗鲡60.055
罗非鱼60.060
大西洋鲑40.092
大菱鲆40.105
加州鲈50.106
石斑鱼60.123
鳜鱼60.165
对虾80.216
产业口径m³/kg 饲料
极集约 RAS0.1 – 0.3
常规商业 RAS0.3 – 1.0
半流水> 3
iRAS 的默认值全部压在产业下沿,鳗鲡、罗非鱼、大西洋鲑三个鱼种甚至低于极集约 RAS 的下限。 这是刻意的设计取向,不是缺陷——国内 RAS 项目普遍以节水为核心卖点, 在缺水地区、内陆项目、或有严格排放限制的场址,节水本身就是立项理由。

12.4.2 代价:硝酸盐排不出去

稳态下 NO₃ 的去除只有两条路:反硝化换水稀释。补水强度低意味着后者几乎不起作用。

无反硝化时:NO₃-N ≈ 日产氮量 ÷ (系统水体 × 日换水率)

以 1000 t/yr 大西洋鲑成鱼期为例(系统水体 5178 m³、TAN 日产 82.8 kg/d):

反硝化旁路比例反硝化流量 m³/h稳态 NO₃-N mg/L
0%(不设反硝化)0414
0.5%5170.2
1%10238.5
2%(v1.9.2 默认)20320.2
3%30513.7
10%(v1.9.2 前的旧默认)10154.2
⚠ 在 iRAS 的默认换水率下,反硝化不是可选项而是必需项
denitriFlowPct 调到 0 时模型给出的 NO₃-N 414 mg/L 是真实后果,不是算错。 产业上「无反硝化 RAS」通常只有 50–150 mg/L,是因为它们的补水强度高 3–10 倍—— 用换水把硝酸盐冲走,而不是用反硝化把它还原掉。

两条路线的取舍:节水路线省水费与尾水处理费,但必须投反硝化(增加 CAPEX、甲醇消耗, 且缺氧反应器控制不当会产 H₂S);高换水路线设备简单,但水费、尾水处理与补水加热能耗都上去了。 iRAS 默认走前者,做具体项目时应按场址的水资源与排放条件重新权衡。

12.4.3 旧默认 10% 为何改成 2%

v1.9.2 之前 denitriFlowPct 默认 10%,对应稳态 NO₃-N 仅 4.2 mg/L。三点问题:

改为 2% 后对应反应器 203 m³/h、NO₃-N 20.2 mg/L,落在「配了反硝化的 RAS」的合理区间。

12.3 常见故障

故障原因措施
NO₃ 不降甲醇不足/DO 过高增加甲醇; 检查缺氧 DO<0.5
出水发白臭味甲醇过量减少甲醇
pH 过高反硝化产碱过多减少流量比

运维要点: ① 甲醇按 NO₃ 实时调节; ② 甲醇属易燃危化品, 单独储存; ③ 反硝化器启动比 BF 快 (1-2 周)。

第 13 章UV 紫外线消毒

13.1 原理

UV-C (254 nm) 穿透微生物细胞壁, 破坏 DNA 胸腺嘧啶二聚体, 使其丧失复制能力。优点: 无化学残留, 不改变水质, 杀菌快。

13.2 Chick-Watson 模型

灭活率 = 1 − exp(−k × D)
病原体k (cm²/mJ)D=40 灭活率建议剂量
细菌 (E.coli, 弧菌)0.10-0.2099.7%30-40 mJ/cm²
鱼类病毒 (IPNV, IHNV)0.05-0.1086-98%60-100 mJ/cm²
原虫 (小瓜虫包囊)0.15-0.2599.7-99.99%30-40 mJ/cm²
水霉孢子~0.3099.999%20-30 mJ/cm²

13.3 UV 功率公式 v1.1

UV 功率 (W) = 处理流量 × UV 剂量 × 0.85 × safetyUV
📌 v1.1 系数从 0.75 改为 0.85 (USEPA UVDGM 中位); safetyUV 是设备额定功率裕度 (灯管老化), 不是剂量增加。

13.4 运维

① 灯管运行时间计数器记录, 寿命 8000-12000h;
② 石英套管每月用稀盐酸擦拭除垢;
③ UV 前 TSS < 10 mg/L 才能保证效果。

第 14 章高级氧化 (AOP)

14.1 原理

臭氧 + UV 协同产生羟基自由基 (·OH), 氧化分解 geosmin 和 2-MIB (土腥味物质, ng/L 级)。单独臭氧或 UV 效果有限, 协同效率 80-95%。

14.2 设计计算

旁路流量 = 循环流量 × 5%
AOP 容积 = 旁路流量 (m³/h) × HRT (min) / 60 (m³)

HRT 按 AOP 类型默认值:

物理: 羟基自由基 ·OH 寿命 < 1 ms, 反应是光化学秒级。Schrader (2010) 实测 1 min 接触, geosmin 去除 86-92%。用户可在 1-15 min 范围内手动调整。

臭氧 = 旁路流量 × 24h × 0.5 g/m³ / 1000 (kg/d)
📌 v1.1 修复 AOP DOM 系数: aopDOMRemoval 默认 5% (可调 5-15%), v1.0 误把 90% geosmin 系数当 DOM 去除率。

14.3 运维

① AOP 出水必须经活性炭或 UV 消除残留臭氧再回主流;
② 不是所有 RAS 都需要 AOP——仅品种对土腥味敏感时才需要。

第 15 章增氧与脱气 v1.9.1 液氧双口径 v1.1 大幅修正 + v1.7 氧锥拓扑+K-101 v2.4 风量 Nm³/h 口径 + 15.9 已决取舍

📌 v1.1 本章是 v1.1 重点更新, 特别是 CO₂ 脱气塔由 v1.0 的"扣 70% 写死"升级为 v1.1 的独立设备模型。

15.1 DO 饱和度 (Benson-Krause 1984)

DO_sat = exp(−139.34411 + 1.575701e5/Tk − 6.642308e7/Tk² + ...)
温度 °C淡水 DO_sat海水 30‰降幅
1011.299.32-17%
1510.088.39-17%
169.868.21-17%
209.097.62-19%
258.266.97-18%
287.836.62-18%
307.566.41-18%

15.2 纯氧 vs 空气 v2.3.3 对比表重修

对比项纯氧 (液氧 + 锥形塔 / 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 拓扑)仅电费, 但风机常年满负荷运行
📌 v1.1 DO 目标饱和度按鱼种推荐: 鲑 165%, 海水温水 140%, 温水淡水 110-125%, 罗非/对虾 100-115%。 仅纯氧模式有效 — 空气模式下池水 DO 由池内质量平衡决定, 该参数不参与 (见 15.3b)。
「30 kg/m³」是什么口径 v2.3.3 三批更正 (原写 40)
· 30 — 物理上限。SRAC-453 (美南水产中心 RAS 设计实践综述): 密度 <30 kg/m³ 时气提 (airlift) 可提供全部需氧, 满密度 60 kg/m³ 时仅能满足约一半。Global Seafood Alliance 的 RAS 综述给的是 区间 + 硬上限两句话: 仅靠曝气的养殖密度典型限于 30-40 kg/m³; 高于 40 kg/m³ 时耗氧超出常规 曝气设备的溶氧能力。界面增氧方式下拉框与参数速查表标的就是这个 30。
· 20-25 — 国内浅池实配。DB46/T 424—2017 + 设备商同系统参数 (同一套海水工厂化系统: 罗茨风机 20 kg/m²、液氧 40 kg/m², 即空气曝气承载量约为纯氧一半) + 本模型按池底布气 1.7 m³/(m²·h) 反算, 三源收敛。落在选择器 title 与代码注释里。
· 任一阶段的准确上限 — 以 aerIntensity 反算为准。它随水深/温度/鱼种变 (石斑成鱼期实算 23.0 kg/m³, 甲壳类另分一档)。固定数字给量级, 活数据给本阶段的准数。
⚠ v2.3.2 及更早版本此处写 40。根因不是数字取错, 而是抄外部数字时丢了口径 — GSA 的「超 40 肯定不行」在传递中变成了「低于 40 都行」, 硬上限被当成了分界线, 区间上沿被当成了推荐值。 ⇒ 凡引用外部数字, 须连同原文口径 (范围 / 硬上限 / 推荐值) 一并记录。
⚠ 「微孔盘 SOTE 18%」已从选型链退役 v2.3.2 起
SOTE (Standard Oxygen Transfer Efficiency) 是清水标准态下测出的值: 20 °C、零盐度、 洁净自来水、初始 DO = 0。养殖池这四个条件一个都不满足 — 水里有残饵粪便与盐分 (α·β 折减)、温度通常不是 20 °C (θ 修正)、 而且池水本来就维持着 4-6 mg/L 的 DO, 推动力只剩两三成。 拿 18% 当实际效率去反推风量, 会把风机选到实际需要的 1/3-1/2 — 这正是 v2.3 二批修掉的那个 SOTE 硬编码 0.18。 清水 SOTE 现在只作为公式里的一个入参 (sotePerMeter, 默认 6.5 %/m 水深, EPA/ASCE 典型 5-7)。
实际氧转移效率 OTE (取代原「SOTE 18%」常数)
OTE = sotePerMeter(%/m) × 水深(m) × aerationAlphaBeta × 1.024(T−20) × (C* − DO_design) / C*
   └── 清水标准 ──┘ └ 接触时间 ┘ └ α·β 水质·盐度 ┘ └ θ 温度 ┘ └──── 推动力 ────┘

其中 C* = DO 饱和浓度 (Benson-Krause, 见 15.1); DO_design = 池内设计 DO (见 15.3b)。
守卫: 推动力下钳 5%, OTE 下钳 0.5% — 防设计 DO 逼近饱和值时退化除零。

例 (石斑鱼成鱼期, 27 °C / 30‰ / 池深 1.5 m, 设计 DO 5.0 mg/L, 本模型实算):

清水基础 6.5 %/m × 1.5 m × 0.75 (αβ)     = 7.31%
温度修正 × 1.024(27−20) = ×1.180       = 8.63% ← OTE_base
推动力  × (6.73 − 5.00)/6.73 = ×25.8%    = 2.22% ← 实际 OTE

同一台设备: 清水标称 6.5 × 1.5 = 9.75%, 工艺水实际 2.22% — 差 4.4 倍OTE_base 与 OTE 是两个不同的量, 不可互换: 选型 (反推风量) 用 OTE, 而水质侧解池内 DO 稳态用 OTE_base — 因为后者要把对浓度 C 的依赖显式解出来, 见 15.3b。

15.3 鱼池 DO 计算 — 纯氧拓扑 v1.1 v2.3.3 标注适用范围

⚠ 本节公式仅适用 aerationMode = 'o2' (纯氧拓扑)。
它成立的前提是增氧发生在主管路上: 水先在氧锥/PPC 里被打到目标饱和度, 再送进鱼池, 鱼在池内消耗, 池出水 = 进池浓度 − 单循环降幅。这个链条里存在"进池浓度"这个量, 所以 DO 依赖循环流量, 天经地义。
空气曝气 (aerationMode = 'air') 不适用本式 — K-101 把气直接打进鱼池, 增氧与耗氧在同一个控制体内同时发生, 根本不存在"进池浓度", 池水 DO 由「传质速率 = 耗氧速率」 的池内质量平衡决定, 与循环流量无关。见 15.3b。
鱼池出水 DO = DO_sat × satTarget% − deltaDO_peak
deltaDO_peak = o2FishPeakHourly / flowM3h × 1000 (mg/L)

v1.1 用小时峰值评估 DO 降幅 (而不是 v1.0 的日均), 反映投喂后代谢尖峰。

误用的代价 (v2.3 修复记录): v2.3 之前水质侧对 air 模式也套本式, 假设水"进池时"已 95% 饱和。 后果是鱼被呼吸了两次 — 选型侧已按维持 5 mg/L 配好风机, 水质侧又假设进池 95% 再扣一整个循环的耗氧。 同一台风机, 选型侧声称维持 5.00 mg/L, 水质侧在密度 40 时算出 DO = 0.00, 而成本照出、无人报错。这类"两处对同一台设备给出互相矛盾的数"的缺陷, 靠注释挡不住, 只能靠断言 (现由 M9 气曝-DO 拓扑闭环压着)。

15.3b 空气曝气风量选型与设计工况点 v2.3.3 新增

本节是 aerationMode = 'air' 的完整设计口径。选型与水质稳态共用同一个单源函数 tankAerationDesign — 这是 v2.3 二批之后的架构约束: 同一台 K-101, 不允许"选型说 5.00、水质说 0.00"。

15.3b.1 池内曝气的 DO 稳态方程

池内曝气没有"进池浓度", 稳态由传质速率与耗氧速率相等给出。传质速率对池水浓度 C 有显式依赖 (C 越高推动力越小), 所以这里必须用推动力折算之前的基础效率 OTE_base:

OTR(C) = Q_air × ρ_air × w_O₂ × OTE_base × (C* − C)/C*  [kg O₂/h]
令 OTR(C) = OCR (鱼的耗氧速率), 解得:
C = C* − OCR × C* / (Q_air × ρ_air × w_O₂ × OTE_base)

ρ_air = 1.2 kg/m³ w_O₂ = 0.23 (氧质量分数) — 与选型侧同源, 零新常数

式中不含循环流量。循环流量只管 TAN / CO₂ / TSS 的移除, 不管 O₂。 模型实测 (石斑成鱼期, 500 t/yr, 20 kg/m³, 关塔):

turnover循环流量 m³/hair 模式池水 DOo2 模式池水 DO (同工况)
15,5595.1584.77
211,1185.1588.03
316,6785.1588.94
422,2375.1589.40

流量放大 4 倍, air 模式 DO 逐位不动, o2 模式从 4.77 一路涨到 9.40。 这是两种拓扑最直观的分野, 也是设计时最容易搞混的一点: 空气曝气场加大水泵不会提高池内 DO, 要提高 DO 只能加风量或降密度。

15.3b.2 风量选型: O₂ 侧与 CO₂ 侧取大

风量需求有两个互相独立的来源, 取大者控制, 设备卡片会标出控制侧是「O₂ 传质控制」还是「CO₂ 吹脱控制」。

O₂ 侧 (恒参与)
Q_air,O₂ = o2FishPeakHourly × safetyAerator / (ρ_air × w_O₂ × OTE)

CO₂ 侧 (仅在脱气塔关闭时参与 — 开塔时 CO₂ 走塔, 与曝气风量无关)
kLoad = (1 / 44010 / ρ_w / K0) × 44.01 / Vm  [g CO₂/m³ 空气, 每 mg/L 水中 CO₂]
Q_air,CO₂ = co2Daily × 1000 × safetyAerator / (kLoad × co2Target × co2StripApproach) / 24

Q_air = max(Q_air,O₂, Q_air,CO₂)

K0 为 Weiss (1974) 亨利常数, ρ_w 为水密度 — 两者复用碳酸盐模块 iRASCarbonate.K0_W74 的口径, 不另设副本co2StripApproach (默认 0.5) 是气泡出水时对亨利平衡的逼近系数: 气泡在池内停留时间有限, 离开水面时并未达到平衡载量。

⚠ K0_W74 的入参是开尔文温度 (Weiss 式内部用 T/100)。传摄氏度会得到 1e111 量级的常数, 风量爆到 1e10 m³/h — 这是本项目记录在案的第六次「猜接口」事故。凡调用他人函数, 先读签名与函数体首行。

15.3b.3 设计工况点: designDO_mgLco2TargetMgL

这一对参数在 v2.3.3 四批/五批补齐, 是对称的一对。补齐它们的理由是一个共同的毛病:

⚠ 此前两侧都拿【安全红线】当设计目标。
DO 侧取 DOmin — 那是安全下限, 低于它鱼会出问题;
CO₂ 侧取鱼种阈值 — 那是安全上限, 高于它鱼会出问题。
用红线选型, 意味着零裕量: 系统常年贴着红线跑, 投饵高峰、水温波动、盘面老化任何一样出现就越线。 这是同一个毛病的两面, 所以修法也必须成对 — 只补一侧会把不对称固化下来。
字段留空时回落生效条件对风量的作用
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₂ 控制时)
例: 设计 DO 5.00 → 实算 5.158; 设计 CO₂ 10.0 → 实算 9.09。裕量看得见, 不是黑箱。

15.3b.4 完整例题 (石斑鱼成鱼期, 500 t/yr, 20 kg/m³, 关塔)

步骤取值来源
水温 / 盐度 / 池深27 °C / 30‰ / 1.5 m鱼种库 + 阶段卡片 poolDepth_m
DO 饱和 C*6.73 mg/LBenson-Krause (15.1)
设计 DO5.00 mg/LdesignDO_mgL 留空 ⇒ 回落 DOmin_abs
OTE_base / OTE8.63% / 2.22%15.2 公式
峰值耗氧 OCR30.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/Lco2TargetMgL 留空 ⇒ 温水阈值 30 × 海水折减 0.75
亨利载量 kLoad1.430 g/m³ per mg/LK0_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 kW1+1 备, 见 15.6
水质侧回算池水 DO / CO₂5.158 / 11.86 mg/L15.3b.1 稳态式 + 关塔 CO₂ 平衡

控制侧会翻转, 而翻转点就是这套曝气系统的能力边界。同一工况把设计 CO₂ 从 22.5 往下调:

设计 CO₂ mg/LO₂ 侧风量CO₂ 侧风量控制侧K-101 kW实算池水 CO₂
22.5 (回落值)5,4763,176O₂177.511.86
15.05,4764,764O₂177.511.86
13.05,4765,496CO₂ (翻转)
10.05,4767,145CO₂231.69.09
8.05,4768,932CO₂289.47.27
6.05,47611,909CO₂385.95.45

注意 O₂ 控制段内 (22.5 / 15.0) 实算 CO₂ 恒为 11.86 — 因为风机已经比 CO₂ 需求大, 调低目标没有实际作用; 一旦翻到 CO₂ 控制侧, 实算值才开始跟着目标走。把设计 CO₂ 从 22.5 收到 6.0, 风机电耗从 177.5 涨到 385.9 kW —— 这个代价应当在选型阶段看见, 而不是投产后才发现。

15.3b.5 守卫与已知局限

15.3c 空气曝气要不要上脱气塔 v2.3.3 新增

15.3c.1 先分清两种情形: 一条是硬规则, 一条才是设计选择

增氧方式脱气塔结论
纯氧 o2关闭不允许 — 物理上必然积累 CO₂。氧锥/PPC 只溶氧、几乎不吹脱, CO₂ 唯一去路只剩换水稀释 (co2FallbackEff 默认 5%)。v2.3.3 二批已把此处文案从"建议启用"升格为 「物理上必然积累, o2 模式必须启用脱气塔」
空气 air关闭可能可行, 要看实算 — 曝气气流本身就在吹脱 CO₂, 风量又是按峰值耗氧配的, 在低密度下往往已经够用。这才是一个真正的设计选择。

15.3c.2 判据: 结果级, 不是配置级

iRAS 采用"air + 关塔一律报警"这种配置级判据。理由是它会误报: 高换水 / 低密度下 air + 关塔确实能达标, 配置级判据会天天亮红字, 而天天见红字就没人看告警了

实际判据是结果级的 — 拿模型算出的池内 CO₂ 稳态浓度比鱼种阈值, 超了才响 (结构化告警 CO2_OVER), 并按根因三分:

rootCause含义处置方向
stripperOff塔关着, 且现有曝气吹脱不够开塔, 或降密度, 或调低设计 CO₂ 把风量顶上去 (代价见 15.3b.4)
airUnderperf塔开着, 但曝气侧本身不达标查风量与 OTE 假设
stripperUnderperf塔开着且在工作, 但塔效率/G:L 不足提 G:L、加填料高度、检查布水

判据只复用水质链已经算出的量, 零新阈值 — 不引入来源不同的数字当门槛。

15.3c.3 实算对照: 塔的价值随密度而变

石斑鱼 500 t/yr, air 模式, 成鱼期阶段密度扫描 (阈值 22.5 mg/L):

阶段密度 kg/m³关塔池内 CO₂开塔池内 CO₂是否达标曝气强度告警
1011.862.14均达标
1511.863.21均达标
2011.864.29均达标
2511.865.36均达标⚠ 池底布气 1.85 > 1.7
3011.866.43均达标⚠ 池底布气 2.22 > 1.7

两条曲线的走向相反, 这一点值得记住:

成本侧的量级 (同上工况, 20 kg/m³, 工艺运行成本 / 比电耗):

工况综合成本 元/kg比电耗 kWh/kg差额
石斑 20 kg/m³ · air + 关塔57.9422.99
石斑 20 kg/m³ · air + 开塔67.7129.87+9.77 元/kg (+16.9%)
罗非鱼 20 kg/m³ · air + 关塔58.3828.45
罗非鱼 20 kg/m³ · air + 开塔82.0255.56+23.64 元/kg (+40.5%)
⚠ 但罗非鱼这一行不能读成"关塔更划算"。关塔时它的池内 CO₂ 实算 27.27 mg/L, 阈值 30 — 只剩 9% 裕量, 而且这个 27.27 正是"拿安全上限当设计目标"的直接产物 (默认 co2TargetMgL 回落到阈值 30, 除以 1.10 安全系数即 27.27)。同时风量控制侧已经翻到 CO₂ 侧, 说明风机已经在替塔干活 — 省下的塔钱有一部分变成了更大的风机。 ⇒ 判断"要不要上塔"时, 必须同时看三个量: 实算池内 CO₂ 距阈值还剩多少裕量控制侧是不是已经翻到 CO₂曝气强度是否已经超限。只看成本一栏会得出错误结论。

可操作的决策顺序:

  1. 纯氧模式 → 必须上塔, 到此为止。
  2. 空气模式 → 先按 15.3b 设定设计工况点 (设计 CO₂ 建议取阈值的 60-80%, 而不是留空贴阈值)。
  3. 看设备卡片的控制侧: 若已是「CO₂ 吹脱控制」, 说明风机在替塔干活, 需比较"放大风机的电耗"与"塔的电耗 + CAPEX"。
  4. 曝气强度告警: 若池底布气已超限, 那么"靠加风量解决 CO₂"这条路本身就不成立 (见 15.3b.5), 应上塔或降密度。
  5. 实算池内 CO₂ 的裕量: 留不出 20-30% 的余地就上塔。

15.3c.4 已知缺陷与开放问题 (设计者必读)

✅ 已修 · air + 开塔时入室 CO₂ 少算 (v2.3.3 审查发现, 同版修复)
缺陷原貌: 开塔时模型的入室 CO₂ 比例取脱气塔的 degasFrac (默认 0, 即尾气排室外), 但曝气气流依然是 sink = indoor 且接触水体 — 池内浓度只是被塔降低了、不是归零, 这股气照样把 CO₂ 带进车间。更彻底的一层是: 曝气吹脱在水侧的 η 里也没算 — 水侧不记移除、室侧不记入室, 两头都不记 = 孤儿项, 与 v2.0 的 Q_air_gain、 v2.1 的蛋分气流、v2.2 的 K-101 轴功完全同族。
后果与方向: 修复前 air + 开塔 工况的 CO₂ 新风需求 V_vent_fish 恒为 0, 新风全靠 ACH 兜底。原注释自称"保守方向"是方向标反 — 少算入室 CO₂ ⇒ 少算新风 ⇒ 通风机选小, 对车间空气质量是激进方向。 罗非鱼 1000 t 实测: 成鱼期新风 6,499 → 11,460 m³/h, 风机原来选小了 1.76 倍; 若不加大新风, 车间稳态可达 1,639–2,301 ppm (设计限值 1,500)。
修法 —— 取消特判, 改由质量守恒导出 (零新常数):
稳态下 产量 P ≡ 塔移除 + 曝气移除  (换水项模型已略, 占比 <1%)

入室份额 = fracAer × sAer + (1 − fracAer) × degasFrac
     └ 曝气那份, 全部入室 ┘ └─ 塔那份, 按尾气比例入室 ─┘

其中 fracAer = 曝气移除 / 总移除 = η_曝气 / (η_塔 + η_曝气) ← 取自水侧单源
   sAer = 曝气气流是否 sink=INDOOR 且接触水 (是则 1)

原写法是一个三分特判 (o2 → degasFrac / air+关塔 → 1 / air+开塔 → degasFrac), 第三档错了, 而且错得"看起来已经考虑过了"。 改成守恒式之后三档全部成为特例, 不再需要 if:

拓扑fracAer入室份额与原口径
纯氧 o20degasFrac逐位一致
空气 + 关塔11逐位一致
空气 + 开塔0 < f < 1 (实测 0.27–0.48)按两条路径实际份额加权本次修正
一个值得记的对照: 修复前 air + 开塔 与 o2 + 开塔 算出的池内 CO₂ 完全相同 (罗非鱼苗种期均为 10.55 mg/L) —— 尽管前者正有 476 m³/h 空气打进池子。 曝气在模型里对 CO₂ 毫无作用, 而这件事没有任何一个数字能看出来: 整条「曝气吹脱 → 入室 → 新风 → 通风机」链此前零导出量、零断言, 所以它是靠手算发现的, 不是靠门禁。
现补断言 X0–X3: X0 导出面必须存在 · X1 入室份额 ⇔ 水侧移除分解 (单源) · X2 车间稳态 ≤ 设计限值 (守恒闭环) · X3 静态锁"特判不得复活"; 并补锚定工况 edge_air_stripper_on (air + 开塔 + 机械通风车间) —— 全库既有 air 工况原本 全部关塔, 不补工况的话 X 锚写了也走不到。自检 29 → 31, 负对照 6/6。
X0 自身曾有一处漏洞, 由负对照咬出: 它最初写成 X1 的守卫 (if (sim.co2Removal) {…}), 于是"撤掉导出"这一负对照全绿 —— 导出没了, 整块断言直接被跳过。改为独立判定后当场转红, 并顺带咬出空场骨架漏导出 (与二批 W0 是同一课)。⇒ 守卫会吞掉失败: 导出面本身必须是受检对象, 不能是判定的前提。
✅ 已决 · 苗种期 CO₂ 阈值不独立分档 v2.3.3 结案
现阈值只按温水/冷水 + 海水折减分档, 没有苗种档支持分档的间接证据确实存在: 模型里 isFry 已经用于 TGP 气泡病阈值(苗种 110% vs 成鱼 115%), 说明苗种确有更高敏感性; 产业侧又指出 air + 关塔工况恰恰在苗种/小鱼期最常见 —— 问题正落在本节最常用的工况上。
但仍决定不分档: 没有成文的苗种 CO₂ 限值出处。无出处而新增一档, 等于用一个猜的数覆盖一个有出处的数(温水 30 / 冷水 20 出自 Timmons)—— 那比不分档更糟: 它会以"模型已经考虑了苗种"的样子出现, 反而挡住用户自己判断。
这是有意的取舍, 不是遗漏 —— 后人勿再以"模型漏了苗种档"为由自行添加。
设计苗种阶段时, 请手工把 co2TargetMgL 设得比成鱼期更保守 (该参数有 UI 入口, 可逐阶段设定)。若日后取得成文出处再议。

15.4 CO₂ 脱气塔 v1.1 新增独立设备

CO₂ 脱气塔在 v1.1 作为独立设备建模。v1.0 没有此模型 (仅在增氧节点扣 70% 写死, 不存在独立的塔/风机/CAPEX/OPEX)。v1.1 用户首次看到此设备会有独立的设备投资和运行成本——这是新增的成本项, 不是"修正"。

15.4.1 设计参数

参数当前默认依据 / 工业实测v1.1 旧默认
G:L 气液比 co2StripperGtoL5Timmons Ch.10 p.244: CO₂ 汽提推荐 5:1-20:1 (<3:1 是常规曝气口径, 不是汽提); Karimi 2020 实测 G:L>5 无显著额外去除; Summerfelt 2003 最优 5.13
水力负荷 co2StripperLoadingRate80 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_m1.5 mTimmons Ch.10 p.245: 设计高度一般限于 1.0-1.5 m, 超过 1.5-2.0 m 后收益递减1.0
风压 co2BlowerPressure_kPa2.5 kPa (可调)Delta Cooling Towers 实测 0.87-1.12 kPa; 浅塔 0.5-1.5 / 中塔 1.5-3 / 深塔 3-52.5
风机效率 co2BlowerEfficiency0.60罗茨风机 0.5-0.7, 离心风机 0.65-0.80.60
单次脱气率 co2StripperEff65%G:L=3 浅塔实际值; 填料 ≥3 m + G:L ≥5 可达 80%65%
⚠ 前三个参数的默认值在 v2.0 已对标 Timmons Ch.10 改过 (G:L 3→5 · 水力负荷 40→80 · 填料高度 1.0→1.5), 但本表与界面参数速查表、阶段卡片提示都没跟, 一直写着旧值直到 v2.3.3。 这不是排版问题而是数值口径错: 用户照文档填 3, 模型实际按 5 跑, 风机功率差 1.67 倍。 现已由门禁 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"随鱼种与产量组合变, 不宜作为对标口径。

15.4.2 风机功率公式

风量 (m³/h) = 循环流量 × G:L
风机功率 (kW) = 风量/3600 × 风压(Pa) / 风机效率 / 1000

举例 (三文鱼成鱼期 Q=10,155 m³/h, 当前默认 G:L=5 / 风压 2.5 kPa / 风机效率 0.60):

10155 × 5 / 3600 × 2500 / 0.6 / 1000 = 58.8 kW ← 本模型实算 58.77 kW

⚠ 本例此前写的是 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 区间下沿。

15.4.3 稳态 CO₂ 浓度

CO₂_tank (mg/L) = CO₂_Daily (kg/d) × 10⁶ / (流量 (m³/h) × 24 × η_co2)

单位推导: 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%)。

📌 v1.5+ 公式订正
旧手册写的 × 10 是单位换算错误 (kg/d → mg/L 必须 × 10⁶, 即 1 kg = 10⁶ mg)。 代码一直是对的, 仅手册书写错误。

15.5 氧锥拓扑 mainline vs bypass v1.7 新增

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"

15.5.1 两种拓扑的物理对比

对比项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 LHOLinde SOLVOX cone / PR Aqua PPC
适用规模中小型项目 (Q < 5000 m³/h)大型项目 (Q > 5000 m³/h)

15.5.2 v1.7 字段定义

字段默认钳制范围工程对照
o2ConeTopologymainlinemainline / bypass
o2ConeHeadLoss_m3 m[0, 15]LHO 2-3 / Speece 5-10 / SOLVOX 110 至 15
o2BypassRatio (%)10[5, 30]国际主流 8-15%
o2BypassPumpHead_m20 m[5, 40]玻璃钢 20 / SOLVOX 25-30
o2BypassPumpEta (%)60[30, 85]高压泵典型

15.5.3 主泵扬程公式

mainline: H_pump_total = H_main + o2ConeHeadLoss
bypass: H_pump_total = H_main (主泵不过锥, 旁路泵独立加压)

15.5.4 旁路泵 P-602 设计

Q_bypass = Q × o2BypassRatio
P_bypass (kW) = Q_bypass × ρ × g × o2BypassPumpHead_m / (3.6 × 10⁶ × o2BypassPumpEta)

P-602 加入设备清单 / CAPEX / OPEX / 热平衡, 1+1 备用模块化 (与主泵 P-101 同口径)。

15.5.5 经济对比 (1000 t 三文鱼实测)

mainline (12 m) bypass (9 m + 旁路 20 m) 主泵 P-101 610.4 kW 488.3 kW 旁路泵 P-602 0 92.2 kW ─────────────────────────────────────────────── 综合泵功率 610.4 kW 580.5 kW (-29.8 kW) 氧锥规格 Q = 10155 m³/h Q × 0.1 = 1015 m³/h 氧锥 CAPEX 355 万元 36 万元 (缩 10×) 设备 CAPEX 4,454 万 3,842 万 (-612 万) 工程总投资 9,800 万 8,454 万 (-1,346 万) 综合成本(元/kg) 36.70 35.41 (-1.29 元/kg) 全投资 IRR 14.90% 17.31% (+2.41%)

15.6 air 模式增氧 — K-101 鱼池增氧鼓风机 v2.2 补气路登记 v1.7 新增

📌 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.2o2FishPeakHourly × safety / SOTE
风压 tankAirBlowerPressure_kPa9.81 × 池深 + 盘阻管阻
(1.5 m 池 → 24.7 kPa)
v2.3.3 改为与池深关联。留空自动算, 填了则显式覆盖(哨兵模式)。下钳 5 kPa15-25 kPa
盘阻+管阻 tankAirDiffuserLoss_kPa10 kPa(盘 5 + 管 5)待产业校准: 随盘型跨一个数量级 —— 低阻膜盘 2.2-4.8 · 常规微孔/刚玉盘 3.5-5 · 纳米管等高阻型厂家明示总压需 ≥50。管路 ≤50 m 取 5, 过长或弯头多取 8-10(无此参数)
风机效率 tankAirBlowerEfficiency60%v1.1.2 由 0.55 提到 0.60 (现代离心/罗茨中位)。下钳 30%60%
备用1+1 备鱼池主增氧, 故障即鱼窒息, 必须双机轮换
P&ID tagK-101与 K-302 (BF 风机) 区分
⚠ v2.3.3 修正: 风压原先写死 70 kPa 且与池深无关。
70 kPa 对应约 6.5-7 m 水深(原注释自称"适合 5 m"本身也不自洽: 5 m 静压 49 + 盘阻约 55)。 而空气曝气按模型自身约束只用于低密度浅池(池深 1.0-2.5 m), 7 m 深池只出现在 三文鱼成鱼期 —— 那是 o2 模式, 根本不用 K-101。 ⇒ 这个常数被设定成了一个它服务的工况里从不出现的值。 实测全库 air 模式风机功率高估 2.84 倍(989 → 391 kW), 而 K-101 电耗进 OPEX、 风机 CAPEX 又按元/kW 计价 ⇒ 运行成本与投资估算同时高估。 现按工程通行式 风压 = 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」。
⚠ 旧文写「15-25 kPa」是 v1.7 口径 —— 那个量级只够克服约 1.5-2.5 m 水深, 而本模型池深最深到 7 m。

15.6.1 现行选型公式 v2.3.3 替换 v1.7 旧式

风量 Q_air (m³/h) = max( Q_air,O₂ , Q_air,CO₂ )  ← 两侧取大, 见 15.3b.2
  Q_air,O₂ = o2FishPeakHourly × safetyAerator / (ρ_air × w_O₂ × OTE)
  Q_air,CO₂ = co2Daily × 1000 × safetyAerator / (kLoad × co2Target × co2StripApproach) / 24 (仅关塔时参与)

轴功率 P_K101 (kW) = (Q_air / 3600) × P_Pa / (η × 1000)
         └ m³/s ┘ └ 70 kPa ┘ └ 0.60 ┘

其中 OTE 是逐工况算出的实际氧转移效率 (清水 SOTE × 水深 × α·β × θ 温度 × 推动力), 不是清水标称值 —— 完整推导、守卫与实算例题见 15.2 与 15.3b。

15.6.2 版本沿革: v1.7 旧式 (已退役, 仅存档)

⚠ 以下为 v1.7 旧式, 已于 v2.3.2 退役, 请勿据此计算
风量 Q_air (Nm³/min) = o2FishPeakHourly × safety / (60 × SOTE × 0.28)
功率 P_K101 (kW) = Q_air/60 × P_kPa × 1000 / 60% / 1000
⚠ 旧式为什么必须退役, 以及照它算会错多少
旧式把 SOTE 直接当作实际吸收效率。SOTE 是清水标准态 (20 °C、零盐度、洁净水、初始 DO=0) 下的值, 养殖池四个条件一个都不满足: 有残饵粪便与盐 (α·β 折减)、温度通常不是 20 °C (θ 修正)、 且池水本来就维持 4-6 mg/L 的 DO ⇒ 推动力只剩两三成
石斑鱼成鱼期实算: 清水标称 9.75% → 工艺水实际 2.22%, 差 4.4 倍。 拿 18% 当实际效率反推风量, 会把风机选到实际需要的 1/3-1/2 —— 而 K-101 是鱼池主增氧, 选小即缺氧
⚠ 旧式还缺 CO₂ 侧: 关塔时风量可能由 CO₂ 吹脱控制而非 O₂ 传质 (实测翻转点约 13 mg/L), 旧式对此完全不知情。
本小节保留旧式仅供追溯历史方案; 现行口径一律以 15.6.1 与 15.3b 为准。

K-101 加入 modulePerSpec (与 K-302 同口径 1+1 备), P&ID / 设备清单 / 报告章节 / 财务测算 全链路同步。

15.6b 风量的参考状态: 标准状态 Nm³/h v2.4 新增

📌 v2.4: 全库风量声明为标准状态。 此前 airFlowM3h 从来没有声明过参考状态, 而三个产气者各按一套隐含口径: 鱼池曝气按 ρ=1.2(20 °C)、关塔 CO₂ 侧按水温的摩尔体积、脱气塔与蛋分是纯体积比、没有状态。 气液接触器把这几股相加再乘一个密度 —— 这个问题本就无解

15.6b.1 口径与常数

RHO_STD_AIR = 1.293 kg/m³ @ 0 °C, 101.325 kPa  F_O2_MASS = 0.232
1.293 × 0.232 = 0.300 kg O₂/Nm³ (国内曝气设计手册经典常数)

为什么取标准状态: 对外向风机厂家提规格时给的就是 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常数, 与温度无关

15.6b.2 为什么参考态必须显式声明

mass = airFlowM3h × ρ_ref = o2Peak × safety ÷ (f_O2 × OTE)  ← ρ_ref 抵消了

对「由 O₂ 质量反算风量」的气流(K-101 / BF), 参考态在选型式与接触器之间会自动抵消, 取多少都不影响物理, 只影响报出来的那个数字。 但对「体积比」气流(脱气塔 flowM3h × G:L、蛋分 skimmerFlow × skimGtoL), 没有任何参考态可抵消 —— 不声明, 接触器的质量流量就无解。

v2.4 之前接触器用的是 ρ(T_air + ΔT) —— 即"风机加热后的密度"。 而风机不改变质量流量: 空气被压缩加热后体积膨胀、密度下降, 但质量不变。 关塔工况风量骤小、温升可达 30 K, 该取法使质量流偏低 10.4%

v2.2 的六次不动点迭代随之整段删除。 它当年确实让温升与质量流取了同一密度 (修的是第六轮审计 P1: 两侧取不同密度、丢失部分轴功), 但统一到了物理上错误的那一侧。 现在质量流是常数, mdot·cp·ΔT ≡ P_shaft 恒成立, 无需迭代, 守恒断言 A3 逐位不变。

15.6b.3 ⚠ 改动时的甄别表

全库 1.29 处, 只有 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) 不采纳: 它锁的是"实际进气体积"口径, 与标准态裁决相反。锁错口径比不锁更糟, 它会淹没真红。

15.7 液氧消耗量与设备选型的双口径 v1.9.1 新增

液氧在 iRAS 里有两个不能混用的口径。这是 v1.9.1 修正的核心, 也是 RAS 工程里一个普遍被忽略的概念错误。

15.7.1 两个口径的定义

口径字段回答的问题用途含容量系数?
设备容量o2PeakSupplyKgH
o2Demand
设备要多大氧锥选型 / 储罐峰值供氧能力 / CAPEX✅ peakFactor × sAerator
消耗量o2ConsumptionDaily
o2ConsumptionDailyAvg
一年买多少氧OPEX / 液氧采购 / 基准值 / 储罐容积❌ 仅吸收效率
设备容量口径 (kg/h)
o2PeakSupplyKgH = o2FishPeakHourly × sAerator / 吸收效率
o2Demand = o2PeakSupplyKgH × 24  ← 峰值持续 24h 的等效日量, 仅限 CAPEX

消耗量口径 (kg/d)
o2ConsumptionDaily = o2FishDaily / 吸收效率  ← 满负荷
o2ConsumptionDailyAvg = o2FishDailyAvg / 吸收效率  ← 周期均值, OPEX 用这个

15.7.2 为什么容量系数不能进消耗量

两者叠加使液氧采购量高估 1.5 × 1.10 = 1.65 倍。液氧是按 kg 计费的消耗品, 在 OPEX 中占 5–12%, 这个误差足以让整个项目的运行成本测算失真。

15.7.3 修正前后对照 (1000 t/yr 大西洋三文鱼)

指标v1.9 (错误口径)v1.9.1 (修正后)文献 / 说明
液氧强度 (kg O₂ / kg 饲料)0.440.266文献 0.25–0.30, 修正后落入区间
年液氧消耗527 t319 t−208 t/yr
储罐规格 (7 日储备)10.1 t6.1 t按消耗量而非峰值能力定容积
基准值验收区间0.25–0.950.20–0.45旧区间被迫放宽以容纳错误值

注意旧的验收区间上限 0.95 — 它是被错误口径倒逼出来的: 因为计算值 0.44 落在文献区间 0.25–0.30 之外, 只能把区间上限一路放宽到 0.95 才不报警。这是"用宽容的验收区间掩盖模型错误"的典型症状。 修正后区间收窄到 0.20–0.45, 重新具备了发现异常的能力。

⚠ 设计者注意: 如果你手上有 v1.9 或更早版本导出的可研报告 / 设备清单, 其中的液氧年消耗量与液氧年运行成本偏高约 65%, 需要按 1/1.65 修正; 但氧锥流量、储罐峰值供氧能力、增氧设备 CAPEX 无需修改 — 那些是容量口径, 一直是对的。
储罐容积的两难: 储罐既要满足峰值供氧速率 (kg/h, 蒸发器能力), 又要满足储备天数 (kg, 容积)。 v1.9.1 后这两个约束分别由两个口径给出 — 蒸发器按 o2PeakSupplyKgH 选, 罐容按 o2ConsumptionDailyAvg × 储备天数 选。合并成单一口径必然会在其中一侧过度设计。

15.8 常见故障

故障原因措施
DO 偏低液氧用完 / 增氧塔堵塞检查液氧; 清洗增氧塔
CO₂ 偏高脱气塔风量不足增加风量; 清洗填料
液氧蒸发过快储罐真空层失效联系厂商检修
微孔盘气泡变大盘面堵塞 / 老化酸洗或更换
bypass 模式 DO 不均匀M-601 混合点设计不当 / 旁路比过高检查混合管段长度; 旁路比降到 10-15%
K-101 跳闸 (air 模式)1+1 备用未启动 / 双机故障立即手动切换备用; 鱼池含氧 15-30 min 内告急

15.9 本轮已决取舍 (v2.4) — 写明为什么【不做】 v2.4 新增

下列六条是 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₂ 限值 (人员暴露口径) 本身风险较高。

第 16 章热负荷与温控 v1.2 完全重写 v2.4 接触器质量流常数化

📌 v1.2 重写 v1.1 用单点能量平衡估算热泵负荷, 忽略车间空气节点。v1.2 引入双节点 Picard 迭代同时求解空气热平衡 + 空气湿平衡。本章给出基础理论框架, 详细求解过程见第 29 章。

v2.0 已废止 ⚠ 上述双节点求解器已在 v2.0.0 中删除。本章 16.1–16.4 的围护 / 蒸发 / COP 理论仍然有效, 但 16.5 描述的求解方式不再反映当前行为。当前模型见本章开头的 16.0「当前热平衡模型 (v2.1)」与第 29 章章首说明。

16.0 当前热平衡模型 (v2.1 起) ★ 先读本节

〔v2.2 注: 热平衡架构未变。v2.2 对本章相关的两处数值级修正 —— 风机温升 ΔT 与 mdot 不动点自洽、轴功 η 逐台加权 —— 见「v2.1 → v2.2」版本演进章 B/C 节。〕

本节是当前有效的模型描述。 第 29 章与本章 16.5 保留的是 v1.2–v1.9.3 的双节点求解器推导, 已于 v2.0.0 删除,仅作历史参考。

16.0.1 架构:车间是受控节点,不是待解节点

v2.0 起车间温度不再由空气节点方程求解,而是由暖通维持

T_room  = T_水温          ← 输入,非解
RH_room = roomRH_set      ← 默认 65%,可调
Q_pool_loss ≡ 0           ← 温差为零,池面显热消失

改动理由见第 29 章章首:旧模型对热带鱼种算出车间 9–14 °C / RH 99%,而实测与规范一致指向 「空气 ≥ 水温」,方向反了 15–20 K

16.0.2 水侧净热平衡

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 可为负 (湿热空气遇冷水结露放热给水)。

16.0.3 车间显热平衡(v2.1 修正)

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 逐台加权

16.0.4 风机热:轴功进气流,电机损失进车间 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)               ← 直接求, 无需迭代
v2.4: 不再需要迭代。 风量已声明为标准状态 Nm³/h(见 15.6b), 质量流成为常数 ⇒ mdot·c_p·ΔT ≡ P_shaft 恒成立, 断言 A3 逐位不变。
史料: v2.2–v2.3.3 此处是 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% 的热: 模型付电费让风机运转,却让这些电产生的热凭空消失,再付一次热泵的钱把水加热回来。

16.0.5 补水:换水股 + 蒸发股

换水股  补水 V_exch (同盐度)  ←→  排污 V_exch (同盐度)
蒸发股  补淡水 E             ←→  蒸发失纯水 E
V_makeup = V_exch + E

拆股后盐平衡恒等成立,无需盐度状态变量。净结露时(湿热气候养冷水鱼)没有 「补负淡水」,纯水先抵扣蒸发股,余量转排水并按 S × V_exch / (V_exch + V_surplus) 推出稳态盐度漂移。

16.0.6 三部分电耗

字段说明
水侧热泵thermalCostDaily调水温
除湿机dehumCostDaily潜热,独立机组,按设计冬/夏峰值选型
车间暖通hvacCostDaily显热,v2.0 新增;设备为 AHU-1002

⚠ 三者不重复:热泵调水温,AHU 维持室温(只管显热),除湿机承担潜热

16.0.7 护栏:改本节必须同步的断言

热平衡有十条页内不变量断言(?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(蛋分气流、风机热)已抓到三次。

16.1 项目级常量管理 (v1.2)

v1.1 把热平衡参数(气温/源水温/U 值/换气率)放在每个阶段的 proc 字段里, 用户必须在每个阶段重复设置。 v1.2 把所有热平衡参数挪到顶部全局配置区 globalThermalConfig(项目级常量影响所有阶段)。具体参数表见第 28 章和附录 B。

16.2 补水温差

补水量 = V_total × 日换水率 (m³/d) [v1.1: V_total 口径]
热负荷 = V × 1000 × 4.18 × ΔT / 3600 (kWh/d)

16.3 板式换热回收

换热后温度 = T_source + η_HX × (T_target − T_source)
η_HX = 75% (iRAS 默认)

16.4 热泵补齐 v1.1 制热/制冷分离

📌 v1.1 制热 COP_heat 默认 4.0, 制冷 COP_cool 默认 3.0 (v1.0 一刀切 3.5)。热带降温场景下 v1.0 电费低估 30-40%。

16.5 双节点稳态求解概述 v2.0 已废止 v1.2

⚠ v2.0.0:本节描述的双节点求解器已删除。 v2.0 起车间温度由暖通维持 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 引入双节点稳态:

节点 1 (水体热平衡):
Q_metabolism + Q_equipment − Q_pool_loss − Q_evap × λ = 热泵供热/制冷 (Q_HP)
其中:
Q_pool_loss = UA_pool × (T_w − T_room)
Q_evap × λ = 蒸发潜热散热, 计入水体(蒸发夺走水体显热)

节点 2 (空气热平衡):
UA_pool × (T_w − T_room) =
UA_envelope × (T_room − T_air)
+ UA_floor × (T_room − T_ground)
+ UA_vent × (T_room − T_air)
− Q_internal_air

节点 3 (空气湿平衡):
m_evap × cover = m_air × ACH × (W_room − W_air_outdoor)

迭代变量: T_room (室温), W_room (室内空气含湿量)

详细模型、求解算法和输出字段见第 29 章。

📌 v1.5+ 公式订正
蒸发潜热 Q_evap × λ 从空气节点移到水体节点。物理: 蒸发夺走的是水体显热 (水分子带走能量), 空气节点只接收 潜热增量 (W_room 上升), 不直接接收 λ 项。 旧手册写在空气节点是 v1.2 推导笔误, 代码一直把 λ 项放在水节点的能量平衡里 (正确)。

16.6 热泵分类型 v1.2

类型COP_heatCOP_cool源温适用
空气源 air3.5-4.02.5-3.0T_air常规, 气温 > -10°C
水源 water4.5-5.53.5-4.5T_source有大量地下水/河水
地源 ground4.0-5.03.5-4.5T_ground (≈年均)有埋管空间
海水开式 seawater_open4.5-5.53.5-4.5T_seawater沿海/海上养殖, 钛板换热

16.7 工程注意

第 17 章水泵与管道设计

17.1 泵功率公式

P (kW) = 9.81 × Q (m³/h) × H (m) / (3600 × η)

17.2 iRAS 6 路泵 v1.1 默认

流量默认扬程 m默认效率说明
主循环泵循环流量 Q1268%全流量, 功率最大
反硝化支路泵Q × 反硝化比1060%分流到缺氧反应器
UV 支路泵Q × UV 比1060%
AOP 支路泵Q × AOP 比1060%
蛋分支路泵Q × 蛋分比660%蛋分塔近距离
RDF 反冲泵Q × 反冲比855%间歇运行

主循环泵功率通常占全场电费 30-40%, 是最大单一用电设备。变频泵可节能 15-25%。

17.3 管径选择

管道类型推荐流速 m/s说明
吸水管0.8-1.2流速太高→气蚀
压水管1.5-2.5流速太高→水锤
排污管1.0-2.0需自清洗流速防沉积
溢流管0.5-1.0重力流
管径 D = √(4Q / πv) Q=m³/s, v=m/s, D=m

17.4 水头损失

组成典型值说明
静水头0.5-2 m鱼池到处理间高差
管道摩阻2-4 m管长和管径决定
设备阻力3-5 mRDF+BF+UV 各约 1-2m
安全余量1-2 m10-20%
合计8-15 miRAS 默认 12m

第 18 章电气与控制系统

18.1 在线水质监测

参数传感器精度价格位置
DO荧光法±0.1 mg/L5,000-15,000鱼池+BF 出水
pH玻璃电极±0.012,000-5,000鱼池+BF
温度Pt100±0.1°C500-1,000鱼池+源水
TAN离子选择±0.1 mg/L20,000-50,000鱼池 (可选)
ORP铂金电极±5 mV3,000-8,000蛋分 (臭氧控制)
液位超声波±1 cm1,000-3,000鱼池/集水井

18.2 PLC 控制逻辑

18.3 报警系统

报警项阈值响应
DO 低< 5 一级 / < 3 紧急启动备用风机/氧气瓶
pH 低< 6.5加 NaHCO₃; 减投饵
TAN 高> 2.0 mg/L减投饵; 检查 BF
温度异常偏离 ±2°C检查热泵
液位低低于设定补水; 检查泄漏
停电市电中断柴油发电机 30 秒启动
泵故障电流异常切换备用泵

必备: ① 柴油发电机 (全场 100% 负荷); ② UPS (PLC + 传感器); ③ 短信报警; ④ 每月演练应急切换。

第 19 章生物安全与消毒策略

RAS 的封闭特性天然具有高生物安全性, 但一旦病原体进入会因循环水快速传播。"防进来"比"治病"更重要。新建项目应在投产前建立完整的生物安全 SOP。

19.1 进水消毒

19.2 人员与工具

19.3 隔离与检疫

19.4 日常消毒

对象消毒剂浓度/方法频率
工具碘伏100 ppm 浸泡 10 min每次使用后
脚池次氯酸钠200 ppm 每周换液每天
车间地面过氧化氢3% 喷洒每周
鱼池 (空池)高锰酸钾50 ppm 浸泡 24h批次间
进水UV60 mJ/cm²持续

第 20 章系统启动与调试

新建 RAS 满负荷需要 8-12 周。急于满负荷投鱼是新手最常犯错误——BF 处理能力是逐步建立的, 超过 BF 能力 = TAN 暴涨 = 大量死鱼。

20.1 启动流程

阶段时间操作关键指标
设备调试第 0-1 周空载运行; 试压设备无故障 48h
BF 培菌第 1-4 周加菌剂; 投 NH₄Cl 至 TAN 2-4TAN 下降, 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

20.2 常见启动问题

问题原因措施
TAN 不降温度太低/pH 太低升温 25-30°C; 补碱度
NO₂ 持续高Nitrobacter 未建立正常! 耐心等待
放鱼 TAN 暴涨投鱼太多/投饵太猛减投饵 50%; 部分换水
pH 快速下降碱度耗尽加 NaHCO₃
鱼不吃食应激检查水质; 减投饵
第 四 部 分
经济评估

第 21 章运行成本

21.1 成本构成 v1.9.2 两层口径

⚠ 先看这里:iRAS 算的是什么成本
v1.9.2 之前 iRAS 只计算饲料 + 工艺电耗 + 工艺消耗品 + 折旧, 手册表述为「不含人工/苗种/管理等软成本」——这个表述不完整, 实际还漏了维护、保险、补水、排污等一批真实支出。 与 Nordic Aqua(宁波象山)2025 年报对标发现,旧口径比商业实绩低约 38%。

v1.9.2 起改为两层输出
工艺运行成本 = 饲料 + 工艺电耗 + 工艺消耗品 + 维护 + 保险 + 补水 + 排污 + CAPEX 折旧
企业全成本    = 工艺运行成本 + 苗种 + 人工 + 管理费

为什么分两层:工艺侧每一项都能追到物理量与公式(补水量来自 V_makeup、 排污量来自 V_discharge、维护保险来自 CAPEX);企业侧本质是经济估算, 定员与管理费率没有物理依据。混进一个总数会拉低整个模型的可追溯性, 故分别输出,可研报告中也应分别列示。

21.1.1 工艺运行成本

本表已移至第 23 章, 并改为模型实算生成(tools/gen_case_chapters.js)。
旧表是手抄的且没标注工况 —— 而成本构成随鱼种/气候/密度剧变, 不标工况的占比表等于没有信息。现表随案例章一并生成, 强制带工况标签, 并附分项合计 ⇔ totalAvg 闭合校验
⚠ 该闭合校验上线当天即咬出一个真缺口: hvacCostDaily(车间暖通显热电耗)参与合计求和却从未导出, 大菱鲆 500 t 实测 1,980 元/日、占 4.6% —— 形态与"设备清单少四台、总价却对得平"同族: 合计对、明细少一项, 对账对得平所以谁也发现不了

* 除湿机默认不投用;投用后视气候可达 1-3 元/kg,见 29.7。

21.1.2 企业侧追加

成本项计算基础实算 元/kg占企业全成本
人工 v1.9.2定员 × 人均年成本 ÷ 365
定员 = max(最小班组, 年产量 ÷ 劳动生产率)
2.556.1%
管理费 v1.9.2(工艺运行成本 + 苗种 + 人工) × 费率2.004.8%
苗种 v1.9.2首阶段年进塘尾数 × 苗种单价
只有首阶段采购,后续为场内转group
0.411.0%
企业全成本合计41.97100%
⚠ 苗种成本的物种差异可达两个数量级
苗种成本 = 每 kg 鱼需苗数 × 苗种单价,而每 kg 需苗数 = (1000 ÷ 上市个体重 g) ÷ 综合成活率。上市个体越小,单位产量需苗越多

大西洋鲑上市 5000 g、成活率 73% → 每 kg 仅需 0.27 尾,按 1.5 元/粒计苗种成本 0.41 元/kg(占 1%)。
鳗鲡上市 300 g(3P 规格)、成活率 75% → 每 kg 需 4.44 尾, 而鳗苗全部依赖野生捕捞、无人工繁育,美洲鳗苗约 10 元/尾, 苗种成本 44.4 元/kg,占企业全成本 43%(行业经验约 50%)。
若改用日本鳗(苗价 15-25 元/尾,歉收年 40+),苗种成本升至 67-111 元/kg—— 同一个池子、同一套工艺,仅换品种即可让企业全成本翻倍。

对虾是反例:每 kg 需苗 62 尾(最多),但虾苗仅 0.03 元/尾,苗种成本只有 1.87 元/kg。 贵的不是"小个体",而是"小个体 + 苗种依赖野生捕捞"的组合。

小规格、苗种紧缺品种(鳗鲡、部分海水种)的项目时,苗种单价是第一敏感因子, 必须按品种与当年行情覆盖默认值,不能沿用内置值做投资决策。

工况:1000 t/yr 大西洋鲑、青岛冬、mainline 拓扑;电 0.7 元/kWh、饲料 12 元/kg、液氧 1.2 元/kg。 定员 17 人(= max(8, 1000/60)),年采购苗种 27.5 万尾。 工艺运行成本占企业全成本 88.2%。

⚠ 仍未计入的项目
包装 / 物流 / 加工外包、疫苗与药物、顾问技术服务费。 这三类随项目差异极大——销售半径、是否自建加工线、病害压力、是否引进外方技术团队, 都会让金额相差数倍,内置默认值反而会误导。做可研时必须另行估算并在报告中显式列出。 按 Nordic Aqua 结构反推,这三项合计约 6 元/kg 量级。

21.1.3 维护与备件的基数与费率 v1.9.2

基数:维护对象横跨 CAPEX 的两个层次,而土建部分基本不产生年度维护:

维护对象所在层次是否计入
泵、风机、UV 灯管、微滤机滤网、氧锥、膜件、仪表设备直购
阀门、管件、泵密封、变频器、控制柜、池体防腐总包系数(管道/电气/自控/安装)
厂房结构、场地、道路总包系数(土建)

总包系数 2.2 中土建约占 0.4–0.6,其余 0.6–0.8 为管道/电气/自控/安装。 故默认基数取 设备直购 × 1.6maintenanceBase = 'equipPlusInstall'), 另可选 'equipOnly'(仅设备直购)或 'totalProject'(工程总投资,偏保守)。

费率:iRAS 的设备单价库是国内设备口径——基数比进口交钥匙小得多, 但国产设备故障率与更换频次通常更高,费率应相应上调:

设备来源基数费率说明
进口高端交钥匙(如 AKVA)2–3%Nordic Aqua 宁波即此类
国产设备(iRAS 默认)4.5%可调 4–6%

两者的绝对额可能反而接近——低造价换来高维护率,这是国产化方案在全生命周期上需要正视的权衡, 而不是单看 CAPEX 就能下结论的。

21.2 峰值 vs 日均双口径

峰值成本通常是日均的 1.5-2.5 倍。设备必须能承受峰值, 但日常运行接近日均。

📌 v1.1 OPEX 中的化学品/臭氧消耗在年均工况下按 feedRatio (= feedAvg/feedMax) 折算。
⚠ v1.9.1 口径修正
容量系数不得进入消耗品成本。 v1.9 之前液氧 OPEX 误用了设备选型口径 o2Demand, 其中含 peakFactor (1.5) 与 sAerator (1.10) 两个容量系数, 导致液氧成本高估 1.65 倍。v1.9.1 起液氧 OPEX 改用 o2ConsumptionDailyAvg

这条原则对全部按量计费的消耗品成立 — 液氧、甲醇、NaHCO₃、饲料: 设备按峰值配, 消耗品按均值买。上表 21.1 中所有"计算基础"列写的都是消耗量口径, 一直是对的, 是 v1.9 的代码实现偏离了手册。详见 15.7。

21.3 CAPEX 折旧 v1.1 新增

v1.1 引入双年限折旧:

年折旧 = 设备 / 设备年限 + 土建 / 土建年限 (元/年)
日折旧 = 年折旧 / 365 (自动加到 totalAvg/totalMax)

21.4 综合成本对比 v1.3 含折旧 + 工况

⚠ 本节为历史数据:下表是 v1.3 / v1.7 当时版本的实测值,保留作为版本演进记录。当前基线(v1.9.2)见"版本演进说明 → v1.9 → v1.9.2 → F 节":青岛冬 35.59 / 海南冬 36.95 / 海南夏 37.37 / Bergen 冬 35.61 元/kg(工艺运行成本口径)。

1000 t/yr 三文鱼基准, 4 工况下综合成本对比(v1.3):

工况气温/源水OPEX折旧综合 元/kg对照文献
青岛冬-7°C/4°C22.413.635.96
海南冬17°C/22°C24.113.637.70
海南夏32°C/27°C26.913.640.47
挪威 Bergen 冬0°C/4°C22.713.636.30Atlantic Sapphire 60-70(含人工/苗)

其他鱼种(v1.1 数据, 单一工况):

鱼种OPEX 元/kg折旧综合文献
大菱鲆 500t31.916.248.146.32 (海水鱼体系)
罗非鱼 1000t19.99.529.325-30
石斑鱼 300t27.412.740.160-100 (不含苗)
加州鲈 500t27.912.740.630-50
鳜鱼 300t35.916.051.980-100
鳗鲡 300t44.615.259.860-100 (含苗)
对虾 100t25.716.241.925-35

注: 上表为 v1.3 旧口径(仅饲料 + 工艺电耗 + 工艺消耗品 + 折旧)。 v1.9.2 已补齐维护/保险/补水/排污(工艺侧)与苗种/人工/管理(企业侧),口径定义见 21.1, 产业实绩对标见 21.5。仍未计入包装/物流/加工、疫苗药物、顾问技术服务费, 按 Nordic Aqua 结构反推约 6 元/kg 量级,做可研时须另行估算。

21.5 产业对标:Nordic Aqua 宁波象山项目 v1.9.2 新增

这是目前唯一一个中国本土、商业规模、公开披露财务数据的大西洋鲑 RAS 项目, 对国内做可研的人参考价值最高。数据取自 Nordic Aqua Partners AS(Euronext Growth,代码 NOAP) 2025 年第四季度暨全年中期报告,非二手报道。

21.5.1 项目概况

内容
厂址浙江省宁波市象山县高塘岛珠门村坑头山
业主诺帝克水产(宁波)有限公司;母公司挪威 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 年,含购买选择权)

21.5.2 实际产量(注意两个口径)

期间生物量产出(活重 LW)商业收获(HOG)均重
2024 全年3,511 t523 t + 1,669 t 整鱼
2025 全年3,981 t2,026 t3.9 kg HOG / 4.7 kg LW,优品率 97%
2026 Q12,161 t(历史新高)771 t4.4 kg HOG / 5.4 kg LW
2026 全年指引5,000–6,000 t目标提至 7.0 kg LW
⚠ 两个必须分清的口径
① 生物量产出 ≠ 收获量。 2025 年产出 3,981 t 活重,只收获 2,026 t HOG,差额进了存栏。 爬产期这两个数能差一倍。做可研若拿「产能 8,000 t」直接乘单价算收入,会严重高估现金流—— 本项目从首收到逼近满产历时近两年。

② HOG vs 活重差约 17%。 行业惯例以 HOG 报产能、以活重报生产。 iRAS 的 yieldTons 是活重口径(由阶段末体重 weightEnd 反推,那是活鱼体重)。 若按 HOG 报的产能对标,需除以 0.83 换算。混用是可研报告中的常见错误。

21.5.3 成本实绩与 iRAS 对照

公司披露的单位成本(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.12614.021.3%
其他外部费用(生产相关)14.65728.743.7%
人工6.26412.318.7%
折旧5.48210.716.4%
合计33.52965.7100%
分项iRAS 实算NOAP解读
饲料14.8012.9差 15%,全在 FCR:iRAS 加权 1.188,NOAP 约 1.05–1.10
折旧7.8610.7同量级,差异由进口设备解释
其他 OPEX10.04*28.7差 2.9 倍——见下方归因
企业全成本41.9765.7

* 指 v1.9.2 补齐维护/保险/补水/排污之前的旧口径值,用于说明差距来源。

21.5.4 差距归因

把 NOAP 的「其他外部费用」28.7 元/kg 按行业常规比例拆开(财报只披露合计):

去向估算 元/kgiRAS v1.9.2 是否建模
维护与备件3.7✅ 已补
补水(海水取水 + 淡化)1.8✅ 已补
废水处理与排污1.4✅ 已补
保险1.0✅ 已补
包装 / 物流 / 加工外包3.5❌ 项目特有,不内置
顾问 / 技术服务费1.6❌ 取决于是否引进外方技术
疫苗 / 药物 / 化验1.0❌ 取决于病害压力
死鱼与固废处置0.6
残差(异味事件 1,900 万欧元整改摊销等一次性)4.1❌ 一次性事件,绝不建模
差距的性质
补齐四项后 iRAS 为 41.97 元/kg,与 NOAP 的 65.7 仍差 36%。但这个差不应被抹平, 因为其中相当部分是结构性的:
· 设备来源——NOAP 用 AKVA 挪威进口交钥匙,iRAS 单价库是国内设备。 NOAP 一期设备原值约 12.4 万元/t,iRAS 约 9.3 万元/t(且口径更窄),两者不可直接比。
· 人工构成——NOAP 含挪威派驻团队,劳动生产率约 22 t/人·年; 对照 Freshwater Institute 美国 3,300 t 场约 127 t/人·年,iRAS 默认 60。
· 爬产期摊薄——2025 年仍未满产,固定成本摊在较小产量上。

换句话说,iRAS 41.97 vs NOAP 65.7 这个差本身就是有价值的信息: 在国产设备 + 本地人工的前提下,理论上能把成本做到进口方案的约 64%。 使用者应据此判断自己的项目更接近哪一端,而不是把任一个数当作「标准答案」。
⚠ 数据时效与来源
以上数据截至 2025 年年报(发布于 2026 年 2 月)。上市公司数据按季更新, 使用前请核对 Euronext Growth 最新披露。汇率按 7.8 元/EUR 折算,实际应按项目基准日汇率。
本节为第三方公开信息的整理与推算,拆分比例为按行业常规估算,非 NOAP 披露, 引用时请注意区分「披露值」与「推算值」。

I. 第三方审计修复(v1.9.2 后期)

v1.9.2 主体完成后接受了一轮第三方代码审计,共修复 8 项缺陷, 并新增自然冷却路径与自检入口。本节记录这些改动,因为其中数项会改变计算结果。

I.1 P1:o2FishFactor 回写污染 严重

UI 会把自动算出的 o2FishFactor 回写进输入框的 value, 而读取端判断「用户是否手填」的依据是 value === ''。 v1.9.2 之前两者是幂等的(该字段就是纯生理值,写回再读出仍是同一个数)。

但 v1.9.2 把它的语义改成了池内总耗氧系数(= 生理值 + TSS 依赖附加), 幂等性被打破:回写含附加的值 → 用户碰任一工艺参数 → 该值被当作「手填的纯生理值」读回 → 再叠一次 TSS 附加。

实测三文鱼成鱼期:池内耗氧 553.8 → 598.2 → 643.2 kg/d,每操作一次 +8%,可无限累积, 且不再随水温/鱼种更新。高 TSS 工况(微滤 30% + 关蛋分 + 换水 2%)单次即 +42%。 液氧采购、CO₂ 脱气塔选型、代谢产热三项会同时错。

修法:自动值改走 placeholder,不再写 value。 自动值与用户手填值在数据结构上彻底分开 —— value 保持为空即永远走自动公式, 除非用户真的键入数字。这样无论该字段的语义将来怎么变,都不会再出现回写污染。

I.2 P2:生物滤池节点氮不守恒

旧: NO₃out = NO₃in + TANin × 1.0
新: NO₃out = NO₃in + TANin × ηbio

同一节点里 TAN 只去除 η,NO₃ 却按 100% 增加 —— 单节点凭空多出 (1−η)×TANin 的氮。 (「稳态下 TAN 几乎全部硝化」这层意思已由独立的 no3PerCycle 表达,不应在沿程节点上再算一遍。)

默认工况偏差仅约 3%,但低 η 时失控:biofilterTAN=0 且换水=0 时, 旧式给出反硝化进水 NO₃ = 115.7 mg/L(应为 4.25),进而使碱度回收 > 硝化消耗, NaHCO₃ 投加量被算成 0 —— 模型给出「不用加碱」的危险结论,而实际 pH 会崩。 修复后同工况 NaHCO₃ 为 604 kg/d。

I.3 P3:热泵按电功率计价

heatPumpKWh耗电量(= 热负荷 ÷ COP);用它除以利用小时得到的是电功率, 而国内冷水机组/空气源热泵的报价惯例是元/kW 制冷(制热)量EQUIP_PRICES_DEFAULTS.heatPump 的 2000 元/kW 正是这个口径。

(反推校核:若按电功率理解,等效制冷量单价仅约 580 元/kW,与市场不符。) 旧实现按电功率计价,使热泵 CAPEX 缩到约 1/COP。UI 上「热泵 xx kW」工程师也必然当制冷量读,口径必须一致。 修复后综合成本 +0.27~0.70 元/kg,设备清单与单价单位均标注为「kW 制冷/制热量」「元/kW(热)」。

I.4 P3:CO₂ 产量两个口径

通风新风量按 CO₂ 反算时固定用文献常数 500 g/kg 饲料, 而同一模型的 load.co2Daily 是自算的(呼吸 RQ≈1 + 硝化产 CO₂)。 两者相差 34%–117%(鲑鱼 671、大菱鲆 749、石斑 861、鳗鲡 1084 g/kg 饲料), 且差异随鱼种、水温、池内 TSS 变化。已改为优先取模型自算值,老数据回退到 500。

I.5 P3:发散被静默钳制 → 显式告警

稳态解 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 显式告警 「该污染物没有稳态解,相关浓度均不可信」,而非静默给数。

I.6 P3:生物滤池去除率与接触时间校核

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% 才告警。

I.7 P4:空场 NaN 污染

产量输入框被清空(yieldTons=0)是必然出现的中间态 —— 用户改产量时必然先清空。 此时 biomass=0,feedAvg/biomass = 0/0 = NaN,并沿 load → sim.alk → naHCO₃ 成本 → totalAvg → 管理费 → 企业全成本 一路污染, 最终使全场汇总、成本卡片、财务评价全部显示 NaN 且无任何提示。 已在源头(比值计算)与两处出口(碱度、成本)做有限性兜底。

I.8 方案 JSON 导入的 DOM-XSS

方案 JSON 导入路径会把 stage.name、鱼种名等完全来自文件的字符串 直接拼进 innerHTML,无转义。构造恶意 name 即可在本站源上执行脚本, 读取或篡改 localStorage 里的全部方案数据。而「设计院之间互发方案 JSON」正是本工具的预期用法, 故这不是理论风险。已新增 escapeHtml() 并修复 6 处注入点。

I.9 新增:自然冷却路径

旧模型在任何需要制冷的工况下都走机械压缩制冷,COP 封顶 3.45。 但 RAS 是常年制冷型负荷,而冬季室外 −7°C 时完全可以用干冷器/板换直接把热排给室外空气或冷源水 —— 压缩机不启动,只跑风机和泵,能效比可达 15–30。

判定: 制冷工况 且(冷源温度 + 逼近温差)< 目标水温
  冷源: 空气源取 Tair;水/海水/地源取对应源温
  逼近温差 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 °C20.00634
Bergen 冬0 °C20.00646
海南冬17 °C3.454272
海南夏32 °C3.115118

寒冷气候热泵费从 1.68 降至 0.29 元/kg,比电耗 12.2 → 10.2 kWh/kg。 跨气候成本差由 0.99 拉大到 1.83 元/kg —— 寒冷气候本就该因免费制冷而占优势,旧模型把这个优势完全抹掉了。

未做部分:部分自然冷却。冷源温度接近但不足时,实际可做预冷 + 压缩机补足; 本模型按「全有或全无」处理(保守,达不到判定就全走机械制冷)。 CAPEX 不额外计 —— 自然冷却复用热泵已有的排热侧,热泵仍按最不利工况(通常夏季)定容。

⚠ v2.0.0 过时参数取代说明
roomTemp(车间室温)—— v2.0 起不再生效。v1.2–v1.9.3 期间该输入框 虽可编辑,但值从未被 calcThermalLoad 消费(返回时被求解值覆盖)。 v2.0 起车间温度由暖通维持 = 水温,该输入已停用。
degasserExhaustIndoorFrac(尾气入室比例)—— 已废弃。新气路拓扑下 该参数语义不完整:只描述尾气去向、未描述进气来源,而二者对结果影响方向相反。 工艺气路进气取室外、排气排室外,全程不碰车间。
poolUValue(水面传热系数)—— v2.0 起无关。 T_room = T_w 后池面温差为零,Q_pool_loss ≡ 0

I.10 新增:自检入口

访问 index.html?selftest=1 会跑固定工况并与内置基线比对。 ⚠ v1.9.3 已扩展为 14 项(11 数值 + 3 边界),受检字段由 2 个增至 4 个,见「v1.9.2 → v1.9.3 → C / E 节」。

⚠ 为什么需要它
本轮审计发现:此前对外发布的四工况基线(32.65 元/kg)是用一份外部测试脚本跑出来的, 而该脚本写于成本模型扩展之前,调 calcCostEstimate 时少传三个参数 —— 它算的是旧口径。 这个数被写进主页面、本手册、README 三处对外发布,直到第三方审计才发现,误差 3.41 元/kg。

根因不是某个公式错,而是「验证路径与产品路径不是同一条」。

因此自检的唯一设计约束是:必须调用真实的 recomputeAll()、读真实的 lastResults.summary,不得重新实现任何计算管线。基线值也全部来自这条路径的实测。

改动模型后若自检报 FAIL,先确认是否为有意的修改;若是,需同步更新 SELFTEST_BASELINE 与三处文档,避免再次出现文档与代码脱节。

I.12 复审轮次的追加修复

上述修复完成后又接受了一轮复审验证(对修复版逐行 diff、重建复算环境、 对 8 项缺陷逐条设计用例复跑)。复审确认 6 项完整修复、1 项半修复、1 项记录在案, 但发现一个由「修了一半」造成的新问题,量级比原缺陷更大

① 热泵装机口径分裂(复审 P0,严重)

I.3 修复热泵计价时只改了 CAPEX,其余三处消费点没跟上, 导致同一台热泵在页面上出现 4 个数(三文鱼成鱼期):

出现位置原公式
热平衡卡片「装机容量」heatPumpKWh / 16(电功率、当前工况、无共用系数)40 kW
工况对比表「装机」各工况 heatPumpKWh / 16冬 40 / 夏 321 kW
设备清单 / N+1 模块化 / P&IDmax(冬,夏) / 22 × 0.75175 kW
CAPEX 计价max(冬,夏) / 22 × 0.75545 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」,防止再次分裂。

② 零流量时水质链仍冒 NaN(复审 P1)

I.7 的空场防护只清干净了成本链,沿程水质节点仍为 NaNflowM3h = 0 → cyclesPerDay = 0 → tanPerCycle = 0/0。 而水质面板的格式化函数是 (typeof n === 'number' ? n.toFixed(d) : n)—— NaN 也是 number,于是界面上最显眼的那块面板直接显示「NaN mg/L」。 成本卡片干净了,反而更容易让人以为只是水质模块出错。

已在 simulateWaterQualityProcess 入口加零流量短路,返回全 0 骨架并置 emptyFarm: true

修复过程中踩到两个连带问题,值得记录:
· 骨架里把 pH / Ω / β 置为 null,但渲染层守卫是 st.pH !== undefined—— null 通过守卫后 .toFixed() 直接抛异常,整个 renderFlow 崩掉。改为省略字段
· 下游用 sim.skimmer ? sim.skimmer.ozoneDemand : 0 取值,对象存在但字段缺失得到 undefined, 参与加法即 NaN。骨架必须把下游会读的字段补全为 0,而不只是给个空对象。
③ 硝化通量与去除率 η 完全解耦
旧: NO₃ 产生量 = TAN 产生量 × 1.0,硝化量 = TAN 日产量(都与 η 无关
新: 硝化量 = TAN 产生量 − 换水排出量,NO₃ 产生量 = 硝化量

稳态物料守恒:TAN 产生 = TAN 硝化 + TAN 随换水排出。正常工况下池内 TAN < 1 mg/L, 换水排出可忽略,硝化量 ≈ 100% 产生量——旧式成立。 但 η 很低时 TAN 浓度飙升,换水带走的份额不再可忽略:

η_bio池 TAN mg/L稳态 NO₃-NNaHCO₃ kg/d换水带走 TAN kg/d
70%0.4920.25820.1
30%1.1320.15810.2
5%6.6919.95721.4
0%4140.0082.8(全部)

旧式在 η=0 时一边报告 TAN 发散、一边照常按全量产 NO₃ 并消耗全额碱度—— 没有硝化菌却在硝化。修复后 TAN 日产 82.8 kg/d 全部经换水排出,NO₃ 产生量与碱度消耗同步归零。

边界处理:η=0 换水=0 时 TAN 本身发散,此时 tanOut 是钳制产物、 换水导出项又恒为 0,公式会退化回「全量硝化」。已将 NO₃ 一并标记为随 TAN 发散,碱度侧同步, 由发散告警统一提示「相关浓度均不可信」。

④ 防除零下限 0.001(v1.0 起的老缺陷)
Cout = Δ / max(1 − R, 0.001 → 1e-9)

0.001 看似无害的防除零,实际是「单次循环去除率下限 0.1%」。 而单次稀释率 = 日换水率 ÷ 日循环次数:典型工况(5178 m³ 水体 / 10155 m³·h⁻¹ → 47 次/日、换水 4%/d) 只有 0.085%本来就低于该下限

换水率 %/d单次稀释旧式 NO₃-N理论值
1%0.000205339.91657
2%0.000410339.9829
4%(默认)0.000820339.9414
6%0.001231276.2 ✅276.2
10%0.002051165.7 ✅165.7

换水率 ≤ 约 4.8%/d 时被硬钳成同一个值、完全不响应换水率,而 iRAS 默认换水率正是 4%。 影响的是只靠换水去除的组分(旁路小时的 NO₃、无 AOP 时的 geosmin); TAN 有 BF(70%)、TSS 有微滤机(75%),单次去除率远高于 0.1%,碰不到下限——这也是它藏了这么久的原因。

⚠ 一个值得记的连锁
I.5 的发散检测最初把阈值设为 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 项能被原形式的自检抓到。

已补两类不依赖「当前值是对的」这个前提的断言:

外加三个边界工况(yieldTons = 0 / 0.001 / 100000),只跑断言不比对数值。 这套断言加上当场就抓出了②的 5 个 NaN 字段,修完才转 PASS。

本轮修复过程中作者自身又踩了三次坑(const 暂时性死区、删变量未查引用、补丁静默未写入), 三次都是自检抓到的——表现为「全部工况返回 0」或「XX is not defined」。 没有自检的话这三个都会带到浏览器才发现,其中「常量未定义」在无头环境还会被 try/catch 吞掉,更难查。

I.11 记录未修

原因
CDN 无 SRIcdn.tailwindcss.com 是运行时编译,内容随访问变化,无稳定 hash 可做 SRI;内联需构建步骤,与「单文件双击即用」定位冲突。已在 index.html 头部写明风险与建议方案(内联 Tailwind 产物 + chart.js,一并解决 SRI/FOUC/离线三个问题),属部署决策
抽出 engine.js + 单元测试这是根治「验证脚本与模型脱节」的唯一办法,但属重构。核心 13 个计算函数中 12 个已是纯函数(零 DOM 引用),依赖的模块级标识符仅 14 个,其中 8 个是常量表 —— 抽取难度不大,主要障碍是 5 个可变全局(stagesState 等)。建议在浏览器实测通过、代码稳定后,以自检为金标准再做

21.6 鳗鲡参数的验证边界 v1.9.2 新增

鳗鲡是本工具内置鱼种中参数不确定性最大的一个,v1.9.2 对其做了整体重做。 本节说明哪些参数有据可查、哪些查不到,供做鳗鲡项目的使用者判断可信边界。

21.6.1 已按国际 RAS 产业数据重做的参数

参数旧值新值依据
养成期密度40 kg/m³120欧洲 RAS「120 kg/m³ 不罕见」;50 g 入池后可达 100–150
白仔 / 黑仔期密度10 / 2512 / 50玻璃鳗隔离期仅 0.3–0.5 kg/m³,逐级提高
上市规格200 g (5P)300 g (3P)3P 美洲鳗批发 92 元/kg;美洲鳗为国内主养品种
换水率(养成)4%/d6%国际 RAS 5–8%/日
各阶段月数3/4/52/6/7单尾生长期 10–14 月至商品规格
综合成活率70%75%国际口径反推 92%(偏乐观)、中国口径 70–80%,取中
苗种单价10 元/尾美洲鳗;缅因州玻璃鳗配额独立反推 10.8 元/尾
📌 密度是主因
旧值 40 kg/m³ 比国际实践低 3 倍 → 水体大 3 倍 → 系统规模与折旧高 3 倍。 这是旧版鳗鲡成本失真的主要原因,而非苗种或周期。 修正后工艺运行成本由 67.4 降至 47.7 元/kg

21.6.2 「出鱼周期」与「单尾生长期」是两个量

产业口径的出鱼周期为 36–48 个月(美洲鳗)/ 30–42 个月(日本鳗), 而单尾长到商品规格只需 10–14 个月。差额来自规格分化与选别拖尾—— 鳗鱼个体生长速率差异极大,需每 6 周分级一次,快长个体先出、慢长个体拖很久。

iRAS 是均匀生长的阶段模型,不含拖尾,故 months 填单尾生长期(合计 15 月)。
但做可研时,营运资金占用与消耗性生物资产必须按 36–48 月估,不能按 15 月算。 新建养鳗场一般需 4 年稳定投苗才能达到稳定高产出鱼。忽略这一点会严重低估项目的现金流爬坡期。

21.6.3 成本绝对值无可用外部对标

工艺参数可以逐条查证,但单位养殖成本找不到可用的现代公开数据

数据源为什么用不了
国内上市公司年报出池量中自用转加工占比高(2026 Q1 为 86%),营收 ÷ 产量反推严重失真;单位养殖成本属商业机密,不单列
欧洲龙头(Nijvis、ALBE 等)均为私营企业,不披露财务
FAO 各国成本数据过时约二十年,且早于鳗苗价格暴涨(同期欧洲玻璃鳗 300–750 EUR/kg,今约 5–13 倍);其中丹麦鳗鱼产量已由 2020 年萎缩至 2024 年的 101 吨、年均降 37%
方向性旁证:本模型算出企业全成本 103.0 元/kg,高于 3P 美洲鳗批发价 92 元/kg, 即「养美洲鳗略亏」。这与 2025 年鳗鱼行业进入低谷期、龙头企业全年亏损 1.79 亿元的实况同号。 可作为模型方向正确的旁证,但不能当作数值精度的验证
⚠ 使用建议
做鳗鲡项目时,苗种单价是第一敏感因子——品种价差达 4 倍(花鳗 3.8–5.8 / 美洲鳗 5–14 / 日本鳗 15–25), 年际波动更大(歉收年可达 40+ 元/尾)。同一个池子、同一套工艺,仅换品种即可让企业全成本翻倍。 必须按品种与当年实际行情覆盖默认值,不能沿用内置值做投资决策。

第 22 章投资概算

22.1 设备直购成本

设备计价单位默认单价推荐范围说明
转鼓微滤机
rdf
元/(m³/h)500300 - 800
MBBR 池系统 (填料+曝气配件, 不含池体/风机)
biofilter
元/m³ 填料45003000 - 6000
UV 消毒器
uv
元/kW100008000 - 15000
蛋白分离器
skimmer
元/m³2500015000 - 40000
臭氧发生器
ozone
元/(kg/d)10000080000 - 150000
AOP 反应池
aop
元/m³3500020000 - 50000
反硝化反应器
denitri
元/m³55004000 - 8000
脱气塔
degas
元/m²2000015000 - 30000
主循环泵+变频
mainPump
元/kW35002500 - 5000
支路泵 (各)
branchPump
元/kW30002000 - 4000
加药计量泵 (每台)
dosingPump
元/台50002000 - 15000按台计价 —— 计量泵按 kW 计价会差一个数量级
罗茨风机
blower
元/kW40003000 - 6000罗茨风机 (脱气塔 / BF / 蛋分供气 / 鱼池曝气)
车间通风机 (轴流)
ventFan
元/kW800300 - 1500待产业校准: 估值, 未取自报价单; 不可复用罗茨口径
液氧增氧塔
o2tower
元/(m³/h)350200 - 500
热泵 (空气源)
heatPump
元/kW(热)20001500 - 3000⚠ 口径为制冷/制热量, 非电功率
板式换热器
heatExch
元/m²1200800 - 2000
机械除湿机
dehumidifier
元/(kg/h)1500800 - 3000按额定除湿量计价 (工业整机含风道/控制)
车间暖通机组
hvacUnit
元/kW(冷热)400250 - 800整机口径; 处理空气显热, 单位容量造价低于热泵一个量级
〔v2.3.3 补登〕 末三行是 v1.9.2–v2.6 陆续加入模型的空气侧设备, 它们的投资一直计入 capex.total, 但本表与设备清单页都没跟 —— 这就是下游审计咬出的"清单少四台、总价却对得平"(另一台是 K-501 蛋分供气风机, 归在上表"罗茨风机 元/kW"口径内)。详见 31.7。
ventFan 单价 2,000 元/kW 属待校准项: 轴流风机与罗茨风机 (4,000 元/kW)是两类设备, 该值取自轴流量级估算, 尚无报价样本支撑。

22.2 工程总投资

工程总投资 = 设备直购 × 放大系数
放大系数 = 2.2 (默认, 范围 1.8-2.5)

放大系数涵盖: 管道阀件 (15-20%)、电气仪表 (10-15%)、自控 (5-10%)、安装调试 (10-15%)、土建厂房 (30-40%)、设计监理 (5-8%)。

概算精度约 ±40%, 实际造价以厂商报价为准。iRAS 投资概算用于项目可行性初判, 不能替代正式造价。

22.3 氧锥拓扑对 CAPEX 的影响 v1.7 新增

v1.7 引入氧锥拓扑 mainline / bypass 区别建模, 对 CAPEX 有显著影响 (1000 t 大西洋三文鱼实测):

设备项mainlinebypass差异说明
液氧增氧塔 A-601355 万 (Q=10155 m³/h)36 万 (Q×10% = 1015 m³/h)-319 万规模缩 10× (按小流量定价)
主泵 P-101213 万 (610 kW)171 万 (488 kW)-42 万主泵不过锥, 扬程降低
旁路泵 P-602028 万 (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%)含放大系数
📝 拓扑选择建议 1000 t 以上大型三文鱼 / 鳟鱼项目建议默认采用 bypass 拓扑, 节省 CAPEX 600+ 万元 + 电费 25+ 万元/年。中小型项目 (Q < 5000 m³/h) 用 mainline 更简单, 因为 旁路高压锥的单价规模效应需要项目规模达到一定阈值才显现。
第 五 部 分
设计案例

第 23 章案例: 三文鱼 1000 t/年 v1.7 数据 (mainline / bypass 对比)

本案例使用 iRAS v1.7 默认的大西洋三文鱼参数, 演示完整计算并对比两种氧锥拓扑。气候选用挪威 Bergen 冬季工况 (T_air=0°C, T_source=4°C, T_target=15°C), 这是工程实际三文鱼项目最具代表性的气候。

23.1 阶段参数与关键计算结果 v2.3.3 改为模型实算生成

本章表格由模型实算生成(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→5050→500500→20002000→5000
月数6864
FCR11.11.21.2
蛋白 (%)50454240
feedRate (%)3.001.501.000.95
水温 (°C)12141515
密度 (kg/m³)30506070
盐度 (‰)001230
推荐池深 (m)1.5357
换水/turnover432.53
损耗 (%)15843

关键计算结果 (模型实算):

参数苗种期幼鱼期中鱼期成鱼期
存塘量 (t)3.241.1131.6236.9
峰值投饵 (kg/d)9561613162251
TAN 产生 (kg/d)4.425.550.882.8
CO₂ 产生 (kg/d)664379241511
鱼峰值耗氧 (kg/h)1.812.627.545.0
循环流量 (m³/h)4242465548110155
系统水体 (m³)10682221933385
池内 CO₂ (mg/L)10.011.410.89.5
池内 NH₃-N (mg/L)0.00490.00480.00220.0016
池内 pH7.567.497.207.17
泵功率合计 (kW)20.0116.3258.7479.2
阶段设备投资 (万元)135.1694.41439.02602.3
模型告警条数1133

全场汇总:

指标数值指标数值
工艺运行成本37.68 元/kg企业全成本42.68 元/kg
比电耗10.19 kWh/kg其中热泵0.20 元/kg
OPEX28.64 元/kg折旧9.05 元/kg
工程总投资10760 万元峰值流量10155 m³/h
系统总水体9874 m³用地16.4 亩

成本构成 · 口径: 成鱼期(大西洋三文鱼 1000 t/yr · 挪威 Bergen 冬季工况)· 全周期日均 元/日

成本项计算基础元/日占比
饲料日投饵量 × 饲料单价2403741.5%
CAPEX 折旧设备/8年 + 土建/20年 ÷ 3651319022.8%
电费(泵/UV/杂项)主泵+支路泵 ÷ motorEta + UV + 照明控制816814.1%
维护+保险+补水+排污processExtraDaily(四项之和, 见 21.1.3)691111.9%
NaHCO₃碱度投加 ÷ 0.595 × 单价12942.2%
电费(CO₂ 风机)脱气塔风机 × 24h9871.7%
增氧(液氧或风机)o2 模式=液氧; air 模式=K-101 电费9051.6%
甲醇反硝化需求 × 单价8001.4%
电费(BF 风机)BF 粗孔曝气 × 24h5981.0%
电费(热泵)热泵电耗 × 电价4420.8%
电费(蛋分风机)K-501 × 24h2150.4%
电费(车间暖通)车间显热 ÷ COP × 电价2150.4%
电费(臭氧)臭氧发生器 × 24h1780.3%
电费(车间通风机)KV-1003 × 24h100.0%
电费(除湿机)除湿量 ÷ SMER × 电价00.0%
分项合计57951100.0%
模型 totalAvg含折旧的工艺运行成本57951100%

✅ 分项合计 ⇔ totalAvg 闭合(差 < 0.5%), 说明成本明细已全部过桥。

23.3 综合成本 (Bergen 冬季 + bypass 拓扑, v1.7 默认)

下表是 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 元/kg28.30 元/kg-0.16
折旧 (元/kg)8.24 元/kg7.11 元/kg-1.13
综合成本 (元/kg 鱼, 含折旧)36.70 元/kg35.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) 量级一致。
📝 重要更正 (vs v1.7 早期手册) 早期版本误把 OPEX (28 元/kg) 写成综合成本 (22 元/kg)。 真实情况: v1.7 跑 1000 t 三文鱼 mainline 默认气候: OPEX = 28.46 元/kg, 折旧 = 8.24 元/kg, 综合成本 = 36.70 元/kg。 bypass 拓扑可省 1.29 元/kg, 主要来自 CAPEX 节省 → 折旧降低。这个综合成本与 v1.3 历史四工况基线 (Bergen 36.30 元/kg) 完美吻合 ✓

23.4 工况敏感性分析 (沿用 v1.3 4 工况基线)

工况OPEX 元/kg综合 元/kg差异原因
青岛冬22.435.96基准 (v1.3 数据)
海南冬24.137.70仍需制冷 (气温 > 水温)
海南夏26.940.4732 → 15°C 制冷温差大
挪威 Bergen 冬22.736.30气温温和 + 源水冷
📝 注 上表是 v1.3 数据 (mainline 拓扑)。挪威 Bergen 冬 36.30 元/kg 与 v1.7 jsdom 实测 36.70 元/kg 完美吻合 (偏差 +1%, 在迭代版本计算精度内)。bypass 拓扑可再降约 1.29 元/kg, 见 23.3。SUMMARY 路线图已规划 v1.8 用 bypass + v1.7 字段重新生成 4 工况基线 JSON。

关键观察: 三文鱼养殖目标水温 12-15°C, 海南夏季气温 32°C, 制冷温差 17-20°C, 制冷电费暴增。不建议在海南养三文鱼。挪威成本接近青岛, 长期运行更优。

23.5 mainline vs bypass 拓扑详细对比 v1.7 新增

1000 t 大西洋三文鱼成鱼期 (Q=10155 m³/h, V_total ≈ 5183 m³, 4 模块) 在 Bergen 冬季工况下的两种拓扑全工况对比:

对比项mainline (主流串联)bypass (旁路高压)差异
动力消耗
主泵 P-101 功率610.4 kW488.3 kW-122.1 kW
旁路泵 P-602 功率0 (无)92.2 kW+92.2 kW
综合泵功率610.4 kW580.5 kW-29.8 kW (节能)
年电费节省 (8000 h × 0.7 元/kWh)~17 万元/年
设备规格
液氧增氧塔 A-601 流量10155 m³/h (全流量)1015 m³/h (10% 旁路)缩 10×
主泵扬程 H_main12 m + 3 m (锥子) = 15 m12 m (主泵不过锥)-3 m
旁路泵扬程 H_bypass20 m+20 m (高压锥)
CAPEX (设备直购)
主泵 P-101213 万元171 万元-42 万
液氧增氧塔 A-601355 万元36 万元-319 万
旁路泵 P-602028 万元+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 年)
全投资 IRR14.90%17.31%+2.41%
自有资金 IRR~22%25.23%+3%
全投资 NPV (万元)5,7797,031+1,252
静态回收期 (年)6.195.57-0.62
动态回收期 (年)8.637.42-1.20
BEP (% 满产)62.3%57.9%-4.3%
📌 v1.7 工程结论
1000 t 大西洋三文鱼项目采用 bypass 拓扑相比 mainline: 综合成本省 1.29 元/kg + 工程 CAPEX 节省 1346 万 + 全投资 IRR 提升 2.4 个百分点 + 静态回收期缩短 0.62 年。 这与国际主流大型三文鱼 RAS 多采用 side stream 拓扑的工程实际一致 (Linde SOLVOX cone / PR Aqua PPC / Global Seafood Advocate 2019 "more often plumbed in side stream configuration")。

第 24 章案例: 大菱鲆 500 t/年

📌 v1.1 修正 大菱鲆密度 v1.1 修正 (15/30/40 → 25/50/60 kg/m³), 与莱州东方海洋等循环水项目实测一致。

24.1 阶段参数与关键计算结果 v2.3.3 改为模型实算生成

基准工况: 大菱鲆 500 t/yr · 默认气候 (青岛) · 设计阶段 成鱼期 · 门禁基线 turbot_500

参数苗种期中鱼期成鱼期
体重 (g)3→5050→250250→600
月数486
FCR0.91.11.3
蛋白 (%)555048
feedRate (%)3.001.500.90
水温 (°C)161616
密度 (kg/m³)255060
盐度 (‰)282828
推荐池深 (m)0.811
换水/turnover3.532
损耗 (%)1563

关键计算结果 (模型实算):

参数苗种期中鱼期成鱼期
存塘量 (t)8.888.7179.8
峰值投饵 (kg/d)26413301618
TAN 产生 (kg/d)13.361.271.5
CO₂ 产生 (kg/d)1939841212
鱼峰值耗氧 (kg/h)4.927.234.7
循环流量 (m³/h)123053195994
系统水体 (m³)35117732997
池内 CO₂ (mg/L)10.011.913.0
池内 NH₃-N (mg/L)0.00220.00200.0019
池内 pH7.157.087.04
泵功率合计 (kW)58.0251.0282.8
阶段设备投资 (万元)419.51654.81915.2
模型告警条数333

全场汇总:

指标数值指标数值
工艺运行成本59.14 元/kg企业全成本68.36 元/kg
比电耗20.66 kWh/kg其中热泵2.13 元/kg
OPEX43.24 元/kg折旧15.90 元/kg
工程总投资9454 万元峰值流量5994 m³/h
系统总水体7880 m³用地58.3 亩

成本构成 · 口径: 成鱼期(大菱鲆 500 t/yr · 默认气候 (青岛))· 全周期日均 元/日

成本项计算基础元/日占比
饲料日投饵量 × 饲料单价1582336.6%
CAPEX 折旧设备/8年 + 土建/20年 ÷ 3651040424.1%
维护+保险+补水+排污processExtraDaily(四项之和, 见 21.1.3)521012.1%
电费(泵/UV/杂项)主泵+支路泵 ÷ motorEta + UV + 照明控制483611.2%
电费(车间暖通)车间显热 ÷ COP × 电价19884.6%
电费(热泵)热泵电耗 × 电价18724.3%
NaHCO₃碱度投加 ÷ 0.595 × 单价8291.9%
电费(CO₂ 风机)脱气塔风机 × 24h5831.3%
增氧(液氧或风机)o2 模式=液氧; air 模式=K-101 电费5111.2%
甲醇反硝化需求 × 单价4951.1%
电费(BF 风机)BF 粗孔曝气 × 24h3550.8%
电费(蛋分风机)K-501 × 24h1270.3%
电费(臭氧)臭氧发生器 × 24h900.2%
电费(车间通风机)KV-1003 × 24h610.1%
电费(除湿机)除湿量 ÷ SMER × 电价00.0%
分项合计43184100.0%
模型 totalAvg含折旧的工艺运行成本43184100%

✅ 分项合计 ⇔ totalAvg 闭合(差 < 0.5%), 说明成本明细已全部过桥。

第 25 章案例: 南美白对虾 100 t/年

25.1 清水 RAS vs Biofloc 对比

对比维度清水 RASBiofloc (BFT)
水处理核心微滤机 + 生物滤池靠异养菌絮团原位处理 TAN
有无生物滤池有 (MBBR)无 (最大区别)
水色清澈褐色 (絮团 300-800 mg/L)
碳氮比无要求C:N ≥ 15:1 关键
DO 需求按 RAS 标准极高 (异养菌+硝化菌+虾)
密度2-15 kg/m³3-8 kg/m³
投资
运行难度中等高 (絮团管理, 翻塘风险)
iRAS 支持

25.2 阶段参数与关键计算结果 v2.3.3 改为模型实算生成

基准工况: 南美白对虾 100 t/yr · 默认气候 (青岛) · 设计阶段 养成后期 · 门禁基线 shrimp_100

参数苗种期养成前期养成后期
体重 (g)0.01→11→1010→30
月数11.51.5
FCR11.31.6
蛋白 (%)454238
feedRate (%)10.005.003.00
水温 (°C)303030
密度 (kg/m³)2815
盐度 (‰)151515
推荐池深 (m)11.21.5
换水/turnover22.52.5
损耗 (%)301510

关键计算结果 (模型实算):

参数苗种期养成前期养成后期
存塘量 (t)0.22.88.8
峰值投饵 (kg/d)22139264
TAN 产生 (kg/d)0.95.49.2
CO₂ 产生 (kg/d)18108200
鱼峰值耗氧 (kg/h)0.53.46.4
循环流量 (m³/h)2238661466
系统水体 (m³)111346586
池内 CO₂ (mg/L)5.18.08.7
池内 NH₃-N (mg/L)0.00440.00430.0040
池内 pH7.407.217.17
泵功率合计 (kW)10.540.969.2
阶段设备投资 (万元)71.6245.1411.3
模型告警条数355

全场汇总:

指标数值指标数值
工艺运行成本51.86 元/kg企业全成本165.11 元/kg
比电耗19.68 kWh/kg其中热泵2.52 元/kg
OPEX34.44 元/kg折旧17.42 元/kg
工程总投资2072 万元峰值流量1466 m³/h
系统总水体1342 m³用地10.9 亩

成本构成 · 口径: 养成后期(南美白对虾 100 t/yr · 默认气候 (青岛))· 全周期日均 元/日

成本项计算基础元/日占比
CAPEX 折旧设备/8年 + 土建/20年 ÷ 365262532.0%
饲料日投饵量 × 饲料单价185122.6%
维护+保险+补水+排污processExtraDaily(四项之和, 见 21.1.3)121314.8%
电费(泵/UV/杂项)主泵+支路泵 ÷ motorEta + UV + 照明控制120914.7%
电费(热泵)热泵电耗 × 电价5036.1%
增氧(液氧或风机)o2 模式=液氧; air 模式=K-101 电费1702.1%
NaHCO₃碱度投加 ÷ 0.595 × 单价1511.8%
电费(CO₂ 风机)脱气塔风机 × 24h1431.7%
甲醇反硝化需求 × 单价951.2%
电费(车间暖通)车间显热 ÷ COP × 电价911.1%
电费(BF 风机)BF 粗孔曝气 × 24h891.1%
电费(蛋分风机)K-501 × 24h310.4%
电费(臭氧)臭氧发生器 × 24h250.3%
电费(车间通风机)KV-1003 × 24h80.1%
电费(除湿机)除湿量 ÷ SMER × 电价00.0%
分项合计8203100.0%
模型 totalAvg含折旧的工艺运行成本8203100%

✅ 分项合计 ⇔ totalAvg 闭合(差 < 0.5%), 说明成本明细已全部过桥。

第 26 章多模块并联与 N+1 备用v1.3 新章

26.1 为什么大型项目要做模块化

对于年产量 > 1000 t/yr 的大型 RAS 项目, 工程上不会建一个超大的循环系统, 而是拆成多个模块并联。原因:

典型工业项目模块数(参考 Atlantic Sapphire / Stolt Sea Farm / 国内大型项目):

规模典型模块数单模块产能
< 500 t/yr1 套全场 1 模块
500-1500 t/yr2-3 套200-500 t/yr/模块
1500-5000 t/yr3-6 套500-1000 t/yr/模块
> 5000 t/yr5+ 套1000+ t/yr/模块

26.2 iRAS 模块化逻辑

v1.3.x 中, 每个阶段的模块数完全由用户决定。在阶段卡片头部"🔧 套数" subSystemCount输入(默认 1, 范围 1-10):

numModules = stage.subSystemCount
单模块流量 = 阶段总流量 / numModules
单模块设备容量 = 阶段总设备容量 / numModules

不同阶段可以有不同模块数。比如:

这种"阶段递增"的配置反映了大型 RAS 的实际工程: 苗种期对单一系统依赖性高, 成鱼期产量大需要分散风险。

26.3 模块内 N+1 备用配置

每个模块内部按以下规则配置备用:

设备单机容量上限配置规则备用
主循环泵 P-10175 kWceil(模块流量功率 / 75)+1 台备用
BF 风机 K-30230 kWceil(BF 风量功率 / 30)+1 台备用
RDF 微滤 F-201600 m³/hceil(模块流量 / 600)+1 台备用
UV D-4018 kW2 套并联各设计 75% 余量1 台坏 → 另 1 台加大流量
热泵 H-801200 kWceil(热泵装机 / 200)+1 台备用
支路泵(UV/蛋分/反硝化/AOP)30 kWceil(支路功率 / 30)+1 台备用
加药计量泵1 kWceil(加药功率 / 1)+1 台备用
O3 发生器 G-90150 kWceil(O3 功率 / 50)+1 台备用

26.4 全场共用站级设备

不按模块拆分, 全场共用 1 套(站级设备):

设备配置说明
液氧储罐 V-9012 罐(主+备)双罐设计, 切换不停产
应急柴油机1 台 100% 全场负荷30 秒启动 + 自动切换
变压器2 套(高/低压双套分列)故障切换
UPS1 套(PLC + 传感器 + 关键阀门)10-30 分钟续航

26.5 模块化对成本的影响

模块化的设备成本变化: 单台机组容量变小 → 单价(元/kW)略升, 但数量增加 → 总成本基本不变(±5%)。 真正的成本影响来自备用机组数: 4 个模块各配 N+1 备用, 比 1 个大模块配 N+1 备用多备 3 台。 典型规模(1000 t/yr, 4 模块)备用成本约占 CAPEX 5-10%。

📌 工程权衡
模块数越多, 故障隔离越好, 但备用成本越高。一般原则: 500 t/yr 以下不拆; 500-1500 拆 2-3 个; > 2000 拆 3-5 个。具体数字看可靠性要求(三文鱼必须高可靠, 罗非可降低)和投资预算。

第 27 章鱼池配置与池深统一v1.3 新章

27.1 鱼池形状与尺寸的工程逻辑

RAS 鱼池设计常见形状: 圆形(Cornell 双流式)/ 八角 / 方形带圆角。圆形最常见, 因为:

圆形池的关键尺寸:

27.2 反推算法

给定阶段总水体 V_tank、每套池数 poolsPerSet、套数 numModules, 反推单池直径:

总池数 = poolsPerSet × numModules
单池容积 V = V_tank / 总池数
反推直径 D = √(4V / πH)
高径比 = H / D

27.3 工程合理性自动告警

iRAS 在反推后自动检查工程合理性, 给出建议:

条件告警内容
D < 4 m反推单池直径偏小, 建议减少每套池数或减少并联套数
D > 30 m反推单池直径偏大, 建议增加每套池数或增加并联套数
D > 20 m 且 H < 3 m大池配浅池(H/D < 0.15), 流场易死角, 建议加深至鱼种推荐值
poolsPerSet = 1每套仅 1 池, 无主备/检修轮替, 工程惯例 ≥ 2

27.4 鱼种推荐池深 (recDepth_m)

v1.3 在 SPECIES_DB 各鱼种各阶段加入推荐池深字段。这反映不同鱼种的生物学特性和工程惯例:

鱼种阶段数各阶段 recDepth_m (m)生物学 / 工程说明
三文鱼 Salmon
salmon
41.5 → 3.0 → 5.0 → 7.0立体水柱泳鱼, 鲑科大池深, 商业 7-12 m; 跨盐度(淡水→海水)
大菱鲆 Turbot
turbot
30.8 → 1.0 → 1.0底栖鱼, 浅池取单层底面积, 不超过 1.2 m
罗非鱼 Tilapia
tilapia
31.5 → 2.0 → 2.5耐高密度; 植物蛋白配方比例高, 氮排放低于肉食性鱼
石斑鱼 Grouper
grouper
31.5 → 2.0 → 1.5半底栖; ⚠ 成鱼期池深回落而非加深
加州鲈 Largemouth Bass
bass
31.5 → 2.0 → 2.5淡水温水肉食鱼, 立体水柱
鳗鲡 Eel
eel
31.0 → 1.5 → 2.0底栖, 中等浅
鳜鱼 Mandarin Fish
mandarin
21.5 → 2.0同加州鲈; ⚠ 本库只有两个阶段
南美白对虾 L.vannamei
shrimp
31.0 → 1.2 → 1.5底栖 + 水柱, 浅于其他温水鱼
自定义鱼种 Custom
custom
12.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 值, 默认填入鱼种推荐值。

27.5 池深统一数据源 (v1.3.x)

v1.3 早期版本中, 池深有两个独立输入:

  1. 阶段卡片头的 stage.poolDepth_m: 用于池径反推
  2. 热平衡区的 stage.proc.poolDepth: 用于估算池表面积 → 车间面积 → 散热

这种双输入容易让用户混淆: 调了一处, 另一处没调, 结果池形和散热模型用了两个不同的池深。 v1.3.x 统一为一个数据源:

统一池深取值优先级 (calcThermalLoad 和 applyModularization 共用):
1. stage.poolDepth_m (用户在阶段卡片头部输入)
2. stage.recDepth_m (鱼种推荐, 来自 SPECIES_DB)
3. proc.poolDepth (老字段兼容, 老方案 JSON 加载用)
4. 1.5 m (最终默认)

同时删除了热平衡区的"池水深"输入, UI 上只在阶段卡片头部出现一次。同步更新加载老方案 JSON 的逻辑: 若老方案缺 recDepth_m, 加载时从 SPECIES_DB 按阶段名/index 自动补充, 保证池径反推和热平衡用同一个推荐值。

27.6 实例: 三文鱼成鱼 1000 t/yr

给定参数:

反推:

结果: 8 个 Φ8.8m × 7m 圆池, 每池 423 m³。无告警。

第 28 章全局气候与围护建模 v1.9.2 通风口径v1.2 新章 v2.4 通风净额 + 自然通风钳制

28.1 为什么要做项目级常量管理

v1.1 把热平衡参数放在每个阶段的 proc 字段里。同一个项目有 4 个阶段, 用户必须在 4 个阶段重复设置:

这些是项目级常量(同一个厂房无论养什么阶段都是同一份)。 v1.2 把它们挪到顶部全局配置区 globalThermalConfig, 一处设置, 所有阶段使用。

28.2 地区预设

v1.2 提供常见地区的气候预设, 选择后自动填入气温/源水温/RH 设计值:

地区冬 气温/源水 °C夏 气温/源水 °C年均 气温/源水 °CRH 冬/夏日照 冬/夏 kWh/(m²·d)推荐热泵说明
挪威 Tromsø (北极圈)-12 / 318 / 103 / 675% / 70%0.0 / 5.0海水开式北极圈, 冬季极冷; 推荐海水开式源
中国青岛 (北方海岸)-7 / 432 / 2413 / 1460% / 78%2.3 / 4.8空气源默认预设; 13 条数值基线中 6 条建立于此
中国上海 (华东沿海)-2 / 835 / 2817 / 1870% / 80%2.0 / 4.6空气源华东沿海, 夏季高温高湿
中国海南三亚 (热带)16 / 2235 / 3025 / 2675% / 85%4.2 / 5.8海水开式热带, 全年高温, 制冷主导
智利 Puerto Montt (三文鱼陆基)2 / 822 / 1411 / 1180% / 75%0.9 / 5.8海水开式三文鱼陆基主产区, 全年温和
中东 Doha (沙漠养虾/罗非)12 / 1845 / 3527 / 2750% / 55%4.2 / 7.2水源沙漠气候, 夏季 45 °C, 制冷极端工况
加拿大 Halifax (东海岸)-15 / 126 / 187 / 875% / 78%1.6 / 5.2海水开式北美东海岸, 冷温带

〔v2.3.3 校正〕本表由 CLIMATE_PRESETS 实测重写。旧表六个地区没有一个与代码对得上 —— 旧写"青岛/海南/挪威 Bergen/法罗群岛/北方内陆/华南", 而代码是挪威 Tromsø / 青岛 / 上海 / 三亚 / 智利 Puerto Montt / 中东 Doha 六个(其中只有青岛名称重合, 且数值也已不同)。旧表另缺两列: 日照强度(sol_w/sol_s, 进太阳辐射子系统)与推荐热泵型式(hpRecommend, 决定源侧温度取气温还是水温)。⚠ 默认预设为中国青岛, 13 条数值基线中的 6 条建立在该预设上。

用户选地区后仍可微调任何参数。

28.3 围护预设

预设U_wallU_roofU_floorU_window窗墙比ACH热回收说明
阳光板/温室 (国内南方常见)3.53.01.05.00.302.00阳光板/温室, 国内南方常见; 保温最差但造价最低
一般工业车间 (50mm 岩棉, 国内多数 RAS)0.80.60.82.50.051.00默认预设; 50 mm 岩棉, 国内多数 RAS
保温车间 (100-150mm 聚氨酯, 北欧标准)0.300.200.501.40.030.50.75100-150 mm 聚氨酯, 北欧标准; 带 75% 热回收
近被动房 (200mm+ 真空保温)0.150.100.250.80.020.30.85200 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 / 热回收三列 —— 而这三项恰恰随预设变化, 且直接进热平衡与通风计算。

28.4 4 工况对比设计

v1.2 引入3 工况对比(可扩展为更多), 每次计算同时跑:

工况用途
设计冬季 (design_winter)冬季最冷月用电峰值, 决定热泵装机
设计夏季 (design_summer)夏季最热月用电峰值, 决定制冷机装机
全年均值 (annual)年化电费, 用于成本核算和投资决策

当前选中的工况(thermalScenario)用于主显示, 其他工况结果在阶段卡片底部以对比表呈现。 热泵装机容量取冬/夏极值的较大者(装机定容)。

28.5 池盖类型(蒸发率系数)

池盖直接影响蒸发率, 是热平衡的关键变量:

池盖类型系数典型蒸发率适用场景
无盖 (none)1.0开放水面全蒸发室外或简易车间
部分覆盖 (partial)0.40约 40% 蒸发常规工业 RAS, 部分孔/进料口开
密闭 (full)0.10约 10% 蒸发北欧/严寒地区, 节能高保温

蒸发是潜热(2257 kJ/kg @100°C, 2502 kJ/kg @0°C), 是冬季最大的散热项之一。密闭池盖能省 20-40% 的暖气电费。

28.6 通风换气与热回收 v1.9.2 口径重写

28.6.1 通风要解决三件事

RAS 车间通风同时承担三个功能, 但它们的决定性负荷完全不同, 混为一谈是设计错误的常见来源:

功能负荷来源随什么变化v1.9.2 处理
空气质量 (CO₂)鱼呼吸 + 脱气塔尾气入室鱼载荷 (投饵量)新风量下限
除湿水面蒸发水面积 / 池盖 / 室内外湿差不由新风承担
显热排除设备产热 + 池水散热装机功率由 ACH_eff 一并计算

28.6.2 v1.9.2 之前的问题: 通风量跟着房间体积走

v1.9.2 之前只有单一口径 通风量 = ACH × V_room。而 V_room 是自动估算出来的:

poolArea = V_tank / 池深  →  A_building = 1.6 × poolArea  →  V_room = A_building × 层高

于是产生了一条纯几何的放大链: 降低养殖密度 → 同样产量需要更大水体 → 池面积↑ → 车间↑ → 通风量↑。 在湿热气候养冷水鱼时, 更多新风意味着带入更多湿空气, 在冷水面凝结放热, 制冷负荷随之暴增。 实测: 密度从 80 降到 15 kg/m³, 通风量被放大 5.33 倍, 制冷装机同步暴涨。

但这不成立 — 鱼的数量没变, 呼吸产生的 CO₂ 没变, 新风需求本不该变。房间大一倍只是稀释体积大一倍, 需要的新风流量并不会翻倍。

28.6.3 v1.9.2 新逻辑: 按需求定新风

V_vent = max( ACH × V_room , V_CO₂ )

v2.4 起本式已被 28.7 取代, 本节保留为口径演进记录。 两点变化: (1) 风机送进车间的室外空气计入本式, 通风系统只补差额(28.7.1); (2) 自然通风档不再取 max —— 供风量钳在用户填的 ACH 上, 不足则报 CO₂ 超标(28.7.3)。

ACH 保留为用户可调的设计参数 (默认 1.0), CO₂ 稀释需求作为下限, 保证空气质量不会因为车间估小而失守:

V_CO₂ (m³/h) = CO₂产量 × 投饵量 × 尾气入室比例 / ΔC / 24
  CO₂产量 = 500 g / kg 饲料
  ΔC = (CO₂限值 − 450 ppm) × 10⁻⁶ × 44 / 24.45 × 1000  (g/m³)
  450 ppm = 室外本底 (v2.4 起为可调字段 co2Outdoor_ppm, 范围 300–5000; 城市/工业区实测常年 500–700, 取小是不安全方向)
参数默认值依据
CO₂ 产量系数500 g/kg 饲料大西洋鲑 409 (Terjesen 2013) / smolt 550 (Vinci 2004) / 鳗鲡 536 (Heinsbroek 1990), 统一取值
车间 CO₂ 限值1500 ppmOSHA 法定 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 之前是没有出处的经验值, 现在有了可追溯的标准依据。

28.6.4 为什么除湿不计入新风

这是本次修正里最反直觉的一条, 但两种气候下结论一致:

两头都不是决定项, 所以除湿从新风量计算中整体移除, 改由机械除湿机承担 (详见 29.7)。 这与泳池馆的成熟实践一致: 新风管只管空气质量, 除湿机走 4–6 ACH 的内循环, 不带新风热负荷。

report.html 中的 6–10 次/h 是另一个口径: 那是总循环风量 (含除湿机内循环, 不带新风热负荷), 不是新风换气次数。两者相差 6–10 倍, 混用会让通风热负荷严重高估。

28.6.5 显热与热回收

通风换气产生显热 + 潜热散热 (冬季 T_air 比 T_room 低很多)。热回收可回收 70–85% 的显热 (板式或转轮换热器):

ACH_eff = V_vent / V_room  ← v1.9.2: 由 max() 反算的等效换气次数
通风显热散热 = 0.34 × V_room × ACH_eff × (1 − ventHeatRecovery) × (T_room − T_air)
单位: W (kW = 上式 / 1000)
0.34 = ρ_air × c_p,air / 3600 = 1.2 × 1005 / 3600 (W/(m³·K·ACH))

显热计算 (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.7 通风净额与自然通风上限 v2.4 新增

28.7.1 风机送进车间的那股空气也是新风

28.6 把新风量定成 max(ACH × V_room, V_CO₂), 但它默认这份风全部由通风系统提供。 在空气曝气拓扑下这一点不成立: K-101 鱼池增氧鼓风机没有排气风管, 它吸室外空气、气泡穿过池水、从池面进入车间 —— 气路是 OUTDOOR → INDOOR

该气流的进气侧为室外(设计裁决: 所有风机进气都自室外, 经风管取气)。 ⇒ 它就是新风: 450 ppm 的室外空气进了车间, 从车间 CO₂ 质量平衡看, 它与通风口进来的空气没有任何区别

v2.4 之前这股风一分未计, 两笔账同时错:

V_vent_supply = 通风系统提供的部分  V_blower_indoor = Σ(sink=INDOOR 且接触水的气流)
V_vent_total  = V_vent_supply + V_blower_indoor  (CO₂ 稀释按【穿堂总量】算)
工况K-101 入室风量 m³/h(苗种/中鱼/成鱼)占通风需求
罗非 air + 开塔 · 恒温 ACH 1.0476 / 1,752 / 4,22844.5% / 44.5% / 36.9%
罗非 air + 关塔 · 恒温 ACH 1.0476 / 1,752 / 4,23916.6% / 12.7% / 10.8%
石斑 air + 开塔 · 机械通风555 / 2,245 / 5,47641.4% / 23.1% / 15.4%
自然通风 ACH 15同上4.3%
任意纯氧拓扑00%

⚠ 抵扣量单源自气流登记表 collectAirStreams, 不在别处另算一份 —— 否则新增气流时两处会漂移。断言 V3 静态锁住这一点。
不新增"超额排风热损"项: 自由空气节点求解器已把该气流作为独立股入解 (温度平衡分母含 mEx·cp, 湿平衡含 mEx), 恒温恒湿档由 m_indoorExhaust 承载 且显热恰为零(该档室温 ≡ 水温)。再加一项即把它的焓算第二遍。
⚠ 纯氧拓扑下抵扣量恒为 0 ⇒ 13 条数值基线逐位不变。 这既是"可以放心改"的理由, 也意味着基线在这里什么都保证不了 —— 必须靠空气曝气锚定工况。

28.7.2 报告口径: 机械换气 vs 总换气

抵扣后 ACH_eff 会失真 —— 它可能报出"换气 0.3 次/h"而车间实际有 K-101 那股在穿堂。故拆成两个:

定义用途
ACH_eff(机械)V_vent_supply / V_room通风机选型 · 风管 CAPEX · 通风显热 UA · 湿平衡
ACH_totalV_vent_total / V_room界面显示 · 结露判定的语境 · CO₂ 稀释

⚠ 通风显热与湿平衡只能用机械那一份 —— 风机送进来的那股在接触器与尾气项里已各自记账, 不得重复。

28.7.3 自然通风: 从"需要多少给多少"改为钳在设定 ACH 上

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₂ 限值 (人员暴露口径)本身就不成立。

自然通风档: V_vent_supply ≡ ACH × V_room (钳死, 不被 CO₂ 需求顶高)
缺口 V_vent_shortfall = max(V_vent_required − V_vent_total, 0) → 告警 + 报告披露
设 ACHCO₂ 需求实际供风缺口车间 ppm室温 °C
139,3046,49928,9154,42223.3
239,30412,99822,4162,89417.1
539,30432,4952,9191,5849.0
1539,30497,48508572.6
3039,304194,96906580.4

缺口 > 0 时模型不再替用户变出风量, 而是让车间 CO₂ 真的算超标, 并给出两条出路: ① 把自然通风量调高到所需次数以上(靠加大开口面积); ② 改用机械通风档, 由通风机承担这份风量。

⚠ 由此用户填的 ACH 终于有意义了 —— 从 4,422 ppm 一路到 658 ppm。
⚠ 附带效果: 车间 CO₂ 浓度此前恒等于设计限值(因为通风量是"恰好压到限值"的反解), 在自然通风档现在终于能报超标。
⚠ 本节不给自然通风建驱动力模型(需要开口面积、风速、热压等本库没有的参数) —— 见 15.9 已决取舍。

第 29 章双节点稳态热平衡求解v1.9.2 除湿机 + 阻尼迭代 v2.4 取值来源型断言

⚠ v2.0.0 架构变更 —— 请先读本节再看下文

本章 29.1–29.4 描述的是 v1.2–v1.9.3 的双节点稳态求解器,该求解器已在 v2.0.0 中删除。 保留这些内容是为了推导过程与历史参考,不再反映当前版本行为

v2.0 实际做法:
v1.2–v1.9.3v2.0.0
T_room空气节点方程的,自由漂浮 暖通维持 = 水温(输入)
RH_room湿平衡的解= roomRH_set(默认 65%,可调)
求解方式三节点联立 + Picard 迭代 / 闭式解无需求解(已删除)
池面显热 Q_pool_lossUA_pool × (T_w − T_room)≡ 0(温差为零)
钳位与能量丢弃T_room 钳位时静默丢弃缺口不存在
围护 / 通风 / 池壁混在水侧平衡 归暖通侧,折算电耗后计入总账(hvacKWhPerDay
气液接触器完全未计入 新增:脱气塔 + MBBR 曝气,出口按水温饱和

为什么改:旧模型对热带鱼种算出车间 9–14 °C / RH 99%,而实测与规范一致指向 「空气 ≥ 水温」(摩洛哥 Amghass 实测 16.0 °C / 鳟鱼水温 12–16;大连河豚车间实测 22–23 °C / 水温 17;ASHRAE Ch.6 与 CJJ 122 均要求空气比水温高 1–2 °C)—— 方向反了 15–20 K

v2.0 水侧热平衡(当前有效):
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.9.3 → v2.0.0」章节 A / B / C 三节。

29.1 v1.1 的简化模型与局限

v1.1 的热平衡是单点能量平衡: 给定 T_w(目标水温)和 T_air(室外气温), 直接算补水加热量 + 池散热量 + 鱼代谢热 + 设备产热, 平衡后给热泵装机。 这个模型忽略了车间空气节点, 默认池的热散到一个无限大的"室外"。问题在于:

29.2 双节点稳态方程 v2.0 已废止 v1.6 公式订正

v1.2 引入双节点稳态求解器, 联立水节点能量、空气节点显热、空气节点湿度三个平衡:

节点 1: 水体热平衡 (kWh/d)
Q_metabolism + Q_equipment + Q_makeup − Q_pool_loss − Q_evap × λ = Q_HP

其中: Q_pool_loss = UA_pool × (T_w − T_room) × 24/1000
Q_evap × λ = 蒸发潜热散热, 计入水体(水分子带走显热)
Q_HP = 热泵供热(负)或制冷(正)负荷
节点 2: 空气显热平衡 (W) — 仅含显热
UA_pool × (T_w − T_room) + Q_air_gain
= UA_other × (T_room − T_air)
+ UA_floor × (T_room − T_ground)
+ UA_vent × (T_room − T_air)

其中 UA_other = U_wall × A_wall + U_roof × A_building + U_window × A_window
UA_pool = poolU × poolArea (poolU 室内 5, 室外 18 W/m²·K)
UA_floor = U_floor × A_building (地板对的是 T_ground, 不是 T_air)
UA_vent = 0.34 × V_room × ACH × (1 − ventHR)
Q_air_gain = 水泵/UV 进空气部分的产热 [W]
节点 3: 空气湿平衡 (kg/s)
m_evap × cover × A_water = m_air × ACH × (W_room − W_air_outdoor)

其中 m_evap = β × (W_sat(T_w) − W_room) (kg/(m²·s), 蒸发可能为负=凝结)
m_air = ρ_air × V_room (kg)
W_sat(T) = 用 Antoine 方程或 Magnus 公式估饱和含湿量
📌 v1.6 公式订正(29 章)
旧手册把 + 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 迭代求解(实际代码用闭式解):

  1. 初值 T_room = T_air + 5, W_room = W_air_outdoor
  2. 用当前 T_room 算 W_sat, 用当前 W_room 算 m_evap
  3. 从节点 3(湿)解新 W_room(线性, 直接求)
  4. 从节点 2(空气显热)解新 T_room(线性, 闭式; 不含 m_evap×λ 项)
  5. 检查 |T_room_new − T_room_old| < 0.01°C → 收敛, 否则回 2
  6. 典型 1 次闭式解即可收敛(v1.2 闭式解已替代迭代,强通风/高湿度场景仍可用 Picard)

29.3 蒸发凝结模型

蒸发率 m_evap 用Lewis 传热传质类比简化。同一个系数有面积口径与体积口径两种写法, 差一个空气密度, 混用是量纲错误的常见来源, 这里两种都给出:

面积口径  m_evap [kg/(m²·s)] = β_A × (W_sat(T_w) − W_room)
  β_A = h_c / (c_p,air × Le^(2/3))  [kg/(m²·s)]

体积口径 (代码实现)  m_evap [kg/s] = β × ρ_air × cover × A_water × (W_sat(T_w) − W_room)
  β = h_c / (ρ_air × c_p,air × Le^(2/3))  [m/s]   β_A = β × ρ_air

h_c = 4.0 + 6.0 × v_air  [W/(m²·K)]  v_air = 室内空气流速 (默认 0.15, 密闭 0.05, 开放 0.4 m/s)
Le^(2/3) ≈ 0.91  (空气-水蒸气系统)

典型值  β ≈ 0.0035 – 0.010 m/s  ⇔  β_A ≈ 4.2×10⁻³ – 1.2×10⁻² kg/(m²·s)

W 为含湿量 (humidity ratio, kg 水/kg 干空气, 无量纲), 因此面积口径的 β_A 量纲必然是 kg/(m²·s), 而 h_c/c_p 恰好就是这个量纲 — 这是 Lewis 类比在工程上好用的原因: 只要知道对流换热系数, 传质系数就出来了。

⚠ v1.9.1 修正: 两处错误
(1) 代码里的错误出处 (高估 13 倍) — v1.9 及更早版本的代码注释声称 β 取自 ASHRAE 的 0.045–0.075 m/s。ASHRAE / Carrier 的池面蒸发系数数值区间确实如此, 但那是定义在蒸气压差上的英制系数 [lb/(h·ft²·inHg)], 不能当作定义在含湿量差上的 β [m/s] 使用。交叉验证: 把 ASHRAE 的 0.089 正确换算到含湿量基准, 同样得到 β ≈ 0.005 m/s, 与 Lewis 类比一致。

(2) 本手册 v1.2–v1.9 印错的典型值 — 旧版本此处写 "β 典型值 ≈ 2–5 × 10⁻⁴ kg/(m²·s)", 与它自己给出的公式矛盾: 要得到 2×10⁻⁴, 需要 h_c ≈ 0.2 W/(m²·K), 而静止空气自然对流最低也有 2–5 W/(m²·K)。 正确量级应为 10⁻³ – 10⁻² kg/(m²·s), 已按上式更正。

公式一直是对的, 错的是代码的取值出处和手册的典型值。
实测量 (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%, 大量凝结。 凝结水自动加到补水量减项, 反映节水效益:

V_condense_recovery = |m_evap| × A_water × 86400 / 1000 (m³/d)
V_makeup_actual = V_makeup − V_condense_recovery

29.4 求解输出 v2.0 已订正

⚠ v2.0.0 字段口径变更
字段v1.xv2.0.0
T_room求解输出,T_air + 5 ~ +12 °C 输入 = 水温(暖通维持)
RH_room求解输出 55–80% 输入 = roomRH_set,默认 65%
Q_pool / Q_pool_loss5–30 kW ≡ 0(温差为零)
T_room_raw / T_room_clamped /
Q_clamp_gap_kW / iterCount
钳位与迭代诊断 保留为常量(null / false / 0),仅为下游载荷向后兼容
v2.0 新增字段:
字段含义典型值
contactorAirFlowM3h接触水的气流合计(脱气塔 + MBBR 曝气) 三文鱼 1000 t 全场 96,287 m³/h
contactorDeltaH_kJ_kgMollier 焓差,可为负 青岛冬 +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当前工况 COP2.5-5.5
ACH_eff v1.9.2等效换气次数 (max 口径反算)1.0-3.0
ventBoostedByCO2 v1.9.2CO₂ 需求是否已顶替 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

29.5 RH 警告与除湿路径 v1.9.2 修订

当车间 RH > 85% 时应加除湿措施 (否则结构件腐蚀、电气故障、霉菌)。iRAS 在 RH 接近饱和时给出醒目提示。 四条可选路径, 但它们的有效性强烈依赖气候:

路径湿热气候 (海南夏)干冷气候 (挪威冬)代价
增加 ACH❌ 无效 — 室外更湿, 通风越多越湿✅ 有效但用不上 — 仅需 0.14 ACH, 远低于 CO₂ 需求通风加热/制冷能耗
加密闭池盖✅ 有效 — 直接砍蒸发源头✅ 有效操作不便, 巡池/投饵受限
机械除湿机✅ 主力手段一般不需要电耗 + 冷凝热去向 (见 29.7)
排风热回收❌ 帮助有限✅ 有效 (显热为主)初投资
⚠ v1.9.2 修订
v1.9 及更早版本把"增加 ACH"列为首选建议, 这在湿热气候下是错误建议: 当室外含湿量高于室内目标值时, 增大新风同时增加湿负荷与制冷负荷, 越治越糟。 v1.9.2 起除湿改由机械除湿机承担, 新风只负责空气质量 (详见 28.6.4)。

29.6 热泵分类型

v1.2 拆出 4 种热泵, 各自的 COP 和源温模型:

类型COP_heatCOP_cool源温适用
空气源 air3.5-4.02.5-3.0T_air常规, 气温 > -10°C
水源 water4.5-5.53.5-4.5T_source有大量地下水/河水
地源 ground4.0-5.03.5-4.5T_ground (≈年均)有埋管空间
海水开式 seawater_open4.5-5.53.5-4.5T_seawater沿海/海上养殖, 钛板换热

不同热泵类型的源温和 COP 在 globalThermalConfig 中可独立设置。

29.7 机械除湿机 v1.9.2 新增

29.7.1 为什么需要独立建模

湿热气候养冷水鱼 (海南 / 华南养大西洋鲑、虹鳟) 是国内 RAS 的典型场景, 也是湿度问题最尖锐的场景: 水温 12–15°C 远低于室内空气露点, 水面持续凝结, 车间 RH 长期在 90% 以上。 而如 28.6.4 所述, 这种气候下通风不能除湿 — 唯一可行的手段是机械除湿。

29.7.2 参数

字段默认值范围说明
dehumEnabledfalse开 / 关是否配置机械除湿机
dehumTargetRH70 %40–90控制目标相对湿度。泳池馆 ASHRAE 建议 50–60%; RAS 车间可放宽到 65–75% (兼顾能耗); >85% 有霉菌与腐蚀风险
dehumSMER2.5 kg/kWh0.5–6比除湿效率 (Specific Moisture Extraction Rate)。冷凝式典型 2–3, 转轮式较低, 热泵型可更高
dehumCondRecoverytrue开 / 关冷凝水是否回收作补水
dehumHeatDestoutdooroutdoor / indoor / water冷凝器排热去向 — 对制冷负荷影响极大, 见 29.7.4

29.7.3 物理模型

除湿机投入后, 车间含湿量被锁定在目标值 (而非由蒸发与通风自由平衡), 除湿量由湿平衡反推:

W_target = humidityRatio(T_room, dehumTargetRH)

除湿机投入判据: W_room_unconstrained > W_target

m_dehum = β·ρ·cover·A_water × (W_sat(T_w) − W_target) − m_air × (W_target − W_out)
    └ 水面蒸发产湿 ──────────────┘  └─ 通风已带走的部分 ─┘

除湿机电耗 (kWh/d) = m_dehum (kg/d) / SMER
冷凝水回收 (m³/d) = m_dehum (kg/d) / 1000  (若 dehumCondRecovery = true)

即: 除湿机只承担通风排不走的那部分湿负荷。这保证了两种手段不重复计算, 也解释了为什么干冷气候下除湿机自动退出 (通风已足够, m_dehum 算出来 ≤ 0)。

29.7.4 冷凝热去向 — 容易被忽略的大项

冷凝器排热 = 移除的潜热 + 压缩机功。能量守恒: 进入除湿机的能量全部由冷凝器排出。 海南夏季实测该值达 3687 kWh/d (= 潜热 2322 + 压缩机 1365), 是同工况水面凝结放热的 3 倍。 v1.9.2 首版实现完全没有处理这股热量 (隐含假设排至室外), 属于建模遗漏 — 若实际用的是吊装式除湿机, 这些热全进车间。
去向对应设备形式模型处理后果
outdoor (默认)独立风冷机组, 冷凝器在室外不参与热平衡不影响车间温度
indoor移动式 / 吊装式除湿机参与 T_room 求解车间显著升温, 制冷负荷大增
water高端热回收机组计入水侧净热冬季可省加热能耗

29.7.5 实测: 海南夏季 (1000 t 三文鱼)

指标不配除湿机配除湿机 (目标 70%)
车间 RH92 %70 %
水面凝结放热2152 kWh/d1222 kWh/d
除湿机电耗01365 kWh/d
冷凝水回收03.4 t/d
总电耗基本持平 (省下的制冷 ≈ 除湿机耗电)
📌 工程意义
配除湿机不是为了省电, 而是为了把湿度从 92% 压到 70% — 换来的是避免霉菌、结构件与电气柜腐蚀、 仪表与变频器故障。这与泳池馆的工程共识一致: 湿度是可靠性问题, 不是能耗问题

模型的价值在于把这笔账摊开 — 让设计者看清"多花 1365 kWh/d 换 22 个百分点湿度"这个交换是否值得, 而不是被一个 RH 告警吓住, 或者反过来对高湿度的长期代价毫无概念。

29.8 冷凝热耦合与阻尼迭代 v1.9.2 新增

29.8.1 耦合链与振荡

dehumHeatDest = indoor 时, 除湿机与空气节点构成强负反馈回路:

m_dehum ↑ → 冷凝器排热 ↑ → T_room ↑ → 同 RH 下的目标含湿量 W_target ↑
    → 除湿机退出 → 排热归零 → T_room ↓ → 除湿机重投 → ...

直接用 Picard 迭代 (每次把新值原样代入) 会发散振荡: 实测 T_room 在 22.5 ↔ 40°C 之间来回跳, 6 次迭代后取最后一次值完全不可信 — 取到哪个值纯粹取决于迭代次数的奇偶。

29.8.2 欠松弛阻尼

Q_new = Q_old + ω × (Q_raw − Q_old)    ω = 0.25 (阻尼系数)
迭代上限 12 次, 收敛判据 |Q_new − Q_old| < 50 W

每次只向新解移动 25%, 把振荡压成单调收敛。实测 5 次以内收敛到 T_room = 30.2°C、除湿量 2012 kg/d。

29.8.3 收敛性验证

阻尼法有一个固有风险: 它总能"收敛"到某个值, 但那个值未必是真实物理解 — 阻尼系数取得越小, 越像收敛, 也越可能只是在原地不动。验证方法是用四组不同阻尼系数分别求解, 若都收敛到同一点, 则该点是方程组的真实不动点, 而非阻尼参数的产物。本模型四组参数结果一致。

⚠ 教训
耦合迭代的收敛性必须单独做数值验证, 语法检查和界面点击测试都发现不了这类问题 — 默认工况除湿机不投入 (dehumEnabled = false), 界面上一切正常, 振荡只在特定参数组合下才暴露。

判别信号: 若 converged = falseiterCount 顶到上限 12, 说明该工况下解未收敛, 输出的 T_room / 除湿量不应直接采信, 需检查参数是否落在合理范围。

第 30 章P&ID 工艺图自动生成v1.3.x 新章

30.1 P&ID 是什么

P&ID(Piping & Instrumentation Diagram, 工艺管道仪表流程图)是化工/环保工程的核心设计文档, 描述工艺单元、管道连接、流向、关键仪表和控制逻辑。一份完整的 P&ID 应包含:

30.2 iRAS 的 P&ID 生成方案

v1.3.x 提供独立 P&ID 查看器 pid.html, 主页面"📐 输出 P&ID"按钮一键打开。 数据流:

  1. 主页面计算完成后, "输出 P&ID"按钮把当前方案数据序列化为 JSON, 存到 localStorage
  2. 新窗口打开 pid.html, DOMContentLoaded 时自动读取 localStorage 数据并渲染
  3. 主页面再次点击时, 通过 postMessage 通知已打开的窗口刷新

30.3 工艺图布局

v1.3.x P&ID 采用两层布局:

主流层(上半部 y=560):

T-101 鱼池 → F-201 微滤 → B-301 MBBR → C-501 CO₂ 脱气 → S-101 集水池

P-101 主泵

A-601 增氧锥 → 回 T-101 (高架回水管)

旁路(从主流 T 接头取水):

公用工程层(下半部 y=900):

30.4 LOX 跟随阶段切换 (v1.3.x)

v1.3 早期版本中, LOX 储罐显示的氧耗是全场总和 (summary.totalLOXKgD), 不论用户切换到哪个阶段都不变。 v1.3.x 修复为当前阶段氧耗 (stage.load.o2DailyTotal), 切换阶段时同步更新。

右上角元数据"全场氧耗"保持不变(那本来就是全场总和的语义, 用于储罐选型)。

30.5 设备表自动生成

P&ID 底部自动生成设备表, 含 tag/中文名/规格/数量列表:

tag名称规格示例(成鱼期)
T-101鱼池8 池 × Φ8.8 × 7m, 423 m³/池
F-201微滤机Q 11170 m³/h, η_TSS 75%
B-301MBBR 生物滤池V 438 m³, η_TAN 70%, 填充率 50%
C-501CO₂ 脱气塔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-401UV 消毒(旁路)α 10%, 38 kW @ 40 mJ/cm²
R-801反硝化反应器(旁路)α 10%, V 129 m³
V-901LOX 储罐1113 kg/d (成鱼期), 3 t 储罐
X-901AOP 高级氧化(公用工程)α 5%, V 17 m³

30.6 主泵 VFD 联锁示例

主泵 P-101 由鱼池 DO-101 通过 PID 闭环控制 VFD 频率, 维持鱼池 DO ≥ 鱼种最低饱和度 × DO_sat。 联锁线在 P&ID 中表示为虚线箭头从 DO-101 指向 P-101_VFD

类似的联锁包括:

30.7 P&ID 导出

pid.html 支持SVG 直接打印(浏览器 Ctrl+P → 保存 PDF) 或SVG 文件下载(右键保存)。 SVG 矢量格式, 缩放无损, 可在 AutoCAD/Visio 中导入用作工程图基础。

第 31 章设备清单导出v1.3.x 新章

31.1 设备清单的工程用途

设备清单是工程设计的核心交付物之一, 用于:

31.2 iRAS 设备清单结构

v1.3.x 提供独立设备清单页面 equipment.html, 主页面"📋 导出设备清单"按钮一键打开。结构:

  1. 项目元信息: 鱼种 / 年产量 / 保存时间
  2. 各阶段独立清单(苗种期 / 幼鱼期 / 中鱼期 / 成鱼期)
  3. 每个阶段下:
    • 多模块并联说明(N 个模块)
    • 鱼池配置(数量 × 直径 × 深度 × 单池容积)
    • 主流设备(T-101 / F-201 / B-301 / C-501 / S-101 / P-101 / A-601)
    • 旁路设备(S-701 / D-401 / R-801)
    • 公用工程(V-901 / G-901 / X-901 / K-302 / H-801)
    • 分阶段小计金额
  4. 全场合计(所有阶段加和)
〔v2.3.3 更正〕 上表已随代码更新: P-202 RDF 反冲泵自 v1.6 起 不再独立列项(RDF 厂家整体出厂含反冲泵); 项目元信息行现另带 方案版本 / 本页版本两个版本号(见 31.8)。

31.3 N+1 备用展开

清单中每个设备按"主用 + 备用"展开。例如成鱼期 4 模块, 每模块主泵需要 P-101 75 kW × 2 台, 加 1 台备用:

模块号设备规格数量
模块 1P-101 主泵(主)75 kW × 488/4=122 / 75 ≈ 2 台2
模块 1P-101 主泵(备用)同上1
模块 2P-101 主泵(主)同上2
模块 2P-101 主泵(备用)同上1
…(其他模块)…
全场P-101 主泵 合计75 kW12 台(8 主 + 4 备)

31.4 单价与金额

设备单价在主页面"单价配置"区设置, equipment.html 自动读取并计算:

设备小计 = 数量 × 单台容量 × 单价(元/容量)
全场设备直购 = 各设备小计加和
工程总投资 = 设备直购 × 放大系数(默认 2.2)

放大系数 2.2 涵盖管道阀件 / 电气仪表 / 自控 / 安装调试 / 土建厂房 / 设计监理(详见第 22 章)。

31.5 单列静设备说明

某些设备虽然容积大、价值高, 但不需要 N+1 备用, 而是单列 + 旁路阀设计。例如:

设备不需备用的原因故障应对
MBBR 生物滤池 B-301填料缓冲数小时, 故障时减投饵旁路阀让水绕过, 投菌剂时再开
反硝化反应器 R-801NO₃ 累积慢, 可承受数日停机旁路阀让水绕过
蛋白分离器 S-701DOM 积累慢旁路阀
CO₂ 脱气塔 C-501风机有 N+1, 塔体本身没动风机切换
液氧储罐 V-901主+备双罐设计切换

设备清单上这些标识为"1 套 (单列 + 旁路阀)", 不展开成多份。

31.6 数据传递机制 (v1.3.x)

主页面和 equipment.html 之间的数据通过 localStorage 共享(iRAS_equipmentExport key), 跨 tab 同步:

  1. 主页面点"导出设备清单" → buildPIDExport() 生成完整数据 → 写入 localStorage
  2. 新窗口 window.open('equipment.html') 打开, DOMContentLoaded 读取 localStorage
  3. 主页面再次点击 → 写入新数据, postMessage 通知已打开窗口刷新
  4. 读取后立即清除 key, 防止刷新页面看到陈旧数据

v1.3.x 把 P&ID 和设备清单的 key 拆成两份(iRAS_pidExportiRAS_equipmentExport), 让两个独立窗口可以同时开着, 各自显示最新数据互不干扰。

31.7 清单完整性: 少四台设备, 而总价对得平 v2.3.3

下游审计发现: 本页各组的行此前是硬编码的, 于是清单冻结在写它那天的设备集合。 实测缺 四台 —— 全是 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 逐项清单中所有带位号的条目, 否则转红。

31.8 让设备自己说清"为什么是这个规格" v2.3.3

采购方拿到清单, 看到的往往只有风量与功率, 看不出这台设备为什么是这个规格 —— 而这决定了后续处置。两处已补:

设备补充的信息为什么采购方需要它
K-101 鱼池增氧鼓风机选型控制侧(O₂ 传质 / CO₂ 吹脱, 两侧风量并列)· 设计 DO 及其来源(用户设定 / 留空回落)· 实际 OTE 与清水基础 · 池底布气与体积曝气强度被 O₂ 顶大与被 CO₂ 顶大, 后续处置完全不同: 前者降密度或加深池, 后者上脱气塔。曝气强度超限时另给出该阶段可行密度上限
KV-1003 车间通风机控制项(CO₂ 稀释需求 / 换气次数 ACH, 两侧并列)· 车间稳态浓度与设计限值由 CO₂ 顶大的风机, 一旦改增氧方式或脱气塔配置就必须重选, 不可沿用。此前只显示"0.4 kW · 2863 m³/h", 看不出这一点

⚠ 这两组数据全部取自主页面已导出的 aeration / aerIntensity / indoorCO2 三个块, 本页不重算任何一个数 —— 否则就又造出了第二个数据源。

版本一致性 v2.3.3: 本页版本号跟随主页面 (此前自标 v1.3, 与主页面各自演进)。元信息行现同时显示方案版本本页版本, 两者不一致时给出警示 —— 用旧版本存的方案在新页面上打开会走各处兼容回退, 结果看起来正常但口径是混的, 而此前没有任何信号。

第 32 章4 工况成本对比基线v1.3 新章

32.1 为什么要看 4 个工况

RAS 项目选址决定了气候/水温, 不同地区的成本差异巨大。v1.3 提供 4 个典型工况的标准化对比, 帮助:

32.2 标准基线(1000 t/yr 三文鱼)

⚠ 本节为历史数据:下表是 v1.3 / v1.7 当时版本的实测值,保留作为版本演进记录。当前基线(v1.9.2)见"版本演进说明 → v1.9 → v1.9.2 → F 节":青岛冬 35.59 / 海南冬 36.95 / 海南夏 37.37 / Bergen 冬 35.61 元/kg(工艺运行成本口径)。

使用 v1.3 默认参数, 4 工况下综合成本(含 CAPEX 折旧, 不含人工/苗种):

工况气温 / 源水OPEX折旧综合 元/kg
青岛冬季 设计冬-7°C / 4°C22.413.635.96
海南冬季 设计冬17°C / 22°C24.113.637.70
海南夏季 设计夏32°C / 27°C26.913.640.47
挪威 Bergen 设计冬0°C / 4°C22.713.636.30

32.3 关键观察

  1. 挪威成本接近青岛: 挪威冬季气温比青岛温和(0°C vs -7°C), 但源水温度都是 4°C 左右, 水温维持成本相近。挪威夏天比青岛凉(避免制冷), 长期成本可能更优。
  2. 海南夏季最贵: 三文鱼养殖目标水温 12-15°C, 海南夏季气温 32°C, 制冷温差 17-20°C, 制冷电费暴增。 不建议在海南养三文鱼。
  3. 海南冬季并不便宜: 冬季气温 17°C 高于水温 12°C, 仍需要制冷(虽然量小)。比青岛冬季略贵约 5%。
  4. OPEX 差异主要在热泵: 4 工况 OPEX 差异 4.5 元/kg, 其中热泵成本占 3-3.5 元/kg。

32.4 与文献的对照

文献来源项目综合成本 元/kgiRAS 偏差
Atlantic Sapphire (2023)迈阿密 RAS 三文鱼60-70(含人工/苗)iRAS 不含软成本, 偏低 25-30
Stolt Sea Farm欧洲大菱鲆40-50iRAS 大菱鲆 48.1, 接近
国家海水鱼体系 2019大菱鲆 500 t46.32iRAS 偏 +4%
国内罗非 RAS规模 1000 t25-30iRAS 29.3, 接近
南方对虾 RAS100 t25-35iRAS 41.9, 偏高(规模效应未建模)

整体精度: iRAS 与文献偏差 ±10-20%, 对于工程概算用途(±40% 精度)足够。

第 33 章投资财务评价v1.4 新章

33.1 为什么需要财务评价

iRAS v1.3 之前的输出停在工程概算: CAPEX 万元 / 年 OPEX 万元 / 综合成本元/kg。 对于设计院做可研报告、业主做投资决策、银行做贷款评审来说, 这些数据只是起点—— 真正的关键问题是:

v1.3 之前用户必须自己导出数据到 Excel, 手算这些指标, 一份可研里财务评价部分通常占 30% 篇幅, 设计院做一份要花 1-2 周。v1.4 加入独立的投资财务评价页面 (finance.html), 把这部分自动化, 把 1-2 周压缩到几小时。

33.2 数据流与系统架构

finance.html 是个独立页面, 与主页面通过 localStorage 数据共享:

主页面 calculateAll → lastResults.summary 写入财务汇总

buildPIDExport → JSON (含 summary.finance + perStage[i].cost/capex)

localStorage['iRAS_financeExport']

finance.html 读取 → 用户调财务参数 → 输出 8 张表 + KPI + 图

导出 Excel (.xlsx, 7 工作表) 或打印 PDF

这个架构有两个优点:

  1. 解耦: 工程评估和财务评价是两个独立工作流, 工程师管主页, 财务管 finance.html, 同一份方案可以两人协作
  2. 不污染主页: 财务参数改了不会触发主页重算, 用户能在 finance.html 里快速做敏感性分析

33.2.1 与主页面成本模型的口径分工 v1.9.2

v1.9.2 主页面新增了维护、保险、补水、排污(工艺侧)与苗种、人工、管理费(企业侧)七个成本项, 与本模块自带的 repairRate / laborCost / adminRate 三个参数产生交叉。 分工如下:

成本项谁算处理
维护与备件财务模块(repairRate)主页面导出的 annualOpexForFinance剔除维护费,避免重复;保留财务模块单独使用时的完整性
苗种主页面财务模块没有这一项,主页面已将其并入 annualOpexForFinance漏算会让 IRR 严重失真——鳗鲡苗种占企业全成本 43%,漏算相当于每公斤少算 42 元
人工财务模块(laborCost)默认值由主页面提供(定员 × 人均年成本),用户仍可在本模块覆盖
管理费财务模块(adminRate)不冲突。注意两边口径不同:财务模块 = 收入 × adminRate;主页面 = 成本 × overheadRate
保险 / 补水 / 排污主页面财务模块无对应项,随 annualOpexForFinance 流入,不冲突
annualOpexForFinance = annualOpex − 维护费 + 苗种费
⚠ 向后兼容
老版本主页面不导出 annualOpexForFinance 时,财务模块回退到 annualOpex。 此时维护费会重复计算、苗种费缺失——两者方向相反: 鲑鱼以维护重复为主(成本高估约 2.65 元/kg),鳗鲡以苗种缺失为主(成本低估约 42 元/kg)。 使用旧方案数据做财务评价时须注意此差异。

33.3 用户输入参数 (17 个)

用户在 finance.html 顶部填写 17 个财务参数, 分 3 组:

参数默认值说明
📈 销售与产能
📈售价 (元/kg)按鱼种 (鲑 60 / 大菱鲆 80 / 罗非 22 / ...)出厂价
📈项目年限 (年)15评价期, 5-30 可调
📈第 1 年达产率 (%)30BF 培菌 + 鱼苗培育期
📈第 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 倍,会使同一份可研的成本表与财务章出现两个人工成本。老版本主页面未导出时回退到阶梯函数

33.4 现金流模型

财务评价的核心是逐年现金流。每年有 4 类现金流入流出:

每年净现金流分解 (t = 0..N):

1. 经营性现金流 (Operating CF)
= 销售收入 (revenue × ramp[t])
− 销售税金 (revenue × salesTax)
− 经营成本 (variable × ramp + fixed)
− 修理费 (capex_eq × repairRate)
− 管理费 (revenue × adminRate)
− 人工成本
− 所得税 (max(0, profit) × taxRate)

2. 投资性现金流 (Investing CF)
t=0: − fixedAsset (建设期一次性投入)
t=1: − workingCapital (流动资金)
t=N: + workingCapital + 残值 (末年回收 + 残值)
其中残值 = 设备投资 × 5% + 土建投资 × 20% (v1.5+ 修正, 拆分计算)

3. 融资性现金流 (Financing CF) — 仅"自有资金"视角才考虑
t=0: + loan (收到贷款)
t=1..loanYears: − interest − principal (还本付息)

全投资 CF = (1) + (2)
自有 CF = 全投资 CF + (3)
📌 v1.5+ 残值公式订正
旧版残值 = fixedAsset × 5% 是经验值, 但设备和土建残值率不同: 设备(8 年折旧周期, 通常 10-15 年报废) 残值 ≈ 5% (机电二手价值); 土建(20 年折旧周期, 通常 30-50 年使用) 残值 ≈ 20% (建筑物结构残值)。 v1.5 起拆分计算: 残值 = totalCapexEquip × 5% + totalCapexCivil × 20%。 对千吨级三文鱼项目, 旧公式低估末年残值约 8-12%, 即 NPV 偏低 0.3-0.5 个百分点(对回收期/IRR 影响小)。

33.5 IRR 求解算法

IRR (Internal Rate of Return) 是让 NPV = 0 的折现率:

NPV(IRR) = Σ_t CF[t] / (1 + IRR)^t = 0

这是非线性方程, iRAS 用 Newton-Raphson 迭代求解:

IRR_(n+1) = IRR_n − f(IRR_n) / f'(IRR_n)
其中 f(r) = NPV(r), f'(r) = − Σ_t [t × CF[t] / (1+r)^(t+1)]

起点 r=0.10, 收敛阈值 |Δr| < 1e-7, 最多 100 次迭代

当 Newton-Raphson 发散(典型场景: 多重 IRR 解或符号变化异常),自动切换到二分法兜底: 在 [-0.5, 5.0] 区间求 NPV=0 的根。两种算法配合, 能稳定处理常见的 RAS 项目现金流。

33.6 输出: 8 张标准财务表

遵循国家发改委《建设项目可行性研究报告编制规范》要求:

名称主要内容
1投资估算设备 + 土建/安装/电气/自控/设计 + 流动资金 = 项目总投资
2资金来源运用 + 还款计划自有/贷款比例 + 逐年利息/本金
3总成本费用估算 (满产年)经营成本 + 修理 + 管理 + 人工 + 折旧 + 利息
4销售收入和税金逐年: 达产率 → 产量 × 单价 → 销售收入 / 税金
5损益表逐年: 销售收入 − 各项成本 − 税 = 净利润
6现金流量表 (全投资)逐年净 CF + 累计 CF + 累计折现 NPV → IRR
7现金流量表 (自有资金)含贷款流入 + 还本付息, 算股东 IRR
8敏感性分析5 因子各 ±20% 对 IRR 影响, 按摆动排序

33.7 关键指标 (6 个 KPI)

指标定义判断标准
全投资 IRR (税后)项目所有现金流(不含贷款)的内部收益率> 折现率 (8%) → 财务可行
自有资金 IRR股东视角 IRR (项目 CF + 贷款流入 − 还本付息)有杠杆放大效应
NPV (净现值)按折现率折算到 t=0 的累计 CF 现值> 0 → 项目可行
静态投资回收期累计净 CF 首次 ≥ 0 的年份(线性插值)RAS 项目典型 5-8 年
动态投资回收期累计折现 CF 首次 ≥ 0 的年份静态值 + 折现影响
盈亏平衡点 (BEP)满产年净利润 = 0 时的产量比例< 75% 满产 → 安全裕度大

33.8 敏感性分析 (5 因子)

对项目 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%
📌 v1.5+ 敏感性 share 订正
旧版"share_feed = 55%, share_elec = 20%"是硬编码经验值, 仅适用于三文鱼 1000 t 项目。 v1.5 改为从实际 OPEX 占比动态读取: 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 项目永远是售价

33.9 实例: 1000 t 三文鱼 (青岛冬季工况)

⚠ 下表为 v1.3 参数下的历史算例,保留作为方法演示。 v1.9.2 参数下同工况实测:工艺运行成本 35.60 元/kg、企业全成本 40.49 元/kg、定员 17 人; 售价 60 元/kg 时全投资 IRR 17.94%、自有资金 IRR 26.73%、NPV 8221 万元、静态回收期 5.41 年

作为对照,鳗鲡 200 t(美洲鳗、售价 110 元/kg)在同一套参数下为 全投资 IRR 8.59%、NPV 仅 81 万元、静态回收期 9.10 年——刚过折现率门槛。 这与 2025 年鳗鱼行业进入低谷、龙头企业全年亏损 1.79 亿元的实况相符; 若按旧口径漏算苗种费(888 万元/年),该项目的财务指标会显著偏乐观。

用 v1.3 默认参数计算的方案数据 (CAPEX 14681 万 / 年 OPEX 2236 万 / 年折旧 1360 万), 售价 60 元/kg, 30% 自有 + 70% 贷款 (5%, 8 年), 折现率 8%, 项目 15 年:

关键指标

指标数值解读
全投资 IRR14.0%> 折现率 8%, 财务可行 ✓
自有资金 IRR20.5%贷款杠杆放大 6.5%
NPV @ 8%6878 万元正值, 创造 6878 万元股东价值
静态投资回收期6.3 年RAS 项目典型水平
动态投资回收期9.0 年含折现影响
盈亏平衡产量63.4% 满产实际产量打 7 折也能保本, 安全裕度大

敏感性 (按 IRR 摆动排序)

因子低值 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%
📌 工程解读
售价是 RAS 项目的第一风险因子。三文鱼售价从 60 跌到 48 元/kg, IRR 立刻降到 8% (折现率), 项目变得勉强可行。 所以 RAS 投资决策的关键是锁定下游销售渠道和价格——很多 RAS 项目失败不是工程出问题, 而是建成后市场价格波动让财务模型崩溃。

33.10 鱼种横向对比

用同样的 1000 t 规模, 不同鱼种和价格:

鱼种售价 元/kg全投资 IRR自有 IRRNPV 万元回收期结论
三文鱼6014.0%20.5%68786.3 年主流, 可行
三文鱼 (高端)8022.2%37.1%181504.5 年有溢价能力, 优秀
大菱鲆8038.0%73.2%288733.0 年毛利高 (国内底栖鱼供需)
罗非鱼22−2.5%−6.1%−6798不回本RAS 不适合罗非, 池塘已够便宜

这张表能直接告诉投资人: 不要用 RAS 养罗非鱼 — 不是技术问题, 是经济问题。 RAS 适合高单价 (> 40 元/kg) + 集约化要求高 (海水/北方/特殊品种)的鱼种。

33.11 Excel 导出

finance.html 用 SheetJS 库 (CDN 加载) 实现一键导出 Excel, 输出 7 个工作表:

  1. 1. 投资估算
  2. 2. 资金来源 + 还款计划
  3. 3. 损益表 (逐年)
  4. 6. 全投资现金流
  5. 7. 自有资金现金流
  6. 8. 敏感性分析
  7. 关键指标 (汇总)

设计院拿到 Excel 后可以:

📌 离线兜底
SheetJS 库通过 CDN 加载, 网络不通时 Excel 导出失败, finance.html 会弹窗提示用户改用打印 (Ctrl+P → 保存为 PDF)。

33.12 局限性与未来扩展

v1.4 财务评价的当前局限:

未来 v1.5+ 可能扩展的方向:

但所有扩展之前的前提是: v1.4 当前版本被实际用户用过, 反馈了真实问题。设计院、咨询公司、业主用一个月, 告诉我们哪里反人类、哪里数字对不上、哪里需要补字段——这才是优先级最高的下一步。

第 34 章可研报告生成器v1.5 新章

34.1 为什么需要可研报告生成器

v1.4 之前的 iRAS 输出层级是工程数据(P&ID + 设备清单 + 财务评价 Excel), 用户拿到这些数据后还需要手动整合到 Word 可研报告里。 这是 RAS 项目从"概念"到"立项"过程中的最大手工劳动:

v1.5 加入可研报告生成器 (report.html), 把 iRAS 的工程和财务数据自动套到 16 章扩展版可研模板中, 输出 .docx 文档。 设计院拿到后只需补充项目身份、场址自然条件、土建详细设计等"必须人工填写"的内容即可。 预期能把可研撰写时间从 1-2 个月压缩到 1-2 周

34.2 关键产品决策

v1.5 在设计阶段做了 10 个产品决策, 每个决策都直接影响实现方式:

  1. 范围: 完整版 16 章扩展版(适合大型项目+敏感地区)
  2. 模板版本: 政府立项发改委版(向下兼容银行/农业/私募版)
  3. 章节结构: 16 章扩展版(把环境影响和社会效益独立成章)
  4. 项目元数据: 标准 20 字段(平衡填表门槛和报告完整性)
  5. Word 模板获取: 不替设计院排版, 只输出结构化内容(每个院都有自己的模板, 替他们决定版式反而帮倒忙)
  6. 文字模板: 模板 + 条件分支(不用 LLM。可研是法律文件, LLM 幻觉风险与收益不成比例)
  7. 模板引擎: nunjucks(Jinja2 JS 移植, 语法标准, 后续可移植)
  8. docx 生成: docx.js (npm: docx)(浏览器侧懒加载)
  9. 模板存储: 内嵌 <script type="text/njk-template">(保持 iRAS 单文件部署传统)
  10. 元数据 UI: report.html 内弹出表单(主页面保持简洁, 只有真正生成报告的用户才填表)
📌 决策 5 — 不替设计院排版
这是 v1.5 最重要的产品决策。商业级可研生成器(如某些 SaaS)倾向于做"成品 Word", 但每个设计院都有自己的红头模板, 版式、字体、目录格式各不相同。iRAS 替他们决定版式反而帮倒忙——他们还是要把内容复制到自己的模板里。 v1.5 输出"结构化内容", 用户拿到后复制到自己院的模板里, 是更尊重设计院工作习惯的做法。
📌 决策 6 — 不用 LLM
大模型可以生成流畅的文字, 但 v1.5 拒绝了这条路线。理由:
1. 可研是法律文件, 一句错误的政策引用可能让项目立项失败
2. 同一项目两次生成结果不一样, 业主审核会困惑
3. 难以追溯每句话的来源
4. 依赖网络和 API 配额, 离线不能用
模板 + 条件分支虽然文字略呆板, 但确定性可追溯性是可研的核心要求。

34.3 16 章覆盖范围与自动化率

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 字段)、场址自然条件、土建详细设计、消防/环评/安评等专项内容(后三者必须由有资质机构出具)。

34.4 数据流与系统架构

主页面 calculateAll → lastResults.summary 写入财务汇总

buildPIDExport → JSON (含 farm + workflow + capex + opex + finance)

localStorage['iRAS_reportExport']

report.html 读取 → 8 命名空间 context 拼装

20 字段元数据表单(用户填) → context.project

nunjucks.renderString(template, context) × 16 章

parseTextToDocxChildren(text, dx, images) → docx 对象树

SVG 图(工艺流程/Tornado/累计 CF)→ Canvas → PNG → ImageRun

docx.Packer.toBlob() → 用户下载 .docx

34.5 8 个数据命名空间

模板里所有变量按以下命名空间组织:

命名空间来源主要字段
{{ 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 版本/模板版本

34.5b 第 9 个命名空间: warnings — 让报告说出"这方案有问题" v2.3.3

二批把模型告警做成结构化 configWarns 时就写明"报告侧消费"是目标形态。 下游审计发现实际情况比"未消费"更严重一档:

⚠ 告警数据根本没过桥。 configWarns / aeration / aerIntensity / 入室 CO₂ 四组量全都不在导出 payload 里 —— 报告侧想消费也没得消费。于是"报告照出成本、不带任何不可行标记"这句话 是字面成立的: 用户拿着一份 CO₂ 超标、曝气强度超限的方案, 可研报告里一个字都不提, 而经济指标照算照印。

v2.3.3 打通三段: 主页面过桥(断言 Y0–Y3 判逐位相等 —— 过桥是纯搬运, 任何差异都说明中间有人加工了, 而加工正是双源漂移的起点)→ 报告侧 warnings 命名空间归集 → 正文呈现

命名空间来源主要字段
{{ warnings }}iRAS perStage[].configWarns + indoorCO2items(逐条: 阶段/级别/问题/实测与判据/建议处置)· count · hasDanger · room(车间 CO₂ 与新风量)

⚠ 本层只归集与措辞, 不判定。判据全在主页面数据层(结果级 + 零新阈值); 若日后有人在报告侧加一条"报告独有"的判定, 那就是双源的开始。

34.5c 呈现取向: 显式披露, 不硬阻断 v2.3.3

三种取向都考虑过, 最终取显式披露:

取向做法为什么没选 / 选了
硬阻断检出严重告警就拒绝生成报告没选。"我知道超标, 就是要出个初稿"是正常用法; 挡住它只会让人绕过工具, 而绕过之后连告警都看不到了
显式披露固定新增一节, 有则逐条列、无则明写"未检出配置级告警"选了。让"这份报告有没有被检出问题"成为读者一定会看到的事实, 而不是需要去翻的东西
就地标注相关章节旁注一并选了。保证"看得见的地方就是该看的地方"

落地为三处:

  1. 15.5 设计边界与模型告警(新节): 逐条列出阶段/级别/实测与判据/建议处置; 无告警时明写"本方案未检出配置级告警"。含 15.5.1 车间 CO₂ 与新风量的设计边界 —— 通风机被 CO₂ 负荷顶大时明确标注"控制项 = CO₂ 稀释需求", 并提示改配置后必须重选。
  2. 第 5 章开头就地标注: 本章工艺参数是在哪些告警存在的前提下算出的。
  3. 第 16 章结论改条件式 —— 这是最要紧的一处。原来无论如何都印 「工艺技术上完全可行」; 现在检出 danger 级时降级为"工艺路线本身成熟可行, 但当前配置 存在 N 条告警……在告警处置或书面接受之前, 不应据此判定本方案工艺可行", 并要求在决策文件中留痕。
门禁: check_downstream_contract.jsC3 与 C4 有意不同源 —— C3 是静态判据(代码里写了 warnings 命名空间、15.5 小节、hasDanger 分支), C4 是运行时判据(拿一份必然带告警的方案真的渲染一遍, 检查正文里确实印出了告警条目)。 C3 防"删代码", C4 防"写了但被某个 if 挡住、谁也没发现"。 C4 另配两份取样: A 只带 warn 级、B 必带 danger 级, 后者专验结论章的措辞降级 —— 只有 A 时该判据没有工况能走到

34.6 嵌入 docx 的 3 张图

位置内容
图 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 渲染。

34.7 输出文件示例

三文鱼 1000 t/年项目, 用 v1.5 生成的可研报告大致规格:

项目数值
文件大小约 200-400 KB(含 3 张 PNG 图)
章节数16 章 + 封面
段落数约 800 段
表格数约 50 个
列表项约 380 个
粗体强调约 600 处
页数(Word 默认排版)约 60-80 页

34.8 局限性与未来扩展

v1.5 当前局限:

未来 v1.5.x / v1.6+ 可能扩展:

但所有扩展前提是: v1.5 当前版本被实际用户使用过, 反馈了真实问题

附 录
参数表 · 命名规范 · 文献

附录 A: 完整符号表

本附录列出 iRAS 所有版本 (v1.0 → v1.7) 使用的全部符号。

符号含义单位默认值 / 范围
质量平衡 + 浓度
Δ每循环污染物增量mg/L
R总通过率
C_out鱼池出水浓度mg/L
C_in回水浓度mg/L
η_rdfRDF TSS 去除率%75
η_bioBF TAN 硝化率%70
η_bioTSSBF TSS 去除率%20
VTR₂₀BF @20°C 容积去除率g/(m³·d)500
VDR₂₀反硝化 @20°Cg/(m³·d)800
θ_nit / θ_den温度系数1.10 / 1.08
f_sal盐度修正max(1−0.01S, 0.3)
SOTE氧传质效率%粗孔 8% / 微孔 18%
tanCoefTAN 系数0.092 (淡) / 0.110 (海水肉食)
RQ呼吸商1.0
v1.1 物理框架
o2BaseFactor20°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
co2BlowerPressureCO₂ 风压kPa2.5
co2BlowerEfficiencyCO₂ 风机效率%60
depYearsEquip设备折旧8
depYearsCivil土建折旧20
V_tank鱼池水体biomass / density
V_process工艺水体各设备水量合计
V_total系统总水体V_tank + V_process
v1.2 全局气候 + 围护
T_air_design_winter设计冬季气温°C-7 (青岛)
T_air_design_summer设计夏季气温°C32 (青岛)
T_air_annual年均气温°C13 (青岛)
T_source_design_winter设计冬季源水温°C4
T_source_design_summer设计夏季源水温°C24
T_source_annual年均源水温°C14
T_ground地温(年均近似)°C= T_air_annual
RH_winter / summer / annual3 工况相对湿度%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/h1.0
ventHeatRecovery排风热回收效率0 (国内) / 0.7-0.85 (北欧)
poolCover池盖类型none(1.0)/partial(0.4)/full(0.1)
buildingArea_user用户指定车间面积0(自动 = 1.6 × poolArea)
buildingHeight车间净高m6
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车间空气温度(求解输出)°CT_air + 5~12
RH_room车间相对湿度(求解输出)%55-80
W_room车间空气含湿量(求解输出)kg/kg0.008-0.020
m_evap蒸发率(负值=凝结)kg/(m²·s)±2-50 ×10⁻⁵
UA_envelope围护总 UA(墙+顶+窗)W/K500-2000
UA_pool池散热 UAW/KpoolU × poolArea
poolU池水对空气换热系数W/(m²·K)5(室内)/ 18(室外)
v1.3 模块化 + 鱼池配置
subSystemCount阶段并联套数(用户输入)1-10, 默认 1
numModules实际模块数 = subSystemCount≥ 1
poolsPerSet每套池数(用户输入)1-10, 默认 1
poolDepth_m单池深度(用户输入, 统一数据源)m0.5-8, 默认 = recDepth_m
recDepth_m鱼种推荐池深(SPECIES_DB)m0.8-7.0(按鱼种和阶段)
v1.3.x 新增
thermalSharingFactor共用车间散热系数0.5-1.0, 默认 0.75
V_sump集水池容积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主路时氧锥附加压头m3, 钳 [0, 15]
o2BypassRatio旁路占比 (bypass 模式)%10, 钳 [5, 30]
o2BypassPumpHead_m旁路泵 P-602 扬程m20, 钳 [5, 40]
o2BypassPumpEta旁路泵效率%60, 钳 [30, 85]
aopO3Dose_gm3AOP 臭氧投加剂量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 (溶解态)

附录 B: 全局热配置参数表(完整)

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,板换+冷源水可更高

附录 C: 设备 tag 命名总表

iRAS 完全采用 ISA-5.1 规范 tag 命名(字母+数字), 字母含义:

首字母含义示例
TTank 储罐 / 池T-101 鱼池
FFilter 过滤器F-201 微滤
BBiofilter / Bio-reactor 生物反应器B-301 MBBR
KKompressor 压缩机/风机K-101 鱼池增氧风机 v1.7 / K-201 CO₂ 风机 / K-302 BF 风机
DDisinfection 消毒D-401 UV
CColumn 塔/柱C-501 CO₂ 脱气塔
SSeparator / Sump 分离 / 集水S-101 集水池, S-701 蛋分
AAerator / Absorber 增氧 / 吸收A-601 增氧锥
RReactor 反应器R-801 反硝化
XeXtra / 高级处理X-901 AOP
GGenerator 发生器G-901 O₃
VVessel 大型容器 / 储罐V-901 液氧站级储罐
HHeat 热相关H-801 热泵
PPump 泵P-101 主循环泵 / P-602 氧锥旁路泵 v1.7
MMixer 混合点 / 管段配件 v1.7M-601 bypass 模式氧锥旁路混合点 (T 接头)

位号编号规则

仪表位号

tag 前缀类型示例
DO溶解氧DO-101 鱼池 DO 探头
pHpH 计pH-102 鱼池 pH
TT温度变送器TT-103 鱼池温度
LT液位变送器LT-104 鱼池液位
PDS压差开关PDS-201 RDF 压差
AT分析变送器AT-302 BF 出口 TAN
FT流量变送器FT-101 主管流量

附录 D: 鱼种参数表

iRAS 内置 9 个物种 (含 custom), 这里展示主要 4 种, 完整见软件。

品种阶段体重(g)FCR蛋白%feed%密度T°C盐‰recDepth_m
三文鱼苗种0.1→5061.0503.0301201.5
幼鱼50→50081.1451.5501403.0
中鱼500→200061.2421.06015125.0
成鱼2000→500041.20400.957015307.0
大菱鲆 v1.1苗种3→5040.9553.02516280.8
中鱼50→25081.1501.55016281.0
成鱼250→60061.3480.96016281.0
加州鲈苗种1→5020.9503.5252501.5
中鱼50→25041.1451.8402502.5
成鱼250→60041.3401.2502503.0
对虾苗种0.01→111.04510230151.5
养前1→101.51.3425830152.0
养后10→301.51.63831530152.5

完整 9 物种 (含罗非鱼/石斑鱼/鳗鲡/鳜鱼) 见 iRAS 软件内置数据库。recDepth_m 是 v1.3 新增的鱼种推荐池深字段。

附录 E: 参考文献

v1.0 引用

  1. Timmons, M.B., Ebeling, J.M. (2010). Recirculating Aquaculture, 2nd ed. Cayuga Aqua Ventures.
  2. Sharma, B., Ahlert, R.C. (1977). Nitrification and nitrogen removal. Water Research, 11(10).
  3. Benson, B.B., Krause, D. (1984). DO in freshwater/seawater. Limnol. Oceanogr., 29(3).
  4. USEPA (2006). UV Disinfection Guidance Manual (UVDGM). EPA 815-R-06-007.
  5. Summerfelt, S.T. et al. (2009). Ozonation and UV in RAS. Aquacultural Engineering, 40(1).
  6. Mateju, V. et al. (1992). Biological water denitrification. Enzyme and Microbial Tech., 14(3).
  7. Rusten, B. et al. (2006). Nitrification in MBBR. Aquacultural Engineering.
  8. Chen, S. et al. (2006). Nitrification kinetics in RAS. Aquacultural Engineering, 34(3).
  9. Nijhof, M., Bovendeur, J. (1990). Fixed film nitrification. Aquaculture, 87(2).
  10. Colt, J. (2006). Water quality in reuse systems. Aquacultural Engineering, 34(3).

v1.1 新增引用

  1. Boyd, C.E. (2018). Oxygen Demand of Aquaculture Feeds. Responsible Seafood Advocate.
  2. Davidson, J. et al. (2014). Atlantic salmon performance in RAS. USDA FWI.
  3. PR Aqua (2016). Low Head Oxygenator Design Standards.
  4. Vinci, B. et al. (2016). Saltwater RAS LHO. Aquacultural Engineering, 75:22.
  5. 国家海水鱼产业技术体系 (2019). 大菱鲆养殖产业调查数据. CARS-50.
  6. Stolt Sea Farm (2024). Annual Report - Land-based Turbot.
  7. Atlantic Sapphire (2023). Bluehouse RAS Technical Documentation.
  8. Delta Cooling Towers Inc. CO₂ Air Stripper Case Studies. www.deltacooling.com
  9. Suez Degremont. Water Handbook - CO₂ Degasification.
  10. 中国水产科学研究院黄海水产研究所. 大菱鲆工厂化循环水养殖技术研究. 2015.
  11. Hansa Engineering. CO₂ Stripping Column Internals. RVT Process Equipment.

v1.2 新增引用 (热平衡 + 围护)

  1. ASHRAE Handbook (2021). HVAC Applications, Chapter 22: Animal Environments.
  2. Lewis, W.K. (1922). The evaporation of a liquid into a gas. ASME, 44.
  3. Antoine, C. (1888). Vapeurs: nouvelle relation entre les tensions et les températures.
  4. Magnus, G. (1844). Versuche über die Spannkräfte des Wasserdampfes. Annalen der Physik.
  5. SINTEF Energy Research (2020). Heat Pumps for Aquaculture RAS Facilities.
  6. Mota, V.C. et al. (2019). The effects of carbon dioxide on growth performance, welfare, and health of Atlantic salmon post-smolt in RAS. Aquaculture, 498: 578-586.

v1.3 新增引用 (模块化 + 鱼池设计)

  1. Cornell University. Twin Drain Tank Design Guidelines (Cornell dual-drain RAS).
  2. Timmons, M.B. & Summerfelt, S.T. (2007). Pilot-scale evaluation of dual drain rectangular and circular tanks. Aquacultural Engineering.
  3. Atlantic Sapphire (2023). Annual Report - Modular RAS Architecture.
  4. AKVA Group (2022). Land-based Aquaculture: Standard Module Design.
  5. Billund Aquaculture. Modular RAS Design Standards (Denmark).
  6. Stolt Sea Farm (2024). Sustainability Report - Production Capacity Distribution.

v1.3.x 新增引用 (P&ID + 工程化)

  1. ISA-5.1 (2009). Instrumentation Symbols and Identification.
  2. ANSI/ISA-5.4. Instrument Loop Diagrams.
  3. ISA-S5.5. Graphic Symbols for Process Displays.
  4. API RP 14E. Design and Installation of Offshore Production Platform Piping Systems.

v1.4 新增引用 (投资财务评价)

  1. 国家发展和改革委员会、住房和城乡建设部 (2006). 建设项目经济评价方法与参数 (第三版). 中国计划出版社.
  2. 国家发改委 (2002). 投资项目可行性研究指南.
  3. 住建部 (2017). 中央政府投资工程建设项目可行性研究报告编制深度规定.
  4. 财政部 (2024). 企业会计准则第 4 号——固定资产折旧.
  5. Brealey, R.A., Myers, S.C., Allen, F. (2020). Principles of Corporate Finance, 13th ed. McGraw-Hill (NPV/IRR 理论).
  6. SheetJS Community Edition (2024). xlsx.full.min.js — Spreadsheet Data Toolkit. https://sheetjs.com

v1.5 新增引用 (可研报告生成器)

  1. 国家发改委 (2017). 政府投资项目可行性研究报告编制深度规定 (2017 年发改投资规〔2017〕1638 号).
  2. 建设部 (2007). 投资项目可行性研究指南 (试用版).
  3. nunjucks (Mozilla, 2014-2024). A rich powerful templating language for JavaScript. https://mozilla.github.io/nunjucks/
  4. docx.js (Dolan Miu, 2018-2024). Easily generate .docx files with JS/TS. https://docx.js.org/

v1.6 新增引用 (站级设备 + 物理校正)

  1. Mateju, V. et al. (1992). Biological water denitrification - A review. Enzyme and Microbial Technology, 14(3): 170-183. (反硝化碱度回收 2.5-3.0 g CaCO₃/g N 工程实测)
  2. Henze, M. et al. (1991). Activated Sludge Model No. 1. IAWPRC Scientific and Technical Report No. 1.
  3. Crittenden, J.C., Trussell, R.R., Hand, D.W. et al. (2012). MWH's Water Treatment: Principles and Design, 3rd ed. John Wiley & Sons. (反硝化化学计量)
  4. Mokhayeri, Y. et al. (2008). Kinetic characterization of methanol-utilizing denitrifying biomass. Water Environment Research, 80(5).
  5. Suhr, K.I., Pedersen, P.B. (2014). Methanol dosing in RAS denitrification. Aquacultural Engineering, 60: 47-54.
  6. Tsukuda, S. et al. (2015). Methanol-driven denitrification in marine RAS. Aquaculture Research, 46(11).
  7. 赵越, 刘鹰 (2018). 大西洋鲑 MBBR 设计参数研究. 大连海洋大学学报, 33(4): 543-549.
  8. Drønen, K. (2021). Atlantic salmon land-based RAS in Norway: V_process/V_total benchmark.

v1.7 新增引用 (氧锥拓扑 + 系统排水重构)

  1. Linde Gas (2020). SOLVOX cone 60 / 110 oxygenation system. Technical datasheet. (氧锥操作压力 3.0-3.8 bar, side stream 拓扑)
  2. Pentair AES (2021). Speece Cone Oxygenation: Engineering Design Manual. (玻璃钢锥操作压力 10-21 psi)
  3. PR Aqua (2019). PPC (Pressurized Production Column) High Pressure Oxygen Contactor Design Standards. (高压氧合柱 3-4 bar)
  4. Global Seafood Advocate (2019). Oxygenation in land-based RAS: cone vs LHO. "more often plumbed in side stream configuration" (大型 RAS 旁路拓扑工程实际)
  5. Sharrer, M.J. et al. (2010). Process and economic evaluation of microscreen drum filter backwash water recycling. Aquacultural Engineering, 43(1): 9-19. (RDF 反冲水 95-98% 清液回流)
  6. Wagner, M. et al. (2010). Standardized oxygen transfer testing for fine-bubble aeration in aquaculture. Aquacultural Engineering, 43(2): 33-41. (微孔盘曝气 SOTE 18-22%)
  7. Schroeder, J.P. et al. (2010). Comparison of ozone and ultraviolet light for the disinfection of recirculating water in marine RAS. Aquacultural Engineering, 42(1): 1-10. (AOP 臭氧投加剂量经验范围)
  8. Gonçalves, A.A., Gagnon, G.A. (2011). Ozone application in recirculating aquaculture system: an overview. Ozone: Science & Engineering, 33(5): 345-367.

v1.9.1 / v1.9.2 新增引用 (通风口径 + 除湿 + 蒸发系数)

  1. Terjesen, B.F. et al. (2013). Design, dimensioning, and performance of a research facility for studies on the requirements of fish in RAS environments. Aquacultural Engineering, 54: 49-63. (大西洋鲑 CO₂ 产量 409 g/kg 饲料)
  2. Vinci, B.J. et al. (2004). Carbon dioxide control in intensive aquaculture: design tool development. Aquacultural Engineering. (smolt 阶段 CO₂ 产量 550 g/kg 饲料)
  3. Heinsbroek, L.T.N., Kamstra, A. (1990). Design and performance of water recirculation systems for eel culture. Aquacultural Engineering, 9(3): 187-207. (鳗鲡 CO₂ 产量 536 g/kg 饲料)
  4. ASHRAE (2019). Standard 62.1: Ventilation for Acceptable Indoor Air Quality. (泳池馆新风标准 0.48 CFM/ft² 湿面积; 单一 CO₂ 浓度不足以作为通用通风充分性指标的立场)
  5. ASHRAE (2019). Handbook — HVAC Applications, Chapter 6: Places of Assembly (Natatoriums). (泳池馆除湿实践: 新风管空气质量 + 除湿机 4-6 ACH 内循环; 池面蒸发系数的英制蒸气压差定义)
  6. Incropera, F.P., DeWitt, D.P. (2007). Fundamentals of Heat and Mass Transfer, 6th ed. Wiley. (Lewis 传热传质类比 Le^(2/3), 对流传质系数推导)
  7. OSHA (2023). Permissible Exposure Limits — Annotated Tables, CO₂ 8-hour TWA 5000 ppm. (车间 CO₂ 限值取值参考上界)
关于蒸发系数的出处更正: v1.9 及更早版本的代码注释误将 ASHRAE 的池面蒸发系数 (定义在蒸气压差上的英制系数 [lb/(h·ft²·inHg)]) 当作定义在含湿量差上的 β [m/s] 引用。 v1.9.1 起改按 Lewis 类比 (文献 69) 推导。本手册第 29.3 节自 v1.2 起给出的公式一直是 Lewis 关系, 未受此错误影响 — 偏离发生在代码实现侧。

附录 F: 免责声明

本工具(iRAS)和本手册的计算结果仅供工程概算参考。

— 本手册全文完 —

© 2026 海南登登科技咨询有限公司 · 孙程
iras.cn · iras.dengdengtech.cn (国内) · github.com/chengsunmail/iras · 6881509@qq.com
本手册整合 iRAS v1.0 → v1.5 全部内容 · 完整版