
前面几篇围绕机房动环监控展开——关注设备在线率、供电稳定性、网络连通性。但档案馆的恒温恒湿系统,关注点完全不同:
机房保护的是设备,档案馆保护的是不可再生的纸质文献。
机房温度波动 ±5℃ 可能只是告警,档案馆温度波动 ±5℃ 可能直接导致纸张脆化、墨迹褪色、霉菌爆发。两者的环境指标、控制精度、联动策略完全不在一个量级。
指标 | 纸质档案库房(GB/T 27703-2011) | 特藏库/古籍库 | 机房(对比) |
|---|---|---|---|
温度 | 14~24℃ | 14~20℃ | 18~27℃ |
相对湿度 | 45%~60% RH | 45%~55% RH | 40%~60% RH |
日波动限值 | ±2℃ / ±5% RH | ±1℃ / ±3% RH | 无明确要求 |
洁净度 | ≥30 万级(0.5μm) | ≥10 万级 | 无明确要求 |
照度限制 | ≤50 lux(阅览)/ 暗环境(库房) | ≤30 lux | 无限制 |
换气次数 | 0.5~1 次/h | 0.3~0.5 次/h | 新风按需 |
关键差异:档案馆要求的是持续稳定而非"达标即可"。温度日波动超过 ±2℃,纸张纤维反复膨胀收缩,长期累积损伤不可逆。这意味着控制系统需要 PID 级精度,而非简单的上下限开关控制。
┌──────────────────────────────────────────────────────────────────┐
│ 决策层(中央管理平台) │
│ ├── 环境趋势分析(历史数据 + 外部气象) │
│ ├── 联动策略引擎(IF-THEN 规则 + PID 参数自适应) │
│ ├── 能耗优化(峰谷电价 + 设备轮换) │
│ └── 合规报表(日/月/年环境曲线,自动归档) │
└──────────────────────┬───────────────────────────────────────────┘
│ TCP/IP (MQTT/HTTP API)
│ 策略下发 + 状态回传
┌──────────────────────▼───────────────────────────────────────────┐
│ 控制层(现场控制器 / DDC / PLC) │
│ ├── 温湿度 PID 控制回路(夏季制冷除湿 / 冬季加热加湿) │
│ ├── 设备启停逻辑(空调、除湿机、加湿器、新风机) │
│ ├── 防冷凝保护(露点计算 → 表面温度比对) │
│ ├── 设备轮换(N+1 冗余,运行时长均衡) │
│ └── 本地应急模式(网络断开时独立运行) │
└──────────────────────┬───────────────────────────────────────────┘
│ Modbus RTU/TCP / BACnet / SNMP
│ 传感器数据采集 + 设备状态反馈
┌──────────────────────▼───────────────────────────────────────────┐
│ 感知层(现场传感器网络) │
│ ├── 高精度温湿度变送器(±0.3℃ / ±2% RH,带校准证书) │
│ ├── 露点传感器(防冷凝关键参数) │
│ ├── CO₂ 传感器(人员活动 + 新风控制) │
│ ├── 压差传感器(洁净度 + 气流方向控制) │
│ └── 水浸传感器(空调冷凝水泄漏检测) │
└──────────────────────────────────────────────────────────────────┘维度 | 机房动环 | 档案馆恒温恒湿 |
|---|---|---|
控制目标 | 告警 + 记录 | 闭环控制 + 自动调节 |
传感器密度 | 每柜/每区 1~2 个 | 每 20~30㎡ 1 个 + 关键通道加密 |
控制回路 | 无(仅监测) | PID 多回路耦合(温+湿+露点) |
联动对象 | 风扇、空调启停 | 精密空调、除湿机、加湿器、新风机、风阀 |
失效后果 | 设备宕机 | 文献永久损伤 |
合规要求 | 企业内部 | 国标强制 + 文物局/档案局审计 |
档案馆用的温湿度传感器,和机房用的不是同一个东西:
参数 | 机房级 | 档案馆级 | 说明 |
|---|---|---|---|
温度精度 | ±0.5℃ | ±0.3℃ | 国标要求 24h 波动 ≤2℃,传感器精度需优于此 |
湿度精度 | ±3% RH | ±2% RH | 湿度漂移比温度大,需定期校准 |
长期漂移 | 未标定 | ≤±0.1℃/年, ≤±1% RH/年 | 影响合规审计 |
校准周期 | 无要求 | 1~2 年(强制) | 需可现场校准或返厂校准 |
输出信号 | Modbus TCP | Modbus TCP + 模拟量备份 | 控制回路需冗余 |
防护等级 | IP20(室内) | IP54(防尘防潮) | 库房可能有除尘作业 |
安装方式 | 导轨/壁挂 | 壁挂 + 风管双位置 | 回风口 + 工作区均需监测 |
品牌/型号 | 类型 | 精度 | 接口 | 特点 |
|---|---|---|---|---|
Rotronic HC2-S | 工业级探头 | ±0.2℃ / ±1.5% RH | Modbus TCP / 4-20mA | 瑞士原装,校准证书可追溯,适合特藏库 |
Vaisala HMT330 | 工业级变送器 | ±0.2℃ / ±1% RH | Modbus TCP / RS485 | 芬兰原装,长期稳定性极佳,10 年免校准 |
Testo 645 | 高精度温湿度 | ±0.2℃ / ±1% RH | 蓝牙 + 数据记录 | 适合人工巡检 + 校准比对 |
国产精创 RCW-360 | 经济型 | ±0.3℃ / ±2% RH | Modbus TCP / 4G | 性价比高,适合大面积布点 |
国产虹润 NHR-1100 | 智能数显 | ±0.3℃ / ±2% RH | Modbus TCP + 报警输出 | 带本地显示,适合值班室查看 |
选型建议:
档案馆库房布点示意图
┌─────────────────────────────────────────────────────────────┐
│ 入口区(缓冲区) │
│ ● 入口传感器(监测人员进出带来的温湿度冲击) │
│ │
│ 主库房(每 20~30㎡ 一个) │
│ ● ● ● ● │
│ ● ● ● ● │
│ ● ● ● ● ● │
│ │
│ 回风口(关键控制点) │
│ ● 回风温湿度 → PID 控制回路反馈 │
│ │
│ 特藏区(加密布点) │
│ ● ● ● 密集布点,±1℃/±3% RH 控制 │
│ │
│ 墙角/角落(易形成微气候) │
│ ● 角落传感器(检测气流死角) │
└─────────────────────────────────────────────────────────────┘
原则:
1. 离墙 ≥0.5m,离地 1.5m(工作区高度)
2. 避开空调直吹、阳光直射、热源
3. 回风口必装(控制反馈),送风口不装(干扰 PID)
4. 特藏区密度翻倍,每 10~15㎡ 一个
5. 每个分区至少 2 个传感器(冗余 + 交叉验证)简单阈值控制(温度 > 25℃ 开空调,< 23℃ 关空调)的问题:
夏季模式(制冷 + 除湿为主)
┌──────────────────────────────────────────────────────────────┐
│ 目标:温度 20±1℃,湿度 50±3% RH │
│ │
│ PID 回路 1:温度控制(主回路) │
│ 反馈:回风温度 │
│ 执行:冷水阀开度 / 压缩机频率(变频空调) │
│ Kp=0.8, Ki=0.05, Kd=0.1(需现场整定) │
│ │
│ PID 回路 2:湿度控制(从回路,与温度耦合) │
│ 反馈:回风湿度 │
│ 执行:加湿器(电极/超声波)+ 除湿机 │
│ 约束:制冷时湿度自然下降,避免过度除湿 → 再热 │
│ │
│ 防冷凝保护: │
│ 露点计算 = f(温度, 湿度) │
│ 表面温度监测(风管、墙体) │
│ IF 表面温度 < 露点 + 2℃ → 降低除湿量 / 提高送风温度 │
└──────────────────────────────────────────────────────────────┘
冬季模式(加热 + 加湿为主)
┌──────────────────────────────────────────────────────────────┐
│ 目标:温度 18±1℃,湿度 50±3% RH │
│ │
│ PID 回路 1:温度控制 │
│ 反馈:回风温度 │
│ 执行:电加热 / 热水阀 / 蒸汽加热 │
│ │
│ PID 回路 2:湿度控制 │
│ 反馈:回风湿度 │
│ 执行:加湿器(蒸汽/湿膜) │
│ 约束:加热时湿度自然下降,需同步加湿 │
│ │
│ 新风预热: │
│ 室外温度 < 5℃ → 新风预热盘管启动 │
│ 防止冷风直接灌入导致局部低温 │
└──────────────────────────────────────────────────────────────┘"""
archive_hvac_strategy.py - 档案馆恒温恒湿联动策略引擎(核心逻辑)
"""
from dataclasses import dataclass
from enum import Enum
from typing import List
import time
class Season(Enum):
SUMMER = "summer" # 制冷除湿
WINTER = "winter" # 加热加湿
TRANSITION = "transition" # 过渡季
class DeviceAction(Enum):
AC_ON = "ac_on" # 空调开
AC_OFF = "ac_off" # 空调关
AC_SETPOINT = "ac_setpoint" # 设定温度
HUMIDIFIER_ON = "hum_on" # 加湿器开
HUMIDIFIER_OFF = "hum_off" # 加湿器关
DEHUMIDIFIER_ON = "dehum_on" # 除湿机开
DEHUMIDIFIER_OFF = "dehum_off"
REHEAT_ON = "reheat_on" # 再热开(防过冷)
FRESH_AIR_DAMPER = "fa_damper" # 新风阀开度 0~100%
@dataclass
class EnvReading:
temperature: float # ℃
humidity: float # %RH
dew_point: float # ℃
surface_temp: float # 表面温度(风管/墙体)
co2: float # ppm
timestamp: int
@dataclass
class PIDState:
kp: float
ki: float
kd: float
integral: float = 0.0
prev_error: float = 0.0
output: float = 0.0
def pid_compute(pid: PIDState, setpoint: float, actual: float, dt: float) -> float:
"""PID 计算"""
error = setpoint - actual
pid.integral += error * dt
# 积分限幅
pid.integral = max(-100, min(100, pid.integral))
derivative = (error - pid.prev_error) / dt if dt > 0 else 0
output = pid.kp * error + pid.ki * pid.integral + pid.kd * derivative
pid.prev_error = error
return max(0, min(100, output)) # 输出限幅 0~100%
class ArchiveHVACStrategy:
"""档案馆恒温恒湿联动策略"""
def __init__(self):
self.season = Season.TRANSITION
self.temp_setpoint = 20.0 # ℃
self.hum_setpoint = 50.0 # %RH
self.temp_pid = PIDState(kp=0.8, ki=0.05, kd=0.1)
self.hum_pid = PIDState(kp=0.6, ki=0.03, kd=0.05)
self.last_time = time.time()
self.actions: List[tuple] = []
def detect_season(self, outdoor_temp: float) -> Season:
"""根据室外温度判断季节模式"""
if outdoor_temp > 22:
return Season.SUMMER
elif outdoor_temp < 12:
return Season.WINTER
else:
return Season.TRANSITION
def evaluate(self, reading: EnvReading, outdoor_temp: float) -> List[tuple]:
"""
核心评估函数
返回: [(DeviceAction, value), ...]
"""
self.actions.clear()
now = time.time()
dt = now - self.last_time
self.last_time = now
# 季节判断
self.season = self.detect_season(outdoor_temp)
# ---- 温度 PID ----
temp_output = pid_compute(
self.temp_pid, self.temp_setpoint, reading.temperature, dt
)
# ---- 湿度 PID ----
hum_output = pid_compute(
self.hum_pid, self.hum_setpoint, reading.humidity, dt
)
# ---- 防冷凝保护 ----
condensation_risk = reading.surface_temp < reading.dew_point + 2.0
if condensation_risk:
self.actions.append((DeviceAction.REHEAT_ON, 100))
# 降低除湿量
hum_output = min(hum_output, 30)
# ---- 季节模式联动 ----
if self.season == Season.SUMMER:
# 制冷模式
if reading.temperature > self.temp_setpoint + 1.0:
self.actions.append((DeviceAction.AC_ON, temp_output))
elif reading.temperature < self.temp_setpoint - 0.5:
self.actions.append((DeviceAction.AC_OFF, 0))
# 湿度控制:制冷时自然除湿
if reading.humidity > self.hum_setpoint + 5:
self.actions.append((DeviceAction.DEHUMIDIFIER_ON, hum_output))
elif reading.humidity < self.hum_setpoint - 3:
# 过度除湿,需要再热
self.actions.append((DeviceAction.REHEAT_ON, hum_output * 0.5))
elif self.season == Season.WINTER:
# 加热模式
if reading.temperature < self.temp_setpoint - 1.0:
self.actions.append((DeviceAction.AC_ON, temp_output)) # 加热模式
elif reading.temperature > self.temp_setpoint + 0.5:
self.actions.append((DeviceAction.AC_OFF, 0))
# 湿度控制:加热时自然降湿,需要加湿
if reading.humidity < self.hum_setpoint - 5:
self.actions.append((DeviceAction.HUMIDIFIER_ON, hum_output))
elif reading.humidity > self.hum_setpoint + 3:
self.actions.append((DeviceAction.HUMIDIFIER_OFF, 0))
# ---- 新风控制(CO₂ + 室外温湿度) ----
if reading.co2 > 800:
# 人员活动增加,开新风
damper = min(100, (reading.co2 - 800) / 4) # 800~1200ppm → 0~100%
self.actions.append((DeviceAction.FRESH_AIR_DAMPER, damper))
else:
self.actions.append((DeviceAction.FRESH_AIR_DAMPER, 0))
# ---- 设备轮换(每 7 天切换主备) ----
# 此处简化,实际需记录运行时长
return self.actions
def emergency_mode(self, reading: EnvReading) -> List[tuple]:
"""应急模式:网络断开或控制器故障时"""
actions = []
# 保守策略:维持当前状态,不激进调节
if reading.temperature > 25:
actions.append((DeviceAction.AC_ON, 50))
elif reading.temperature < 15:
actions.append((DeviceAction.AC_ON, 30)) # 加热
if reading.humidity > 65:
actions.append((DeviceAction.DEHUMIDIFIER_ON, 50))
elif reading.humidity < 35:
actions.append((DeviceAction.HUMIDIFIER_ON, 50))
return actions
# ---- 使用示例 ----
if __name__ == "__main__":
strategy = ArchiveHVACStrategy()
reading = EnvReading(
temperature=23.5,
humidity=62.0,
dew_point=15.2,
surface_temp=18.0,
co2=650,
timestamp=int(time.time())
)
outdoor_temp = 28.0 # 夏季
actions = strategy.evaluate(reading, outdoor_temp)
print("联动策略输出:")
for action, value in actions:
print(f" {action.value}: {value}")阶段 | 交付物 | 关键验证点 |
|---|---|---|
设计 | 传感器布点图、控制逻辑图、联动策略文档 | 布点覆盖无死角、PID 参数整定计划 |
安装 | 传感器就位、DDC 接线、网络连通 | 每个传感器 Modbus 通信测试、校准证书归档 |
调试 | PID 参数整定、联动逻辑验证、应急模式测试 | 温度波动 ≤±2℃、湿度波动 ≤±5% RH |
试运行 | 连续 72h 运行、数据记录、异常模拟 | 断电恢复、网络中断、设备故障切换 |
验收 | 环境曲线报告、合规审计文档 | 连续 30 天数据达标率 ≥99.5% |
验收标准(GB/T 27703-2011 + 项目合同)
1. 温度控制精度:24h 内波动 ≤±2℃(普通库)/ ±1℃(特藏库)
2. 湿度控制精度:24h 内波动 ≤±5% RH(普通库)/ ±3% RH(特藏库)
3. 传感器一致性:同区域传感器读数差异 ≤0.5℃ / ≤3% RH
4. 系统可用性:年可用率 ≥99.9%(含维护窗口)
5. 应急响应:断电恢复后 ≤5min 自动回到控制状态
6. 数据完整性:环境数据连续记录,无 >5min 缺口
7. 合规报表:自动生成日/月/年报表,可导出 PDF/Excel坑 | 现象 | 解决方案 |
|---|---|---|
传感器装在空调直吹路径上 | 读数偏低,PID 过调 | 移开或加挡风板 |
回风口和送风口传感器混用 | 控制振荡 | 只用回风做 PID 反馈 |
忽略墙体/风管表面温度 | 冷凝水导致文献受损 | 加装表面温度传感器 + 露点保护 |
加湿器选型过大 | 湿度过冲,纸张受潮 | 按库房容积计算加湿量,留余量但不过大 |
新风未预热(冬季) | 冷风灌入,局部低温 | 新风预热盘管 + 风阀联动 |
未做设备轮换 | 主机 24h 不停,副机闲置 | 定时轮换或运行时长均衡 |
校准证书过期 | 审计不通过 | 建立校准台账,到期前 1 个月提醒 |
如果档案馆和机房在同一建筑内,可以共享部分基础设施:
统一动环平台(融合部署)
├── 档案馆恒温恒湿子系统
│ ├── 高精度传感器(Rotronic/Vaisala)
│ ├── DDC 控制器 + PID 策略引擎
│ ├── 精密空调 + 除湿/加湿设备
│ └── 合规报表 + 审计日志
│
├── 机房动环子系统
│ ├── 工业温湿度变送器(Modbus TCP)
│ ├── SNMP 设备监控
│ ├── 采集容器 + MQTT 上行
│ └── 告警 + 历史数据
│
└── 共享基础设施
├── PoE 交换机(分 VLAN 隔离)
├── 时序数据库(InfluxDB,按 subsystem 分 measurement)
├── 统一告警通道(短信/邮件/Webhook)
└── 统一可视化(Grafana,按角色分 Dashboard)档案馆恒温恒湿系统的选型与落地,核心在于从"监测"升级到"控制":
机房动环关心"有没有告警",档案馆关心"纸张还能活多久"。 两者对环境的理解深度完全不同,选型时不能套用同一套标准。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。