
档案馆环境系统的交付流程中,组态调试往往是周期最长、返工最多、责任最模糊的环节。
为什么?因为硬件安装是确定性的(拧螺丝、布线),软件配置是经验性的(调参数、对逻辑)。一套档案馆环境系统涉及几十上百个传感器、空调、除湿机、加湿机、新风机、风阀,这些设备之间的联动逻辑不是"写代码"能解决的,而是需要工程师在现场反复调试、观察、修正。
阶段 | 工作内容 | 耗时占比 | 常见返工原因 |
|---|---|---|---|
设备接入 | 传感器点位绑定、通信参数配置、地址映射 | 15% | 图纸与现场不一致 |
数据校准 | 零点漂移修正、量程映射、多传感器一致性比对 | 25% | 未考虑温湿度交叉影响 |
联动逻辑 | 设备启停条件、优先级、互锁、延时 | 35% | 现场工况与设计方案偏差 |
时序调试 | 设备切换间隔、防抖延时、状态确认等待 | 15% | 设备响应速度未实测 |
验收测试 | 模拟场景、连续运行验证 | 10% | 联动逻辑遗漏边界条件 |
核心矛盾:设计阶段用"理想工况"画逻辑图,调试阶段面对的是"真实物理世界"——设备有惯性、传感器有延迟、网络有抖动、环境有滞后。
传感器出厂时的精度标称(如±0.3℃)是在标准实验室环境下测得的。现场安装后,以下因素会导致实际偏差远大于标称值:
偏差来源 | 机理 | 典型影响 |
|---|---|---|
自热效应 | 传感器电路工作时发热,影响温度测量 | +0.2~0.5℃ |
安装位置气流死区 | 密集架内部空气不流通,传感器读数滞后 | 滞后5~15分钟 |
太阳辐射/热辐射 | 靠近窗户或灯具,辐射热影响 | +1~3℃ |
湿度传感器老化 | 电容式湿度传感器随使用时间漂移 | +2~5%RH/年 |
温湿度交叉敏感 | 湿度变化影响温度测量(反之亦然) | ±0.1~0.2℃ |
多节点一致性差 | 同一批次传感器个体差异 | 节点间偏差0.5~1.5℃ |
┌─────────────────────────────────────────────────────────────────────┐
│ 第一级:出厂校准(传感器厂商完成) │
│ - 标准温湿度箱中标定 │
│ - 记录校准曲线/补偿系数 │
│ - 写入传感器EEPROM │
├─────────────────────────────────────────────────────────────────────┤
│ 第二级:现场单点校准(安装完成后) │
│ - 使用便携式高精度参考仪器(如Rotronic HC2) │
│ - 在档案馆现场环境下对比读数 │
│ - 计算偏移量并写入系统补偿参数 │
├─────────────────────────────────────────────────────────────────────┤
│ 第三级:运行期动态校准(长期运行) │
│ - 定期(季度/半年)与参考仪器比对 │
│ - 基于历史数据的漂移趋势分析 │
│ - 自动更新补偿参数 │
└─────────────────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────────┐
│ 现场单点校准流程 │
│ │
│ Step 1: 选择校准环境 │
│ ├── 选择有代表性的点位(库房中心、角落、密集架内) │
│ ├── 确保环境相对稳定(空调已运行≥2小时) │
│ └── 避开阳光直射、风口、热源 │
│ │
│ Step 2: 参考仪器部署 │
│ ├── 将参考仪器(Rotronic HC2等)放置在校准点位 │
│ ├── 等待参考仪器稳定(≥15分钟) │
│ └── 记录参考值:T_ref, H_ref │
│ │
│ Step 3: 被测传感器读取 │
│ ├── 同时读取被测传感器当前值:T_raw, H_raw │
│ ├── 连续读取3次取平均,排除瞬时波动 │
│ └── 记录原始值 │
│ │
│ Step 4: 计算补偿参数 │
│ ├── 偏移量法:offset = T_ref - T_raw │
│ ├── 比例法:gain = T_ref / T_raw │
│ └── 线性拟合法:T_cal = a × T_raw + b(多点校准) │
│ │
│ Step 5: 写入补偿参数 │
│ ├── 在组态软件中配置补偿公式 │
│ ├── 验证:读取补偿后的值,与参考值比对 │
│ └── 误差应在允许范围内(温度±0.2℃,湿度±2%RH) │
│ │
│ Step 6: 多点验证 │
│ ├── 在量程范围内选择3~5个点验证 │
│ ├── 如误差超标,改用多点线性拟合 │
│ └── 生成校准报告 │
└─────────────────────────────────────────────────────────────────────┘# calibration.py
import numpy as np
from dataclasses import dataclass
from typing import List, Optional, Tuple
@dataclass
class CalibrationPoint:
"""单个校准点"""
raw_value: float # 传感器原始值
reference_value: float # 参考仪器值
timestamp: float # 校准时间
@dataclass
class CalibrationResult:
"""校准结果"""
method: str # 校准方法:offset / gain / linear / polynomial
parameters: dict # 校准参数
error_before: float # 校准前误差
error_after: float # 校准后误差
max_deviation: float # 最大偏差
is_valid: bool # 是否通过验证
class SensorCalibrator:
"""传感器校准器"""
def __init__(self, sensor_id: str, sensor_type: str = "temperature"):
self.sensor_id = sensor_id
self.sensor_type = sensor_type
self.points: List[CalibrationPoint] = []
self.result: Optional[CalibrationResult] = None
def add_point(self, raw: float, reference: float) -> None:
"""添加校准点"""
self.points.append(CalibrationPoint(
raw_value=raw,
reference_value=reference,
timestamp=time.time()
))
def calibrate_offset(self) -> CalibrationResult:
"""偏移量校准(单点)"""
if not self.points:
raise ValueError("No calibration points")
# 取所有点的平均值
avg_raw = np.mean([p.raw_value for p in self.points])
avg_ref = np.mean([p.reference_value for p in self.points])
offset = avg_ref - avg_raw
# 计算校准前后误差
errors_before = [abs(p.raw_value - p.reference_value) for p in self.points]
errors_after = [abs((p.raw_value + offset) - p.reference_value) for p in self.points]
result = CalibrationResult(
method="offset",
parameters={"offset": offset},
error_before=np.mean(errors_before),
error_after=np.mean(errors_after),
max_deviation=max(errors_after),
is_valid=max(errors_after) <= (0.2 if self.sensor_type == "temperature" else 2.0)
)
self.result = result
return result
def calibrate_linear(self) -> CalibrationResult:
"""线性拟合校准(多点)"""
if len(self.points) < 2:
raise ValueError("Need at least 2 points for linear calibration")
raw_values = np.array([p.raw_value for p in self.points])
ref_values = np.array([p.reference_value for p in self.points])
# 线性拟合: y = ax + b
coeffs = np.polyfit(raw_values, ref_values, 1)
a, b = coeffs[0], coeffs[1]
# 计算校准前后误差
errors_before = np.abs(raw_values - ref_values)
calibrated = a * raw_values + b
errors_after = np.abs(calibrated - ref_values)
result = CalibrationResult(
method="linear",
parameters={"gain": a, "offset": b},
error_before=np.mean(errors_before),
error_after=np.mean(errors_after),
max_deviation=max(errors_after),
is_valid=max(errors_after) <= (0.2 if self.sensor_type == "temperature" else 2.0)
)
self.result = result
return result
def calibrate_polynomial(self, degree: int = 2) -> CalibrationResult:
"""多项式拟合校准(多点高精度)"""
if len(self.points) < degree + 1:
raise ValueError(f"Need at least {degree + 1} points for degree {degree}")
raw_values = np.array([p.raw_value for p in self.points])
ref_values = np.array([p.reference_value for p in self.points])
# 多项式拟合
coeffs = np.polyfit(raw_values, ref_values, degree)
# 计算校准前后误差
errors_before = np.abs(raw_values - ref_values)
calibrated = np.polyval(coeffs, raw_values)
errors_after = np.abs(calibrated - ref_values)
result = CalibrationResult(
method=f"polynomial_degree_{degree}",
parameters={"coefficients": coeffs.tolist()},
error_before=np.mean(errors_before),
error_after=np.mean(errors_after),
max_deviation=max(errors_after),
is_valid=max(errors_after) <= (0.2 if self.sensor_type == "temperature" else 2.0)
)
self.result = result
return result
def apply_calibration(self, raw_value: float) -> float:
"""应用校准参数"""
if not self.result or not self.result.is_valid:
return raw_value
params = self.result.parameters
if self.result.method == "offset":
return raw_value + params["offset"]
elif self.result.method == "linear":
return params["gain"] * raw_value + params["offset"]
elif self.result.method.startswith("polynomial"):
coeffs = np.array(params["coefficients"])
return np.polyval(coeffs, raw_value)
else:
return raw_value
def generate_report(self) -> str:
"""生成校准报告"""
if not self.result:
return "No calibration performed"
report = f"=== 传感器校准报告 ===\n"
report += f"传感器ID: {self.sensor_id}\n"
report += f"传感器类型: {self.sensor_type}\n"
report += f"校准方法: {self.result.method}\n"
report += f"校准参数: {self.result.parameters}\n"
report += f"校准前平均误差: {self.result.error_before:.3f}\n"
report += f"校准后平均误差: {self.result.error_after:.3f}\n"
report += f"最大偏差: {self.result.max_deviation:.3f}\n"
report += f"校准状态: {'通过' if self.result.is_valid else '未通过'}\n"
report += f"\n校准数据点 ({len(self.points)}):\n"
for i, p in enumerate(self.points):
calibrated = self.apply_calibration(p.raw_value)
report += f" {i+1}. 原始: {p.raw_value:.2f}, 参考: {p.reference_value:.2f}, 校准后: {calibrated:.2f}\n"
return report档案馆同一区域内通常部署多个传感器,用于冗余和均值计算。调试时需要确保这些传感器的读数一致性:
# consistency_check.py
import numpy as np
from typing import List, Dict, Tuple
class ConsistencyChecker:
"""多传感器一致性检查"""
def __init__(self, max_deviation: float = 0.5):
self.max_deviation = max_deviation # 最大允许偏差(℃或%RH)
def check_consistency(self, readings: Dict[str, float]) -> Dict:
"""
检查一组传感器的读数一致性
readings: {sensor_id: value}
"""
if len(readings) < 2:
return {"consistent": True, "reason": "insufficient_sensors"}
values = list(readings.values())
mean_val = np.mean(values)
std_val = np.std(values)
max_val = max(values)
min_val = min(values)
range_val = max_val - min_val
# 判断一致性
is_consistent = range_val <= self.max_deviation
# 找出异常传感器
outliers = []
for sensor_id, value in readings.items():
if abs(value - mean_val) > self.max_deviation / 2:
outliers.append({
"sensor_id": sensor_id,
"value": value,
"deviation": value - mean_val
})
return {
"consistent": is_consistent,
"mean": mean_val,
"std": std_val,
"range": range_val,
"max": max_val,
"min": min_val,
"outliers": outliers,
"recommendation": self._get_recommendation(is_consistent, outliers)
}
def _get_recommendation(self, consistent: bool, outliers: List[Dict]) -> str:
if consistent:
return "传感器一致性良好,无需调整"
if len(outliers) == 1:
return f"传感器 {outliers[0]['sensor_id']} 读数异常,建议校准或检查安装位置"
elif len(outliers) > 1:
return "多个传感器读数异常,建议检查环境均匀性或通信干扰"
else:
return "建议重新校准所有传感器"档案馆环境系统通常包含以下设备:
设备类型 | 数量 | 控制方式 | 响应时间 | 物理惯性 |
|---|---|---|---|---|
精密空调 | 2~8台 | 开关量/Modbus | 启停30秒,温度响应10~30分钟 | 大 |
除湿机 | 2~6台 | 开关量/RS485 | 启停10秒,湿度响应20~60分钟 | 大 |
加湿机 | 1~3台 | 开关量/模拟量 | 启停5秒,湿度响应10~30分钟 | 中 |
新风机 | 1~4台 | 变频器/开关量 | 变频响应30秒,换气5~15分钟 | 中 |
风阀 | 若干 | 开关量/模拟量 | 开闭10~30秒 | 小 |
排风机 | 1~2台 | 开关量 | 启停10秒 | 小 |
核心挑战:这些设备的物理惯性差异巨大。空调从启动到出风需要30秒,从出风到改变室温需要10~30分钟。如果联动逻辑不考虑这些时间尺度,就会出现:
最基础的防震荡策略:设定一个"不动作区间",只有超出这个区间才触发设备动作。
温度设定值: 22℃
死区上限: 22.5℃ → 启动空调
死区下限: 21.5℃ → 关闭空调
湿度设定值: 50%RH
死区上限: 55%RH → 启动除湿
死区下限: 45%RH → 启动加湿防止瞬时波动导致误动作:
传感器读数 > 阈值 且 持续 ≥ 延时时间 → 触发动作
传感器读数 < 阈值 且 持续 ≥ 延时时间 → 取消动作┌─────────────────────────────────────────────────────────────────────┐
│ 设备优先级矩阵 │
│ │
│ 优先级1(最高):安全相关 │
│ ├── 消防联动:火灾信号 → 关闭所有空调、新风机,打开排烟阀 │
│ ├── 水浸检测:漏水信号 → 关闭加湿机、除湿机 │
│ └── 温湿度超限:极端温度(>30℃或<10℃) → 强制启动所有空调 │
│ │
│ 优先级2(高):环境保障 │
│ ├── 温度控制:空调启停 │
│ ├── 湿度控制:除湿机/加湿机启停 │
│ └── 新风控制:新风机变频 │
│ │
│ 优先级3(低):节能优化 │
│ ├── 谷电时段预冷/预热 │
│ ├── 夜间节能模式 │
│ └── 设备轮巡(均衡运行时间) │
│ │
│ 互锁规则: │
│ ├── 除湿机与加湿机不能同时运行(硬件互锁+软件互锁) │
│ ├── 新风机全开时,空调回风阀应关闭 │
│ ├── 排风机与新风机关联(保持正压/负压) │
│ └── 消防信号触发时,所有设备立即停止 │
└─────────────────────────────────────────────────────────────────────┘以"空调+除湿机"联动为例:
┌─────────────────────────────────────────────────────────────────────┐
│ 空调+除湿机联动时序状态机 │
│ │
│ ┌─────────────┐ 温度>22.5℃ ┌─────────────┐ │
│ │ IDLE │─────────────────▶│ AC_RUNNING │ │
│ │ (待机) │ │ (空调运行) │ │
│ └─────────────┘ └──────┬──────┘ │
│ ▲ │ │
│ │ │ 温度<21.5℃ │
│ │ │ 且持续5分钟 │
│ │ ▼ │
│ │ ┌─────────────┐ │
│ │ │ AC_COOLDOWN│ │
│ │ │ (空调延时关闭)│ │
│ │ └──────┬──────┘ │
│ │ │ 延时5分钟 │
│ │ ▼ │
│ │ ┌─────────────┐ │
│ │ │ IDLE │◀──────────┐ │
│ │ └─────────────┘ │ │
│ │ │ │
│ │ 湿度>55% ┌─────────────┐ │ │
│ └────────────────────────────│ DEH_RUNNING │─────────┘ │
│ │ (除湿机运行) │ 湿度<45% │
│ └─────────────┘ 且持续10分钟 │
│ │ │
│ │ 湿度<45% │
│ │ 且持续10分钟 │
│ ▼ │
│ ┌─────────────┐ │
│ │ DEH_COOLDOWN│ │
│ │(除湿机延时关)│ │
│ └──────┬──────┘ │
│ │ 延时3分钟 │
│ ▼ │
│ ┌─────────────┐ │
│ │ IDLE │ │
│ └─────────────┘ │
│ │
│ 互锁条件: │
│ - 除湿机运行时,如果温度<20℃,暂停除湿机(除湿放热) │
│ - 空调运行时,如果湿度<40%,暂停空调(防过度除湿) │
│ - 消防信号触发时,所有状态立即回到IDLE │
└─────────────────────────────────────────────────────────────────────┘# linkage_controller.py
import time
import threading
from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, List, Callable, Optional
class DeviceType(Enum):
AC = "ac" # 空调
DEHUMIDIFIER = "dehumidifier" # 除湿机
HUMIDIFIER = "humidifier" # 加湿机
FRESH_AIR = "fresh_air" # 新风机
EXHAUST = "exhaust" # 排风机
VALVE = "valve" # 风阀
class DeviceState(Enum):
OFF = 0
ON = 1
STARTING = 2 # 启动中(延时确认)
STOPPING = 3 # 关闭中(延时确认)
FAULT = 4 # 故障
@dataclass
class DeviceConfig:
"""设备配置"""
device_id: str
device_type: DeviceType
priority: int # 优先级(数字越小越高)
start_delay: float = 5.0 # 启动延时(秒)
stop_delay: float = 5.0 # 关闭延时(秒)
min_runtime: float = 300.0 # 最短运行时间(秒),防止频繁启停
cooldown_time: float = 180.0 # 冷却时间(秒),关闭后多久可以再次启动
@dataclass
class DeviceStatus:
"""设备状态"""
config: DeviceConfig
state: DeviceState = DeviceState.OFF
last_command_time: float = 0.0
last_state_change: float = 0.0
runtime: float = 0.0
fault_reason: Optional[str] = None
class LinkageController:
"""设备联动控制器"""
def __init__(self):
self.devices: Dict[str, DeviceStatus] = {}
self.sensor_readings: Dict[str, float] = {}
self.interlocks: List[Callable] = []
self.running = False
self._thread = None
self.lock = threading.RLock()
# 环境设定值
self.temp_setpoint = 22.0
self.temp_deadband = 0.5
self.humi_setpoint = 50.0
self.humi_deadband = 5.0
# 防震荡参数
self.temp_debounce_time = 300.0 # 5分钟
self.humi_debounce_time = 600.0 # 10分钟
# 状态跟踪
self.temp_above_threshold_since = 0.0
self.temp_below_threshold_since = 0.0
self.humi_above_threshold_since = 0.0
self.humi_below_threshold_since = 0.0
def register_device(self, config: DeviceConfig):
"""注册设备"""
with self.lock:
self.devices[config.device_id] = DeviceStatus(config=config)
print(f"Device {config.device_id} registered")
def update_sensor(self, sensor_id: str, value: float):
"""更新传感器读数"""
with self.lock:
self.sensor_readings[sensor_id] = value
def add_interlock(self, interlock_func: Callable):
"""添加互锁规则"""
self.interlocks.append(interlock_func)
def start(self):
"""启动控制器"""
self.running = True
self._thread = threading.Thread(target=self._control_loop, daemon=True)
self._thread.start()
def stop(self):
"""停止控制器"""
self.running = False
if self._thread:
self._thread.join()
def _control_loop(self):
"""主控制循环"""
while self.running:
with self.lock:
self._evaluate_temperature()
self._evaluate_humidity()
self._check_interlocks()
self._update_device_runtimes()
time.sleep(10) # 每10秒评估一次
def _evaluate_temperature(self):
"""评估温度控制"""
# 获取温度读数(假设传感器ID为"temp_main")
temp = self.sensor_readings.get("temp_main")
if temp is None:
return
now = time.time()
upper_threshold = self.temp_setpoint + self.temp_deadband
lower_threshold = self.temp_setpoint - self.temp_deadband
# 检查是否需要启动空调
if temp > upper_threshold:
if self.temp_above_threshold_since == 0:
self.temp_above_threshold_since = now
elif now - self.temp_above_threshold_since >= self.temp_debounce_time:
# 持续超过防抖时间,启动空调
self._start_ac_if_needed()
else:
self.temp_above_threshold_since = 0
# 检查是否需要关闭空调
if temp < lower_threshold:
if self.temp_below_threshold_since == 0:
self.temp_below_threshold_since = now
elif now - self.temp_below_threshold_since >= self.temp_debounce_time:
# 持续低于下限,关闭空调
self._stop_ac_if_needed()
else:
self.temp_below_threshold_since = 0
def _evaluate_humidity(self):
"""评估湿度控制"""
humi = self.sensor_readings.get("humi_main")
if humi is None:
return
now = time.time()
upper_threshold = self.humi_setpoint + self.humi_deadband
lower_threshold = self.humi_setpoint - self.humi_deadband
# 湿度控制逻辑(类似温度)
if humi > upper_threshold:
if self.humi_above_threshold_since == 0:
self.humi_above_threshold_since = now
elif now - self.humi_above_threshold_since >= self.humi_debounce_time:
self._start_dehumidifier_if_needed()
else:
self.humi_above_threshold_since = 0
if humi < lower_threshold:
if self.humi_below_threshold_since == 0:
self.humi_below_threshold_since = now
elif now - self.humi_below_threshold_since >= self.humi_debounce_time:
self._start_humidifier_if_needed()
else:
self.humi_below_threshold_since = 0
def _start_ac_if_needed(self):
"""启动空调"""
ac_devices = [d for d in self.devices.values()
if d.config.device_type == DeviceType.AC]
for ac in ac_devices:
if ac.state == DeviceState.OFF:
# 检查冷却时间
if time.time() - ac.last_state_change < ac.config.cooldown_time:
continue
self._send_start_command(ac)
def _stop_ac_if_needed(self):
"""关闭空调"""
ac_devices = [d for d in self.devices.values()
if d.config.device_type == DeviceType.AC]
for ac in ac_devices:
if ac.state == DeviceState.ON:
# 检查最短运行时间
if ac.runtime < ac.config.min_runtime:
continue
self._send_stop_command(ac)
def _start_dehumidifier_if_needed(self):
"""启动除湿机"""
deh_devices = [d for d in self.devices.values()
if d.config.device_type == DeviceType.DEHUMIDIFIER]
for deh in deh_devices:
if deh.state == DeviceState.OFF:
if time.time() - deh.last_state_change < deh.config.cooldown_time:
continue
self._send_start_command(deh)
def _start_humidifier_if_needed(self):
"""启动加湿机"""
hum_devices = [d for d in self.devices.values()
if d.config.device_type == DeviceType.HUMIDIFIER]
for hum in hum_devices:
if hum.state == DeviceState.OFF:
if time.time() - hum.last_state_change < hum.config.cooldown_time:
continue
self._send_start_command(hum)
def _send_start_command(self, device: DeviceStatus):
"""发送启动命令"""
print(f"Sending START command to {device.config.device_id}")
device.state = DeviceState.STARTING
device.last_command_time = time.time()
# 实际项目中这里会调用设备驱动接口
# driver.start_device(device.config.device_id)
def _send_stop_command(self, device: DeviceStatus):
"""发送停止命令"""
print(f"Sending STOP command to {device.config.device_id}")
device.state = DeviceState.STOPPING
device.last_command_time = time.time()
# driver.stop_device(device.config.device_id)
def _check_interlocks(self):
"""检查互锁条件"""
for interlock_func in self.interlocks:
interlock_func(self.devices, self.sensor_readings)
def _update_device_runtimes(self):
"""更新设备运行时间"""
now = time.time()
for device in self.devices.values():
if device.state == DeviceState.ON:
device.runtime = now - device.last_state_change
def add_default_interlocks(self):
"""添加默认互锁规则"""
# 互锁1: 除湿机与加湿机不能同时运行
def dehumidifier_humidifier_interlock(devices, sensors):
deh_running = any(d.config.device_type == DeviceType.DEHUMIDIFIER
and d.state == DeviceState.ON for d in devices.values())
hum_running = any(d.config.device_type == DeviceType.HUMIDIFIER
and d.state == DeviceState.ON for d in devices.values())
if deh_running and hum_running:
# 关闭加湿机(除湿优先)
for d in devices.values():
if d.config.device_type == DeviceType.HUMIDIFIER and d.state == DeviceState.ON:
self._send_stop_command(d)
# 互锁2: 温度过低时暂停除湿机(除湿放热)
def low_temp_dehumidifier_interlock(devices, sensors):
temp = sensors.get("temp_main", 25.0)
if temp < 20.0:
for d in devices.values():
if d.config.device_type == DeviceType.DEHUMIDIFIER and d.state == DeviceState.ON:
self._send_stop_command(d)
# 互锁3: 湿度过低时暂停空调(防过度除湿)
def low_humi_ac_interlock(devices, sensors):
humi = sensors.get("humi_main", 50.0)
if humi < 40.0:
for d in devices.values():
if d.config.device_type == DeviceType.AC and d.state == DeviceState.ON:
self._send_stop_command(d)
self.add_interlock(dehumidifier_humidifier_interlock)
self.add_interlock(low_temp_dehumidifier_interlock)
self.add_interlock(low_humi_ac_interlock)现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
空调频繁启停(<10分钟/次) | 死区设置过小 | 检查设定值和死区参数 | 增大死区至±0.5℃ |
除湿机启动后湿度反而上升 | 除湿机放热导致温度上升,相对湿度下降(但实际含湿量未变) | 检查温度是否同时上升 | 联动空调降温 |
新风机开启后温度骤升/骤降 | 室外空气未经处理直接进入 | 检查是否有预处理段 | 增加热回收或预处理 |
多个传感器读数差异>1℃ | 安装位置不当或传感器漂移 | 用参考仪器比对 | 重新校准或调整安装位置 |
联动逻辑不触发 | 传感器数据未更新或阈值设置错误 | 检查传感器状态和阈值 | 修复传感器或调整阈值 |
设备启动后无响应 | 通信故障或设备本身故障 | 检查通信状态和设备电源 | 修复通信或更换设备 |
# 档案馆环境系统组态调试记录
## 基本信息
- 项目: XX省档案馆
- 区域: 库房区A
- 调试日期: 2025-01-20
- 调试工程师: 张三
- 天气: 晴,室外温度15℃,湿度45%
## 传感器校准记录
| 传感器ID | 安装位置 | 原始温度 | 参考温度 | 补偿值 | 校准后温度 | 状态 |
|----------|---------|---------|---------|--------|-----------|------|
| T-001 | 密集架A1 | 22.8℃ | 22.3℃ | -0.5℃ | 22.3℃ | 通过 |
| T-002 | 密集架A2 | 21.9℃ | 22.2℃ | +0.3℃ | 22.2℃ | 通过 |
| T-003 | 密集架A3 | 23.1℃ | 22.3℃ | -0.8℃ | 22.3℃ | 通过 |
| 传感器ID | 安装位置 | 原始湿度 | 参考湿度 | 补偿值 | 校准后湿度 | 状态 |
|----------|---------|---------|---------|--------|-----------|------|
| H-001 | 密集架A1 | 53%RH | 51%RH | -2%RH | 51%RH | 通过 |
| H-002 | 密集架A2 | 48%RH | 50%RH | +2%RH | 50%RH | 通过 |
| H-003 | 密集架A3 | 55%RH | 51%RH | -4%RH | 51%RH | 通过 |
## 联动逻辑测试记录
| 测试项 | 设定值 | 触发条件 | 预期动作 | 实际动作 | 结果 |
|--------|--------|---------|---------|---------|------|
| 空调启动 | 22℃±0.5℃ | 温度>22.5℃持续5分钟 | 启动空调 | 启动空调 | 通过 |
| 空调关闭 | 22℃±0.5℃ | 温度<21.5℃持续5分钟 | 关闭空调 | 关闭空调 | 通过 |
| 除湿启动 | 50%RH±5% | 湿度>55%持续10分钟 | 启动除湿机 | 启动除湿机 | 通过 |
| 加湿启动 | 50%RH±5% | 湿度<45%持续10分钟 | 启动加湿机 | 启动加湿机 | 通过 |
| 互锁测试 | - | 除湿机运行时启动加湿机 | 加湿机不启动 | 加湿机未启动 | 通过 |
## 问题与处理
| 问题 | 原因 | 处理措施 | 状态 |
|------|------|---------|------|
| 传感器T-003读数偏高 | 靠近照明灯具 | 调整安装位置 | 已解决 |
| 除湿机启动后湿度先升后降 | 除湿机放热导致温度上升 | 联动空调同时降温 | 已解决 |
## 调试结论
- 传感器校准完成,一致性良好
- 联动逻辑测试通过,时序控制正常
- 互锁功能验证通过
- 系统可投入试运行关键词:档案馆,环境系统,组态调试,传感器校准,数据校准,设备联动,时序控制,死区控制,互锁,防震荡
标签:#档案馆 #环境系统 #组态调试 #传感器校准 #数据校准 #设备联动 #时序控制 #死区控制 #互锁 #防震荡
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。