1. 项目概述
在工业自动化现场,PLC与智能仪表的通讯是构建分布式控制系统的基础需求。西门子S7-1200作为一款中型PLC,其内置的Modbus RTU主站功能可以高效管理多台485设备。本文将详细解析如何构建一个可稳定运行的轮询程序框架,实现单模块控制32路485设备的数据采集。
关键优势:相比传统的点对点通讯方式,轮询架构可节省硬件成本,单个CM 1241 RS485模块即可管理32台从站设备,通讯周期可控制在5秒以内(波特率9600时)
2. 硬件配置要点
2.1 通信模块选型
S7-1200系列需搭配CM 1241 RS485通信模块(6ES7241-1CH32-0XB0)实现Modbus RTU通讯。该模块具有以下技术特性:
- 支持RS485半双工通信
- 最高传输速率187.5 kbit/s
- 带隔离保护(1500V DC)
- 内置终端电阻(可通过开关启用)
2.2 接线规范
正确的物理连接是通讯稳定的前提:
- 使用屏蔽双绞线(建议AWG18)
- 总线两端需接入120Ω终端电阻
- 接线端子定义:
- 引脚3:RS485信号B(正)
- 引脚8:RS485信号A(负)
- 引脚1:屏蔽层接地
实测经验:当通讯距离超过50米时,建议在总线中段增加信号放大器。曾遇到因车间电机干扰导致通讯丢包的情况,后通过改用双层屏蔽电缆解决。
3. 软件环境搭建
3.1 TIA Portal配置
- 创建新项目后,按实际型号添加CPU和CM1241模块
- 在设备视图中配置通信参数:
- 传输速率:9600 baud(典型值)
- 奇偶校验:偶校验(Parity_even)
- 数据位:8位
- 停止位:1位
- 设置硬件标识符(如PLC_1.CPU_PT_P1)
3.2 指令库添加
Modbus RTU功能需要额外安装指令库:
- 在项目树中右键"程序块"
- 选择"类型"→"从库中插入"
- 添加"Modbus_Comm_Load"和"Modbus_Master"指令
4. 核心程序实现
4.1 初始化模块(OB100)
pascal复制// 初始化Modbus主站
MB_COMM_LOAD_DB.DONE := FALSE;
MB_COMM_LOAD_DB.ERROR := FALSE;
MB_COMM_LOAD_DB.PORT := "PLC_1".CPU_PT_P1;
MB_COMM_LOAD_DB.BAUDRATE := 9600;
MB_COMM_LOAD_DB.PARITY := 2; // 偶校验
MB_COMM_LOAD_DB.DATABITS := 8;
MB_COMM_LOAD_DB.STOPBITS := 1;
MB_COMM_LOAD_DB.MB_DB := 1; // 指定背景DB号
CALL "MB_COMM_LOAD" DB_NO := MB_COMM_LOAD_DB;
调试技巧:初始化完成后检查MB_COMM_LOAD_DB.STATUS,值为16#7000表示成功。曾因端口号配置错误导致初始化失败,STATUS返回16#80B0。
4.2 轮询控制逻辑
建立DB10作为设备管理数据库,结构定义如下:
| 偏移量 | 变量名 | 数据类型 | 说明 |
|---|---|---|---|
| 0.0 | Device_Active | BOOL | 设备使能标志 |
| 2.0 | Device_Address | BYTE | Modbus从站地址 |
| 4.0 | Read_Data | REAL | 读取数据存储区 |
| 8.0 | Write_Data | REAL | 写入数据存储区 |
轮询程序实现:
pascal复制// 在OB1中循环执行
IF NOT MB_MASTER_DB.BUSY THEN
// 更新设备索引
Static.Counter := Static.Counter + 1;
IF Static.Counter > 32 THEN
Static.Counter := 1;
END_IF;
// 检查设备使能状态
IF DB10[Static.Counter].Device_Active THEN
// 设置Modbus主站参数
MB_MASTER_DB.REQ := TRUE;
MB_MASTER_DB.ID := DB10[Static.Counter].Device_Address;
MB_MASTER_DB.FUNC := 3; // 功能码3-读保持寄存器
MB_MASTER_DB.ADDR := 40001; // 起始地址
MB_MASTER_DB.CNT := 2; // 读取2个寄存器(32位浮点数)
MB_MASTER_DB.DATA_ADDR := P#DB10.DBX[Static.Counter * 16 + 4].REAL;
CALL "MB_MASTER" DB_NO := MB_MASTER_DB;
END_IF;
END_IF;
4.3 数据标准化处理
仪表原始数据通常需要转换:
pascal复制// 温度转换示例(PT100热电阻)
IF MB_MASTER_DB.DONE AND (MB_MASTER_DB.STATUS = 16#0000) THEN
RawValue := DB10[Static.Counter].Read_Data;
// 量程转换公式:实际值 = (原始值/27648)*量程
Temperature := (RawValue / 27648.0) * 200.0 - 50.0; // -50~150℃量程
// 数据有效性检查
IF (Temperature < -50.0) OR (Temperature > 150.0) THEN
DB10[Static.Counter].Data_Valid := FALSE;
ELSE
DB10[Static.Counter].Data_Valid := TRUE;
END_IF;
END_IF;
5. 高级功能实现
5.1 通讯超时处理
pascal复制// 在OB35(定时中断组织块)中实现
IF MB_MASTER_DB.BUSY THEN
Static.Timeout_Counter := Static.Timeout_Counter + 1;
IF Static.Timeout_Counter > 50 THEN // 5秒超时(OB35默认100ms周期)
MB_MASTER_DB.REQ := FALSE;
Static.Timeout_Counter := 0;
DB10[Static.Counter].Comm_Fault := TRUE;
END_IF;
ELSE
Static.Timeout_Counter := 0;
END_IF;
5.2 数据块自动初始化
pascal复制// 在OB100中添加设备默认配置
FOR i := 1 TO 32 DO
DB10[i].Device_Active := TRUE;
DB10[i].Device_Address := i; // 地址1-32
DB10[i].Read_Data := 0.0;
DB10[i].Write_Data := 0.0;
DB10[i].Comm_Fault := FALSE;
END_FOR;
6. 故障诊断手册
6.1 常见错误代码
| 状态码 | 含义 | 解决方案 |
|---|---|---|
| 16#0000 | 通讯成功 | - |
| 16#80B0 | 端口已被占用 | 检查硬件配置冲突 |
| 16#8381 | 从站无响应 | 检查设备地址/接线/终端电阻 |
| 16#8382 | CRC校验错误 | 检查波特率/奇偶校验设置 |
| 16#8384 | 功能码不支持 | 确认从站支持的功能码 |
6.2 信号质量检测
使用示波器测量RS485信号:
- 正常波形:差分电压幅值≥1.5V
- 异常现象:
- 信号振铃:增加终端电阻
- 电平偏移:检查共模电压(应<|12V|)
- 噪声干扰:启用屏蔽层接地
7. 性能优化建议
-
通讯速率提升:
- 将波特率提高到19200(需所有设备支持)
- 缩短OB1循环周期(建议≤50ms)
-
数据分组读取:
pascal复制MB_MASTER_DB.ADDR := 40001; MB_MASTER_DB.CNT := 10; // 一次读取10个寄存器 -
优先级调度:
pascal复制// 关键设备优先读取 IF Static.Counter = 1 THEN // 1号设备每轮询周期读取两次 CALL "MB_MASTER"... END_IF;
实际项目中采用上述优化后,32台设备的轮询周期从8.2秒缩短到3.5秒,数据刷新率提升57%。
