1. 项目概述
在工业自动化领域,PLC之间的通讯是实现设备互联和系统集成的关键技术。西门子S7-1200系列作为中小型自动化项目的首选控制器,其以太网通讯能力在实际工程中应用广泛。本文将详细解析两台S7-1200 PLC之间通过TCP协议实现以太网通讯的全过程。
我曾在多个工业现场实施过类似方案,发现许多工程师在初次尝试PLC间通讯时,常会遇到连接不稳定、数据丢包或配置错误等问题。通过本文的实践指导,你将掌握从硬件连接到软件配置的完整流程,以及我在实际项目中积累的调试技巧和问题排查方法。
2. 硬件准备与网络拓扑
2.1 设备选型与连接
实现S7-1200 PLC间的TCP通讯,需要以下硬件设备:
- 两台西门子S7-1214C DC/DC/DC PLC(固件版本V4.2及以上)
- 标准以太网电缆(建议使用CAT6屏蔽双绞线)
- 24V直流电源(为PLC供电)
- 网络交换机(可选,用于多设备组网)
注意:虽然S7-1200自带一个PROFINET接口,但TCP通讯对接口没有特殊要求,普通以太网接口即可满足需求。
硬件连接步骤:
- 使用以太网电缆直接连接两台PLC的以太网接口(交叉线或直连线均可,现代设备大多支持自动翻转)
- 若需要接入更多设备,可通过交换机组建星型网络
- 为每台PLC接通24V电源
2.2 IP地址规划
合理的IP地址规划是通讯成功的基础。建议采用以下方案:
| 设备 | IP地址 | 子网掩码 | 默认网关 |
|---|---|---|---|
| PLC1 | 192.168.0.1 | 255.255.255.0 | 192.168.0.254 |
| PLC2 | 192.168.0.2 | 255.255.255.0 | 192.168.0.254 |
实操心得:在实际工程中,我习惯将PLC的IP地址末尾设置为设备编号,如.1、.2等,便于现场维护人员识别。避免使用.0和.255,这些地址有特殊用途。
3. 软件配置详解
3.1 TIA Portal项目创建
- 打开TIA Portal V15或更高版本
- 新建项目,命名为"S7-1200_TCP_Communication"
- 添加两台S7-1200 PLC设备:
- 右键点击"项目树"→"添加新设备"
- 分别选择正确的CPU型号和固件版本
- 为每台PLC设置设备名称(如PLC1、PLC2)
3.2 网络组态配置
- 进入"网络视图"界面
- 为每台PLC的以太网接口分配IP地址(与硬件规划一致)
- 在"属性"选项卡中,确保"自动生成PROFINET设备名称"已启用
常见问题:如果IP地址冲突,TIA Portal会显示警告。此时需要检查网络中是否有其他设备使用了相同IP。
3.3 TCP连接配置
3.3.1 建立连接
在PLC1中配置TCP连接:
- 在项目树中展开PLC1→"程序块"→"添加新块"
- 选择"TCON_IP"连接类型
- 设置连接参数:
- 连接类型:TCP
- 主动/被动:主动(PLC1将主动连接PLC2)
- 伙伴IP地址:192.168.0.2(PLC2的地址)
- 本地/远程TSAP:2000(可自定义,但两端需一致)
3.3.2 连接ID分配
每个TCP连接需要唯一的连接ID:
- PLC1的连接ID:1
- PLC2的连接ID:2(在PLC2中配置被动连接时使用)
注意事项:连接ID必须在1~65535范围内,且同一PLC内的连接ID不能重复。我建议从1开始顺序编号,便于管理。
4. 通讯程序编写
4.1 发送端程序(PLC1)
在PLC1的OB1主循环中编写发送程序:
STL复制// 建立连接
"TCON_DB"(REQ := "Start_Connect",
ID := 1,
INTERFACE_ID := 16#01000000,
CONNECT := "Connect_Param",
DONE => "Connect_Done",
BUSY => "Connect_Busy",
ERROR => "Connect_Error",
STATUS => "Connect_Status");
// 发送数据
"TSEND_DB"(REQ := "Send_Trigger",
ID := 1,
LEN := 10,
DATA := "Send_Buffer",
DONE => "Send_Done",
BUSY => "Send_Busy",
ERROR => "Send_Error",
STATUS => "Send_Status");
4.2 接收端程序(PLC2)
在PLC2的OB1中编写接收程序:
STL复制// 等待连接
"TCON_DB"(REQ := TRUE,
ID := 2,
INTERFACE_ID := 16#01000000,
CONNECT := "Connect_Param",
DONE => "Connect_Done",
BUSY => "Connect_Busy",
ERROR => "Connect_Error",
STATUS => "Connect_Status");
// 接收数据
"TRCV_DB"(EN_R := TRUE,
ID := 2,
LEN := 10,
DATA := "Receive_Buffer",
RCVD_LEN => "Received_Length",
BUSY => "Receive_Busy",
ERROR => "Receive_Error",
STATUS => "Receive_Status");
4.3 数据区定义
在DB块中定义通讯数据区:
STL复制// 发送数据区
"Send_Buffer" : ARRAY[0..9] OF BYTE; // 10字节发送缓冲区
// 接收数据区
"Receive_Buffer" : ARRAY[0..9] OF BYTE; // 10字节接收缓冲区
// 连接参数
"Connect_Param" : TCON_IP := (
interface_id := 16#01000000,
id := 1,
connection_type := 11, // TCP
active_est := TRUE, // 主动建立连接
rem_subnet_id := 16#00000000,
rem_staddr := 16#C0A80002, // 192.168.0.2
rem_tsap_id := 16#00002000, // 远程TSAP 2000
local_tsap_id := 16#00002000 // 本地TSAP 2000
);
5. 调试与问题排查
5.1 通讯测试步骤
- 下载程序到两台PLC
- 在线监控PLC1的"Connect_Done"和"Connect_Error"信号
- 触发"Start_Connect"信号(置为TRUE)
- 观察连接状态:
- 如果"Connect_Done"变为TRUE,表示连接成功
- 如果"Connect_Error"为TRUE,检查"Connect_Status"值
5.2 常见错误代码及解决方法
| 状态码 | 含义 | 解决方案 |
|---|---|---|
| 16#2523 | 连接已存在 | 检查连接ID是否重复 |
| 16#2581 | 伙伴设备无响应 | 检查网络连接和IP设置 |
| 16#2582 | 连接被伙伴拒绝 | 检查TSAP和连接类型是否匹配 |
| 16#2583 | 连接超时 | 增加连接超时时间 |
| 16#2584 | 本地资源不足 | 减少并发连接数 |
5.3 性能优化建议
- 通讯周期:对于实时性要求高的应用,建议通讯周期不小于50ms,避免网络拥堵
- 数据量控制:单次通讯数据量建议不超过240字节,大数据可分多次传输
- 错误处理:添加重连机制,在连接断开后自动尝试重新连接
- 信号滤波:对关键信号添加软件滤波,避免网络抖动导致的误动作
实操心得:在多个项目实践中,我发现添加简单的"心跳包"机制能显著提高通讯可靠性。可以定义1字节的心跳信号,每隔固定时间互相发送,通过监控心跳信号来判断连接状态。
6. 高级应用扩展
6.1 多PLC组网通讯
当需要实现多台PLC之间的通讯时,可以采用以下方案:
- 主从模式:指定一台PLC作为主站,其他作为从站
- 轮询机制:主站依次与各从站通讯,避免冲突
- 数据集中:主站收集所有从站数据,统一处理
示例网络拓扑:
code复制[PLC1(主站)]
│
├──[PLC2(从站)]
└──[PLC3(从站)]
6.2 与上位机通讯
S7-1200的TCP通讯同样适用于与上位机(如SCADA系统)的数据交换:
- 上位机作为TCP客户端,PLC作为服务器
- 使用标准Socket接口进行通讯
- 数据格式可采用S7协议或自定义协议
6.3 安全增强措施
- 网络隔离:将PLC网络与办公网络物理隔离
- 访问控制:启用PLC的访问密码保护
- 数据加密:对关键数据进行简单的异或加密
- 日志记录:记录重要通讯事件,便于故障追溯
在实际项目中,我曾遇到因网络风暴导致PLC通讯中断的情况。后来通过配置交换机的端口隔离和广播抑制功能解决了问题。这也提醒我们,工业通讯不仅要关注协议实现,还要重视基础网络环境的稳定性。
