- 地暖温控器多机通讯,一台PLC读取多台温控器
- 发布时间:2026-08-23|阅读:次
# 地暖温控器多机通讯方案 — 一台PLC读取多台温控器
## 一、系统架构总览
```
┌─────────────────────────────────────────────────────┐
│ PLC 主站 (Master) │
│ (如西门子S7-1200/三菱FX5U等) │
└──────────────────────┬──────────────────────────────┘
│ RS485总线 / 网线 / 无线
┌─────────────┼─────────────┬──────────────┐
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│温控器 #1 │ │温控器 #2 │ │温控器 #3 │ │温控器 #N │
│房间:客厅 │ │房间:卧室 │ │房间:厨房 │ │房间:书房 │
│地址:01 │ │地址:02 │ │地址:03 │ │地址:0N │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
```
---
## 二、推荐通讯方式对比
| 方案 | 协议 | 优点 | 缺点 | 适用场景 |
|------|------|------|------|----------|
| **① RS485 + Modbus RTU** | Modbus RTU | 简单、稳定、温控器普遍支持 | 速率较低(≤115200) | ⭐最推荐 |
| **② RS485 + 自定义协议** | 自定义帧 | 灵活、高效 | 需开发双方协议 | 批量定制项目 |
| **③ 以太网 + Modbus TCP** | Modbus TCP | 速度快、布线方便 | 成本稍高 | 温控器支持网口 |
| **④ LoRa无线** | 自定义/LoRaWAN | 无需布线 | 延迟高、不稳定 | 改造困难的老建筑 |
| **⑤ KNX总线** | KNX | 国际标准、互操作 | 成本高 | 高端商业项目 |
> **✅ 工程实践中最常用:RS485 + Modbus RTU**
---
## 三、方案详解:RS485 + Modbus RTU
### 3.1 硬件接线
```
PLC RS485接口 ──┬── A ──────────────────┬── A (温控器1)
└── B ──────────────────┬── B (温控器1)
├── A (温控器2)
├── B (温控器2)
├── ...
└── A/B (温控器N)
⚠️ 终端电阻:首端和末端各接120Ω电阻
⚠️ 共地:所有设备GND相连
⚠️ 总线长度:≤1200m(9600bps时)
```
### 3.2 地址分配(Modbus RTU 从站地址)
| 温控器编号 | 从站地址 | 功能码 | 读取内容 |
|-----------|---------|--------|---------|
| #1 客厅 | 1 (0x01) | 0x03 | 当前温度、设定温度、开关状态、故障码 |
| #2 卧室 | 2 (0x02) | 0x03 | 同上 |
| #3 厨房 | 3 (0x03) | 0x03 | 同上 |
| #N 书房 | N (0x0N) | 0x03 | 同上 |
### 3.3 寄存器映射表(典型地暖温控器)
```
从站地址: 0x01 (温控器1)
┌──────────┬──────────────────────┬───────────┐
│ 寄存器 │ 内容 │ 数据类型 │
├──────────┼──────────────────────┼───────────┤
│ 40001 │ 当前室温 (×10) │ INT │
│ 40002 │ 设定温度 (×10) │ INT │
│ 40003 │ 运行状态 (0停/1开) │ INT │
│ 40004 │ 工作模式 (0自动/1手动)│ INT │
│ 40005 │ 故障代码 │ INT │
│ 40006 │ 地暖阀开度 0-100% │ INT │
│ 40007 │ 室温上限报警值 │ INT │
│ 40008 │ 室温下限报警值 │ INT │
└──────────┴──────────────────────┴───────────┘
```
---
## 四、PLC 编程实现
### 4.1 西门子 S7-1200/1500(TIA Portal)示例
```pascal
// === 轮询读取所有温控器数据 ===
// 使用 Modbus RTU 通信指令 (MB_COMM_LOAD + MB_MASTER)
// ===== 读取温控器1 (地址01) =====
// 当前室温 - 寄存器40001
MB_MASTER(
REQ := "Read_T1", // 触发位
MODE := 0, // 0=Modbus RTU
DONE => "Done_T1",
ERROR => "Err_T1",
STATUS => "Status_T1",
MB_DATA_ADDR := 100, // 数据区起始地址
MB_DATA_LEN := 1, // 读取1个寄存器
MB_DATA_PTR := P#DB10.DBW0 // 存放到DB10
);
// 设定温度 - 寄存器40002
MB_MASTER(
REQ := "Read_T2",
MODE := 0,
DONE => "Done_T2",
ERROR => "Err_T2",
MB_DATA_ADDR := 101, // 40002 - 40001 = 1
MB_DATA_LEN := 1,
MB_DATA_PTR := P#DB10.DBW2
);
// ===== 读取温控器2 (地址02) =====
MB_MASTER(
REQ := "Read_T3",
MODE := 0,
MB_DATA_ADDR := 100,
MB_DATA_LEN := 1,
MB_DATA_PTR := P#DB10.DBW4
);
// ... 以此类推
```
**更高效的做法 — 用循环遍历**:
```pascal
// === 结构化轮询(推荐)===
FOR i := 1 TO 16 DO // 假设最多16台温控器
// 构造Modbus请求(功能码03,起始地址40001,读2个寄存器)
MB_COMM_LOAD(
MB_MODE := 2, // RTU模式
SLAVE := i, // 从站地址 = 温控器编号
MB_ADDR := 0, // 40001的偏移 = 0
MB_LENGTH := 2, // 读2个寄存器(温度+状态)
DONE => "LoadDone",
ERROR => "LoadErr"
);
MB_MASTER(
REQ := "LoadDone",
MODE := 2,
DONE => "MasterDone",
ERROR => "MasterErr",
MB_DATA_ADDR := 0,
MB_DATA_LEN := 2,
MB_DATA_PTR := P#DB20.DBW[i*4] // 每台4字节
);
END_FOR;
```
### 4.2 三菱 FX5U 示例
```
// 使用 RS 指令 + 自定义协议
// 帧格式: [STX][设备地址][功能码][数据长度][数据][校验][ETX]
// 读取温控器1
RS2 K1H38400 D100 K8 // RS485通讯,无协议(自定义解析)
// 发送帧: 02 03 00 00 00 02 C4 0B → 期望返回: 02 03 04 XX XX XX XX XX XX
```
### 4.3 国产PLC(信捷/汇川)示例
```pascal
// 信捷PLC - Modbus RTU
// 使用 Modbus RTU 通信指令
MODBUS_READ(
nSlaveAddr := 1, // 从站地址
nStartAddr := 0, // 起始地址
nQuantity := 2, // 读取2个寄存器
pDataAddr := &D100 // 存放地址
);
```
---
## 五、完整数据结构设计(DB块)
```
DB10: "地暖温控数据总表"
┌─────────────────────────────────────────────────────────┐
│ 偏移 │ 名称 │ 说明 │
├─────────┼─────────────┼─────────────────────────────┤
│ DBW0 │ Total_Count │ 在线温控器数量 │
│ DBW2 │ Sys_Fault │ 系统故障标志 │
├─────────┼─────────────┼─────────────────────────────┤
│ ====== 温控器1 (DBW4~DBW11) ====== │
│ DBW4 │ T1_CurTemp │ 当前温度 (÷10) │
│ DBW6 │ T1_SetTemp │ 设定温度 (÷10) │
│ DBW8 │ T1_Status │ 运行状态 │
│ DBW10 │ T1_Mode │ 工作模式 │
│ DBW12 │ T1_Valve │ 阀开度 0~100% │
│ DBW14 │ T1_Fault │ 故障码(0=正常) │
├─────────┼─────────────┼─────────────────────────────┤
│ ====== 温控器2 (DBW16~DBW23) ====== │
│ ... │
├─────────┼─────────────┼─────────────────────────────┤
│ ====== 温控器N (DBW[4+8*(N-1)] ~) ====== │
│ ... │
└─────────────────────────────────────────────────────────┘
```
---
## 六、通讯轮询策略
```
┌────────────────────────────────────────────────┐
│ 推荐轮询策略 │
├────────────────────────────────────────────────┤
│ │
│ PLC 轮询周期: 2~5 秒/台 │
│ 总轮询时间: 16台 × 3秒 = 48秒 (可接受) │
│ │
│ 优化方案: │
│ ┌──────────────────────────────────────┐ │
│ │ 方案A: 固定轮询 (简单可靠) │ │
│ │ T1 → T2 → T3 → ... → T16 → T1 │ │
│ │ │ │
│ │ 方案B: 优先级轮询 (重要房间优先) │ │
│ │ 客厅→主卧→次卧→厨房→...→书房 │ │
│ │ │ │
│ │ 方案C: 变化触发+定时轮询 │ │
│ │ 温控器主动上报变化,PLC定时兜底 │ │
│ └──────────────────────────────────────┘ │
│ │
│ ⚠️ 注意: RS485是半双工,不能同时收发 │
│ 每条请求后需等待响应超时再发下一条 │
│ │
└────────────────────────────────────────────────┘
```
---
## 七、常见问题与解决
| 问题 | 原因 | 解决方案 |
|------|------|---------|
| 🔄 偶尔读不到数据 | 总线冲突/干扰 | 加120Ω终端电阻;增加通讯超时;加CRC校验 |
| 📡 地址冲突 | 多台温控器地址相同 | 出厂时设不同地址;用拨码开关/软件设定 |
| ⚡ 通讯不稳定 | 线缆质量差/距离远 | 用屏蔽双绞线;加中继器;降低波特率 |
| 🕐 响应太慢 | 轮询台数太多 | 分组轮询;提高波特率到115200;用以太网替代 |
| 🔧 写入设定温度失败 | 温控器锁定/权限不足 | 确认温控器开放写权限;检查功能码是否正确 |
| 📶 部分温控器掉线 | 接线松动/设备故障 | 检查物理连接;加心跳检测机制 |
---
## 八、扩展功能建议
```
✅ 远程控制: PLC可通过Modbus功能码0x06/0x10修改设定温度
✅ 定时策略: 在PLC中编写时间表(如夜间降低2℃)
✅ 报警联动: 温度异常/故障 → PLC触发报警灯/短信
✅ 数据上传: PLC通过以太网将数据传到云平台/SCADA
✅ 人机界面: 配合触摸屏显示所有房间温控状态
```
---
## 九、推荐选型清单
| 项目 | 推荐型号 |
|------|---------|
| **PLC** | 西门子S7-1200 / 三菱FX5U / 信捷XD5 / 汇川H5U |
| **温控器** | 海林HL108/HL208、森威尔S20、白PID等(需支持Modbus RTU) |
| **RS485模块** | 西门子CM 1241、三菱FX5-485BD |
| **转换器** | USB转RS485(调试用) |
---
> 💡 **总结:最实用的方案 = RS485总线 + Modbus RTU协议 + 轮询读取**,温控器成本低、PLC编程简单、系统稳定可靠。需要我针对某个具体PLC品牌或温控器型号给出更详细的代码吗?