S7-1500工业通信实战:TSEND_C与TRCV_C功能块深度解析
在工业自动化领域,PLC与第三方设备的通信一直是项目实施中的关键环节。当我们需要将S7-1500系列PLC通过TCP/IP网络与串口设备连接时,西门子提供的TSEND_C和TRCV_C功能块组合能够显著简化通信配置流程。本文将从一个实际项目案例出发,详细剖析这对功能块的使用技巧和常见陷阱。
1. 通信架构设计与环境准备
工业现场常见的通信场景是PLC需要与只支持RS232协议的设备交换数据。这种情况下,TCP/IP转RS232网关设备就成为了桥梁。我们的案例使用S7-1500 CPU 1516-3 PN/DP作为主站,通过Profinet接口连接至MOXA NPort 5150系列串口服务器。
硬件配置清单:
- S7-1500 CPU 1516-3 PN/DP (6ES7 516-3AN00-0AB0)
- MOXA NPort 5150串口服务器
- 24V直流电源
- 标准以太网线缆
在TIA Portal V17中新建项目时,需要注意以下几点:
- 确保已安装最新版STEP 7 Professional
- 检查硬件支持包(HSP)是否包含所用串口服务器的GSD文件
- 提前准备好设备的IP地址规划表
提示:建议在项目初期就建立IP地址分配文档,记录PLC、HMI和所有网络设备的IP、子网掩码及MAC地址。
2. TIA Portal中的通信组态
打开TIA Portal后,首先需要完成硬件组态。在项目树中双击"设备组态",添加CPU 1516-3 PN/DP模块。关键步骤包括:
- 右键点击CPU的Profinet接口,选择"属性"
- 在"以太网地址"选项卡中设置PLC的IP地址(如192.168.1.10)
- 在"操作模式"选项卡中确认接口工作在全双工模式
对于串口服务器设备,需要通过其网页界面预先配置:
- 工作模式:TCP Server
- 监听端口:2000(示例)
- 串口参数:9600bps, 8数据位, 无校验, 1停止位
通信参数对照表:
| 参数项 | PLC侧设置 | 串口服务器设置 |
|---|---|---|
| IP地址 | 192.168.1.10 | 192.168.1.20 |
| 端口号 | 动态分配 | 2000 |
| 协议类型 | ISO-on-TCP | RAW |
| 连接方式 | 主动连接 | 被动监听 |
3. TSEND_C功能块深度解析
TSEND_C是西门子提供的智能通信功能块,集成了连接管理和数据发送功能。在OB1中调用该块时,需要特别注意其异步执行特性。
// TSEND_C典型调用示例 "TSEND_C_DB"( REQ := "Send_Trigger", // 上升沿触发发送 CONT := TRUE, // 保持连接 CONNECT := "Conn_Data", // 连接参数结构体 DATA := "Send_Buffer", // 发送数据区 LEN := 10, // 发送字节数 BUSY => "Send_Busy", // 发送状态标志 DONE => "Send_Done", // 发送完成标志 ERROR => "Send_Error", // 错误标志 STATUS => "Send_Status" // 状态字 );关键参数解析:
CONT:连接保持控制位。设为TRUE时,功能块会自动维护TCP连接REQ:发送触发信号。需要每个发送周期都产生上升沿CONNECT:指向一个UDT类型的连接参数结构体
状态机监控是使用TSEND_C的核心技巧。通过分析STATUS输出值,可以精确判断通信状态:
7000: 待机状态 7001: 连接建立中(瞬时状态) 7002: 连接建立过程 7004: 连接已建立 7005: 数据发送中 7003: 连接断开中4. TRCV_C功能块的实战应用
与TSEND_C配对使用的TRCV_C功能块同样具有连接管理能力,但在处理不定长数据时需要特殊配置。
// TRCV_C典型调用示例 "TRCV_C_DB"( EN_R := TRUE, // 持续使能接收 CONT := TRUE, // 保持连接 CONNECT := "Conn_Data", // 连接参数结构体 DATA := "Recv_Buffer", // 接收数据区 LEN := 256, // 缓冲区长度 RCVD_LEN => "Recv_Len", // 实际接收长度 BUSY => "Recv_Busy", // 接收状态标志 NDR => "Recv_Ready", // 新数据就绪标志 ERROR => "Recv_Error", // 错误标志 STATUS => "Recv_Status" // 状态字 );不定长数据接收的关键设置:
- 在TRCV_C的输入参数中设置LEN为接收缓冲区最大长度
- 将ADHOC参数设为TRUE,允许接收不完整数据帧
- 通过RCVD_LEN输出参数获取实际接收的字节数
注意:当ADHOC=1时,需要应用程序自行处理数据帧的完整性校验,常见的做法是在协议中加入帧头、帧尾和CRC校验。
5. 功能块组合策略与性能优化
在实际项目中,TSEND_C和TRCV_C的组合使用需要遵循特定规则以避免连接冲突。西门子官方推荐以下两种安全组合方式:
TSEND_C + TRCV组合
- 优点:连接由发送方管理,逻辑清晰
- 适用场景:主从式通信,PLC作为主站主动发起请求
TSEND + TRCV_C组合
- 优点:连接由接收方管理,适合被动接收
- 适用场景:PLC需要长期监听设备上报数据
通信性能优化技巧:
- 在循环中断OB(如OB35)中调用通信功能块,确保定时执行
- 为发送和接收分别创建专用的DB块作为缓冲区
- 使用S7-1500的优化块访问功能提升数据存取效率
- 在连接参数中设置合理的TSAP(Transport Service Access Point)
// 连接参数结构体示例 STRUCT interface_id : WORD := 16#0100; // 使用第一个Profinet接口 id : WORD := 1; // 连接ID connection_type : BYTE := 11; // ISO-on-TCP连接 active_est : BOOL := TRUE; // 主动建立连接 local_tsap_id : WORD := 16#0000; // 本地TSAP(自动分配) rem_subnet_id : WORD := 16#0000; rem_staddr : ARRAY[1..4] OF BYTE := [192,168,1,20]; // 远程IP rem_tsap_id : WORD := 16#07D0; // 远程TSAP(2000) next_staddr : ARRAY[1..4] OF BYTE := [0,0,0,0]; END_STRUCT6. 诊断与故障排除实战
当通信出现问题时,系统提供的状态信息是排查故障的第一手资料。以下是常见STATUS代码及其含义:
通信状态代码速查表:
| 状态值 | 含义 | 建议处理措施 |
|---|---|---|
| 16#7000 | 连接未建立 | 检查CONT参数是否置位 |
| 16#7004 | 连接已建立 | 正常通信状态 |
| 16#7005 | 数据发送中 | 等待发送完成 |
| 16#80xx | 通信错误 | 根据具体错误代码排查 |
| 16#8081 | 连接被对端关闭 | 检查对端设备状态 |
| 16#8082 | 连接超时 | 检查网络连通性 |
对于复杂的通信问题,可以采用分步诊断法:
- 首先确认物理层连通性(ping测试)
- 检查TIA Portal中的连接参数配置
- 使用Wireshark抓包分析TCP通信过程
- 验证串口服务器的数据转换是否正确
- 在PLC侧添加状态监控程序
在最近的一个污水处理厂自动化项目中,我们发现当TRCV_C的EN_R参数频繁切换时,会导致连接不稳定。最终的解决方案是在PLC程序中添加了通信状态机,确保连接建立后至少保持5秒的稳定期再进行数据传输。这个经验告诉我们,工业通信不仅需要正确的参数配置,还需要考虑现场环境的特殊性。