1. 项目背景与核心思路
去年夏天我家的空调遥控器突然罢工,正赶上三伏天最热的那几天。作为一个搞工业自动化的工程师,我第一反应不是去买新遥控器,而是翻出了工具箱里的西门子S7-1200 PLC——没错,就是工厂里控制生产线的那种铁盒子。你可能觉得用工业设备控制家用空调是大炮打蚊子,但当我用Modbus RTU协议成功让客厅的格力空调乖乖听话时,整个智能家居的玩法被彻底刷新了。
这个方案的独特价值在于:工业PLC的MTBF(平均无故障时间)通常超过10万小时,是普通智能家居网关的20倍以上。通过RS485转红外模块,我们可以用PLC直接学习空调红外码,再配合简单的梯形图编程,实现比市面任何智能家居系统都可靠的温控方案。最重要的是,整个系统完全本地化运行,不依赖任何云服务,断网照样用。
2. 硬件选型与连接方案
2.1 核心设备清单
- PLC主机:西门子S7-1200(1214C DC/DC/DC款),选它的原因是自带Profinet和RS485接口,市价约2500元。预算有限可以用国产信捷XD系列,但稳定性会打折扣。
- 通信模块:研华ADAM-4561(RS485转红外),关键参数是支持38kHz载频,兼容绝大多数空调协议,约600元。
- 温湿度传感器:AHT20数字传感器,I2C接口直接接PLC的CM PtP模块,精度±0.3℃比DHT11强得多。
- 电源系统:明纬GSM90A12-P1J工业开关电源,12V/7.5A输出,带过载保护。
2.2 硬件连接示意图
plaintext复制[220V市电] → [GSM90电源] → [S7-1200 PLC]
│
├─[AHT20传感器](I2C)
└─[ADAM-4561](RS485)
↓
[空调红外接收头]
关键提示:红外发射管要选用940nm波长的TSAL6200,安装时用热熔胶固定在空调原接收窗5cm范围内,发射角度建议15-30度倾斜。
3. 红外编码学习与解析
3.1 原始信号捕获
先用Arduino+VS1838B红外接收头抓取原装遥控器的原始信号,通过串口绘图可以看到典型的NEC编码波形。以格力某款空调为例,一个完整的温度调节指令包含:
- 引导码:9ms高电平+4.5ms低电平
- 32位数据码(含8位地址码+8位反码)
- 载波频率实测38.017kHz
用示波器测量发现,工业红外模块的载波精度(±0.1%)远高于消费级产品(±5%),这是确保信号被空调稳定识别的关键。
3.2 协议转换配置
在ADAM-4561模块上需要设置以下参数:
bash复制# 模块配置命令(通过Modbus RTU写入)
set baudrate 9600
set data_format 8N1
set ir_carrier 38017
set ir_delay 200ms
特别注意格力空调的"组合码"特性——每次按键实际发送两帧数据,第二帧是功能码的补码,因此PLC程序需要做两次写入操作。
4. PLC程序设计要点
4.1 梯形图逻辑设计
在TIA Portal V17中建立以下关键程序块:
- 温度闭环控制:用FB41"CONT_C"功能块实现PID调节,采样周期设为10秒
- 模式切换处理:用SCL语言编写状态机,处理制冷/制热/除湿模式转换
- 红外指令队列:建立DB块存储16条常用指令(开关机、温度±、风速等)
典型的风速控制程序片段:
scl复制IF "自动模式" THEN
"红外指令" := 16#23;
ELSIF "静音模式" THEN
"红外指令" := 16#27;
ELSE
"红外指令" := 16#20 + "风速等级";
END_IF;
4.2 异常处理机制
工业设备的优势在于完善的故障应对:
- 设置看门狗定时器(OB35),超时未收到传感器数据自动切换为安全模式
- 在OB82中编写通信中断处理程序,RS485重试次数设为5次
- 关键数据采用"一备三用"存储策略,防止EEPROM写入磨损
5. 实测性能对比
测试周期30天,对比米家空调伴侣:
| 指标 | PLC方案 | 米家方案 |
|---|---|---|
| 指令响应延迟 | 120±5ms | 300~800ms |
| 温度控制精度 | ±0.2℃ | ±0.5℃ |
| 断网可用性 | 完全不受影响 | 仅基础功能 |
| 日均故障次数 | 0 | 1.2次 |
特别在雷雨天气时,PLC的隔离电源设计完全不受电网波动影响,而智能家居网关出现了两次死机需要手动重启。
6. 进阶改造思路
6.1 多机联动方案
通过Profinet连接多个PLC,实现全屋空调的协同控制。例如:
- 卧室空调提前15分钟启动(通过OB35时间中断触发)
- 客厅与书房空调错峰运行降低电路负荷
- 基于人员定位(通过PLC接蓝牙信标)自动关闭无人房间空调
6.2 能耗优化算法
在DB块中建立空调能效模型,结合电价时段实现:
scl复制CASE "电价时段" OF
1: // 峰电时段
SETPOINT := 26.0;
2: // 谷电时段
IF "室外温度" < 32 THEN
SETPOINT := 24.0;
END_IF;
END_CASE;
7. 常见问题排查
7.1 红外信号无法学习
- 检查ADAM-4561的IR LED极性(阴极接黑色线)
- 用手机摄像头观察发射管是否亮起(工业级红外光肉眼不可见)
- 尝试在PLC程序里增加50ms的指令间隔延时
7.2 Modbus通信中断
- 用USB转485适配器监控总线数据
- 确认终端电阻匹配(120Ω电阻接在总线最远端)
- 修改PLC的OB82组织块,增加通信重试日志记录
7.3 温度控制振荡
- 调整PID参数:建议初始值P=2.0, I=0.01, D=0.5
- 在FB41前增加一阶滞后滤波(TSample=30s)
- 检查AHT20传感器是否避开空调直吹气流
这个方案最让我惊喜的是PLC的RTC(实时时钟)精度——半年累计误差不到1秒,完美实现"工作日7:30自动开机"这种需要长期精准定时的功能。现在连我家的猫都知道,书桌下的那个铁盒子才是真正控制空调的"老大"。