西门子 S7-200 PLC 中实现自由口通讯(Freeport),核心是通过 PLC 的串口(PORT0/PORT1)自定义通讯协议,与变频器、触摸屏、传感器等第三方设备完成数据交互。以下是完整的实操方案,包含通讯参数配置、程序编写、调试方法和典型案例,适配 S7-200(CPU224/226)的编程软件 STEP 7-Micro/WIN,代码可直接复制使用。
一、自由口通讯核心前提
1. 硬件与软件基础
PLC 型号:需带串口的 S7-200(如 CPU224 CN、CPU226 CN,PORT0 为 RS485,PORT1 可选);
编程软件:STEP 7-Micro/WIN V4.0 SP9(兼容所有 S7-200 型号);
通讯接线:RS485 串口(3 脚 = TXD/RXD+,8 脚 = TXD/RXD-),与从站设备的 RS485 端子交叉 / 直连(依设备而定),需接 120Ω 终端电阻(远距离通讯时)。
2. 核心参数(需与从站一致)
自由口通讯需统一波特率、数据位、停止位、奇偶校验,工业常用配置:
| 参数 | 常用值 | 说明 |
|---|---|---|
| 波特率 | 9600/19200 bps | 优先 9600(兼容性好) |
| 数据位 | 8 位 | 几乎所有设备通用 |
| 停止位 | 1 位 | 匹配多数工业设备 |
| 奇偶校验 | 无(None) | 避免校验错误导致通讯失败 |
二、自由口通讯编程步骤(以发送 + 接收为例)
1. 关键指令说明
S7-200 自由口通讯依赖特殊寄存器(SM) 和库指令,核心指令 / 寄存器如下:
| 指令 / 寄存器 | 功能 |
|---|---|
XMT(发送) | 启动自由口数据发送,指定发送缓冲区和长度 |
RCV(接收) | 启动自由口数据接收,指定接收缓冲区和触发条件 |
| SMB30(PORT0) | 配置 PORT0 的通讯模式(自由口 / PP)、波特率、数据位、校验等 |
| SMB86(PORT0 接收) | 接收状态字节(0 = 空闲,2 = 接收完成,5 = 接收溢出) |
| SMB130(PORT1) | 同 SMB30,适配 PORT1 |
| SM3.0(PORT0 发送) | 发送完成中断标志(需绑定中断程序) |
2. 完整程序(PORT0,9600bps,无校验,8N1)
以下程序实现:PLC 主动发送 1 组数据(如 01 03 00 00 00 01 84 0A),并接收从站回复的数据,存储到 V 区。
步骤 1:配置自由口通讯参数
ladder
// 程序段1:初始化自由口参数(SMB30配置PORT0) LD SM0.1 // 首次扫描触发初始化 MOVB 16#09, SMB30 // 16#09 = 自由口模式 + 9600bps + 8位数据 + 1位停止 + 无校验 // 16#09拆解:二进制00001001 → 高4位0000=9600bps,低4位1001=8位数据+1停止+无校验 ENI // 启用全局中断(接收/发送完成需中断)
步骤 2:触发数据发送(XMT 指令)
ladder
// 程序段2:手动触发发送(I0.0为发送按钮) LD I0.0 EU // 上升沿触发(避免重复发送) MOVB 8, VB100 // 发送数据长度=8字节 MOVB 16#01, VB101 // 发送缓冲区起始地址VB101,数据:01 03 00 00 00 01 84 0A MOVB 16#03, VB102 MOVB 16#00, VB103 MOVB 16#00, VB104 MOVB 16#00, VB105 MOVB 16#01, VB106 MOVB 16#84, VB107 MOVB 16#0A, VB108 XMT VB100, 0 // 启动PORT0发送,发送缓冲区VB100(长度+数据)
步骤 3:接收从站回复(RCV 指令)
ladder
// 程序段3:配置接收参数并启动接收 LD SM0.0 MOVB 16#00, SMB87 // 接收控制字节:无起始符/结束符,超时1s,接收任意字符 MOVW +1000, SMW90 // 接收超时时间=1000ms(1s) MOVB 0, SMB89 // 无起始字符 MOVB 0, SMB94 // 无结束字符 RCV VB200, 0 // 启动PORT0接收,接收缓冲区VB200
步骤 4:接收完成处理(中断 / 状态判断)
ladder
// 程序段4:接收完成判断(SMB86=2表示接收完成) LD SMB86 EU MOVB SMB88, VB300 // 存储接收字节数 MOVB VB201, VB301 // 存储接收的第1个数据字节 MOVB VB202, VB302 // 存储接收的第2个数据字节 // 可扩展:根据从站协议解析数据(如Modbus RTU回复)
步骤 5:发送完成中断(可选)
ladder
// 程序段5:绑定发送完成中断(PORT0发送完成触发INT0) LD SM0.1 ATCH INT_0, 9 // 中断事件9=PORT0发送完成,绑定到中断程序INT0 ENI // 中断程序INT0:发送完成后置位标志 INT_0: LD SM0.0 SET M0.0 // M0.0=发送完成标志 RETI // 中断返回
三、典型应用案例:自由口通讯控制变频器
以控制台达 VFD 变频器为例(Modbus RTU 协议,自由口模拟),实现变频器启动、调速:
1. 通讯指令(控制变频器正转,频率 50Hz)
发送数据:01 06 00 01 00 01 08 0A(地址 01,写寄存器 0001,值 0001 = 正转);01 06 00 02 01 F4 39 CB(地址 01,写寄存器 0002,值 01F4=50Hz)。
2. 适配程序(替换上述发送数据段)
ladder
// 启动变频器正转(I0.1触发) LD I0.1 EU MOVB 8, VB100 MOVB 16#01, VB101 MOVB 16#06, VB102 MOVB 16#00, VB103 MOVB 16#01, VB104 MOVB 16#00, VB105 MOVB 16#01, VB106 MOVB 16#08, VB107 MOVB 16#0A, VB108 XMT VB100, 0 // 设置频率50Hz(I0.2触发) LD I0.2 EU MOVB 8, VB100 MOVB 16#01, VB101 MOVB 16#06, VB102 MOVB 16#00, VB103 MOVB 16#02, VB104 MOVB 16#01, VB105 MOVB 16#F4, VB106 MOVB 16#39, VB107 MOVB 16#CB, VB108 XMT VB100, 0
四、调试与排错要点
参数一致性:PLC 与从站的波特率、数据位、校验必须完全一致,否则无数据收发;
接线检查:RS485 的 3/8 脚是否接对(多数设备 3=+,8=-),终端电阻仅远距离(>100m)接;
中断启用:必须执行
ENI指令启用全局中断,否则发送 / 接收完成中断无效;缓冲区长度:发送长度(VB100)需与实际数据字节数一致,避免发送不全;
状态监控:通过 STEP 7-Micro/WIN 的 “状态表” 监控 SMB86(接收状态)、VB200(接收数据),判断是否通讯成功;
干扰处理:通讯线用屏蔽双绞线,远离动力线,单端接地,降低电磁干扰。
五、进阶优化:自由口通讯封装成子程序
将发送 / 接收逻辑封装为子程序,便于复用:
ladder
// 子程序:自由口发送(参数:发送长度IN1,发送缓冲区IN2,端口IN3) SBR_0: LD SM0.0 XMT IN2, IN3 RET // 调用示例:发送8字节,缓冲区VB100,PORT0 LD I0.0 EU CALL SBR_0, 8, VB100, 0
总结
西门子 S7-200 自由口通讯核心是配置 SMB30/SMB130 参数 + XMT/RCV 指令 + 中断(可选);
编程需确保通讯参数与从站一致,发送 / 接收缓冲区长度准确;
调试优先监控 SMB86(接收状态)、SM3.0(发送完成),快速定位通讯故障;
实际应用中可封装子程序,提升代码复用性,适配不同从站设备。
如果需要针对特定从站设备(如传感器、触摸屏) 定制自由口通讯程序,或补充 Modbus RTU 协议的完整解析逻辑,我可以进一步细化。

