Contents — find the section you need
Change parameters and verify
Open the panel, then press Run to load Python. You can stop execution and reset parameters. Results are computed on this device. No Python installation is required.
Local execution steps below are optional for reproducing the source results; they are not required for the browser experiment.
The experiment controls are in English.
两个浏览器实验
上方面板运行的是制冷响应实验:更改执行器时间常数、照明显热和制冷能力。0/300/900/1800 秒的预设会将其他输入保持在其公开的基线值。温度和指令/实际制冷量分别绘制。无需安装 Python;下方的本地复现命令为可选项。
耦合控制面板针对每一次参数变化都同时运行开关式和 PI 两种控制。六张独立的条形图分别比较超出区间时间、制冷/除湿指令重叠、制冷热量、除水量和执行器变化量。每张图都有各自的单位和比例尺。A/B 会保存一整对控制器结果,因此控制器比较和条件变化这两者保持独立。完整指标、数值序列、下载内容和共用条件在两个实验室中均可获取。
制冷响应保留了原始的 12 小时模型、10 秒室内欧拉步长以及精确的区间平均一阶执行器更新。灯光在 2 小时和 8 小时切换;初始/设定温度为 24°C,室外 22°C,基础热量 800 W,热容量 12 MJ/K,UA 为 300 W/K,PI 增益固定为 0.6 和 0.0004。所有原始样本均已绘制,包括最终保持的指令值。评估区间仍为 23–25°C。误差和超区间时间使用区间起点值;极值包含端点。该模型不包含湿度和传感器滞后。
耦合控制保留了 24 小时、60 秒显式步长,灯光在 08–24 点开启,初始状态为 24°C/RH70%,300 m³,12 MJ/K,UA 为 450 W/K,通风量 0.05 m³/s。室外温度为 21±6°C、RH60%;光照/黑暗期蒸腾量分别设定为 2/0.35 kg/h。开关阈值仍为 23.5/24.5°C 和 RH65/75%;PI 目标仍为 24°C/RH70%,采用原始固定增益和条件积分。超区间判定使用更新后的状态与 23–25°C 和 RH60–80% 比较。总变化量是指令绝对变化量之和,而非切换次数。原始的重叠指标即使室内再加热设为零,也会统计正的制冷和除湿指令。
耦合模型在更新温度之前,以前一步温度为基准对饱和水量设置上限;它不会在制冷之后重新平衡凝结,也不会返还凝结热。制冷仅为显热制冷;除湿是一个规定的质量汇,配有独立的再加热。该模型没有盘管模型、执行器延迟、传感器动力学或二氧化碳耦合。这两个实验室是两个独立的合成实验,不可互换配置。热量千瓦时并非电量,边界值/预设是教学性假设,而非作物设定或设备选型。原始内核、配置、压缩包和参考结果均保持不变。
cooling: experiment.py · cooling_kernel.py · config.json
coupled: experiment.py · coupled_kernel.py · config.json
CEA 温湿度控制——为什么制冷、除湿和通风会相互影响
温度和相对湿度可以有各自的目标值,但执行器很少只影响其中一个量。制冷盘管去除显热,并可能在露点以下凝结水分。一些除湿设备在收集水分的同时会将显热返还室内。通风会根据室外条件同时带走或带入温度、水汽和二氧化碳。因此,独立的温度和湿度开关可能会相互对抗。
图示:Duskcoil。这是一个与具体设备配置无关的责任层级示意图。
将状态与指令分开
热平衡实验室存储室内温度 T;水分平衡实验室存储水汽质量 m_v。相对湿度仍是派生量,而非另一个守恒状态。
| 指令 | 典型温度影响 | 典型水分影响 | 需一并测量的内容 |
|---|---|---|---|
| 制冷 | 去除显热 | 在盘管露点以下凝结 | 送风温度、冷凝水 |
| 除湿 | 可能在室内再加热 | 去除水分 | 收集的水量、排热、功率 |
| 通风 | 因室内外温差而升温或降温 | 增加或减少水汽 | 室外温度/相对湿度、二氧化碳、气流量 |
| 加热/再加热 | 增加显热 | 无直接质量变化 | 相对湿度随温度变化而下降 |
| 加湿 | 蒸发可能消耗潜热 | 增加水分 | 补给水、雾滴、卫生状况 |
美国能源部暖通空调指南 区分了显热控制和潜热控制,并描述了过度制冷/再加热之间的相互作用。俄克拉荷马州立大学推广部 同样将温室通风视为温度和湿度管理的一部分。
监督机制可防止意外冲突
由湿度触发的制冷之后紧跟由低温触发的加热,可能导致制冷和加热同时运行。这并不必然是错误的——有意的再加热可以降低湿度——但意图、允许的持续时间和能耗成本必须能够区分一种设计好的模式与相互抵消的控制器。
一个最简监督器可以明确优先级:
- 传感器故障、结露和设备保护约束
- 硬性温度和绝对水分限值
- 正常的目标区间和滞环
- 允许或禁止同时运行的条件
- 功率限值以及诸如通风导致二氧化碳流失等副作用
控制器比较的可接受条件
开关式、基于规则和 PI 三种比较必须共用天气、规定的蒸腾量、LED 照明计划和初始状态。固定执行器容量、最短运行/关闭时间、延迟、饱和度以及功率或收集水量的核算方式。分别报告超出温度和相对湿度区间的时间、结露、切换次数、同时加热/制冷的时间和能耗。仅一个平均误差是不够的。
拒绝那些悄悄裁剪传感器数据、保持缺失值而不声明、或仅向一个控制器提供未来天气数据的运行结果。同样应拒绝违反基础能量或水分残差检验的运行结果。
这是控制设计的入门内容,并非特定作物的设定值或设备建议。下一个实现应在一个仿真中仅耦合热量和水分两个状态,同时将二氧化碳作为独立的受监测约束保留。
参考文献
温湿度传感器——位置、响应与校准
控制器看到的是哪个温度?
制冷响应实验室 将制冷指令与实际输出的制冷量分开。其控制器当时仍直接接收模型的当前温度。而在迈向真实设施时,还需要将物理环境、传感器读数以及传递给控制的值三者分开。
考虑一个理想的空气温度阶跃,从 24°C 变为 26°C,并用一个 60 秒一阶时间常数的测量系统建模。30 秒后,其读数为 24.787°C。将该读数与 25°C 比较会遗漏输入中已经存在的超限情况。这是一个用于说明的解析计算,并非设施数据或产品规格。
本文是一篇测量设计指南。它不会重新运行前述的闭环实验室,也不对产品进行排名,其示例阈值也不是作物推荐值。
为每个测量位置赋予明确目的
将种植区、送风和回风的读数简单地取一个平均值,会抹去发生变化的位置信息。请先定义所关心的量和位置,再选择聚合规则。以下调查方案是一种编辑性建议,而非通用的传感器数量要求。
| 目的 | 可比较的示例位置 | 解读方式 |
|---|---|---|
| 描述种植区 | 不同货架高度、排位以及与送风口的距离 | 保留各自独立的历史记录和差异 |
| 诊断暖通空调动作 | 送风和回风 | 与种植区读数保持区分 |
| 发现局部异常 | 门口、墙面和货架背面 | 不要让极端位置被平均值掩盖 |
| 调查仪器差异 | 临时同位放置 | 在比较仪器之前先减少位置差异 |
Sensirion 的设计指南 将具有代表性的放置位置、外壳内空气交换以及热影响列为系统级问题。传感器的独立精度并不能确立安装后的精度。
进行调查时,请记录照明、风机运行状态和作物生长阶段,然后在相应的运行条件下比较各个位置。如果便携式传感器在各位置之间移动,请保留一个固定参考点:否则,调查期间发生的整室变化可能看起来像是空间差异。在各位置之间交换两台仪器有助于判断,但条件可能在交换期间发生变化。将交换与同位放置结合,有助于缩小原因范围。
将响应时间与记录间隔分开
每秒读取一次数值并不能确立一秒钟的物理响应。温度和相对湿度的响应也可能不同。请检查定义和安装配置;设计指南 以达到阶跃变化约 63% 来讨论响应。
仅为此示例,设目标温度为 T,测得温度为 T_m,测量时间常数为 \tau_s:
初始平衡于 24°C,输入恒定为 26°C,且 \tau_s=60 秒时,解为 T_m(t)=26-2\exp(-t/60)。
| 阶跃后经过时间 | 目标温度 | 读数 | 目标减去读数 |
|---|---|---|---|
| 30 s | 26.000°C | 24.787°C | 1.213°C |
| 60 s | 26.000°C | 25.264°C | 0.736°C |
| 180 s | 26.000°C | 25.900°C | 0.100°C |
读数在大约 41.6 秒后达到示例中的 25°C 阈值。离散记录可能将检测推迟到下一个采样点。该模型从一开始就立即响应;这与纯粹的死区时间(其间不发生任何响应)不同。
将以下仅使用标准库的 Python 代码保存为 sensor_example.py,并运行 python3 sensor_example.py 以复现该表格和阈值穿越时间。它不读取也不写入任何外部文件。
from math import exp, log
initial, final, tau = 24.0, 26.0, 60.0
for seconds in (30, 60, 180):
measured = final + (initial - final) * exp(-seconds / tau)
print(f"{seconds:3d} s: {measured:.3f} C, gap {final-measured:.3f} C")
threshold = 25.0
crossing = -tau * log((final - threshold) / (final - initial))
print(f"threshold crossing: {crossing:.1f} s")
真实房间不一定以阶跃形式变化,安装后的测量系统也不一定只有单一时间常数。在通过日志调查响应时,需考虑参考仪器的动力学特性和时间戳对齐问题。制冷指令与读数变化之间的时间间隔综合了执行器、空气传输和测量效应;仅凭该间隔无法识别每一项的贡献。
保留滤波前后的数值
如果控制系统应用了移动平均或其他滤波器,请同时记录采集到的仪器输出和经处理后的控制输入。采集到的输出可能已经包含内部处理。同时保留滤波器设置。
为扩展前述实验室,可使用 T_m-T_{sp} 作为 PI 误差,同时保留模型的真实温度 T 用于评估。分别统计测得温度和真实温度超出区间的时间。此处的计算不含反馈回路,因此不对由此产生的振荡或额外超调做出任何数值上的断言。
在实际设施中,真实温度并不能直接获取。独立的参考测量同样带有不确定性;报告比较结果时,请记录参考仪器、位置和校准信息。
将温度和相对湿度视为一对量
相对湿度表示相应温度下水汽压相对于饱和水汽压的比值。计算 VPD 时,应使用代表同一团空气的温度和相对湿度,并对齐其时间戳。将货架温度与送风相对湿度组合,并不能测得货架处的 VPD。
加热式湿度探头需要区分被加热的传感区域和环境空气。维萨拉(Vaisala)关于加热探头的说明 描述了使用额外的环境温度测量来获得环境相对湿度的方法。请遵循所选仪器的输出规格,而不要将每一个加热探头的输出都当作种植区的温度和相对湿度。
在向 VPD 实验室 提供数值时,请区分基于空气温度的计算与使用叶温的叶片-空气计算。在没有叶温测量的情况下,不要将基于空气的结果标注为已测得的叶片状况。
将校准、调整与位置调查分开保存
维萨拉的校准说明 区分了与参考值的比较和对仪器的调整。在一个点上吻合并不能验证整个工作范围。选择比较点和验收限值时,应考虑工作范围和参考不确定度。
请记录仪器 ID、调整前读数、参考读数、稳定条件和日期。如果进行了调整,请补充设置变更内容和后续比较结果。舍弃原始差异会使早期种植日志更难评估。
两台仪器读数一致,并不能排除共同的偏差。校准同样不能证明安装位置能够代表种植区。请将仪器比较和位置调查作为两项独立任务分别完成。
定义传递给控制系统的记录
以下字段是一种建议的记录设计,而非已测得的数据集。
| 字段 | 目的 |
|---|---|
| 测量时间戳和接收时间戳、时区 | 将通信延迟与环境变化区分开 |
| 仪器 ID、位置 ID、安装高度 | 追踪更换和移动情况 |
| 温度、相对湿度、单位、仪器状态 | 识别加热模式和无效读数 |
| 滤波设置和处理后的控制值 | 还原控制器的输入 |
| 照明、风机、制冷指令和运行状态 | 将扰动与设备响应对齐 |
| 校准、更换和清洁历史 | 解释维护前后出现的不连续 |
在通信故障期间保持最后一次读数不变,可能会产生一个看似平稳的、令人安心的显示。请将样本时效和有效性与数值一并传递。针对实际设备和作物,定义陈旧数据的限值和相应的控制动作,然后在调试期间验证该行为。
在进行下一个实验之前,请通过同位放置调查仪器差异,通过位置调查调查空间差异,并调查从采集到控制输入之间的延迟。这些记录合在一起,可以支持是否应更改控制器或改进测量流程的决策。
制冷响应实验室——将 PI 指令与实际输出的制冷量分开
相同的制冷能力并不意味着相同的响应
此前的耦合控制比较 假设指令变化会立即改变制冷和除湿能力。本实验将显热制冷单独分离出来,让实际输出的制冷能力逐渐跟随指令变化。这是一个合成的房间模型,并非已测得的种植设施。
在同样的 12 小时内,将执行器时间常数从零增加到 900 秒,会使积分绝对温度误差从 2.287 变为 4.351 K·h,最低温度从 23.419 变为 23.044°C。两种情况都仍处于所选的 23–25°C 区间内。因此,仅凭一个二元的通过/不通过区间检验会掩盖响应上的显著差异。
图:Duskcoil,由分发的 Python 仿真代码生成。红色的 1800 秒曲线是一个压力测试案例。该区间是一项实验性假设,而非作物推荐值。
一个刻意缩小规模的实验
这是一个用于分离执行器响应的独立实验,而不是对此前耦合模型的单参数重跑。它不包含湿度、蒸腾、除湿器再加热和二氧化碳。所有情况均使用室外 22°C、背景热量 800 W,以及在第 2 至第 8 小时之间额外增加的 8,000 W 照明相关显热。这 8,000 W 并非照明用电需求的估算值。
| 设置 | 数值 | 解读 |
|---|---|---|
| 有效热容量 | 12 MJ/K | 合成房间及其内容物,而非仅空气 |
| 围护结构传导系数 | 300 W/K | 与室内外温差成正比的传热 |
| 最大制冷量 | 12 kW | 显热去除量,而非电量 |
| 初始温度与设定值 | 24°C | 各情况均相同 |
| 评估区间 | 23–25°C | 本实验的验收标准 |
| 仿真与控制间隔 | 10 秒 | 光照切换与网格对齐 |
| PI 增益 | 0.6 K⁻¹;0.0004 K⁻¹s⁻¹ | 固定的合成设定值 |
| 执行器时间常数 | 0、300、900 秒 | 本次比较的变量 |
能源部关于显热/潜热分离的项目 描述了能够分别处理温度和湿度负荷的技术。本房间模型并不重现该设备;湿度控制和用电量需要额外的模型和评估。
为指令和实际输出分别设置变量
定义误差,使得温度高于设定值时增加制冷。PI 输出被裁剪到 0–1 之间,即为指令 u。实际输出制冷量占最大能力的比例为 a。
这是一个一阶滞后环节。在恒定指令下,一个时间常数大约覆盖所请求变化量的 63.2%。900 秒的时间常数并不意味着在 900 秒内什么都不会发生:那才是死区时间。实际输出从零开始;只有零时间常数的情况才会瞬时跟随指令。
房间采用显热平衡:
代码在每个十秒区间内保持指令不变,并以解析方式计算执行器在该区间端点及区间内的平均值。室内温度使用前向欧拉法结合区间平均制冷量进行计算。这避免了将端点处的制冷速率误当作在整个区间内都被输出。
PI 控制器使用条件积分:当无约束指令超出其上限、且误差会使其进一步深入饱和时,积分被冻结;但当积分有助于脱离饱和状态时,则允许积分。MathWorks 将该方法与跟踪实际执行器输出的方法区分开来。此处仅实现了条件积分;它本身并不补偿执行器动力学。
在相同区间内比较各项指标
| 时间常数 | 最低 °C | 最高 °C | 超出区间时长 h | 绝对误差 K·h | 制冷热量 kWh |
|---|---|---|---|---|---|
| 0 秒 | 23.419 | 24.580 | 0.000 | 2.287 | 51.572 |
| 300 秒 | 23.319 | 24.679 | 0.000 | 2.751 | 51.953 |
| 900 秒 | 23.044 | 24.877 | 0.000 | 4.351 | 53.072 |
| 1800 秒,压力测试案例 | 22.730 | 25.110 | 3.650 | 6.880 | 54.380 |
积分绝对误差累加 |T-T_{sp}|,因此偏热和偏冷的偏差不会相互抵消。区间时长和误差使用每个区间起点的温度:它们是十秒级的近似值。极值包括所有网格端点,包括初始和最终状态。
灯光关闭时,显热输入立即下降,而实际输出的制冷量则逐渐衰减。请将下方面板中指令下降后的剩余输出,与上方面板中的低温偏移对应起来。制冷热量的增加不能直接解读为电量或成本的增加:此处没有制冷 COP、水泵或风机模型。
先运行,再更改一个条件
将 可复现的压缩包 解压到一个空目录中。计算和测试仅需要 Python 标准库;验证使用的是 Python 3.12。
python3 reproduce.py
python3 -m unittest -v
python3 experiment.py config.json --tau 900 --csv trace-local.csv
python3 experiment.py config.json --tau 1800
reproduce.py 会校验已分发文件的哈希值,并重新计算已保存的 0、300 和 900 秒案例。CSV 导出会拒绝覆盖已存在的文件。最终的 CSV 行携带的是之前保持不变的指令值;它并不代表端点处发生了新的控制更新。
单独下载:配置文件、计算源代码、参考结果、1800 秒结果、900 秒 CSV,以及清单文件。
先在不更改增益的情况下尝试 1800 秒。它有 3.650 小时处于区间之外。这意味着未通过所选的验收标准,而不是发散或已证实的设备故障。然后回到 900 秒,将 dt_s 改为 5,以检查离散化效应。同时更改所有条件会掩盖改善的原因。
数值正确性与设施适用性是两项不同的检验
十项测试涵盖了解析一阶响应、区间细分、执行器边界、积分冻结/释放、恒定热量下的已知解、热平衡残差、参考输出、无效输入、半步长收敛以及压力案例的区间违规情况。在三种标准案例中,将步长从十秒减半为五秒,会使极值、绝对误差和制冷热量分别变化不到 0.03°C、0.03 K·h 和 0.03 kWh。数值收敛并不能证明这些合成参数代表某一实际设施。
对于真实安装,请收集能够用于估计实际制冷输出的指令历史和测量数据,然后将辨识数据和验证数据分开。传感器滞后、最短运行时间、分级运行、死区时间和湿度耦合是进一步的扩展方向。作物设定值、病害风险和节能百分比并不是本实验的输出内容。
继续阅读
温湿度传感器 在将读数传递给控制系统之前,探讨了位置、测量响应和校准问题。
耦合控制实验室——在相同扰动下比较开关式和 PI 控制
从结果开始
在相同的合成 24 小时内,PI 将执行器总变化量从 34.0 降至 2.853,制冷去除量从 182.233 降至 178.854 kWh。但温度超区间时间从 7.95 增至 10.02 小时,同时制冷加除湿器再加热的时间从 9.37 增至 14.65 小时。本次运行并不能证明 PI 更优。
图示:Duskcoil。用于控制器比较的共用系统边界。
共用条件
热量和水分平衡被合并为仅两个状态:室内温度 T 和水汽质量 m_v。天气、LED 照明、规定的蒸腾量、初始状态、60 秒步长、14 kW 制冷和 2.5 kg/h 除湿量均相同。合成除湿器向室内返还 1.8 kW 显热。二氧化碳 仍保持独立。
滞环开关围绕 24±0.5°C 和 65/75% RH。PI 输出饱和于 0–1 之间,并使用条件抗积分饱和。增益为合成值,并非已调校的设备设定值。
| 指标 | 开关式 | PI |
|---|---|---|
| 超出 23–25°C | 7.95 h | 10.02 h |
| 超出 60–80% RH | 4.25 h | 4.25 h |
| 制冷去除量 | 182.23 kWh | 178.85 kWh |
| 除湿水量 | 24.25 kg | 23.06 kg |
| 同时制冷/再加热 | 9.37 h | 14.65 h |
| 执行器总变化量 | 34.0 | 2.85 |
正如能源部指南 所说明的,显热和潜热控制可能涉及过度制冷和再加热。当违规或同时运行情况增加时,仅凭较低能耗并不能决定设计方案。
运行与验证
解压 压缩包:
python3 experiment.py config.json > result.json
python3 -m unittest -v
参见 config.json、expected.json 和 experiment.py。八项测试涵盖了两种控制器、确定性、能量/水分残差以及无效输入。
在调整增益之前,请先固定验收区间、指标权重、同时运行限值、电力换算和执行器延迟。实际部署必须将辨识数据和验证数据分开。本文不提供作物设定值、真实设备节能效果,也不保证 PI 一定更优。
制冷响应后续文章 将指令与实际输出的制冷量分开,并只改变执行器时间常数。

评论
请先登录。
暂无数据。