用程序具体实现西门子 S7-200 PLC 自由口通讯的完整功能(包含数据发送、接收、协议解析、故障处理),我会基于工业实操场景,提供可直接下载到 PLC 运行的完整梯形图程序,并拆解每一段程序的逻辑和作用,同时补充关键的调试方法,让你能快速落地。
核心目标(通用工业场景)
以 PLC 通过自由口通讯读取Modbus RTU 传感器(如压力传感器,地址 01,寄存器 40001)的数值为例,实现:
初始化自由口参数(9600bps、8N1);
定时主动发送读取指令;
接收传感器回复并解析出实际数值;
增加通讯故障判断(超时、无回复报警);
封装成通用子程序,便于复用。
一、完整程序实现(STEP 7-Micro/WIN V4.0 SP9)
1. 变量定义(符号表,便于理解)
| 符号名 | 地址 | 数据类型 | 说明 |
|---|---|---|---|
| Freeport_Init | SM0.1 | BOOL | 首次扫描初始化 |
| Send_Trigger | I0.0 | BOOL | 手动触发发送(也可改用定时) |
| Send_Length | VB100 | BYTE | 发送数据长度 |
| Send_Buf | VB101 | BYTE | 发送缓冲区起始地址 |
| Recv_Buf | VB200 | BYTE | 接收缓冲区起始地址 |
| Recv_Length | VB300 | BYTE | 接收字节数 |
| Pressure_Value | VD301 | REAL | 解析后的压力值(实际物理量) |
| Comm_Alarm | M0.0 | BOOL | 通讯故障报警 |
| Comm_OK | M0.1 | BOOL | 通讯成功标志 |
| Timer_1s | T37 | TIMER | 1s 定时(用于循环发送) |
2. 完整梯形图程序(分模块解析)
模块 1:自由口参数初始化(必做)
ladder
// 程序段1:初始化自由口(PORT0)+ 启用中断 LD Freeport_Init (SM0.1) MOVB 16#09, SMB30 // 配置PORT0:自由口+9600bps+8位+1停止+无校验 MOVB 16#00, SMB87 // 接收控制:无起始/结束符,超时1s,接收任意字符 MOVW +1000, SMW90 // 接收超时时间=1000ms MOVB 0, SMB89 // 无起始字符 MOVB 0, SMB94 // 无结束字符 ATCH INT_0, 9 // 绑定PORT0发送完成中断(事件9)到INT0 ATCH INT_1, 23 // 绑定PORT0接收完成中断(事件23)到INT1 ENI // 启用全局中断(关键!否则中断无效) MOVB 0, Comm_Alarm (M0.0) // 初始化故障标志 MOVB 0, Comm_OK (M0.1) // 初始化成功标志
解析:
SMB30=16#09是核心配置,二进制00001001:高 4 位0000=9600bps,低 4 位1001=8 位数据 + 1 停止位 + 无校验;ATCH指令绑定中断事件,ENI必须执行,否则中断不生效。
模块 2:定时 / 手动触发数据发送(读取传感器指令)
ladder
// 程序段2:1s定时触发发送(替代手动按钮,工业常用) LD SM0.0 TON Timer_1s (T37), 100 // 定时1s(100×10ms) LD Timer_1s (T37) EU // 上升沿触发,避免重复发送 // 也可改用手动触发:LD Send_Trigger (I0.0) + EU // 程序段3:填充发送数据(Modbus RTU读取指令:01 03 00 00 00 01 84 0A) MOVB 8, Send_Length (VB100) // 发送长度=8字节 MOVB 16#01, Send_Buf (VB101) // 从站地址=01 MOVB 16#03, VB102 // 功能码=03(读取保持寄存器) MOVB 16#00, VB103 // 起始寄存器高字节=00 MOVB 16#00, VB104 // 起始寄存器低字节=00(40001) MOVB 16#00, VB105 // 读取寄存器数量高字节=00 MOVB 16#01, VB106 // 读取寄存器数量低字节=01(1个寄存器) MOVB 16#84, VB107 // CRC校验高字节 MOVB 16#0A, VB108 // CRC校验低字节 // 程序段4:启动发送 XMT Send_Length (VB100), 0 // PORT0发送,缓冲区VB100(长度+数据) MOVB 0, Comm_OK (M0.1) // 发送后重置成功标志 MOVB 0, Comm_Alarm (M0.0) // 重置故障标志
解析:
发送的指令是 Modbus RTU 标准格式:
从站地址+功能码+寄存器地址+寄存器数量+CRC校验;用
TON定时器实现 1s 循环发送,替代手动按钮,适配工业 “持续采集数据” 的需求;CRC 校验值可通过 Modbus CRC 计算器生成,避免手动计算错误。
模块 3:接收数据并解析(中断处理,更高效)
ladder
// 中断程序INT1:PORT0接收完成(事件23) INT_1: LD SM0.0 // 步骤1:判断接收是否正常(SMB86=2=接收完成) LDB= SMB86, 2 JMP 0 // 正常则跳转到解析逻辑 MOVB 1, Comm_Alarm (M0.0) // 接收异常(超时/溢出),置位故障报警 RETI // 中断返回 LBL 0 // 步骤2:存储接收字节数 MOVB SMB88, Recv_Length (VB300) // 步骤3:解析Modbus回复(回复格式:01 03 02 00 64 D8 0A → 数值=100) // 回复数据:VB201=01(地址)、VB202=03(功能码)、VB203=02(字节数)、VB204=高字节、VB205=低字节 MOVW VW204, VW301 // 将高低字节合并为字(VW204=VB204+VB205) // 步骤4:转换为实际物理量(假设传感器量程0-200MPa,对应数值0-4095) MOVR VW301, VD301 // 字转实数 /R 4095.0, VD301 // 归一化 *R 200.0, VD301 // 转换为MPa(Pressure_Value=VD301) // 步骤5:置位成功标志 MOVB 1, Comm_OK (M0.1) RETI // 中断返回
ladder
// 中断程序INT0:PORT0发送完成(事件9) INT_0: LD SM0.0 SET M1.0 // 发送完成标志(可用于调试) RETI
解析:
用接收完成中断处理数据,比轮询
SMB86更高效,避免主程序阻塞;解析逻辑:Modbus 回复的有效数据在
VB204-VB205(16 位寄存器值),需转换为实际物理量(如压力、温度);若接收异常(如超时、溢出),立即置位故障报警,便于现场排查。
模块 4:通讯故障兜底(超时判断)
ladder
// 程序段5:接收超时故障(1.5s未接收则报警) LD SM0.0 TON T38, 150 // 定时1.5s LDB= Comm_OK (M0.1), 0 // 通讯未成功 LDT= T38, 150 // 超时1.5s ALD // 两个条件同时满足 MOVB 1, Comm_Alarm (M0.0) // 置位故障报警 // 超时后重置定时器 LD Comm_OK (M0.1) R T38, 1
解析:
增加超时判断,避免 “接收中断未触发但无报警” 的情况;
超时时间设为 1.5s(比发送周期 1s 稍长),兼顾响应速度和容错性。
二、程序下载与调试步骤
硬件连接:
PLC PORT0(3 脚 = RS485+,8 脚 = RS485-)接传感器 RS485 端子(+/- 对应);
通讯线用屏蔽双绞线,距离 > 100m 时接 120Ω 终端电阻(PLC 侧)。
软件操作:
VD301:解析后的实际压力值;M0.0:通讯故障标志(1 = 故障);M0.1:通讯成功标志(1 = 成功)。打开 STEP 7-Micro/WIN,新建项目,选择对应 PLC 型号(如 CPU224 CN);
编写上述梯形图程序,下载到 PLC(PLC 需处于 STOP 模式,下载后切换到 RUN);
打开 “状态表”,监控以下地址:
调试排错:
若
M0.0=1(故障):检查传感器参数(波特率、地址)、接线、CRC 校验值;若
VD301数值异常:检查解析公式(量程转换系数)是否匹配传感器实际量程;若接收数据乱码:增加屏蔽线接地,远离动力线,降低电磁干扰。
三、通用化改造(适配不同设备)
若要通讯其他设备(如变频器、触摸屏),仅需修改 2 处:
发送数据段:替换
VB101-VB108的数值为对应设备的通讯指令;解析逻辑段:根据设备回复的协议格式,调整
VW204的位置和量程转换系数。
总结
西门子 S7-200 自由口通讯程序的核心是「初始化参数→发送指令→中断接收→解析数据→故障处理」;
用中断处理接收逻辑,比轮询更高效,适合工业实时性要求;
必须增加故障判断(超时、异常接收),便于现场快速定位问题;
量程转换公式需根据实际设备的量程调整,是解析物理量的关键。

