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 在 calcStageLoad 中用 feedDesign = feedMax × peakFactor 算所有"日产污染物"。但 feedMax 已是日峰值, 再乘 1.2-1.5 在量纲上是"日总量再放大", 所有下游负荷被一刀切偏大约 17%。v1.1 严格分离三个时间尺度:
peakFactor 物理意义钉死: 代谢污染物 (TAN/O₂/CO₂) 小时峰值/全日均速率, 默认 1.5 (Timmons & Ebeling 2010 标准)。
| 类别 | 设备 | 选型基准 | 物理理由 |
|---|---|---|---|
| 慢动力学 | BF 滤池、反硝化、CO₂ 脱气、微滤、蛋分、UV | 日量 × safety | 菌膜代谢有惯性, HRT 数小时缓冲峰值 |
| 快动力学 | 鱼池增氧 (液氧)、BF 曝气风机 | 小时峰值 × safety | 氧气即时消耗, 投喂 30min 内 DO 可见底 |
v1.0 用 0.25 一刀切违背物种特性差异。v1.1 改为按物种 + 温度自动算:
| 物种 | o2BaseFactor | o2Q10 | 典型值 | 依据 |
|---|---|---|---|---|
| 鲑鱼 | 0.32 | 2.0 | 0.20-0.23 | Atlantic Sapphire / Davidson 2014 |
| 大菱鲆 | 0.28 | 2.0 | 0.21-0.22 | 黄海所 / 莱州东方海洋实测 |
| 罗非鱼 | 0.16 | 2.0 | 0.26-0.30 | Blue Ridge / FAO 实测 |
| 石斑鱼 | 0.18 | 2.0 | 0.28-0.32 | 南海所 实验数据 |
| 加州鲈 | 0.19 | 2.0 | 0.26-0.28 | 广东海大 |
| 鳗鲡 | 0.13 | 2.0 | 0.20-0.22 | 福建天马 (粉料代谢慢) |
| 对虾 | 0.31 | 1.3 | 0.40 | Boyd 2018 (Q10 偏低反映高温饱和) |
v1.0 没有 CO₂ 脱气塔模型 (仅在增氧节点扣 70% 写死)。v1.1 作为独立设备建模, 默认参数与 Delta Cooling Towers 工业项目实测对齐: G:L=3, 风压 2.5 kPa, 风机效率 0.60, 单次脱气率 65%。
v1.0 大菱鲆 15/30/40 kg/m³ 偏低 (与莱州东方海洋等循环水项目实测 50-70 kg/m³ 不符)。v1.1 调整为 25/50/60 kg/m³。修正后大菱鲆综合成本从 81.5 元/kg → 48.1 元/kg, 与国家海水鱼产业体系 2019 调查数据 (46.32 元/kg) 偏差仅 +4%。
v1.1 设备 8 年 + 土建 20 年分别折旧, 加到日运行成本。引入完整 V_total = V_tank + V_process 建模 (典型 V_process 占 V_tank 的 30-60%)。换水率口径改为 V_total (行业标准 Timmons 2010 / 国家海水鱼体系)。详见第 8 章。
v1.1 把热平衡参数(气温/源水温/U 值/换气率) 放在每个阶段的 proc 字段里, 用户必须在每个阶段重复设置。
工程现实中这些是项目级常量。v1.2 把所有热平衡参数挪到顶部全局配置区
globalThermalConfig, 作为项目级常量影响所有阶段。新增地区预设(青岛/海南/挪威 Bergen/法罗群岛)、围护预设、4 工况对比(冬/夏/年均)。详见第 28 章。
v1.1 用单点能量平衡, 忽略车间空气节点。v1.2 改为双节点 Picard 迭代同时求解空气热平衡 + 空气湿平衡, 输出 T_room、RH、蒸发率/凝结率、热泵装机。详见第 29 章。
v1.2 引入完整车间围护参数: U_wall / U_roof / U_floor / U_window / windowRatio / airChangeRate / ventHeatRecovery / poolCover。详见第 28 章。
大型项目(>1000 t/yr)拆成多模块并联: 每模块独立循环, 模块间共用液氧站/应急电源/控制中心。每模块内部按容量上限自动配 N+1 备用 (主泵/风机/RDF/UV/热泵)。模块数完全由用户在阶段卡片"🔧 套数" subSystemCount 决定。详见第 26 章。
用户给"每套池数 + 池深", 工具按总水体反推单池直径 D = √(4V/πH)。自动检查工程合理性: D < 4m / D > 30m / D > 20m 配 H < 3m 给告警。SPECIES_DB 各鱼种各阶段加入推荐池深 recDepth_m。详见第 27 章。
独立的 pid.html 查看器, 主页面"📐 输出 P&ID"一键打开, 自动渲染主流串联 + 3 条旁路 + 公用工程 + 仪表泡泡 + 联锁线 + 设备表。LOX 跟随阶段切换。详见第 30 章。
独立的 equipment.html 页面, 一键导出当前方案完整设备规格表, 含 N+1 备用展开 + 单价 + 合计金额, 支持打印/导出 PDF。详见第 31 章。
v1.3 早期版本中池深有两个独立输入(阶段卡片头 + 热平衡区), 容易混淆。v1.3.x 统一为一个数据源: stage.poolDepth_m → recDepth_m → proc.poolDepth → 1.5。同时用于池径反推 + 热平衡。详见第 27.5 节。
各阶段独立估算的散热相加 × thermalSharingFactor (默认 0.75) = 全场总散热, 反映多阶段共享车间的工程现实(共享外墙节省散热约 25%)。详见第 29.7 节。
V_process 加入集水池项 V_sump = clamp(Q/30, 20, 200) m³, P&ID 加入 S-101 标识。
v1.3 输出停在工程概算 (CAPEX 万元 / OPEX 元/kg), 用户拿这个数据再去 Excel 手算财务评价 (NPV/IRR/回收期) 是当前主要的工作流痛点——一份可研报告里财务评价占 30% 篇幅, 设计院通常要花 1-2 周做完。 v1.4 加入独立的投资财务评价页面 (finance.html), 主页面"💰 投资财务评价"按钮一键打开, 按发改委可研编制规范输出 8 张标准财务表:
用户在页面顶部填 17 个参数 (售价、项目年限、产能爬坡、自有资金比例、贷款利率、折现率、所得税等), 计算引擎用逐年现金流模型 + Newton-Raphson 求 IRR, 实时输出关键指标。 支持一键导出 Excel (用 SheetJS, 7 个工作表) 和打印为 PDF。详见第 33 章。
v1.4 财务评价 6 个关键指标的定义全部按国内可研规范:
| 指标 | 定义 | 判断 |
|---|---|---|
| 全投资 IRR (税后) | 项目所有现金流(不含贷款本息)的内部收益率 | > 折现率 = 财务可行 |
| 自有资金 IRR | 股东视角现金流(项目 CF + 贷款流入 − 还本付息)的 IRR | 有杠杆放大效应 |
| NPV (净现值) | 按折现率折算到 t=0 的累计现金流现值 | > 0 = 可行 |
| 静态投资回收期 | 累计净现金流首次 ≥ 0 的年份(线性插值) | RAS 项目典型 5-8 年 |
| 动态投资回收期 | 累计折现现金流首次 ≥ 0 的年份 | 静态 + 折现影响 |
| 盈亏平衡点 (BEP) | 满产年净利润 = 0 时的产量比例 | < 75% = 安全裕度大 |
从 v1.0 到 v1.5 共 1 年多时间, iRAS 完成了从"单页工程概算"到"完整可研工作流"的演进:
| 版本 | 发布 | 核心能力 | 用户工作流 |
|---|---|---|---|
| v1.0 | 2026-04 初 | 稳态浓度计算 + 设备选型 | 看几个数,自己再 Excel 加工 |
| v1.1 | 2026-04 末 | + 物理框架重构 + CAPEX/OPEX + V_total | 能给出综合成本元/kg |
| v1.2 | 2026-05 初 | + 全局气候 + 双节点热平衡 + 4 工况对比 | 挪威/海南都能算 |
| v1.3 | 2026-05 中 | + 多模块并联 + N+1 备用 + P&ID + 设备清单 | 工程化的设计输出 |
| v1.3.x | 2026-05 | UI 整理 + 池深统一 + 共用车间散热 | 用户体验细节打磨 |
| v1.4 | 2026-05 末 | + 投资财务评价 (NPV/IRR + 8 张表 + Excel 导出) | 报告级输出 |
| v1.5 | 2026-05 末 | + 可研报告生成器 (16 章扩展版 + 模板 + docx 输出 + 图表嵌入) | 从工具到工作流 |
v1.4 之前的输出层级停在工程数据 (P&ID / 设备清单 / 财务表 Excel), 用户需要把这些数据手动整合到一份 Word 可研报告里。 一份政府版可研通常 80-150 页, 设计院做一份要花 1-2 个月。v1.5 加入可研报告生成器 (report.html), 按发改委编制规范输出 16 章扩展版可研, .docx 格式, 大幅压缩可研撰写时间。
v1.5 严格遵循以下技术决策:
| 章 | 名称 | iRAS 自动化率 |
|---|---|---|
| 1 | 总论 | 85% |
| 2 | 项目背景与建设必要性 | 50% |
| 3 | 市场分析与建设规模 | 60% |
| 4 | 建设场址与建设条件 | 30% |
| 5 | 工艺技术方案 | 95% |
| 6 | 主要设备方案 | 100% |
| 7 | 土建/总图/公用工程方案 | 50% |
| 8 | 节能节水 | 70% |
| 9 | 环境影响评价 | 60% |
| 10 | 劳动安全卫生与消防 | 40% |
| 11 | 项目实施与组织机构 | 65% |
| 12 | 投资估算与资金筹措 | 95% |
| 13 | 财务评价 | 100% |
| 14 | 国民经济评价 / 社会效益评价 | 50% |
| 15 | 风险分析 | 70% |
| 16 | 结论与建议 | 80% |
加权平均自动化率约 70%, 用户需要补充的主要是项目身份信息 (业主名/地址等 20 字段)、场址自然条件、土建详细设计、消防/环评/安评等专项内容(这些必须由有资质机构出具)。
v1.5 在 docx 中嵌入 3 张自动生成的图:
图表生成路径: 浏览器侧 SVG → Canvas → PNG → docx ImageRun。中文字体使用系统 SimHei/Microsoft YaHei, 高清 2× DPR 渲染。
v1.5 之前, 液氧储罐 (V-901) 作为阶段级设备计入 calcCapex, 每个阶段独立挂一笔储罐 CAPEX。 但 RAS 工程实际是全场单点供应: 多个阶段共用同一座液氧站, 计 4 次显然错误。 4 阶段千吨级项目可虚报约 30 万元 CAPEX。
v1.6 把液氧储罐从阶段 CAPEX 剔除, 挪到全场"③ 站级设备"区域, 增加 calcSiteCapex(stages, eqPrices, allResults)
函数计算站级 CAPEX 并加入工程总投资。用户可在 ③ 区调整规格 / 数量 / 单价, iRAS 按全场日耗自动推荐:
单价按规模指数公式 P = 100,000 × (size/3)^0.6 取值, 经标准档列表:
1 t ≈ 5 万 · 3 t = 10 万 · 5 t ≈ 14 万 · 10 t ≈ 22 万 · 20 t ≈ 35 万 · 30 t ≈ 47 万 · 50 t ≈ 65 万 (元/罐)。
P&ID 图 (V-901) / 设备清单 / 可研报告 全部同步显示规格 + "全场共用"标注。
v1.6 把 iRAS 主页面从"一长条信息流"重构为可扫描的工程师视角:
<details open> 替代 <section>, 用户可按需折叠看不到的区| 项目 | v1.5 旧 | v1.6 新 |
|---|---|---|
| MBBR 单价标签 | "生物滤池单价 (元/m³)" | "MBBR 池系统 (填料+曝气配件, 不含池体/风机) — 元/m³ 填料净体积" |
| 设备规格清单 MBBR | 仅显示净填料体积 | 净填料 + 池总容积 (按 fillRatio 反推) |
| 投资概算单价 | "500 /h"(单位 bug) | "500 元/(m³/h)"(正确显示) |
| 设备选型上限 | 硬编码 (8 RDF / 60 m³ MBBR ...) | 按 modFlow 自适应(支持千吨级单模块) |
| 液氧需求量显示 | 仅在站级备注 | 阶段成本明细 / 设备清单 / 站级备注 共 3 处 |
| B45 边界钳制 | 百分比字段可超 100 | 19 个百分比字段强制 [0, 100] 钳制 |
| 报告 FCR 显示 | 没有 | 每阶段表加 FCR 列 |
| 打印优化 | 简单 hide button | A4 + 1.5cm 边距 + 阶段独立分页 + 灰阶图表 |
v1.5 代码已经修复但本手册之前未同步的几处公式:
| 章节 | 项目 | v1.5 旧手册 | v1.6 正确 |
|---|---|---|---|
| 4.2 | NO₃ 产生率 | NO₃ = TAN × η_bio | NO₃ = TAN × 1.0 (稳态质量守恒) |
| 8.2 | V_RDF | V = Q × 2/60 (HRT 2 min) | V = Q × rdfHRT_min/60 (默认 0.5 min v1.6, 可调 0.1-5) |
| 8.2 | V_BF (池总) | V = bioVolume × 1.3 (经验) | V = bioVolume / fillRatio (默认 50% → 2× bio) |
| 15.4 | CO₂ 单位换算 | 未明确 | 显式 × 10⁶ (kg/m³ → mg/L) |
| 29 | 双节点稳态 | 蒸发显热 Q_evap×λ 写在空气节点 | 移到水节点 (与代码一致) |
| 33.4 | 残值 | × 5% 笼统 | 设备 5% + 土建 20% (分别折旧) |
v1.6 之前, iRAS 在 UI 上已经有"主流路径 / 旁路(节能)"两个选项, 但 calcPumpPowerBreakdown / aerationSpec / OPEX
完全没区分 — 是"UI 假承诺"。v1.7 通过全网调研 (Linde SOLVOX cone / Pentair AES Speece / PR Aqua PPC / Global Seafood Advocate 2019)
确认: 国际主流大型 RAS 项目"more often plumbed in side stream configuration"。原因是氧锥操作压力 10-21 psi (玻璃钢上限) 或 1-3 bar (SOLVOX),
让主流全部过氧锥意味着主泵要承担额外 3-5 m 压头, 而旁路只让 10% 流量过高压锥, 主泵不过锥, 能耗显著下降。
v1.7 新增 5 个工艺字段 (PROCESS_DEFAULTS + UI 输入框 + 工程范围钳制):
| 字段 | 默认 | 钳制范围 | 工程对照 |
|---|---|---|---|
o2ConeTopology | mainline | mainline / bypass | — |
o2ConeHeadLoss_m | 3 m | [0, 15] | LHO 2-3 / Speece 5-10 / SOLVOX 110 至 15 |
o2BypassRatio (%) | 10 | [5, 30] | 国际主流 8-15% |
o2BypassPumpHead_m | 20 m | [5, 40] | 玻璃钢 20 / SOLVOX 25-30 |
o2BypassPumpEta (%) | 60 | [30, 85] | 高压泵典型 |
物理改动:
v1.7 之前, air 模式 (空气曝气) 只有 K-302 (BF 曝气风机), 缺鱼池主增氧风机。 这意味着温水鱼种 (罗非鱼 / 鳗鱼 / 对虾) 的大规模 RAS 设计无法用工具自动生成 — 而这是 80%+ 中国 RAS 项目的实际场景。
v1.7 加入 K-101 鱼池增氧鼓风机: 罗茨风机 + 微孔盘管曝气, 与 K-302 同口径 1+1 备 (鱼池主增氧故障即鱼窒息, 必须双机轮换)。P&ID / 设备清单 / 报告章节 / 财务测算 全链路同步, modulePerSpec 含完整规格 (风量 Nm³/min / 功率 kW / 风压 kPa / 效率 %)。
旧版工艺面板"RDF 反冲(%) 2%"是反冲管瞬时分流比, 但 4870 m³/d ÷ V_total = 101%/d 物理荒谬 (远超合理换水率 1-5%/d)。真相: RDF 反冲水绝大部分经污泥沉淀池回循环 (Sharrer 2010 实测 95-98% 清液回流), 真实穿越系统边界的废液由换水率决定。
v1.7 全面清理:
rdfBackwash / rdfBackwashPumpHead_m / rdfBackwashPumpEta 从 PROCESS_DEFAULTS / readStageProcFromInputs 删除V_total × exchangeDaily 算 (与"换水率"定义一致)v1.7 发布前进行了一次彻底审计, 覆盖 Level 1 (静态扫描) + Level 2 (jsdom 三工况数值验证) + Level 3 (核心计算函数逐项审查), 共发现并修复 27 项 bug:
| 类别 | 数量 | 代表问题 |
|---|---|---|
| 🔴 严重 | 8 项 | K-101 modulePerSpec 缺失 / 系统排水硬编码 7.5% / 报告增氧章节未区分拓扑 / air 模式无 K-101 描述 / DO 行硬编码 / #25 灾难性 bug(下文专述) / 23 处 *100 单位错误 |
| 🟡 中等 | 4 项 | pid.html isAirMode 反向判定脆弱 / v1.7 新字段未钳制 / TSS chip 标签不清晰 / finance-core.js OPEX 70/30 硬编码 |
| 🟠 精度优化 | 4 项 | 蛋分 DOM 移除公式重构为严格物料守恒 / AOP 臭氧剂量字段化 / CO2 风压钳制 [0.3, 10] 补全 / T_room 钳制 ±2°C → ±5°C |
| 🛡️ 鲁棒性 | 3 项 | 阶段计算 try/catch / calcCapex add() isFinite 保护 / 所有阶段崩溃 console.warn |
| 🟢 清理 | 8 项 | 液氧塔 silent fallback warn / 字符串补空格 / 删 P-602 死代码 / 注释更新 / drawMainPump 加 data-cx/cy / 删 skimmerWasteFlow 死字段 / IRAS_META.version 1.6.0 → 1.7.0 |
buildContext() 函数 return 时漏写 workflow 字段。workflow.* 引用全部失效。但因为 nunjucks 模板引擎"字段缺失即跳过"的优雅降级机制, 报告渲染不报错 — 模板里所有条件分支都默默走 fallback, 用户拿到的报告看起来正常但实际上增氧章节不区分液氧 / 空气曝气, 主泵参数走默认值不显示真实数值, DO 控制策略描述固定不变。*100 单位错误 (#25b) 的连锁修复。| 验证维度 | 结果 |
|---|---|
| jsdom 三工况主功能 (mainline / bypass / air) | ✅ 全通过 |
| P&ID 三工况渲染 (A-601 / V-901 / K-101 / P-602 / M-601 / K-302 各就各位) | ✅ 全通过 |
| 1000 t 大西洋三文鱼基准 vs SUMMARY 核心指标 | ✅ 100% 吻合 |
| JSON 加载兼容性 (v1.5 / v1.6 / v1.7 / 缺 aerationMode / 缺整个 proc 5 种降级场景) | ✅ 全通过 |
| finance 完整闭环 (buildPIDExport → calculate → sensitivity) | ✅ 全通过 |
| Level 3 审查 6 大块 (总线 / v1.6 同款 9 项 / 热平衡 / CAPEX / 站级 / 累加) | ✅ 全部已审 |
📌 历史数据:本章记录的是 v1.7 当时的成本基线,用于说明氧锥 mainline / bypass
两种拓扑的差异。这些数字已被 v1.9 / v1.9.2 / v1.9.3 / v2.0.0 / v2.1 多次重算覆盖,
不代表当前版本。当前基线见「v2.1 → v2.2」章节与主页自检基线
(?selftest=1)。结论层面的 mainline vs bypass 对比仍然成立。
对比 mainline 与 bypass 两种氧锥拓扑在挪威 Bergen 气候下的全工况成本:
| 项目 | mainline (主流串联) | bypass (旁路高压) | 差异 |
|---|---|---|---|
| 工艺指标 | |||
| 系统总水体 V_total | 5,183 m³ | 5,183 m³ | — |
| 循环流量 Q | 10,155 m³/h | 10,155 m³/h | — |
| 主泵 P-101 功率 | 610.4 kW | 488.3 kW | -122.1 kW |
| 旁路泵 P-602 功率 | 0 (无) | 92.2 kW | +92.2 kW |
| 综合泵功率 | 610.4 kW | 580.5 kW | -29.8 kW (节能) |
| o2DailyTotal (全场日峰值) | 1,113 kg/d | 1,112 kg/d | ~0 |
| A-601 峰值供氧 | 41.20 kg/h | 41.20 kg/h | — |
| CAPEX | |||
| 设备 CAPEX | 4,454 万元 | 3,842 万元 | -612 万元 |
| 工程总投资 CAPEX (× Lang 2.2) | 9,800 万元 | 8,454 万元 | -1,346 万元 |
| 运营成本 (元/kg) | |||
| 年总成本 (含折旧) | 3,670 万元/年 | 3,540 万元/年 | -129 万元/年 |
| OPEX (不含折旧) | 28.46 元/kg | 28.30 元/kg | -0.16 |
| 综合成本 (含折旧) | 36.70 元/kg | 35.41 元/kg | -1.29 |
| 财务指标 (售价 60 元/kg, 30/70 融资 @ 5%/8y, 折现 8%, 15 年) | |||
| 全投资 IRR | 14.90% | 17.31% | +2.41% |
| 自有资金 IRR | ~22% | 25.23% | +3% |
| 全投资 NPV (万元) | 5,779 | 7,031 | +1,252 |
| 静态回收期 | 6.19 年 | 5.57 年 | -0.62 年 |
| 动态回收期 | 8.63 年 | 7.42 年 | -1.20 年 |
| BEP (% 满产) | 62.3% | 57.9% | -4.3% |
工程结论: 1000 t 三文鱼项目采用 bypass 拓扑相对 mainline: 泵综合节能近 30 kW (年电费节省 17 万) + CAPEX 工程总投资节省 1,346 万 + 综合成本省 1.29 元/kg + 全投资 IRR 提升 2.4 个百分点 + 静态回收期缩短 0.62 年。 这与国际主流大型三文鱼 RAS 多采用 side stream 拓扑的工程实际一致 (Linde SOLVOX / PR Aqua PPC / Global Seafood Advocate 2019)。
| 工况 | 气温 | 源水 | v1.3 综合成本 | 对照 |
|---|---|---|---|---|
| 青岛冬季 | -7°C | 4°C | 35.96 元/kg | 国内沿海三文鱼试点 |
| 海南冬季 | 17°C | 22°C | 37.70 元/kg | — |
| 海南夏季 | 32°C | 27°C | 40.47 元/kg | 制冷成本上升 |
| 挪威 Bergen 冬 | 0°C | 4°C | 36.30 元/kg | Atlantic Sapphire 60-70 (含人工/苗) |
iRAS 不计算人工 / 苗种 / 管理费等"软成本" (合计 15-20 元/kg), 综合成本通常比文献项目实际偏低。 对照 Nordic Aqua 宁波 (中国境内唯一商业化运营的 RAS 三文鱼项目, AKVA Group 技术) 2024 年 Q2 实测生产成本 41 元/kg (EUR 5.23/kg) — iRAS 36.70 + 软成本 ~5 元/kg = 41.7 元/kg, 与 Nordic Aqua 实测完全吻合 ✓
v1.8 由英文版团队主导, 引入碳酸盐平衡求解和 o2 物理校准。v1.9 是 NTNU validation memo 全面验证后的稳定版。中文版直接从 v1.7 跳到 v1.9, 与英文版同步。
v1.7 之前 iRAS 只输出"碱度需求" (基于硝化耗碱 7.14 g CaCO₃/g N), 不计算 pH / NH₃ 物种 / 缓冲强度 / 方解石饱和度。这使得工具:
v1.9 引入完整的碳酸盐物种平衡求解模块 (carbonate.js, 226 行), 平衡常数全部来自国际权威数据库:
对照 PyCO2SYS 1.8.3 (国际标准实现) 严格验证:
| 项目 | 偏差 |
|---|---|
| 正向 pH (free 标度) | max|ΔpH| = 1×10⁻⁵ |
| 反向碱度求解 | 0.08 μmol/kg |
| NH₃ 占比 | 1.5×10⁻¹⁶ (机器精度) |
| 方解石饱和度 | 0.006% |
详见本手册第 4 章 §4.5 碳酸盐平衡章节。
v1.9 在工艺面板新增"pH 控制"下拉, 提供两种模式:
大型海水 RAS (如 Atlantic Sapphire / Salmon Evolution) 普遍用"持目标 pH"模式, 精确控 pH = 7.0-7.2 以同时防 NH₃ 毒性 + 防 CaCO₃ 沉积堵塞设备。商业项目实测碱度 237 mg/L CaCO₃ (Good et al. 2018), 显著高于淡水默认 150。
v1.9 修正了一个潜伏的物理建模不一致:
metabRefTemp (三文鱼 15°C, 罗非鱼 28°C 等). 同一个代谢率驱动 O₂ 消耗与代谢热, 两处必须用同一参考温度.metabRefTemp. 同时等价重写 o2BaseFactor — 让数值在物种典型温度下不变.8 鱼种 o2BaseFactor 校准对照:
| 鱼种 | tempOpt | v1.7 (Q10@20°C) | v1.9 (Q10@metabRefTemp) | 数值变化 |
|---|---|---|---|---|
| salmon (三文鱼) | 15°C | 0.32 | 0.2263 | 等价 (0.32 × 2^-0.5 = 0.2263) |
| turbot (大菱鲆) | 16°C | 0.28 | 0.1980 | 等价 |
| tilapia (罗非鱼) | 28°C | 0.16 | 0.2786 | 等价 (0.16 × 2^0.8 = 0.2786) |
| grouper (石斑鱼) | 27°C | 0.18 | 0.2924 | 等价 |
| bass (加州鲈) | 25°C | 0.19 | 0.2687 | 等价 |
| eel (鳗鲡) | 26°C | 0.13 | 0.1970 | 等价 |
| mandarin (鳜鱼) | 25°C | 0.18 | 0.2546 | 等价 |
| shrimp (对虾) | 28°C | 0.31 | 0.30 | -3% (轻微下调) |
v1.7 之前 co2Daily 公式只算呼吸 CO₂:
但实际硝化反应也产 CO₂:
v1.9 修正:
1000 t 三文鱼成鱼期实测:
| 项 | v1.7 | v1.9 | 变化 |
|---|---|---|---|
| o2FishDaily × 1.375 (呼吸) | 700 kg/d | 700 kg/d | — |
| tanDaily × 6.286 (硝化) | 0 (漏算) | 521 kg/d | +521 |
| co2Daily 总 | 700 kg/d | 1221 kg/d | +74% |
影响: CO₂ 脱气塔规格按循环流量 × G:L 选型 (Summerfelt 2003 / 工程惯例), 不直接随负荷上升, 故 CAPEX 不变。但稳态鱼池 CO₂ 浓度会上升, 是 v1.9 引入碳酸模型后能从物理层面捕捉到的关键工况指标。
v1.7 之前 buildLoanSchedule 函数在等额本息分支:
当 r = 0 (零利率贷款 / 政策性贴息项目) 时分母为 0, 产生 NaN, IRR 算不出。v1.9 修复: r = 0 时自动降级到等额本金分支 (此时两者数学等价)。这是个边界 case, 多数项目利率 > 0 不受影响。
| 验证项 | 状态 |
|---|---|
| carbonate.js 中英文版输出一致 (4 工况) | ✅ max|ΔpH| = 0 |
| 8 鱼种 + mainline/bypass jsdom 全工况 | ✅ 9/9 通过 |
| salmon 1000t mainline 综合成本 (基准 36.70 元/kg) | ✅ 完全一致 |
| 所有工况 pH 在合理区间 [6.0, 8.5] | ✅ 9/9 通过 |
| 海水方解石饱和度 Ω 计算 (5/5) | ✅ 全部正常 |
| 淡水 Ω 为 null (符合物理) | ✅ 4/4 正确 |
| salmon NH₃-N 1.94 μg/L < 12.5 限值 | ✅ 合规 |
v1.9.1 与 v1.9.2 不是新增功能, 而是四处物理口径修正。它们在与英文版 v2.0 对表 (PORTING_NOTES) 和用户实测中暴露, 共同特征是: 影响运行成本、消耗品采购量与制冷装机, 但不改变任何设备选型结果。 所有修正都做了回归验证 — 设备容量计算式逐字未变。
v1.9 之前, 液氧采购量沿用 o2Demand 计算, 而该字段是设备选型口径, 含两个容量系数:
peakFactor (日→小时峰值, 默认 1.5) 与 sAerator (设备老化余量, 默认 1.10) 都是容量系数:
它们回答"设备要多大", 不回答"一年买多少氧"。液氧是按量计费的消耗品, 采购量只应被吸收效率放大。
两者混用导致液氧成本系统性高估 1.5 × 1.10 = 1.65 倍 (65%)。
| 指标 | v1.9 (错误口径) | v1.9.1 (修正后) | 文献 / 对照 |
|---|---|---|---|
| 液氧强度 (kg O₂/kg 饲料) | 0.44 | 0.266 | 0.25–0.30 |
| 年液氧消耗 (1000 t 三文鱼) | 527 t | 319 t | — |
| 储罐规格 (按 7 日储备) | 10.1 t | 6.1 t | — |
| 基准值验收区间 | 0.25–0.95 | 0.20–0.45 | 收窄至文献带宽 |
o2PeakSupplyKgH 与 o2Demand 的计算式逐字未变。
氧锥流量、储罐峰值供氧能力、K-101 风量等一切设备选型结果与 v1.9 完全一致。
改的是"买多少氧", 不是"配多大设备"。详见 15.7。
v1.9 之前代码注释声称蒸发系数 β 取自 ASHRAE 的 0.045–0.075 m/s — 这是错误出处。 ASHRAE / Carrier 的池面蒸发系数确实在 0.045–0.089 这个数值区间, 但它是定义在蒸气压差上的英制系数 [lb/(h·ft²·inHg)], 不能当作 ΔW × ρair 形式的 β [m/s] 使用。两者量纲不同, 直接套用高估约 13 倍。
v1.9.1 改用 Lewis 传热传质类比重新推导 (手册第 29.3 节自 v1.2 起给出的就是这个公式, 是代码实现偏离了手册):
| 实测量 | 变化 | 说明 |
|---|---|---|
| β 取值 | 降 12.4–14.9 倍 | 回到物理合理区间 |
| 蒸发率 | 降 2–2.4 倍 | 非 13 倍 — 因 W_room 自洽求解存在自补偿 |
| RH = 99% 饱和告警 | 消失 | 原告警是虚警, 由虚高蒸发率造成 |
用户报告了一个反直觉现象: 养殖密度降低, 制冷装机容量反而暴增。根因是一条纯几何的放大链:
但鱼的数量没变, 新风需求本不该变。实测: 密度从 80 降到 15 kg/m³, 通风量被放大 5.33 倍。 v1.9.2 把新风量改为按需求确定, 不再单纯跟随房间体积:
详细推导、CO₂ 系数取值与"为什么除湿不计入新风"见 28.6。
v1.9 之前遇到高湿工况只能建议"加大 ACH", 但湿热气候下通风不能除湿 (室外比室内还湿), 这条建议是无效的。 v1.9.2 引入机械除湿机模型 (开关 / 目标 RH / SMER / 冷凝水回收 / 冷凝热去向), 与双节点求解器耦合求解。 海南夏季实测: RH 从 92% 降到 70%, 除湿机耗电 1365 kWh/d, 但凝结放热从 2152 降到 1222 kWh/d, 总电耗基本持平。
物种 o2BaseFactor(鲑鱼 0.2263 @15°C,依据 Atlantic Sapphire / Davidson 2014)
是清水条件下鱼本身的生理耗氧。但商业鲑鱼 smolt RAS 养殖池实测显示,
池内氧呼吸速率随池内 TSS 上升而显著增加——增量来自悬浮固体表面附着的异养菌在池内直接耗氧,
这部分同样必须由氧锥/液氧供给,不是生物滤池 o2DOMfactor 涵盖的范围。
实现上 calcStageLoad 增加可选第 4 参 tssTank;TSS 不依赖 O₂,
故管线在 pass 1 解出鱼池 TSS 后一次回代即收敛,无需迭代。不传该参数时附加为 0,行为与旧版一致。
| 微滤机去除率 | 成鱼池 TSS | 池内耗氧系数 | 液氧年耗 |
|---|---|---|---|
| 90% | 3.0 | 0.358 | 441 t |
| 默认 75% | 3.4 | 0.382 | 471 t |
| 55% | 4.1 | 0.428 | 527 t |
| 40% | 5.0 | 0.477 | 589 t |
v1.9.2 之前 Q_metab 用 Schrama 式 106 × Q10^((T−T_ref)/10) × N × W^0.85。
系数 106 kJ/(d·kg0.85) 源自 Saravanan & Schrama (2012, PLoS One) 虹鳟饱食投喂实测
(文献区间 77–160,其中一值即 107),但该式没有投饵率变量。
用饱食系数套商业投饵率(鲑鱼成鱼 0.95% 体重/日)高估约 3 倍。
| 指标 | 旧 (Schrama 106) | 新 (氧当量) | 对照基准 |
|---|---|---|---|
| Q_metab (1000 t 鲑鱼) | 11030 kWh/d | 4053 kWh/d | — |
| 单位体重 | 1.11 W/kg | 0.32 W/kg | 维持代谢 0.11 (van Dam),摄食鱼为其 2–4 倍 |
为什么必须绑定:同一个代谢过程同时决定耗氧与产热,两者由氧热当量刚性联系, 不能各取各的文献值。v1.9 曾把两处的参考温度对齐(validation memo F1),但未对齐量级, 留下 3.85 倍的内部矛盾直到 v1.9.2。
Q_metab 现在实际是池内生物总产热
= 鱼呼吸 + 池内悬浮固体异养菌呼吸(因 o2FishDaily 含 TSS 附加项)。
两者的热都进水,计入正确;但引用该字段时不要再当作纯鱼类生理值去对文献。v1.9.2 的 DO 包线体检(8 鱼种 23 阶段)暴露出旧的差异化饱和度设定撑不住自身工况:
旧设定下罗非(115%)、对虾(110%)、石斑(140%)的包线仅 3.5–4.7 mg/L, 而实际耗氧降幅已达 3.8–6.8 mg/L,5 个阶段击穿、4 个临界。 温水种 DO 饱和浓度本就低(30°C 仅 7.0 mg/L vs 15°C 的 8.4),再配低过饱和度,包线薄到没有余量。
| 统一饱和度 | 击穿 | 临界 | 最小余量 mg/L | TGP |
|---|---|---|---|---|
| 旧(各鱼种不同) | 5 | 4 | −2.11 | 各异 |
| 130% | 4 | 3 | −1.33 | 106.3% |
| 140% | 2 | 2 | −0.54 | 108.4% |
| 150% | 0 | 2 | +0.21 | 110.5% |
| 165%(采用) | 0 | 0 | +1.22 | 113.6% |
本表只在纯氧模式(aerationMode = 'o2')下生效;空气曝气模式走另一套逻辑,
不受影响——低密度养殖仍应优先选空气曝气。
旧告警文案为「建议: 提高循环倍数或 DO 目标饱和度」。统一到 165% 后, 「提高饱和度」已成为危险建议——会把用户导向刚刚规避的气泡病风险。 v1.9.2 改为逐条计算四条出路的当前值、所需值与卡点:
| 工况 | 气温 / 源水 | OPEX | 折旧 | 综合成本 | 比电耗 |
|---|---|---|---|---|---|
| 青岛冬 | -7°C / 4°C | 28.26 | 9.27 | 37.53 | 9.5 |
| 海南冬 | 17°C / 22°C | 29.57 | 9.37 | 38.94 | 11.9 |
| 海南夏 | 32°C / 27°C | 29.95 | 9.43 | 39.39 | 12.6 |
| 挪威 Bergen 冬 | 0°C / 4°C | 28.27 | 9.28 | 37.55 | 9.5 |
单位元/kg 鱼;电 0.7 元/kWh、液氧 1.2 元/kg、饲料 12 元/kg;比电耗单位 kWh/kg·yr。 年液氧消耗 471 t(四工况一致 —— 液氧只随鱼载荷与池内 TSS 变化,与气候无关)。 本表为工艺运行成本口径(v1.9.2 两层成本模型的下层,已含维护/保险/补水/排污/折旧;再加苗种+人工+管理费即企业全成本)。 v1.9.2 起工艺运行成本为 37.01 元/kg、企业全成本 41.97 元/kg,口径定义见 21.1。
| 对比项 | mainline | bypass | 差 |
|---|---|---|---|
| 主泵 P-101 | 369.0 kW | 258.3 kW | -110.7 kW |
| 旁路泵 P-602 | 0 | 92.2 kW | +92.2 kW |
| 综合泵功率 | 369.0 kW | 350.5 kW | -18.4 kW |
| 氧锥规格流量 | 10155 m³/h | 1015 m³/h | 缩 10× |
| 工程总投资 | 11026 万元 | 9771 万元 | -1255 万元 |
| 综合成本(工艺) | 37.53 元/kg | 35.94 元/kg | -1.59 元/kg |
bypass 节能幅度从 v1.7 的 29.8 kW 降到 18.4 kW —— 主泵扬程从 12 m 降到 7 m 后, "旁路让主泵不过锥"这个优势的绝对值随之变小(省下的是 3 m 氧锥压损,占比从 20% 升到 30%, 但基数变小)。CAPEX 节省基本不变(氧锥按小流量定价,与扬程无关), 仍是 bypass 的主要收益来源。
本版不改动任何计算模型。?selftest=1 的 14 项基线逐位不变,
设备选型亦逐位不变 (mainline/bypass 对照的主泵 369.0 / 258.3 kW、旁路泵 92.2 kW 与旧表一致)。
改动集中在两件事: 把对外发布的数字与真实产品路径对齐, 以及把验证过程固化成可自动运行的测试。
v1.9.2 发布的四工况表无法用产品路径复现。尝试过三种气候口径:
| 口径 | 青岛冬 | 海南冬 | 海南夏 | Bergen |
|---|---|---|---|---|
| ① 冬夏都取该行温度 (自检所用) | 35.59 | 36.95 | 37.37 | 35.61 |
| ② 只覆盖冬、夏留 UI 默认 | 35.74 | 37.00 | 37.37 | 35.75 |
| ③ 只覆盖冬、不动 RH | 35.74 | 36.99 | 37.33 | 35.75 |
| v1.9.2 已发布 | 35.63 | 37.39 | 37.94 | 35.65 |
三种口径全部对不上, 判定为成本模型两层化之前的旧脚本残留。 现按口径 ① 重测并替换。这与 v1.9.2 审计发现的 32.65 元/kg 问题同源 —— 根因都是「验证路径与产品路径不是同一条」, 只是这次残留在文档侧而非代码侧。
SELFTEST_BASELINE 的 11 个数值工况里, 4 个大西洋鲑工况带 climate 覆盖
(冬夏同温的隔离口径, 用于隔离气候单一变量), 其余 7 个鱼种不带覆盖
(走 UI 默认气候: 设计冬 −7/4、设计夏 32/24)。两种口径对同一鱼种相差 0.1–0.5 元/kg。
数值本身没错, 但引用时必须注明是哪一种。
新增 tests/ 目录,npm test(等价于 node tests/run_all.js)一条命令跑十三项,任一失败则非零退出,可直接挂 CI:
| 脚本 | 覆盖 | 判定 |
|---|---|---|
t1_selftest.js | 内置 ?selftest=1 | 14 工况全 PASS(4 个受检字段)+ 两类不变量断言 + 面板渲染断言 |
t2_roundtrip.js | 存/取方案 | 改 65 个数值控件后 summary 全字段零漂移 |
t3_downstream.js | 下游页面数据链路 | 导出载荷与 finance / report 渲染文本均无 NaN |
t5_partial_freecooling.js | 部分自然冷却 + 年化 | 连续性收敛判据、截止点等值、两端极限、闭式解 vs 360 点、Jensen 方向、边界有限性 |
t6_thermal_scan.js | 热工况稳健性 | 8 鱼种 × 9 气候 × 3 工况 = 648 次调用 + 14 组病态参数,无 NaN / 越界 |
t7_amplitude_calibration.js | 年化振幅校准锁定 | 季节振幅锁在实测气候常值区间;锁 k / 积分点数 / 按热源设计温差 |
t8_leverage_bounds.js | 参数杠杆 + 反悬崖 | 合理区间内成本极差不超上界;单步跳变 ≤ 总极差 45% |
t9_fc_switch_feedback.js | 自然冷却开关反馈 | 三态文字齐全;灰显范围仅限专属参数 |
t10_elec_closure.js | 用电汇总闭合性 | totalAvg == 电 + 非电;覆盖空气曝气路径 |
耗时约 2–3 分钟(t8 要做约 25 次全场重算)。CI 单步超时请设到 5 分钟以上,或 SKIP_SLOW=1 node tests/run_all.js 跳过最慢两项。
全部通过真实 recomputeAll() 取数, 注入的 CDN 桩只覆盖渲染层。
另有 gen_baseline.js 由产品路径生成文档表格 ——
基线表今后应粘贴它的输出, 手抄正是本轮全部旧数的唯一来源。
主要矛盾不是「逼近温差取几 K」, 而是判据「非 0 即 1」。
旧判据 冷源温度 + 逼近温差 < 目标水温 一旦跨过, EER 从 3.45 跳到 20、Q 从 0 跳到全量,
两个量同时跳变 —— 阈值附近出现 5.8 倍的成本悬崖, 几 K 的假设差就能翻出 1 元/kg 级的差异。
ΔT_avail = T_target − T_冷源 Q_fc = min(K_fc · ΔT_avail, Q_load) K_fc = Q_design / ΔT_design EER_fc = EER_design · min(ΔT_avail/ΔT_design, 1) 1/COP_eff = (1−g)/COP_cool + g/EER_design g = clamp((T_hi−T_冷源)/(T_hi−T_lo), 0, 1)
Q ∝ ΔT 是精确的而非线性化近似 —— 由 ε-NTU: Q = ε·C_min·ΔT_in,
流量固定时 NTU 与 C_r 固定, 故 ε 为常数。
EER 随温差衰减的物理: 容量受限时风机仍满转, 寄生功率固定而换到的热变少。
计量边界: EER 只算冷源侧增量寄生功率 (风机 / 冷源泵), 不含工艺侧循环泵 ——
后者已在 pumpKwhDaily, 且板换工艺侧阻力已计入主泵扬程的「UV/板换 0.5–2 m」预算。
不划这条线会双重计数, 量级达百 kW。
经济截止点自动涌现, 且恰好连续。 仅当 EER_fc > COP_cool 才值得开风机;
而在截止点 EER_fc = COP_cool, 于是
E = Q_fc/COP_cool + (Q−Q_fc)/COP_cool = Q/COP_cool ——
两侧完全相等。悬崖不是被磨平, 是不存在了, 因为切换点正是两条路径边际成本相等之处。
故无需为截止点引入任何参数。
参数 freeCoolingApproach_K 换为 fcDesignDT_K, 语义由「悬崖位置」变为
「自然冷却单独扛满设计负荷所需的温差」。它是换热链的串联损失:
| 冷源 | 换热链 | 总温差 |
|---|---|---|
| 空气源(干冷器) | 工艺水 → 板换 2–3 K → 乙二醇环路 → 干冷器对空气 5–10 K | 8–13 K |
| 水 / 开式海水 | 工艺水 → 钛板换 2–3 K → 冷源水(双屏障再 +2–3) | 3–6 K |
| 地源 | 板换 2 K + 埋管对土壤 3–5 K | 5–7 K |
空气侧温差大, 因为空气 ρ·cp 小、同样热量需巨大风量, 受风机功率约束; 水-水板换换热系数高一两个数量级, 1–3 K 即可实现。 反推自校验 (1000 t 鲑鱼, Q_load ≈ 1081 kW): 开式海水得 3.1 K、干冷器得 11.4 K, 寄生功率对应 EER 50 与 22 —— 与手册区间吻合。 UI 留空即按热源自动取 (空气 11 / 水·海水 4 / 地源 6)。
自然冷却本质是「全年有多少小时可用」, 而阈值函数在均值处取值 ≠ 函数的均值(Jensen 不等式)。 旧模型切设计冬 → 判定全年可用(系统性高估); 切年均 → 判定全年不可用(系统性低估); 真值在中间, 而单点评估永远给不出中间值。
不引入新气象数据 —— 用现有三个温度点拟合正弦 T = T̄ + A·cos θ,
A = k·(夏−冬)/2, 对 T_air 与 T_source 用各自振幅、同相位摆动
(两者都由季节驱动, 夏季同时达峰), 逐点跑真实热平衡再平均。
闭式解亦有解析形式并保留为诊断量:
ḡ = [Φ(u_hi) − Φ(u_lo)]/(u_hi − u_lo),
Φ(u) = u − [u·arccos u − √(1−u²)]/π。
实测闭式解对贡献率是精确的(青岛 0.3826 vs 收敛数值 0.3826),
但能耗偏乐观 1–7% —— 因为它假定 Q_load 恒定, 而 Q_load 与冷源温度同向变化、
与比能耗正相关, 故 E[Q·f] > E[Q]·E[f]。这正是改用数值积分的原因。
点数取 24(半月步长): 实测 Ē 相对 360 点的误差, N=12 为 −1.24%~+1.03%, N=24 降到 0.15% 以内。 g 是钳位函数, 12 点在拐点附近求积误差可达 3%, 与要修的相关性效应同量级, 故不能停在 12。 成本: 单次点函数 0.009 ms × 24 × 阶段数 ≈ 0.9 ms, 可忽略。
| 地区 | 热源 | 设计冬 | 年均 | 设计夏 | 年化贡献率 | 年化 COP |
|---|---|---|---|---|---|---|
| 挪威 Tromsø | 开式海水 | 37.62 | 37.64 | 37.67 | 98% | 18.14 |
| 挪威 Bergen | 开式海水 | 37.66 | 37.95 | 39.07 | 73% | 7.82 |
| 智利 Puerto Montt | 开式海水 | 37.67 | 38.13 | 39.07 | 59% | 5.95 |
| 加拿大 Halifax | 开式海水 | 37.69 | 38.20 | 39.42 | 65% | 5.85 |
| 青岛 | 空气源 | 37.75 | 38.54 | 39.35 | 35% | 4.64 |
| 上海 | 空气源 | 37.80 | 38.81 | 39.54 | 19% | 3.93 |
| 三亚 | 开式海水 | 39.62 | 39.98 | 40.42 | 0% | 2.30 |
| Doha | 水源 | 39.24 | 39.68 | 40.26 | 0% | 2.68 |
t7_amplitude_calibration.js 锁死 ——
日后改动 k 或区域温度预设会在该测试响亮失败。t8_leverage_bounds.js 锁死——谁把阈值判据改回去,它会立刻失败。_fcSink = T_hp_source)。
实际常见「海水源热泵 + 干冷器自然冷却」或反之, 应为两个独立选项 —— 属 P3。salmon_bergen_w FAIL ——
那是预期行为, 说明该基线确实压在全量自然冷却的边界上, 应同步复核而非直接改基线。比电耗(kWh/kg·yr)与热泵电费(元/kg)是对外发布的核心指标,但 summary 里
此前没有对应字段——页面上的 kwhPerKgYr 只是热泵单项且分阶段。
因此这两个数进不了 SELFTEST_BASELINE、无法自检,至今只是「碰巧还对着」。
这是当时唯一一处对外数字完全没有护栏的地方。
本版补上五个出口:kwhPerKg(全场综合比电耗)、elecCostPerKg、
hpCostPerKg(热泵+除湿电费)、pumpShareOfElec、loxTonsPerYear,
并把前两者写入全部 11 条数值基线。
| 指标 | 旧发布值 | 产品出口实测 | 差 |
|---|---|---|---|
| 比电耗(青岛冬) | 9.7 | 9.51 | −2% |
| 热泵电费(青岛冬) | 0.29 | 0.21 | −28% |
| 液氧年耗 | 473 t | 471 t | 核对无误 |
根因:旧手推口径对臭氧与 BF 风机取了峰值,而年成本按 totalAvg × 365 计算。
产品路径的均值口径才与成本模型自洽。四工况表的比电耗列已按产品出口更新
(9.5 / 11.9 / 12.6 / 9.5),泵占电 57–75%。
aerationMode === 'air' 时增氧费用是主风机电费,
纯氧时才是液氧。旧手推完全漏了这一项——只因大西洋鲑走纯氧才碰巧对上 9.7,
换成空气曝气的鱼种就是错的。ozoneCostAvgDaily = ozoneCostDaily × feedRatio)。故电量在成本函数内部、紧挨 totalAvg 那一行计算,
复用它已经用的成本项再除以电价:口径天然一致,且可与 totalAvg 逐项肉眼对照——
将来新增用电项若在这里漏加,对照即可发现。tests/gen_baseline.js 里那份
重复手推实现也已删除,统一到产品出口。
模型一直按 N+1 给每个模块配备用(applyModularization),设备清单也把备用台数展开成
「N 台+1 备 ×M 模块」,但 calcCapex 是按工艺容量计价的(元/kW、元/(m³/h))——
备机只选型、不花钱。实证:把「套数」由 1 改到 5,备用台数随之变化而设备直购恒为 4360 万。
不能用 (N+备)/N——它对 N+1 备用正确,但对超配并联失效:
UV 是 2×75% 并联(installedKw = 需求 × 1.5)而 sparesCount = 0,
(N+备)/N 会算成 1.00,于是实际装 150% 却只按 100% 计价。
这是 v1.3 就存在、因从未按装机量计价而一直未暴露的漏算,本版一并修正(+35 万)。
原为 1+1,而臭氧四个阶段的 N 恒为 1,意味着 100% 冗余——成鱼期单台 286 万、备机等额, 单项就占备用增量的 48%。臭氧停机不像主泵那样 15–30 min 致鱼窒息,多数项目按「可短时降容」处理。 改为 2×50% 后装机 = 需求,不额外增加投资,任一台故障仍维持 50% 氧化能力。
| 阶段 | 备用增量 | 主泵 / RDF / 热泵 / 臭氧 的 N | 说明 |
|---|---|---|---|
| 苗种期 | 33.4 万 | 1 / 1 / 1 / 2 | 规模小,多数设备 N=1 → 冗余 ×2.00 |
| 幼鱼期 | 121.3 万 | 1 / 2 / 1 / 2 | RDF 已可拆 2 台 → ×1.50 |
| 中鱼期 | 182.5 万 | 2 / 3 / 2 / 2 | — |
| 成鱼期 | 288.8 万 | 2 / 4 / 3 / 2 | RDF ×1.25,冗余摊得最薄 |
| 全场 | 626 万 | — | N 随规模增长 → 冗余系数由 ×2.00 降至 ×1.25 |
备机与主机同样乘 ×2.2 工程放大系数(安装备用:管路阀门电气全通,可自动切换)。 结果:设备直购 4360 → 4986 万,折旧 8.07 → 9.14 元/kg, 工艺运行成本 35.74 → 37.33 元/kg。
同时新增加药计量泵 CAPEX 条目(此前有 1+1 备用规格却无计价条目, 按台计价 5000 元/台;按 kW 计价会差一个数量级), 并补 CO₂ 脱气塔风机的模块化规格(环路内转动设备,此前无规格故无备用)。 鱼池增氧鼓风机 K-101 原本就有 1+1(仅空气曝气模式生成),本版只做计价映射。
items[].qty 保持工艺容量不变——
自检的不变量断言拿 CAPEX 热泵 qty 与 hpInstalledKwOf 统一公式比对,
把备用乘进 qty 会让该断言失败。冗余系数只作用于 cost,
另存 spareRatio / costRun 供追溯。Σmax(冬,夏) 恒等于 max(Σ冬,Σ夏),移动不改变任何数字。工况对比表用 heatPumpKWh / 16(电耗÷16h),而正上方热平衡卡片用
热功率 ÷ 22h——同屏两个数差 14 倍(38 vs 548 kW)。
数据层的不变量断言抓不到:sCap 是渲染层局部变量,不落任何数据结构。
这条通用教训催生了 I 节的单一出口改造。
Math.min(0.999, COP_cool/EER) 在 EER < COP_cool 时,把「自然冷却永不经济」
硬拉成「几乎总经济」。实测:
| freeCoolingEER | 修前电耗 kWh/d | 修后 | 关闭自然冷却 |
|---|---|---|---|
| 1 | 6277(多耗 3.45×) | 1819 | 1819 |
| 2 | 3138(多耗 1.72×) | 1819 | 1819 |
| 3 | 2092(多耗 1.15×) | 1819 | 1819 |
| 3.45 | 恰好等于机械制冷 COP,两侧相等 | ||
改为 x ≥ 1 直接置 g = 0;freeCoolingEER 钳到 [1, 60]
(此前无上界,填 1e6 得电耗 0 且不告警)。界面新增一档提示
「自然冷却不经济(EER ≤ 机械制冷 COP,已自动改走机械制冷)」——开关不该静默失效。
modulePerSpec.heatPump 有 sparesCount=1,设备清单与 P&ID 都按 N+1 展开,
唯独 CAPEX 按 N 计价——是备用政策下唯一不一致的转动设备。备用增量 626 → 725 万。
11 条数值工况全跑设计冬;而 4 条大西洋鲑用冬夏同温的隔离口径
(T_air_design_winter = T_air_design_summer)⇒ 年振幅 = 0、24 点积分退化成单点。
结果:FC_ANNUAL_POINTS = 24 这条核心路径在内置自检里一次都没被真正执行。
已新增 salmon_qingdao_annual(不带温度覆盖,冬夏有真实温差),自检 14 → 15 项。
P2:CAPEX 的「支路泵合计」含氧锥旁路泵,但冗余映射只列了另外四条支路。 bypass 拓扑下旁路泵占该项 46%,当前两边恰好都是 1+1 故无数值误差—— 但那是巧合,一旦某条支路拆成 2+1,46% 权重就会套上错误系数。已补。
本项目两次栽在 Math.max/min(…, 常数) 上,两次都是外部审计发现的:
| clamp | 后果 |
|---|---|
Math.max(1 − R, 0.001) | 典型 RAS 单次稀释率仅 0.056%,默认换水率 4% 就在触发,NO₃ 被硬钳成同一个值、完全不响应换水率(v1.0 起的静默错误) |
Math.min(0.999, COP/EER) | EER < COP 时电耗是关闭自然冷却的 3.45 倍 |
为什么现有断言抓不到:这类错误不产生 NaN、不越界、不让 golden-master FAIL—— 它只是安静地把物理算错。唯一的可观测特征是「在正常工况下正在改变结果」。
把常数改到「不可能生效」的值(max→−1e30、min→+1e30),比对全场输出指纹。 指纹变了 = 该 clamp 正在生效 → 人工判定是物理边界还是静默改写。
分组二分:整组无变化即整组归档,有变化才拆半递归。 126 项候选只用 38 次 jsdom(逐个跑需 128 次)——因为绝大多数 clamp 根本不触发。
| 类别 | 候选 | 正在生效 |
|---|---|---|
| C! 极小常数(典型防除零写法) | 20 | 0 |
| C 待判定 | 60 | 2 |
| B 物理边界 | 38 | 2 |
| A 数值保护(常数 0/1) | 65 | 未测 |
4 处生效项逐条判定后全部为有意设计:集水池容积区间 20/200 m³(两端都生效,
苗种期走下限、成鱼期走上限)、BF 风机日均负荷比下限 0.5(硝化菌群基础曝气)、
自然冷却贡献率封顶 1。没有发现第三个 0.001 那类错误。
最令人担心的 COP 下限 1.5/1.8/2.0、蒸发系数 β 区间、RH 域,在正常工况下全部不触发——
它们是留给极端工况的余量。
CLAMP_INVENTORY.md;
哨兵 t11_clamp_census.js 秒级检出「悄悄多了一个没人测过的 clamp」,
完整扰动测试 clamp_probe.js 约 4 分钟、手动跑。审计的通用建议是「让装机 kW 只有一个 formatter 出口」。普查后发现消费点 不是 4 个而是 5 个:
| 消费点 | 口径 | 判定 |
|---|---|---|
| 热平衡卡片 | hpThermalKWh(t) / hpUtilH | ✅ |
| 工况对比表 | (本版已修,见 G 节) | ✅ |
| 设备清单 / 模块化 | hpInstalledKwOf(sim, 0.75) | ✅ |
| CAPEX 计价 | hpInstalledKwOf(sim, 0.75) | ✅ |
| summary.totalHeatPumpCapacityKw | 电耗 ÷ 小时数 | 🔴 差 27 倍 |
实测:青岛 36.6 kW vs 统一公式 997.3 kW;三亚 359.9 vs 1061.7。
它在 summary 里,会流进导出载荷、下游页面与可研报告,
而不变量断言的比对范围里从来没有它(只比 capex.items[].qty 与 modulePerSpec)。
另发现热泵利用小时的解析逻辑(Math.max(8, Math.min(24, …)))
被复制了 4 份——复制即分叉隐患:任何一份改了钳制区间,其余三份不会跟。
已抽出 hpUtilHoursOf() 作为唯一出口。
新增 t12 三层断言:① 数据层 summary == Σ hpInstalledKwOf;
② 源码层无重复实现;③ 直接读渲染出的 DOM 文本抓「装机 kW」与数据层比对——
这一层正是原断言的盲区。突变验证:把工况对比表改回 /16,
会复现出审计原文里的 38 / 308 / 174 kW 并被立即捕获。
鱼种限值表 NH3_LIMIT_UG_L 早已存在(v1.9.2 为自检而加:
鲑 12.5 / 大菱鲆 20 / 石斑 30 / 加州鲈·鳜·对虾 50 / 鳗鲡 60 / 罗非 100 μg/L),
同一行 tooltip 也写着「三文鱼 12.5 μg/L」,但判据写死 > 0.025(25 μg/L)。
后果:最敏感的鲑科用了 2× 宽松阈值,NH₃ 在 12.5–25 μg/L 之间仍显示绿色「正常」。
现改为三档:超限值红 / 超半限值黄 / 其余绿。
此前界面上完全没有显示——不是「缺告警」,是连数字都看不到 (它已由碳酸盐平衡算出并进了导出载荷)。现补一行,按 <0.8 危险 / <1.0 警戒着色。
| 鱼种 | Ω 实测 | 判定 |
|---|---|---|
| 大西洋鲑(30‰) | 0.45 – 0.58 | 全程欠饱和 |
| 大菱鲆(28‰) | 0.37 – 0.56 | 全程欠饱和 |
| 对虾(15‰) | 1.29 / 0.85 / 0.78 | 仅苗种期达标 |
| 罗非鱼 / 鳗鲡(淡水) | — | 不适用,不显示该行 |
这是模型算出的真实状态,不是告警实现问题:高密度 RAS 中 CO₂ 累积压低 pH, CO₃²⁻ 占比骤降。工程后果:Ω < 1 时水对碳酸钙不饱和, 持续溶蚀混凝土池体与水泥基砂浆(长期导致池壁起砂、露筋), 对贝类/甲壳类还影响钙化。对策:提高碱度 / 强化脱气 / 投加碳酸盐。
比电耗与热泵电费没有产品出口。summary 里没有对应字段
(页面上的 kwhPerKgYr 只是热泵单项、且是分阶段的), 因此这两个对外发布的核心指标
进不了 SELFTEST_BASELINE、无法自检, 现在只是碰巧还对着。
建议下一版补 kwhPerKg / hpCostPerKg 并纳入基线。
stageDays 串行累加,比电耗会被低估 2.3 倍(4.2 vs 9.7 kWh/kg·yr)。
本次以已发布的年液氧 471 t 作独立锚点反查确认。本版是自 v1.2 引入双节点热平衡以来最大的一次模型改动。热平衡代码 净减少 65 行;全部 13 条数值基线重算;自检 14 → 16 项, 新增 t15–t17 三类断言。
v1.2–v1.9.3 把 T_room 作为空气节点能量方程的解,自由漂浮、
无任何调节系统。后果:热带鱼种算出车间 9–14 °C / RH 99%。
而实测与规范一致指向「空气 ≥ 水温」:摩洛哥 Amghass 站实测车间均值 16.0 °C(鳟鱼水温 12–16); 大连河豚车间实测 22–23 °C(水温 17);ASHRAE HVAC Applications Ch.6 与 CJJ 122-2017 均要求空气比水温高 1–2 °C、RH 50–70%。方向反了 15–20 K。
v2.0 改为 T_room = T_水温(暖通维持),roomRH_set 默认 65% 可调。
由此删除:Picard 迭代、闭式解、T_room 钳位与「钳位时静默丢弃能量」缺陷。
池面显热 Q_pool_loss ≡ 0(温差为零)。
v1.x 中 CO₂ 脱气塔与 MBBR 曝气的气水直接接触量完全不在水侧热平衡账内: 三文鱼 1000 t 全场达 96,287 m³/h,是机械新风的 4.2 倍。
出口空气按水温下饱和计算,无需任何标定系数, 有两个独立领域的实测支撑:
热量用 Mollier 焓差 Δh = h(T_水, 饱和) − h(T_进气, RH_进气)。
v2.0 接入气液接触器后,自然冷却在冷天基本失效 —— 而那正是它原本最有价值的场景。
原因:两者用的是同一个物理资源 —— 室外冷空气:
自然冷却:室外冷空气 → 干冷器/板换 → 排走水的热 接触器: 室外冷空气 → 填料塔 → 排走水的热(顺带脱 CO₂)
而接触器是必开的(脱 CO₂ 是刚需),自然冷却是可选的。青岛设计冬接触器 排走 21,266 kWh/d,已达内部产热的 82%,水侧净转为需制热 —— 此时自然冷却无负荷可排。
| 工况(三文鱼 1000 t 青岛) | 水侧方向 | FC 贡献 g | FC 开→关 比电耗 |
|---|---|---|---|
| 设计冬 | heat | 0.00 | 12.57 → 12.57,Δ 0 |
| 年均 | cool | 0.13 | 11.54 → 11.59,Δ 0.049 |
| 设计夏 | cool | 0.00(室外 32 °C 过热) | Δ 0 |
UI 保留自然冷却开关,理由有三:① 年均工况仍有 13% 贡献,而年均才是能耗口径; ② 作为可关的对照基准;③ 真实工程可冬季降 G:L 减少接触器排热、把负荷让给自然冷却 —— 这是优化空间,模型暂未建。
新增诊断字段 fcUnavailReason 区分四种「不可用」:
off(用户关闭)/ not_cool(水侧需制热,v2.0 新增的主因)/
uneconomic(经济截止)/ no_dt(温差不足或冷源过热)。
此前 UI 只显示 freeCoolingAvailable = false,用户会误以为都是温差不够。
车间温度受控后,三部分负荷现已全部计入电耗:
| 分项 | 字段 | 状态 |
|---|---|---|
| 水侧热泵 | thermalCostDaily | v1.x 即有 |
| 除湿机(潜热) | dehumCostDaily | v1.9.2 即有 |
| 车间围护 + 通风显热 | hvacCostDaily |
v2.0 新增 |
T_room = T_w 后,车间与室外温差恒等于「水温 − 气温」:正 = 失热需加热,
负 = 得热需制冷。加热与制冷 COP 不同,必须分别取温度修正后的
COP_heat_corr / COP_cool_corr,不可对绝对值统一折算。
该项在寒冷地区与水侧热泵同量级:Bergen 设计冬 3,355 vs 2,847 kWh/d。
新增 hvacEnabled(默认 true),若由暖通专业单独计列可置 false。
co2StripperGtoL 3 → 5,新增 co2PackingHeight_m
1.5 m。依据 Timmons & Ebeling《Recirculating Aquaculture》Ch.10 p.244–245:
CO₂ 汽提 G/L 为 5:1–20:1(常规曝气才 <3:1,增氧是 0.003:1–0.05:1,
三个用途差三个数量级);填料高度限于 1.0–1.5 m,超 1.5–2.0 m 后收益递减。
Karimi 2020 实测 GLR > 5 无额外去除增益,Summerfelt 2003 最优 5.1 —— 四个来源一致。
比功率随之 3.47 → 5.79 kW/1000 m³/h 循环水量,进入 Summerfelt 等 2009 的 5–15 区间 —— 顺带解决 v1.9.2 审计 P4 记录的「低于文献下限」遗留问题。
v1.x 中 co2StripperEff 与 co2StripperGtoL 是两个互相独立的
参数,调高 G:L 只增加风量与电耗、去除率不变,与物理相悖。
新增 co2StripperEffMode:manual(默认,与 v1.x 逐位一致)/
auto(按 Ch.10 Fig 10.13/10.14/10.17 曲线自动算)。脱气塔面板新增
5 个输入框(效率取值 / 填料高度 / 风机全压 / 风机效率 / 水力负荷)与
实时诊断行,同屏显示单次去除率与比功率对标 —— 只显示去除率会诱导用户
一路上调 G:L,电耗代价必须同屏可见。
另重现 Fig 10.17:进风 CO₂ 本底 350 → 1000 ppm 时去除率降 10%,5000 ppm 时降 70% —— 这是「尾气必须排室外、不得回车间」的量化依据。
依据 Timmons Ch.3 Table 3.1。v1.x 对全部鱼种统一取冷水标准 (TAN 1.0 / TSS 15),相当于把冷水鱼的标准套在温水鱼上 —— 对温水鱼种 TAN 严 3 倍、 CO₂ 严 2 倍,造成告警误报(罗非 TAN 实测 0.7–0.97,旧阈值 1.0 下逼近红线, 按教科书应为 3.0)。
| 参数 | 温水鱼 | 冷水鱼 | v1.x(统一) |
|---|---|---|---|
| CO₂ mg/L | 30 | 20 | 20 / 海水 15 |
| TAN mg/L | 3.0 | 1.0 | 1.0 |
| TSS mg/L | 20 | 10 | 15 |
温水/冷水按养殖水温 ≥ 20 °C 判定(教科书两类为 24–30 与 10–18 °C)。 ⚠ 水质限值在本工具中是告警层,不参与选型与流量计算 —— 与教科书 Ch.3 的 「约束驱动流量」方法论不同,本项修的是告警正确性。
新增的 t17 断言实测发现三处参数组合在物理上不可行。共同点:
density 或耗氧系数在某个版本被调高,而 turnover 未同步 ——
每次改动单独看都对,组合起来把参数推到物理不可行区。
| 鱼种/阶段 | 原状态 | turnover |
|---|---|---|
| 鳗鲡 养成期 | 出池 DO = 0.00 mg/L(完全耗尽),CO₂ 超阈值 44% | 2.5 → 5.0 |
| 鳗鲡 黑仔期 | 出池 DO 0.69(阈值 5.09) | 3.0 → 4.5 |
| 罗非 苗种期 | 出池 DO 3.20(阈值 4.70) | 6.0 → 8.0 |
| 大菱鲆 中鱼期 | 池内 CO₂ 15.2(阈值 15) | 2.5 → 3.0 |
以鳗鲡为例:v1.9.2 把养成期密度由 40 上调至 120 kg/m³(为修正 CAPEX 失真), 同版新增 TSS 附加耗氧项 —— 高密度下该项占总耗氧 67%, 两者叠加使出池溶氧归零。
v1.x 起有 7 条基线没有 climate 字段,因而全部跑在默认地区
青岛 —— 罗非(28 °C)/ 石斑(27 °C)/ 对虾(30 °C)在 −7 °C 的青岛过冬,
这些组合工程上不存在。接触器项接入前气候影响有限,该配对错误不显;
接入后气候成为主导项,温水鱼种比电耗被推到 15–30 kWh/kg(行业实测上限为
Atlantic Sapphire 丹麦的 13.6)。
现按实际配对:温水淡水(罗非/加州鲈/鳜鱼/鳗鲡)→ 上海; 温水海水(石斑/对虾)→ 三亚;冷水(三文鱼/大菱鲆)→ 青岛/Bergen/海南。 比电耗全部回到 9.8–19.6。
新增 salmon_sanya_annual —— 冷水鱼种 × 热带气候。
这是当前行业热点,也是接触器项最关键的场景,此前无任何基线覆盖。
t15 风量平衡 —— 断言 A:设备层独立扫描出的每个「会动风」设备必须已在 气路拓扑登记(判据只看字段名形态,不读登记表,否则退化成「把实现抄一遍」); 断言 B:拓扑中接触水的气流风量合计必须等于热平衡实际计入量。该断言在 v2.0 之前 会立刻失败,正是它把 96,287 m³/h 未入账固化为可执行测试。
t16 接触器物理锚 —— 复现 Karimi 2020 实测工况。采用有界检验 而非精确匹配:检验出口状态、潜热占比(>80%)、Δh 符号(湿热气候养冷水鱼 必须为负)与量级有界(0.9–1.5×)。理由:理想 Mollier 计算必然高于实测 (论文自身外推 y = 0.9361x),而结构错误会翻转工程结论,精度差 20% 只影响数值。
t17 鱼种参数库水质自洽性 —— 硬约束(出池 DO / 池内 CO₂ / TAN / TSS) + 余量哨兵(<10% 告警)+ 负荷指标(饲料/流量比)。
| 参数 | 默认 | 说明 |
|---|---|---|
roomRH_set | 65 % | 车间设定相对湿度。T_room = T_w 后,池面蒸发只依赖本参数 |
contactorRecovery | 0 | 接触器排气热回收率 0–0.95 |
hvacEnabled | true | 车间显热是否计入能耗 |
co2StripperEffMode | manual | 脱气效率取值方式 |
co2PackingHeight_m | 1.5 m | 填料层高度 |
co2MaxAttainableEff | 80 % | G:L=20 时最大可达去除率 |
co2IntakeCO2_ppm | 350 | 脱气塔进风 CO₂ 本底 |
| 气路拓扑对象 | — | airPath / airFlowM3h / collectAirStreams() |
本轮调查中曾判定有问题、经查规范与实测后确认模型正确:
| 曾判定 | 核实依据 |
|---|---|
| DO 判据口径错误 | Timmons Tab 3.1:鲑科出水 6–8 / 罗非 4–6 mg/L,本工具在区间内 |
| turnover 偏高 3 倍 | DB 21/T 2350-2024 §9.3 要求溶氧 8–12 mg/L, 三文鱼 turnover 3.0 是满足规范的最低值 |
| 耗氧强度偏高 | MO₂ 3.15 mg/(kg·min) @15 °C,文献 2–4 中部(Calabrese 2023 实测 2.4 @9.3 °C) |
| 主泵扬程未生效 | 参数正确(7 m + 氧锥 3 m = 10 m),反算 9.5 m 吻合 |
| 比电耗偏高 | 低于 Atlantic Sapphire 丹麦实测 13.6,高于挪威独立仿真 9.59 |
| 脱气塔风压偏低 | 与 G:L=5 组合后比功率 5.79,进入 Summerfelt 5–15 区间 |
| 围护 U 值缺失 | 早已完整:U_墙/顶/地/窗 + 4 档保温预设 + 热回收 + 窗墙比 |
⚠ v2.1 订正:本节记录的是 v2.0.0 当时的状态,其中四条已在 v2.1 解决或推翻,
原文保留作历史记录,当前状态请看 v2.0.1 → v2.1 章节与主页帮助区 §L:
• ① 接触器蒸发未计入水量平衡 → 已实现(补水拆换水股/蒸发股,盐平衡恒等成立)。
且原文三个数字均不准确:实测 −10.8% ~ +10.7%、双向(非「6.0%、单向」),
接触器净水汽约为池面蒸发 50 倍(非 29.5 倍)
• ② 凝结水对盐度的影响未建模 → 已给出诊断(海南设计夏稳态盐度 30 → 27.2‰)
• 暖通侧负荷标注界外、不计能耗 → 已推翻:v2.0 起计入能耗,v2.1 修正口径并补设备投资(AHU-1002)
• 蛋分有支路泵而无供气动力项 → 已实现(K-501,6.41 kW / 508 m³/h)
① 接触器蒸发未计入水量平衡。 气液接触器的热量已完整计入
(Δh 含潜热,t16 验证潜热占 86%),但其带走的水的质量尚未进入
V_makeup。实测三文鱼 1000 t 青岛设计冬:接触器蒸发
584.6 kg/h(14.03 m³/d),是池面蒸发 19.8 kg/h 的 29.5 倍,
占补水量的 6.0%。后果:补水量、补水加热、补水费与排污量均系统性低估约 6%,
且该偏差在高 G:L 或热带工况下会放大。属单向系统性偏差,已列入 v2.1。
② 凝结水对盐度的影响未建模。 湿热气候下接触器 Δh 为负时空气在填料上 结露、向系统净产水:三亚设计夏约 33 t/d。淡水场是白得的补水; 但海水场意味着持续被淡水稀释,会影响换水策略与盐度控制。
③ 暖通侧未含太阳辐射与人员负荷。 围护体系本身是完整的 —— U_墙/顶/地/窗四值可调,含 4 档保温预设(温室 3.5 / 标准车间 0.8 / 保温车间 0.30 / 近被动房 0.15)、通风热回收、窗墙比,地板对地温单独计算。但太阳辐射与采光带 得热未建模:大连一项 RAS 车间 CFD+实测研究显示,屋顶采光带可把墙体表面温度推到 29 °C(同期水温 17 °C)。因此高日照地区、尤其设有采光带的车间,夏季制冷负荷偏保守。 人员负荷(约 100 W/人)相对车间显热(千瓦级)可忽略。
其它遗留:contactorRecovery 默认 0(上海冬季接触器排
31,541 kWh/d 转制热,需实测定值);MBBR 流化下限与 bfTankDepth 参数缺失;
石斑三阶段 DO 余量仅 +2%/+3%/+10%;蛋分有支路泵而无供气动力项;
单池面积 DB 21/T 2350 规定 5–30 m²,本工具每阶段建模为一个池,池数由用户设置。
补丁版, 不改动任何计算模型 —— 13 条数值基线与 v2.0.0 逐位相同, 本手册第 2–29 章正文全部继续适用, 无需重读。自检 16 → 17 项。
A. 模块化聚合 totalKw_field 产出 NaN。 微滤机 RDF 是流量定额设备 (按 m³/h 选型), 不返回 installedKw; 而全场聚合循环对每个设备一律计算 installedKw × numModules, 得 NaN。同一处的 totalFlow_field 有守卫、本行没有 —— 不对称守卫。实测边界: 16 工况 × 全阶段仅此一条非有限路径, 且 NaN 经 JSON 序列化静默变 null、下游四页面均未消费, 线上无可见故障。已改为算不出即给 null。
B. 容积率 FAR 默认值两个口径并存。 「审计回合 7」已把默认值由 GB 50187 工业下限 0.7 改为水产实测主流 0.5, 但漏改三处 (存盘 fallback、注释、用户可见文案)。其中存盘 fallback 会导致存盘记 0.7 而导出用 0.5, 再次载入后总占地静默缩小 29%。三处已归一到 0.5。
C. 版本号改为单一事实源 + 自检锁定。 页脚与版本面板此前硬编码, 现从 IRAS_META 注入; 新增自检项 meta_version_consistency 校验三处 SEO 静态串与两处注入结果。该断言已用负对照验证会失败。
⚠ 本版未触碰 v2.1 候选项 (接触器蒸发进水量平衡、凝结水对盐度影响、MBBR 流化下限、蛋分供气动力等) —— 那些都要动模型, 不属补丁版范围。
源于第三方第四轮审计。13 条数值基线全部重算。
A. 车间显热能量守恒破口 (P0)。 v2.0 删除空气节点时, 挂在该节点上的产热项没有被重新安置: Q_air_gain_kW (泵/UV 电功率中进空气的那一份) 仍在计算、仍在返回, 但不进入任何一侧平衡。同因还有 dehumHeatDest='indoor' 的除湿冷凝热 —— 代码注释仍写「已在 T_room 迭代中计入」, 而该迭代在 v2.0 已删除。实测青岛设计冬丢失 1,617 kWh/d, 达 HVAC 显热负荷的 41.8%。
修法: Q_hvac_sens = Q_envelope + Q_vent_sens − Q_room_internal, 室内产热 = 设备废热 + 除湿冷凝热(入室时)。⚠ 第 29 章描述暖通显热负荷时应按此式, 原「围护 + 通风」二项式已不完整。
修复后成本变化的符号随工况方向翻转 —— 制热工况下降 (废热减轻供暖), 制冷工况上升 (废热加重制冷)。若为单向偏移反而说明修错方向。
B. 守恒类不变量断言落地。 A 项那类缺陷 golden-master 抓不到 (基线跟着变)、有限性断言抓不到 (数值正常)、口径一致断言也抓不到 (不涉同量两处换算) —— 只有守恒断言能抓。三条 (设备产热分配 / 车间显热闭合 / 水侧净热闭合) 已并入页内自检。修复前断言 B 在 56 个「工况×阶段」组合中 48 项失配, 残差与 Q_air_gain×24 逐位相等。
C. 自然冷却可见性回归。 freeCoolingSinkT 被单行编辑误并进行尾注释, UI 第四档永不触发; fcUnavailReason 全库无消费点; 且整段被困在 pumpDirection==='cool' 内, 而 v2.0 最常见的 not_cool 恰好落在分支外。三层一并修复, 改读枚举。
D. 口径与参数。 totalMax 补 hvacCostDaily; dehumEnabled 开关对成本无效却 gate 显示 (已对齐); 尾气入室比例默认 0.2→0 (对齐气路拓扑 A5); co2StripperGtoL 引擎侧钳到 [1,30]。
H. 第五轮审计: 风机热与登记表升级。 三台风机 (脱气 53.6 + BF 42.4 + 蛋分 11.7 = 107.7 kW) 的电功率此前既不在泵/UV 的电-热分配里, 也不在任何其它热流里。注释写了「不走 pumpHeatRatio 进水」—— 对, 但它也没走别的地方。方向与 v2.0 的 Q_air_gain 一致: 付电费让风机运转, 却让这些电产生的热凭空消失, 再付一次热泵的钱把水加热回来。修法: 轴功 (η=0.57) 抬高接触器进气温度 (青岛冬 −7 → −3.5°C, 等湿升温), 电机损失并入 Q_room_internal。
登记表升为唯一真相源。 同一缺陷已在三层各出现一次 (Q_air_gain → 蛋分气流漏登记 → 风机热无去处), 成因是计费/热/资本三个去向分散在三处机制。POWER_REGISTRY 现声明 path(支持嵌套)/billedVia/heatVia/capexVia 四项, 断言改为从登记表反向枚举 —— 旧断言用正向扫描 + 命名规则, 实测漏掉 co2StripperSpec.blowerKw(53.6 kW) 与 bfBlowerSpec.power(42.4 kW)。新增断言 A2 (全量电-热分配) 与 F4 (登记设备必须有 CAPEX 条目), F4 落地后立刻抓到蛋分风机「有电费无投资」。
断言 A3: 账目完整 ≠ 接入正确。 A2 校验了「风机电功率 = 轴功 + 电机损失」, 但负对照没转红 —— 把轴功参数传 0 (热完全不接入), 两边照样相等, 因为两个量照常算出、加起来也对。补 A3 (接触器进气温升必须与轴功自洽) 后才咬人:「进气温升 0.00 K ≠ 轴功推算的 3.76 K」。守恒断言容易只验证「账算得平」, 而不验证「钱真的付到那个地方」。
收尾两项。 ① 蛋分风机补 modulePerSpec 规格 + 1+1 备用, 三台风机备用政策至此一致 —— 与 v1.9.3 给脱气塔风机补规格时完全同一处境, 当时的原注释逐字适用。② v1.9.2 章节 G / I 两表加历史横幅: 数字 (37.53 / 比电耗 9.5) 原样保留为历史记录, 但同章节末尾「请以本节为当前基线」这句现在已指错 (当前基线是 v2.1), 会让读者把 37.53 当成当前值, 已加订正批注。
气候联动只覆盖点击路径。 applyDefaultClimateForSpecies 只挂在鱼种按钮的 click 处理器里, loadStagesFromDB() 不调用 —— 载入方案 / 下游导入 / 测试脚手架全部绕过。已移入 loadStagesFromDB。意外收获: 对虾基线 −3.58 元/kg —— 基线只覆盖年均字段而选型用设计冬/夏, 三亚的对虾场一直按青岛设计冬选热泵。
⚠ 与审计的两处不同判断: 「HVAC 潜热未计费」不成立 (潜热经 m_dehum → dehumKWhPerDay 计费, 海南夏实测 2,613 kWh/d, 两者同源再计一次是重复); 「买了 92 万除湿机一天不开」表述有误 (按设计夏峰值选型是正常做法)。经产品方确认, 除湿按独立机组处理。
F. 补齐三处漏项 (第二批)。 车间暖通机组 CAPEX (AHU-1002, 85.5 kW / 24.4 W/m²) —— v2.0 引入车间显热能耗却一直没有对应设备与投资; 制冷↔制热切换余量 regimeMarginPct (G:L=3 时仅 3.9%, 默认阶段 1 仅 0.5%); 蛋分供气风机 K-501 (6.41 kW / 508 m³/h) —— 泡沫分离效率由气量决定, 此前只有支路泵。
G. 登记完整性断言。 加蛋分风机时连犯三个同类错误而现有断言一个都没抓到: 并进 totalPumpKw (守恒断言等式两边同步放大, 残差为零)、漏加 elecCostAvgDaily (比电耗单向低估)、气流未登记 airPath (与 v2.0 的 Q_air_gain 孤儿项完全同类)。
守恒/平衡断言只能约束【已进入体系的量】, 无法发现【压根没进体系的量】。要抓后者, 必须从设备侧反向枚举。
新增 POWER_REGISTRY 与断言 D (气流登记完整性) / E (电功率登记完整性), 四条负对照全部精确转红。⚠ 仍有一层盲区: 登记表本身可以声明错, 未堵。
E. 鱼种默认气候联动。 v2.0 只修了自检基线的配对, 产品默认仍是青岛且切鱼种不联动。新增 DEFAULT_CLIMATE_BY_SPECIES, 罗非比电耗由 16.21 降到 13.48。
| 版本演进说明 (v1.0 → v1.9.2) | |
| 第一部分 RAS 基础 | |
| 第 1 章 循环水养殖概述 | — |
| 第 2 章 RAS 工艺流程 | — |
| 第 3 章 水质参数与控制标准 | — |
| 第 4 章 氮循环与碳循环 | — |
| 第二部分 工程设计方法 | |
| 第 5 章 养殖规模设计 | — |
| 第 6 章 污染物负荷计算 | — |
| 第 7 章 精确循环方程 | — |
| 第 8 章 系统体积建模 v1.3.x 增 S-101 | — |
| 第三部分 各处理单元设计 | |
| 第 9 章 固液分离 (转鼓微滤机 RDF) v1.7 系统排水重构 | — |
| 第 10 章 生物过滤 (MBBR 生物滤池) | — |
| 第 11 章 蛋白分离器 | — |
| 第 12 章 反硝化反应器 | — |
| 第 13 章 UV 紫外线消毒 | — |
| 第 14 章 高级氧化 (AOP) | — |
| 第 15 章 增氧与脱气 v1.9.1 液氧双口径 | — |
| 第 16 章 热负荷与温控 v1.2 重写 | — |
| 第 17 章 水泵与管道设计 | — |
| 第 18 章 电气与控制系统 | — |
| 第 19 章 生物安全与消毒策略 | — |
| 第 20 章 系统启动与调试 | — |
| 第四部分 经济评估 | |
| 第 21 章 运行成本 v1.9.2 两层口径 + 产业对标 | — |
| 第 22 章 投资概算 v1.7 旁路拓扑 CAPEX | — |
| 第五部分 设计案例 | |
| 第 23 章 案例: 三文鱼 1000 t/年 v1.7 数据 | — |
| 第 24 章 案例: 大菱鲆 500 t/年 | — |
| 第 25 章 案例: 对虾 100 t/年 | — |
| 第六部分 工程化与平台功能 (v1.3-v1.7) | |
| 第 26 章 多模块并联与 N+1 备用 v1.3 新章 | — |
| 第 27 章 鱼池配置与池深统一 v1.3 新章 | — |
| 第 28 章 全局气候与围护建模 v1.9.2 通风口径 | — |
| 第 29 章 双节点稳态热平衡求解 v1.9.2 除湿机 | — |
| 第 30 章 P&ID 工艺图自动生成 v1.3.x 新章 | — |
| 第 31 章 设备清单导出 v1.3.x 新章 | — |
| 第 32 章 4 工况成本对比基线 v1.3 新章 | — |
| 第 33 章 投资财务评价 (NPV/IRR + 8 张标准表) v1.4 新章 | — |
| 第 34 章 可研报告生成器 (16 章 + docx + 模板引擎) v1.5 新章 | — |
| 附录 | |
| 附录 A 完整符号表 | — |
| 附录 B 全局热配置参数表 | — |
| 附录 C 设备 tag 命名总表 | — |
| 附录 D 鱼种参数表 | — |
| 附录 E 参考文献 | — |
| 附录 F 免责声明 | — |
源于第三方第六轮审计。审计核心判断:「断言的质量已超过工况的覆盖面 —— 下一步的收益在加工况, 不在加断言」。本版照单全收: 自检 17 → 20 项, 13 条数值基线重算 (|Δ| ≤ 0.02 元/kg, 符号随工况方向翻转)。
此前 13 条数值工况全部「mainline 拓扑 + 脱气塔开启 + 纯氧增氧」。新增 edge_no_degasser / edge_bypass / edge_air_aeration 三条配置边界工况, 只跑不变量断言、不比数值。落地顺序刻意为先加工况 (转红) 再修缺陷 (转绿) —— 红→绿转换即工况有效性的负对照。
CAPEX 嵌套: 蛋分风机条目原嵌在脱气塔 if 条件分支两层内, 脱气关闭时蛋分照常运行照常计费、投资却消失 —— F4 目标模式第四次出现, 且在修复它的同一次提交里。现与各独立设备并列。
ΔT/mdot 不自洽: 风机温升按冷密度算、焓流按热密度算, 丢失 (1−mdot/mdot₀) 份轴功 —— 默认工况 1.2%, 脱气关闭时 ΔT≈30 K、丢 10.1%。现做不动点迭代解联立至 mdot·cp·ΔT ≡ Pshaft, 附录 B 的 dT_blower / mdot 自此严格同一状态点 (即「mdot 自洽」)。
旧口径 ΣkW × 0.57 与各风机效率参数脱节 (用户调高效率, 模型反而认为进气流的热更少)。物理上 kWi×ηi = Q·Δp 与 η 无关, η 只影响电机损失分成 —— η 逐台加权自动恢复该性质, η 与各功率公式严格同源 (co2 读 co2BlowerEfficiency, bf 取公式内常数 0.60, skimmer 读 skimmerBlowerEta, 鱼池增氧读 tankAirBlowerEfficiency)。
空气曝气模式的鱼池增氧鼓风机 K-101 此前登记表与气路都看不见 (计费有、CAPEX 有、热去向无、气路无) —— 与 Q_air_gain (v2.0)、蛋分气流 (v2.1)、风机轴功 (第五轮) 同族的第四次逃逸, 机制是关键功率藏在混合数值与格式化字符串的展示对象里。现全量接入 (airFlowM3h + airPath + 登记表 + 轴功加权)。新增断言 E2b 递归扫 *Spec 子对象封住该逃逸类; 治本方案 registerDevice 工厂化已立项 v2.3。
capexVia 由正则改精确名称数组: 旧正则假阴性 (删掉真目标仍绿) 与假阳性 (bypass 下 F4 四阶段误报) 双向皆错。五台支路泵显式声明共享「支路泵合计」聚合条目。精确化随即曝光被掩盖四版的存量不一致 —— BF/脱气塔风机 CAPEX 选型门槛 0.5 kW vs F4 的 0.05 kW, 现以 capexMinKw 显式声明进登记表, 与 CAPEX 侧选型门槛同源。
堵 v2.1 明示的最后盲区 (「billedVia 可以指向不存在的成本字段而断言不会发现」)。断言 G1 落地当天抓到 5 条活体: 声明写的是内部变量名 *CostDaily, cost 导出面是 *CostMax/*CostAvg —— 与第六轮审计连错两轮的 dehumCostDaily 同一个坑 (billedVia 声明必须真实存在于导出面, 设备活跃时非零)。G2 防同一 CAPEX 条目被重复认领。
skipClimate 删除: 全库零调用点的死参数 (restoreState 不经 loadStagesFromDB), 为不存在的调用方准备的开关只会在被忘传时静默伤人。渲染与计算解耦: 渲染抛错此前被计算 catch 吞掉伪装成「计算异常」并销毁结果, 现独立捕获、标注「渲染异常, 计算结果有效」—— 负对照双向实测 (修复前渲染故障使 13 条数值全灭为 0, 修复后零影响)。审计误报驳回: NH₃ 阈值与 Ω 告警两条「六轮未动」为第四轮已驳回误报的复发 (v1.9.3 起在位); 接触器进气节点不可选为记录在案的设计决策。
源于本版的首次 UI 专项审计。与第一批的登记表工作是同一个模式在 UI 侧的实例。自检 20 → 21 项, 13 条数值基线逐位不变 (纯重构)。
用户填 0 → 模型收 0 → 重渲染后输入框显示默认值 (模板把 0 当 falsy) → 再改任何别的字段, 全量读回时假显示值覆盖 proc, 用户设置无声消失。陷阱在三层 (渲染 / 读取 / 消费), 只修一层反而更糟: 实测只修渲染侧会造成「界面诚实显示 0、模型仍用默认值」, 而原状态至少界面与模型口径一致。三层必须同批落地。
取值约定此前散布四处 (默认值表 / 渲染模板 / 读取侧钳制 / 消费侧兜底), 实测已漂移四条: co2StripperEff 三处三值 (65/65/75)、co2StripperGtoL 事实源 v2.0 改 3→5 而副本停在 3、co2PackingHeight_m 1.5 vs 1.0、climateRegion 事实源与消费侧不同。这些副本平时是永不触发的死代码, 故漂移无人发现 —— 直到用户填 0 让它们复活。
FIELD_SPEC 只管范围 (min/max/step/clamp), 默认值仍归 PROCESS_DEFAULTS, 由断言 H 保证对齐。clamp 取 UI 范围与原钳制的并集 —— 机械规则, 不收紧现有能力, 无回归风险。同时消灭: UI 范围与代码钳制不一致 (7 字段)、22 字段无钳制、同字段多处渲染矛盾 (3 处)。
第一版 FIELD_SPEC 只收了原本带 min/max 属性的 34 个字段, 另有 22 个字段完全无钳制 —— 实测 mainPumpEta=0 使主泵报 1383.6 kW (成本 +6.6 元/kg)、VTR20=0 使成本 +12.0 元/kg, 全部有限无 NaN: 危害是「看起来正常的错误数字」, 会原样进可研报告, 比 NaN 难发现得多。现已全部接入 —— 依据取自各字段自己的 title 提示 (22 条无一缺失地写明了工程范围, 只是从未落到属性上)。本批 min/max 取 tooltip 的工程范围, clamp 取更宽的物理边界 (第一批那些字段的 UI 范围本身就是硬边界, 本批多为典型值区间, 当硬边界会挡掉合法探索)。
并集规则的缺陷: 第一批的 clamp = UI 范围 ∪ getNumClamped 漏了第三个来源 —— 消费处的 Math.max(x, 下限)。它与前两者性质不同: 前两者是允许区间 (并集 = 不收紧能力), 后者是物理硬保护 (必须遵守而非并入)。后果: co2BlowerEfficiency 的 clamp 是 [0,100] 而消费处写着 Math.max(η/100, 0.3) —— 用户填 0 时 proc 存 0、界面显示 0、模型实际用 30%, 而 t22 一直报「保真 ✅」(它检查的三个量全在 proc 层, 看不见消费处)。规则修正为 clamp_lo = max(消费处硬下限, 原下限), 并撤除全部 8 处隐式兜底。至此 66 个输入字段零裸奔。
删除死控件 sourceTemp: 双证据确认 —— 静态全库无消费点、动态填 -99 结果逐位不变。源水温自 v1.2 起归全局气候 (T_source_annual 等), 本字段是当时未清理的残留。给死控件加钳制等于承认它还活着, 故删而不修, 与第一批删 skipClimate 同一原则。
发布前对四条基本物质平衡做了产品路径实测 (三文鱼 1000 t): 氮 (TAN) 残差 0.08%、硝酸盐 0.00、CO₂ 0.13% (即换水那份)、TSS −1.8% —— 前三条闭合, 说明稳态方程是自洽解出的。TSS 的 −1.8% 四阶段同号且随规模成比例, 但未确证为模型缺陷 (更可能是核算漏了排污股)。
⚠ 需要明确记录的是: 现有断言覆盖能量 (A1/A2/A3/B/C)、水量 (F1/F2/F3)、登记 (D/E/G)、资本 (F4), 没有一条物质平衡断言。即今天闭合是因为公式恰好写对, 不是因为有东西防止它写错。氧平衡、碱度平衡、碳酸盐体系 (carbonate.js 与主模型的交叉一致性) 三项连"今天是否闭合"都未测过。已列为下一版首要工作。
新增自检项 field_spec_consistency (H1 渲染与表逐位一致 / H2 clamp ⊇ UI 范围 / H3 默认值存在且在范围内)。⚠ 记一条判据盲区: t22 检查的量全在 proc 层, 消费侧的 || 不影响 proc, 故 t22 结构上覆盖不了第三层 (负对照实测无反应), 另补静态判据 t23。一条判据绿了不等于该层被覆盖。
以下三章为 v2.2 发布【之后】的持续加固 —— 不改变 v2.2 的功能范围, 只增加护栏与修正: 第三方独立复核处置 → 物质平衡断言 M → 碳酸盐接口一致性 · a11y · CDN 加固。v2.2 本体的两批发布内容见上方「v2.1 → v2.2」与「v2.2 第二批」两章。
一份独立复核报告 (jsdom 走真实产品路径 + PyCO2SYS 1.8.3.4 / USGS·APHA 溶解氧表 / ASHRAE·IAPWS 湿空气数据 / 第一性原理手算) 提出三条模型误差, 全部落在本版自述的断言盲区 (氧侧 / 碳侧 / 水汽侧)。逐条实测核实: 一条采纳、一条部分采纳、一条驳回。
co2DailyAvg = o2FishDailyAvg × 1.375 只算呼吸, 缺硝化项 tanDailyAvg × 6.286 × (1 − BF_CO2_STRIP), 实测少算 34.5%–43.4%。设计口径 co2Daily 是对的 —— v1.9 memo F2 修过同一个 bug, 设计口径已修而日均口径未跟上。全库 0 消费点, 属死字段, 故删除而非修正 (与删 sourceTemp 同一原则)。带错误公式的死字段比空字段危险: 谁把它接进年度碳核算会静默低估三四成且不触发任何断言。
复核指出应使用冰面式, 数值属实 (−20°C 时水面式高 21.97%), 原注释的适用下界 −20°C 不成立。但本项目继续用水面式且自洽: RH 数据源为「WMO/Climate.gov 30 年均值」, 而 WMO 对 0°C 以下的 RH 以水面 (过冷水) 饱和压定义; humidityRatio 用同一相态还原分压, 前后一致。改冰面式而 RH 仍是水面口径, 反会使含湿量系统性偏低。相态必须与数据定义口径一致 —— 这是选水面式的理由, 不是疏忽。已订正注释区间为 [0, 60]°C 并写明依据。
复核建议「改用 Benson & Krause (1984)」—— 而代码用的就是该式本身: S ∈ {0,30} × T ∈ {10,15,20,25,28,30} 共 12 点, 与 B-K 标准式偏差全部 0.0000%。报告「参考值」反解出的盐度为 ≈35.5‰, 而对比的是 iRAS 在 S=30 的值 —— 拿 S=35 表值比 S=30 计算值, 差的 3.3% 正是盐度效应本身。报告自己写着工况盐度 28–30‰; 其 28°C 行「iRAS 6.410 / 参考 6.41」数值相同却标 +3.33%, 该 6.410 实为 T=30 的值, 表格行错位。
📌 此条与第六轮审计的 NH₃/Ω 误报同类: 基准取值与被测对象的工况参数不一致。复核方法本身正确, 出问题的是基准侧的参数对齐。
化学计量 8 项对第一性原理手算全部吻合 (硝化耗氧 4.57 / 耗碱 7.14 / 反硝化回碱 3.57 / 硝化产 CO₂ 6.286 / 呼吸产 CO₂ 1.375 等); 碳酸盐体系对 PyCO2SYS 1.8.3.4 共 1400 工况, 淡水 pH 一致到机器精度 8.88e-16、海水最大偏差 1.78e-05、Ω_calcite 相对误差 0.0082%; 能量守恒 B 断言残差 0.000e+0、A 断言 1.57e-14%。这些正是本版断言已覆盖的区域 —— 与「三条缺陷全在盲区」互为印证。
此前断言覆盖能量 (A1/A2/A3/B/C)、水量 (F1/F2/F3)、登记 (D/E/G)、资本 (F4), 唯独物质平衡一条没有 —— 而它是本工具的物理核心。第三方独立复核印证: 三条缺陷全部落在无断言区。实测确认今天全部闭合后立即固化 —— 闭合状态是免费拿到的验收基线。
M1 氧-构成 总需氧 = 鱼呼吸 + 硝化 + 异养 · M2 氧-硝化 硝化耗氧 = TAN × 4.57 · M3 氧-供给 液氧耗量 = 鱼呼吸耗氧 / 吸收率 · M4 碱度链条 净额 = 消耗 − 回收, 投加 = max(0, 净额 − 补水带入), 药剂 = 投加 / 0.595 · M6 碳-构成 CO₂ = 呼吸 × 1.375 + TAN × 6.286 × (1 − BF 内脱气)。
把过去修过的缺陷形态注回代码: M6 ← CO₂ 漏硝化项 (复核 BUG-2 形态) 报 −41.5%, 与报告实测同量级 —— 若 v1.9 之前就有这条断言, 那个 bug 根本写不出来; M3 ← 液氧用总需氧而非鱼呼吸 (v1.9.2 修过的口径混淆) 报 +104.7%, 与当年「高估 1.65 倍」同量级; M2 ← 4.57 改 4.60 报 +0.656%。
M4b 落地当场咬中 edge_yield_0 / edge_yield_tiny 八条: 零产量时补水带入碱度超过消耗, 净需求为负而 alkToAdd 钳到 0。核实后确认钳制正确 (不可能投负量药剂), 故改断言纳入下钳而非改代码。
外部核算这三条口径连续错了三次: 液氧误用设备选型口径 o2Demand (含容量系数, 报 −48% 假不闭合)、碱度消耗误用 tanDaily 而非被硝化的 TAN、碱度回收误用理论 3.57 而非代码里的工程系数 2.8。同族「猜口径」已达十次。这正是要把核算放进产品路径的理由 —— 断言从真实导出面取值, 不会像外部工具那样猜错口径。
第三方复核验证的是 carbonate.js 模块本身。但主模型与它之间隔着一层单位换算 (TA = 碱度/50043/ρ、CO₂ = 浓度/44010/ρ), 那一层从未验证 —— 三个因子任一错, pH 与 Ω 都会偏而无人察觉。
I1 往返自洽: solveAlk(pH*) → solve(TA) 还原 pH*, 240 点网格最大 |ΔpH| = 0。I2 换算层: 手工复算与模型逐位相同 (Δ = 0)。I3 双副本: 独立文件与内联块 20 个函数、63 个平衡常数, 归一化 md5 完全相同。
📌 真正的风险不是「当前是否一致」(是), 而是将来会不会漂移 —— 同一份求解器存在两处, 没有任何东西阻止有人只改一处。I3 即为此而设。
163 个 label 零个有 for, 输入框全部无 id —— 点击标签无法聚焦输入框, 是所有人都损失的常规交互 (工艺参数标签仅 10px)。现按 f_{idx}_字段名 生成 id 并关联 65 处。31 个表格中 12 个未包 overflow-x-auto, 已全部包裹。新增自检: 输入框必须有 id、for 不得悬空、表格必须可横向滚动。
📌 实施教训: 正则改了三轮仍漏 1 处 —— Python re 在超长 title 属性上回溯超限后静默放弃匹配。改线性扫描后一次到位。这与 t21 三次扩展全部落空同形态, 两次都是断言先报出数目不对才发现的。
Tailwind Play CDN 动态生成响应体, SRI 哈希无法预先计算 —— 技术限制而非疏忽。chart.js 是固定文件, 可以且应该加 SRI, 但本版不填哈希: 当前拿不到真实值, 而编造哈希会让浏览器拒绝执行脚本、图表直接消失, 比没有 SRI 更糟。只加 crossorigin 并把取真值的命令写进注释。📌 与「判据先负对照证明会红」同源: 安全措施也不能靠猜值上线。
第七轮独立审计报出两条严重回归, 共性诊断准确: 都是一次正确的重构越过了自己的边界, 且检测缺口同构 —— 现有断言查的是内容 (值对不对、几处一不一致), 失效发生在结构 (元素在哪个父节点、钳制覆盖哪些入口)。v2.3 逐条实测核实后处置, 并把「结构」维度补进断言体系。自检 21 → 22 项, 工况 22 → 23 条 (新增 edge_hostile_json)。
v2.2 构建期补丁写入的三处 description (meta / og / twitter) 行尾各多一个 >; HTML5 解析器在第一处提前闭合 <head>, 20 个 meta + canonical 掉进 <body> —— 爬虫只解析 head, canonical / robots / og / twitter 全部失效, 而 description 断言用 querySelector, 对父节点不敏感, 照样全绿。修三字符; 新增 head 结构断言 (元素必须在 document.head 内), 先转红再修复转绿 —— jsdom 内部即 parse5, 负对照免费。
v2.2 撤消费处 || 默认 时把 Math.max 取值域守卫一并删了 —— 前者是真相源问题、后者是校验边界问题, 写法相似但性质不同。clampByFieldSpec 只在 UI 读取路径调用, 载入越界方案 JSON 长驱直入 (实测 co2BlowerEfficiency=0 → NaN 遍布; co2StripperGtoL=1e6 → 成本 109 万元/kg)。修复: ensureStageProc 兑现自己注释宣称的不变式 —— 对 PROCESS_DEFAULTS 数值键逐一 clampByFieldSpec (非有限回落默认, 布尔/字符串原样)。它是 recomputeAll / rebuildStages 的公共入口, 「UI 有守卫而加载没有」自此在结构上写不出来。edge_hostile_json 修复前咬出 Infinity/NaN 于能量 A2/B/C、登记 E1、物质 M4a; 修复后转绿, 13 条数值基线逐位不变 (钳制对合法参数是纯守卫的实证)。
鱼池是车间内的敞开水面, 气泡在池面破裂 —— 尾气必然入室且已被水温饱和; OUTDOOR→OUTDOOR 只对有排风管的脱气塔成立。aerationSpec.airPath.sink 改 INDOOR, 车间湿平衡产湿侧新增 ṁ_air × (W_sat(T_w) − W_room)。实测罗非养成 (28°C/65%): 1,384 m³/h → 336.1 kg/d, 为池面蒸发 +29% (审计估 335 / 手算 337 / 实测 336, 三方吻合)。显热恰为零 (A3: T_room = T_w); 与接触器 netWater 无重复 (一记水体失水、一记车间得湿)。成本仅动 air 模式除湿设计选型 CAPEX (罗非 +0.007 元/kg), 年均电耗不变; 13 条数值基线全 o2 模式, 逐位不变。进气侧维持室外取气 (设计决策: 进气经风管自室外), 接触器进气继续用室外温湿度。开放项: air 模式气泡吹脱的 CO₂ 同样入室, 新风需求目前只计脱气塔份额。
默认值同时写在 GLOBAL_THERMAL_DEFAULTS 与读取函数的字面量 fallback 里, degasserExhaustIndoorFrac 已实际漂移 (表 0 / fallback 0.2; 0 正是 v2.1 为气路 A5 改的值)。实测更正: 缺失键为 4 个非审计所报 6 个 (三个 U 值在表内, 审计漏了 fcDesignDT_K); 另抓到审计未报的第三处副本 —— 消费点一处 : 0.2 死 fallback。处置: 补 4 键入表 → 32 处 fallback 一律引表 → 死 fallback 改引表 (保留 [0,1] 取值域守卫)。断言两条: 键集锁定 + 运行时 toString 扫源码禁字面量 fallback (首版正则漏 3 处对齐多空格行, 由脚本残留自查抓到 —— 故把这层也固化为断言), 双向负对照精确。
v2.2 注释预想「联网后 curl 原 URL 取哈希」—— 实测原 URL 的 chart.umd.min.js 在 npm 包内不存在, 是 jsDelivr 对缺失 .min.js 的动态压缩产物; 给动态生成物钉 SRI 与给 Tailwind Play 钉 SRI 是同类错误的温和版。处置: URL 改指包内真实发布件 chart.umd.js, 哈希链条 = registry 声明 sha512 → 本地 tarball 复算逐位一致 (供应链验证) → 发布件 sha384; integrity 与 crossorigin 成对上线。断言: jsdelivr 脚本必须成对、Tailwind Play 必须皆无 (防 v2.2 样式崩掉事故复发)。
海南低密度(石斑 20 kg/m³)鼓风曝气 + 关脱气塔是主流案例, 暴露两层缺口: ① 旧风量公式 SOTE 硬编码 0.18 为清水标准态值, 无水深/α β θ/驱动力修正, 实际 OTE 仅其 1/3–1/2; ② CO₂ 侧风量需求缺席, 关塔只有不联动的 fallback 旋钮(实测鱼池 CO₂ 55–179 mg/L 超阈 2.5–8 倍而选型无反应)。实装: tankAerationDesign 为选型与稳态的共同单源 —— O₂ 侧 OTE = SOTE(%/m)×水深×αβ×θ^(T−20)×(C*−DO_design)/C*; CO₂ 侧按 Henry 平衡载量(复用碳酸盐 K0_W74/ρ, 零副本), 风量取两侧 max 并标注控制侧; 关塔稳态 η = A·k·逼近/Q 反算。断言 M8(air+关塔 ⇒ 稳态 CO₂ ≤ 选型目标)红→绿: 旧 144–179 → 新 20.5 mg/L。DO 饱和与 CO₂ 阈值内联逻辑抽共享函数(逐字符不变), o2 基线逐位未动; 新工况 edge_air_no_stripper。新参数(JSON 可调, 经全路径钳制): sotePerMeter 6.5 %/m · aerationAlphaBeta 0.75 · co2StripApproach 0.5 · co2TargetMgL null=阈值。事故记录: K0_W74 入参为 Kelvin(Weiss 式 T/100), 首版传 °C 得 1e111 —— 第六次「猜接口」。海南石斑 200 t 案例落点: 风量 O₂/CO₂ 两侧收敛(1,095 vs 1,270 m³/h), CO₂ 控制选型, 全场风机 ~78 kW, 综合 60.4 元/kg · 21.5 kWh/kg(对照: 带塔 68.1/25.5, 旧旋钮虚算 57.5/18.8)。
v2.2 的 patches/ 与 tools/ 不可得, 自 v2.3 起直接在交付产物上编辑, 「从 v2.1 全量重建」的可复现性封存; 验证工具按 HANDOFF §4 规格重建并显式标注。编辑纪律不变: replace_once 强制唯一命中、断言先负对照转红、基线变动先预测符号量级。
国内多数循环水项目是简易棚: 无暖通无除湿, 车间温湿度由太阳、设备废热、池面与尾气换热、自然通风共同决定。此前该场景无表达路径 —— hvacEnabled=false 只是不收电费, A3 前提仍强制室温=水温。本批新增全局键 roomMode 三档: conditioned(恒温车间, 既有路径逐字保留)/ ventilated(简易棚·自然通风)。⚠ 本批原含第三档 open(露天), 因中国工厂化循环水无此实际场景, 后续批次已撤销(白名单/UI/派发分支/R4 枚举一并移除; 旧 JSON 写 open 者与非法值同路回落 conditioned)。13 条数值基线在恒温档下逐位不变(全精度导出比对); 自检 23 → 24 条(新增 edge_room_ventilated)。
车间温度自由求解正是 v1.2–v1.9.3 的做法, 热带鱼种曾算出车间 9–14°C / RH 99%, 与实测(摩洛哥温室 16°C / 大连简易棚 22–23°C / ASHRAE 水温+1~2K)方向反 15–20 K, v2.0 因此撤退到「暖通维持」。复盘结论: 方程没错, 热源清单漏了三类 —— ① 太阳辐射(全库无建模)② 设备废热(未进空气节点)③ 接触器尾气显热(被 A3 温差恰为零掩盖)。空气节点唯一热源只剩池水对流小项, 解被围护+通风大项拽向室外温度。三类补齐后重启求解。凡 A3 成立时「恰好为零/恰好抵消」的项, 求解器一上全部复活 —— 这是 A3 的隐藏依赖清单, 开工前逐条重审过。
九气候区各补 GHI 冬/夏/年(Global Solar Atlas / NASA POWER; 三亚 4.2/5.8/5.2, 多哈夏 7.2, 特罗姆瑟冬 0.0 极夜); 四档围护配窗 SHGC / 屋面 SHGC / 不透明面吸收率(ASHRAE Fundamentals Ch.15; 温室档透光屋面 SHGC 0.55 且不透明项置零, 近被动房 0.35/0.5)。不透明面按 sol-air 折算 U·A·α·GHI/h_o(h_o=22.7 W/m²K, 墙面另乘 0.5 朝向因子)。求解器对显热与湿平衡两线性式经结露潜热耦合做阻尼(0.5)不动点迭代, ≤50 轮; 不收敛回落 T_room=室外并置 converged:false(断言 R1 + 界面 danger 双通道)。池面显热系数由既有 evapCoeff 经 Lewis 类比反推(β 的钳制同步作用于显热 —— 蒸发与显热同一张换热面, 不另取 5 或 15 的常数); 通风显热直接吃 0.34 系数的 UA 项, 与报告口径同源(否则 ρ 口径差在大体积×高 ACH 下产生数百 kWh/d 虚假残差, 空气节点闭合断言会咬到工具误差而非真错)。超饱和钳到饱和线、结露潜热回注显热式、凝水量 kg/d 出腐蚀风险告警。
简易档下暖通显热与除湿电耗严格为 0, 由断言 R3 锁死 —— 该零是「设备不存在」而非「算了不计」。池面显热带符号接入水侧热平衡: 三亚设计夏车间解至 36.7°C(室外 35 + 太阳/内热推高、27°C 池水拉低), 池面转为得热, 水侧冷负荷 3,894 → 4,520 kWh/d。同基准三方对照(石斑/三亚/密度20/air/关塔/annual): 恒温 hvac-off 63.9 元/kg(仍计除湿 711 kWh/d 电 —— 那台机在该档真实存在)→ 简易棚 62.6 元/kg。热泵冷负荷确实上升(6,157 → 6,298 kWh/d, 与 A.4 预测机理一致), 总成本却略降 —— 除湿整机移除的省电压过池面得热代价, 这是把「假简易」(关电费开关)换成「真简易」(机器不存在)的正当结果; v1.x 失败特征(车间坍缩到室外之下、池面白捡散热)经标定确认未重演。
R1 收敛性 · R2 物理界(下界对规格原文做了推广: min(室外,水温,地温)−0.1 —— 冷水鱼种池面是合法低于室外的热汇)· R3 模式互斥 · R4 取值合法性与向后兼容(未设 roomMode 的旧 JSON 必落恒温档; 白名单守卫在 UI 读取与消费点两侧同口径)· R5 空气节点显热闭合(围护+通风流出 = 太阳+内热+池面+尾气+结露, 容差 max(2, 0.5%), 守恒断言 B 的自由节点版)。五组破坏性负对照逐一验证闸门: 强制不收敛→R1、撤暖通守卫→R3、求解器丢尾气项→R5、太阳归零→标定钩子、池面归零→标定钩子。标定探针(tools/probe_room_calib.js)固化三组实测锚点; 首版判据「命中实测点 ±2K」全数失败但逐项热流物理自洽 —— 偏差来自锚点场景重建不确定度(iRAS 建筑几何是成本驱动的紧凑型, 内热密度 200+ W/m², 与实测场几何不可比), 判据遂改为方向 + 有界偏移 + 三类热源在场且量级合理, 点值降级为诊断输出。追着实测点调工况旋钮 = 曲线拟合表演, 教训保留在探针头注。
关塔空气曝气的 CO₂ 新风份额(v2.3 遗留): 气泡把池水 CO₂ 吹入车间, 新风需求此前只按脱气塔份额计; 现关塔且曝气入室时份额取 1(零新常数)。对 air+关塔的恒温档工况有真实影响(三亚案例约 +0.3 元/kg); 13 条 o2 基线逐位不受影响。开塔时曝气残余份额未细分, 维持开放项。使用: 全局热工面板顶行「🏠 车间模式」三档; 简易棚建议 ACH 15–30(上限已放宽); 结露告警优先加大通风; 车间比水温低 >2 K 提示寒潮核对鱼种耐受下限。ventHR(通风热回收)在自然通风棚语义上应为 0, 模型不强制 —— 用户若留非零值等于假设有被动回收构造, 参数哲学是用户定参数、模型只管算。
本版全部起于一句产业侧提问: 空气曝气是直接加在池子里的, 曝气的时候鱼也在消耗, 所以空气用量要远大于 95% 饱和度。顺着这句话查下去, 发现模型对同一台鼓风机 K-101 用了两套互相矛盾的拓扑, 并连带挖出一处潜伏的跨模块不同源缺陷。13 条数值基线逐位不变, 自检 24 条工况不变, 新增断言 M9/M10/M11。
选型侧 tankAerationDesign 按池内曝气算, 完全正确: 池水维持 DO_design = max(DOmin_abs, 0.7×DO_sat) ≈ 5 mg/L, 推动力只剩 (C_sat−C)/C_sat ≈ 26%, OTE = SOTE/m × 水深 × αβ × 1.024^(T−20) × 推动力 折算后仅 2.2–4.5%, 风量据此反推 —— 这正是提问者说的"远大于饱和所需"。水质侧 simulateWaterQualityProcess 却写着 satTarget = 0.95(air 模式写死)、tankDO = DO_sat×0.95 − ΔDO_per_cycle, 这是氧锥/增氧塔在主管路上把水打到位再送进池子的拓扑。可 air 模式的设备是 鱼池增氧鼓风机 K-101, 气直接打进池子, 根本没有"进池浓度"这个概念 —— 增氧与耗氧在同一个控制体内同时发生。后果是鱼被"呼吸了两次": 选型侧已按维持 5 mg/L 配好风机, 水质侧又假设进池 95% 再扣一整个循环的耗氧量。
air 分支改为池内质量平衡: OTR(C) = A × 1.2 × 0.23 × OTE_base × (C_sat − C)/C_sat = OCR ⇒ C = C_sat − OCR × C_sat / (A × 1.2 × 0.23 × OTE_base)。与循环流量无关 —— 循环流量只管 TAN/CO₂/TSS 的移除, 不管 O₂。零新常数(1.2 与 0.23 与选型侧同源); OTE_base 是推动力折算之前的基础效率, 为保 13 条基线逐位不变, 原 OTE 表达式逐字符不动、此处独立重算一份。o2 分支逐字保留(氧锥确在主管路上, 原口径本就正确)。
修正前后对比(石斑/三亚/200t):
| 密度 | 阶段 | 修正前 DO | 修正后 DO | 选型侧 DO_design |
|---|---|---|---|---|
| 20 | 苗种期 | 2.70 | 5.41 | 5.00 |
| 31.2 | 苗种期 | 0.21 | 5.37 | 5.00 |
| 40 | 苗种期 | 0.00 | 5.31 | 5.00 |
| 40 | 成鱼期 | 2.73 | 5.38 | 5.00 |
修正后 DO 不再随密度崩塌, 且高出 DO_design 的那一点正是选型安全系数 safetyAerator=1.10 的效果。解析验算: 开塔(O₂ 控制)工况 deficit = (6.73−5.00)/1.10 = 1.573 ⇒ DO = 5.158, 模型三个阶段输出全为 5.158, 与手算逐位吻合。⚠ 修正前那个 0.00 是拓扑用错产生的伪值, 不是"会死鱼"的物理结论 —— 本手册特此记录, 防止后人把它当作历史结论引用。
诊断中发现探针复算与模型内部风量对不上(苗种期 222 vs 132 m³/h), 而成鱼期完全一致 —— 差异只出现在 O₂ 控制的阶段。根因: recDepth_m 是鱼种库的逐阶段字段, 而 tankAerationDesign 被两条路径各调一次:
| 路径 | 传参 | 拿到的水深 |
|---|---|---|
| 设备选型 / CAPEX | tankAerationDesign(stage, ...) | 真实值(石斑苗种期 1.5 m) |
| 水质链 / η_co2 / DO / 强度 | tankAerationDesign(sp, ...) | 白名单无此字段 ⇒ 静默兜底 3 m |
OTE ∝ 水深、风量 ∝ 1/OTE, 苗种期两侧差 1.68× —— CAPEX 买的机器与水质链假设的机器不是同一台。该白名单上方就挂着 v1.1.2 的注释「sp 必须包含 DOmin_satRatio 和 DOmin_abs, 否则鱼种内置 DO 阈值失效」: 同一个白名单、同一种漏字段、第三次复发。负对照(撤掉修复)证明24 条自检依然全绿 —— 因为两条路径各自内部自洽, 只是彼此不同源, 这正是它能潜伏至今的原因。故封在断言层(M11 跨模块风量同源), 不是注释层。
总风量由鱼的耗氧决定, 几乎不随密度变(密度 20→60 时 222→332 m³/h, 因鱼的总量由产量定); 而水体 V = 生物量/密度 ⇒ 强度 ∝ 密度, 密度 3 倍则强度 4.5 倍。新增派生量 sim.aerIntensity: 体积强度 m³/(m³·h)、池底布气 m³/(m²·h)、两口径各自反算的该阶段 air 模式可行密度上限(因 V 与密度严格反比, 反解精确而非外推; 唯一一阶近似是风量本身随密度的微弱变化, 偏差 <10%)。
阈值的出处与局限都写在 WATER_LIMITS 注释里, 使用者必须知道它们不是福利阈值的直接规定: ① 体积 2.0 —— 源自 33.3 m³ 池微孔曝气 CFD+实测, 30 m³/h 相对 60 m³/h 标准曝气效率高 32.1%(即 0.90 相对 1.80), 0.90 是能效拐点, 2.0 是在其上留工程余量的告警线; ② 池底 3.0 —— 由"纳米盘(孔径 80–100 μm)每 m² 池底 1 个 × 单盘常规工作气量 1.5–3 m³/h"反推的工程惯例, 非规范条文。定性佐证只入注释不入判据: 池底/穿孔管曝气的气泡上升对水体产生扰动与噪音、不利养殖生物生长, 且紊流会把残饵粪便搅碎成细颗粒使水质恶化(气提式无扰动曝气装置的研究动机); 三文鱼计算机视觉实验显示曝气开启时通气频率升高, 且与 DO/水温无关, 属对紊流与气泡流的行为响应 —— 即DO 达标不等于鱼没有代价。
石斑/三亚实算:
| 密度 | 阶段 | 水深 | 风量 m³/h | 体积强度 | 池底强度 | 可行密度上限 |
|---|---|---|---|---|---|---|
| 20 | 苗种期 | 1.5 | 222 | 2.65 ✗ | 3.97 ✗ | 15.1 |
| 20 | 成鱼期 | 3.0 | 1270 | 0.57 ✓ | 1.71 ✓ | 35.0 |
| 40 | 苗种期 | 1.5 | 267 | 6.37 ✗ | 9.55 ✗ | 12.6 |
| 40 | 成鱼期 | 3.0 | 1270 | 1.14 ✓ | 3.43 ✗ | 35.0 |
成鱼期可行上限 35 kg/m³ 与国际经验线接近 —— Global Seafood Alliance 的 RAS 综述指出密度高于 40 kg/m³ 时鱼与细菌的耗氧速率通常已超出常规曝气设备溶入大气氧的能力, 必须改用气态纯氧。差别在于 35 这个数是从曝气强度推导出来的, 不再是拍脑袋的门槛。苗种期上限只有 12–15, 但这更说明"把同一密度套在三个阶段上"本身不合理 —— 曝气强度约束的是"密度 × 阶段"的组合, 不是全场密度。
M9 气曝-DO 闭环(air 模式稳态 DO ≥ DO_design − 0.05; 与 M8 气曝-CO₂ 闭环成对, 一个锁 O₂ 侧、一个锁 CO₂ 侧) · M10a 体积/池底口径几何自洽 · M10b/c 可行密度反算自洽 · M11 设备侧/水质侧风量同源。四组负对照逐一验证闸门会咬人: 撤 DO 修正 → M9 红(三条 air 工况全咬, 罗非默认密度即报 2.08 vs 4.70) · 池底面积错水深 → M10a 红(7.240 ≠ 10.860) · 反算写成加法 → M10b 红(2.393 ≠ 2.000) · 池底口径误用体积阈值 → M10c 红(2.000 ≠ 3.000) · 撤 recDepth_m 白名单 → 修 M11 前无人咬住(24/24 全绿), 修后转红。另补车间高温告警, 与简易模式批次的寒潮告警对称: 比水温高 >5 K 管热泵冷负荷(池面转得热), 绝对 >38°C 管作业条件与风机/变频器降容。
本版的产业来源。石斑/三亚/200t/简易棚(ventilated, ACH 15)/关脱气塔/关臭氧与 AOP/放大系数 1.8: 密度 20 → 70.29 元/kg(35.1 元/斤), 密度 31.2 → 58.77, 密度 40 → 54.23(27.1 元/斤)。密度 40 下 DO 5.31–5.38 达标; CO₂ 20.45 mg/L 在阈值 22.5 内 —— air 模式的曝气本身即脱气, 不需另配脱气塔(反之 o2 模式关塔会让 CO₂ 冲到 257.91 mg/L、pH 掉到 5.67, 纯氧模式脱气塔是必需品); 全年凝水为零(海南冬季室外 18–20°C, 围护内表面始终高于露点, 简易模式批次的结露告警在此气候区空转, 要到青岛大连才有意义)。唯独曝气强度全线超限。真正的限制是夏季车间温度(设计夏 36–41°C, 池面转得热直接进热泵冷负荷; 加大 ACH 可降温但推高 RH, 热带自然通风无法同时降温除湿)与曝气强度 —— 不是 DO、不是 CO₂、不是湿负荷。
车间模式重新划分为三档: conditioned 恒温恒湿车间 / natural 自然通风车间 / mechanical 机械通风车间。分档判据只有一条: 能否自动调节温湿度 —— 不是"简易还是正式", 也不是"自然还是机械"。同时补上一台此前两档共同缺失的设备: 车间通风机 KV-1003。13 条数值基线因此全部重算。
本版起于产业侧一句反问: "恒温恒湿车间也有机械通风"。确实如此 —— 恒温档的 ACH 新风量一直参与计算(UA_vent_sens 进暖通负荷), 但从来没人给它配风机: 全场四台风机(脱气塔 / BF / 蛋分 / 池内增氧)没有一台是车间通风机。所以通风方式不是某一档的子类型, 而是横跨两档的独立事实。三档扁平命名后, "恒温恒湿 + 自然通风"这个物理上不成立的组合被天然排除 —— 你不可能一边花钱把室温压到 27°C, 一边让室外热风自由穿堂。
⚠ 键名变更: 简易模式批次的 ventilated 改名 natural; open(露天)已于池内曝气批次撤销。二者均不留别名 —— 留一条永远没人走的路径只会扩大审计面。旧方案 JSON 写这两个值的, 与任何非法值同路回落 conditioned(断言 R4b 覆盖)。
功率 = 风量(m³/s) × 全压 ÷ 效率, 与既有四台风机同一套公式。
易错点一 — 风量口径。 必须取 V_vent_eff_m3h = max(ACH×V_room, CO₂ 稀释需求), 不是 ACH×V_room。air 模式关脱气塔时 CO₂ 才是控制项; 负对照实测挂错口径低估 58–66%, 且只在 CO₂ 控制的工况暴露 —— 只测 o2 模式永远不会显形。由 M12a 锁住。
易错点二 — 全压。 独立键 ventFanPressure_Pa 默认 250 Pa, 绝不复用池内曝气盘的 70 kPa: 后者要克服水柱静压, 前者只克服风管与百叶阻力, 差两个数量级。实测 173,123 m³/h 下 250 Pa 给 21.9 kW, 误用 70 kPa 给 6,121 kW —— 与 HANDOFF 记录的 K0_W74 传摄氏度事故(airCO₂ 冲到 1e10)同族, 故独立成键并在两处留警示注释。
热去向为登记表新增的 exhaust 类别: 直驱轴流排风机电机在排风气流中, 空气离开车间后才经过电机 ⇒ 废热随排风带走, 既不进车间也不进水。与 external(臭氧发生器独立机组冷却介质带走)的区别在成因, 结果同为界外。⚠ 已知边界: 恒温恒湿车间若用送风式 AHU, 送风机废热确实进车间并需再制冷; 本版按单风机排风统一处理, 该情形下偏低。UI 提示: 送排平衡式请把全压按两台之和折算。
补一台真实存在的设备必然改变基线, 故按纪律先出预测表再改代码。预测: 全部 13 条上升、幅度 +0.01~+0.08 元/kg(≤0.1%)、最大为 turbot_500(水体大, 通风量 5 万 m³/h)。
| 工况 | 旧 | 新 | 实测 Δ | 预测 Δ |
|---|---|---|---|---|
| salmon ×6 | 37.69–44.15 | +0.010 | +0.010 | +0.01 ✓ |
| tilapia_1000 | 30.9163 | 30.9252 | +0.009 | +0.01 ✓ |
| turbot_500 | 56.1492 | 56.2340 | +0.085 | +0.08 ✓ |
| grouper_500 | 44.6083 | 44.6291 | +0.021 | +0.02 ✓ |
| bass_300 | 46.4027 | 46.4289 | +0.026 | +0.02 ⚠ |
| eel_200 | 61.0096 | 61.0276 | +0.018 | +0.02 ✓ |
| mandarin_200 | 58.6372 | 58.6792 | +0.042 | +0.04 ✓ |
| shrimp_100 | 50.4214 | 50.4856 | +0.064 | +0.06 ✓ |
方向 13/13 为正、量级 13/13 吻合, 最大偏差 0.006 元/kg(bass_300, 差在预测未计 CAPEX 折旧那一份)。幅度远小于口头估算的 +0.8 元/kg, 原因是基线默认 ACH 为 1 而非简易棚的 15 —— 同一台风机放到海南工况(ACH 15)是 21.9 kW(密度 20)/ 10.9 kW(密度 40), 密度高反而小, 因为车间体积减半, 这是高密度此前没算出来的一项红利。
恒温恒湿档下用空气曝气, 气泡带进车间的 CO₂ / 湿 / 热各有归宿(石斑/三亚/200t/密度20/年均实测):
| air 关塔 | air 开塔 | o2 对照 | |
|---|---|---|---|
| CO₂ → 新风需求 | 9,835 m³/h 成为控制项 | 0 | 0 |
| 实际新风 | 9,835 | 7,116 | 7,116 |
| 尾气入室产湿 | 290.8 kg/d | 250.7 | 0 |
| 除湿量 / 除湿电 | 1,776.9 / 710.8 | 1,629.3 / 651.7 | 1,378.6 / 551.4 |
| 尾气显热 | 0.0 | 0.0 | 0.0 |
CO₂ 经 fracIndoorCO2 → V_vent_fish_m3h 与 ACH 口径取大值, 关塔时把新风顶高 38%, 这部分新风的冷热负荷全压给暖通。湿按 ṁ_air × (W_sat(T_w) − W_room) 计入车间产湿, 除湿量较 o2 档 +29%。热的尾气显热恰好为零 —— 这不是漏算: A3 下 T_room = T_w, 而尾气离开水面时温度就是 T_w, 显热项数学上严格为零; 该零只在恒温档成立, 到通风档 T_room 是解出来的, 这一项立刻复活(海南夏季 −93 kWh/d, 冷尾气反过来给车间降温)。v1.x 当年正是被这个"恰好为零"骗过, 重写车间求解时漏掉了它。另有一段热记在别处: 进气自室外取, 被加热并饱和加湿到 T_w, 这段由水侧的气液接触器换热承担, 不进车间账本 —— 两本账各记一次, 不重不漏。
据此三条告警: ① 恒温恒湿 + 空气曝气(新风与除湿双重加价, 成鱼养成建议改纯氧)· ② 新风被 CO₂ 顶高(同一股 CO₂ 在通风车间只需付风机的钱, 为省一台脱气塔而关塔请核对这笔账)· ③ air 模式开塔冗余(曝气本身即脱气, 关塔后 CO₂ 20.5 仍在阈值 22.5 内)。
第 ③ 条有一个例外值得记住: 脱气塔在 air 模式下虽非 CO₂ 达标所需, 却是调节曝气强度的杠杆 —— 密度 40 成鱼期关塔时 CO₂ 侧需 1,270 m³/h 反超 O₂ 侧 1,095, 成为风量控制项, 把池底布气顶到 3.43(超 3.0); 开塔卸掉 CO₂ 负担后风量回落 1,095, 强度 2.96 合规。告警文案按阶段判断 sizedBy 分别措辞, 风量由 O₂ 控制时明说"开塔不会减少风量, 纯属多花钱"。
⚠ 三条告警都写明什么时候可以忽略它: 育苗 / 亲鱼车间本就是恒温恒湿 + 空气曝气的常态配置(密度天然低、水温与光周期要求精确、鱼苗对纯氧过饱和敏感 —— 模型里苗种期 TGP 阈值本就更严的 110%), 而 roomMode 是全局键、aerationMode 是逐阶段键, 该组合会自然出现, 不是误操作。若每次打开都见红字, 久了就没人看告警了。
此前几轮关于"空气曝气能撑多少密度"的推算, 全部依赖设备商配置反算与媒体报道。取得海南省地方标准 DB46/T 424—2017《豹纹鳃棘鲈工厂化养殖技术规程》正文后, 这条链才有了成文依据。
标准表 1 · 分规格养殖密度(直接给 kg/m³, 无需折算):
| 体长 cm | 体重 g | 尾/m³ | kg/m³ |
|---|---|---|---|
| 10–15 | 7–45 | 150–250 | 1–5 |
| 15–20 | 45–85 | 100–150 | 5–15 |
| 20–30 | 85–280 | 70–100 | 15–20 |
| 30–40 | 280–650 | ≤70 | ≥20 |
标准明写密度的约束条件: 「养殖密度与养殖设施、换水量、溶氧量密切相关, 换水量越大、溶氧量越高的养殖水体, 可适当增加养殖密度」—— 正是本模型一直在建的逻辑链。4.4 增氧设施「采用鼓风机+纳米管或纯氧统一供氧」, 二者并列为合规方案、未规定密度分界; 结合密度表, 20 kg/m³ 量级下鼓风机+纳米管是标准认可配置, 印证空气曝气承载量 20–25 的落点。6.2 水质指标 DO≥5 mg/L 与模型 DO_design = max(DOmin_abs 5, 0.7×DO_sat) 逐字相符; 修正后的池内曝气稳态 DO 5.16–5.41 正在标准线之上。
⚠ 换水率口径不可混用: 标准 6.1「流水养殖模式下日换水量一般控制在 200%~800%」是流水模式(日 2–8 倍水体), 循环水模式低两个数量级, 与模型 exchangeDaily 不是一个口径。
石斑成鱼期 recDepth_m 由 3.0 m 改为 1.5 m, 依据标准 4.2「养殖池面积 10–20 m²、池深 1.0 m–1.5 m」; 万宁在建工厂化项目实测池型 Ø8 m / 90 m³ ⇒ 水深 1.79 m, 亦远浅于原值 3.0。
⚠ 该字段是统一池深数据源: poolArea = V_tank / poolDepth → A_building = 1.6 × poolArea → V_room = A_building × H。改它会连锁改池面积、建筑面积、蒸发面与通风量, 故基线随之重算。按纪律先出预测再改: 池面积翻倍 ⇒ 蒸发↑、除湿↑、围护散热与通风量↑ ⇒ 仅 grouper_500 上升且幅度显著(远大于此前几次的 +0.01 量级), 其余 12 条逐位不变。
| grouper_500 | 旧 | 新 | Δ |
|---|---|---|---|
| 工艺成本 元/kg | 44.6291 | 44.8341 | +0.2050 |
| 企业全成本 元/kg | 54.3236 | 54.5412 | +0.2176 |
| 比电耗 kWh/kg | 14.1210 | 14.3427 | +0.2217 |
| 热泵成本 元/kg | 1.6019 | 1.7419 | +0.1400 (+8.7%) |
预测完全命中, 其余 12 条 diff = 0。热泵涨幅最大(+8.7%)正是蒸发面翻倍导致的潜热负荷。副效果: 成鱼期池底布气强度由 1.71 降至 1.48, 从超限转为合规; 可行密度上限 19.8 → 23.0 kg/m³, 与标准表 1「30–40 cm 段 ≥20」及产业口径 20–25 一致。
控光: 已知未建模维度。标准把控光列为要求项 —— 4.2「配备通风、控光、控温设施」(与通风、控温并列)、6.2「光照 2000 Lux~5000 Lux」(与 DO/pH/温度/盐度同级的受控参数)。产业侧佐证: 东星斑养殖场用蓝光、红光模拟 20–30 m 深的海底光照环境, 因为体色直接决定售价。iRAS 目前只有 UV 消毒(水处理), 没有养殖照明, 缺口有三: ① 灯具电耗未进 POWER_REGISTRY, 比电耗系统性低估; ② 灯具废热未进车间空气节点(与补 UV/泵废热同族的漏项); ③ 体色分级溢价未进财务侧 —— 这是唯一一条收入侧缺口, 其余全部遗留都在成本侧。不在本批建模: 需灯具选型口径(W/m² 或 Lux→W 换算)、光谱配比、光周期, 且体色-售价的量化关系无公开数据, 硬做即编造。
原限值 2.0 m³/(m³·h) 与 3.0 m³/(m²·h) 的依据是搅拌式反应器能效拐点与对虾育苗盘密度反推, 用在鱼身上偏松 2–3 倍。经产业配置反算后下调至鱼类档 1.0 / 1.7, 原值保留为甲壳类档 —— 工厂化对虾的正常工况就是"水面气泡成沸腾状", 絮团模式还需曝气维持颗粒悬浮, 二者不可共用一个限值。
标定口径写死为全压 20 kPa · 风机效率 0.60 —— 产业确认 1 m 深的池子 20 kPa 够用(罗茨风机压力经验 9.8 kPa/m 水深)。⚠ 刻意不写"20–30 kPa"这类区间: 全压取 20 与 50 kPa 结果相差 2.5 倍, 含糊比精确更危险, 复核时务必按此单一口径。
| 来源 | 配置 | 池底 m³/(m²·h) | 体积 m³/(m³·h) |
|---|---|---|---|
| 山东海水工厂化(空气悬浮增氧机) | 18 kW / 2000 m²(深 0.8) | 0.97 | 1.22 |
| 山东海水工厂化(老式罗茨) | 22 kW / 1440 m²(深 0.8) | 1.65 | 2.06 |
| 工厂化对虾 | 15 kW×2 / 1000 m³(深 1.2) | 3.89 | 3.24 ⚠水面沸腾状, 鱼类不适用 |
⚠ 二次修订: 两个判据曾自相矛盾, 这是本批最该记住的一条。一次修订把池底 1.7(来自养殖池真实配置反算)与体积 1.0(来自搅拌式生物反应器的能效拐点 0.9)并列当判据用 —— 两个数来源不同质。结果在 0.8 m 浅池上直接打架: 同一套真实运行的系统, 按池底判据合格(0.97 / 1.65 < 1.7), 按体积判据却超限(1.22 / 2.06 > 1.0)。因 池底 = 体积 × 水深, 池底 1.7 在 0.8 m 水深下隐含的体积上限本应是 2.1, 而当时设了 1.0。
现改为主/次判据结构: 池底为主判据(有真实工程配置支撑), 体积为次判据且阈值取在全部实测之上, 只拦极端情况。告警文案亦按主/次分别措辞。
| 池底(主判据) | 体积(次判据) | |
|---|---|---|
| 鱼类 | 1.7 | 2.5(实测 1.22–2.06 之上) |
| 甲壳类 | 4.0 | 3.5(实测 3.24 略上) |
注意甲壳类那档: 一次修订误设的 3.0 / 2.0 低于对虾的真实配置(3.89 / 3.24)—— 等于把一个正常运行的工况判成超限。这是"拿 A 场景的数字当 B 场景阈值"的第二个实例(第一个是拿反应器能效拐点当养殖池福利阈值)。
布气密度口径交叉印证: 纳米盘按每 m² 池底 1 个布置(孔径 80–100 μm, 曝气压力 0.02–0.03 MPa); 对虾池 5.5×5.5 m 配纳米管总长 28 m ≈ 每 m² 池底 0.93 m 管 —— 两者量级一致。
承载量交叉校验: 取鱼类 1.7 时, 石斑成鱼期反算可行密度 19.8 kg/m³。这与设备商系统参数吻合 —— 同一套海水工厂化循环水系统, 最大生物承载量为「半滑舌鳎 10 kg/m²(液氧 15)、大菱鲆等 20 kg/m²(液氧 40)」, 即空气曝气的承载量约为纯氧的一半; 亦与 GSA「密度 >40 kg/m³ 时耗氧速率超出常规曝气设备溶入大气氧的能力, 必须改纯氧」一致。三个独立来源收敛于空气曝气鱼类承载量 20–25 kg/m³, 产业侧确认 30–40 配空气曝气偏高。
⚠ 仍未解决的不确定度: 上述反算全部依赖假设的全压(20–30 kPa)与风机效率(0.6), 全压取 20 与 50 kPa 结果差 2.5 倍; 且多数来源未给出对应的养殖密度, 严格说不可直接互比。若能取得近两年新建海水鱼工厂化项目的完整设计参数(密度 + 增氧方式 + 风机配置三者齐备), 应据此重校。常量注释已完整记录出处与局限。
新增断言 M13 与工况 edge_shrimp_air(自检 24 → 25 条)。立此断言的直接原因值得记录: 新增鱼种字段 isCrustacean 后, 负对照证明把它从 recomputeAll 的 sp 白名单里撤掉, 24 条自检依然全绿 —— 与 recDepth_m 完全同一模式的第四次复发(前三次: v1.1.2 的 DOmin_*、本轮的 recDepth_m)。注释提醒挡不住, 只有断言能。凡"鱼种库有字段 → 白名单转发 → 消费点使用"这条链, 都应有一条断言校验消费点拿到的确实是鱼种的值。
⚠ 更值得记的是第二层: 断言写好后负对照仍然全绿。查明原因是没有工况能触发它 —— aerIntensity 仅在 air 模式下计算, 而 shrimp_100 基线走 o2 模式。补 edge_shrimp_air 工况后负对照才精确转红(实得 1/1.7, 应为 2/3)。新断言必须确认存在能走到它的工况, 否则等于没写 —— 这条教训与"断言先负对照转红"的纪律是一体两面。
交付后的一个提问("空气曝气对 CO₂ 的去除如何建模")牵出一处被误判为缺陷、实际是正确设计的地方, 特此记录以防后人"修正"它。
模型的 CO₂ 脱除走三步: ① 亨利平衡载量 kLoad = (1/44010/ρ/K0)×44.01/Vm(K0 用碳酸盐模块的 Weiss 1974 溶解度常数, 与 pH/Ω 求解同一套参数, 无第二份副本); ② 反推所需风量 airCO2 = CO₂日产量×安全系数 /(kLoad×目标浓度×逼近度)/24, 再与 O₂ 侧取大值并标注 sizedBy; ③ 稳态去除率由选定风量反算 η = 风量×kLoad×逼近度/循环流量, 而非独立旋钮 —— 这是 v2.3 二批修复的核心(旧版 fallback 旋钮与风量互不知晓, 海南石斑关塔实测池水 CO₂ 冲到 55–179 mg/L 而选型侧毫无反应), 断言 M8 锁住该闭环。
看似的不一致: O₂ 侧 OTE ∝ 水深, CO₂ 侧与水深无关。查证后确认这是两种传质机制的正确区分: O₂ 溶入是【速率控制】(推动力大, 气泡全程远未饱和, 接触时间越长溶入越多); CO₂ 脱除是【气相载量控制】(气泡在离开液面前已被 CO₂ 饱和, 再深也装不下更多)。生物反应器放大实测: O₂ 的 kLa 斜率随液深线性增长, 而 CO₂ 的 kLa 仅在液深 < 约 1000 mm 且最弱搅拌下线性, 更深/更强搅拌时出现明显饱和效应(气体停留时间足够长, 气泡出液前已被充分饱和); CFD 研究同样确认大型反应器中 CO₂ 吹脱时气泡在离开培养液前即饱和, 且放大过程中 O₂ 与 CO₂ 的 kLa 演化路径不同。若照"给 CO₂ 补上水深依赖"去改, 反而会把一个正确的模型改坏。
真正的问题在浅池: 饱和的前提是停留时间够。鱼种库里大菱鲆全程 0.8–1.0 m、石斑苗种期 1.5 m, 都在转折点附近或以下, 这些工况的 CO₂ 去除被系统性高估 —— 而大菱鲆是冷水鱼、CO₂ 阈值更严(20 而非 30 mg/L), 又常用平面浅池, 三重叠加。故新增浅池告警(水深 < 1.5 m 且 air 模式关塔时触发)。实测触发精确: 大菱鲆三阶段全触发, 石斑 1.5 m 及以上不触发, 开塔与 o2 模式均不触发。
⚠ 只告警不折减, 这是有意选择: 那个 ~1000 mm 转折点出自搅拌式生物反应器, 气泡尺寸、上升速度、湍流强度与养殖池微孔盘曝气都不同, 转折点位置未必能直接搬。拿一个来源不同的数字当阈值就是曲线拟合表演(与 probe_room_calib.js 头注记录的标定哲学同款教训)。宁可显式承认不确定, 也不假装知道折减多少。
⚠ 另记一条待查: 级联塔实测(淡水 0‰ vs 盐水 35‰, 15°C, 进水 10–60 mg/L)显示两者传质系数相近, 但盐水的 CO₂ 吹脱效率显著低于淡水, 归因于出水重建平衡时无机碳各形态电离分数的差异, 并直接指出海水循环水系统的 CO₂ 去除比淡水更困难。模型 kLoad 里的 ρ 与 K0 已含盐度, 但那是溶解度的盐度效应, 不是电离分数造成的额外损失。而现有 marineCO2Factor: 0.75 挂在 CO₂ 限值上, 其注释自承"代码中无出处标注、教科书亦未按盐度区分 CO₂ 限值、该系数应单独查证"—— 该系数可能挂错了位置: 海水该被区别对待的或许是去除效率而非限值。本版不动, 记入遗留。
M12a 通风机风量与热工侧真实通风量同源 · M12b 档位一致性(自然通风档必须无风机, 恒温恒湿 / 机械通风必须有 —— 后者正是"恒温恒湿本身即机械通风"这一判断的运行时证据)。负对照: 风量挂错口径 → M12a 红(429.5 ≠ 1023.3, −58%; 1944 ≠ 5762, −66%)· 恒温档不装风机 → M12b 红(FAIL 3/24)· 误用 70 kPa 全压 → 13 条基线红(FAIL 11/24)。
实施中另有一次真实被咬值得记录: CAPEX 选型门槛(if(_vf > 0.3))与登记表 capexMinKw 不同源时, 断言 F4 当场报出"ventFanKw 有电功率但 CAPEX 明细中无对应条目"—— 这正是 v2.2 为 BF 风机建立该机制时预期的用途。
〔本章含 v2.3.3 全部六批: A–F 一批(字段流转工厂化) · G 二批(aerationMode 硬告警) · H 三批(密度分界 40→30) · I 四/五批(设计工况点 + 哨兵盲区) · J 文档批(手册第 15 章追平代码)。 章标题此前只写一批主题, 与章内实际内容不符, J 批一并订正。〕
版本主题只有一件事: 治「权威源 → 转发 → 多消费点, 某个消费点没接上; 各自内部自洽故断言全绿」这一缺陷模式。它在本库已复发五次(v1.1.2 DOmin_* / recDepth_m / isCrustacean / 通风机风量口径 / 曝气侧池深不同源), 每次补断言只封住当次字段, 模式换个字段就复发——上一版交接文档已把"工厂化"列为遗留清单第 0 位。本版为纯结构重构, 13 条数值基线对【v2.3 新基线值】逐位不变(重构版的最强验收条件), 自检 26 → 27 条。
五次复发的案发现场是 recomputeAll 里的手写白名单: 每漏一个鱼种字段, 就多一处静默兜底。现每个字段在 SPECIES_FIELD_FLOW 声明 {scope, toSp, resolve?}——scope 标记权威源层级(阶段字段 / 鱼种级字段 / 派生), toSp 声明是否转发进水质侧, resolve 为解析函数(省略即原样转发)。buildWaterSp(stage) 按表生成 sp, 手写字面量退役。池深解析(用户设定 > 鱼种推荐 > proc 兜底 > 1.5, 下钳 0.3 m)收敛为 resolvePoolDepth 全库唯一副本——此前三副本且兜底不一致(3 vs 1.5)正是"池深修一半"事故的温床。
选静态扫描而非运行时校验, 是对既往两次教训(M13 / M14: 断言写好后负对照仍全绿, 因为没有工况能走到那条路径)的机制性回应: 对水质链四个消费函数做 .toString() 源码扫描, 不依赖工况, 每次自检对全部代码路径无条件全覆盖。M15a 消费面每个 sp.X 必须声明且转发; M15b 每个转发字段必须有消费点(抓死转发); M15c recomputeAll 的 sp 必须来自工厂; M15d 设备侧 tankAerationDesign 调用必须经同一工厂。落地顺序刻意为先加断言(转红)再处置(转绿), 且上断言前先以预飞探针(tools/probe_fieldflow.js)在真实页面环境跑同一套扫描、确认红名单恰为预期。
M15a 上线即红: isWarmWaterStage 支持鱼种显式声明温冷水类别 thermalClass(注释明写"优先用鱼种显式声明"), 但该字段从未进过白名单——同模式第六例, 与 recDepth_m 完全同型, 只因尚无鱼种声明它而未被踩响。已补声明转发(阶段显式 > 鱼种级; 现状无声明 ⇒ 数值逐位不变), 声明能力自此真正生效。M15b 同批咬出 protein 死转发: 白名单转发了它, 消费面(水质链四函数)零处读取——真实消费者是 calcStageLoad, 走 stage.protein 直连不经 sp。已撤转发, 条目以 toSp:false 存档("该字段存在, 有意不进 sp"是一条信息, 删掉条目就丢了)。
此前设备侧传完整 stage、水质侧传白名单 sp——两侧传参形状不同, M11 只能事后比对两侧风量。现设备侧改为 tankAerationDesign(buildWaterSp(stage), …), 两侧吃同一工厂产物, "两侧不同源"在结构上写不出来; 两侧解析规则的微分歧(设备侧原缺 0.3 m 下钳与 proc 兜底——被 UI 输入范围掩盖着的潜在分叉)一并消失。M11/M14 保留为纵深防御, 不撤。
红→绿全程: 批① 忠实等价替换(protein 照转、thermalClass 照漏), 自检 26/26 + 基线逐位不变 → 批② M15 入列, FAIL 26/27, 红项恰为预飞命中的两条 → 批③ 处置, PASS 27/27 + 基线仍逐位不变。四条人工负对照(临时副本上做)全部精确转红: 表删 DOmin_abs → M15a · 塞假字段 ghostField_xyz → M15b · 手写白名单复活 → M15c 两条且级联咬中 M11/M14 数值断言(23.5 条自检中 6 项转红——结构层与数值层的双重防御得到实证) · 设备侧退回 raw stage → M15d。
M15 只覆盖「鱼种/阶段 → sp」这条链——五次复发的案发地。派生中间量的流转不在射程(V_vent_eff 一类, 第四次复发所在), 仍由 M12a 数值断言压着; 那是另一个量级的依赖图, 有意不在本版摊开。消费点内残余的 || sp.recDepth_m || 1.5 兜底对工厂产物是死代码, 仅为诊断脚本手造 sp 时保留防御——已在声明表头注如实标注, 不假称"解析规则彻底单副本"。
遗留清单第 5 位。侦察修正了问题定义: 渲染层其实已有曝气强度告警与 CO₂ 超标告警——真实缺口是: ① 两条告警困在渲染层(A.6 家族: 无导出面、无断言、渲染改坏无人知, 报告照出成本不带任何"该方案不可行"标记); ② o2 关塔这一物理上必然积累 CO₂ 的配置(仅剩增氧锥附带解吸 ~5%)与"塔效率不足"共用一句"建议启用"的文案, 严重性被淡化; ③ 参数表 aerationMode 处无联动。
落地形态: sim 新增结构化导出 configWarns = [{code, level, …data, rootCause?}], 两个 code: AIR_INTENSITY_OVER(复用 aerIntensity 全部字段)与 CO2_OVER(rootCause 三分 stripperOff / airUnderperf / stripperUnderperf)。判据是结果级而非配置级——CO₂ 稳态实测超阈值才响, 而非"o2+关塔一律响": 高换水/低密度下 o2 关塔确实可达标, 配置级会天天误报, 而"天天见红字就没人看告警"是前一批刚写进文档的原则。判据只复用 sim 已算出的量(aerIntensity / 鱼池 CO₂ / CO2_threshold), 零新阈值(纪律: 不拿来源不同的数字当阈值)。渲染层两块改为消费该数组单源, o2 关塔文案升格为「物理上必然积累, o2 模式必须启用脱气塔」; 参数表联动: aerationMode 选择器随每次计算着色并在 title 给出可行密度上限, 只提示不自动切换(不替用户改配置——改配置是工程决策)。这也是遗留 2(A.6 十一类告警进导出面)未来迁移的目标形态: 新告警按结构化建, 旧的逐步迁。
预飞定锚(教训: 断言必须先确认存在能走到它的工况): 探针 tools/probe_warnmatrix.js 对六类工况出触发矩阵——W1 锚 edge_air_aeration(罗非三阶段池底布气 4.84–7.24 vs 限 1.7, 必超)、W2 锚 edge_no_degasser(鲑四阶段 CO₂ 124–148 vs 阈 15/20, 必超); 13 条基线两标志全假; edge_shrimp_air 天然提供 W1 的"合规不响"侧(甲壳类档 0.79–1.77 vs 4.0)。
断言设计: W0 导出存在性(数组) · W1/W2 标志与底层状态双向 ⇔(该响必响 + 不该响必不响, 防告警恒真化)· 两处工况锚定——锚定与 ⇔ 刻意不同源: ⇔ 查标志与数据的一致性(同函数内, 防重构漂移), 锚定查物理预期(预飞矩阵给出的独立事实)。W3 为静态 .toString() 扫描(与 M15 同机制, 免疫工况可达性问题): 渲染层必须消费 configWarns 且引用两个 code 字面量——若渲染悄悄退回旧读法(直接判 aerIntensity / tank.CO2), 就回到"数据层↔渲染层双源各自自洽", 正是复发六次那个模式的翻版。W0–W2 入逐工况不变量循环(自检行数不变), W3 为新自检行 config_warns_render(27 → 28 条)。
红→绿全程: 断言先行上线即 FAIL 3/27(W0 遍布全库——红仪式全量咬中)→ 数据层落地转绿(含零产量早退分支的空数组骨架: 导出面结构必须完整)→ 渲染单源化 + W3 入列, 28/28。负对照 3/3 精确转红: 撤数据层 AIR 标志 → W1⇔ + W1锚咬(FAIL 24/28)· 渲染退回旧读法 → W3 咬中 CO2_OVER 引用缺失 · CO₂ 判据改错(阈值×10)→ W2⇔ + 锚咬(FAIL 26/28)。13 条基线三次比对全程逐位不变。
📌 负对照 NC3 顺带核实一个边界事实: edge_yield_tiny 工况的鱼池 CO₂ 实际为 21.5–23.7 mg/L、略超阈值 20——真实构建里该工况 CO2_OVER 标志为真且 W2 一致性通过, 行为正确; 它说明 CO2_OVER 在既有工况集中并非只有 edge_no_degasser 一个触发点, ⇔ 断言对所有工况统一生效。
处置遗留第 5 位。侦察修正了问题定义: 渲染层已有曝气强度与 CO₂ 超标告警, 真实缺口是告警困在渲染层(无导出面、无断言——A.6 家族), 且 o2 关塔这一"物理上必然积累"的配置与"塔效率不足"共用一句轻文案。落地四件: ① sim.configWarns 结构化导出(AIR_INTENSITY_OVER + CO2_OVER 带 rootCause 三分; 结果级判据, 零新阈值, 全部复用水质链已算出的量); ② 断言 W0–W2 锁数据层(双向 ⇔ + 双工况锚定, 预飞探针 probe_warnmatrix.js 事先实测触发矩阵: edge_air_aeration 池底布气 4.84–7.24 vs 限 1.7, edge_no_degasser CO₂ 124–148 vs 阈 15/20) + W3 静态锁渲染挂钩(防数据层↔渲染层双源复活, 与 M15 同机制); ③ 渲染改吃单源, o2 关塔文案升格为"o2 模式必须启用脱气塔"; ④ 参数表联动(aerationMode 选择器着色 + 可行密度上限 title; 有意不做自动切换——不替用户改配置)。红→绿全程: 断言先行 FAIL 3/27 → 数据层落地 28/28; 负对照 3/3 精确转红。13 条基线逐位不变。顺带发现 edge_yield_tiny 的 CO₂ 处于 21.5–23.7、略超阈值 20 的边界超标状态——结构化导出上线第一天就多看见一件此前无人知道的事。
产业侧质疑 UI 的 40 kg/m³ 偏高。查证不仅确认判断, 还更正了本库自己的一处引用错误: 注释记「GSA >40 必须纯氧」, 原文实为区间 + 硬上限两句(仅靠曝气典型限于 30–40; >40 则耗氧超出曝气能力)。旧注释把硬上限抄成分界线, UI 据此写成"<40 都可用空气"——把区间上沿当成了推荐值。新分界 30 取自 SRAC-453(美南水产中心 RAS 设计实践综述: 密度 <30 kg/m³ 时气提可提供全部需氧, 满密度 60 时仅约一半)——⚠ 该装置为开放池气提(效率约 0.80), 与本模型池内微孔盘不完全同源, 已标明。另有 TheFishSite「>50 才常规上纯氧」更宽松, 但答的是经济性问题而非工程能力问题, 不并列取值。口径分层(项目方定): 30 进 UI 与参数表(物理上限)· 20–25 进选择器 title 与注释(国标 + 设备商 + 模型反算三源收敛, 国内浅池实配)· 任一阶段准确上限始终以 aerIntensity 反算为准(随水深/温度/鱼种变)。教训: 根因不是数字取错, 而是抄数字时丢了口径(范围/硬上限/推荐值)——失去口径的数在传递中会变成另一种含义("超 40 肯定不行"传成"低于 40 都行")。已立为纪律: 凡引用外部数字, 须连同原文口径一并记录。
由产业侧追问"关塔时是不是该让用户输 CO₂ 浓度"牵出的一串处置。(1) 加载路径防线判据错位: ensureStageProc 以「默认值是不是数字」决定钳不钳, 而哨兵字段(默认 null)的 typeof 是 object, 整类漏在防线外——注入 co2TargetMgL=0.0001 使关塔风量 4,239 → 12.7 亿 m³/h, 与第七轮 P1 的 co2StripperGtoL=1e6 同族同路径。判据改为「FIELD_SPEC 表内有无条目」, 空值仍保持 null(未设定≠设定为下限)。断言 S1/S2 构造注入复验。(2) 两侧都拿安全红线当设计目标: CO₂ 取阈值(上限)、DO 取 DOmin(下限), 同一毛病两面, 系统贴红线跑无裕量。补成对称一对: 设计 DO + 设计 CO₂, 留空回落鱼种值(基线逐位不变)。实测控制侧可翻转: 留空时 CO₂ 侧 4239 险胜 O₂ 侧 4228, 设计 DO 提到 6.0 立翻 O₂ 控制(7243), 提到 7.0 达 15993(近四倍)——该决策此前藏在鱼种库"最低允许值"里替用户做了。(3) 池内曝气与循环流量无关(产业侧指出的拓扑差别, 已实测): turnover 1→4 时 air 模式 DO 恒为 4.9813, 而 o2 模式由 0 → 8.39; 两参数算式均不含流量。⚠ 如实记录一处二阶耦合: 关塔 CO₂ 稳态随流量小幅变(23.7→27.3), 系经风量的间接效应(流量低→TSS 高→耗氧高→风量大→多吹脱)。(4) air ⇒ 塔默认关: 罗非1000t 实测开塔 31.25 元/kg 关塔 26.20(省 16%, 比电耗近腰斩), 水质守得住; 代价是 CO₂ 转入车间, ACH 1.0→6.05(恒温恒湿车间需掂量)。联动只在 UI 事件层——计算层猜意图会静默改用户显式配置并动基线, 断言 S3 静态锁; 用户手动过开关后不再被覆盖。(5) 教训: 批B 给 co2TargetMgL 加了输入框, 随即发现 readStageProcFromInputs 根本没读它——UI 加了但白加; 断言 S4 因此同时查"留空须回落"与"填了须生效"。另补反向灰显 data-aeration-air: 新字段在纯氧模式下填了不起作用, 常显是误导。
前五批把空气曝气路线的代码补完了, 文档没跟上——最直接的后果是界面写 30、手册第 15 章写 40, 用户按哪个都不对。本批只改文档与文档级注释, 不动任何计算: 自检 29/29, 13 条基线逐位不变(三次比对)。
(1) 15.2 对比表重修: 密度分界 40 → 30, 并把口径分层写进正文(30 = SRAC-453/GSA 物理上限 ·
20–25 = DB46/T 424—2017 + 设备商参数 + 模型反算三源收敛 · 任一阶段准确上限以 aerIntensity 反算为准)。
另修两处同源矛盾: air 行的"~95% 饱和度"是 v2.3 前旧拓扑的说法; 新增"池水 DO 是否随循环流量变"与"CO₂ 去向"两行。
(2) 「微孔盘 SOTE 18%」退役: 它是清水标准态(20 °C / 零盐度 / 洁净水 / 初始 DO=0)下的值, 养殖池四个条件一个都不满足;
手册把它列作"吸收效率", 正是二批修掉的那个硬编码 0.18 的文档孪生体。换成完整 OTE 公式并逐因子标注,
附实算链: 清水标称 9.75% → 加 αβ 7.31% → 加 θ 8.63%(OTE_base) → 加推动力 2.22%, 差 4.4 倍;
并点明 OTE(选型用)与 OTE_base(水质侧解稳态用)是两个量。
(3) 15.3 标注适用范围 + 新增 15.3b / 15.3c: 15.3 的 DO 公式只适用纯氧拓扑(前提是"存在进池浓度"),
此前无任何标注——而 v2.3 那次"选型侧说 5.00、水质侧说 0.00"的事故根因正是它被误用到 air 模式。
新增 15.3b(池内稳态方程 / 两侧取大 / 设计工况点 / 完整例题 / 守卫与局限)与 15.3c(硬规则与设计选择之分 /
结果级判据 / 实算对照 / 已知缺陷)。正文数字全部为本版模型实算, 取数探针 probe_manual_ch15.js
与 probe_manual_ch15b.js 随交付。
(4) 两条写进手册的实算结论: 安全系数的去向可解析——实算DO = C* − (C*−设计DO)/safetyAerator、
实算CO₂ = 设计CO₂/safetyAerator; 塔的价值随密度反向变化——关塔时池内 CO₂ 与密度无关
(石斑成鱼期恒 11.86, 因 CO₂ 产量与曝气风量都正比于生物量), 开塔时正比于密度(2.14 → 6.43, 因塔的去除能力
正比于循环流量而流量随水体缩小)。两条曲线走向相反 ⇒ 低密度段塔的优势最大, 而空气曝气恰只用在低密度段。
(5) 参数速查表 D 组补登五参数: designDO_mgL · co2TargetMgL ·
sotePerMeter · aerationAlphaBeta · co2StripApproach;
后三者标明无 UI 入口仅 JSON 可调, co2StripApproach 另标无成文出处、属待校准项。
(6) 一条失效的"已被断言覆盖"承诺(本批最值得记的一件): 手册封面口径散布四处(副标题 / 页脚 /
版本演进章标题 / 首段), v2.2 曾在本章上方留注称「已加入 t21 三文档判据, 下次漏改会转红」。
本批实测: 四处全部停在 v2.3, 而自检 29/29 全绿。查明当前 29 项里只有 meta_version_consistency
管版本, 且只查 index 页内 meta——页面内自检运行在 index.html 的 DOM 里, 读不到 manual.html 与 README.md,
这个判据在浏览器内原理上就做不成, "三次扩展全部落空"的根因在此, 不是写漏了。
现改由工具侧门禁 tools/check_doc_version.js 承担(node 能同时读三个文件), 四处口径一并订正。
⇒ 纪律 12: 注释里写"已被断言覆盖"不等于真被覆盖。声称某处有防线时, 必须同时给出该防线失败时的可见信号;
给不出, 就说明防线不在你以为的那一层。
清两条遗留。(1) 脱气塔默认值三处文档与代码不符: v2.0 对标 Timmons Ch.10 把
co2StripperGtoL 3→5、co2StripperLoadingRate 40→80、
co2PackingHeight_m 1.0→1.5, 而参数速查表、阶段卡片 title、手册 15.4.1 三处都没跟。
这是数值口径错不是排版问题: 用户照文档填 3, 模型按 5 跑, 风机功率差 1.67 倍
(手册例题写 35 kW, 实算 58.8 kW)。另修两处死 fallback(: 3 / : 1.0),
与第七轮审计咬中的 : 0.2 同型。
新增门禁 tools/check_defaults_sync.js, 判据对准 PROCESS_DEFAULTS 这张表
(D1 死 fallback / D2 title「默认: X」/ D3 参数速查表默认列), 上线当天咬出清单上没有的第四处:
denitriFlowPct 文档写 10、实际 2。负对照 4/4。
⚠ D1 另报 33 处同值副本, 有意不判红 —— 一次性改造属独立重构批次, 混进来会淹没
"数值口径错"这件事; 该计数应逐批下降而非上升。
(2) air + 开塔 入室 CO₂ 少算(遗留 §6-1)已修。缺陷本体见手册 15.3c.4。
要点: 曝气吹脱的 CO₂ 水侧不记移除、室侧不记入室, 两头都不记 = 孤儿项 ——
与 v2.0 Q_air_gain、v2.1 蛋分气流、v2.2 K-101 轴功同族, 第五次。
最能说明问题的对照: 修复前 air+开塔 与 o2+开塔 的池内 CO₂ 完全相同(罗非苗种期均 10.55),
尽管前者有 476 m³/h 空气打进池子。修法是取消特判而非补第三档: 入室份额由质量守恒导出,
o2 与 air+关塔 两档退化为原值逐位不变。方向标反的代价: 修复前该工况 CO₂ 新风需求恒为 0,
罗非 1000t 成鱼期新风 6,499 → 11,460 m³/h, 通风机原来选小 1.76 倍; 而综合成本只涨
0.09 元/kg —— 靠成本异常根本发现不了, 只能靠守恒。
补断言 X0–X3 + 锚定工况 edge_air_stripper_on, 自检 29 → 31, 负对照 6/6,
13 条基线逐位不变。
(3) 一个被负对照咬出的断言漏洞(本批最值得记的一件): X0 最初写成 X1 的守卫
if (sim.co2Removal) {…}, 于是"撤掉该导出"这一负对照竟然全绿 ——
导出没了, 整块断言直接被跳过。改为独立判定后当场转红, 并顺带咬出空场骨架漏导出
(与二批 W0 是同一课)。⇒ 纪律 14: 守卫会吞掉失败。导出面本身必须是受检对象,
不能是判定的前提 —— 凡写 if (X) { 判定 X 的性质 }, X 缺失时你得到的是绿, 不是红。
二批把告警做成结构化 configWarns 时, 交接文档记的是「报告侧消费未做」。
审计实测发现比这严重一档: 数据根本没过桥 —— configWarns /
aeration / aerIntensity / 入室 CO₂ 四组量全不在 payload 里,
下游想消费也没得消费。于是"报告照出成本、不带任何不可行标记"这句话是字面成立的。
(1) 先造审计器: index 与四个下游页之间此前没有任何契约 —— 下游多读一个字段
拿到 undefined 而不是报错, 上游删一个字段也没人知道。这是「转发断链」模式
在页面之间的翻版, 只是跨了 localStorage。audit_downstream_contract.js
把 payload 包成递归记录 Proxy 记下每页实际读了什么; 不用静态扫描, 因为下游大量
d[k] 动态取键。
(2) 过桥: 产出面 831 → 874 条, 纯搬运不加工; 断言 Y0–Y3 判逐位相等而非容差
—— 过桥中间任何差异都说明有人加工了, 而加工正是双源漂移的起点。
(3) 呈现: report 新增 15.5「设计边界与模型告警」节 + 第 5 章就地标注 +
第 16 章结论改条件式(原来无论如何都印「工艺技术上完全可行」, 现在检出 danger
级时降级并要求决策文件留痕)。取向是显式披露而非硬阻断: 不拒绝生成报告 ——
"我知道超标就是要出个初稿"是正常用法, 挡住只会让人绕过工具, 但白纸黑字。
(4) 顺带修 report.html 的 sproc.peakFactor || 1.5:
peakFactor 是阶段级字段不在 proc 下, 该行永远回落字面量 —— 读错层级 + 字面量兜底
= 静默错值, 与 recDepth_m 那六次同族。
(5) 本批最值得记的: 审计器自己被跑瘸了三次。
① jsdom 不加载外部脚本, finance/report 被跑成"只访问 9/14 条路径"的假空场,
差点得出「下游几乎不消费」的错误结论(注入本地依赖后 933/937 条);
② Y 断言首版写在逐工况循环外, 只看最后一个工况的 lastResults 而它恰好
没告警 ⇒ 负对照「截断 configWarns」全绿 —— M13/M14 陷阱第三次复发, 本批自己踩的;
③ 门禁用裸 nunjucks 渲染而 report 自注册了 wan 过滤器 ⇒ 报假红。
⇒ 纪律 17: 审计器把被审对象跑瘸了, 得到的"干净"是假的; 把自己跑瘸了, 得到的"红"
也是假的。出现"全绿"或"全红"这类整齐结果时, 先怀疑审计器, 再怀疑代码。
(6) 一个撤回的误报: stages[].subSystemCount 初报 56 次 orphan,
实测设成 3 就正常导出 3 —— 只是默认未设定的可选字段, 下游 || 1 兜得住。
审计器的判据不能区分"该有而没有"与"本来就可以没有", 其 ORPHAN 表须逐条复核,
不可直接当缺陷清单。
(1) pid 内嵌示例冻结四个版本: 点"载入内嵌示例"得到的是 irasVersion 1.1.0 /
pidSchema 1.0 的数据(G:L 3 / 塔风压 5 kPa / pumpHeatRatio 0.85, perStage 仅 8 键),
而 SUPPORTED_SCHEMA_MAJOR 只比大版本 ⇒ 照常载入、不报一句警。
根因不是"忘了更新", 是"有机制、无工具" —— 源码里本来就留了注入哨兵, 说明设计上
就该有注入工具, 但它从没被写出来, 注入成了一次性手工操作, 做完即失传。
现补 inject_pid_sample.js + 门禁 C6。⇒ 留了钩子不等于钩子会被拉。
(2) 设备清单少四台设备, 而总价对得平: equipment.html 的行是硬编码的,
冻结在写它那天的设备集合, 缺 K-501 蛋分供气风机 · DH-1001 除湿机 · AHU-1002 暖通机组 ·
KV-1003 车间通风机。⚠ 金额层面没有错 —— finance/report 用聚合值 capex.total,
这四台的钱一直在里面。错的是"清单少四台、总价却对得平": 对账对得平, 所以谁也发现不了,
只有拿这份清单去询价/招标时才会发现少买了设备。这类不一致比数值错更难查。
修法不是手工补四行, 而是 index 导出 capex.items、equipment 改为自 CAPEX 清单
反向补全 —— 以后新增任何设备都会自己出现。门禁 C7 锁位号集合包含关系。
(3) 让设备自己说清"为什么是这个规格": K-101 行补选型控制侧(O₂ 传质 / CO₂ 吹脱, 两侧风量并列)、设计 DO 及其来源、实际 OTE、池底布气强度与超限告警(含可行密度上限); KV-1003 行补控制项(CO₂ 稀释需求 / 换气次数)、车间稳态与限值, 由 CO₂ 顶大时明写 "改增氧方式或脱气塔配置后必须重选"。pid/finance 有意不消费 —— "未消费"是决定, 不是遗漏。
(4) 死负载 371 → 365 → 22 → 10, 前两个数都是量具错: 先拿运行时 CONSUMED 表反推(371),
但 Proxy 把 JSON.stringify/深拷贝这类深度枚举也记成"读取", 两个方向都虚高;
改静态文本判据后叶子名被 depth-6 截成 label…, 判据全军覆没, 365 里 308 条全是这一个 bug。
真实值 22, 消费落地后 10。现判据保守: 出现 ≠ 一定在用, 但不出现 = 一定没用。
加 C8 棘轮逼迫"过桥"与"消费"同批完成。
(5) 一条被推翻的旧结论: 批① 曾宣布"ventFan 单价下游同步已验证通过", 错的 —— 它在 finance.html 里一次都没出现。正确结论是分层的: 金额层面 ✓, 清单层面 ✗。 ⇒ 运行时"读过"不等于"在用"。
(6) 纪律 17 在两轮内被验证 7 次, 批② 又踩四次: 门禁只写 localStorage 而被审页读
sessionStorage; equipment.html 读完即 removeItem 而 jsdom 同源实例共享 storage,
门禁第二次打开就空手(⇒ 假定被审页面有副作用, 每实例独立 origin);
写门禁时掉了一层转义致正则退化, 而这次是被自己写的
catch(e){ return '[]' } 挡住的 —— 纪律 14 刚写完就又犯一次; 死负载三次报错全是量具问题。
⇒ 补充: "零脚本错误"不等于"渲染出了东西", 空页也零错。
项目方决定: 下游页版本号不再各自演进, 一律跟随主页面。四页此前是 equipment
v1.3 · pid v2.0(图签另写 v2.1)· report v1.7
(templateVersion 又是 v1.5-alpha-1)· finance 根本没有版本号
—— 四页四个口径, 现全部对齐 2.3.3, 各立 IRAS_PAGE_VERSION 作单一事实源。
(1) 判据必须分层 —— 有两类版本号不跟随。一刀切会改坏两样东西:
① 数据契约版本(pidSchema / pidSchemaMinSupported /
SUPPORTED_SCHEMA_MAJOR)表达的是"能读哪些格式", 与产品版本无关,
跟着改会直接破坏向后兼容; ② 史料标注(注释里的 // v1.7: ...)是
"这行代码是哪版加的", 改掉就抹掉了来历。三类在 docver 登记表里显式区分。
(2) 图签版本取方案自身而非页面。pid 图签的"版本"格优先取所载入方案的
irasVersion, 无数据时才回落页面版本 —— 图纸上的版本应当是"这张图是哪版
算出来的", 不是"看图的工具是哪版"。
(3) 补上此前四页都没有的一件事: 「方案版本」与「页面版本」不一致时显式提示。 二者是两回事; 旧方案在新页面上打开会走各处兼容回退, 结果看起来正常但口径是混的, 而此前没有任何信号。现 pid 走 toast, equipment 写进元信息行。
(4) 门禁: docver 登记表 10 → 19 项, 负对照 4/4。其中"主页面升版而下游七处 不动"这个发版全场景, 纳管前只咬中 8 处, 现咬中 17 处。⚠ 读取下游页时缺文件即判 工具异常退出, 不静默跳过 —— "文件不在就当它没问题"正是本轮反复咬出的那类假绿。
版本主题只有一件事: 把几个算在了错误位置的量放回它该在的节点。 起因是一份外部审计(第八轮), 七条 B 类问题, 复核后确认六条、升级一条、降级一条、新增两条。 13 条数值基线全程逐位不变, 自检 35 → 40。
沿程节点用 s = {...s, ...} 逐节点展开, 只覆写各自改变的 CO₂/TAN/TSS/NO₃/DO,
于是 pH / fNH3 / NH3_N / Ω / β 五个字段原封不动从鱼池复制到全部七个节点。
后果: 脱气塔节点 CO₂ 降 65%, 真实 pH 升 0.33、Ω 由 0.75 升到 1.52(跨过饱和线),
而界面上七个节点全标"欠饱和"; 生物滤池节点 TAN 降了 70% 而 NH₃-N 是绝对值没跟着变, 偏高 3.4 倍。
重算需要该节点的 (TA, CO₂) 两个量: TA 沿程不守恒, 生物滤池每硝化 1 mg/L TAN
消耗 ALK_PER_TANN = 7.14 mg/L CaCO₃(该系数同时提升为模块级单源常数,
此前 calcAlkalinity 里是个字面量)。鱼池节点用同一组 (TA, CO₂) 重算,
solve() 确定性 ⇒ 逐位复现原值, 故设计判据与导出面不受影响。
哨兵 IRAS_V25_CHAIN_PH。
呼吸产 CO₂ 在鱼池, 硝化产 CO₂ 在生物滤池, 而生物滤池位于鱼池下游、脱气塔上游。
链式质量平衡给出 C_塔前 = Δ_总/(η + η_换水)(恰好等于原集总式的值)与
C_鱼池 = C_塔前 − δ_n。空气曝气模式下两类汇点位置也不同, 需按
A = 1 − η_池内、B = 1 − η_下游 联立, 纯氧模式是 A = 1 的特例。
实测鱼池 CO₂ 降 15–28%(纯氧)/ 23–39%(空气曝气), pH 升 0.07–0.22, Ω 升约 30%。
CO2_OVER 告警无一翻转, 海水鱼种 Ω 仍多数 < 1。按 D1-c 双报落地:
鱼类福利判据取鱼池值, 同时导出 co2StripperInlet_mgL 作为设备选型口径 ——
原实现把两个工程量混在一个数里, 用鱼的限值去卡一个鱼接触不到的浓度。
哨兵 IRAS_V25_CHAIN_CO2。
A = 1 − η < 0 会给出负浓度。处置是下钳通过率到 0而非上钳 η ——
edge_yield_tiny 下 η_换水 达 196, 上钳会把 CO₂ 抬到 14.7 mg/L, 比不钳更离谱。模型把 pH/NH₃ 报在鱼池出水。该点对 CO₂ 与 Ω 最保守, 但对 NH₃ 不保守 —— 同一点 TAN 最高而 fNH₃ 最低, 两个偏差方向相反。缓冲区内 fNH₃ ∝ 1/[H⁺] ∝ 1/CO₂, 故:
忽略 δ_n 时退化为简洁判据 η_bio > η_co2; 计入后阈值由 63.4% 松到 54.8%。
判据在推荐输入范围内即可翻转(生物滤池推荐值与脱气塔可达效率区间重叠),
极端组合下塔后 NH₃ 达池值 4.9 倍。告警不引入新阈值, 直接取沿程实算最大值比对 ——
B1 修好之前这段做不了, 那时七个节点的 NH₃ 是同一个复制值。哨兵 IRAS_V25_NH3_PEAK。
原注释称"V_replace ≪ Q×24×η, 偏差 < 1%, 可忽略"—— 该论证只在高 η 下成立,
而 η = 5% 正是纯氧关塔时 co2FallbackEff 的默认值。实测偏差 0.13%(η=65%)/
1.63%(η=5%)。连带必须同批: 补回换水项后"产量 ≡ 塔移除 + 曝气移除"不再成立,
而 fracIndoorCO2 的第二项默认"剩下的全是塔的", 会把随排水离场的那部分
乘 degasFrac 送进车间。改为三份额分解 + 断言 X1b(三份额之和恒为 1)。
哨兵 IRAS_V25_CO2_DILUTION。
bfBlowerSpec.airPath.sink 原写死 OUTDOOR。澄清: MBBR 与鱼池同厅与否,
只决定风机电机废热去哪个房间, 不决定气去哪儿 —— 同厅照样可以加盖外排, 两个决策相互独立。
故开放为工艺选项 mbbrCovered(默认 true = 加盖外排 = 既有行为, 基线逐位不变)。
敞口时 0.50 t/d 水汽进厅 ≈ 342 kWh/d 潜热, 是池面蒸发项的 1.35 倍, 全库热泵电费最大变动 12.3%。
断言 V4 借此由"只认 K-101"推广为逐股白名单(比原判据更强)。哨兵 IRAS_V25_MBBR_COVER。
B2: biofilterTAN 是常数效率, 与 pH 无关, 而硝化速率对 pH 高度敏感 ——
模型会同时输出"pH 6.9"与"硝化效率 70%", 两者物理上不相容且偏差方向乐观。
本版只告警不折减(硬套一条来源不同的 f(pH) 曲线比明确宽带更糟)。
⚠ f(pH) 在实现上不成环: pH 只依赖 (alkTarget, co2_tank), 而 co2Daily 用的是
产生的 TAN 不是被硝化的 TAN, 故是单次前推 —— 留给下一版。
B7: 碳酸盐求解器在 pH 2–12 上二分, 真解在区间外会静默返回端点值。
加括号符号检查并随返回值带出 boundaryHit(不抛异常 —— 调用方是静默降级的,
抛出会把"可疑的数"换成"没有数")。⚠ 当前输入域够不到(alkTarget 钳在 [20,400],
CO₂ 恰为 0 时 alk=400 也只到 pH_sws 11.53), 属防御性; 故不写自检工况而用单元级断言 N1,
其中 N1a' 专查"够不到"这个前提本身 —— 前提失效时它会转红。
哨兵 IRAS_V25_PH_BRACKET。
B3: 新增 §4.5.3b 说明氮链为何不含 NO₂⁻ —— 这是稳态口径的固有边界, 不是待补功能。详见该节。
B8 把全库鱼池 CO₂ 动了 23–39%、Ω 动了约 30%, 而发布说明里 "实测海水鱼种 Ω 0.37–1.29 全部欠饱和"这句话一个字没跟着变, 而且定性结论已经反了 (对虾苗种期实测 1.63, 为过饱和)。当时 40 条自检全绿、25 项 docver 全绿 —— 因为没有任何门禁在看文案里的实算值, 是靠人眼发现的。
data-omega-min/max 机读属性, 自检直接跑四个海水鱼种
取 Ω 包线比对, N2b 连定性结论一起查(文案说没说"过饱和", 必须与实算 max>1 一致)。
两条负对照均精确转红。哨兵 IRAS_V25_DOC_ANCHOR。原 logo 是一个孤立的 R —— 读不出品牌名。改为 iR,几何定稿
R 0.98 · i 冻结(笔 53 / 点 r30)· 字距 34 · 整体右移 14,
逐档栅格化到 16/24/32/48/64/128 目视比选而定, 非拍脑袋。
为什么右移 14: 外框居中时留白 80/84 看似对称, 但墨迹重心在 x=241.9、偏左 14px —— 右下那条腿是细斜杠, 左上却是实心 i 竖笔加 R 的厚字碗。右移后重心 255.9 ≈ 画布中心 256。 i 有意比 R 主干细约 1/3: i 是前缀, 主体是 RAS, 等粗会读成两个并列字母而不是一个词。 全尺寸统一, 不设简化版 —— 16px 下 i 的点会与竖笔并成一根竖线, 这是有意接受的代价。
单一事实源为 logo-master.svg, 几何参数与取舍理由写在文件头部。派生出
favicon 的 data URI、三处可见内联 SVG(页头 / 「关于」面板 / 手册导航条)、
以及 favicon.ico(手工封装 PNG-in-ICO, 16/32/48/64/128 逐尺寸单独栅格化 ——
PIL 的 ICO 保存只会把一张图重采样到各尺寸)与两个 PNG。
check_logo_sync.js 首版只锁了 favicon 的 data URI。
若照那样收工, 把 logo 换成 iR 之后页头那两处仍是旧的孤立 R, 而任何门禁都不会响。
现改为逐份比对墨迹几何(归一化掉各拷贝不同的 gradient id / class / role / 宽高 / xmlns), 共 4 份。
⇒ 与 M15「登记表漏项」同族: 判据的强度取决于它看得见几份拷贝。
新增可见 logo 必须同步登记 INLINE 表。
负对照: 只改「关于」面板那一份的点半径 30→24, 门禁精确点名该份转红、另外三份仍绿。顺带修掉两个既有缺陷: ① apple-touch-icon 指向 favicon-180.png(带连字符),
而库内实际文件名无连字符 —— 线上必然 404, iOS 加主屏取不到图标; 已改指真实文件名,
并由门禁第③组断言「引用的图标文件必须真的在」锁死。这同时解释了 v2.4 MD5SUMS 里那个缺失文件。
② 手册导航条 logo 原为纯色方块内写 "iR" 文字, 背景 #00b4d8 与品牌渐变
#0C9ED5 → #1A5CD7 本就不一致, 已换成真标记。
⚠ 门禁证明不了的事: 三个栅格派生物无法逐字符比对, 只能校验存在与尺寸 ——
它们是否由最新母版生成, 本工具证明不了(与 MD5SUMS 头部第③条同理)。
改 logo 后必须重跑栅格派生, 这一条只能靠流程。
另: og-cover.png(社交分享卡片图)在服务器上不在库里, 仍是旧 R, 需服务器侧替换。
I-1 物质平衡断言(氧 O1–O3 / 碱度 A1–A3)。 本库此前没有一条物质平衡断言 ——
"今天闭合是因为公式恰好写对, 不是因为有东西防止它写错"。立断言的关键是
被比的两边必须来自不同的计算链: 既有的那条碱度断言把上一行的赋值原样验一遍,
永远绿, 与 bioVolume × VTR ≡ tanDaily × sBio(注释自己判过"校核没有意义")同类。
投加 = 消耗 − 回收 − 补水带入 + 【排水带出】,
最后一项全库零命中。补水按 100 mg/L 进、系统水按 150 mg/L 出 ⇒
换水实际是碱度净汇, 模型记成净源, NaHCO₃ 投加量低估 5–35%。
② tanNitrified 用鱼池浓度自算 TAN 外排, 而排水取自末节点, 两模块对同一股排水说法不一。
I-2 MBBR 曝气重构 —— 本版改动最深的一批。 原模型三处错:
① 风机按需氧选型而 SOTE 写死 8%, 但 SOTE 的标准定义是清水 20 °C、溶解氧为零(驱动力最大点),
实算冷水纯氧工况实际 SOTE 仅 0.35–0.5%;
② 沿程 BF 节点把全部需氧从水里扣掉(等于假设密闭罐无曝气), 而同一份已拿去选风机 —— 同一股氧算两遍;
③ Math.max(bfDOout, 2.0) 是 ② 的创可贴, 地板生效时凭空造氧。
新口径把因果倒过来: 风量由流化决定, DO 由质量平衡解出
DO_out = (Q·DO_in − R + M·k·β·Cs_水深)/(Q + M·k) ——
解是两端点的加权平均(风量 0 → ∞), 数学上跑不出窗口, 不需要钳制或地板。
反方向(输入目标 DO 反算风量)有 1/(Cs−DO) 渐近线, 且 DO=4 在 24 个工况里 18 个物理不可达, 故不采用。
四个新输入: bfAirFlux 10(2–20)· bfDepth 3 · bfDOMin 4 ·
bfAlpha 0.85(⚠ 无 RAS 出处, 待标定)。
DO 低于下限只告警、不自动加风, 告警给出"需把通量提到 X、届时功率 Y",
让用户做有标价的选择。风机压力改由水深导出, 替掉硬编码 50 kPa(≈5 m, 与 3 m 默认自相矛盾)。
基线变动 52/52, 最大 4.62%, 且方向分裂 —— 这正是改动的意义: 冷水鱼种电耗 +1.9~2.4%(池大、流化风量大), 暖水鱼种 −3.4~−4.6% (原来按清水 DO=0 的驱动力选型, 虚高三倍多)。
I-3 EBCT 判据分子用错(用户实测报出)。
"去除率与接触时间不自洽"告警用填料净体积当分子, 而
EBCT = Empty Bed Contact Time, 分子必须是空床即反应器容积
(V_BF = bioVolume / 填充率)。50% 填充率下 EBCT 低估整整一倍, 该告警系统性误报。
实例: 填料 791 m³ / 空床 1583 m³ / 流量 77,615 m³/h ⇒ EBCT 0.61 → 1.22 min, 告警消失。
单源取 eq.bfTankVolume, 不在告警层第三次重算填充率。
⚠ 只修分子, 阈值一个没动 —— 带界 1/2/5 min 是经验/文献口径, 用的就是标准定义。
修正后仍有 6 条告警(罗非、对虾), 那些是真的。
J-1 N3a/b/c —— 把 negA/negB 那两条抓不到的补上。 上一批的负对照里有 2 条没能转红: 把风机选型退回供氧驱动、或撤掉传氧的水深/α/温度三项。 根因是 O1/O2 锁的是各模块之间自洽, 而它们改的是全模型共同采用的物理口径 —— 两边同步退回, 自洽性依然成立。
N3 换一个抓法: 锁住"用户填的输入必须真的进入计算"。
N3a 风量 ≡ bfAirFlux × 池底面积; N3b 风压 ≡ bfDepth×9810+15000;
N3c 从导出量反解传氧系数, 须等于 0.012×水深×α×θ^(T−20)/9.09。
负对照 3/3 各自精确转红, 一一对应。
F_O2_MASS = 0.232, 差 0.216% ⇒ 断言因自己的字面量全库误报。
已改引具名常数。断言本身也必须单源。J-2 check_ledger.js 台账门禁。
本轮交接台账 §6「下次开工核对用」的门禁基线过期 3 次(anchors 计数 ×2、defsync ×1),
外加遗留表挂着已完成项。三次都是加完东西忘了同步, 而没有任何门禁在看台账 ——
check_doc_version 查的是版本号一致性不是新鲜度;
check_anchors 不查 HANDOFF 里抄的那个数。
新工具做五件事: L1 实测重数 anchors · L2 selftest 总数交叉 README 徽章 ·
L3 台账 §6 ⇄ MD5SUMS 头部 · L4 台账引用的文件必须存在 · L5 遗留表已完成项必须划掉。
一上来抓到 2 条真的: defsync 台账 171 而 MD5SUMS 头部仍是 167; 以及本工具自己的计数正则
与 check_anchors 不同导致的误报(已对齐)。
为什么此前写死 0, 以及那个 0 不算错。 v1.9 定 BF_CO2_STRIP = 0,
注释写"保守, 脱气塔选型偏安全"—— 该判断成立: 承认吹脱后塔前浓度实测由 9.53 降到 8.47,
塔确实可以选小一档。旧值是留了余量, 不是算错。
η = 风量 × kLoad × 逼近系数 / 水量 即可算出, 不引入新机理。逼近系数单开 bfCo2Approach = 0.23, 不复用脱气塔的 0.5。
塔是填料逆流, MBBR 是池内粗孔鼓泡; 本手册自记"粗孔盘仅达理论平衡约 23%、细孔盘 93%",
23% 正是为粗孔盘记的。复用塔的值等于宣称两者传质逼近程度相同, 属"拿来源不同的数字当系数"。
链式位置在 MBBR 节点 δ_n 加入之后、脱气塔之前 ⇒ 只需把稳态式的 B 换成 Bf·B, 形状不变。 实测 η_BF: 三文鱼成鱼期 7.5%(鱼池 CO₂ 7.39→7.02、塔前 9.53→8.47)、 大菱鲆成鱼期 9.9%(9.82→9.17、13.0→11.08)。基线 0/52 变动 —— 鱼池 CO₂ 不进成本链, 而脱气塔按 G:L 与水力负荷选型、不看进水浓度。
X1b 那条"假绿"同批修了: 四条移除路径此前只登记三条(塔/池内曝气/换水),
fracBF 现已进分解; 并接上 B9 —— 敞口 MBBR 时吹掉的 CO₂ 计入车间新风。
B8 归位 / B9 尾气去向 / B10 吹脱 至此在一个式子里闭合。
co2Removal 引用 eta_co2_bf, 而 let 声明放在它后面 ——
暂时性死区抛 ReferenceError, 整个水质计算失败: 基线 52/52 变动 100%、
方解石饱和度全线算不出、pH 告警全灭。
是 N2 / W5 / U2 三条断言同时报才定位到"这是异常, 不是算错" —— 单看基线只会以为数值变了。塔前−鱼池 ≡ δ_n 是"MBBR 只加不减"的前提;
X4b 的集总式回归锚只在不吹脱时成立(多了汇点, 全环稳态本就该下移);
X4d 的"塔前是全场最高点"不再成立 —— 这已是它第二次因过度特化而放宽,
⇒ 单调性类断言天生脆弱, 拓扑一变就要重审;
X1 的期望式没跟上第四支 —— 改了实现却没同步期望式, 被 edge_mbbr_open 咬出,
⇒ 断言的两边必须一起改, 否则修好的反被判红。同一个洞出现了四次: v2.0 Q_air_gain 孤儿项 · v2.1 蛋分气流未登记 ·
v2.5 MBBR 吹脱从未计入 · 蛋白分离器的 CO₂。每次都是"某台设备的某股气流, 一半算了一半没算":
风机选了型、电耗算了、气路登记了 contactsWater, 唯独 CO₂ 那份没人管。
蛋白分离器的登记结论(全网检索后): 文献确证蛋分对 CO₂ 脱除有正向贡献 (Barrut 2012; Orellana & Wecker 2013), 但未检索到可用的单程去除率 —— 能查到的是能效(0.023 kg CO₂/kWh)或标准传质速率, 几何依赖强, 不能直接折成去除率。 按 MBBR 同口径粗估约 2.6%, 属二阶项; 略去方向保守(脱气塔进水浓度偏高 ⇒ 塔选型偏大)。
co2Blower,
而气流 id 是 degasser ⇒ 全库误报。前两次是 skimmerHRT(实为
skimmerHRT_min)与断言里硬写 1.293×0.2315(实为 F_O2_MASS=0.232)。
库内早有记录的"第六次事故"(K0_W74 传 °C 而非 K)是同一类。问题: 按气相载量算出的 CO₂ 去除率(MBBR 曝气吹脱、空气曝气模式的池内曝气)
η = 风量 × kLoad × 逼近系数 / 水量 给出的是从总无机碳 DIC 里转移走的质量;
模型此前把它当作自由 CO₂ 的降幅使用 —— 等价于假设缓冲因子 = 1.0。
实际上 CO₂ 被吹走后碳酸盐平衡右移(HCO₃⁻ + H⁺ → CO₂ + H₂O), 重碳酸盐转回补上, 自由 CO₂ 的降幅小于被吹走的质量, 这两个去除率因此被系统性高估。
依据: Colt 等 2012 —— 基于总碳酸盐变化的真实脱碳量大于表观值, 海水高碱度下尤甚; 同时指出淡水条件下 CO₂ 吹脱不受酸碱平衡影响(碱度 ≤ 200 mg/L CaCO₃)。实测完全对上: 淡水缓冲因子 1.02(几乎不变), 海水 1.15–1.26。
新增两个碳酸盐函数: co2FromDIC(由总碱度与总无机碳反解自由 CO₂, 几何二分 ——
无闭式反函数, 因 DIC 是 CO₂ 与 [H⁺] 的耦合式)与 co2BufferFactor。
后者就是海洋化学 Revelle 因子的绝对量写法: 缓冲因子 = DIC/([CO₂] × Revelle)。
实测本工况 Revelle ≈ 13.9(pH 7.22 海水), 落在海洋典型 8–15 内 —— 独立口径的旁证。
实测影响: 三文鱼成鱼期 MBBR 吹脱率 7.5% → 5.94%, 鱼池 CO₂ 7.02 → 7.10; 大菱鲆 9.9% → 8.56%, 9.17 → 9.25; 罗非(淡水)几乎不变。基线逐位不变(不动成本链)。
let 暂时性死区 ⇒ 整个水质计算抛异常、
结果全为 null —— 同一会话第二次犯同一个错;
② 稳态解换成了修正后的通过率, 而沿程生物滤池节点漏改, 差 0.23% ——
断言「节点与导出面不同源」当场咬出, 该断言正是为此立的。
修完把未修正的中间量改名加 0 后缀并注明"任何节点与导出面都不得使用",
让误用在代码里显眼, 而不是靠记性。原缺陷: 钙由海水恒定比例反推 ⇒ 淡水盐度为 0 时钙恒为 0, 方解石饱和度 Ω 直接算不出。 罗非、加州鲈、鳜、鳗四个淡水鱼种全场 n/a, 占鱼种库一半 —— 而本手册自己写着淡水 RAS 的碳酸钙溶蚀(溶蚀混凝土池体、池壁起砂)是真实工程问题, 恰恰算不了。
新增两个输入: 钙口径(自动/手动)与钙硬度(默认 90 mg/L as CaCO₃)。 出处: USGS 硬度分级(0–60 软 / 61–120 中等 / 121–180 硬 / >180 极硬); 水产目标区间 SRAC 464(游离钙 40–100 即钙硬度 100–250, 其中 100 mg/L 游离钙恰与鱼血钙浓度相当); Boyd(鱼 >50、甲壳类 >80)。取 90(中等硬度地下水)—— RAS 补水多为井水。 海水档一个数没动: 海水反推给 412 mg/L Ca²⁺, 与文献典型海水约 400 直接吻合。
⚠ 残余不确定度(已写进代码与 UI 提示): K1/K2 在盐度 0 处的标度约定未经独立核对; 若它们也是活度标度, 则由其解出的碳酸根已含活度, 本修正会略微过头。 LSI 交叉验证表明总方向与量级正确, 但淡水 Ω 仍应视为 ±30% 量级的估计。 离子强度亦为估算(由碱度与钙硬度加电荷平衡推出, 未计镁与硫酸根)。
缺陷: 设计口径 CO₂ 产量式为「池内耗氧 × 1.375 + TAN × 6.286」。代码注释写着 「池内耗氧含池内异养耗氧, 故本式的 CO₂ 也自动含池内异养呼吸产的 CO₂」—— 关键词是「池内」。而生物滤池内的异养耗氧是单独一项, 参与生物滤池风机选型, 但它的 CO₂ 一分都没进产量式。 ⇒ 氧账本里有、碳账本里没有 —— 又一个「一半算了一半没算」。
实测锚定 —— 本版少数几条有实测支撑而非推导的修正。Summerfelt 等 2004 《Design implication of carbon dioxide production within biofilters contained in recirculating salmonid culture systems》(Aquacultural Engineering), Freshwater Institute 商业规模鲑鱼 RAS 实测: 滤池产 CO₂ 4.1 ± 0.2 mg/L, 同时去除 0.51 mg/L TAN 与 3.8 mg/L 溶解氧。 拆解为硝化项 3.0 mg/L(60%)与异养项 2.0 mg/L(40%)。 论文标题直指: 循环水系统中很大一部分 CO₂ 由生物滤池产生。
补项前后(生物滤池节点的 CO₂ 增量): 三文鱼成鱼期 2.14 → 3.41、 大菱鲆 3.12 → 4.68、罗非 1.67 → 3.11 mg/L —— 补项后落入实测区间 4.1 附近; 只算硝化则偏低 33–46%。系数 1.38 g CO₂/g O₂ 出处同上, 不是新的待标定项。
结果: 设计口径 CO₂ 产量上升 19.8%; 鱼池 CO₂ 7.10 → 7.71、脱气塔进水 8.69 → 10.44 (三文鱼成鱼期); 海水方解石饱和度包线 0.60–1.63 → 0.55–1.53。 数值基线 0/52 变动 —— 鱼池 CO₂ 不进成本链, 脱气塔按气水比选型不看进水浓度, 且 CO₂ 超标告警在所有基线工况下未被顶破。
缺陷: 原去除路径注释原文「溶解有机物: 蛋分(旁路) + 高级氧化(旁路) + 换水」——没有生物滤池。 异养菌吃掉的底物本该从水里消失(变二氧化碳 + 菌体污泥, 污泥经微滤机与换水排出); 模型算了异养耗氧、也补了异养产 CO₂ —— 唯独没扣底物, 产生与消耗各记各的。
落地结果(关蛋分 = 淡水实际工况): 罗非 277 → 37.2、加州鲈 → 35.1、 三文鱼 → 32.7、鳗 → 46.2 mg/L, 与文献 35.6 同量级。
⚠ 本值是等效值 = 可降解占比 × 可降解部分去除率, 两件事挤在一起。 正确做法是拆成可降解/难降解两层并与产率系数闭合, 已排入生物滤池模型重构大批次。 ⚠ 字段名沿用历史称谓; 该量以 mg O₂/L 计即溶解性 COD, 将与降解性拆分同批重命名 —— 不单独改名, 以免白付导出面变更的代价。
〔⚠ id 说明: 本节 id 是 rel_2_3_3_2_4 而非 rel_2_4 ——
后者已被占用, 指的是 2026-08-12 的内部特性批次「简易模式 · 自然通风与太阳辐射」。
本库两套编号并存: 发布版本号(v2.4)与内部特性批次号(v2.4/v2.5/v2.6, 均未独立发版)。
代码里 IRAS_V24_* 是后者, 本次发布批的新哨兵一律 IRAS_R24_*。
详见 index.html 顶部的编号说明块。〕
版本主题只有一件事: 给四个从来没有声明过口径的量建立单一事实源。
起因是一份热平衡专项审计, 它指出气液接触器的质量流量取错了状态点(用了风机加热后的密度);
复核后发现根因更深 —— airFlowM3h 从来没有声明过参考状态, 三个产气者各按一套隐含口径,
相加后再乘一个密度, 本就无解。
合并前热工侧写死 const co2Out_ppm = 450(无 UI、无默认表条目、无 FIELD_SPEC),
而 PROCESS_DEFAULTS.co2IntakeCO2_ppm = 350 是同一物理量的另一份 ——
值还不一样。后者更麻烦: 它有读取路径 getNumClamped('co2IntakeCO2_ppm', …, 300, 5000),
但 data-proc-field 命中 0 ⇒ 那句钳制从未执行过, 该字段只能改方案 JSON。
现统一为 GLOBAL_THERMAL_DEFAULTS.co2Outdoor_ppm = 450, UI 可调, 范围 300–5000,
两个消费点(车间新风稀释基准 dC = 限值 − 本底 · 脱气塔 auto 模式进风本底)
一律经 resolveCO2Outdoor()。钳制放 resolver 而非读取函数 ——
方案 JSON 经 restoreState 直写全局配置, 绕过 UI 约束(v2.3 P1 教训)。
唯一数值变化: 塔进风本底 350 → 450, 仅影响 co2StripperEffMode='auto' 的用户
(默认 manual), 塔效率降 0.74–1.33 个百分点。
⚠ 撤字段时把原注携带的 Fig 10.17 论证
(本底 1000 ppm 去除率降 10%、5000 ppm 降 70%)迁存到脱气塔 airPath 处 ——
那是「尾气必须排室外、不得回车间」的量化依据, 字段可撤, 依据不可撤。
裁决(项目方): airFlowM3h 全库一律为标准状态体积流量 (0 °C · 101.325 kPa),
因为对外向风机厂家提规格时给的就是 Nm³/h + 压力, 机器由厂家按此选型、质量由该单位本身锁定。
为什么必须显式声明: 参考态在选型式与接触器之间会抵消 ——
mass = airFlowM3h × ρ_ref = o2Peak·s / (f_O2 × OTE), 故对「由 O₂ 质量反算风量」的气流
(K-101 鱼池曝气 / BF 风机)取多少都不影响物理; 但对「体积比」气流
(脱气塔 flowM3h × G:L / 蛋分 skimmerFlow × skimGtoL)没有任何参考态可抵消。
不声明, 接触器的质量流量就无解。
| 气流 | 风量怎么来的 | 风量数字 | 接触器质量流 |
|---|---|---|---|
| K-101 鱼池曝气 · BF 风机 | 由 O₂ 质量反算 | 降 8.0% | 降 0.86%(f_O2 不抵消) |
| 脱气塔 · K-501 蛋分 | 体积比 G:L | 不变 | 由 ρ(T_air+ΔT) 改为常数 1.293 |
v2.2 的六次不动点迭代整段删除。 它当年确实让 ΔT 与质量流取了同一密度,
但统一到了「风机加热后的密度」这一侧 —— 而风机不改变质量流量。
现质量流是常数, mdot·cp·ΔT ≡ P_shaft 恒成立, 断言 A3 逐位不变。
⚠ 审计建议的断言 mdot×3600/air ≡ ρ(T_air) 不采纳 ——
它锁的是"实际进气体积"口径, 与标准态裁决相反。锁错口径比不锁更糟。
⚠ 全库 1.2 共 9 处, 只改 3 处:
Lewis 类比的车间空气密度(×2)· 除湿/暖通选型裕度(×4)· UA_vent 的建筑物理常数 0.34
(= 1.2×1006/3600)均不得改动, 由断言 A4d 反向保护。
0.23 同理: 它与鱼种耗氧系数 o2FishFactor(鲑 0.20–0.23)数值相近而物理无关。
禁止全局替换(本库有 v2.0.0 版本号全局替换污染历史叙述的先例)。
K-101 鱼池增氧鼓风的气路是 OUTDOOR → INDOOR —— 它吸室外空气、穿过池水、
从池面进车间(它没有风管)。进气侧为室外(项目方裁决: 所有风机进气都自室外)。
⇒ 这股空气就是新风, 而 v2.3.3 之前一分未计, 两笔账同时错:
Q_vent_sens 再按 T_air→T_room 收一遍 = 同一份热收两次。| 工况 | K-101 入室风量 m³/h | 占通风需求 |
|---|---|---|
| 罗非 air+开塔 · 恒温 ACH 1.0 | 476 / 1,752 / 4,228 | 44.5% / 44.5% / 36.9% |
| 罗非 air+关塔 · 恒温 ACH 1.0 | 476 / 1,752 / 4,239 | 16.6% / 12.7% / 10.8% |
| 自然通风 ACH 15 | 同上 | 4.3% |
| 任意 o2 拓扑 | 0 | 0%(13 条基线因此逐位不变) |
⚠ 与 v2.3.3 收尾批② 是同一股气流的两个方向:
当年补上了 CO₂ 的去向(fracIndoorCO2 由质量守恒导出), 但没回头问
承载 CO₂ 的空气本身该怎么记。
⚠ 不新增「超额排风热损」项: solveRoomAir 已把该气流作为独立股入解
(denomT 含 mEx·cp, 湿平衡含 mEx), 恒温档由 m_indoorExhaust 承载。
再加一项即把它的焓算第二遍 —— 那是收尾批② 的镜像(当年"两头都不记 = 孤儿项",
这次会变成"两头都记 = 双计"), 且守恒断言抓不到。
v2.3.3 之前自然通风档同样走 max(ACH×V_room, CO₂需求), 三个后果:
物理上站不住: 自然通风由风压/热压驱动, 不会因为室内 CO₂ 高就自己变大。 而且它随开口面积与天气跨近两个数量级 —— 温室夏季敞开设计取 45–60 ACH、冬季关口除湿约 3; 同一房间把固定窗玻璃拆掉可从 9 变 66。拿这样一个量去保证 CO₂ 限值(人员暴露口径)本身就不成立。
⇒ 现钳在用户填的 ACH 上, 缺口由 V_vent_shortfall_m3h 导出并告警:
| 设 ACH | CO₂ 需求 | 实际供风 | 缺口 | 车间 ppm | 室温 °C |
|---|---|---|---|---|---|
| 1 | 39,304 | 6,499 | 28,915 | 4,422 | 23.3 |
| 2 | 39,304 | 12,998 | 22,416 | 2,894 | 17.1 |
| 5 | 39,304 | 32,495 | 2,919 | 1,584 | 9.0 |
| 15 | 39,304 | 97,485 | 0 | 857 | 2.6 |
| 30 | 39,304 | 194,969 | 0 | 658 | 0.4 |
用户填的 ACH 终于有意义了。
⚠ 断言 X2(车间稳态 ≤ 限值)随之按车间档分派: 原措辞是 "新风量未按入室 CO₂ 校核(通风机选小)"——那是模型缺陷的判定, 而钳制后自然通风档超标是 用户配置的结果。但没有给该档发豁免(豁免会让 X2 在该档变成恒真), 改为替换义务: 超标时必须导出缺口(X2b), 不超标时不得报缺口(X2c)。 判据强度不降, 只是换了被判对象。
| code | 级别 | 判据 | 为什么是这个阈值 |
|---|---|---|---|
ROOM_ACH_TOO_LOW | warn | 自然通风档 且 ACH < 15 | 零新常数: 15 取自 ROOM_MODES 对该档的定义注释原文「简易棚取 15–30」, 判据与被判对象同源 |
NAT_VENT_SHORTFALL | warn | 自然通风档 且 缺口 > 0 | 给出两条出路: 把通风量调高到 X 次/h 以上, 或改用机械通风档 |
VENT_CTRL_BY_CO2 | info | 非自然通风档 且 ventBoostedByCO2 |
沿用已有标志, 零新阈值零新计算。通风由 CO₂ 控制本身不是错误, 高密度温水鱼就是会这样 |
⚠ ROOM_ACH_TOO_LOW 取 warn 而非 danger:
该组合有合法工况(冬季关闭通风口运行的简易棚), 按纪律 10 有合法工况就不判 danger,
措辞里必须写明"什么时候可以忽略我"。
⚠ VENT_CTRL_BY_CO2 的措辞里明确写着不要为了缩小通风机而开脱气塔 ——
实测在空气曝气下开塔使全场能耗上升 27–93%(罗非恒温 8.855 → 13.676 kWh/kg)。
脱气塔的作用是压低池水 CO₂(通常配液氧拓扑), 不是省车间通风。
这一条拦住的正是"只看通风机风量降了 71%、没看总账"这个推理。
⚠ 原遗留清单里的候选项「车间 CO₂ 超限告警」判据恒假, 已改写:
V_vent_fish 是"恰好把浓度压到限值的风量"的反解, 故 CO₂ 一旦成为控制项,
co2Room_ppm 恒等于限值(实测四组 air 工况全部精确 1500)。
照原样写会得到一条永远为假的判据、负对照全绿。真正要告警的不是浓度, 是为了不超标所要求的通风量。
立项时据 PROCESS_DEFAULTS.co2StripperEnabled: true 判断"air 模式默认开塔",
并据此算出默认配置使成本高 9.5–22.3%。核实后撤销: 该联动 v2.3.3 四批已在 UI 事件层实现
(切到 air 时脱气塔自动置 false, 带 auto-value 样式与提示语, 并以 dataset.userSet
尊重用户的显式选择), 且由断言 S3 静态锁住不得下沉到计算层 ——
计算层若按 aerationMode 猜用户意图, 用户显式选的"air+开塔"会被静默改掉。
⚠ 该行代码已就地留痕, 写明"勿据本行断言 air 模式默认开塔"以防第三次重开。 错因: 从一个位置的值推断了系统行为, 没查 UI 事件层。
check_defaults_sync 的三条判据 D1/D2/D3 全部对准 PROCESS_DEFAULTS 这一张表,
于是 GLOBAL_THERMAL_DEFAULTS 这一层从来没有门禁。本轮新增 G0–G4, 判据数 136 → 167。
上线即咬出两条(均 WARN 级, 结构性隐患非数值错, 与 D1 的"30+ 处同值副本"同一处置):
co2IndoorLimit_ppm: UI 的 min="800"(HTML 属性)与消费点
Math.max(…, 600)(代码字面量)分居两处, 无单一事实源;GLOBAL_THERMAL_DEFAULTS 的围护五项逐值等于 ENVELOPE_PRESETS.industrial_standard
—— 第二副本, 改预设表不会自动改默认值。U2 关掉了 U1 的结构性盲区: U1 是从"有框"一侧起判的三件套(UI 有框 ⇔ 读取路径认它 ⇔ 消费点真的用它),
对「无框 + 有读取路径 + 有消费点」这一类结构上判不到 —— 撤销的
co2IntakeCO2_ppm 正是此类。U2 要求: 凡出现在读取路径里的字段,
要么有框, 要么显式登记为 JSON-only 并写明理由。现 87 个读取字段中 4 个走登记表,
且登记表双向校验(表里有而读取路径无 ⇒ 该清理了)。
五批中只有 B(标准态口径)改基线, 52/52 项变动:
| 方向 | 工况 | Δ 元/kg |
|---|---|---|
| 制热工况下降 | 青岛冬 −0.102 · 鲈 −0.089 · 鳜 −0.084 · 海南冬 −0.063 · Bergen −0.013 | −0.10 ~ −0.01 |
| 制冷工况上升 | 海南夏 +0.358 · 三亚 +0.255 · 对虾 +0.175 · 大菱鲆 +0.113 | +0.01 ~ +0.36 |
成本变化符号随工况方向翻转 —— 与 v2.1/v2.2 守恒修复时一致。 单向偏移才说明修错方向, 这里没有。
salmon_bergen_w/hpCostPerKg 0.178 → 0.202, 绝对值仅 +0.024 元/kg,
是小分母造成的假象。立项复核时曾用它描述整批严重性 —— 引用变动幅度时必须看绝对值。本轮在六个不同位置犯了同一形态的错: 为判据或探针挑对象时用了记忆里的名字, 而不是先查。
| 位置 | 写的 | 实际 | 类型 |
|---|---|---|---|
| 断言 A4c 宿主 | simulateWaterQualityProcess | tankAerationDesign | 恒真型 |
| 断言 A4d 宿主 | contactorNetHeat | evapCoeff | 恒真型 |
| 断言作用域 | EQ | r.eq | 报错型 |
| air 判据字段 | aerationSpec.isAir | 该字段不存在 | 报错型 |
| 探针取设备 | x.equipment | x.eq | 量具型 |
| 探针取告警 | x.stageWarns | x.sim.stageWarns | 量具型 |
危险性分两档: 报错型当场红, 损失只是时间; 恒真型静默全绿, 会跟着交付, 且再也不会有人发现。 前两条若不跑负对照就会随本轮一起交付。⇒ 固化为三条纪律:
⚠ 另有一条判据本身写错的教训: G1 第一版写成"UI 范围必须等于 clamp",
于是把合规的 800/600 判成红。但 FIELD_SPEC 的既有设计就是
{min,max}(UI 引导)与 clamp[](消费点接受)分开存, 断言 H2 要的是
clamp ⊇ [min,max] —— 二者本就允许不等。差一点逼出一个错误的"修复"。
判据错比代码错更贵: 它会让人去改对的东西。
循环水养殖系统 (Recirculating Aquaculture System, RAS) 是一种将养殖用水经过物理、化学和生物处理后循环使用的集约化水产养殖技术。与传统的流水式养殖不同, RAS 仅需补充少量新水 (通常每天换水量 5-15%), 其余 85-95% 的水经处理后循环回用。
RAS 的核心思想是: 在一个封闭或半封闭的系统中, 通过一系列水处理设备, 持续去除鱼类代谢产生的废物 (氨氮、悬浮固体、溶解有机物、二氧化碳), 同时补充溶解氧, 从而维持水质在鱼类健康生长的最适范围内。
一个典型的 RAS 系统由以下核心组件构成: 养殖池 (鱼池/虾池)、固液分离设备 (转鼓微滤机 RDF)、生物过滤器 (MBBR 生物滤池)、消毒设备 (UV 紫外线)、增氧设备 (液氧系统或曝气系统)、以及脱气设备 (CO₂ 脱气塔)。
| 对比维度 | 池塘养殖 | 流水式养殖 | RAS 循环水养殖 |
|---|---|---|---|
| 用水量 | 蒸发补水 | 大量取水+排放 | 仅补充 5-15%/天 |
| 养殖密度 | 0.5-5 kg/m³ | 10-30 kg/m³ | 30-100 kg/m³ |
| 水质控制 | 靠天然净化 | 靠水量稀释 | 精确工艺控制 |
| 占地面积 | 大 | 中 | 小 (是池塘的 1/10-1/50) |
| 环境影响 | 面源污染 | 排水污染 | 零排放或极少 |
| 选址限制 | 需靠近水源 | 需靠近水源 | 几乎不受限制 |
| 初始投资 | 低 | 中 | 高 |
| 运行成本 | 低 | 低 | 中高 (电费/液氧) |
| 产品质量 | 波动大 | 较稳定 | 最稳定 |
| 生物安全 | 低 | 低 | 高 (封闭) |
| 场景 | 典型品种 | 密度 kg/m³ | 水温 °C | 特点 |
|---|---|---|---|---|
| 冷水鱼工厂 | 三文鱼、虹鳟 | 50-80 | 12-15 | 淡水苗种+海水养成, 周期长 |
| 温水鱼工厂 | 加州鲈、鳜鱼 | 40-60 | 24-28 | 国内市场需求大, FCR 低 |
| 海水鱼工厂 | 大菱鲆、石斑 | 30-70 | 16-27 | 需海水/半咸水 |
| 鳗鲡工厂 | 日本鳗、欧洲鳗 | 40-60 | 26-28 | 粉料投喂 |
| 对虾工厂 | 南美白对虾 | 2-15 | 28-31 | 密度低但投饵率高 |
一个标准的 RAS 系统, 水流按以下顺序循环:
其中方括号 [ ] 表示可选单元, 根据品种和水质需求决定是否安装。
在 iRAS 平台中, 上述流程被精确建模为主流串联 + 旁路并联的混合模型, 每个处理单元的去除效率独立计算, 沿程浓度逐步递减。
| 处理单元 | 去除目标 | 原理 | 典型效率 |
|---|---|---|---|
| 转鼓微滤机 (RDF) | TSS (悬浮固体) | 60-90 μm 筛网物理拦截 | 60-90% |
| 蛋白分离器 | DOM + 细颗粒 TSS | 气浮泡沫分离, 可配臭氧 | DOM 40-70% |
| MBBR 生物滤池 | TAN (氨氮) | 硝化菌将 NH₄ 氧化为 NO₃ | 60-90% |
| 反硝化反应器 | NO₃ (硝酸盐) | 缺氧条件下还原 NO₃ 为 N₂ | 50-80% |
| UV 紫外线 | 细菌/病毒/寄生虫 | 紫外线破坏 DNA | 99-99.9% |
| AOP 高级氧化 | Geosmin/2-MIB (土腥味) | 臭氧+UV 协同氧化 | 80-95% |
| 增氧塔/曝气 | DO (溶解氧) | 液氧溶解或空气曝气 | 110-165% 饱和度 |
| 脱气塔 | CO₂ (二氧化碳) | 逆流空气吹脱 | 60-85% (G:L=3-7) |
TAN 是鱼类蛋白质代谢的主要含氮废物, 通过鳃排出。TAN 在水中以离子态 NH₄ 和分子态 NH₃ 两种形式存在, 其比例受 pH 和温度影响。NH₃ 对鱼有强毒性, pH 越高、温度越高, NH₃ 占比越大。RAS 中 TAN 浓度通常控制在 0.5-2.0 mg/L, NH₃ 应低于 0.02-0.05 mg/L。
硝化中间产物, 对鱼毒性仅次于 NH₃。RAS 中 NO₂ 应低于 0.5 mg/L。持续偏高说明硝化菌群不完整 (Nitrobacter 不足), 通常出现在系统启动初期。
硝化最终产物, 毒性较低, 但在闭合循环中持续积累。长期高浓度 NO₃ (> 100-200 mg/L) 抑制鱼生长。反硝化或换水是控制手段。
鱼类和硝化菌都需要充足 DO。鱼池 DO 通常要求 > 6 mg/L (冷水鱼) 或 > 5 mg/L (温水鱼)。纯氧系统可将 DO 提升至 110-165% 饱和度 (超饱和), 为高密度养殖提供保障。
DO 饱和度采用 Benson & Krause (1984) 公式精确计算, 详见第 7 章。
鱼呼吸产生 CO₂, 在封闭系统中积累会导致 pH 下降、鱼应激。脱气塔通过逆流空气吹脱去除; 空气曝气本身也在吹脱(见 15.3c)。
| 水温档 × 盐度 | 阈值 mg/L | 算式 |
|---|---|---|
| 温水 · 淡水 (< 5‰) | 30 | tankCO2_max_warm |
| 温水 · 海水 (≥ 5‰) | 22.5 | 30 × marineCO2Factor 0.75 |
| 冷水 · 淡水 | 20 | tankCO2_max_cool |
| 冷水 · 海水 | 15 | 20 × marineCO2Factor 0.75 |
marineCO2Factor = 0.75 无出处 —— v2.3.3 专项核查, 结论是暂不动。
它来自 iRAS 既有值(海水 15 / 淡水 20), 代码中无出处标注,
教科书亦未按盐度区分 CO₂ 限值; 0.75 实为从"想得到 15 这个结果"倒推。
"海水鱼对 CO₂ 更敏感"这一含义未找到生理学依据。maxEff × f(G:L) × f(填料高度) × f(进风CO₂),
三条曲线里没有一条含盐度。而级联塔实测显示海水吹脱效率显著低于淡水
(归因于无机碳电离分数差异)。这与上一条是两个独立问题, 只是表面上互相抵消 ——
限值压低 0.75 让海水更容易报超标, 看似"考虑了海水难处理", 但机理错 ⇒ 处置方向也错
(用户以为该压低浓度, 实际该加大 G:L 或加高填料)。
⇒ 两个错误方向相反、量级相当, 只撤其一反而更偏, 故维持现状待同口径实测。
iRASCarbonate.K1K2_M10 零新常数算出。本版实测:
| 工况 | T °C | S ‰ | pH | α₀ |
|---|---|---|---|---|
| 同温同 pH 对照 · 淡水 | 20 | 0 | 7.3 | 14.75% |
| 同温同 pH 对照 · 海水 | 20 | 30 | 7.3 | 5.24% |
| 罗非鱼(淡) | 28 | 0 | 7.3 | 13.74% |
| 三文鱼苗种(淡) | 12 | 0 | 7.56 | 9.71% |
| 三文鱼成鱼(海) | 15 | 30 | 7.17 | 7.59% |
| 大菱鲆(海) | 16 | 28 | 7.3 | 5.76% |
| 石斑鱼(海) | 27 | 30 | 7.3 | 4.70% |
海/淡比值 0.355 —— 比现挂在限值上的 0.75 严厉一倍。数据本身是对的, 但拿它当折减系数是错的:
水在填料塔内停留数秒至数十秒。CO₂(aq) 被气泡带走后, HCO₃⁻ 会持续再平衡补充,
所以塔实际带走的量远大于进塔那一刻的 α₀ 份额。而 co2StripperEff = 0.65
是实测填料塔的表观去除率, 本身已经包含了这份再平衡
(综述明确警告: 养殖界几乎所有 CO₂ 去除数据都是碳酸平衡重建后的表观值)。
再乘一次 α₀ 比值, 等于把再平衡算了两遍 —— 海水塔效率会被打到淡水的 36%。
⇒ α₀ 是上游约束, 不是去除上限。 正确模型是「再平衡速率 vs 塔内停留时间」
的动力学竞争, 需要碳酸再平衡速率常数 —— 本模型没有, 那是真正的建模工作而非改个系数。
⚠ 之所以把这条完整留档, 是因为它看起来太有道理了: 有物理机理、有现成模块、
零新常数。不留档, 下一个人极可能去做; 做完之后结果更偏, 却因"有物理依据"而更难被质疑。
isFry 已用于 TGP 气泡病阈值(苗种 110% vs 成鱼 115%),
说明苗种确有更高敏感性; 产业侧又指出空气曝气 + 关塔工况恰恰在苗种/小鱼期最常见
—— 也就是说, 这个问题正落在最常用的工况上。co2TargetMgL 设得比成鱼期更保守
(该参数有 UI 入口, 可逐阶段设定)。若日后取得成文出处再议。详见 15.3c.4。
包括残饵、粪便、脱落的生物膜碎片。高 TSS 会堵塞鱼鳃、消耗溶氧、滋生有害菌。RAS 中 TSS 通常控制在 < 15 mg/L。
包括溶解态的蛋白质、脂肪酸、腐殖酸等。DOM 不能被 RDF 拦截, 也不能被 BF 有效去除, 在闭合循环中会积累, 导致水色发黄、起泡、产生土腥味。蛋白分离器和 AOP 是 DOM 的主要去除手段。
| 参数 | 单位 | 三文鱼 | 加州鲈/鳜 | 罗非 | 对虾 | 石斑 | 大菱鲆 | 鳗鲡 |
|---|---|---|---|---|---|---|---|---|
| TAN | mg/L | < 1.0 | < 1.5 | < 2.0 | < 1.5 | < 1.0 | < 1.0 | < 1.5 |
| NO₂-N | mg/L | < 0.3 | < 0.5 | < 1.0 | < 1.0 | < 0.5 | < 0.5 | < 0.5 |
| NO₃-N | mg/L | < 80 | < 100 | < 200 | < 100 | < 80 | < 80 | < 100 |
| DO | mg/L | > 6 | > 5 | > 4 | > 5 | > 5 | > 6 | > 5 |
| CO₂ v2.3.3 校正 | mg/L | < 20/15① | < 30 | < 30 | < 22.5 | < 22.5 | < 15 | < 30 |
| TSS | mg/L | < 10 | < 15 | < 25 | < 15 | < 15 | < 10 | < 15 |
| pH | — | 6.5-7.5 | 6.8-7.8 | 6.5-8.5 | 7.5-8.5 | 7.5-8.2 | 7.5-8.2 | 7.0-8.0 |
| 温度 | °C | 10-16 | 22-28 | 25-32 | 28-32 | 24-30 | 14-18 | 24-28 |
| 盐度 | ‰ | 0→30 | 0 | 0-15 | 5-35 | 25-35 | 25-35 | 0-5 |
① 三文鱼跨盐度: 苗种/幼鱼期淡水 → 阈值 20; 中/成鱼期海水(12→30‰)→ 阈值 15。
CO₂ 行由本版按 3.1.5 的分档公式逐鱼种实算校正 —— 旧表七列错六列, 根因是 v2.0 改分档时本表没跟。
其余各行为文献耐受范围, 与模型阈值不是同一口径: 模型的 DO 判据是
max(DOmin_satRatio × DO饱和, DOmin_abs) 双判断(见 3.1.4 的 v1.1 注),
本表 DO 行只给 DOmin_abs 那一半。
RAS 水质管理的核心是"稳定"——参数在安全范围内的波动远比绝对值更危险:
理解 RAS 中的氮循环是工艺设计的基础。所有氮素来源于饲料蛋白, 经过一系列生物化学转化, 最终以 N₂ 气体形式离开系统。
鱼类摄食后, 饲料蛋白被消化吸收, 其中:
iRAS 中 TAN 产生量的计算公式:
其中 TAN 系数 (tanCoef) 默认 0.092 (Timmons & Ebeling 2010), 逐鱼种可覆盖:
| tanCoef | 鱼种 | 说明 |
|---|---|---|
| 0.085 | 罗非鱼 Tilapia tilapia | 耐高密度; 植物蛋白配方比例高, 氮排放低于肉食性鱼 |
| 0.092 | 三文鱼 Salmon salmon | 立体水柱泳鱼, 鲑科大池深, 商业 7-12 m; 跨盐度(淡水→海水) |
| 0.092 | 大菱鲆 Turbot turbot | 底栖鱼, 浅池取单层底面积, 不超过 1.2 m |
| 0.092 | 加州鲈 Largemouth Bass bass | 淡水温水肉食鱼, 立体水柱 |
| 0.092 | 鳗鲡 Eel eel | 底栖, 中等浅 |
| 0.092 | 南美白对虾 L.vannamei shrimp | 底栖 + 水柱, 浅于其他温水鱼 |
| 0.092 | 自定义鱼种 Custom custom | 通用缺省, 供用户自定义鱼种起步 |
| 0.100 | 鳜鱼 Mandarin Fish mandarin | 同加州鲈; ⚠ 本库只有两个阶段 |
| 0.110 | 石斑鱼 Grouper grouper | 半底栖; ⚠ 成鱼期池深回落而非加深 |
〔v2.3.3 校正〕旧文写「海水肉食鱼 tanCoef 略高(大菱鲆 0.092, 石斑 0.110, 鳜 0.100)」——
漏了罗非鱼 0.085 这个唯一的下偏值, 而且"海水肉食鱼"这个归类不成立:
鳜鱼是淡水鱼, 大菱鲆是海水鱼但取的正是默认值 0.092、并不偏高。现按实际取值重列。
⚠ tanCoef 是逐阶段字段(经鱼种库 → sp 白名单 → 消费点转发),
属本库反复出问题的那条链, 由断言 M15 压着。
硝化是 RAS 中最关键的生物过程, 由两类自养菌在有氧条件下完成:
从工程角度, 硝化的三个关键化学计量关系:
在 iRAS 中, 硝化耗氧由 BF 粗孔曝气独立供应, 不占用鱼池主增氧的额度。这一O₂ 按位置分配原则避免了传统计算中常见的氧气重复计算问题。
反硝化在缺氧条件下, 由异养菌利用外加碳源 (甲醇) 将 NO₃ 还原为 N₂ 气体:
反硝化的关键化学计量:
denitriAlkRecovery = 2.8 —— 部分碱度被反硝化菌
自身合成消耗, 且旁路里总有一部分水未完全缺氧, 工程实测普遍低于理论值。
⚠ 本项目物质平衡核算曾三次错在口径上, 其中一次正是"用了理论 3.57 而非工程 2.8"。
详见 12.2。iRAS 中反硝化作为旁路设计——分流一部分循环水进入缺氧反应器, 处理后汇回主流。
反硝化可以同时降低 NO₃ 浓度和减少碱度消耗。默认旁路比 denitriFlowPct = 2%
(可调 0-20; 设 0 表示无反硝化)。
〔v2.3.3 校正〕旧文写"分流 5-15%"是 v1.9.2 之前的口径(当时默认 10%)。
改小的原因见 12.4: iRAS 的换水率刻意压在产业下沿(极致节水取向) ——
在这套换水率下反硝化不是可选项而是必需项, 但旁路比并不需要很大就能压住 NO₃。
⚠ 反过来说: 若把 denitriFlowPct 设为 0, 鲑鱼稳态 NO₃-N 可达 414 mg/L
——那是真实后果不是算错(产业"无反硝化 RAS"通常 50-150 mg/L, 因其补水强度高 3-10 倍)。
denitriAlkRecovery, 非理论 3.57
如果净消耗 > 0, 需要投加碱源维持 pH:
其中 0.595 是 NaHCO₃ 到 CaCO₃ 的换算系数 (50/84 = 0.595)。
反硝化不仅降低 NO₃, 还能回收碱度、减少 NaHCO₃ 用量。一个设计良好的反硝化支路可以减少 30-50% 的碱度投加量。
鱼池 pH 不是一个独立的自由参数 — 它由碳酸盐系统确定。总碱度 TA (由 NaHCO₃ 投加维持设定值) 与溶解 CO₂ (来自呼吸 + 硝化产) 一起决定 pH、CO₂ / HCO₃⁻ / CO₃²⁻ 物种分布、非离子化 NH₃ 占比 (剧毒) 以及方解石饱和度 Ω。iRAS v1.9 对每个阶段调用专门的碳酸模块求解此平衡。
给定 TA 和溶解 CO₂, 碳酸模块求解质子平衡方程并反推完整物种分布:
解离常数:
内部求解在 SWS (Seawater Scale) 标度上进行, 但报告的 pH 转换到 free (自由 / 浓度) 标度。两者关系:
用 free 标度报告 pH 的优势: 避免 fH 修正导致的"NBS 探头在淡水中读数偏高 0.15"问题, 直接对应淡水探头读数。
溶解氨以两种形式共存: 离子化 NH₄⁺ (无毒) + 非离子化 NH₃ (剧毒)。两者占比由 pH 和 T 决定:
典型数值 (T = 15°C 三文鱼工况):
| pH | fNH3 (%) | TAN = 1 mg/L 时 NH₃-N |
|---|---|---|
| 6.5 | 0.05% | 0.5 μg/L |
| 7.0 | 0.16% | 1.6 μg/L |
| 7.5 | 0.50% | 5.0 μg/L |
| 8.0 | 1.55% | 15.5 μg/L |
| 8.5 | 4.66% | 46.6 μg/L |
工程意义: 同样的 TAN 浓度, pH 从 7.0 升到 8.0, NH₃ 浓度增加近 10 倍。这是为什么高 pH 工况 + 高 TAN 工况是急性死亡风险, 而 v1.7 之前 iRAS 无法识别此风险。
鱼种长期暴露 NH₃-N 上限 (基于 Fivelstad / Calabrese 等):
苗种期对 NH₃ 更敏感, 通常取上述限值的 50%。
Van Slyke 缓冲强度 β 定义为: 维持给定 pH 变化所需的碱度变化量。
工程意义: β 越大, 碱度抗酸冲击越稳, 投喂后 pH 波动越小。典型值:
| 工况 | β (mg/L CaCO₃ per pH) | 评价 |
|---|---|---|
| 淡水 苗种期 (TA=150) | 350 | 中等 |
| 淡水 罗非鱼成鱼 (TA=150) | 350 | 中等 |
| 海水 三文鱼成鱼 (TA=150) | 477 | 较强 (含硼酸盐) |
| 商业 Atlantic Sapphire 风格 (TA=237) | 700+ | 强 (推荐高密度工况) |
方解石饱和度 Ω (仅海水):
Ω = 1 为饱和, Ω > 1 过饱和有 CaCO₃ 沉积风险, Ω < 1 不饱和。海水 RAS 典型工况 Ω = 0.5-1.5, 接近饱和但避免沉积堵塞设备。
iRAS 的氮链只有 TAN 与 NO₃⁻ 两个态, 不含亚硝酸盐 NO₂⁻。 这是稳态设计口径的固有边界, 不是待补的功能缺口 —— 区别很重要, 下面说清楚。
硝化是两步反应, 由两类菌分别完成:
成熟菌群的稳态下, 第二步远快于第一步, NO₂⁻ 只是一个浓度极低的中间态,
把它显式建模对稳态设计结果没有影响 —— 这正是 iRAS 把两步合并为
TAN → NO₃⁻ 的依据, 与工程上按 TAN 负荷选填料容积的做法一致。
NO₂⁻ 真正危险的时候恰恰是非稳态: 系统启动培菌期 (AOB 先于 NOB 建立)、 投喂量阶跃、换水/换料/用药造成的菌群冲击 —— 此时两步失衡, NO₂⁻ 出现尖峰, 是 RAS 最主要的急性失效模式之一。此外 NO₂⁻ 的毒性形态 HNO₂ 会自抑制 NOB, 形成正反馈, 使尖峰更陡。
已具备的条件: v1.9 之后模型有了 pH 与 [H⁺], 因此 HNO₂ 占 NO₂⁻ 的比例 (pKa ≈ 3.15) 在数学上几乎是免费的。但这只是一个分数, 不是一个模型 —— 要表达 NO₂⁻ 尖峰, 需要 AOB/NOB 两步动力学 + 时间步进 + 菌群量状态变量, 那是另一个量级的工作, 且需要标定数据。列为架构级立项, 不在补丁版范围。
iRAS v1.9 在每个阶段提供两种控制模式 (UI 工艺参数面板"pH 控制"下拉选择):
| 模式 | 输入 | 输出 | 适用场景 |
|---|---|---|---|
| 持碱度 (alk) | 碱度目标 (mg/L CaCO₃, 默认 150) | pH 由碳酸盐平衡涌现 | 淡水中小项目, 运维简单, 碱度滴定即可 |
| 持目标 pH (ph) | 目标 pH (默认 7.0) | 工具反推所需碱度设定值 (Alk req) | 大型海水 RAS, 业主想精确控制 pH (实测 7.0-7.2 防 NH₃ + 防 CaCO₃ 沉积) |
商业实测数据 (Good et al. 2018) 显示大型 post-smolt 三文鱼 RAS 实际碱度约 237 mg/L CaCO₃ (远高于淡水默认 150), 这是因为高密度海水工况需要:
用户可在工艺面板把碱度目标改成 200-250 以匹配国际商业工程实际。
iRAS 碳酸模块与国际标准实现 PyCO2SYS 1.8.3 (opt_k_carbonic=14) 进行严格验证, 覆盖盐度 0-35 与温度 12-28°C 全范围:
| 验证项 | iRAS vs PyCO2SYS 偏差 |
|---|---|
| 正向 pH (free / NBS 标度) | max|ΔpH| = 1×10⁻⁵ |
| 反向碱度求解 (solveAlk) | 0.08 μmol/kg |
| NH₃ 占比 fNH3 | 1.5×10⁻¹⁶ (机器精度) |
| 方解石饱和度 Ω | 0.006% |
这是实验室级精度, 可用于学术研究和工程设计。
本章求解的 pH / NH₃ / CO₂ 都是日均稳态 (慢性暴露) 值, 不是投喂瞬时峰值。投喂后短期瞬态 (2-4h 窗口) 由:
与 DO 不同 — DO 必须按投喂瞬时峰值选型 (避免急性窒息), 而 CO₂/pH/NH₃ 按日均稳态合规即可 (慢性暴露阈值)。
RAS 工程设计的第一步是从年产量目标反推系统规模。这决定了后续所有水处理设备的选型依据。
iRAS 采用连续错峰养殖模式建模: 养殖场分批错峰投苗, 使每天都有成鱼出塘。稳态下, 系统内每个阶段同时存在不同大小的鱼群。
适用 Little's Law (排队论基本定理):
其中 L = 系统内平均数量 (尾), λ = 到达速率 (尾/年), W = 停留时间 (年)。
关键: Little's Law 应用于"尾数"而非"质量"。一尾三文鱼从 0.1g 长到 5000g, 体重变化 5 万倍; 如果用质量, 会严重高估上游阶段的存塘量。
多阶段 RAS 的尾数从最后阶段向前递推, 每一级通过损耗率放大:
损耗率包含死亡、淘汰、逃逸, 苗种期通常最高 (10-30%), 成鱼期最低 (2-5%)。
v1.0 用 feedDesign = feedMax × peakFactor 算所有"日产污染物", 偏大约 17%。v1.1 严格分离三个时间尺度:
biomass 是稳态存塘量, feedRate 是阶段末最大日投饵率。污染物日产量 (TAN/TSS/DOM/CO₂) 都按 feedMax 算 (不含 peakFactor)。
peakFactor 物理意义: 代谢污染物小时峰值/全日均速率, 默认 1.5。快动力学设备 (鱼池增氧、BF 风机) 按 xxxPeakHourly × safety 选型。
其中 yearGrowth 是阶段年鱼肉增重, FCR 是阶段饲料系数。
确定了投饵量后, 即可计算各类污染物的日产生量。v1.1 严格区分日量、小时峰值、日均三套字段。
其中 tanCoef 默认 0.092 (Timmons & Ebeling 2010), 海水肉食鱼略高 (0.10-0.11)。
v1.1 把鱼生理耗氧按物种 + 温度自动算 (取代 v1.0 的 0.25 一刀切)。
| O₂ 来源 | 计算公式 | 供应设备 | 说明 |
|---|---|---|---|
| ① 鱼生理耗氧 | feedMax × o2FishFactor | 鱼池主增氧 | 物种特性 + Q10 自动算 |
| ② 硝化菌耗氧 | TAN_Daily × 4.57 | BF 粗孔曝气 | NH₄→NO₃ 化学计量 |
| ③ 异养菌耗氧 | feedMax × o2DOMfactor | BF 粗孔曝气 | v1.1 默认 0.10 (Boyd 2018) |
其中 1.375 = 44/32, 是 CO₂ 和 O₂ 的摩尔质量比 (RQ ≈ 1)。CO₂ 只按鱼虾生理耗氧计算, 不含硝化耗氧 (硝化反应不产生 CO₂)。
这是 iRAS 的核心计算引擎。传统 RAS 设计常用近似加法公式 C = Δ / Ση 估算稳态浓度, 但当系统包含多个串联和旁路处理单元时, 加法公式会产生显著误差。iRAS 采用精确乘法循环方程, 确保质量守恒严格成立。
考虑一个稳态循环系统: 水从鱼池流出, 经过 n 个处理单元后回到鱼池。每个处理单元有各自的"通过率" (1 − η)。
设:
稳态条件:
联立求解:
R 越小 (总去除率越高), C_out 越低, 水质越好。
全流量通过, 注意是乘法:
即总去除率 92.5%。加法 0.75 + 0.70 = 1.45 > 100% 物理上不可能。
以蛋分为例, 旁路流量比 α=20%, 单次去除 η=70%:
物理含义: 80% 的水不经处理 + 20% 的水去除了 70% → 混合后整体去除 14%。
精确循环方程的优美性质: 沿程浓度递减后, 最终回水浓度恰好等于 C_in。iRAS 在每次计算后内部验证此闭合条件 (误差 = 0)。
| 参数 | 处理路径 | R 表达式 |
|---|---|---|
| TAN | BF 硝化 + 换水 | (1−η_bio)(1−d) |
| TSS | RDF + 蛋分(旁路) + BF + 换水 | (1−η_rdf)(1−η_skim)(1−η_bioTSS)(1−d) |
| DOM | 蛋分(旁路) + AOP(旁路) + 换水 | (1−η_skim_sys)(1−η_aopDOM_sys)(1−d) |
| NO₃ | 反硝化(旁路) + 换水 | (1−η_denitri_sys)(1−d) |
| CO₂ | 脱气塔 + 池内曝气 + 换水 | (1−η_co2)(1−d), 其中 η_co2 = η_塔 + η_曝气 |
| Geosmin | AOP(旁路) + 换水 | (1−η_aop_sys)(1−d) |
dilution 在不同参数中的影响差异巨大:
| 参数 / 工艺配置 | η_total | dilution 是否主导? | dilution 敏感度 |
|---|---|---|---|
| TAN (BF 70%) | 70% | 否 | < 0.1% |
| TSS (RDF + 蛋分 + BF) | 82% | 否 | < 0.1% |
| CO₂ (脱气塔 65%) | 65% | 否 | < 0.1% |
| NO₃ (反硝化 6%) | 6% | 边缘 | ~1% |
| NO₃ (无反硝化) | 0% | 是 | 缩放为 V_tank/V_total |
| Geosmin (无 AOP) | 0% | 是 | 缩放为 V_tank/V_total |
| DOM (无蛋分) | 0% | 是 | 缩放为 V_tank/V_total |
当 η = 0 时, R = 1 − dilution, 1−R = dilution, C_out = Δ/dilution。dilution 翻倍, 浓度减半。这是 v1.1 系统体积建模 + 换水率口径修正的关键意义。
传统 RAS 设计常把整个系统简化为"鱼池水体", 忽略了:
这些工艺水体合计 V_process 通常占 V_tank 的 30-60%, 是不可忽略的。
| 工艺单元 | 计算公式 | 物理依据 |
|---|---|---|
| V_RDF v1.5+ 修正 | Q × rdfHRT_min / 60 | RDF 集水池 HRT, 默认 rdfHRT_min = 0.5 分钟 (v1.6 中位, 兼顾紧凑与缓冲); 紧凑型 0.3 (YUTANK/Hydrotech 工业实测 18s); 设计院传统 1.5-2 min (含外置缓冲池) |
| V_BF (含填料水) v1.5+ 修正 | bioVolume / fillRatio | bioVolume 是填料净体积, fillRatio 默认 0.5 (Rusten 2006 工业惯例): V_BF = 2 × bioVolume; fillRatio 0.7 (高密度): V_BF = 1.43 × bioVolume |
| V_skim | skimmerVolume | 蛋分塔水容积 (已是水量) |
| V_UV | 5 m³ (固定) | UV 流通式, 内部水量极小 |
| V_AOP | aopVolume | AOP 反应池水容积 (已是水量) |
| V_denitri | denitriVolume | 反硝化反应器 |
| V_co2 v1.5+ 修正 | degasArea × co2VolFactor | 脱气塔水容积, 默认 co2VolFactor = 0.7 (集水 0.5m + 填料湿水 0.2m, 国内中型项目); 可调 1.2 (1m 集水 + 0.2m 填料水, 鲑鱼场深塔) |
| V_aerator | Q × 0.5 / 60 | 增氧锥 HRT ≈ 30s |
| V_sump v1.3.x | clamp(Q/30, 20, 200) | 集水池, 工程惯例 |
| V_pipes | V_tank × 5% | 管路+集水井+缓冲池, 工程经验 |
× 1.3 是经验估计 (假设填料 35% + 水 65%), 但工业上 fillRatio 是设计变量, 应该用代码统一。
总系统体积:
对稳态浓度 C_out = Δ/(1−R) 影响:
因此 V_total 影响稳态浓度的程度取决于参数处理工艺:
用户填的"exchangeDaily 5%/d"在不同口径下含义不同:
| 口径 | 含义 | 实际换水量 | 使用方 |
|---|---|---|---|
| V_tank (v1.0) | 鱼池每天换 5% | V_tank × 5% | 国内传统养殖户 |
| V_total (v1.1) | 系统总水体每天换 5% | V_total × 5% (多 50%) | Timmons 教科书 / 国家海水鱼体系 / 大型工业项目 |
| 工艺单元 | 体积 (m³) |
|---|---|
| 鱼池水体 V_tank | 3,385 |
| BF 含水 | 570 |
| CO₂ 脱气 | 350 |
| RDF 集水 | 338 |
| 集水池 S-101 v1.3.x | 200 |
| 管路 + 缓冲 | 169 |
| 反硝化 | 129 |
| 增氧锥 | 85 |
| 蛋分塔 | 74 |
| AOP 反应池 | 17 |
| UV | 5 |
| V_process 合计 | 1,938 (V_tank 的 57%) |
| V_total = V_tank + V_process | 5,323 |
转鼓微滤机 (RDF) 是 RAS 中的第一道防线, 通过 60-90 μm 不锈钢筛网物理拦截水中的悬浮固体。工作原理: 养殖水从转鼓内侧流向外侧, 固体颗粒被拦截。当筛网两侧压差达到设定值时, RDF 内嵌反冲机构自动启动反冲洗 — v1.7 起反冲泵不再作为独立设备列项, 因为工程实际中所有商用 RDF (Hydrotech / Faivre 等) 整机出厂均含反冲泵, 反冲水绝大部分经污泥沉淀池回循环 (Sharrer 2010 实测 95-98% 清液回流)。
| 参数 | 典型值 | 说明 |
|---|---|---|
| 筛网孔径 | 60-90 μm | 越小去除率越高, 但易堵塞 |
| TSS 去除率 | 60-90% | iRAS 默认 75% |
| 处理流量 | 循环流量 × safetyRDF | v1.1: 默认 1.10 |
| RDF 集水池 HRT | 0.1-5 min | iRAS v1.6 默认 0.5 min (中位) |
v1.6 之前, iRAS 工艺面板有 "RDF 反冲(%) 2%" 输入, 但 4870 m³/d ÷ V_total = 101%/d 物理荒谬 (远超合理换水率 1-5%/d)。问题根源: 把"反冲管瞬时分流比"误当作"穿越系统边界的排水比"。
v1.7 全面清理这个语义混淆:
rdfBackwash / rdfBackwashPumpHead_m / rdfBackwashPumpEta 从 PROCESS_DEFAULTS / readStageProcFromInputs 删除| 故障现象 | 可能原因 | 处理措施 |
|---|---|---|
| 出水 TSS 偏高 | 筛网破损 / 孔径变大 | 更换筛网 (寿命 2-3 年) |
| 反冲频繁启动 | 进水 TSS 过高 / 筛网堵塞 | 清洗筛网; 检查投饵量 |
| 排污水清澈 | 反冲喷嘴堵塞 / 水压不足 | 清洗喷嘴; 检查 RDF 内嵌反冲机构 |
| 转鼓不转 | 电机故障 / 链条断裂 | 检查电机和传动 |
运维要点: ① 每周检查筛网完整性; ② 每月清洗反冲喷嘴; ③ 海水系统注意筛网腐蚀。
MBBR 是 RAS 最关键的处理单元。HDPE 悬浮填料 (比表面积 500-800 m²/m³) 在曝气搅动下悬浮于水中, 表面附着硝化菌群, 将有毒的 TAN 氧化为低毒的 NO₃。硝化是缓慢的自养过程, 菌群建立需 4-8 周。
iRAS 默认 VTR₂₀ = 0.5 kg TAN/(m³·d)、θnit = 1.10; 反硝化对应 VDR₂₀ = 0.8 kg NO₃-N/(m³·d)、θden = 1.08。
VTR20 / VDR20 / thetaNit / thetaDen)随
填料型号、比表面积、运行 TAN 浓度、曝气强度、菌群成熟度变化很大,
不同来源的实测值可相差数倍。iRAS 内置的是通用工程取值,
用于方案比选与量级估算;具体项目应以填料厂家实测数据或设计单位参数覆盖默认值,
不应直接作为施工图依据。
① 未做 TAN 浓度修正。
硝化速率在高 TAN 时呈零级(速率恒定),低 TAN 时转为一级(速率随浓度下降)。
文献与厂家给出的最大速率通常在氨饱和条件下测得,
而真实 RAS 池内 TAN 常低于 1 mg/L,处于一级动力学区。
本模型只做温度与盐度修正,不随 TAN 浓度衰减——
这意味着在低 TAN 工况下算出的 BF 池容积可能偏小。
保守设计应下调 VTR₂₀,或依靠 safetyBio(默认 1.15)吸收这部分不确定性。
② 未区分氨限制与氧限制。 θ 描述的是温度对生物活性的影响,但该影响的强弱取决于反应受什么限制: 氨限制时温度效应显著,氧限制时温度效应明显减弱。 本模型统一使用单一 θ,在低温 + 供氧不足的工况下会高估温度惩罚,把 BF 池算得偏大。 若生物滤池曝气不足或填料过厚,应据实调低 θ。
③ 低温外推需谨慎。 单一 Arrhenius 系数在很低的温度下会偏离实测。iRAS 内置鱼种最低 tempOpt 为 12°C(三文鱼苗种), 在常规冷水鱼范围内可用;若用于更低温物种或北欧低温工况,需另行校核。
| 温度 °C | 修正系数 θ^(T−20) | VTR kg/(m³·d) | 典型物种 |
|---|---|---|---|
| 10 | 0.386 | 0.193 | 冷水鱼苗种 |
| 12 | 0.467 | 0.234 | 三文鱼苗种 |
| 15 | 0.621 | 0.310 | 三文鱼成鱼 |
| 16 | 0.683 | 0.341 | 大菱鲆全周期 |
| 20 | 1.000 | 0.500 | 基准 |
| 25 | 1.611 | 0.805 | 加州鲈 / 鳜鱼 |
| 28 | 2.144 | 1.072 | 罗非鱼 |
| 30 | 2.594 | 1.297 | 对虾 |
盐度修正:fsal = max(1 − 0.01 × S, 0.3)。盐度 30‰ 时硝化效率降至 70%。 下限 0.3 是防零保护,不代表物理极限。
BF 启动需要 4-8 周, 启动期管理不当会导致 TAN/NO₂ 飙升, 大量死鱼。
| 故障 | 原因 | 措施 |
|---|---|---|
| TAN 突然升高 | BF 过载/停电/pH 过低 | 减少投饵; 补碱度; 检查曝气 |
| NO₂ 持续偏高 | Nitrobacter 不足/pH<6.5 | 补碱度; 降低负荷 |
| 填料沉底 | 曝气不足/气管堵塞 | 检查风机和气管 |
| 出水浑浊 | 生物膜脱落 | 正常现象 |
蛋白分离器利用泡沫分离原理去除 DOM 和细颗粒 TSS (<30μm)。空气或臭氧以微细气泡注入接触塔, 表面活性有机物吸附在气泡表面, 随泡沫溢出。
| 参数 | 空气模式 | 臭氧模式 |
|---|---|---|
| DOM 单次去除率 | 30-50% (默认 40%) | 60-80% (默认 70%) |
| TSS 单次去除率 | ~40% | ~40% |
| 额外效果 | 无 | 杀菌+脱色+氧化 |
| 成本 | 低 | 高 (臭氧发生器) |
| 海水风险 | 无 | 溴酸盐 BrO₃ (盐度>5‰需控制) |
HRT 默认 2 min (Sanders Helgoland LE-315 商业实测 1.8-2.2 min, ScienceDirect 2023)。物理: DOM 吸附在气泡表面是秒级反应, HRT 主要保证泡沫稳定形成, 不是反应时间, 长 HRT 无收益。用户可在 1.5-4 min 范围调整。
| 故障 | 原因 | 措施 |
|---|---|---|
| 不产泡沫 | DOM 太低/气量不足 | 正常 (新水); 增加气量 |
| 泡沫太湿 | 气量过大/液位过高 | 减小气量; 调低液位 |
| 臭氧泄漏 | 密封不严 | 检查; 加活性炭尾气破坏 |
| 溴酸盐过高 | 海水中臭氧过量 | 降低剂量; 监测 BrO₃ |
在缺氧条件下 (DO < 0.5 mg/L), 异养菌利用甲醇将 NO₃ 还原为 N₂ 气体。这是 RAS 中唯一能真正"去除"氮素的过程。
methanolSafetyFactor(默认 1.3)= × 3.21 kg/ddenitriAlkRecovery = 2.8。methanolSafetyFactor 1.3 得 3.21 g/g,
与文献中位一致 —— 这里的安全系数不是保守裕量, 而是把化学计量比校到实测口径。
反硝化配多大,取决于换水率能带走多少硝酸盐。这两个参数不能孤立设定, 但用户常常只调其中一个,然后对 NO₃ 结果感到意外。本节说明 iRAS 的默认取向。
换水率用 %/日表示不便于横向比较,产业通用口径是单位投饵补水量(m³/kg 饲料)。 iRAS 各鱼种默认值折算如下:
| 鱼种 | 换水率 %/d | 单位投饵补水量 m³/kg 饲料 |
|---|---|---|
| 鳗鲡 | 6 | 0.055 |
| 罗非鱼 | 6 | 0.060 |
| 大西洋鲑 | 4 | 0.092 |
| 大菱鲆 | 4 | 0.105 |
| 加州鲈 | 5 | 0.106 |
| 石斑鱼 | 6 | 0.123 |
| 鳜鱼 | 6 | 0.165 |
| 对虾 | 8 | 0.216 |
| 产业口径 | m³/kg 饲料 |
|---|---|
| 极集约 RAS | 0.1 – 0.3 |
| 常规商业 RAS | 0.3 – 1.0 |
| 半流水 | > 3 |
稳态下 NO₃ 的去除只有两条路:反硝化与换水稀释。补水强度低意味着后者几乎不起作用。
以 1000 t/yr 大西洋鲑成鱼期为例(系统水体 5178 m³、TAN 日产 82.8 kg/d):
| 反硝化旁路比例 | 反硝化流量 m³/h | 稳态 NO₃-N mg/L |
|---|---|---|
| 0%(不设反硝化) | 0 | 414 |
| 0.5% | 51 | 70.2 |
| 1% | 102 | 38.5 |
| 2%(v1.9.2 默认) | 203 | 20.2 |
| 3% | 305 | 13.7 |
| 10%(v1.9.2 前的旧默认) | 1015 | 4.2 |
denitriFlowPct 调到 0 时模型给出的 NO₃-N 414 mg/L 是真实后果,不是算错。
产业上「无反硝化 RAS」通常只有 50–150 mg/L,是因为它们的补水强度高 3–10 倍——
用换水把硝酸盐冲走,而不是用反硝化把它还原掉。v1.9.2 之前 denitriFlowPct 默认 10%,对应稳态 NO₃-N 仅 4.2 mg/L。三点问题:
改为 2% 后对应反应器 203 m³/h、NO₃-N 20.2 mg/L,落在「配了反硝化的 RAS」的合理区间。
| 故障 | 原因 | 措施 |
|---|---|---|
| NO₃ 不降 | 甲醇不足/DO 过高 | 增加甲醇; 检查缺氧 DO<0.5 |
| 出水发白臭味 | 甲醇过量 | 减少甲醇 |
| pH 过高 | 反硝化产碱过多 | 减少流量比 |
运维要点: ① 甲醇按 NO₃ 实时调节; ② 甲醇属易燃危化品, 单独储存; ③ 反硝化器启动比 BF 快 (1-2 周)。
UV-C (254 nm) 穿透微生物细胞壁, 破坏 DNA 胸腺嘧啶二聚体, 使其丧失复制能力。优点: 无化学残留, 不改变水质, 杀菌快。
| 病原体 | k (cm²/mJ) | D=40 灭活率 | 建议剂量 |
|---|---|---|---|
| 细菌 (E.coli, 弧菌) | 0.10-0.20 | 99.7% | 30-40 mJ/cm² |
| 鱼类病毒 (IPNV, IHNV) | 0.05-0.10 | 86-98% | 60-100 mJ/cm² |
| 原虫 (小瓜虫包囊) | 0.15-0.25 | 99.7-99.99% | 30-40 mJ/cm² |
| 水霉孢子 | ~0.30 | 99.999% | 20-30 mJ/cm² |
① 灯管运行时间计数器记录, 寿命 8000-12000h;
② 石英套管每月用稀盐酸擦拭除垢;
③ UV 前 TSS < 10 mg/L 才能保证效果。
臭氧 + UV 协同产生羟基自由基 (·OH), 氧化分解 geosmin 和 2-MIB (土腥味物质, ng/L 级)。单独臭氧或 UV 效果有限, 协同效率 80-95%。
HRT 按 AOP 类型默认值:
物理: 羟基自由基 ·OH 寿命 < 1 ms, 反应是光化学秒级。Schrader (2010) 实测 1 min 接触, geosmin 去除 86-92%。用户可在 1-15 min 范围内手动调整。
① AOP 出水必须经活性炭或 UV 消除残留臭氧再回主流;
② 不是所有 RAS 都需要 AOP——仅品种对土腥味敏感时才需要。
| 温度 °C | 淡水 DO_sat | 海水 30‰ | 降幅 |
|---|---|---|---|
| 10 | 11.29 | 9.32 | -17% |
| 15 | 10.08 | 8.39 | -17% |
| 16 | 9.86 | 8.21 | -17% |
| 20 | 9.09 | 7.62 | -19% |
| 25 | 8.26 | 6.97 | -18% |
| 28 | 7.83 | 6.62 | -18% |
| 30 | 7.56 | 6.41 | -18% |
| 对比项 | 纯氧 (液氧 + 锥形塔 / PPC) | 空气 (罗茨风机 + 池内微孔盘 K-101) |
|---|---|---|
| 增氧发生位置 | 主管路 — 水在锥内被打到位, 再送进鱼池 | 池内 — 气直接打进养殖池, 增氧与耗氧在同一控制体内同时发生 |
| DO 目标 | 出锥 110-165% 饱和度 (按物种, o2SatTarget) | 没有"目标饱和度"这个量 — 池水 DO 是解出来的; 设计点由 designDO_mgL 给 (见 15.3b) |
| 池水 DO 是否随循环流量变 | 是 — 流量越大, 单循环降幅越小 (15.3) | 否 — 与循环流量无关 (15.3b) |
| 适用密度 | ≥ 30 kg/m³ | < 30 kg/m³ (口径见下) |
| 氧转移效率 | 锥形塔吸收效率 80-90% (o2AbsorptionEff 默认 85) | 不是常数 — 逐工况由 OTE 公式算出, 实算多落在 2.2-4.5% (见下) |
| CO₂ 去向 | 锥内基本不吹脱 ⇒ 必须配脱气塔 | 曝气本身就在吹脱 ⇒ 上不上塔是个真问题 (见 15.3c) |
| 运行成本 | 液氧 1.2 元/kg + 主泵附加扬程 (mainline 拓扑) | 仅电费, 但风机常年满负荷运行 |
aerIntensity 反算为准。它随水深/温度/鱼种变
(石斑成鱼期实算 23.0 kg/m³, 甲壳类另分一档)。固定数字给量级, 活数据给本阶段的准数。SOTE 硬编码 0.18。
清水 SOTE 现在只作为公式里的一个入参 (sotePerMeter, 默认 6.5 %/m 水深, EPA/ASCE 典型 5-7)。
例 (石斑鱼成鱼期, 27 °C / 30‰ / 池深 1.5 m, 设计 DO 5.0 mg/L, 本模型实算):
同一台设备: 清水标称 6.5 × 1.5 = 9.75%, 工艺水实际 2.22% — 差 4.4 倍。 OTE_base 与 OTE 是两个不同的量, 不可互换: 选型 (反推风量) 用 OTE, 而水质侧解池内 DO 稳态用 OTE_base — 因为后者要把对浓度 C 的依赖显式解出来, 见 15.3b。
aerationMode = 'o2' (纯氧拓扑)。aerationMode = 'air') 不适用本式 — K-101 把气直接打进鱼池,
增氧与耗氧在同一个控制体内同时发生, 根本不存在"进池浓度", 池水 DO 由「传质速率 = 耗氧速率」
的池内质量平衡决定, 与循环流量无关。见 15.3b。
v1.1 用小时峰值评估 DO 降幅 (而不是 v1.0 的日均), 反映投喂后代谢尖峰。
本节是 aerationMode = 'air' 的完整设计口径。选型与水质稳态共用同一个单源函数
tankAerationDesign — 这是 v2.3 二批之后的架构约束: 同一台 K-101, 不允许"选型说 5.00、水质说 0.00"。
池内曝气没有"进池浓度", 稳态由传质速率与耗氧速率相等给出。传质速率对池水浓度 C 有显式依赖 (C 越高推动力越小), 所以这里必须用推动力折算之前的基础效率 OTE_base:
式中不含循环流量。循环流量只管 TAN / CO₂ / TSS 的移除, 不管 O₂。 模型实测 (石斑成鱼期, 500 t/yr, 20 kg/m³, 关塔):
| turnover | 循环流量 m³/h | air 模式池水 DO | o2 模式池水 DO (同工况) |
|---|---|---|---|
| 1 | 5,559 | 5.158 | 4.77 |
| 2 | 11,118 | 5.158 | 8.03 |
| 3 | 16,678 | 5.158 | 8.94 |
| 4 | 22,237 | 5.158 | 9.40 |
流量放大 4 倍, air 模式 DO 逐位不动, o2 模式从 4.77 一路涨到 9.40。 这是两种拓扑最直观的分野, 也是设计时最容易搞混的一点: 空气曝气场加大水泵不会提高池内 DO, 要提高 DO 只能加风量或降密度。
风量需求有两个互相独立的来源, 取大者控制, 设备卡片会标出控制侧是「O₂ 传质控制」还是「CO₂ 吹脱控制」。
K0 为 Weiss (1974) 亨利常数, ρ_w 为水密度 — 两者复用碳酸盐模块 iRASCarbonate.K0_W74 的口径,
不另设副本。co2StripApproach (默认 0.5) 是气泡出水时对亨利平衡的逼近系数: 气泡在池内停留时间有限,
离开水面时并未达到平衡载量。
designDO_mgL 与 co2TargetMgL这一对参数在 v2.3.3 四批/五批补齐, 是对称的一对。补齐它们的理由是一个共同的毛病:
DOmin — 那是安全下限, 低于它鱼会出问题;| 字段 | 留空时回落 | 生效条件 | 对风量的作用 |
|---|---|---|---|
designDO_mgL | 鱼种 max(DOmin_abs, DOmin_satRatio × C*) | air 模式 | 推动力 = (C* − 本值)/C* ; 本值越高 → 推动力越小 → 风量越大 |
co2TargetMgL | 鱼种阈值 (温水/冷水分档 × 海水折减) | air 模式 且 脱气塔关闭 | 风量 ∝ 1/(载量 × 本值) ; 本值越低 → 风量越大 |
两者都与循环流量无关 — 算式里根本没有流量这一项。它们是纯粹的曝气侧设计点。 工程上 DO 通常设计在 5-7 mg/L (高于最低允许值, 留出投饵高峰与水温波动的余地), CO₂ 通常按阈值的 60-80% 设计。
safetyAerator (默认 1.10), 所以实配之后池水实际会比设计点更好一点。
本模型可解析验证这一关系:实算池水 DO = C* − (C* − DO_design) / safetyAerator ·
实算池水 CO₂ = co2Target / safetyAerator (CO₂ 控制时)| 步骤 | 取值 | 来源 |
|---|---|---|
| 水温 / 盐度 / 池深 | 27 °C / 30‰ / 1.5 m | 鱼种库 + 阶段卡片 poolDepth_m |
| DO 饱和 C* | 6.73 mg/L | Benson-Krause (15.1) |
| 设计 DO | 5.00 mg/L | designDO_mgL 留空 ⇒ 回落 DOmin_abs |
| OTE_base / OTE | 8.63% / 2.22% | 15.2 公式 |
| 峰值耗氧 OCR | 30.55 kg O₂/h | 负荷模型 (o2FishPeakHourly) |
| O₂ 侧风量 | 30.55 × 1.10 / (1.293 × 0.232 × 0.0222) = 5,038 Nm³/h v2.4 标准状态口径 (0.300 kg O₂/Nm³)。v2.3.3 及以前按 1.2×0.23=0.276 得 5,476 m³/h —— 数字降 8.0%, 但送出的氧质量不变: 参考态在选型式与接触器之间会抵消, 见 15.6b.2 | — |
| CO₂ 日产 | 1,115 kg/d | 负荷模型 (co2Daily) |
| 设计 CO₂ | 22.5 mg/L | co2TargetMgL 留空 ⇒ 温水阈值 30 × 海水折减 0.75 |
| 亨利载量 kLoad | 1.430 g/m³ per mg/L | K0_W74 (27 °C, 30‰) |
| CO₂ 侧风量 | 1115 × 1000 × 1.10 / (1.430 × 22.5 × 0.5) / 24 = 3,176 m³/h | — |
| 选型风量 | max(5476, 3176) = 5,476 m³/h 控制侧 = O₂ | — |
| K-101 轴功率 | 177.5 kW | 1+1 备, 见 15.6 |
| 水质侧回算池水 DO / CO₂ | 5.158 / 11.86 mg/L | 15.3b.1 稳态式 + 关塔 CO₂ 平衡 |
控制侧会翻转, 而翻转点就是这套曝气系统的能力边界。同一工况把设计 CO₂ 从 22.5 往下调:
| 设计 CO₂ mg/L | O₂ 侧风量 | CO₂ 侧风量 | 控制侧 | K-101 kW | 实算池水 CO₂ |
|---|---|---|---|---|---|
| 22.5 (回落值) | 5,476 | 3,176 | O₂ | 177.5 | 11.86 |
| 15.0 | 5,476 | 4,764 | O₂ | 177.5 | 11.86 |
| 13.0 | 5,476 | 5,496 | CO₂ (翻转) | — | — |
| 10.0 | 5,476 | 7,145 | CO₂ | 231.6 | 9.09 |
| 8.0 | 5,476 | 8,932 | CO₂ | 289.4 | 7.27 |
| 6.0 | 5,476 | 11,909 | CO₂ | 385.9 | 5.45 |
注意 O₂ 控制段内 (22.5 / 15.0) 实算 CO₂ 恒为 11.86 — 因为风机已经比 CO₂ 需求大, 调低目标没有实际作用; 一旦翻到 CO₂ 控制侧, 实算值才开始跟着目标走。把设计 CO₂ 从 22.5 收到 6.0, 风机电耗从 177.5 涨到 385.9 kW —— 这个代价应当在选型阶段看见, 而不是投产后才发现。
designDO_mgL
的钳制上限设为 20 而非某个"看起来合理"的固定值 — 不拿一个固定数字假装知道边界。| 增氧方式 | 脱气塔 | 结论 |
|---|---|---|
| 纯氧 o2 | 关闭 | 不允许 — 物理上必然积累 CO₂。氧锥/PPC 只溶氧、几乎不吹脱,
CO₂ 唯一去路只剩换水稀释 (co2FallbackEff 默认 5%)。v2.3.3 二批已把此处文案从"建议启用"升格为
「物理上必然积累, o2 模式必须启用脱气塔」。 |
| 空气 air | 关闭 | 可能可行, 要看实算 — 曝气气流本身就在吹脱 CO₂, 风量又是按峰值耗氧配的, 在低密度下往往已经够用。这才是一个真正的设计选择。 |
iRAS 不采用"air + 关塔一律报警"这种配置级判据。理由是它会误报: 高换水 / 低密度下 air + 关塔确实能达标, 配置级判据会天天亮红字, 而天天见红字就没人看告警了。
实际判据是结果级的 — 拿模型算出的池内 CO₂ 稳态浓度比鱼种阈值,
超了才响 (结构化告警 CO2_OVER), 并按根因三分:
| rootCause | 含义 | 处置方向 |
|---|---|---|
stripperOff | 塔关着, 且现有曝气吹脱不够 | 开塔, 或降密度, 或调低设计 CO₂ 把风量顶上去 (代价见 15.3b.4) |
airUnderperf | 塔开着, 但曝气侧本身不达标 | 查风量与 OTE 假设 |
stripperUnderperf | 塔开着且在工作, 但塔效率/G:L 不足 | 提 G:L、加填料高度、检查布水 |
判据只复用水质链已经算出的量, 零新阈值 — 不引入来源不同的数字当门槛。
石斑鱼 500 t/yr, air 模式, 成鱼期阶段密度扫描 (阈值 22.5 mg/L):
| 阶段密度 kg/m³ | 关塔池内 CO₂ | 开塔池内 CO₂ | 是否达标 | 曝气强度告警 |
|---|---|---|---|---|
| 10 | 11.86 | 2.14 | 均达标 | — |
| 15 | 11.86 | 3.21 | 均达标 | — |
| 20 | 11.86 | 4.29 | 均达标 | — |
| 25 | 11.86 | 5.36 | 均达标 | ⚠ 池底布气 1.85 > 1.7 |
| 30 | 11.86 | 6.43 | 均达标 | ⚠ 池底布气 2.22 > 1.7 |
两条曲线的走向相反, 这一点值得记住:
成本侧的量级 (同上工况, 20 kg/m³, 工艺运行成本 / 比电耗):
| 工况 | 综合成本 元/kg | 比电耗 kWh/kg | 差额 |
|---|---|---|---|
| 石斑 20 kg/m³ · air + 关塔 | 57.94 | 22.99 | — |
| 石斑 20 kg/m³ · air + 开塔 | 67.71 | 29.87 | +9.77 元/kg (+16.9%) |
| 罗非鱼 20 kg/m³ · air + 关塔 | 58.38 | 28.45 | — |
| 罗非鱼 20 kg/m³ · air + 开塔 | 82.02 | 55.56 | +23.64 元/kg (+40.5%) |
co2TargetMgL 回落到阈值 30, 除以 1.10 安全系数即 27.27)。同时风量控制侧已经翻到 CO₂ 侧,
说明风机已经在替塔干活 — 省下的塔钱有一部分变成了更大的风机。
⇒ 判断"要不要上塔"时, 必须同时看三个量: 实算池内 CO₂ 距阈值还剩多少裕量、
控制侧是不是已经翻到 CO₂、曝气强度是否已经超限。只看成本一栏会得出错误结论。
可操作的决策顺序:
degasFrac (默认 0, 即尾气排室外),
但曝气气流依然是 sink = indoor 且接触水体 — 池内浓度只是被塔降低了、不是归零,
这股气照样把 CO₂ 带进车间。更彻底的一层是: 曝气吹脱在水侧的 η 里也没算 —
水侧不记移除、室侧不记入室, 两头都不记 = 孤儿项, 与 v2.0 的 Q_air_gain、
v2.1 的蛋分气流、v2.2 的 K-101 轴功完全同族。V_vent_fish 恒为 0,
新风全靠 ACH 兜底。原注释自称"保守方向"是方向标反 —
少算入室 CO₂ ⇒ 少算新风 ⇒ 通风机选小, 对车间空气质量是激进方向。
罗非鱼 1000 t 实测: 成鱼期新风 6,499 → 11,460 m³/h, 风机原来选小了 1.76 倍;
若不加大新风, 车间稳态可达 1,639–2,301 ppm (设计限值 1,500)。原写法是一个三分特判 (o2 → degasFrac / air+关塔 → 1 /
air+开塔 → degasFrac), 第三档错了, 而且错得"看起来已经考虑过了"。
改成守恒式之后三档全部成为特例, 不再需要 if:
| 拓扑 | fracAer | 入室份额 | 与原口径 |
|---|---|---|---|
| 纯氧 o2 | 0 | degasFrac | 逐位一致 |
| 空气 + 关塔 | 1 | 1 | 逐位一致 |
| 空气 + 开塔 | 0 < f < 1 (实测 0.27–0.48) | 按两条路径实际份额加权 | 本次修正 |
edge_air_stripper_on (air + 开塔 + 机械通风车间) —— 全库既有 air 工况原本
全部关塔, 不补工况的话 X 锚写了也走不到。自检 29 → 31, 负对照 6/6。if (sim.co2Removal) {…}), 于是"撤掉导出"这一负对照全绿 ——
导出没了, 整块断言直接被跳过。改为独立判定后当场转红, 并顺带咬出空场骨架漏导出
(与二批 W0 是同一课)。⇒ 守卫会吞掉失败: 导出面本身必须是受检对象, 不能是判定的前提。
isFry 已经用于 TGP 气泡病阈值(苗种 110% vs 成鱼 115%), 说明苗种确有更高敏感性;
产业侧又指出 air + 关塔工况恰恰在苗种/小鱼期最常见 —— 问题正落在本节最常用的工况上。co2TargetMgL 设得比成鱼期更保守
(该参数有 UI 入口, 可逐阶段设定)。若日后取得成文出处再议。
CO₂ 脱气塔在 v1.1 作为独立设备建模。v1.0 没有此模型 (仅在增氧节点扣 70% 写死, 不存在独立的塔/风机/CAPEX/OPEX)。v1.1 用户首次看到此设备会有独立的设备投资和运行成本——这是新增的成本项, 不是"修正"。
| 参数 | 当前默认 | 依据 / 工业实测 | v1.1 旧默认 |
|---|---|---|---|
G:L 气液比 co2StripperGtoL | 5 | Timmons Ch.10 p.244: CO₂ 汽提推荐 5:1-20:1 (<3:1 是常规曝气口径, 不是汽提); Karimi 2020 实测 G:L>5 无显著额外去除; Summerfelt 2003 最优 5.1 | 3 |
水力负荷 co2StripperLoadingRate | 80 m³/(m²·h) | Timmons Ch.10 p.245: 17-24 L/(m²·s) = 61-86 m³/(m²·h); Summerfelt 2003 / Moran 2003 实测 87-187, 取保守端 | 40 |
填料层高度 co2PackingHeight_m | 1.5 m | Timmons Ch.10 p.245: 设计高度一般限于 1.0-1.5 m, 超过 1.5-2.0 m 后收益递减 | 1.0 |
风压 co2BlowerPressure_kPa | 2.5 kPa (可调) | Delta Cooling Towers 实测 0.87-1.12 kPa; 浅塔 0.5-1.5 / 中塔 1.5-3 / 深塔 3-5 | 2.5 |
风机效率 co2BlowerEfficiency | 0.60 | 罗茨风机 0.5-0.7, 离心风机 0.65-0.8 | 0.60 |
单次脱气率 co2StripperEff | 65% | G:L=3 浅塔实际值; 填料 ≥3 m + G:L ≥5 可达 80% | 65% |
tools/check_defaults_sync.js 锁定 —— 判据直接对准 PROCESS_DEFAULTS 这张表,
文档写的默认值与实际默认值不符即转红 (负对照 4/4)。
整机功率对标 Summerfelt (2009) 文献区间 5-15 kW per 1000 m³/h 循环水量: 本模型 1000 t 三文鱼成鱼期 Q=10,155 m³/h 时脱气塔风机 58.8 kW, 折合 5.79 kW/1000 m³/h, 落在区间下沿。 ⚠ 该比值与产量规模无关, 可直接横比; 而"全场合计多少 kW"随鱼种与产量组合变, 不宜作为对标口径。
举例 (三文鱼成鱼期 Q=10,155 m³/h, 当前默认 G:L=5 / 风压 2.5 kPa / 风机效率 0.60):
⚠ 本例此前写的是 10155 × 3 … = 35 kW —— 那是 v1.1 的 G:L=3 口径, v2.0 改默认值后未同步 (见 15.4.1 警示框)。
按比功率对标: 58.8 / 10.155 = 5.79 kW per 1000 m³/h, 落在 Summerfelt (2009) 的 5-15 区间下沿。
单位推导: CO₂_Daily [kg/d] × 10⁶ [mg/kg] = mg/d ÷ (Q × 24) [m³/d ÷ 1000=L/d? 注意]
等价等式: CO₂_tank (mg/L) = CO₂_Daily(kg/d) × 1000 (g/kg) × 1000 (mg/g) / [流量(m³/h) × 24 (h/d) × 1000 (L/m³) × η_co2]
化简: CO₂_tank (mg/L) = CO₂_Daily(kg/d) × 10⁶ / [流量(m³/h) × 24,000 × η_co2]
即代码中的: co2Tank = co2Daily × 10^6 / (flowM3h × 24 × 1000 × eta_co2)
海水阈值 15 mg/L, 淡水阈值 20 mg/L。脱气塔关闭时 η_co2 改为 co2FallbackEff (默认 5%)。
× 10 是单位换算错误 (kg/d → mg/L 必须 × 10⁶, 即 1 kg = 10⁶ mg)。
代码一直是对的, 仅手册书写错误。
v1.6 之前 iRAS 在 UI 上已经有"主流路径 / 旁路(节能)"两个选项, 但 calcPumpPowerBreakdown / aerationSpec / OPEX
完全没区分 — 是"UI 假承诺"。v1.7 通过全网调研 (Linde SOLVOX cone / Pentair AES Speece / PR Aqua PPC / Global Seafood Advocate 2019)
确认: 国际主流大型 RAS 项目 "more often plumbed in side stream configuration"。
| 对比项 | mainline (主流串联) | bypass (旁路高压) |
|---|---|---|
| 主流路径 | 全部循环水过氧锥 | 主流不过锥, 旁路 5-30% 流量过高压锥后回流 |
| 主泵附加压头 | + 2-15 m (锥子压损) | 0 (主泵不过锥) |
| 氧锥规格流量 | = 全循环流量 Q | = Q × bypassRatio (小流量) |
| 氧锥操作压力 | 低压 10-21 psi (LHO) | 高压 1-3 bar (SOLVOX / PPC) |
| 典型 DO 出锥 | 130-170% 饱和度 | 200-400% 饱和度 |
| 额外设备 | 无 | 旁路泵 P-602 + 混合点 M-601 |
| 代表设备 | Pentair AES LHO | Linde SOLVOX cone / PR Aqua PPC |
| 适用规模 | 中小型项目 (Q < 5000 m³/h) | 大型项目 (Q > 5000 m³/h) |
| 字段 | 默认 | 钳制范围 | 工程对照 |
|---|---|---|---|
o2ConeTopology | mainline | mainline / bypass | — |
o2ConeHeadLoss_m | 3 m | [0, 15] | LHO 2-3 / Speece 5-10 / SOLVOX 110 至 15 |
o2BypassRatio (%) | 10 | [5, 30] | 国际主流 8-15% |
o2BypassPumpHead_m | 20 m | [5, 40] | 玻璃钢 20 / SOLVOX 25-30 |
o2BypassPumpEta (%) | 60 | [30, 85] | 高压泵典型 |
P-602 加入设备清单 / CAPEX / OPEX / 热平衡, 1+1 备用模块化 (与主泵 P-101 同口径)。
📌 v2.2:K-101 全量接入热平衡与气路登记。v1.7 加入本机时只做了选型、计费与 CAPEX,热去向与气路登记都缺 —— 它鼓的空气直接打进鱼池水体,比脱气塔更无疑问地接触水,却从未进入 collectAirStreams,其电功率也不在热平衡的任何一侧。这与 v2.0 的 Q_air_gain 孤儿项、v2.1 的蛋分气流、第五轮审计的风机轴功完全同族,是第四次。逃逸机制值得记一笔:32.3 kW 藏在一个混合了数值与格式化字符串的展示对象(aerationSpec)里,所有「数值字段 + 命名规则」的扫描器集体失明。
v2.2 补齐四件套:airFlowM3h 归一单位 + airPath(OUTDOOR→OUTDOOR,contactsWater,与气路拓扑 A5 一致)+ POWER_REGISTRY 登记(tankAirBlowerKw)+ 并入轴功逐台加权。新增断言 E2b 递归扫 *Spec子对象封住该逃逸类。
v1.7 之前 air 模式 (空气曝气) 只有 K-302 (BF 曝气风机), 缺鱼池主增氧风机。 温水鱼种 (罗非鱼 / 鳗鱼 / 对虾) 的大规模 RAS 设计无法用工具自动生成 — 而这是 80%+ 中国 RAS 项目的实际场景。
v1.7 加入 K-101 鱼池增氧鼓风机:
| 参数 | 当前实值 | 说明 | v1.7 旧文 |
|---|---|---|---|
| 设备类型 | 罗茨风机 + 微孔盘管曝气 | 清水 SOTE 由 sotePerMeter 给 (6.5 %/m 水深), 不直接充当吸收效率 | SOTE 18-22% |
| 风量基准 | max(O₂ 侧, CO₂ 侧) | 由 tankAerationDesign 单源给出, 见 15.3b.2 | o2FishPeakHourly × safety / SOTE |
风压 tankAirBlowerPressure_kPa | 9.81 × 池深 + 盘阻管阻 (1.5 m 池 → 24.7 kPa) | v2.3.3 改为与池深关联。留空自动算, 填了则显式覆盖(哨兵模式)。下钳 5 kPa | 15-25 kPa |
盘阻+管阻 tankAirDiffuserLoss_kPa | 10 kPa(盘 5 + 管 5) | ⚠ 待产业校准: 随盘型跨一个数量级 —— 低阻膜盘 2.2-4.8 · 常规微孔/刚玉盘 3.5-5 · 纳米管等高阻型厂家明示总压需 ≥50。管路 ≤50 m 取 5, 过长或弯头多取 8-10 | (无此参数) |
风机效率 tankAirBlowerEfficiency | 60% | v1.1.2 由 0.55 提到 0.60 (现代离心/罗茨中位)。下钳 30% | 60% |
| 备用 | 1+1 备 | 鱼池主增氧, 故障即鱼窒息, 必须双机轮换 | 同 |
| P&ID tag | K-101 | 与 K-302 (BF 风机) 区分 | 同 |
风压 = 9.81 × 池深 + 盘阻管阻 计算, 并取消原 30 kPa 下钳
—— 它正是压住浅池真值的那道坎(1.0 m 池真值约 19.8 kPa 会被抬到 30)。
断言 B1/B2 锁死(B2 是可达性锚: 13 条基线全 o2, 无锚则 B1 走不到, 负对照实测把风压改回 70 仍全绿)。co2BlowerPressure_kPa 2.5 kPa)、车间通风机 (ventFanPressure_Pa 250 Pa)
差两到三个数量级。代码中已就此立注:「全压绝不可复用 tankAirBlowerPressure_kPa」。其中 OTE 是逐工况算出的实际氧转移效率 (清水 SOTE × 水深 × α·β × θ 温度 × 推动力), 不是清水标称值 —— 完整推导、守卫与实算例题见 15.2 与 15.3b。
K-101 加入 modulePerSpec (与 K-302 同口径 1+1 备), P&ID / 设备清单 / 报告章节 / 财务测算 全链路同步。
📌 v2.4: 全库风量声明为标准状态。
此前 airFlowM3h 从来没有声明过参考状态, 而三个产气者各按一套隐含口径:
鱼池曝气按 ρ=1.2(20 °C)、关塔 CO₂ 侧按水温的摩尔体积、脱气塔与蛋分是纯体积比、没有状态。
气液接触器把这几股相加再乘一个密度 —— 这个问题本就无解。
为什么取标准状态: 对外向风机厂家提规格时给的就是 Nm³/h + 压力, 机器由厂家按此选型、质量由该单位本身锁定。故模型的风量、压力、功率全部 Normal 口径, 不做任何进气温度修正 —— 这不是"接受一个偏差", 是对外提规格的正确口径。
| 量 | 公式 | v2.4 变化 |
|---|---|---|
| K-101 曝气风量 | o2Peak × safety ÷ (RHO_STD_AIR × F_O2_MASS × OTE) | 数字降 8.0%(0.276 → 0.300) |
| BF 曝气风量 | 同上(用粗气泡 SOTE) | 数字降 8.0% |
| 脱气塔 / 蛋分风量 | 水流量 × 气水比 | 不变(体积比, 无参考态) |
| 接触器质量流 | airFlowM3h × RHO_STD_AIR ÷ 3600 | 常数, 与温度无关 |
对「由 O₂ 质量反算风量」的气流(K-101 / BF), 参考态在选型式与接触器之间会自动抵消,
取多少都不影响物理, 只影响报出来的那个数字。
但对「体积比」气流(脱气塔 flowM3h × G:L、蛋分 skimmerFlow × skimGtoL),
没有任何参考态可抵消 —— 不声明, 接触器的质量流量就无解。
v2.2 的六次不动点迭代随之整段删除。 它当年确实让温升与质量流取了同一密度
(修的是第六轮审计 P1: 两侧取不同密度、丢失部分轴功), 但统一到了物理上错误的那一侧。
现在质量流是常数, mdot·cp·ΔT ≡ P_shaft 恒成立, 无需迭代, 守恒断言 A3 逐位不变。
全库 1.2 共 9 处, 只有 3 处是本量; 0.23 同理。禁止全局替换
(本库有 v2.0.0 版本号全局替换污染历史叙述的先例)。
| 字面量 | 出现处 | 是什么 | 处置 |
|---|---|---|---|
| 1.2 | 曝气 / BF 选型式 · 池内 DO 稳态 | 工艺风量参考态 | ✅ 改 |
| β = h_c/(1.2×1006×0.91) | Lewis 类比的车间空气密度(20–28 °C) | ❌ 不改 | |
| 除湿机 / 暖通 ×1.2 | 选型安全裕度, 不是密度 | ❌ 不改 | |
| UA_vent 的 0.34 | = 1.2×1006/3600, 建筑物理常数 | ❌ 不改 | |
| 0.23 | 三处选型式 | 空气含氧质量分数 | ✅ 改 0.232 |
| o2FishFactor(鲑 0.20–0.23) | 鱼的耗氧系数, 数值相近而物理无关 | ❌ 绝不能碰 |
⚠ 上表由断言 A4b(产气侧禁字面量)与 A4d(反向保护: 不该改的必须仍在原位)锁住。
A4a 则直接锁质量流的取值来源: mdot × 3600 / airFlowM3h ≡ RHO_STD_AIR ——
这是个常数比值判据, 不依赖工况可达性。
⚠ 热平衡审计建议的判据 mdot×3600/air ≡ ρ(T_air) 不采纳:
它锁的是"实际进气体积"口径, 与标准态裁决相反。锁错口径比不锁更糟, 它会淹没真红。
液氧在 iRAS 里有两个不能混用的口径。这是 v1.9.1 修正的核心, 也是 RAS 工程里一个普遍被忽略的概念错误。
| 口径 | 字段 | 回答的问题 | 用途 | 含容量系数? |
|---|---|---|---|---|
| 设备容量 | o2PeakSupplyKgHo2Demand | 设备要多大 | 氧锥选型 / 储罐峰值供氧能力 / CAPEX | ✅ peakFactor × sAerator |
| 消耗量 | o2ConsumptionDailyo2ConsumptionDailyAvg | 一年买多少氧 | OPEX / 液氧采购 / 基准值 / 储罐容积 | ❌ 仅吸收效率 |
peakFactor (默认 1.5) 是"投喂后 30 min 内的小时耗氧峰值 ÷ 全日平均速率"。
它描述的是时间分布, 不是总量 — 一天之内峰谷会互相抵消, 日总耗氧并不因为存在峰值而变多。
把它乘进日消耗量, 等于认为鱼一天 24 小时都在以峰值速率呼吸。sAerator (默认 1.10) 是设备老化裕度。设备按 110% 能力配置, 是为了 8 年后填料污染、
密封件老化时仍能满足需求; 但今天的鱼不会因为设备有余量就多吃 10% 的氧。两者叠加使液氧采购量高估 1.5 × 1.10 = 1.65 倍。液氧是按 kg 计费的消耗品, 在 OPEX 中占 5–12%, 这个误差足以让整个项目的运行成本测算失真。
| 指标 | v1.9 (错误口径) | v1.9.1 (修正后) | 文献 / 说明 |
|---|---|---|---|
| 液氧强度 (kg O₂ / kg 饲料) | 0.44 | 0.266 | 文献 0.25–0.30, 修正后落入区间 |
| 年液氧消耗 | 527 t | 319 t | −208 t/yr |
| 储罐规格 (7 日储备) | 10.1 t | 6.1 t | 按消耗量而非峰值能力定容积 |
| 基准值验收区间 | 0.25–0.95 | 0.20–0.45 | 旧区间被迫放宽以容纳错误值 |
注意旧的验收区间上限 0.95 — 它是被错误口径倒逼出来的: 因为计算值 0.44 落在文献区间 0.25–0.30 之外, 只能把区间上限一路放宽到 0.95 才不报警。这是"用宽容的验收区间掩盖模型错误"的典型症状。 修正后区间收窄到 0.20–0.45, 重新具备了发现异常的能力。
o2PeakSupplyKgH 选, 罐容按
o2ConsumptionDailyAvg × 储备天数 选。合并成单一口径必然会在其中一侧过度设计。
| 故障 | 原因 | 措施 |
|---|---|---|
| DO 偏低 | 液氧用完 / 增氧塔堵塞 | 检查液氧; 清洗增氧塔 |
| CO₂ 偏高 | 脱气塔风量不足 | 增加风量; 清洗填料 |
| 液氧蒸发过快 | 储罐真空层失效 | 联系厂商检修 |
| 微孔盘气泡变大 | 盘面堵塞 / 老化 | 酸洗或更换 |
| bypass 模式 DO 不均匀 | M-601 混合点设计不当 / 旁路比过高 | 检查混合管段长度; 旁路比降到 10-15% |
| K-101 跳闸 (air 模式) | 1+1 备用未启动 / 双机故障 | 立即手动切换备用; 鱼池含氧 15-30 min 内告急 |
下列六条是 v2.4 评审后有意留下的决定, 不是缺陷。之所以单列成节, 是因为 每一条都曾被当作"待修项"提出过至少一次 —— 不写明来由, 下一轮还会被重新提出。
| 条目 | 裁决 | 理由 |
|---|---|---|
| air 模式池面蒸发系数未随曝气扰动修正 | 不修 | 实测接触器路径 44,173 kWh/d 是池面路径 807 kWh/d 的 55 倍 —— 气泡自身携带的水汽已由接触器完整计入, 未修正的只是"气泡之外被扰动加强的表面蒸发", 量级在数百 kWh/d 以内。air 模式下池面蒸发已非主导路径, β 的精度不再重要。 |
| 风机功率不做进气温度修正 | 不做 | 对外向厂家提规格时给的就是标准状态 Nm³/h + 压力, 机器由厂家按此选型、 质量由该单位本身锁定, 报回的功率即 P = Q_normal × Δp / η。 ⚠ 曾被误判为"热气候低估 9.2%"—— 那是混淆了【运行级电耗】与【选型级机器大小】: 定容积式风机 P ≈ 排量 × Δp, 与进气密度无关, 热天不是更费电而是送出的质量变少。 |
| ACH 拆成"渗透风 + 通风"两个维度 | 不做 | 真拆两维需要围护气密性参数 (n50 鼓风门实测值换算), 本库四档围护预设里没有任何 气密性数据, 现填即是编 —— 与"苗种期 CO₂ 无出处新增一档"同一形态。 现有 ACH 字段语义已是新风换气次数(标签与 title 均如此), 渗透风未建模。 |
| air 模式默认关塔改到计算层 | 不做 | 该联动 v2.3.3 四批已在 UI 事件层实现 (切到 air 时脱气塔自动置 false, 带 auto-value 样式与提示语, 并以 dataset.userSet 尊重用户显式选择), 由断言 S3 静态锁住 不得下沉到计算层 —— 计算层若按 aerationMode 猜用户意图, 用户显式选的 "air+开塔" 会被静默改掉。⚠ v2.4 立项时曾据 PROCESS_DEFAULTS 的字面量误判为"默认开塔", 核实后撤销。 |
| 脱气塔进风 CO₂ 本底单独分层 | 不做 | 脱气塔气路硬编码 OUTDOOR → OUTDOOR 且无 UI 可改 ⇒「塔吸车间空气」这个场景在模型里 不可达。保留一个服务于不可达场景的旋钮, 与 v2.5 撤销 roomMode='open' 同一理由。 已统一为 co2Outdoor_ppm 单一事实源。 |
| 自然通风给驱动力建模 | 不做 | 需要开口面积、风速、热压等本库没有的参数。v2.4 改为钳在用户填的 ACH 上: 不足时报 CO₂ 超标并给出缺口, 由用户去加大开口或改机械通风。 ⚠ 自然通风 ACH 随开口与天气跨近两个数量级 (温室夏季敞开设计 45–60, 冬季关口除湿约 3; 同一房间拆掉固定窗玻璃可从 9 变 66), 以它保证 CO₂ 限值 (人员暴露口径) 本身风险较高。 |
〔v2.2 注: 热平衡架构未变。v2.2 对本章相关的两处数值级修正 —— 风机温升 ΔT 与 mdot 不动点自洽、轴功 η 逐台加权 —— 见「v2.1 → v2.2」版本演进章 B/C 节。〕
本节是当前有效的模型描述。 第 29 章与本章 16.5 保留的是 v1.2–v1.9.3 的双节点求解器推导, 已于 v2.0.0 删除,仅作历史参考。
v2.0 起车间温度不再由空气节点方程求解,而是由暖通维持:
T_room = T_水温 ← 输入,非解 RH_room = roomRH_set ← 默认 65%,可调 Q_pool_loss ≡ 0 ← 温差为零,池面显热消失
改动理由见第 29 章章首:旧模型对热带鱼种算出车间 9–14 °C / RH 99%,而实测与规范一致指向 「空气 ≥ 水温」,方向反了 15–20 K。
Q_net_to_water = Q_metab + Q_equip + Q_makeup_signed
− Q_pool_loss (≡ 0)
− Q_evap_latent
+ Q_dehum_to_water
− Q_contactor_net ← v2.0 新增
气液接触器(脱气塔 + MBBR 曝气 + 蛋分供气)按出口水温饱和计算焓差
Δh = h(T_水, 饱和) − h(T_进气, RH_进气),Δh 可为负
(湿热空气遇冷水结露放热给水)。
Q_hvac_sens = Q_envelope + Q_vent_sens − Q_room_internal
T_room 受控后,暖通承担的是围护失热 + 通风失热 − 室内产热。
Q_room_internal 有三个组成,每一项都曾是孤儿:
| 组成 | 来源 | 补上的版本 |
|---|---|---|
Q_air_gain_kW × 24 | 电机 / 灯管废热 | v2.1(v2.0 删空气节点时成孤儿,带走 HVAC 显热负荷的 41.8%) |
Q_dehum_to_room | 除湿冷凝热(仅 dehumHeatDest==='indoor') |
v2.1(注释仍写「已在 T_room 迭代中计入」,而该迭代已删除) |
Q_blower_motor_kWh_d | 四台风机的电机损失(v2.2 起含 K-101) | v2.1(第五轮审计 P0)· v2.2 逐台加权 |
四台风机(脱气塔 + BF 曝气 + 蛋分供气 + 鱼池增氧 K-101;前三台在纯氧模式下 运行,K-101 为空气曝气模式专属。三文鱼 1000 t 成鱼期前三台合计约 107.7 kW) 的电功率逐台按各自效率拆两份:
轴功 P_shaft = Σ (P_elec,i × η_i) → 抬高接触器进气温度 电机损失 P_elec,total − P_shaft → Q_room_internal η_i 与各风机自身的功率公式同源: 脱气塔 proc.co2BlowerEfficiency (默认 60%) BF 曝气 0.60 (bfBlowerPower 公式内常数) 蛋分供气 proc.skimmerBlowerEta (默认 55%) K-101 proc.tankAirBlowerEfficiency (默认 60%)
📌 v2.2 修订一:由 ΣkW × 0.57 改为逐台加权。旧口径与各风机自身的效率参数脱节 ——
用户把 co2BlowerEfficiency 从 30 调到 90,电耗 174→95 kW,而模型轴功恒按 0.57 折,
方向反直觉(效率越高,模型认为进气流的热越少)。物理上
kWi × ηi = Q·Δp 即气侧有用功,与 η 无关;η 只该影响电机损失分成。
逐台加权自动恢复该性质。
进气温升 ΔT 与质量流量 mdot 互为因变量(温升改变密度、密度改变 mdot), 须解联立:
mdot · c_p · ΔT = P_shaft mdot = V̇_air · RHO_STD_AIR / 3600 ← v2.4: 常数, 与温度无关 ΔT = P_shaft / (mdot · c_p) ← 直接求, 无需迭代
mdot·c_p·ΔT ≡ P_shaft 恒成立, 断言 A3 逐位不变。
mdot = V̇_air · ρ(T_air + ΔT)/3600 的六次不动点迭代
(压缩因子 ≈ ΔT/T_abs ≈ 0.1, 6 次后误差 < 1e-4 K)。它当年修的是第六轮审计 P1
——温升按冷密度算、焓流按热密度算, 丢失部分轴功。迭代确实让两侧统一了,
但统一到了「风机加热后的密度」这一侧, 而风机不改变质量流量;
关塔工况风量骤小、温升可达 30 K, 该取法使质量流偏低 10.4%。
根因不是"用了哪个密度", 是风量当时没有声明参考状态。
⚠ v2.2 修订二:ΔT 与 mdot 必须取同一密度。旧实现 ΔT 按冷密度 mdot₀ 算、
焓流按热密度 mdot 算,注入气流的热 = P_shaft × (mdot/mdot₀),
丢失 (1 − mdot/mdot₀) 份轴功 —— 默认工况 1.2%(藏在断言 A3 的 0.15 K 容差内),
脱气塔关闭时风量骤小、ΔT ≈ 30 K,丢 10.1%。由边界工况 edge_no_degasser
触发 A3 显形。修复后 mdot · c_p · ΔT ≡ P_shaft 恒等成立。
⚠ 加热是等湿过程:绝对含湿量 W_in 不随温升变化,变的是相对湿度。
⚠ v2.1 之前这部分电功率没有任何去处 —— 既不在泵/UV 的电-热分配里,也不在其它热流里。 后果是接触器用原始室外温度算焓差,从水里多取约 18% 的热: 模型付电费让风机运转,却让这些电产生的热凭空消失,再付一次热泵的钱把水加热回来。
换水股 补水 V_exch (同盐度) ←→ 排污 V_exch (同盐度) 蒸发股 补淡水 E ←→ 蒸发失纯水 E V_makeup = V_exch + E
拆股后盐平衡恒等成立,无需盐度状态变量。净结露时(湿热气候养冷水鱼)没有
「补负淡水」,纯水先抵扣蒸发股,余量转排水并按
S × V_exch / (V_exch + V_surplus) 推出稳态盐度漂移。
| 项 | 字段 | 说明 |
|---|---|---|
| 水侧热泵 | thermalCostDaily | 调水温 |
| 除湿机 | dehumCostDaily | 潜热,独立机组,按设计冬/夏峰值选型 |
| 车间暖通 | hvacCostDaily | 显热,v2.0 新增;设备为 AHU-1002 |
⚠ 三者不重复:热泵调水温,AHU 维持室温(只管显热),除湿机承担潜热。
热平衡有十条页内不变量断言(?selftest=1)。改动本节任一式子时,
对应断言会转红 —— 那正是目的:
| 断言 | 锁什么 |
|---|---|
| A1 / A2 / A3 | 电-热分配完整(泵/UV 恒等式、由登记表枚举全量设备、轴功真的到达接触器) |
| B | 车间显热闭合 = 围护 + 通风 − 室内产热 |
| C | 水侧净热闭合(六项) |
| D / E | 登记完整性:有气量必须登记 airPath,有电功率必须在 POWER_REGISTRY |
| F1 / F2 / F3 | 水量闭合、盐平衡、热质同源 |
| F4 | 登记设备必须有 CAPEX 条目 |
⚠ 新增任何进/出车间或水侧的热流、任何用电设备、任何有气量的设备时,
必须同步 POWER_REGISTRY 与上述式子。这套断言正是为「热流成为孤儿」这类缺陷而设 ——
它在 v2.0(Q_air_gain)、v2.1(蛋分气流、风机热)已抓到三次。
v1.1 把热平衡参数(气温/源水温/U 值/换气率)放在每个阶段的 proc 字段里, 用户必须在每个阶段重复设置。
v1.2 把所有热平衡参数挪到顶部全局配置区 globalThermalConfig(项目级常量影响所有阶段)。具体参数表见第 28 章和附录 B。
T_room = T_水温,RH_room = roomRH_set(默认 65%),不再联立求解;池面显热 Q_pool_loss ≡ 0。
同时新增气液接触器项(脱气塔 + MBBR 曝气,出口按水温饱和)。
详见 v1.9.3 → v2.0.0 与第 29 章章首说明。
本节保留作推导与历史参考。
v1.1 假设池热散到一个无限大"室外", 实际上车间空气会被池水加热到比室外高 5-12°C, 导致池散热小于"对室外气温散热"; 同时湿度积累让蒸发率下降。v1.2 引入双节点稳态:
详细模型、求解算法和输出字段见第 29 章。
Q_evap × λ 从空气节点移到水体节点。物理: 蒸发夺走的是水体显热 (水分子带走能量),
空气节点只接收 潜热增量 (W_room 上升), 不直接接收 λ 项。
旧手册写在空气节点是 v1.2 推导笔误, 代码一直把 λ 项放在水节点的能量平衡里 (正确)。
| 类型 | COP_heat | COP_cool | 源温 | 适用 |
|---|---|---|---|---|
| 空气源 air | 3.5-4.0 | 2.5-3.0 | T_air | 常规, 气温 > -10°C |
| 水源 water | 4.5-5.5 | 3.5-4.5 | T_source | 有大量地下水/河水 |
| 地源 ground | 4.0-5.0 | 3.5-4.5 | T_ground (≈年均) | 有埋管空间 |
| 海水开式 seawater_open | 4.5-5.5 | 3.5-4.5 | T_seawater | 沿海/海上养殖, 钛板换热 |
| 泵 | 流量 | 默认扬程 m | 默认效率 | 说明 |
|---|---|---|---|---|
| 主循环泵 | 循环流量 Q | 12 | 68% | 全流量, 功率最大 |
| 反硝化支路泵 | Q × 反硝化比 | 10 | 60% | 分流到缺氧反应器 |
| UV 支路泵 | Q × UV 比 | 10 | 60% | |
| AOP 支路泵 | Q × AOP 比 | 10 | 60% | |
| 蛋分支路泵 | Q × 蛋分比 | 6 | 60% | 蛋分塔近距离 |
| RDF 反冲泵 | Q × 反冲比 | 8 | 55% | 间歇运行 |
主循环泵功率通常占全场电费 30-40%, 是最大单一用电设备。变频泵可节能 15-25%。
| 管道类型 | 推荐流速 m/s | 说明 |
|---|---|---|
| 吸水管 | 0.8-1.2 | 流速太高→气蚀 |
| 压水管 | 1.5-2.5 | 流速太高→水锤 |
| 排污管 | 1.0-2.0 | 需自清洗流速防沉积 |
| 溢流管 | 0.5-1.0 | 重力流 |
| 组成 | 典型值 | 说明 |
|---|---|---|
| 静水头 | 0.5-2 m | 鱼池到处理间高差 |
| 管道摩阻 | 2-4 m | 管长和管径决定 |
| 设备阻力 | 3-5 m | RDF+BF+UV 各约 1-2m |
| 安全余量 | 1-2 m | 10-20% |
| 合计 | 8-15 m | iRAS 默认 12m |
| 参数 | 传感器 | 精度 | 价格 | 位置 |
|---|---|---|---|---|
| DO | 荧光法 | ±0.1 mg/L | 5,000-15,000 | 鱼池+BF 出水 |
| pH | 玻璃电极 | ±0.01 | 2,000-5,000 | 鱼池+BF |
| 温度 | Pt100 | ±0.1°C | 500-1,000 | 鱼池+源水 |
| TAN | 离子选择 | ±0.1 mg/L | 20,000-50,000 | 鱼池 (可选) |
| ORP | 铂金电极 | ±5 mV | 3,000-8,000 | 蛋分 (臭氧控制) |
| 液位 | 超声波 | ±1 cm | 1,000-3,000 | 鱼池/集水井 |
| 报警项 | 阈值 | 响应 |
|---|---|---|
| DO 低 | < 5 一级 / < 3 紧急 | 启动备用风机/氧气瓶 |
| pH 低 | < 6.5 | 加 NaHCO₃; 减投饵 |
| TAN 高 | > 2.0 mg/L | 减投饵; 检查 BF |
| 温度异常 | 偏离 ±2°C | 检查热泵 |
| 液位低 | 低于设定 | 补水; 检查泄漏 |
| 停电 | 市电中断 | 柴油发电机 30 秒启动 |
| 泵故障 | 电流异常 | 切换备用泵 |
必备: ① 柴油发电机 (全场 100% 负荷); ② UPS (PLC + 传感器); ③ 短信报警; ④ 每月演练应急切换。
RAS 的封闭特性天然具有高生物安全性, 但一旦病原体进入会因循环水快速传播。"防进来"比"治病"更重要。新建项目应在投产前建立完整的生物安全 SOP。
| 对象 | 消毒剂 | 浓度/方法 | 频率 |
|---|---|---|---|
| 工具 | 碘伏 | 100 ppm 浸泡 10 min | 每次使用后 |
| 脚池 | 次氯酸钠 | 200 ppm 每周换液 | 每天 |
| 车间地面 | 过氧化氢 | 3% 喷洒 | 每周 |
| 鱼池 (空池) | 高锰酸钾 | 50 ppm 浸泡 24h | 批次间 |
| 进水 | UV | 60 mJ/cm² | 持续 |
新建 RAS 满负荷需要 8-12 周。急于满负荷投鱼是新手最常犯错误——BF 处理能力是逐步建立的, 超过 BF 能力 = TAN 暴涨 = 大量死鱼。
| 阶段 | 时间 | 操作 | 关键指标 |
|---|---|---|---|
| 设备调试 | 第 0-1 周 | 空载运行; 试压 | 设备无故障 48h |
| BF 培菌 | 第 1-4 周 | 加菌剂; 投 NH₄Cl 至 TAN 2-4 | TAN 下降, NO₂ 出现 |
| 硝化成熟 | 第 4-6 周 | 继续培菌 | TAN<0.5 且 NO₂<0.3 持续 3 天 |
| 低负荷放鱼 | 第 6-8 周 | 放容量 20-30% | TAN<1.0 稳定 |
| 加负荷 | 第 8-12 周 | 每周加 15-20% | 指标安全 |
| 满负荷 | 第 12+ 周 | 正常生产 | TAN<1, NO₂<0.3, DO>6 |
| 问题 | 原因 | 措施 |
|---|---|---|
| TAN 不降 | 温度太低/pH 太低 | 升温 25-30°C; 补碱度 |
| NO₂ 持续高 | Nitrobacter 未建立 | 正常! 耐心等待 |
| 放鱼 TAN 暴涨 | 投鱼太多/投饵太猛 | 减投饵 50%; 部分换水 |
| pH 快速下降 | 碱度耗尽 | 加 NaHCO₃ |
| 鱼不吃食 | 应激 | 检查水质; 减投饵 |
为什么分两层:工艺侧每一项都能追到物理量与公式(补水量来自 V_makeup、
排污量来自 V_discharge、维护保险来自 CAPEX);企业侧本质是经济估算,
定员与管理费率没有物理依据。混进一个总数会拉低整个模型的可追溯性,
故分别输出,可研报告中也应分别列示。
| 成本项 | 计算基础 | 实算 元/kg | 占企业全成本 |
|---|---|---|---|
| 人工 v1.9.2 | 定员 × 人均年成本 ÷ 365 定员 = max(最小班组, 年产量 ÷ 劳动生产率) | 2.55 | 6.1% |
| 管理费 v1.9.2 | (工艺运行成本 + 苗种 + 人工) × 费率 | 2.00 | 4.8% |
| 苗种 v1.9.2 | 首阶段年进塘尾数 × 苗种单价 只有首阶段采购,后续为场内转group | 0.41 | 1.0% |
| 企业全成本合计 | 41.97 | 100% | |
工况:1000 t/yr 大西洋鲑、青岛冬、mainline 拓扑;电 0.7 元/kWh、饲料 12 元/kg、液氧 1.2 元/kg。 定员 17 人(= max(8, 1000/60)),年采购苗种 27.5 万尾。 工艺运行成本占企业全成本 88.2%。
基数:维护对象横跨 CAPEX 的两个层次,而土建部分基本不产生年度维护:
| 维护对象 | 所在层次 | 是否计入 |
|---|---|---|
| 泵、风机、UV 灯管、微滤机滤网、氧锥、膜件、仪表 | 设备直购 | ✅ |
| 阀门、管件、泵密封、变频器、控制柜、池体防腐 | 总包系数(管道/电气/自控/安装) | ✅ |
| 厂房结构、场地、道路 | 总包系数(土建) | ❌ |
总包系数 2.2 中土建约占 0.4–0.6,其余 0.6–0.8 为管道/电气/自控/安装。
故默认基数取 设备直购 × 1.6(maintenanceBase = 'equipPlusInstall'),
另可选 'equipOnly'(仅设备直购)或 'totalProject'(工程总投资,偏保守)。
费率:iRAS 的设备单价库是国内设备口径——基数比进口交钥匙小得多, 但国产设备故障率与更换频次通常更高,费率应相应上调:
| 设备来源 | 基数 | 费率 | 说明 |
|---|---|---|---|
| 进口高端交钥匙(如 AKVA) | 大 | 2–3% | Nordic Aqua 宁波即此类 |
| 国产设备(iRAS 默认) | 小 | 4.5% | 可调 4–6% |
两者的绝对额可能反而接近——低造价换来高维护率,这是国产化方案在全生命周期上需要正视的权衡, 而不是单看 CAPEX 就能下结论的。
峰值成本通常是日均的 1.5-2.5 倍。设备必须能承受峰值, 但日常运行接近日均。
o2Demand,
其中含 peakFactor (1.5) 与 sAerator (1.10) 两个容量系数, 导致液氧成本高估
1.65 倍。v1.9.1 起液氧 OPEX 改用 o2ConsumptionDailyAvg。v1.1 引入双年限折旧:
1000 t/yr 三文鱼基准, 4 工况下综合成本对比(v1.3):
| 工况 | 气温/源水 | OPEX | 折旧 | 综合 元/kg | 对照文献 |
|---|---|---|---|---|---|
| 青岛冬 | -7°C/4°C | 22.4 | 13.6 | 35.96 | — |
| 海南冬 | 17°C/22°C | 24.1 | 13.6 | 37.70 | — |
| 海南夏 | 32°C/27°C | 26.9 | 13.6 | 40.47 | — |
| 挪威 Bergen 冬 | 0°C/4°C | 22.7 | 13.6 | 36.30 | Atlantic Sapphire 60-70(含人工/苗) |
其他鱼种(v1.1 数据, 单一工况):
| 鱼种 | OPEX 元/kg | 折旧 | 综合 | 文献 |
|---|---|---|---|---|
| 大菱鲆 500t | 31.9 | 16.2 | 48.1 | 46.32 (海水鱼体系) |
| 罗非鱼 1000t | 19.9 | 9.5 | 29.3 | 25-30 |
| 石斑鱼 300t | 27.4 | 12.7 | 40.1 | 60-100 (不含苗) |
| 加州鲈 500t | 27.9 | 12.7 | 40.6 | 30-50 |
| 鳜鱼 300t | 35.9 | 16.0 | 51.9 | 80-100 |
| 鳗鲡 300t | 44.6 | 15.2 | 59.8 | 60-100 (含苗) |
| 对虾 100t | 25.7 | 16.2 | 41.9 | 25-35 |
注: 上表为 v1.3 旧口径(仅饲料 + 工艺电耗 + 工艺消耗品 + 折旧)。 v1.9.2 已补齐维护/保险/补水/排污(工艺侧)与苗种/人工/管理(企业侧),口径定义见 21.1, 产业实绩对标见 21.5。仍未计入包装/物流/加工、疫苗药物、顾问技术服务费, 按 Nordic Aqua 结构反推约 6 元/kg 量级,做可研时须另行估算。
这是目前唯一一个中国本土、商业规模、公开披露财务数据的大西洋鲑 RAS 项目, 对国内做可研的人参考价值最高。数据取自 Nordic Aqua Partners AS(Euronext Growth,代码 NOAP) 2025 年第四季度暨全年中期报告,非二手报道。
| 项 | 内容 |
|---|---|
| 厂址 | 浙江省宁波市象山县高塘岛珠门村坑头山 |
| 业主 | 诺帝克水产(宁波)有限公司;母公司挪威 Nordic Aqua Partners AS |
| 技术方 | RAS 系统由挪威 AKVA Group 交钥匙总包;饲料 Skretting(Nutreco) |
| 规模 | 一期 4,000 t + 二期 4,000 t(HOG);三期规划至 20,000 t,用地长期潜力 5 万 t |
| 进度 | 2021 Q1 开工;2024 年 4 月首次收获;二期 2026 年 9 月首收,下半年满负荷 |
| 土地厂房 | 由象山海峡经济技术合作公司租赁提供(租至 2056 年,含购买选择权) |
| 期间 | 生物量产出(活重 LW) | 商业收获(HOG) | 均重 |
|---|---|---|---|
| 2024 全年 | 3,511 t | 523 t + 1,669 t 整鱼 | — |
| 2025 全年 | 3,981 t | 2,026 t | 3.9 kg HOG / 4.7 kg LW,优品率 97% |
| 2026 Q1 | 2,161 t(历史新高) | 771 t | 4.4 kg HOG / 5.4 kg LW |
| 2026 全年指引 | — | 5,000–6,000 t | 目标提至 7.0 kg LW |
yieldTons 是活重口径(由阶段末体重 weightEnd 反推,那是活鱼体重)。
若按 HOG 报的产能对标,需除以 0.83 换算。混用是可研报告中的常见错误。
公司披露的单位成本(2025):转入存货成本 5.8 EUR/kg(当期生产边际成本)、 期末存栏成本 5.7 EUR/kg、全年存货结转成本 8.4 EUR/kg(含早期高成本批次与异味事件影响)、 公司指引 2026 Q1 结转成本降至 7.0 EUR/kg 以下。
从损益表反推全年成本结构(产量 3,981 t 活重,汇率按 7.8 元/EUR):
| 项目 | M EUR | 元/kg | 占比 |
|---|---|---|---|
| 原料(饲料 + 鱼卵) | 7.126 | 14.0 | 21.3% |
| 其他外部费用(生产相关) | 14.657 | 28.7 | 43.7% |
| 人工 | 6.264 | 12.3 | 18.7% |
| 折旧 | 5.482 | 10.7 | 16.4% |
| 合计 | 33.529 | 65.7 | 100% |
| 分项 | iRAS 实算 | NOAP | 解读 |
|---|---|---|---|
| 饲料 | 14.80 | 12.9 | 差 15%,全在 FCR:iRAS 加权 1.188,NOAP 约 1.05–1.10 |
| 折旧 | 7.86 | 10.7 | 同量级,差异由进口设备解释 |
| 其他 OPEX | 10.04* | 28.7 | 差 2.9 倍——见下方归因 |
| 企业全成本 | 41.97 | 65.7 | — |
* 指 v1.9.2 补齐维护/保险/补水/排污之前的旧口径值,用于说明差距来源。
把 NOAP 的「其他外部费用」28.7 元/kg 按行业常规比例拆开(财报只披露合计):
| 去向 | 估算 元/kg | iRAS v1.9.2 是否建模 |
|---|---|---|
| 维护与备件 | 3.7 | ✅ 已补 |
| 补水(海水取水 + 淡化) | 1.8 | ✅ 已补 |
| 废水处理与排污 | 1.4 | ✅ 已补 |
| 保险 | 1.0 | ✅ 已补 |
| 包装 / 物流 / 加工外包 | 3.5 | ❌ 项目特有,不内置 |
| 顾问 / 技术服务费 | 1.6 | ❌ 取决于是否引进外方技术 |
| 疫苗 / 药物 / 化验 | 1.0 | ❌ 取决于病害压力 |
| 死鱼与固废处置 | 0.6 | ❌ |
| 残差(异味事件 1,900 万欧元整改摊销等一次性) | 4.1 | ❌ 一次性事件,绝不建模 |
v1.9.2 主体完成后接受了一轮第三方代码审计,共修复 8 项缺陷, 并新增自然冷却路径与自检入口。本节记录这些改动,因为其中数项会改变计算结果。
UI 会把自动算出的 o2FishFactor 回写进输入框的 value,
而读取端判断「用户是否手填」的依据是 value === ''。
v1.9.2 之前两者是幂等的(该字段就是纯生理值,写回再读出仍是同一个数)。
但 v1.9.2 把它的语义改成了池内总耗氧系数(= 生理值 + TSS 依赖附加), 幂等性被打破:回写含附加的值 → 用户碰任一工艺参数 → 该值被当作「手填的纯生理值」读回 → 再叠一次 TSS 附加。
修法:自动值改走 placeholder,不再写 value。
自动值与用户手填值在数据结构上彻底分开 —— value 保持为空即永远走自动公式,
除非用户真的键入数字。这样无论该字段的语义将来怎么变,都不会再出现回写污染。
同一节点里 TAN 只去除 η,NO₃ 却按 100% 增加 —— 单节点凭空多出 (1−η)×TANin 的氮。
(「稳态下 TAN 几乎全部硝化」这层意思已由独立的 no3PerCycle 表达,不应在沿程节点上再算一遍。)
biofilterTAN=0 且换水=0 时,
旧式给出反硝化进水 NO₃ = 115.7 mg/L(应为 4.25),进而使碱度回收 > 硝化消耗,
NaHCO₃ 投加量被算成 0 —— 模型给出「不用加碱」的危险结论,而实际 pH 会崩。
修复后同工况 NaHCO₃ 为 604 kg/d。
heatPumpKWh 是耗电量(= 热负荷 ÷ COP);用它除以利用小时得到的是电功率,
而国内冷水机组/空气源热泵的报价惯例是元/kW 制冷(制热)量,
EQUIP_PRICES_DEFAULTS.heatPump 的 2000 元/kW 正是这个口径。
(反推校核:若按电功率理解,等效制冷量单价仅约 580 元/kW,与市场不符。) 旧实现按电功率计价,使热泵 CAPEX 缩到约 1/COP。UI 上「热泵 xx kW」工程师也必然当制冷量读,口径必须一致。 修复后综合成本 +0.27~0.70 元/kg,设备清单与单价单位均标注为「kW 制冷/制热量」「元/kW(热)」。
通风新风量按 CO₂ 反算时固定用文献常数 500 g/kg 饲料,
而同一模型的 load.co2Daily 是自算的(呼吸 RQ≈1 + 硝化产 CO₂)。
两者相差 34%–117%(鲑鱼 671、大菱鲆 749、石斑 861、鳗鲡 1084 g/kg 饲料),
且差异随鱼种、水温、池内 TSS 变化。已改为优先取模型自算值,老数据回退到 500。
稳态解 Cout = Δ/(1−R) 只在 R < 1 时成立。当某污染物无有效去除路径
(η=0 且换水=0)时 R → 1,浓度随时间线性发散、无稳态;
而 Math.max(1−R, 0.001) 只是防除零,却把发散变成一个看起来精确的有限值
(如 TAN 339.89 mg/L)。
v1.9.2 新增 divergent 检测(R ≥ 0.999),UI 显式告警
「该污染物没有稳态解,相关浓度均不可信」,而非静默给数。
biofilterTAN(单次通过去除率 η,决定池内浓度)与 VTR₂₀/θ
(容积速率,决定填料容积)是两套独立参数,模型不校验其自洽性。
注意 bioVolume 本就是从 tanDaily 与 VTR 反算的,故
bioVolume × VTR ≡ tanDaily × sBio 恒成立,校核它没有意义。
真正的隐患是:η 受接触时间约束,而接触时间由填料容积与过滤流量决定。 用户可以填 η=95% 却配一个空床停留时间只有几十秒的 BF。新增 EBCT 校核:
| 空床接触时间 EBCT | 单级经验可达 η |
|---|---|
| < 1 min | 约 55% |
| 1–2 min | 约 70% |
| 2–5 min | 约 85% |
| > 5 min | 约 92% |
判据留了较大余量 —— 单次去除率还强烈依赖进水 TAN 浓度: 低浓度下反应处于一级动力学区,同样 EBCT 可达更高的百分比去除率。 iRAS 默认 70% + EBCT≈2.4 min 是国内常见配置,不报警;90%/95% 才告警。
产量输入框被清空(yieldTons=0)是必然出现的中间态 —— 用户改产量时必然先清空。
此时 biomass=0,feedAvg/biomass = 0/0 = NaN,并沿
load → sim.alk → naHCO₃ 成本 → totalAvg → 管理费 → 企业全成本 一路污染,
最终使全场汇总、成本卡片、财务评价全部显示 NaN 且无任何提示。
已在源头(比值计算)与两处出口(碱度、成本)做有限性兜底。
方案 JSON 导入路径会把 stage.name、鱼种名等完全来自文件的字符串
直接拼进 innerHTML,无转义。构造恶意 name 即可在本站源上执行脚本,
读取或篡改 localStorage 里的全部方案数据。而「设计院之间互发方案 JSON」正是本工具的预期用法,
故这不是理论风险。已新增 escapeHtml() 并修复 6 处注入点。
旧模型在任何需要制冷的工况下都走机械压缩制冷,COP 封顶 3.45。 但 RAS 是常年制冷型负荷,而冬季室外 −7°C 时完全可以用干冷器/板换直接把热排给室外空气或冷源水 —— 压缩机不启动,只跑风机和泵,能效比可达 15–30。
freeCoolingApproach_K 默认 6 K(干冷器 5–8,板换 2–3) ⚠ 已于 v1.9.3 被 fcDesignDT_K 取代(判据由阈值改为容量,语义与默认值均已变,见「v1.9.2 → v1.9.3 → D 节」)freeCoolingEER 默认 20
| 工况 | 气温 | 自然冷却 | COP | 热泵电耗 kWh/d |
|---|---|---|---|---|
| 青岛冬 | −7 °C | ✅ | 20.00 | 634 |
| Bergen 冬 | 0 °C | ✅ | 20.00 | 646 |
| 海南冬 | 17 °C | 否 | 3.45 | 4272 |
| 海南夏 | 32 °C | 否 | 3.11 | 5118 |
寒冷气候热泵费从 1.68 降至 0.29 元/kg,比电耗 12.2 → 10.2 kWh/kg。 跨气候成本差由 0.99 拉大到 1.83 元/kg —— 寒冷气候本就该因免费制冷而占优势,旧模型把这个优势完全抹掉了。
未做部分:部分自然冷却。冷源温度接近但不足时,实际可做预冷 + 压缩机补足; 本模型按「全有或全无」处理(保守,达不到判定就全走机械制冷)。 CAPEX 不额外计 —— 自然冷却复用热泵已有的排热侧,热泵仍按最不利工况(通常夏季)定容。
roomTemp(车间室温)—— v2.0 起不再生效。v1.2–v1.9.3 期间该输入框
虽可编辑,但值从未被 calcThermalLoad 消费(返回时被求解值覆盖)。
v2.0 起车间温度由暖通维持 = 水温,该输入已停用。degasserExhaustIndoorFrac(尾气入室比例)—— 已废弃。新气路拓扑下
该参数语义不完整:只描述尾气去向、未描述进气来源,而二者对结果影响方向相反。
工艺气路进气取室外、排气排室外,全程不碰车间。poolUValue(水面传热系数)—— v2.0 起无关。
T_room = T_w 后池面温差为零,Q_pool_loss ≡ 0。
访问 index.html?selftest=1 会跑固定工况并与内置基线比对。 ⚠ v1.9.3 已扩展为 14 项(11 数值 + 3 边界),受检字段由 2 个增至 4 个,见「v1.9.2 → v1.9.3 → C / E 节」。
calcCostEstimate 时少传三个参数 —— 它算的是旧口径。
这个数被写进主页面、本手册、README 三处对外发布,直到第三方审计才发现,误差 3.41 元/kg。recomputeAll()、读真实的
lastResults.summary,不得重新实现任何计算管线。基线值也全部来自这条路径的实测。
改动模型后若自检报 FAIL,先确认是否为有意的修改;若是,需同步更新
SELFTEST_BASELINE 与三处文档,避免再次出现文档与代码脱节。
上述修复完成后又接受了一轮复审验证(对修复版逐行 diff、重建复算环境、 对 8 项缺陷逐条设计用例复跑)。复审确认 6 项完整修复、1 项半修复、1 项记录在案, 但发现一个由「修了一半」造成的新问题,量级比原缺陷更大。
I.3 修复热泵计价时只改了 CAPEX,其余三处消费点没跟上, 导致同一台热泵在页面上出现 4 个数(三文鱼成鱼期):
| 出现位置 | 原公式 | 值 |
|---|---|---|
| 热平衡卡片「装机容量」 | heatPumpKWh / 16(电功率、当前工况、无共用系数) | 40 kW |
| 工况对比表「装机」 | 各工况 heatPumpKWh / 16 | 冬 40 / 夏 321 kW |
| 设备清单 / N+1 模块化 / P&ID | max(冬,夏) 电 / 22 × 0.75 | 175 kW |
| CAPEX 计价 | max(冬,夏) 热 / 22 × 0.75 | 545 kW |
最大与最小差 13.6 倍。/16 vs /22 的分歧是 v1.5 遗留(当时只改了一处),
电功率 vs 热功率是 I.3 修复引入的新分歧——而 I.3 的注释自己写的就是「口径必须一致」。
heatPumpKWh 被 EER=20 压掉一个数量级,于是设备清单的定容工况从冬悄悄切到夏,
而 CAPEX 那边因为用热功率、冬夏都没变——两条链的主导工况都不一样了。
对出图与报价的杀伤力比原来「CAPEX 少算 3 倍」更大。
修法:抽出统一函数 hpInstalledKwOf() / hpThermalKWh(),
四处全部改用热功率(制冷/制热量)÷ 22 h,并在自检中加入断言
「设备清单热泵 kW == CAPEX 热泵 kW」,防止再次分裂。
I.7 的空场防护只清干净了成本链,沿程水质节点仍为 NaN:
flowM3h = 0 → cyclesPerDay = 0 → tanPerCycle = 0/0。
而水质面板的格式化函数是 (typeof n === 'number' ? n.toFixed(d) : n)——
NaN 也是 number,于是界面上最显眼的那块面板直接显示「NaN mg/L」。
成本卡片干净了,反而更容易让人以为只是水质模块出错。
已在 simulateWaterQualityProcess 入口加零流量短路,返回全 0 骨架并置 emptyFarm: true。
null,但渲染层守卫是 st.pH !== undefined——
null 通过守卫后 .toFixed() 直接抛异常,整个 renderFlow 崩掉。改为省略字段。sim.skimmer ? sim.skimmer.ozoneDemand : 0 取值,对象存在但字段缺失得到 undefined,
参与加法即 NaN。骨架必须把下游会读的字段补全为 0,而不只是给个空对象。
稳态物料守恒:TAN 产生 = TAN 硝化 + TAN 随换水排出。正常工况下池内 TAN < 1 mg/L, 换水排出可忽略,硝化量 ≈ 100% 产生量——旧式成立。 但 η 很低时 TAN 浓度飙升,换水带走的份额不再可忽略:
| η_bio | 池 TAN mg/L | 稳态 NO₃-N | NaHCO₃ kg/d | 换水带走 TAN kg/d |
|---|---|---|---|---|
| 70% | 0.49 | 20.2 | 582 | 0.1 |
| 30% | 1.13 | 20.1 | 581 | 0.2 |
| 5% | 6.69 | 19.9 | 572 | 1.4 |
| 0% | 414 | 0.0 | 0 | 82.8(全部) |
旧式在 η=0 时一边报告 TAN 发散、一边照常按全量产 NO₃ 并消耗全额碱度—— 没有硝化菌却在硝化。修复后 TAN 日产 82.8 kg/d 全部经换水排出,NO₃ 产生量与碱度消耗同步归零。
边界处理:η=0 且 换水=0 时 TAN 本身发散,此时 tanOut 是钳制产物、
换水导出项又恒为 0,公式会退化回「全量硝化」。已将 NO₃ 一并标记为随 TAN 发散,碱度侧同步,
由发散告警统一提示「相关浓度均不可信」。
0.001 看似无害的防除零,实际是「单次循环去除率下限 0.1%」。
而单次稀释率 = 日换水率 ÷ 日循环次数:典型工况(5178 m³ 水体 / 10155 m³·h⁻¹ → 47 次/日、换水 4%/d)
只有 0.085%,本来就低于该下限。
| 换水率 %/d | 单次稀释 | 旧式 NO₃-N | 理论值 |
|---|---|---|---|
| 1% | 0.000205 | 339.9 | 1657 |
| 2% | 0.000410 | 339.9 | 829 |
| 4%(默认) | 0.000820 | 339.9 | 414 |
| 6% | 0.001231 | 276.2 ✅ | 276.2 |
| 10% | 0.002051 | 165.7 ✅ | 165.7 |
换水率 ≤ 约 4.8%/d 时被硬钳成同一个值、完全不响应换水率,而 iRAS 默认换水率正是 4%。 影响的是只靠换水去除的组分(旁路小时的 NO₃、无 AOP 时的 geosmin); TAN 有 BF(70%)、TSS 有微滤机(75%),单次去除率远高于 0.1%,碰不到下限——这也是它藏了这么久的原因。
R ≥ 0.999,这些被钳制的工况全被标成「无稳态解」。
表面上是「模型诚实地告警了」,实际是用一个错误的告警盖住了一个错误的数。
把阈值改到 1 − 1e-9(真正的发散只在完全无去除路径时出现,此时 R 恰为 1)后告警消失,
数值错误才暴露出来。过于宽松的告警阈值比没有告警更危险——它让人以为问题已被发现并处理。
| 项 | 处理 |
|---|---|
| NH₃ 着色阈值写死 25 μg/L | 改为按鱼种取值(鲑科 12.5 / 大菱鲆 20 / 石斑 30 / 加州鲈·鳜·对虾 50 / 鳗鲡 60 / 罗非 100)。原值对冷水鲑科偏松一倍、对温水种偏严 2–4 倍,而同一个 tooltip 自己写着「三文鱼 12.5、温水鱼 50–100」 |
| 方解石饱和指数 Ω 无告警 | 新增欠饱和告警(Ω < 1 警告、< 0.6 严重)。实测四个海水鱼种 Ω 0.55–1.53(v2.5 链式重导后;多数阶段欠饱和,对虾苗种期 1.53 过饱和)——长期溶蚀混凝土池体与砂浆、不利于甲壳类蜕壳与贝类钙化,是海水 RAS 的真实关切 |
| 自然冷却无 UI 露出 | 热平衡卡片与工况对比表加 ❄️ 标记;三个参数(启用/逼近温差/EER)接入围护区,UI/读取/载入/监听全链路贯通(原先只在 PROCESS_DEFAULTS,等于硬编码) |
| 标题成本未标工况 | 头条数字旁标注 [设计冬工况]。自然冷却使设计冬变成全年最省(35.59 / 年均约 36.9 / 设计夏 37.37),不标注读者易当年均值 |
| EBCT 校核的 fallback 是死代码 | stageFarm.flowM3h 字段不存在,改 load.flowM3h |
复审指出:11 条基线全是 golden-master(硬编码期望值),只能锁行为、不能发现系统性错误—— 一个常数错了它会安静地一直通过。这次审计的 8 项缺陷里只有 1 项能被原形式的自检抓到。
已补两类不依赖「当前值是对的」这个前提的断言:
load/thermal/eq/capex/cost
与全部沿程水质节点的每一个数值字段,不得出现 NaN/Infinity——正是②那类问题的通用捕手外加三个边界工况(yieldTons = 0 / 0.001 / 100000),只跑断言不比对数值。
这套断言加上当场就抓出了②的 5 个 NaN 字段,修完才转 PASS。
const 暂时性死区、删变量未查引用、补丁静默未写入),
三次都是自检抓到的——表现为「全部工况返回 0」或「XX is not defined」。
没有自检的话这三个都会带到浏览器才发现,其中「常量未定义」在无头环境还会被 try/catch 吞掉,更难查。
| 项 | 原因 |
|---|---|
| CDN 无 SRI | cdn.tailwindcss.com 是运行时编译,内容随访问变化,无稳定 hash 可做 SRI;内联需构建步骤,与「单文件双击即用」定位冲突。已在 index.html 头部写明风险与建议方案(内联 Tailwind 产物 + chart.js,一并解决 SRI/FOUC/离线三个问题),属部署决策 |
| 抽出 engine.js + 单元测试 | 这是根治「验证脚本与模型脱节」的唯一办法,但属重构。核心 13 个计算函数中 12 个已是纯函数(零 DOM 引用),依赖的模块级标识符仅 14 个,其中 8 个是常量表 —— 抽取难度不大,主要障碍是 5 个可变全局(stagesState 等)。建议在浏览器实测通过、代码稳定后,以自检为金标准再做 |
鳗鲡是本工具内置鱼种中参数不确定性最大的一个,v1.9.2 对其做了整体重做。 本节说明哪些参数有据可查、哪些查不到,供做鳗鲡项目的使用者判断可信边界。
| 参数 | 旧值 | 新值 | 依据 |
|---|---|---|---|
| 养成期密度 | 40 kg/m³ | 120 | 欧洲 RAS「120 kg/m³ 不罕见」;50 g 入池后可达 100–150 |
| 白仔 / 黑仔期密度 | 10 / 25 | 12 / 50 | 玻璃鳗隔离期仅 0.3–0.5 kg/m³,逐级提高 |
| 上市规格 | 200 g (5P) | 300 g (3P) | 3P 美洲鳗批发 92 元/kg;美洲鳗为国内主养品种 |
| 换水率(养成) | 4%/d | 6% | 国际 RAS 5–8%/日 |
| 各阶段月数 | 3/4/5 | 2/6/7 | 单尾生长期 10–14 月至商品规格 |
| 综合成活率 | 70% | 75% | 国际口径反推 92%(偏乐观)、中国口径 70–80%,取中 |
| 苗种单价 | — | 10 元/尾 | 美洲鳗;缅因州玻璃鳗配额独立反推 10.8 元/尾 |
months 填单尾生长期(合计 15 月)。工艺参数可以逐条查证,但单位养殖成本找不到可用的现代公开数据:
| 数据源 | 为什么用不了 |
|---|---|
| 国内上市公司年报 | 出池量中自用转加工占比高(2026 Q1 为 86%),营收 ÷ 产量反推严重失真;单位养殖成本属商业机密,不单列 |
| 欧洲龙头(Nijvis、ALBE 等) | 均为私营企业,不披露财务 |
| FAO 各国成本数据 | 过时约二十年,且早于鳗苗价格暴涨(同期欧洲玻璃鳗 300–750 EUR/kg,今约 5–13 倍);其中丹麦鳗鱼产量已由 2020 年萎缩至 2024 年的 101 吨、年均降 37% |
| 设备 | 计价单位 | 默认单价 | 推荐范围 | 说明 |
|---|---|---|---|---|
转鼓微滤机rdf | 元/(m³/h) | 500 | 300 - 800 | |
MBBR 池系统 (填料+曝气配件, 不含池体/风机)biofilter | 元/m³ 填料 | 4500 | 3000 - 6000 | |
UV 消毒器uv | 元/kW | 10000 | 8000 - 15000 | |
蛋白分离器skimmer | 元/m³ | 25000 | 15000 - 40000 | |
臭氧发生器ozone | 元/(kg/d) | 100000 | 80000 - 150000 | |
AOP 反应池aop | 元/m³ | 35000 | 20000 - 50000 | |
反硝化反应器denitri | 元/m³ | 5500 | 4000 - 8000 | |
脱气塔degas | 元/m² | 20000 | 15000 - 30000 | |
主循环泵+变频mainPump | 元/kW | 3500 | 2500 - 5000 | |
支路泵 (各)branchPump | 元/kW | 3000 | 2000 - 4000 | |
加药计量泵 (每台)dosingPump | 元/台 | 5000 | 2000 - 15000 | ⚠ 按台计价 —— 计量泵按 kW 计价会差一个数量级 |
罗茨风机blower | 元/kW | 4000 | 3000 - 6000 | 罗茨风机 (脱气塔 / BF / 蛋分供气 / 鱼池曝气) |
车间通风机 (轴流)ventFan | 元/kW | 800 | 300 - 1500 | ⚠ 待产业校准: 估值, 未取自报价单; 不可复用罗茨口径 |
液氧增氧塔o2tower | 元/(m³/h) | 350 | 200 - 500 | |
热泵 (空气源)heatPump | 元/kW(热) | 2000 | 1500 - 3000 | ⚠ 口径为制冷/制热量, 非电功率 |
板式换热器heatExch | 元/m² | 1200 | 800 - 2000 | |
机械除湿机dehumidifier | 元/(kg/h) | 1500 | 800 - 3000 | 按额定除湿量计价 (工业整机含风道/控制) |
车间暖通机组hvacUnit | 元/kW(冷热) | 400 | 250 - 800 | 整机口径; 处理空气显热, 单位容量造价低于热泵一个量级 |
capex.total, 但本表与设备清单页都没跟 ——
这就是下游审计咬出的"清单少四台、总价却对得平"(另一台是 K-501
蛋分供气风机, 归在上表"罗茨风机 元/kW"口径内)。详见 31.7。ventFan 单价 2,000 元/kW 属待校准项: 轴流风机与罗茨风机
(4,000 元/kW)是两类设备, 该值取自轴流量级估算, 尚无报价样本支撑。
放大系数涵盖: 管道阀件 (15-20%)、电气仪表 (10-15%)、自控 (5-10%)、安装调试 (10-15%)、土建厂房 (30-40%)、设计监理 (5-8%)。
概算精度约 ±40%, 实际造价以厂商报价为准。iRAS 投资概算用于项目可行性初判, 不能替代正式造价。
v1.7 引入氧锥拓扑 mainline / bypass 区别建模, 对 CAPEX 有显著影响 (1000 t 大西洋三文鱼实测):
| 设备项 | mainline | bypass | 差异 | 说明 |
|---|---|---|---|---|
| 液氧增氧塔 A-601 | 355 万 (Q=10155 m³/h) | 36 万 (Q×10% = 1015 m³/h) | -319 万 | 规模缩 10× (按小流量定价) |
| 主泵 P-101 | 213 万 (610 kW) | 171 万 (488 kW) | -42 万 | 主泵不过锥, 扬程降低 |
| 旁路泵 P-602 | 0 | 28 万 (92 kW) | +28 万 | v1.7 新增独立设备 |
| 液氧储罐 V-901 | ≈ 相同 | ≈ 相同 | ~0 | 站级 CAPEX 按日耗推算, 拓扑不影响日耗 |
| 设备 CAPEX 小计 | 4,454 万 | 3,842 万 | -612 万 | — |
| 工程总投资 (× Lang 2.2) | 9,800 万 | 8,454 万 | -1,346 万 (-14%) | 含放大系数 |
本案例使用 iRAS v1.7 默认的大西洋三文鱼参数, 演示完整计算并对比两种氧锥拓扑。气候选用挪威 Bergen 冬季工况 (T_air=0°C, T_source=4°C, T_target=15°C), 这是工程实际三文鱼项目最具代表性的气候。
本章表格由模型实算生成(tools/gen_case_chapters.js), 不再手写 —— 案例章通篇是实算数字, 手写则模型每改一次就整章过期且无任何信号。
salmon_bergen_w(T_air 0 °C / T_source 4 °C / RH 75%)。⚠ 它是「冬季设计工况」的隔离口径, 夏冬同温, 不是 Bergen 的真实年度气候 —— 立此基线是为了压住全量自然冷却的边界(余量仅 9%)。不应据本章数字做年度经济性判断; 年度口径请在软件里选气候预设后自行计算。另注: CLIMATE_PRESETS 里没有 Bergen(只有 Tromsø), 本章不为此新造预设 —— 无出处的气候数据不进模型。基准工况: 大西洋三文鱼 1000 t/yr · 挪威 Bergen 冬季工况 · 设计阶段 成鱼期 · 门禁基线 salmon_bergen_w
| 参数 | 苗种期 | 幼鱼期 | 中鱼期 | 成鱼期 |
|---|---|---|---|---|
| 体重 (g) | 0.1→50 | 50→500 | 500→2000 | 2000→5000 |
| 月数 | 6 | 8 | 6 | 4 |
| FCR | 1 | 1.1 | 1.2 | 1.2 |
| 蛋白 (%) | 50 | 45 | 42 | 40 |
| feedRate (%) | 3.00 | 1.50 | 1.00 | 0.95 |
| 水温 (°C) | 12 | 14 | 15 | 15 |
| 密度 (kg/m³) | 30 | 50 | 60 | 70 |
| 盐度 (‰) | 0 | 0 | 12 | 30 |
| 推荐池深 (m) | 1.5 | 3 | 5 | 7 |
| 换水/turnover | 4 | 3 | 2.5 | 3 |
| 损耗 (%) | 15 | 8 | 4 | 3 |
关键计算结果 (模型实算):
| 参数 | 苗种期 | 幼鱼期 | 中鱼期 | 成鱼期 |
|---|---|---|---|---|
| 存塘量 (t) | 3.2 | 41.1 | 131.6 | 236.9 |
| 峰值投饵 (kg/d) | 95 | 616 | 1316 | 2251 |
| TAN 产生 (kg/d) | 4.4 | 25.5 | 50.8 | 82.8 |
| CO₂ 产生 (kg/d) | 66 | 437 | 924 | 1511 |
| 鱼峰值耗氧 (kg/h) | 1.8 | 12.6 | 27.5 | 45.0 |
| 循环流量 (m³/h) | 424 | 2465 | 5481 | 10155 |
| 系统水体 (m³) | 106 | 822 | 2193 | 3385 |
| 池内 CO₂ (mg/L) | 10.0 | 11.4 | 10.8 | 9.5 |
| 池内 NH₃-N (mg/L) | 0.0049 | 0.0048 | 0.0022 | 0.0016 |
| 池内 pH | 7.56 | 7.49 | 7.20 | 7.17 |
| 泵功率合计 (kW) | 20.0 | 116.3 | 258.7 | 479.2 |
| 阶段设备投资 (万元) | 135.1 | 694.4 | 1439.0 | 2602.3 |
| 模型告警条数 | 1 | 1 | 3 | 3 |
全场汇总:
| 指标 | 数值 | 指标 | 数值 |
|---|---|---|---|
| 工艺运行成本 | 37.68 元/kg | 企业全成本 | 42.68 元/kg |
| 比电耗 | 10.19 kWh/kg | 其中热泵 | 0.20 元/kg |
| OPEX | 28.64 元/kg | 折旧 | 9.05 元/kg |
| 工程总投资 | 10760 万元 | 峰值流量 | 10155 m³/h |
| 系统总水体 | 9874 m³ | 用地 | 16.4 亩 |
成本构成 · 口径: 成鱼期(大西洋三文鱼 1000 t/yr · 挪威 Bergen 冬季工况)· 全周期日均 元/日
| 成本项 | 计算基础 | 元/日 | 占比 |
|---|---|---|---|
| 饲料 | 日投饵量 × 饲料单价 | 24037 | 41.5% |
| CAPEX 折旧 | 设备/8年 + 土建/20年 ÷ 365 | 13190 | 22.8% |
| 电费(泵/UV/杂项) | 主泵+支路泵 ÷ motorEta + UV + 照明控制 | 8168 | 14.1% |
| 维护+保险+补水+排污 | processExtraDaily(四项之和, 见 21.1.3) | 6911 | 11.9% |
| NaHCO₃ | 碱度投加 ÷ 0.595 × 单价 | 1294 | 2.2% |
| 电费(CO₂ 风机) | 脱气塔风机 × 24h | 987 | 1.7% |
| 增氧(液氧或风机) | o2 模式=液氧; air 模式=K-101 电费 | 905 | 1.6% |
| 甲醇 | 反硝化需求 × 单价 | 800 | 1.4% |
| 电费(BF 风机) | BF 粗孔曝气 × 24h | 598 | 1.0% |
| 电费(热泵) | 热泵电耗 × 电价 | 442 | 0.8% |
| 电费(蛋分风机) | K-501 × 24h | 215 | 0.4% |
| 电费(车间暖通) | 车间显热 ÷ COP × 电价 | 215 | 0.4% |
| 电费(臭氧) | 臭氧发生器 × 24h | 178 | 0.3% |
| 电费(车间通风机) | KV-1003 × 24h | 10 | 0.0% |
| 电费(除湿机) | 除湿量 ÷ SMER × 电价 | 0 | 0.0% |
| 分项合计 | — | 57951 | 100.0% |
| 模型 totalAvg | 含折旧的工艺运行成本 | 57951 | 100% |
✅ 分项合计 ⇔ totalAvg 闭合(差 < 0.5%), 说明成本明细已全部过桥。
下表是 v1.7 工具实际输出值 (jsdom 跑测,默认气候即挪威 Bergen 冬季, 默认价格电 0.7 元/kWh / 液氧 1.2 元/kg / 饲料按各阶段单价):
| 项目 | mainline (主流串联) | bypass (旁路高压) | 差异 |
|---|---|---|---|
| CAPEX 设备直购 | 4,455 万元 | 3,843 万元 | -612 万元 |
| CAPEX 工程总投资 (× Lang 2.2) | 9,800 万元 | 8,454 万元 | -1,346 万元 |
| 年折旧 (设备 8 年 / 土建 20 年) | 824 万元/年 | 711 万元/年 | -113 万元/年 |
| 年 OPEX (不含折旧) | 2,846 万元/年 | 2,830 万元/年 | -16 万元/年 |
| 年综合成本 (含折旧) | 3,670 万元/年 | 3,541 万元/年 | -129 万元/年 |
| OPEX (元/kg) | 28.46 元/kg | 28.30 元/kg | -0.16 |
| 折旧 (元/kg) | 8.24 元/kg | 7.11 元/kg | -1.13 |
| 综合成本 (元/kg 鱼, 含折旧) | 36.70 元/kg | 35.41 元/kg | -1.29 |
| 对照文献 | Atlantic Sapphire (Florida) 60-70 元/kg (含人工/苗/管理) Nordic Aqua 宁波 (中国境内) Q2 2024 实测生产成本 41 元/kg ≈ EUR 5.23/kg | — | |
| 偏差说明 | iRAS 不含人工 (~6-8 元/kg) / 苗种 (~5 元/kg) / 管理与营销 (~3-5 元/kg)。 iRAS 36.70 + 软成本 ~16 元/kg ≈ 53 元/kg,与挪威 Salmon Evolution 目标"与海水网箱打平"(NOK 50-60/kg ≈ 35-42 元/kg) 量级一致。 | — | |
| 工况 | OPEX 元/kg | 综合 元/kg | 差异原因 |
|---|---|---|---|
| 青岛冬 | 22.4 | 35.96 | 基准 (v1.3 数据) |
| 海南冬 | 24.1 | 37.70 | 仍需制冷 (气温 > 水温) |
| 海南夏 | 26.9 | 40.47 | 32 → 15°C 制冷温差大 |
| 挪威 Bergen 冬 | 22.7 | 36.30 | 气温温和 + 源水冷 |
关键观察: 三文鱼养殖目标水温 12-15°C, 海南夏季气温 32°C, 制冷温差 17-20°C, 制冷电费暴增。不建议在海南养三文鱼。挪威成本接近青岛, 长期运行更优。
1000 t 大西洋三文鱼成鱼期 (Q=10155 m³/h, V_total ≈ 5183 m³, 4 模块) 在 Bergen 冬季工况下的两种拓扑全工况对比:
| 对比项 | mainline (主流串联) | bypass (旁路高压) | 差异 |
|---|---|---|---|
| 动力消耗 | |||
| 主泵 P-101 功率 | 610.4 kW | 488.3 kW | -122.1 kW |
| 旁路泵 P-602 功率 | 0 (无) | 92.2 kW | +92.2 kW |
| 综合泵功率 | 610.4 kW | 580.5 kW | -29.8 kW (节能) |
| 年电费节省 (8000 h × 0.7 元/kWh) | — | — | ~17 万元/年 |
| 设备规格 | |||
| 液氧增氧塔 A-601 流量 | 10155 m³/h (全流量) | 1015 m³/h (10% 旁路) | 缩 10× |
| 主泵扬程 H_main | 12 m + 3 m (锥子) = 15 m | 12 m (主泵不过锥) | -3 m |
| 旁路泵扬程 H_bypass | — | 20 m | +20 m (高压锥) |
| CAPEX (设备直购) | |||
| 主泵 P-101 | 213 万元 | 171 万元 | -42 万 |
| 液氧增氧塔 A-601 | 355 万元 | 36 万元 | -319 万 |
| 旁路泵 P-602 | 0 | 28 万元 | +28 万 |
| 液氧储罐 V-901 (站级) | ~ 相同 | ~ 相同 | ~0 |
| 设备 CAPEX 小计 | 4,454 万元 | 3,842 万元 | -612 万 |
| 工程总投资 (× Lang 2.2) | 9,800 万元 | 8,454 万元 | -1,346 万 (-13.7%) |
| 财务指标 (售价 60 元/kg, 30%自有/70%贷款 @ 5%/8年, 折现率 8%, 项目 15 年) | |||
| 全投资 IRR | 14.90% | 17.31% | +2.41% |
| 自有资金 IRR | ~22% | 25.23% | +3% |
| 全投资 NPV (万元) | 5,779 | 7,031 | +1,252 |
| 静态回收期 (年) | 6.19 | 5.57 | -0.62 |
| 动态回收期 (年) | 8.63 | 7.42 | -1.20 |
| BEP (% 满产) | 62.3% | 57.9% | -4.3% |
基准工况: 大菱鲆 500 t/yr · 默认气候 (青岛) · 设计阶段 成鱼期 · 门禁基线 turbot_500
| 参数 | 苗种期 | 中鱼期 | 成鱼期 |
|---|---|---|---|
| 体重 (g) | 3→50 | 50→250 | 250→600 |
| 月数 | 4 | 8 | 6 |
| FCR | 0.9 | 1.1 | 1.3 |
| 蛋白 (%) | 55 | 50 | 48 |
| feedRate (%) | 3.00 | 1.50 | 0.90 |
| 水温 (°C) | 16 | 16 | 16 |
| 密度 (kg/m³) | 25 | 50 | 60 |
| 盐度 (‰) | 28 | 28 | 28 |
| 推荐池深 (m) | 0.8 | 1 | 1 |
| 换水/turnover | 3.5 | 3 | 2 |
| 损耗 (%) | 15 | 6 | 3 |
关键计算结果 (模型实算):
| 参数 | 苗种期 | 中鱼期 | 成鱼期 |
|---|---|---|---|
| 存塘量 (t) | 8.8 | 88.7 | 179.8 |
| 峰值投饵 (kg/d) | 264 | 1330 | 1618 |
| TAN 产生 (kg/d) | 13.3 | 61.2 | 71.5 |
| CO₂ 产生 (kg/d) | 193 | 984 | 1212 |
| 鱼峰值耗氧 (kg/h) | 4.9 | 27.2 | 34.7 |
| 循环流量 (m³/h) | 1230 | 5319 | 5994 |
| 系统水体 (m³) | 351 | 1773 | 2997 |
| 池内 CO₂ (mg/L) | 10.0 | 11.9 | 13.0 |
| 池内 NH₃-N (mg/L) | 0.0022 | 0.0020 | 0.0019 |
| 池内 pH | 7.15 | 7.08 | 7.04 |
| 泵功率合计 (kW) | 58.0 | 251.0 | 282.8 |
| 阶段设备投资 (万元) | 419.5 | 1654.8 | 1915.2 |
| 模型告警条数 | 3 | 3 | 3 |
全场汇总:
| 指标 | 数值 | 指标 | 数值 |
|---|---|---|---|
| 工艺运行成本 | 59.14 元/kg | 企业全成本 | 68.36 元/kg |
| 比电耗 | 20.66 kWh/kg | 其中热泵 | 2.13 元/kg |
| OPEX | 43.24 元/kg | 折旧 | 15.90 元/kg |
| 工程总投资 | 9454 万元 | 峰值流量 | 5994 m³/h |
| 系统总水体 | 7880 m³ | 用地 | 58.3 亩 |
成本构成 · 口径: 成鱼期(大菱鲆 500 t/yr · 默认气候 (青岛))· 全周期日均 元/日
| 成本项 | 计算基础 | 元/日 | 占比 |
|---|---|---|---|
| 饲料 | 日投饵量 × 饲料单价 | 15823 | 36.6% |
| CAPEX 折旧 | 设备/8年 + 土建/20年 ÷ 365 | 10404 | 24.1% |
| 维护+保险+补水+排污 | processExtraDaily(四项之和, 见 21.1.3) | 5210 | 12.1% |
| 电费(泵/UV/杂项) | 主泵+支路泵 ÷ motorEta + UV + 照明控制 | 4836 | 11.2% |
| 电费(车间暖通) | 车间显热 ÷ COP × 电价 | 1988 | 4.6% |
| 电费(热泵) | 热泵电耗 × 电价 | 1872 | 4.3% |
| NaHCO₃ | 碱度投加 ÷ 0.595 × 单价 | 829 | 1.9% |
| 电费(CO₂ 风机) | 脱气塔风机 × 24h | 583 | 1.3% |
| 增氧(液氧或风机) | o2 模式=液氧; air 模式=K-101 电费 | 511 | 1.2% |
| 甲醇 | 反硝化需求 × 单价 | 495 | 1.1% |
| 电费(BF 风机) | BF 粗孔曝气 × 24h | 355 | 0.8% |
| 电费(蛋分风机) | K-501 × 24h | 127 | 0.3% |
| 电费(臭氧) | 臭氧发生器 × 24h | 90 | 0.2% |
| 电费(车间通风机) | KV-1003 × 24h | 61 | 0.1% |
| 电费(除湿机) | 除湿量 ÷ SMER × 电价 | 0 | 0.0% |
| 分项合计 | — | 43184 | 100.0% |
| 模型 totalAvg | 含折旧的工艺运行成本 | 43184 | 100% |
✅ 分项合计 ⇔ totalAvg 闭合(差 < 0.5%), 说明成本明细已全部过桥。
| 对比维度 | 清水 RAS | Biofloc (BFT) |
|---|---|---|
| 水处理核心 | 微滤机 + 生物滤池 | 靠异养菌絮团原位处理 TAN |
| 有无生物滤池 | 有 (MBBR) | 无 (最大区别) |
| 水色 | 清澈 | 褐色 (絮团 300-800 mg/L) |
| 碳氮比 | 无要求 | C:N ≥ 15:1 关键 |
| DO 需求 | 按 RAS 标准 | 极高 (异养菌+硝化菌+虾) |
| 密度 | 2-15 kg/m³ | 3-8 kg/m³ |
| 投资 | 高 | 低 |
| 运行难度 | 中等 | 高 (絮团管理, 翻塘风险) |
| iRAS 支持 | ✓ | ✗ |
基准工况: 南美白对虾 100 t/yr · 默认气候 (青岛) · 设计阶段 养成后期 · 门禁基线 shrimp_100
| 参数 | 苗种期 | 养成前期 | 养成后期 |
|---|---|---|---|
| 体重 (g) | 0.01→1 | 1→10 | 10→30 |
| 月数 | 1 | 1.5 | 1.5 |
| FCR | 1 | 1.3 | 1.6 |
| 蛋白 (%) | 45 | 42 | 38 |
| feedRate (%) | 10.00 | 5.00 | 3.00 |
| 水温 (°C) | 30 | 30 | 30 |
| 密度 (kg/m³) | 2 | 8 | 15 |
| 盐度 (‰) | 15 | 15 | 15 |
| 推荐池深 (m) | 1 | 1.2 | 1.5 |
| 换水/turnover | 2 | 2.5 | 2.5 |
| 损耗 (%) | 30 | 15 | 10 |
关键计算结果 (模型实算):
| 参数 | 苗种期 | 养成前期 | 养成后期 |
|---|---|---|---|
| 存塘量 (t) | 0.2 | 2.8 | 8.8 |
| 峰值投饵 (kg/d) | 22 | 139 | 264 |
| TAN 产生 (kg/d) | 0.9 | 5.4 | 9.2 |
| CO₂ 产生 (kg/d) | 18 | 108 | 200 |
| 鱼峰值耗氧 (kg/h) | 0.5 | 3.4 | 6.4 |
| 循环流量 (m³/h) | 223 | 866 | 1466 |
| 系统水体 (m³) | 111 | 346 | 586 |
| 池内 CO₂ (mg/L) | 5.1 | 8.0 | 8.7 |
| 池内 NH₃-N (mg/L) | 0.0044 | 0.0043 | 0.0040 |
| 池内 pH | 7.40 | 7.21 | 7.17 |
| 泵功率合计 (kW) | 10.5 | 40.9 | 69.2 |
| 阶段设备投资 (万元) | 71.6 | 245.1 | 411.3 |
| 模型告警条数 | 3 | 5 | 5 |
全场汇总:
| 指标 | 数值 | 指标 | 数值 |
|---|---|---|---|
| 工艺运行成本 | 51.86 元/kg | 企业全成本 | 165.11 元/kg |
| 比电耗 | 19.68 kWh/kg | 其中热泵 | 2.52 元/kg |
| OPEX | 34.44 元/kg | 折旧 | 17.42 元/kg |
| 工程总投资 | 2072 万元 | 峰值流量 | 1466 m³/h |
| 系统总水体 | 1342 m³ | 用地 | 10.9 亩 |
成本构成 · 口径: 养成后期(南美白对虾 100 t/yr · 默认气候 (青岛))· 全周期日均 元/日
| 成本项 | 计算基础 | 元/日 | 占比 |
|---|---|---|---|
| CAPEX 折旧 | 设备/8年 + 土建/20年 ÷ 365 | 2625 | 32.0% |
| 饲料 | 日投饵量 × 饲料单价 | 1851 | 22.6% |
| 维护+保险+补水+排污 | processExtraDaily(四项之和, 见 21.1.3) | 1213 | 14.8% |
| 电费(泵/UV/杂项) | 主泵+支路泵 ÷ motorEta + UV + 照明控制 | 1209 | 14.7% |
| 电费(热泵) | 热泵电耗 × 电价 | 503 | 6.1% |
| 增氧(液氧或风机) | o2 模式=液氧; air 模式=K-101 电费 | 170 | 2.1% |
| NaHCO₃ | 碱度投加 ÷ 0.595 × 单价 | 151 | 1.8% |
| 电费(CO₂ 风机) | 脱气塔风机 × 24h | 143 | 1.7% |
| 甲醇 | 反硝化需求 × 单价 | 95 | 1.2% |
| 电费(车间暖通) | 车间显热 ÷ COP × 电价 | 91 | 1.1% |
| 电费(BF 风机) | BF 粗孔曝气 × 24h | 89 | 1.1% |
| 电费(蛋分风机) | K-501 × 24h | 31 | 0.4% |
| 电费(臭氧) | 臭氧发生器 × 24h | 25 | 0.3% |
| 电费(车间通风机) | KV-1003 × 24h | 8 | 0.1% |
| 电费(除湿机) | 除湿量 ÷ SMER × 电价 | 0 | 0.0% |
| 分项合计 | — | 8203 | 100.0% |
| 模型 totalAvg | 含折旧的工艺运行成本 | 8203 | 100% |
✅ 分项合计 ⇔ totalAvg 闭合(差 < 0.5%), 说明成本明细已全部过桥。
对于年产量 > 1000 t/yr 的大型 RAS 项目, 工程上不会建一个超大的循环系统, 而是拆成多个模块并联。原因:
典型工业项目模块数(参考 Atlantic Sapphire / Stolt Sea Farm / 国内大型项目):
| 规模 | 典型模块数 | 单模块产能 |
|---|---|---|
| < 500 t/yr | 1 套 | 全场 1 模块 |
| 500-1500 t/yr | 2-3 套 | 200-500 t/yr/模块 |
| 1500-5000 t/yr | 3-6 套 | 500-1000 t/yr/模块 |
| > 5000 t/yr | 5+ 套 | 1000+ t/yr/模块 |
v1.3.x 中, 每个阶段的模块数完全由用户决定。在阶段卡片头部"🔧 套数" subSystemCount输入(默认 1, 范围 1-10):
不同阶段可以有不同模块数。比如:
这种"阶段递增"的配置反映了大型 RAS 的实际工程: 苗种期对单一系统依赖性高, 成鱼期产量大需要分散风险。
每个模块内部按以下规则配置备用:
| 设备 | 单机容量上限 | 配置规则 | 备用 |
|---|---|---|---|
| 主循环泵 P-101 | 75 kW | ceil(模块流量功率 / 75) | +1 台备用 |
| BF 风机 K-302 | 30 kW | ceil(BF 风量功率 / 30) | +1 台备用 |
| RDF 微滤 F-201 | 600 m³/h | ceil(模块流量 / 600) | +1 台备用 |
| UV D-401 | 8 kW | 2 套并联各设计 75% 余量 | 1 台坏 → 另 1 台加大流量 |
| 热泵 H-801 | 200 kW | ceil(热泵装机 / 200) | +1 台备用 |
| 支路泵(UV/蛋分/反硝化/AOP) | 30 kW | ceil(支路功率 / 30) | +1 台备用 |
| 加药计量泵 | 1 kW | ceil(加药功率 / 1) | +1 台备用 |
| O3 发生器 G-901 | 50 kW | ceil(O3 功率 / 50) | +1 台备用 |
不按模块拆分, 全场共用 1 套(站级设备):
| 设备 | 配置 | 说明 |
|---|---|---|
| 液氧储罐 V-901 | 2 罐(主+备) | 双罐设计, 切换不停产 |
| 应急柴油机 | 1 台 100% 全场负荷 | 30 秒启动 + 自动切换 |
| 变压器 | 2 套(高/低压双套分列) | 故障切换 |
| UPS | 1 套(PLC + 传感器 + 关键阀门) | 10-30 分钟续航 |
模块化的设备成本变化: 单台机组容量变小 → 单价(元/kW)略升, 但数量增加 → 总成本基本不变(±5%)。 真正的成本影响来自备用机组数: 4 个模块各配 N+1 备用, 比 1 个大模块配 N+1 备用多备 3 台。 典型规模(1000 t/yr, 4 模块)备用成本约占 CAPEX 5-10%。
RAS 鱼池设计常见形状: 圆形(Cornell 双流式)/ 八角 / 方形带圆角。圆形最常见, 因为:
圆形池的关键尺寸:
给定阶段总水体 V_tank、每套池数 poolsPerSet、套数 numModules, 反推单池直径:
iRAS 在反推后自动检查工程合理性, 给出建议:
| 条件 | 告警内容 |
|---|---|
| D < 4 m | 反推单池直径偏小, 建议减少每套池数或减少并联套数 |
| D > 30 m | 反推单池直径偏大, 建议增加每套池数或增加并联套数 |
| D > 20 m 且 H < 3 m | 大池配浅池(H/D < 0.15), 流场易死角, 建议加深至鱼种推荐值 |
| poolsPerSet = 1 | 每套仅 1 池, 无主备/检修轮替, 工程惯例 ≥ 2 |
v1.3 在 SPECIES_DB 各鱼种各阶段加入推荐池深字段。这反映不同鱼种的生物学特性和工程惯例:
| 鱼种 | 阶段数 | 各阶段 recDepth_m (m) | 生物学 / 工程说明 |
|---|---|---|---|
三文鱼 Salmonsalmon | 4 | 1.5 → 3.0 → 5.0 → 7.0 | 立体水柱泳鱼, 鲑科大池深, 商业 7-12 m; 跨盐度(淡水→海水) |
大菱鲆 Turbotturbot | 3 | 0.8 → 1.0 → 1.0 | 底栖鱼, 浅池取单层底面积, 不超过 1.2 m |
罗非鱼 Tilapiatilapia | 3 | 1.5 → 2.0 → 2.5 | 耐高密度; 植物蛋白配方比例高, 氮排放低于肉食性鱼 |
石斑鱼 Groupergrouper | 3 | 1.5 → 2.0 → 1.5 | 半底栖; ⚠ 成鱼期池深回落而非加深 |
加州鲈 Largemouth Bassbass | 3 | 1.5 → 2.0 → 2.5 | 淡水温水肉食鱼, 立体水柱 |
鳗鲡 Eeleel | 3 | 1.0 → 1.5 → 2.0 | 底栖, 中等浅 |
鳜鱼 Mandarin Fishmandarin | 2 | 1.5 → 2.0 | 同加州鲈; ⚠ 本库只有两个阶段 |
南美白对虾 L.vannameishrimp | 3 | 1.0 → 1.2 → 1.5 | 底栖 + 水柱, 浅于其他温水鱼 |
自定义鱼种 Customcustom | 1 | 2.0 | 通用缺省, 供用户自定义鱼种起步 |
〔v2.3.3 校正〕本表由 SPECIES_DB 实测重写, 旧表九行错五行:
① 旧表按"苗种/幼鱼/中鱼/成鱼"四列排, 但各鱼种阶段数不同(鳜 2 段, 多数 3 段, 仅三文鱼 4 段),
四列硬排会把值错位到相邻阶段;
② 石斑旧写 1.2/—/2.5/3.0, 实为 1.5 → 2.0 → 1.5 —— 成鱼期是回落而非加深, 旧表把趋势写反了;
③ 罗非旧写 1.0 起, 实为 1.5; 鳗鲡旧写 0.8 起, 实为 1.0; 对虾旧写 1.5/2.0/2.5, 实为 1.0/1.2/1.5;
④ 加州鲈与鳜旧表合并为一行, 但二者阶段数不同, 已拆开;
⑤ 漏了 custom 自定义鱼种。
⚠ recDepth_m 是本库复发六次的那条链上的字段(鱼种库逐阶段值 → sp 白名单转发 → 消费点),
现由断言 M11/M15 压着, 详见 27.5。
用户可在阶段卡片头部"🐟 每套 X 池 × Y m 深"调整 Y 值, 默认填入鱼种推荐值。
v1.3 早期版本中, 池深有两个独立输入:
stage.poolDepth_m: 用于池径反推stage.proc.poolDepth: 用于估算池表面积 → 车间面积 → 散热这种双输入容易让用户混淆: 调了一处, 另一处没调, 结果池形和散热模型用了两个不同的池深。 v1.3.x 统一为一个数据源:
同时删除了热平衡区的"池水深"输入, UI 上只在阶段卡片头部出现一次。同步更新加载老方案 JSON 的逻辑: 若老方案缺 recDepth_m, 加载时从 SPECIES_DB 按阶段名/index 自动补充, 保证池径反推和热平衡用同一个推荐值。
给定参数:
反推:
结果: 8 个 Φ8.8m × 7m 圆池, 每池 423 m³。无告警。
v1.1 把热平衡参数放在每个阶段的 proc 字段里。同一个项目有 4 个阶段, 用户必须在 4 个阶段重复设置:
这些是项目级常量(同一个厂房无论养什么阶段都是同一份)。
v1.2 把它们挪到顶部全局配置区 globalThermalConfig, 一处设置, 所有阶段使用。
v1.2 提供常见地区的气候预设, 选择后自动填入气温/源水温/RH 设计值:
| 地区 | 冬 气温/源水 °C | 夏 气温/源水 °C | 年均 气温/源水 °C | RH 冬/夏 | 日照 冬/夏 kWh/(m²·d) | 推荐热泵 | 说明 |
|---|---|---|---|---|---|---|---|
| 挪威 Tromsø (北极圈) | -12 / 3 | 18 / 10 | 3 / 6 | 75% / 70% | 0.0 / 5.0 | 海水开式 | 北极圈, 冬季极冷; 推荐海水开式源 |
| 中国青岛 (北方海岸) | -7 / 4 | 32 / 24 | 13 / 14 | 60% / 78% | 2.3 / 4.8 | 空气源 | 默认预设; 13 条数值基线中 6 条建立于此 |
| 中国上海 (华东沿海) | -2 / 8 | 35 / 28 | 17 / 18 | 70% / 80% | 2.0 / 4.6 | 空气源 | 华东沿海, 夏季高温高湿 |
| 中国海南三亚 (热带) | 16 / 22 | 35 / 30 | 25 / 26 | 75% / 85% | 4.2 / 5.8 | 海水开式 | 热带, 全年高温, 制冷主导 |
| 智利 Puerto Montt (三文鱼陆基) | 2 / 8 | 22 / 14 | 11 / 11 | 80% / 75% | 0.9 / 5.8 | 海水开式 | 三文鱼陆基主产区, 全年温和 |
| 中东 Doha (沙漠养虾/罗非) | 12 / 18 | 45 / 35 | 27 / 27 | 50% / 55% | 4.2 / 7.2 | 水源 | 沙漠气候, 夏季 45 °C, 制冷极端工况 |
| 加拿大 Halifax (东海岸) | -15 / 1 | 26 / 18 | 7 / 8 | 75% / 78% | 1.6 / 5.2 | 海水开式 | 北美东海岸, 冷温带 |
〔v2.3.3 校正〕本表由 CLIMATE_PRESETS 实测重写。旧表六个地区没有一个与代码对得上 —— 旧写"青岛/海南/挪威 Bergen/法罗群岛/北方内陆/华南", 而代码是挪威 Tromsø / 青岛 / 上海 / 三亚 / 智利 Puerto Montt / 中东 Doha 六个(其中只有青岛名称重合, 且数值也已不同)。旧表另缺两列: 日照强度(sol_w/sol_s, 进太阳辐射子系统)与推荐热泵型式(hpRecommend, 决定源侧温度取气温还是水温)。⚠ 默认预设为中国青岛, 13 条数值基线中的 6 条建立在该预设上。
用户选地区后仍可微调任何参数。
| 预设 | U_wall | U_roof | U_floor | U_window | 窗墙比 | ACH | 热回收 | 说明 |
|---|---|---|---|---|---|---|---|---|
| 阳光板/温室 (国内南方常见) | 3.5 | 3.0 | 1.0 | 5.0 | 0.30 | 2.0 | 0 | 阳光板/温室, 国内南方常见; 保温最差但造价最低 |
| 一般工业车间 (50mm 岩棉, 国内多数 RAS) | 0.8 | 0.6 | 0.8 | 2.5 | 0.05 | 1.0 | 0 | 默认预设; 50 mm 岩棉, 国内多数 RAS |
| 保温车间 (100-150mm 聚氨酯, 北欧标准) | 0.30 | 0.20 | 0.50 | 1.4 | 0.03 | 0.5 | 0.75 | 100-150 mm 聚氨酯, 北欧标准; 带 75% 热回收 |
| 近被动房 (200mm+ 真空保温) | 0.15 | 0.10 | 0.25 | 0.8 | 0.02 | 0.3 | 0.85 | 200 mm+ 真空保温; 带 85% 热回收 |
〔v2.3.3 校正〕本表由 ENVELOPE_PRESETS 实测重写。旧表只有 3 档
(工业标准 / 北欧高保温 / 简易厂房), 而代码是 4 档:
① 漏了近被动房一档; ② "简易厂房"实为阳光板/温室, U 值也不同(旧写 2.0/1.5/1.5/5.0, 实为 3.5/3.0/1.0/5.0);
③ 北欧档的 U_floor 旧写 0.30(实 0.50)、U_window 旧写 1.2(实 1.4);
④ 旧表完全没有窗墙比 / ACH / 热回收三列 —— 而这三项恰恰随预设变化, 且直接进热平衡与通风计算。
v1.2 引入3 工况对比(可扩展为更多), 每次计算同时跑:
| 工况 | 用途 |
|---|---|
| 设计冬季 (design_winter) | 冬季最冷月用电峰值, 决定热泵装机 |
| 设计夏季 (design_summer) | 夏季最热月用电峰值, 决定制冷机装机 |
| 全年均值 (annual) | 年化电费, 用于成本核算和投资决策 |
当前选中的工况(thermalScenario)用于主显示, 其他工况结果在阶段卡片底部以对比表呈现。
热泵装机容量取冬/夏极值的较大者(装机定容)。
池盖直接影响蒸发率, 是热平衡的关键变量:
| 池盖类型 | 系数 | 典型蒸发率 | 适用场景 |
|---|---|---|---|
| 无盖 (none) | 1.0 | 开放水面全蒸发 | 室外或简易车间 |
| 部分覆盖 (partial) | 0.40 | 约 40% 蒸发 | 常规工业 RAS, 部分孔/进料口开 |
| 密闭 (full) | 0.10 | 约 10% 蒸发 | 北欧/严寒地区, 节能高保温 |
蒸发是潜热(2257 kJ/kg @100°C, 2502 kJ/kg @0°C), 是冬季最大的散热项之一。密闭池盖能省 20-40% 的暖气电费。
RAS 车间通风同时承担三个功能, 但它们的决定性负荷完全不同, 混为一谈是设计错误的常见来源:
| 功能 | 负荷来源 | 随什么变化 | v1.9.2 处理 |
|---|---|---|---|
| 空气质量 (CO₂) | 鱼呼吸 + 脱气塔尾气入室 | 鱼载荷 (投饵量) | 新风量下限 |
| 除湿 | 水面蒸发 | 水面积 / 池盖 / 室内外湿差 | 不由新风承担 |
| 显热排除 | 设备产热 + 池水散热 | 装机功率 | 由 ACH_eff 一并计算 |
v1.9.2 之前只有单一口径 通风量 = ACH × V_room。而 V_room 是自动估算出来的:
于是产生了一条纯几何的放大链: 降低养殖密度 → 同样产量需要更大水体 → 池面积↑ → 车间↑ → 通风量↑。 在湿热气候养冷水鱼时, 更多新风意味着带入更多湿空气, 在冷水面凝结放热, 制冷负荷随之暴增。 实测: 密度从 80 降到 15 kg/m³, 通风量被放大 5.33 倍, 制冷装机同步暴涨。
但这不成立 — 鱼的数量没变, 呼吸产生的 CO₂ 没变, 新风需求本不该变。房间大一倍只是稀释体积大一倍, 需要的新风流量并不会翻倍。
⚠ v2.4 起本式已被 28.7 取代, 本节保留为口径演进记录。 两点变化: (1) 风机送进车间的室外空气计入本式, 通风系统只补差额(28.7.1); (2) 自然通风档不再取 max —— 供风量钳在用户填的 ACH 上, 不足则报 CO₂ 超标(28.7.3)。
ACH 保留为用户可调的设计参数 (默认 1.0), CO₂ 稀释需求作为下限, 保证空气质量不会因为车间估小而失守:
co2Outdoor_ppm, 范围 300–5000; 城市/工业区实测常年 500–700, 取小是不安全方向)
| 参数 | 默认值 | 依据 |
|---|---|---|
| CO₂ 产量系数 | 500 g/kg 饲料 | 大西洋鲑 409 (Terjesen 2013) / smolt 550 (Vinci 2004) / 鳗鲡 536 (Heinsbroek 1990), 统一取值 |
| 车间 CO₂ 限值 | 1500 ppm | OSHA 法定 8h 限值 5000 过宽松; ASHRAE 舒适 1000–1200 是办公室标准, 对工业厂房间歇作业过严; 1500 落在"空气沉闷"与"头痛嗜睡"的分界 |
| 脱气塔尾气入室比例 | 0.2 | 现代场脱气塔尾气管道直排室外, 仅少量泄漏。老场或敞开式脱气应调高至 0.6–1.0 |
| ACH 默认值 | 1.0 | 泳池馆新风标准 0.48 CFM/ft² 湿面积 = 8.78 m³/(h·m²), 按本模型几何换算约 0.9–1.5 ACH。 ⚠ 该值是「新风换气次数」, 不是围护渗透风; 自然通风档的设计口径是 15–30, 与本默认值差一个量级 —— 见 28.7.3 与 15.9(拆两维已决定不做, 缺气密性数据) |
ACH 默认 1.0 在 v1.9.2 之前是没有出处的经验值, 现在有了可追溯的标准依据。
这是本次修正里最反直觉的一条, 但两种气候下结论一致:
两头都不是决定项, 所以除湿从新风量计算中整体移除, 改由机械除湿机承担 (详见 29.7)。 这与泳池馆的成熟实践一致: 新风管只管空气质量, 除湿机走 4–6 ACH 的内循环, 不带新风热负荷。
通风换气产生显热 + 潜热散热 (冬季 T_air 比 T_room 低很多)。热回收可回收 70–85% 的显热 (板式或转轮换热器):
显热计算 (UA_vent_sens) 与湿平衡 (m_air_flow) 必须共用同一个 ACH_eff —
否则质量守恒与能量守恒会互相矛盾: 用一个风量算带走的水汽, 用另一个风量算带走的热量, 结果不自洽。
北欧项目通常 ventHeatRecovery = 0.7–0.85, 国内项目多为 0 (无热回收)。
max() 而非 min() 意味着 降低密度仍会让通风量增加 (ACH 项仍随 V_room 线性增长),
只是不再无上限地主导结果。若项目实际是通过加深池子而非扩大占地来降密度,
车间面积不应跟着水体线性放大 — 此时请在围护区手工填写"车间面积"覆盖
A_building = 1.6 × poolArea 的自动估算, 或相应调低 ACH。
28.6 把新风量定成 max(ACH × V_room, V_CO₂), 但它默认这份风全部由通风系统提供。
在空气曝气拓扑下这一点不成立: K-101 鱼池增氧鼓风机没有排气风管,
它吸室外空气、气泡穿过池水、从池面进入车间 —— 气路是 OUTDOOR → INDOOR。
v2.4 之前这股风一分未计, 两笔账同时错:
V_CO₂, 而其中一部分已经由风机送进来了;Q_vent_sens 再按"从室外温度加热到室温"收一遍, 等于同一份热收两次。| 工况 | K-101 入室风量 m³/h(苗种/中鱼/成鱼) | 占通风需求 |
|---|---|---|
| 罗非 air + 开塔 · 恒温 ACH 1.0 | 476 / 1,752 / 4,228 | 44.5% / 44.5% / 36.9% |
| 罗非 air + 关塔 · 恒温 ACH 1.0 | 476 / 1,752 / 4,239 | 16.6% / 12.7% / 10.8% |
| 石斑 air + 开塔 · 机械通风 | 555 / 2,245 / 5,476 | 41.4% / 23.1% / 15.4% |
| 自然通风 ACH 15 | 同上 | 4.3% |
| 任意纯氧拓扑 | 0 | 0% |
⚠ 抵扣量单源自气流登记表 collectAirStreams, 不在别处另算一份 ——
否则新增气流时两处会漂移。断言 V3 静态锁住这一点。
⚠ 不新增"超额排风热损"项: 自由空气节点求解器已把该气流作为独立股入解
(温度平衡分母含 mEx·cp, 湿平衡含 mEx), 恒温恒湿档由 m_indoorExhaust 承载
且显热恰为零(该档室温 ≡ 水温)。再加一项即把它的焓算第二遍。
⚠ 纯氧拓扑下抵扣量恒为 0 ⇒ 13 条数值基线逐位不变。
这既是"可以放心改"的理由, 也意味着基线在这里什么都保证不了 —— 必须靠空气曝气锚定工况。
抵扣后 ACH_eff 会失真 —— 它可能报出"换气 0.3 次/h"而车间实际有 K-101 那股在穿堂。故拆成两个:
| 量 | 定义 | 用途 |
|---|---|---|
ACH_eff(机械) | V_vent_supply / V_room | 通风机选型 · 风管 CAPEX · 通风显热 UA · 湿平衡 |
ACH_total | V_vent_total / V_room | 界面显示 · 结露判定的语境 · CO₂ 稀释 |
⚠ 通风显热与湿平衡只能用机械那一份 —— 风机送进来的那股在接触器与尾气项里已各自记账, 不得重复。
v2.4 之前, 自然通风档同样走 max(ACH × V_room, V_CO₂)。这带来三个后果:
物理上站不住: 自然通风由风压与热压驱动, 不会因为室内 CO₂ 高就自己变大。 而且它不是一个设计常数, 是个结果 —— 由开口面积 × 驱动力决定, 跨度接近两个数量级:
| 场景 | ACH |
|---|---|
| 温室 · 夏季峰值降温设计 | 45–60(每分钟换一次); 澳洲口径至少 30 |
| 温室 · 冬季/夜间除湿 | 约 3(每 20 分钟一次) |
| 自然通风房间 · 改造前后实测 | 2.7–11 → 加开窗/天窗后 12–66 |
| 教学建筑 · 不同开窗策略实测 | 3.7–39.8 |
同一栋房子把固定窗玻璃拆掉就能从 9 变 66。拿这样一个量去保证 CO₂ 限值 (人员暴露口径)本身就不成立。
| 设 ACH | CO₂ 需求 | 实际供风 | 缺口 | 车间 ppm | 室温 °C |
|---|---|---|---|---|---|
| 1 | 39,304 | 6,499 | 28,915 | 4,422 | 23.3 |
| 2 | 39,304 | 12,998 | 22,416 | 2,894 | 17.1 |
| 5 | 39,304 | 32,495 | 2,919 | 1,584 | 9.0 |
| 15 | 39,304 | 97,485 | 0 | 857 | 2.6 |
| 30 | 39,304 | 194,969 | 0 | 658 | 0.4 |
缺口 > 0 时模型不再替用户变出风量, 而是让车间 CO₂ 真的算超标, 并给出两条出路: ① 把自然通风量调高到所需次数以上(靠加大开口面积); ② 改用机械通风档, 由通风机承担这份风量。
⚠ 由此用户填的 ACH 终于有意义了 —— 从 4,422 ppm 一路到 658 ppm。
⚠ 附带效果: 车间 CO₂ 浓度此前恒等于设计限值(因为通风量是"恰好压到限值"的反解),
在自然通风档现在终于能报超标。
⚠ 本节不给自然通风建驱动力模型(需要开口面积、风速、热压等本库没有的参数) ——
见 15.9 已决取舍。
| 项 | v1.2–v1.9.3 | v2.0.0 |
|---|---|---|
| T_room | 空气节点方程的解,自由漂浮 | 暖通维持 = 水温(输入) |
| RH_room | 湿平衡的解 | = roomRH_set(默认 65%,可调) |
| 求解方式 | 三节点联立 + Picard 迭代 / 闭式解 | 无需求解(已删除) |
| 池面显热 Q_pool_loss | UA_pool × (T_w − T_room) | ≡ 0(温差为零) |
| 钳位与能量丢弃 | T_room 钳位时静默丢弃缺口 | 不存在 |
| 围护 / 通风 / 池壁 | 混在水侧平衡 | 归暖通侧,折算电耗后计入总账(hvacKWhPerDay) |
| 气液接触器 | 完全未计入 | 新增:脱气塔 + MBBR 曝气,出口按水温饱和 |
Q_net_to_water = Q_metab + Q_equip + Q_makeup_signed
− Q_pool_loss (≡ 0)
− Q_evap_latent
+ Q_dehum_to_water
− Q_contactor_net ← v2.0 新增
其中接触器项 Δh = h(T_水, 饱和) − h(T_进气, RH_进气),
Δh 可为负(湿热空气遇冷水结露放热给水)。v1.1 的热平衡是单点能量平衡: 给定 T_w(目标水温)和 T_air(室外气温), 直接算补水加热量 + 池散热量 + 鱼代谢热 + 设备产热, 平衡后给热泵装机。 这个模型忽略了车间空气节点, 默认池的热散到一个无限大的"室外"。问题在于:
v1.2 引入双节点稳态求解器, 联立水节点能量、空气节点显热、空气节点湿度三个平衡:
+ Q_evap × λ 写在空气节点(节点 1)能量平衡里 — 这是 v1.2 推导笔误。
物理: 蒸发夺走的是水体显热(水分子蒸发吸热), 空气节点只接收水蒸气的湿度增量(W_room↑),
不直接接收 λ 项。代码 (calcThermalLoad) 一直把 λ 项放在水节点的能量平衡里, 物理正确。
v1.6 把手册 16.5 节和 29.2 节统一改为与代码一致的写法 — 水节点含 Q_evap × λ, 空气节点只有显热。
耦合: T_room 影响 W_sat, W_room 影响 m_evap。Picard 迭代求解(实际代码用闭式解):
蒸发率 m_evap 用Lewis 传热传质类比简化。同一个系数有面积口径与体积口径两种写法, 差一个空气密度, 混用是量纲错误的常见来源, 这里两种都给出:
W 为含湿量 (humidity ratio, kg 水/kg 干空气, 无量纲), 因此面积口径的 β_A 量纲必然是 kg/(m²·s), 而 h_c/c_p 恰好就是这个量纲 — 这是 Lewis 类比在工程上好用的原因: 只要知道对流换热系数, 传质系数就出来了。
| 实测量 (v1.9 → v1.9.1) | 变化 | 说明 |
|---|---|---|
| β 取值 | 降 12.4–14.9 倍 | 0.06 → 0.0035–0.010 m/s |
| 蒸发率 | 降 2–2.4 倍 | 不是 13 倍 — W_room 自洽求解存在自补偿: β 降低使 W_room 下降, 而 (W_sat − W_room) 随之变大, 部分抵消 |
| RH = 99% 饱和告警 | 消失 | 原告警是虚警, 由虚高蒸发率造成 |
当 W_sat(T_w) > W_room: 蒸发(从池水夺热, 减少水温), m_evap > 0 当 W_sat(T_w) < W_room: 凝结(空气中水蒸气在冷池面凝结, 给池水放热), m_evap < 0
凝结情况典型: 海南夏季水温 12-15°C(冷水鱼)远低于室内空气 32°C/RH 80%, 大量凝结。 凝结水自动加到补水量减项, 反映节水效益:
| 字段 | v1.x | v2.0.0 |
|---|---|---|
T_room | 求解输出,T_air + 5 ~ +12 °C | 输入 = 水温(暖通维持) |
RH_room | 求解输出 55–80% | 输入 = roomRH_set,默认 65% |
Q_pool / Q_pool_loss | 5–30 kW | ≡ 0(温差为零) |
T_room_raw / T_room_clamped /Q_clamp_gap_kW / iterCount |
钳位与迭代诊断 | 保留为常量(null / false / 0),仅为下游载荷向后兼容 |
| 字段 | 含义 | 典型值 |
|---|---|---|
contactorAirFlowM3h | 接触水的气流合计(脱气塔 + MBBR 曝气) | 三文鱼 1000 t 全场 96,287 m³/h |
contactorDeltaH_kJ_kg | Mollier 焓差,可为负 | 青岛冬 +45.7 / 三亚年均 −23.8 |
contactorGrossKWhPerDay | 接触器毛排热(回收前) | — |
contactorNetKWhPerDay | 接触器净排热(进水侧平衡) | 三亚年均 −18,470 kWh/d |
hvacSensibleKWhPerDay |
车间暖通显热负荷(热量,带符号) v2.1 起 = 围护 + 通风 − 室内产热。v2.0 只有前两项, Q_air_gain_kW 与入室的除湿冷凝热是孤儿项(IRAS_V21_HVAC_CLOSURE) |
Bergen 设计冬 +769 kWh/d (围护 935 + 通风 1,450 − 室内产热 1,617; v2.0 为 +3,355,其中围护+通风降到 2,385 是尾气入室比例 0.2→0 的效果) |
Q_room_internal v2.1 |
室内产热 = 设备废热 Q_air_gain_kW×24 + 入室的除湿冷凝热,恒 ≥ 0 |
三文鱼 1000 t 全场 1,617 kWh/d |
Q_dehum_to_room v2.1 |
其中除湿机部分(仅 dehumHeatDest === 'indoor' 时非零) |
默认 0(冷凝热排至室外) |
regimeMarginPct v2.1 |
距制冷↔制热翻转的结构余量(%)。Q_net_to_water 是若干量级相当、
符号相反的大项相减的小差值;余量小 = 系统坐在制度切换边界上,成本对参数的响应
不连续。这不是误差估计,是结构敏感性指标 |
青岛冬默认 G:L=5 阶段 3 为 49%;G:L=3 时仅 3.9% |
skimmerBlowerKw / skimAirFlow_m3h v2.1 |
蛋分供气风机(K-501)功率与气量。泡沫分离效率由气量决定而非水量,
v2.1 前无此项。气水比 skimmerGtoL 默认 0.5(Timmons Ch.5 典型 0.3–0.8) |
三文鱼成鱼期 6.41 kW / 508 m³/h |
skimmerBlowerSpec.airPath v2.1 |
蛋分气路登记。气鼓入水柱,contactsWater = true,
与脱气塔/MBBR 同属接触器热湿交换的气流。
⚠ 凡有气量的设备都必须登记 airPath,否则自检断言 D 报错 |
OUTDOOR → OUTDOOR |
V_exchange_m3d / V_fresh_makeup v2.1 |
补水两股:换水股(含盐,与排污同量同盐度)/蒸发股(补淡水)。
V_makeup = 两股之和。拆股使盐平衡恒等成立,
无需盐度状态变量。⚠ 断言 F1 锁定此恒等式 |
青岛设计冬 461.2 / 29.6 m³/d |
E_net_m3d / V_pure_surplus v2.1 |
净水汽(带符号,+蒸发 −结露)/净结露时的多余纯水(转排水)。 ⚠ 湿热气候养冷水鱼时常态为负 —— 这正是 v2.0 新增的能力 | 青岛冬 +29.6;海南夏 −34.9 / 余 41.4 |
S_target / S_steady / S_drift v2.1 |
目标盐度/净结露稀释后的稳态盐度/漂移量。
S_steady = S × V_exch / (V_exch + V_surplus)。
非新建模,是现有假设(换水补水与排污同盐度)的推论 |
海南设计夏 30 → 27.2‰(−2.83) |
contactorNetWater_kg_d v2.1 |
接触器净水汽质量,与 Δh 同源(同状态点、同 mdot)。
⚠ 断言 F3 由 mdot/W_in/W_out 独立重推并比对 ——
若改成独立的经验蒸发系数会立刻转红。
不受 recovery 折减:热可回收,水汽已离开水面,质量不会回来 |
青岛设计冬全场约 +29,600 kg/d |
contactorLatentFrac v2.1 |
潜热占毛焓差的比例,仅供诊断显示,不作断言区间。 随进气温度大幅变化:青岛冬 ~48%、近等温 ~91%(Karimi 2020 实测工况)。 ⚠ 勿用文献单点值当区间断言 —— 会把正确结果判红 | 青岛冬 48% / 海南夏更高 |
blowerElecKw / blowerShaftKw v2.1 |
四台风机(脱气 + BF 曝气 + 蛋分供气 + 鱼池增氧 K-101)的电功率与轴功。 v2.2 起轴功 = Σ(kW_i × η_i) 逐台加权,不再用统一的 η=0.57。 轴功抬高接触器进气温度,电机损失进 Q_room_internal。
⚠ v2.1 第五轮审计前,这三台的热【完全没有去处】 |
三文鱼成鱼期 57.5 / 32.8 kW |
contactorT_air_in / contactorDT_blower v2.1 |
接触器实际进气温度与风机温升。⚠ 加热是等湿过程,绝对含湿量 W_in
不随温升变化,变的是相对湿度 |
青岛设计冬 −3.5 °C(升温 3.3–3.5 K) |
Q_blower_motor_kWh_d v2.1 |
风机电机损失,Q_room_internal 的第三个组成
(前两个是设备废热与入室冷凝热) |
三文鱼成鱼期 594 kWh/d |
POWER_REGISTRY v2.1 |
用电设备登记表(唯一真相源)。每条声明四项:path(支持嵌套,
如 co2StripperSpec.blowerKw)/billedVia 计费去向/
heatVia 热去向/capexVia 资本去向。
断言 从本表反向枚举去实现里找 —— 旧版正向扫描 + 命名规则会漏掉嵌套字段。
⚠ 新增风机/泵/用电设备时必须同步,否则自检断言 E 报错。
注意 uvPower 单位是 W 不是 kW(历史字段) |
现登记 9 项 |
hvacKWhPerDay | 暖通显热折算电耗 | — |
hvacDirection / hvacCOP |
heat / cool / none / off;对应温度修正后的 COP | — |
Q_makeup_signed | 带符号补水项(v2.0 补出口,此前仅局部变量) | — |
roomRH_set | 车间设定湿度 | 65% |
以下为 v1.x 双节点求解器的输出表,保留作历史参考:
双节点求解器输出:
| 输出字段 | 含义 | 典型值范围 |
|---|---|---|
| T_room | 车间空气温度 | T_air + 5 ~ +12°C |
| RH_room | 车间相对湿度 | 55-80% |
| W_room | 车间含湿量 | 0.008-0.020 kg/kg |
| m_evap_kg_h | 蒸发率(负值=凝结) | ±5 ~ ±50 kg/h |
| UA_envelope | 围护总 UA(无含地板) | 500-2000 W/K |
| Q_envelope | 围护总散热 | 5-50 kW |
| Q_pool | 池散热 | 5-30 kW |
| Q_vent | 通风散热 | 2-15 kW |
| Q_makeup | 补水加热 | 5-30 kW |
| Q_internal | 内部产热(鱼+设备) | 10-100 kW |
| heatPumpKWhPerDay | 热泵日电耗 | 100-3000 kWh/d |
| heatPumpAvgKw | 热泵平均功率 | 5-200 kW |
| cop | 当前工况 COP | 2.5-5.5 |
| ACH_eff v1.9.2 | 等效换气次数 (max 口径反算) | 1.0-3.0 |
| ventBoostedByCO2 v1.9.2 | CO₂ 需求是否已顶替 ACH 口径 | true / false |
| m_dehum_kg_d v1.9.2 | 机械除湿量 | 0-3000 kg/d |
| dehumKWhPerDay v1.9.2 | 除湿机日电耗 | 0-1500 kWh/d |
| Q_dehum_reject_kWh_d v1.9.2 | 除湿机冷凝器排热量 | 0-4000 kWh/d |
| V_dehum_recovery v1.9.2 | 冷凝水回收量 | 0-4 m³/d |
| iterCount / converged v1.9.2 | 外层阻尼迭代次数与收敛标志 | 1-12 / true |
当车间 RH > 85% 时应加除湿措施 (否则结构件腐蚀、电气故障、霉菌)。iRAS 在 RH 接近饱和时给出醒目提示。 四条可选路径, 但它们的有效性强烈依赖气候:
| 路径 | 湿热气候 (海南夏) | 干冷气候 (挪威冬) | 代价 |
|---|---|---|---|
| 增加 ACH | ❌ 无效 — 室外更湿, 通风越多越湿 | ✅ 有效但用不上 — 仅需 0.14 ACH, 远低于 CO₂ 需求 | 通风加热/制冷能耗 |
| 加密闭池盖 | ✅ 有效 — 直接砍蒸发源头 | ✅ 有效 | 操作不便, 巡池/投饵受限 |
| 机械除湿机 | ✅ 主力手段 | 一般不需要 | 电耗 + 冷凝热去向 (见 29.7) |
| 排风热回收 | ❌ 帮助有限 | ✅ 有效 (显热为主) | 初投资 |
v1.2 拆出 4 种热泵, 各自的 COP 和源温模型:
| 类型 | COP_heat | COP_cool | 源温 | 适用 |
|---|---|---|---|---|
| 空气源 air | 3.5-4.0 | 2.5-3.0 | T_air | 常规, 气温 > -10°C |
| 水源 water | 4.5-5.5 | 3.5-4.5 | T_source | 有大量地下水/河水 |
| 地源 ground | 4.0-5.0 | 3.5-4.5 | T_ground (≈年均) | 有埋管空间 |
| 海水开式 seawater_open | 4.5-5.5 | 3.5-4.5 | T_seawater | 沿海/海上养殖, 钛板换热 |
不同热泵类型的源温和 COP 在 globalThermalConfig 中可独立设置。
湿热气候养冷水鱼 (海南 / 华南养大西洋鲑、虹鳟) 是国内 RAS 的典型场景, 也是湿度问题最尖锐的场景: 水温 12–15°C 远低于室内空气露点, 水面持续凝结, 车间 RH 长期在 90% 以上。 而如 28.6.4 所述, 这种气候下通风不能除湿 — 唯一可行的手段是机械除湿。
| 字段 | 默认值 | 范围 | 说明 |
|---|---|---|---|
dehumEnabled | false | 开 / 关 | 是否配置机械除湿机 |
dehumTargetRH | 70 % | 40–90 | 控制目标相对湿度。泳池馆 ASHRAE 建议 50–60%; RAS 车间可放宽到 65–75% (兼顾能耗); >85% 有霉菌与腐蚀风险 |
dehumSMER | 2.5 kg/kWh | 0.5–6 | 比除湿效率 (Specific Moisture Extraction Rate)。冷凝式典型 2–3, 转轮式较低, 热泵型可更高 |
dehumCondRecovery | true | 开 / 关 | 冷凝水是否回收作补水 |
dehumHeatDest | outdoor | outdoor / indoor / water | 冷凝器排热去向 — 对制冷负荷影响极大, 见 29.7.4 |
除湿机投入后, 车间含湿量被锁定在目标值 (而非由蒸发与通风自由平衡), 除湿量由湿平衡反推:
即: 除湿机只承担通风排不走的那部分湿负荷。这保证了两种手段不重复计算, 也解释了为什么干冷气候下除湿机自动退出 (通风已足够, m_dehum 算出来 ≤ 0)。
| 去向 | 对应设备形式 | 模型处理 | 后果 |
|---|---|---|---|
outdoor (默认) | 独立风冷机组, 冷凝器在室外 | 不参与热平衡 | 不影响车间温度 |
indoor | 移动式 / 吊装式除湿机 | 参与 T_room 求解 | 车间显著升温, 制冷负荷大增 |
water | 高端热回收机组 | 计入水侧净热 | 冬季可省加热能耗 |
| 指标 | 不配除湿机 | 配除湿机 (目标 70%) |
|---|---|---|
| 车间 RH | 92 % | 70 % |
| 水面凝结放热 | 2152 kWh/d | 1222 kWh/d |
| 除湿机电耗 | 0 | 1365 kWh/d |
| 冷凝水回收 | 0 | 3.4 t/d |
| 总电耗 | 基本持平 (省下的制冷 ≈ 除湿机耗电) | |
当 dehumHeatDest = indoor 时, 除湿机与空气节点构成强负反馈回路:
直接用 Picard 迭代 (每次把新值原样代入) 会发散振荡: 实测 T_room 在 22.5 ↔ 40°C 之间来回跳, 6 次迭代后取最后一次值完全不可信 — 取到哪个值纯粹取决于迭代次数的奇偶。
每次只向新解移动 25%, 把振荡压成单调收敛。实测 5 次以内收敛到 T_room = 30.2°C、除湿量 2012 kg/d。
阻尼法有一个固有风险: 它总能"收敛"到某个值, 但那个值未必是真实物理解 — 阻尼系数取得越小, 越像收敛, 也越可能只是在原地不动。验证方法是用四组不同阻尼系数分别求解, 若都收敛到同一点, 则该点是方程组的真实不动点, 而非阻尼参数的产物。本模型四组参数结果一致。
dehumEnabled = false), 界面上一切正常, 振荡只在特定参数组合下才暴露。converged = false 或 iterCount 顶到上限 12,
说明该工况下解未收敛, 输出的 T_room / 除湿量不应直接采信, 需检查参数是否落在合理范围。
P&ID(Piping & Instrumentation Diagram, 工艺管道仪表流程图)是化工/环保工程的核心设计文档, 描述工艺单元、管道连接、流向、关键仪表和控制逻辑。一份完整的 P&ID 应包含:
v1.3.x 提供独立 P&ID 查看器 pid.html, 主页面"📐 输出 P&ID"按钮一键打开。
数据流:
v1.3.x P&ID 采用两层布局:
主流层(上半部 y=560):
旁路(从主流 T 接头取水):
公用工程层(下半部 y=900):
v1.3 早期版本中, LOX 储罐显示的氧耗是全场总和 (summary.totalLOXKgD), 不论用户切换到哪个阶段都不变。 v1.3.x 修复为当前阶段氧耗 (stage.load.o2DailyTotal), 切换阶段时同步更新。
右上角元数据"全场氧耗"保持不变(那本来就是全场总和的语义, 用于储罐选型)。
P&ID 底部自动生成设备表, 含 tag/中文名/规格/数量列表:
| tag | 名称 | 规格示例(成鱼期) |
|---|---|---|
| T-101 | 鱼池 | 8 池 × Φ8.8 × 7m, 423 m³/池 |
| F-201 | 微滤机 | Q 11170 m³/h, η_TSS 75% |
| B-301 | MBBR 生物滤池 | V 438 m³, η_TAN 70%, 填充率 50% |
| C-501 | CO₂ 脱气塔 | G:L 3, η 65% |
| S-101 | 集水池 | 200 m³ |
| P-101 | 主循环泵 | 488 kW @ 12m H, 68% η, VFD |
| A-601 | 增氧锥 | 41.2 kg O₂/h, η 85% |
| S-701 | 蛋白分离器(旁路) | α 20%, V 74 m³ |
| D-401 | UV 消毒(旁路) | α 10%, 38 kW @ 40 mJ/cm² |
| R-801 | 反硝化反应器(旁路) | α 10%, V 129 m³ |
| V-901 | LOX 储罐 | 1113 kg/d (成鱼期), 3 t 储罐 |
| X-901 | AOP 高级氧化(公用工程) | α 5%, V 17 m³ |
主泵 P-101 由鱼池 DO-101 通过 PID 闭环控制 VFD 频率, 维持鱼池 DO ≥ 鱼种最低饱和度 × DO_sat。 联锁线在 P&ID 中表示为虚线箭头从 DO-101 指向 P-101_VFD。
类似的联锁包括:
pid.html 支持SVG 直接打印(浏览器 Ctrl+P → 保存 PDF) 或SVG 文件下载(右键保存)。 SVG 矢量格式, 缩放无损, 可在 AutoCAD/Visio 中导入用作工程图基础。
设备清单是工程设计的核心交付物之一, 用于:
v1.3.x 提供独立设备清单页面 equipment.html, 主页面"📋 导出设备清单"按钮一键打开。结构:
P-202 RDF 反冲泵自 v1.6 起
不再独立列项(RDF 厂家整体出厂含反冲泵); 项目元信息行现另带
方案版本 / 本页版本两个版本号(见 31.8)。
清单中每个设备按"主用 + 备用"展开。例如成鱼期 4 模块, 每模块主泵需要 P-101 75 kW × 2 台, 加 1 台备用:
| 模块号 | 设备 | 规格 | 数量 |
|---|---|---|---|
| 模块 1 | P-101 主泵(主) | 75 kW × 488/4=122 / 75 ≈ 2 台 | 2 |
| 模块 1 | P-101 主泵(备用) | 同上 | 1 |
| 模块 2 | P-101 主泵(主) | 同上 | 2 |
| 模块 2 | P-101 主泵(备用) | 同上 | 1 |
| …(其他模块)… | |||
| 全场 | P-101 主泵 合计 | 75 kW | 12 台(8 主 + 4 备) |
设备单价在主页面"单价配置"区设置, equipment.html 自动读取并计算:
放大系数 2.2 涵盖管道阀件 / 电气仪表 / 自控 / 安装调试 / 土建厂房 / 设计监理(详见第 22 章)。
某些设备虽然容积大、价值高, 但不需要 N+1 备用, 而是单列 + 旁路阀设计。例如:
| 设备 | 不需备用的原因 | 故障应对 |
|---|---|---|
| MBBR 生物滤池 B-301 | 填料缓冲数小时, 故障时减投饵 | 旁路阀让水绕过, 投菌剂时再开 |
| 反硝化反应器 R-801 | NO₃ 累积慢, 可承受数日停机 | 旁路阀让水绕过 |
| 蛋白分离器 S-701 | DOM 积累慢 | 旁路阀 |
| CO₂ 脱气塔 C-501 | 风机有 N+1, 塔体本身没动 | 风机切换 |
| 液氧储罐 V-901 | 主+备双罐设计 | 切换 |
设备清单上这些标识为"1 套 (单列 + 旁路阀)", 不展开成多份。
主页面和 equipment.html 之间的数据通过 localStorage 共享(iRAS_equipmentExport key), 跨 tab 同步:
v1.3.x 把 P&ID 和设备清单的 key 拆成两份(iRAS_pidExport 和 iRAS_equipmentExport),
让两个独立窗口可以同时开着, 各自显示最新数据互不干扰。
下游审计发现: 本页各组的行此前是硬编码的, 于是清单冻结在写它那天的设备集合。 实测缺 四台 —— 全是 v2.x 之后新加的:
| 位号 | 设备 | 何时加入模型 |
|---|---|---|
K-501 | 蛋分供气风机 | v2.1 (蛋白分离器供气独立成项) |
DH-1001 | 机械除湿机 | v1.9.2 (车间湿负荷建模) |
AHU-1002 | 车间暖通机组 | v2.2 (车间模式三档) |
KV-1003 | 车间通风机 | v2.6 车间通风机建模 |
capex.total, 这四台的钱一直在里面 ——
所以对账对得平, 谁也发现不了; 只有拿这份清单去询价/招标时, 才会发现少买了设备。
这类不一致比数值错更难查: 数值错会在某处露出破绽, 而"清单与总价各自正确、
只是内容对不上"没有任何破绽。
修法不是手工补四行(那只解决今天)。主页面 calcCapex 内部一直有一份
逐项清单 items, 只是从未导出; 现导出该清单(含从设备名抽出的 ISA 位号),
本页改为自 CAPEX 清单反向补全 —— 凡计入投资、带位号、而上方各组未渲染的设备,
一律自动列入「🧾 其他设备(自 CAPEX 逐项清单补全)」组。以后主页面新增任何设备都会自己出现,
"两份清单各自维护"这个结构性问题从根上消掉。
门禁 tools/check_downstream_contract.js 的判据 C7 锁死这一点:
本页渲染出的位号集合必须包含 CAPEX 逐项清单中所有带位号的条目, 否则转红。
采购方拿到清单, 看到的往往只有风量与功率, 看不出这台设备为什么是这个规格 —— 而这决定了后续处置。两处已补:
| 设备 | 补充的信息 | 为什么采购方需要它 |
|---|---|---|
K-101 鱼池增氧鼓风机 | 选型控制侧(O₂ 传质 / CO₂ 吹脱, 两侧风量并列)· 设计 DO 及其来源(用户设定 / 留空回落)· 实际 OTE 与清水基础 · 池底布气与体积曝气强度 | 被 O₂ 顶大与被 CO₂ 顶大, 后续处置完全不同: 前者降密度或加深池, 后者上脱气塔。曝气强度超限时另给出该阶段可行密度上限 |
KV-1003 车间通风机 | 控制项(CO₂ 稀释需求 / 换气次数 ACH, 两侧并列)· 车间稳态浓度与设计限值 | 由 CO₂ 顶大的风机, 一旦改增氧方式或脱气塔配置就必须重选, 不可沿用。此前只显示"0.4 kW · 2863 m³/h", 看不出这一点 |
⚠ 这两组数据全部取自主页面已导出的 aeration / aerIntensity /
indoorCO2 三个块, 本页不重算任何一个数 —— 否则就又造出了第二个数据源。
RAS 项目选址决定了气候/水温, 不同地区的成本差异巨大。v1.3 提供 4 个典型工况的标准化对比, 帮助:
使用 v1.3 默认参数, 4 工况下综合成本(含 CAPEX 折旧, 不含人工/苗种):
| 工况 | 气温 / 源水 | OPEX | 折旧 | 综合 元/kg |
|---|---|---|---|---|
| 青岛冬季 设计冬 | -7°C / 4°C | 22.4 | 13.6 | 35.96 |
| 海南冬季 设计冬 | 17°C / 22°C | 24.1 | 13.6 | 37.70 |
| 海南夏季 设计夏 | 32°C / 27°C | 26.9 | 13.6 | 40.47 |
| 挪威 Bergen 设计冬 | 0°C / 4°C | 22.7 | 13.6 | 36.30 |
| 文献来源 | 项目 | 综合成本 元/kg | iRAS 偏差 |
|---|---|---|---|
| Atlantic Sapphire (2023) | 迈阿密 RAS 三文鱼 | 60-70(含人工/苗) | iRAS 不含软成本, 偏低 25-30 |
| Stolt Sea Farm | 欧洲大菱鲆 | 40-50 | iRAS 大菱鲆 48.1, 接近 |
| 国家海水鱼体系 2019 | 大菱鲆 500 t | 46.32 | iRAS 偏 +4% |
| 国内罗非 RAS | 规模 1000 t | 25-30 | iRAS 29.3, 接近 |
| 南方对虾 RAS | 100 t | 25-35 | iRAS 41.9, 偏高(规模效应未建模) |
整体精度: iRAS 与文献偏差 ±10-20%, 对于工程概算用途(±40% 精度)足够。
iRAS v1.3 之前的输出停在工程概算: CAPEX 万元 / 年 OPEX 万元 / 综合成本元/kg。 对于设计院做可研报告、业主做投资决策、银行做贷款评审来说, 这些数据只是起点—— 真正的关键问题是:
v1.3 之前用户必须自己导出数据到 Excel, 手算这些指标, 一份可研里财务评价部分通常占 30% 篇幅, 设计院做一份要花 1-2 周。v1.4 加入独立的投资财务评价页面 (finance.html), 把这部分自动化, 把 1-2 周压缩到几小时。
finance.html 是个独立页面, 与主页面通过 localStorage 数据共享:
这个架构有两个优点:
v1.9.2 主页面新增了维护、保险、补水、排污(工艺侧)与苗种、人工、管理费(企业侧)七个成本项,
与本模块自带的 repairRate / laborCost / adminRate 三个参数产生交叉。
分工如下:
| 成本项 | 谁算 | 处理 |
|---|---|---|
| 维护与备件 | 财务模块(repairRate) | 主页面导出的 annualOpexForFinance 已剔除维护费,避免重复;保留财务模块单独使用时的完整性 |
| 苗种 | 主页面 | 财务模块没有这一项,主页面已将其并入 annualOpexForFinance。漏算会让 IRR 严重失真——鳗鲡苗种占企业全成本 43%,漏算相当于每公斤少算 42 元 |
| 人工 | 财务模块(laborCost) | 默认值由主页面提供(定员 × 人均年成本),用户仍可在本模块覆盖 |
| 管理费 | 财务模块(adminRate) | 不冲突。注意两边口径不同:财务模块 = 收入 × adminRate;主页面 = 成本 × overheadRate |
| 保险 / 补水 / 排污 | 主页面 | 财务模块无对应项,随 annualOpexForFinance 流入,不冲突 |
annualOpexForFinance 时,财务模块回退到 annualOpex。
此时维护费会重复计算、苗种费缺失——两者方向相反:
鲑鱼以维护重复为主(成本高估约 2.65 元/kg),鳗鲡以苗种缺失为主(成本低估约 42 元/kg)。
使用旧方案数据做财务评价时须注意此差异。
用户在 finance.html 顶部填写 17 个财务参数, 分 3 组:
| 组 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| 📈 销售与产能 | |||
| 📈 | 售价 (元/kg) | 按鱼种 (鲑 60 / 大菱鲆 80 / 罗非 22 / ...) | 出厂价 |
| 📈 | 项目年限 (年) | 15 | 评价期, 5-30 可调 |
| 📈 | 第 1 年达产率 (%) | 30 | BF 培菌 + 鱼苗培育期 |
| 📈 | 第 2 年达产率 (%) | 70 | 逐步加负荷 |
| 📈 | 第 3 年起达产率 (%) | 100 | 满产 |
| 📈 | 建设期 (年) | 1 | 含调试期 |
| 💵 投资与筹资 | |||
| 💵 | 流动资金 (% × 年 OPEX) | 15 | 启动期周转金, 末年回收 |
| 💵 | 自有资金比例 (%) | 30 | 剩余 70% 银行贷款 |
| 💵 | 贷款利率 (% 年) | 5 | 国内项目贷款典型 |
| 💵 | 还款方式 | 等额本息 | 或等额本金 |
| 💵 | 还款年限 (年) | 8 | 通常短于项目年限 |
| 📊 评价参数 | |||
| 📊 | 折现率 (% 年) | 8 | 用于 NPV, 国内项目典型 8-10% |
| 📊 | 所得税率 (%) | 25 | 企业所得税 |
| 📊 | 销售税金附加 (%) | 0 | 农产品免征, 其他 6-13% |
| 📊 | 修理费率 (% × 设备) | 2 | 工程惯例 |
| 📊 | 管理费率 (% × 销售) | 3 | 典型工业项目 |
| 📊 | 人工成本 (万元/年) | 由主页面导出 | v1.9.2 主页面按定员 × 人均年成本计算(定员 = max(最小班组, 年产量 ÷ 劳动生产率),三个参数在主页面 UI 可调,默认 8 人 / 60 t·人⁻¹·yr⁻¹ / 15 万元)。旧版用写死的阶梯函数(5 万元/人·年口径),与主页面相差 1.1-2 倍,会使同一份可研的成本表与财务章出现两个人工成本。老版本主页面未导出时回退到阶梯函数 |
财务评价的核心是逐年现金流。每年有 4 类现金流入流出:
fixedAsset × 5% 是经验值, 但设备和土建残值率不同:
设备(8 年折旧周期, 通常 10-15 年报废) 残值 ≈ 5% (机电二手价值);
土建(20 年折旧周期, 通常 30-50 年使用) 残值 ≈ 20% (建筑物结构残值)。
v1.5 起拆分计算: 残值 = totalCapexEquip × 5% + totalCapexCivil × 20%。
对千吨级三文鱼项目, 旧公式低估末年残值约 8-12%, 即 NPV 偏低 0.3-0.5 个百分点(对回收期/IRR 影响小)。
IRR (Internal Rate of Return) 是让 NPV = 0 的折现率:
这是非线性方程, iRAS 用 Newton-Raphson 迭代求解:
当 Newton-Raphson 发散(典型场景: 多重 IRR 解或符号变化异常),自动切换到二分法兜底: 在 [-0.5, 5.0] 区间求 NPV=0 的根。两种算法配合, 能稳定处理常见的 RAS 项目现金流。
遵循国家发改委《建设项目可行性研究报告编制规范》要求:
| 表 | 名称 | 主要内容 |
|---|---|---|
| 1 | 投资估算 | 设备 + 土建/安装/电气/自控/设计 + 流动资金 = 项目总投资 |
| 2 | 资金来源运用 + 还款计划 | 自有/贷款比例 + 逐年利息/本金 |
| 3 | 总成本费用估算 (满产年) | 经营成本 + 修理 + 管理 + 人工 + 折旧 + 利息 |
| 4 | 销售收入和税金 | 逐年: 达产率 → 产量 × 单价 → 销售收入 / 税金 |
| 5 | 损益表 | 逐年: 销售收入 − 各项成本 − 税 = 净利润 |
| 6 | 现金流量表 (全投资) | 逐年净 CF + 累计 CF + 累计折现 NPV → IRR |
| 7 | 现金流量表 (自有资金) | 含贷款流入 + 还本付息, 算股东 IRR |
| 8 | 敏感性分析 | 5 因子各 ±20% 对 IRR 影响, 按摆动排序 |
| 指标 | 定义 | 判断标准 |
|---|---|---|
| 全投资 IRR (税后) | 项目所有现金流(不含贷款)的内部收益率 | > 折现率 (8%) → 财务可行 |
| 自有资金 IRR | 股东视角 IRR (项目 CF + 贷款流入 − 还本付息) | 有杠杆放大效应 |
| NPV (净现值) | 按折现率折算到 t=0 的累计 CF 现值 | > 0 → 项目可行 |
| 静态投资回收期 | 累计净 CF 首次 ≥ 0 的年份(线性插值) | RAS 项目典型 5-8 年 |
| 动态投资回收期 | 累计折现 CF 首次 ≥ 0 的年份 | 静态值 + 折现影响 |
| 盈亏平衡点 (BEP) | 满产年净利润 = 0 时的产量比例 | < 75% 满产 → 安全裕度大 |
对项目 IRR 进行单因子敏感性分析, 5 个常用因子:
| 因子 | 变化幅度 | 典型 IRR 摆动 (1000 t 三文鱼) |
|---|---|---|
| 售价 | ±20% | ±5-7% (最敏感) |
| CAPEX | ±20% | ±3-4% |
| 产量 | ±10% | ±1-2% |
| 饲料成本 | ±20% × share_feed | ±1-1.5% |
| 电费 | ±20% × share_elec | ±0.4-0.6% |
share_feed = feedCost / annualOpex。
对虾项目 share_feed 可能仅 35%, 罗非鱼项目可能 65%, 不同鱼种敏感性表会自动调整。
注意 share 是说明 项目特定 的敏感性, 不是计算公式 (计算还是 OPEX × ±20%, 只是用 share 解释"为什么饲料 ±20% 只让 IRR 摆动 ±1.5%而不是 ±5%")。
注: 折现率不影响 IRR (IRR 是让 NPV=0 的折现率, 与折现率参数无关), 故不在敏感性表中。 但折现率会影响 NPV——折现率越高, NPV 越低。
结果按 IRR 摆动从大到小排序, 自动绘制 Tornado 图 (横向条形图)。 设计院通常拿这张图给业主看"这个项目的最大风险因子是什么"——RAS 项目永远是售价。
用 v1.3 默认参数计算的方案数据 (CAPEX 14681 万 / 年 OPEX 2236 万 / 年折旧 1360 万), 售价 60 元/kg, 30% 自有 + 70% 贷款 (5%, 8 年), 折现率 8%, 项目 15 年:
| 指标 | 数值 | 解读 |
|---|---|---|
| 全投资 IRR | 14.0% | > 折现率 8%, 财务可行 ✓ |
| 自有资金 IRR | 20.5% | 贷款杠杆放大 6.5% |
| NPV @ 8% | 6878 万元 | 正值, 创造 6878 万元股东价值 |
| 静态投资回收期 | 6.3 年 | RAS 项目典型水平 |
| 动态投资回收期 | 9.0 年 | 含折现影响 |
| 盈亏平衡产量 | 63.4% 满产 | 实际产量打 7 折也能保本, 安全裕度大 |
| 因子 | 低值 IRR | 基准 IRR | 高值 IRR | 摆动 |
|---|---|---|---|---|
| 售价 ±20% | 8.0% | 14.0% | 19.1% | 11.1% |
| CAPEX ±20% | 17.6% | 14.0% | 11.3% | 6.3% |
| 产量 ±10% | 12.3% | 14.0% | 15.6% | 3.3% |
| 饲料成本 ±20% | 15.2% | 14.0% | 12.7% | 2.5% |
| 电费 ±20% | 14.4% | 14.0% | 13.5% | 0.9% |
用同样的 1000 t 规模, 不同鱼种和价格:
| 鱼种 | 售价 元/kg | 全投资 IRR | 自有 IRR | NPV 万元 | 回收期 | 结论 |
|---|---|---|---|---|---|---|
| 三文鱼 | 60 | 14.0% | 20.5% | 6878 | 6.3 年 | 主流, 可行 |
| 三文鱼 (高端) | 80 | 22.2% | 37.1% | 18150 | 4.5 年 | 有溢价能力, 优秀 |
| 大菱鲆 | 80 | 38.0% | 73.2% | 28873 | 3.0 年 | 毛利高 (国内底栖鱼供需) |
| 罗非鱼 | 22 | −2.5% | −6.1% | −6798 | 不回本 | RAS 不适合罗非, 池塘已够便宜 |
这张表能直接告诉投资人: 不要用 RAS 养罗非鱼 — 不是技术问题, 是经济问题。 RAS 适合高单价 (> 40 元/kg) + 集约化要求高 (海水/北方/特殊品种)的鱼种。
finance.html 用 SheetJS 库 (CDN 加载) 实现一键导出 Excel, 输出 7 个工作表:
设计院拿到 Excel 后可以:
v1.4 财务评价的当前局限:
未来 v1.5+ 可能扩展的方向:
但所有扩展之前的前提是: v1.4 当前版本被实际用户用过, 反馈了真实问题。设计院、咨询公司、业主用一个月, 告诉我们哪里反人类、哪里数字对不上、哪里需要补字段——这才是优先级最高的下一步。
v1.4 之前的 iRAS 输出层级是工程数据(P&ID + 设备清单 + 财务评价 Excel), 用户拿到这些数据后还需要手动整合到 Word 可研报告里。 这是 RAS 项目从"概念"到"立项"过程中的最大手工劳动:
v1.5 加入可研报告生成器 (report.html), 把 iRAS 的工程和财务数据自动套到 16 章扩展版可研模板中, 输出 .docx 文档。 设计院拿到后只需补充项目身份、场址自然条件、土建详细设计等"必须人工填写"的内容即可。 预期能把可研撰写时间从 1-2 个月压缩到 1-2 周。
v1.5 在设计阶段做了 10 个产品决策, 每个决策都直接影响实现方式:
<script type="text/njk-template">(保持 iRAS 单文件部署传统)v1.5 覆盖发改委可研编制规范的扩展 16 章。各章自动化率(数据来自 iRAS 自动填充的比例):
| 章 | 名称 | iRAS 自动化率 | 主要数据来源 |
|---|---|---|---|
| 1 | 总论 | 85% | 项目元数据(20 字段)+ 工程财务汇总 |
| 2 | 项目背景与建设必要性 | 50% | 鱼种条件分支 + 用户填地区描述 |
| 3 | 市场分析与建设规模 | 60% | 鱼种市场概述 + 规模配置 |
| 4 | 建设场址与建设条件 | 30% | 大量 placeholder, 用户填具体场址 |
| 5 | 工艺技术方案 | 95% | iRAS 工艺数据完整覆盖 |
| 6 | 主要设备方案 | 100% | iRAS 设备清单完整覆盖 |
| 7 | 土建/总图/公用工程 | 50% | 车间面积/电力负荷自动 + 详细土建用户填 |
| 8 | 节能节水 | 70% | 用水量/电耗自动 + 节能措施模板 |
| 9 | 环境影响评价 | 60% | 排放估算自动 + 现状用户填 |
| 10 | 劳动安全卫生与消防 | 40% | 危险源识别 + 应急预案模板, 不替代安评 |
| 11 | 项目实施与组织机构 | 65% | 进度甘特表 + 人员配置(规模分支) |
| 12 | 投资估算与资金筹措 | 95% | iRAS 投资数据完整覆盖 |
| 13 | 财务评价 | 100% | iRAS finance.html 数据完整覆盖(8 张标准财务表 + NPV/IRR + 敏感性) |
| 14 | 国民经济 / 社会效益评价 | 50% | 就业/税收/产业链估算(简化版社会效益) |
| 15 | 风险分析 | 70% | 4 类风险识别 + 敏感性 + 风险等级条件分支 |
| 16 | 结论与建议 | 80% | 整体结论模板 + 关键指标条件分支 |
加权平均自动化率约 70%, 用户需要补充的主要是: 项目身份(20 字段)、场址自然条件、土建详细设计、消防/环评/安评等专项内容(后三者必须由有资质机构出具)。
模板里所有变量按以下命名空间组织:
| 命名空间 | 来源 | 主要字段 |
|---|---|---|
{{ project }} | 用户在 report.html 表单填写 | 项目名/业主/地址/编制单位/资质等 20 字段 |
{{ farm }} | iRAS 主页面方案 | 鱼种/规模/各阶段配置/池数/池径反推/总存塘等 |
{{ workflow }} | iRAS perStage 工艺数据 | RDF/BF/UV/CO₂/增氧锥/蛋分/反硝化/AOP/集水池 |
{{ thermal }} | iRAS 热平衡求解(预留) | 气候/围护/COP/工况(v1.5.x 完善) |
{{ capex }} | iRAS 投资估算 | 设备直购/土建/流动资金/总投资 |
{{ opex }} | iRAS 运行成本 | 年 OPEX/综合成本/折旧/电耗/液氧 |
{{ finance }} | finance.html 计算逻辑 | params(17 个用户参数)+ indicators(6 个 KPI)+ tables(8 张表) |
{{ meta }} | 报告元信息 | 生成时间/iRAS 版本/模板版本 |
二批把模型告警做成结构化 configWarns 时就写明"报告侧消费"是目标形态。
下游审计发现实际情况比"未消费"更严重一档:
configWarns / aeration /
aerIntensity / 入室 CO₂ 四组量全都不在导出 payload 里 ——
报告侧想消费也没得消费。于是"报告照出成本、不带任何不可行标记"这句话
是字面成立的: 用户拿着一份 CO₂ 超标、曝气强度超限的方案,
可研报告里一个字都不提, 而经济指标照算照印。
v2.3.3 打通三段: 主页面过桥(断言 Y0–Y3 判逐位相等 —— 过桥是纯搬运,
任何差异都说明中间有人加工了, 而加工正是双源漂移的起点)→ 报告侧
warnings 命名空间归集 → 正文呈现。
| 命名空间 | 来源 | 主要字段 |
|---|---|---|
{{ warnings }} | iRAS perStage[].configWarns + indoorCO2 | items(逐条: 阶段/级别/问题/实测与判据/建议处置)· count · hasDanger · room(车间 CO₂ 与新风量) |
⚠ 本层只归集与措辞, 不判定。判据全在主页面数据层(结果级 + 零新阈值); 若日后有人在报告侧加一条"报告独有"的判定, 那就是双源的开始。
三种取向都考虑过, 最终取显式披露:
| 取向 | 做法 | 为什么没选 / 选了 |
|---|---|---|
| 硬阻断 | 检出严重告警就拒绝生成报告 | 没选。"我知道超标, 就是要出个初稿"是正常用法; 挡住它只会让人绕过工具, 而绕过之后连告警都看不到了 |
| 显式披露 | 固定新增一节, 有则逐条列、无则明写"未检出配置级告警" | 选了。让"这份报告有没有被检出问题"成为读者一定会看到的事实, 而不是需要去翻的东西 |
| 就地标注 | 相关章节旁注 | 一并选了。保证"看得见的地方就是该看的地方" |
落地为三处:
check_downstream_contract.js 的 C3 与 C4 有意不同源 ——
C3 是静态判据(代码里写了 warnings 命名空间、15.5 小节、hasDanger 分支),
C4 是运行时判据(拿一份必然带告警的方案真的渲染一遍, 检查正文里确实印出了告警条目)。
C3 防"删代码", C4 防"写了但被某个 if 挡住、谁也没发现"。
C4 另配两份取样: A 只带 warn 级、B 必带 danger 级, 后者专验结论章的措辞降级 ——
只有 A 时该判据没有工况能走到。
| 图 | 位置 | 内容 |
|---|---|---|
| 图 5-1 | 第 5 章 5.2 工艺流程 | 6 个主流程方框 + 主循环 + 旁路单元(条件显示)+ 关键参数表 |
| 图 13-1 | 第 13 章 13.6.1 全投资现金流 | 实线全投资 + 虚线自有资金, 含 0 轴线、网格、节点标记 |
| 图 13-2 | 第 13 章 13.11 敏感性分析 | 5 因子 Tornado 图, 按 IRR 摆动从大到小排序 |
图表生成路径: 浏览器侧 SVG → Canvas → PNG → docx ImageRun。中文字体使用系统 SimHei/Microsoft YaHei, 高清 2× DPR 渲染。
三文鱼 1000 t/年项目, 用 v1.5 生成的可研报告大致规格:
| 项目 | 数值 |
|---|---|
| 文件大小 | 约 200-400 KB(含 3 张 PNG 图) |
| 章节数 | 16 章 + 封面 |
| 段落数 | 约 800 段 |
| 表格数 | 约 50 个 |
| 列表项 | 约 380 个 |
| 粗体强调 | 约 600 处 |
| 页数(Word 默认排版) | 约 60-80 页 |
v1.5 当前局限:
未来 v1.5.x / v1.6+ 可能扩展:
但所有扩展前提是: v1.5 当前版本被实际用户使用过, 反馈了真实问题。
本附录列出 iRAS 所有版本 (v1.0 → v1.7) 使用的全部符号。
| 符号 | 含义 | 单位 | 默认值 / 范围 |
|---|---|---|---|
| 质量平衡 + 浓度 | |||
| Δ | 每循环污染物增量 | mg/L | — |
| R | 总通过率 | — | — |
| C_out | 鱼池出水浓度 | mg/L | — |
| C_in | 回水浓度 | mg/L | — |
| η_rdf | RDF TSS 去除率 | % | 75 |
| η_bio | BF TAN 硝化率 | % | 70 |
| η_bioTSS | BF TSS 去除率 | % | 20 |
| VTR₂₀ | BF @20°C 容积去除率 | g/(m³·d) | 500 |
| VDR₂₀ | 反硝化 @20°C | g/(m³·d) | 800 |
| θ_nit / θ_den | 温度系数 | — | 1.10 / 1.08 |
| f_sal | 盐度修正 | — | max(1−0.01S, 0.3) |
| SOTE | 氧传质效率 | % | 粗孔 8% / 微孔 18% |
| tanCoef | TAN 系数 | — | 0.092 (淡) / 0.110 (海水肉食) |
| RQ | 呼吸商 | — | 1.0 |
| v1.1 物理框架 | |||
| o2BaseFactor | 20°C 基准 | — | 0.13-0.32 (按物种) |
| o2Q10 | 温度敏感 | — | 2.0 (鱼) / 1.3 (虾) |
| o2FishFactor | 生效值 | — | base × Q10^((T−20)/10) |
| o2DOMfactor | 异养菌耗氧 | — | 0.10 (可调 0.05-0.20) |
| peakFactor | 日内峰均比 | — | 1.5 |
| safety* | 工程安全系数 | — | 1.10-1.15 |
| COP_heat / cool | 热泵 | — | 4.0 / 3.0 |
| η_HX | 板换回收率 | % | 75 |
| co2BlowerPressure | CO₂ 风压 | kPa | 2.5 |
| co2BlowerEfficiency | CO₂ 风机效率 | % | 60 |
| depYearsEquip | 设备折旧 | 年 | 8 |
| depYearsCivil | 土建折旧 | 年 | 20 |
| V_tank | 鱼池水体 | m³ | biomass / density |
| V_process | 工艺水体 | m³ | 各设备水量合计 |
| V_total | 系统总水体 | m³ | V_tank + V_process |
| v1.2 全局气候 + 围护 | |||
| T_air_design_winter | 设计冬季气温 | °C | -7 (青岛) |
| T_air_design_summer | 设计夏季气温 | °C | 32 (青岛) |
| T_air_annual | 年均气温 | °C | 13 (青岛) |
| T_source_design_winter | 设计冬季源水温 | °C | 4 |
| T_source_design_summer | 设计夏季源水温 | °C | 24 |
| T_source_annual | 年均源水温 | °C | 14 |
| T_ground | 地温(年均近似) | °C | = T_air_annual |
| RH_winter / summer / annual | 3 工况相对湿度 | % | 60 / 78 / 70 |
| U_wall | 墙保温系数 | W/(m²·K) | 0.8 |
| U_roof | 屋顶保温系数 | W/(m²·K) | 0.6 |
| U_floor | 地板保温系数 | W/(m²·K) | 0.8 |
| U_window | 窗保温系数 | W/(m²·K) | 2.5 |
| windowRatio | 窗墙比 | — | 0.05 |
| airChangeRate (ACH) | 通风换气次数 | 1/h | 1.0 |
| ventHeatRecovery | 排风热回收效率 | — | 0 (国内) / 0.7-0.85 (北欧) |
| poolCover | 池盖类型 | — | none(1.0)/partial(0.4)/full(0.1) |
| buildingArea_user | 用户指定车间面积 | m² | 0(自动 = 1.6 × poolArea) |
| buildingHeight | 车间净高 | m | 6 |
| thermalScenario | 当前工况 | — | design_winter / design_summer / annual |
| climateRegion | 地区预设 | — | china_qingdao / china_hainan / norway_bergen / … |
| envelopePreset | 围护预设 | — | industrial_standard / nordic_premium / cheap |
| hpType | 热泵类型 | — | air / water / ground / seawater_open |
| v1.2 双节点稳态求解 | |||
| T_room | 车间空气温度(求解输出) | °C | T_air + 5~12 |
| RH_room | 车间相对湿度(求解输出) | % | 55-80 |
| W_room | 车间空气含湿量(求解输出) | kg/kg | 0.008-0.020 |
| m_evap | 蒸发率(负值=凝结) | kg/(m²·s) | ±2-50 ×10⁻⁵ |
| UA_envelope | 围护总 UA(墙+顶+窗) | W/K | 500-2000 |
| UA_pool | 池散热 UA | W/K | poolU × poolArea |
| poolU | 池水对空气换热系数 | W/(m²·K) | 5(室内)/ 18(室外) |
| v1.3 模块化 + 鱼池配置 | |||
| subSystemCount | 阶段并联套数(用户输入) | — | 1-10, 默认 1 |
| numModules | 实际模块数 = subSystemCount | — | ≥ 1 |
| poolsPerSet | 每套池数(用户输入) | — | 1-10, 默认 1 |
| poolDepth_m | 单池深度(用户输入, 统一数据源) | m | 0.5-8, 默认 = recDepth_m |
| recDepth_m | 鱼种推荐池深(SPECIES_DB) | m | 0.8-7.0(按鱼种和阶段) |
| v1.3.x 新增 | |||
| thermalSharingFactor | 共用车间散热系数 | — | 0.5-1.0, 默认 0.75 |
| V_sump | 集水池容积 | m³ | clamp(Q/30, 20, 200) |
| v1.4 投资财务评价 (finance.html) | |||
| price (元/kg) | 售价 | 元/kg | 按鱼种 (鲑 60, 大菱鲆 80, 罗非 22, 等) |
| years | 项目评价年限 | 年 | 5-30, 默认 15 |
| ramp1/2/3 | 逐年达产率 | % | 30 / 70 / 100 (默认) |
| buildYears | 建设期 | 年 | 0.5-3, 默认 1 |
| workingCap | 流动资金 (% × 年 OPEX) | % | 0-50, 默认 15 |
| ownPct | 自有资金比例 | % | 0-100, 默认 30 |
| loanRate | 贷款利率 | % 年 | 0-15, 默认 5 |
| loanMethod | 还款方式 | — | 等额本息 / 等额本金 |
| loanYears | 还款年限 | 年 | 1-20, 默认 8 |
| discount | 折现率 (用于 NPV) | % 年 | 0-20, 默认 8 |
| taxRate | 所得税率 | % | 0-35, 默认 25 |
| salesTax | 销售税金附加 | % | 0-20, 默认 0 (农产品免征) |
| repairRate | 修理费率 | % × 设备/年 | 0-10, 默认 2 |
| adminRate | 管理费率 | % × 销售收入 | 0-20, 默认 3 |
| laborCost | 人工成本 | 元/年 | 按规模估, 30-360 万元/年 |
| NPV | 净现值 | 元 | = Σ CF[t]/(1+r)^t, r=discount |
| IRR | 内部收益率 | % | 令 NPV=0 的折现率, Newton-Raphson 求解 |
| BEP | 盈亏平衡产量 | % 满产 | 满产年净利润=0 时的产量比例 |
| v1.7 氧锥拓扑 + 系统排水 | |||
| o2ConeTopology | 氧锥工艺拓扑 | — | mainline / bypass, 默认 mainline |
| o2ConeHeadLoss_m | 主路时氧锥附加压头 | m | 3, 钳 [0, 15] |
| o2BypassRatio | 旁路占比 (bypass 模式) | % | 10, 钳 [5, 30] |
| o2BypassPumpHead_m | 旁路泵 P-602 扬程 | m | 20, 钳 [5, 40] |
| o2BypassPumpEta | 旁路泵效率 | % | 60, 钳 [30, 85] |
| aopO3Dose_gm3 | AOP 臭氧投加剂量 | g O₃/m³ | 0.5, 钳 [0.1, 3.0] (v1.7 暴露字段, UI v1.8) |
| sim.discharge.V_m3_d | 系统排水日流量 | m³/d | = V_total × exchangeDaily (v1.7 重构) |
| sim.discharge.TSS_kg_d | 系统排水 TSS 日量 | kg/d | = load.tssDaily (质量守恒, 含污泥) |
| sim.discharge.TAN_mg_L | 系统排水 TAN 浓度 | mg/L | = C_tank (溶解态) |
| sim.discharge.NO3_mg_L | 系统排水 NO₃ 浓度 | mg/L | = C_tank (溶解态) |
iRAS 全局热配置(globalThermalConfig)字段一览 (含 v1.9.2 新增的通风与除湿参数、v1.9.3 换代的自然冷却参数、v2.0.0 新增的车间与接触器参数):
| 字段名 | 类型 | 默认值 | UI 位置 | 说明 |
|---|---|---|---|---|
| climateRegion | 下拉 | china_qingdao | 地区预设 | 选择后自动填 T_air/T_source/RH |
| thermalScenario | 下拉 | design_winter | 当前工况 | 3 个工况切换 |
| envelopePreset | 下拉 | industrial_standard | 围护预设 | 选择后自动填 U 值 |
| hpType | 下拉 | air | 热泵类型 | 4 种 |
| T_air_design_winter | 数值 | -7 | 气温区 | °C |
| T_air_design_summer | 数值 | 32 | 气温区 | °C |
| T_air_annual | 数值 | 13 | 气温区 | °C |
| T_source_design_winter | 数值 | 4 | 源水温区 | °C |
| T_source_design_summer | 数值 | 24 | 源水温区 | °C |
| T_source_annual | 数值 | 14 | 源水温区 | °C |
| RH_winter | 数值 | 60 | 湿度区 | % |
| RH_summer | 数值 | 78 | 湿度区 | % |
| RH_annual | 数值 | 70 | 湿度区 | % |
| U_wall | 数值 | 0.8 | 围护区 | W/(m²·K) |
| U_roof | 数值 | 0.6 | 围护区 | W/(m²·K) |
| U_floor | 数值 | 0.8 | 围护区 | W/(m²·K) |
| U_window | 数值 | 2.5 | 围护区 | W/(m²·K) |
| windowRatio | 数值 | 0.05 | 围护区 | 窗墙比 |
| airChangeRate | 数值 | 1.0 | 围护区 | ACH (1/h) |
| ventHeatRecovery | 数值 | 0 | 围护区 | 0-0.85 |
| VTR20 | 数值 | 500 | 工艺参数区 | 20°C 容积 TAN 去除率 g/(m³·d)。工程经验取值,具体项目应按填料厂家或设计单位数据覆盖。见 10.2 |
| thetaNit | 数值 | 1.10 | 工艺参数区 | 硝化温度修正系数。见 10.2 |
| VDR20 | 数值 | 800 | 工艺参数区 | 20°C 容积反硝化速率 g NO₃-N/(m³·d)。见 10.2 |
| thetaDen | 数值 | 1.08 | 工艺参数区 | 反硝化温度修正系数。见 10.2 |
| maintenanceRate v1.9.2 | 数值 | 4.5 | 运营费率区 | 维护与备件 %/年。国产设备口径;进口高端交钥匙取 2-3 |
| maintenanceBase v1.9.2 | 下拉 | equipPlusInstall | 运营费率区 | 维护费基数:equipOnly / equipPlusInstall(×1.6,剔土建) / totalProject |
| insuranceRate v1.9.2 | 数值 | 0.8 | 运营费率区 | 保险 %/年,按工程总投资计 |
| overheadRate v1.9.2 | 数值 | 5.0 | 运营费率区 | 管理费 %,基数含苗种与人工 |
| laborProductivity v1.9.2 | 数值 | 60 | 运营费率区 | 劳动生产率 t/(人·年)。NOAP 约 22,FI 美国场约 127 |
| laborCostPerPerson v1.9.2 | 数值 | 150000 | 运营费率区 | 人均年成本 元,含社保福利 |
| laborBaseCrew v1.9.2 | 数值 | 8 | 运营费率区 | 最小班组人数(24h 值守下限) |
| waterPriceFresh / Seawater v1.9.2 | 数值 | 3.0 / 0.5 | 单价区 | 补水单价 元/m³,按阶段盐度自动选用 |
| dischargePrice v1.9.2 | 数值 | 2.0 | 单价区 | 排污处理 元/m³ |
| seedPrice v1.9.2 | 数值 | 随鱼种 | 单价区 | 苗种 元/尾。切换鱼种自动带出默认值(鲑鱼卵 1.5 / 玻璃鳗 20 / 虾苗 0.03 等) |
| co2IndoorLimit_ppm v1.9.2 | 数值 | 1500 | 围护区 | 车间 CO₂ 设计限值 ppm, 800-5000。用于按鱼载荷反算新风需求下限 |
| degasserExhaustIndoorFrac v1.9.2 v2.0 废弃 | 数值 | 0.2 | 围护区 | 脱气塔尾气入室比例 0-1。0 = 管道直排室外, 1 = 全部排入车间 |
| dehumEnabled v1.9.2 | 开关 | false | 围护区 | 是否配置机械除湿机 |
| dehumTargetRH v1.9.2 | 数值 | 70 | 围护区 | 除湿控制目标 RH %, 40-90 |
| dehumSMER v1.9.2 | 数值 | 2.5 | 围护区 | 比除湿效率 kg水/kWh, 0.5-6 |
| dehumCondRecovery v1.9.2 | 开关 | true | 围护区 | 冷凝水是否回收作补水 |
| dehumHeatDest v1.9.2 | 下拉 | outdoor | 围护区 | 冷凝热去向: outdoor / indoor / water |
| poolCover | 下拉 | partial | 围护区 | none / partial / full |
| buildingArea_user | 数值 | 0(自动) | 围护区 | 0 = 自动估算 |
| buildingHeight | 数值 | 6 | 围护区 | m |
| thermalSharingFactor | 数值 | 0.75 | 围护区 | 0.5-1.0, 共用车间散热系数 |
| freeCoolingEnabled | 下拉 | true | 围护区 | 自然冷却开关。关闭则强制全部走机械压缩制冷(保守) |
| roomRH_set v2.0.0 | 数值 | 65 | 围护区 | 车间设定相对湿度 %。T_room = T_w 后,池面蒸发只依赖本参数。区间依据:ASHRAE Ch.6 泳池馆 50–60%;CJJ 122 与国际泳池标准 50–70%;实测 RAS 车间(AQUAIR 开放数据集)中位 87% |
| contactorRecovery v2.0.0 | 数值 | 0 | 围护区 | 气液接触器排气热回收率 0–0.95。排气为水温饱和空气、焓值高,适合回收。⚠ 默认 0 = 不回收 |
| hvacEnabled v2.0.0 | 布尔 | true | 围护区 | 车间围护+通风显热是否计入能耗。置 false 退回「界外」口径(供暖通专业单独计列的项目) |
| co2StripperEffMode v2.0.0 | 枚举 | manual | 脱气塔 | manual = 沿用 co2StripperEff(与 v1.x 逐位一致);auto = 按 Timmons Ch.10 Fig 10.13/10.14/10.17 曲线自动算 |
| co2PackingHeight_m v2.0.0 | 数值 | 1.5 | 脱气塔 | 填料层高度 m,范围 0.3–3.0。Ch.10 p.245:设计高度限于 1.0–1.5 m,超 1.5–2.0 m 收益递减。⚠ 填料深度超 1 m 时建议水力负荷取偏低端以降低风机背压 |
| co2MaxAttainableEff v2.0.0 | 数值 | 80 | 脱气塔 | 该装置在 G:L = 20 时的最大可达单次去除率 %(Fig 10.13 约 80%) |
| co2Outdoor_ppm v2.4 | 数值 | 450 | 全局 | 室外 CO₂ 本底 ppm,范围 300–5000。两个消费点:车间新风稀释基准 dC = 车间限值 − 本底;脱气塔 auto 模式的进风本底。⚠ v2.4 起本字段替代已撤销的 co2IntakeCO2_ppm(原默认 350,无 UI 框,其钳制从未执行过)—— 二者本是同一物理量的两份口径、值还不一样。合并前提:工艺气路全程不碰车间,塔进风即室外空气(Fig 10.17:进风本底 1000 ppm 时去除率降 10%、5000 ppm 降 70%,这是「尾气必须排室外、不得回车间」的量化依据;若日后允许塔进风取自车间,须拆回两层)。⚠ 取小是不安全方向:本底越小 dC 越大、通风量算得越小。全球本底≈420 且逐年 +2.5;城郊 450–500;城市/工业区实测常年 500–700 |
| fcDesignDT_K v1.9.3 | 数值 | 留空=自动 | 围护区 | 自然冷却设计温差 K —— 单独扛满设计负荷所需的冷源-水温差。留空按热源自动取:空气 11 / 水·海水 4 / 地源 6。取代 v1.9.2 的 freeCoolingApproach_K(语义由「阈值」变为「换热能力刻度」) |
| fcAnnualK_air v1.9.3 | 数值 | 0.65 | 围护区 | 年化正弦振幅折减,仅作用于空气源;水/海水/地源固定 1.0。见 D 节 |
| freeCoolingEER | 数值 | 20 | 围护区 | 自然冷却设计点 EER,仅含冷源侧风机与泵的增量功率。干冷器 15-25,板换+冷源水可更高 |
iRAS 完全采用 ISA-5.1 规范 tag 命名(字母+数字), 字母含义:
| 首字母 | 含义 | 示例 |
|---|---|---|
| T | Tank 储罐 / 池 | T-101 鱼池 |
| F | Filter 过滤器 | F-201 微滤 |
| B | Biofilter / Bio-reactor 生物反应器 | B-301 MBBR |
| K | Kompressor 压缩机/风机 | K-101 鱼池增氧风机 v1.7 / K-201 CO₂ 风机 / K-302 BF 风机 |
| D | Disinfection 消毒 | D-401 UV |
| C | Column 塔/柱 | C-501 CO₂ 脱气塔 |
| S | Separator / Sump 分离 / 集水 | S-101 集水池, S-701 蛋分 |
| A | Aerator / Absorber 增氧 / 吸收 | A-601 增氧锥 |
| R | Reactor 反应器 | R-801 反硝化 |
| X | eXtra / 高级处理 | X-901 AOP |
| G | Generator 发生器 | G-901 O₃ |
| V | Vessel 大型容器 / 储罐 | V-901 液氧站级储罐 |
| H | Heat 热相关 | H-801 热泵 |
| P | Pump 泵 | P-101 主循环泵 / P-602 氧锥旁路泵 v1.7 |
| M | Mixer 混合点 / 管段配件 v1.7 | M-601 bypass 模式氧锥旁路混合点 (T 接头) |
| tag 前缀 | 类型 | 示例 |
|---|---|---|
| DO | 溶解氧 | DO-101 鱼池 DO 探头 |
| pH | pH 计 | pH-102 鱼池 pH |
| TT | 温度变送器 | TT-103 鱼池温度 |
| LT | 液位变送器 | LT-104 鱼池液位 |
| PDS | 压差开关 | PDS-201 RDF 压差 |
| AT | 分析变送器 | AT-302 BF 出口 TAN |
| FT | 流量变送器 | FT-101 主管流量 |
iRAS 内置 9 个物种 (含 custom), 这里展示主要 4 种, 完整见软件。
| 品种 | 阶段 | 体重(g) | 月 | FCR | 蛋白% | feed% | 密度 | T°C | 盐‰ | recDepth_m |
|---|---|---|---|---|---|---|---|---|---|---|
| 三文鱼 | 苗种 | 0.1→50 | 6 | 1.0 | 50 | 3.0 | 30 | 12 | 0 | 1.5 |
| 幼鱼 | 50→500 | 8 | 1.1 | 45 | 1.5 | 50 | 14 | 0 | 3.0 | |
| 中鱼 | 500→2000 | 6 | 1.2 | 42 | 1.0 | 60 | 15 | 12 | 5.0 | |
| 成鱼 | 2000→5000 | 4 | 1.20 | 40 | 0.95 | 70 | 15 | 30 | 7.0 | |
| 大菱鲆 v1.1 | 苗种 | 3→50 | 4 | 0.9 | 55 | 3.0 | 25 | 16 | 28 | 0.8 |
| 中鱼 | 50→250 | 8 | 1.1 | 50 | 1.5 | 50 | 16 | 28 | 1.0 | |
| 成鱼 | 250→600 | 6 | 1.3 | 48 | 0.9 | 60 | 16 | 28 | 1.0 | |
| 加州鲈 | 苗种 | 1→50 | 2 | 0.9 | 50 | 3.5 | 25 | 25 | 0 | 1.5 |
| 中鱼 | 50→250 | 4 | 1.1 | 45 | 1.8 | 40 | 25 | 0 | 2.5 | |
| 成鱼 | 250→600 | 4 | 1.3 | 40 | 1.2 | 50 | 25 | 0 | 3.0 | |
| 对虾 | 苗种 | 0.01→1 | 1 | 1.0 | 45 | 10 | 2 | 30 | 15 | 1.5 |
| 养前 | 1→10 | 1.5 | 1.3 | 42 | 5 | 8 | 30 | 15 | 2.0 | |
| 养后 | 10→30 | 1.5 | 1.6 | 38 | 3 | 15 | 30 | 15 | 2.5 |
完整 9 物种 (含罗非鱼/石斑鱼/鳗鲡/鳜鱼) 见 iRAS 软件内置数据库。recDepth_m 是 v1.3 新增的鱼种推荐池深字段。
本工具(iRAS)和本手册的计算结果仅供工程概算参考。
— 本手册全文完 —
© 2026 海南登登科技咨询有限公司 · 孙程
iras.cn · iras.dengdengtech.cn (国内) · github.com/chengsunmail/iras · 6881509@qq.com
本手册整合 iRAS v1.0 → v1.5 全部内容 · 完整版