☰
S7-200 SMART双PLC以太网TCP通信实战:从配置到联调全流程
2026/9/28 7:21:19 网站建设 项目流程

先说我为什么写这篇东西。

这几年在现场碰到的项目里,两台S7-200 SMART之间要对传数据的场景非常多:一条产线有两台分控柜,A柜要告诉B柜当前测了多少件,B柜要把报警状态送回A柜;或者一个大工位上分成左右两个工作站,各用一台SMART,之间需要互锁、同步启动。以前大家习惯用PROFIBUS或者拉一堆IO线解决问题,但S7-200 SMART的IO扩展能力有限,跨柜拉线又容易受干扰,维护起来也难受。后来我尝试用自带的以太网口做TCP通信,直接把数据包打到对方PLC里,稳定性和灵活性都上来了,而且一根网线就能解决,成本几乎为零。

这篇文章就是把我在实际项目中配置S7-200 SMART TCP双PLC互传的完整过程、踩过的坑、以及最后沉淀下来的可靠做法都整理出来。不管你是刚接触PLC通信的调试工程师,还是已经在用SMART但对以太网通信不太熟的老师傅,都能按着这套流程落地。全程不需要第三方模块,用CPU自带的以太网口就能实现。

1. 通信背景与方案选型

1.1 S7-200 SMART 的以太网通信能力盘点

S7-200 SMART从ST20、ST30一直到SR60这种带以太网口的CPU,出厂就集成一个RJ45接口,支持多种以太网协议。很多人用它只是拿来下载程序,觉得“能连编程软件”就等于“能通信”,这个理解其实窄了。

S7-200 SMART的以太网口真正能做的事情分为四类。第一类是通过STEP 7-MicroWIN SMART编程软件进行程序上传下载和在线监控,这是最基础的应用。第二类是支持Modbus TCP库指令,也就是MB_Client和MB_Server,可以直接和第三方设备、上位机组态软件做标准Modbus TCP通信。第三类是支持开放的TCP/UDP通信,通过软件自带的开放式用户通信功能,你可以自由定义连接对方的IP和端口,按自己的报文格式收发数据,这就是本文的核心方案。第四类是S7协议通信,通常用于和西门子上位软件或者HMI直连。

这里要强调一个关键前提:S7-200 SMART要支持开放式TCP通信,CPU固件版本必须达到V2.2及以上。早期出厂的CPU固件V2.0、V2.1只有Modbus TCP和S7协议,工具菜单里压根看不到开放式通信向导。我最初踩过的坑就在这,程序写好却发现指令库里没有对应功能,最后查手册才发现固件版本太低。升级固件需要去西门子官网下载对应固件文件,然后在MicroWIN SMART的“PLC”菜单里做固件更新,一次就好。

1.2 为什么选 TCP:与 PPI / Modbus RTU 的取舍

很多老工程师习惯用PPI或者Modbus RTU做两台PLC通信。PPI是西门子专用的串行协议,需要在程序里配置主从站,而且只有S7-200系列支持,换第三方设备基本没戏。Modbus RTU虽然通用,但走的是RS485总线,波特率一般也就9600或19200,数据量大一点、传输距离长一点,轮询周期就很紧张,再加上要额外买通信板或扩展模块,接线也麻烦。

TCP通信的优势在这个场景里非常突出。第一,S7-200 SMART自带以太网口,不需要加任何硬件模块,一根网线直连或者通过交换机就能通。第二,TCP有确认机制和重发机制,报文丢包了内核会自动处理,上层看到的是一条“可靠链路”,省去很多底层排队和重试逻辑。第三,TCP是全双工,发送和接收互不干扰,两台PLC之间可以同时传数据,这在双向联动的场景里太重要了。

当然TCP也不是没有代价。TCP是“连接导向”的协议,通信双方必须先建立连接才能交换数据,这就涉及到三次握手、连接保持、断线重连这些概念,对只写过梯形图的工程师来说需要补一点网络基础。但好处是一旦理解了连接本质,整个通信模型就非常清晰,后面排查故障会轻松得多。

2. 硬件连接与软件环境准备

2.1 实验硬件清单与网络拓扑

我这里用的是两台S7-200 SMART CPU SR30,一台当客户端(主动建连),一台当服务器(被动监听)。完整的硬件清单如下:

  • S7-200 SMART CPU SR30两台(固件V2.3)
  • 普通超五类/六类网线一根(如果PLC直连,长度控制在50米内没问题)
  • PC一台,安装STEP 7-MicroWIN SMART V2.5以上版本
  • 工业交换机一台(可选,多台PLC或上位机接入时推荐)

拓扑上有两种接法。最简单的是两台PLC网口直连:客户端IP设192.168.2.1,服务器IP设192.168.2.2,子网掩码都设255.255.255.0,网线直接插两个以太网口就行。现代网卡和PLC网口都支持自动翻转,不需要再搞交叉线,用普通的直通网线就能通。如果现场设备多,就加一台交换机,所有PLC都接到交换机上,后续在上位机上做数据采集也方便。

有个细节必须在配线前确认:S7-200 SMART的以太网口型号是RJ45自适应10/100M,但不支持POE供电,不要把它当HMI网口或者插到带POE功能的交换机端口上用力过猛。另外,两个PLC的IP地址绝对不能一样,否则网络中会出现IP冲突,直接导致通信时断时续甚至完全不通。

2.2 软件设置:IP 地址与系统块下载

打开STEP 7-MicroWIN SMART,新建项目后在左侧项目树里双击“系统块”。在弹出的对话框里找到“通信”选项卡,里面可以设置IP地址、子网掩码和默认网关。

我当时给客户端设置为192.168.2.1,服务器设置为192.168.2.2,网关不填(因为只在同一个局域网内通信)。设置完成后点下载按钮,将系统块下载到CPU。下载完成后CPU会有一段重启时间,等RUN灯恢复为绿色再继续操作。

这里要特别提醒:系统块里的IP配置是随CPU断电保持的,只要下载过一次,之后PLC上电就固定使用该IP。万一你把IP记错了,需要恢复出厂设置或者用MicroWIN SMART的“查找CPU”功能搜索同网段设备。在“通信”面板里点“查找CPU”,软件会扫描以太网口所在网段的PLC,扫到之后可以重新分配IP,这个功能在IP改乱的时候能救命。

另外,CPU里的程序默认是RUN状态才能正常通信。如果程序处于STOP状态,TCP连接不一定能正常建立,因为CPU在STOP时所有用户程序都不执行,通信功能块不会工作。调试时最好把PLC拨到RUN模式,或者用在线工具栏中的“RUN”按钮启动。

3. 方案一:开放式 TCP 通信自定义数据互传

3.1 用开放通信向导生成通信功能块

S7-200 SMART的开放式用户通信不需要手写底层socket代码,软件提供了一套向导,通过图形化界面把连接参数填好,自动生成通信功能块,我们在主程序里调用就行。

在STEP 7-MicroWIN SMART菜单栏点击“工具” -> “开放式用户通信向导”(英文是Open User Communication Wizard)。如果你的软件里找不到这个入口,大概率就是CPU固件版本不够,先按前面说的方式升级固件。

向导第一步会问你“创建多少个连接”,我们选1个。第二步配置连接参数:

  • 连接名称任意填,比如Tcp_Link
  • 通信协议选择TCP
  • 本机端口填写2000(客户端不需要填,也可填)
  • 目标IP填写对方PLC的IP
  • 目标端口填写2000

这里解释一下端口的作用。TCP协议中用IP定位设备,用端口定位应用。端口号相当于小区门牌号,同一个IP下可以开多个“门”,每个门口跑不同的业务。S7-200 SMART支持的端口范围是1到65535,但建议避开常见的20、21、80等系统服务端口,也避免和已有HMI通信端口冲突。我在项目中习惯统一用2000端口,双方约定好就行。

向导生成三个功能块:连接建立块、发送块、接收块。块名一般是“CONNECT”前缀和“SEND”“RCV”组合,具体符号名以你填写的连接名称为准,比如Tcp_CONNECT、Tcp_SEND、Tcp_RCV。生成的块可以类比成封装好的库函数,我们的任务就是在OB1里正确调用它们。

3.2 服务器端程序与接收逻辑

先做服务器端(被动方)的程序。服务器端的任务有三个:建立监听连接、周期接收数据、周期回复状态。

连接建立块的调用有一个关键点:它的使能条件必须只在启动时触发一次。我习惯用SM0.1(首次扫描标志)驱动连接块,让PLC上电后自动进入监听状态。如果用常ON条件驱动连接块,程序每一扫描周期都会发一次建连请求,轻则报错,重则把连接状态搅乱。

下面是服务器端连接块调用的典型结构(伪代码,实际引脚以向导生成的块为准):

Network 1 建立连接 SM0.1 ----| EN |---- Tcp_CONNECT R: M0.0 (复位连接,上电时为0) 服务器标志: M0.1

连接建立之后,接收块负责看守端口,等待客户端数据。接收块一般有一个使能输入和触发输入,建议用一个周期为100ms到500ms的定时脉冲去触发接收,数据到了就存进指定的V区,没到就继续轮询。

接收时必须设定“最大接收长度”,这个长度不能小于报文长度上限,否则数据超过缓冲会直接被丢弃。我一般设为16或者32字节,配合下面的报文设计刚好够用。收到数据后,接收块会提供一个完成标志,我用该标志的上升沿去刷新发送块,把应答数据回传给客户端,这样整个通信闭环就转起来了。

3.3 客户端程序与连接管理

客户端的任务比服务器端多一点:主动建立连接,连接成功后周期发送数据,同时轮询接收应答。

客户端的连接块同样用SM0.1触发一次。区别在于,客户端建连后需要监视连接状态,一旦服务器掉线或者PLC重启,连接就会断开,这时必须自动重连。我常用的做法是用一个定时中断或者周期为1秒的脉冲,去检测连接块输出的“连接状态”位。如果状态为0,就把连接块复位标志置1,重新触发一次建连。

伪代码参考:

Network 1 初始化连接 SM0.1 ———— Tcp_CONNECT (客户端模式) 目标IP: 192.168.2.2 目标端口: 2000 Network 2 连接丢失检测与重连 Tcp_CONNECT.连接状态 = 0 且 T37 定时器到 —— 置位 M0.0 Tcp_CONNECT.R = M0.0

这个逻辑看起来简单,实际很多现场问题都出在这。如果不加重连逻辑,服务器断电再上电后,客户端的TCP连接内核会自动断开,但用户程序并不知道,一直往一个已死的连接上发送数据,然后发现怎么都收不到反馈。加了连接状态检测和重连机制后,最坏情况也就几秒内自动恢复。

发送数据块的触发条件我通常用SM0.5(1秒时钟脉冲)的上升沿或者定时器控制,这样每秒发送一帧数据。发送数据缓冲区和长度要确保和服务器端约定一致,长度填的是实际有效数据长度,不要填整块缓冲区长度,否则会把没用的空字节一起发过去。

3.4 数据帧设计:从 0 开始定义报文

TCP是流式协议,本身不负责“分帧”,也就是说接收方收到的是一串没有边界的字节流。两台PLC要互传数据,就必须在应用层自己定义报文格式,否则接收方根本不知道哪几个字节代表产量、哪几个字节代表状态。

我常用的报文格式是“帧头 + 功能码 + 数据长度 + 数据区 + 校验字”,总共8到16字节。举一个具体例子,客户端发给服务器的数据帧:

字节0: 帧头 0xAA 字节1: 功能码 0x01(0x01表示写数据) 字节2: 数据长度 0x04(后面4个字节有效) 字节3-6: 数据(对应产量计数,4字节整数) 字节7: 校验字节(前面所有字节的异或和)

服务器收到后先判断帧头是否是0xAA,再看长度是否合法,最后做异或校验。全部通过才把数据区拷入对应的V区地址,否则丢弃。这样即使链路中出现脏数据或者噪声,也不会污染PLC内部变量。

异或校验的计算很简单,在梯形图里用XOR指令逐字节累加就行。不要觉得多这几个字节麻烦,实际现场电磁环境复杂,PLC通信线缆和动力线往往距离很近,偶发一个字节错误很正常,没有校验就会出现过一段时间数据突然变成天书的情况。校验字能帮你把大部分异常挡在门外。

4. 方案二:Modbus TCP 互传全流程

4.1 从站(服务器)MB_Server 配置

如果你不想自定义报文,另一条路是用Modbus TCP标准协议。S7-200 SMART从固件V2.2开始,在指令树的“通信”分类下直接提供了MB_Server指令和MB_Client指令。这类指令的最大好处是报文格式标准化,不用自己拼帧头,而且上位机组态软件、第三方触摸屏都能直接读取数据。

MB_Server是Modbus TCP从站(服务器)指令,配置时需要在指令向导中指定一个保持寄存器映射区。一般是把V区地址映射为Modbus地址,比如VW0对应40001,VW2对应40002,这样上位机或主站只要读写40001等标准Modbus地址,就能访问PLC的V区。

MB_Server的调用比较简单,在OB1里每个扫描周期调用一次即可。需要填的参数包括:连接ID、端口号(默认502)、数据映射的V区起始地址和长度。端口502是Modbus TCP的默认端口,如果不与其它设备冲突,建议保持默认。

这里要特别注意:MB_Server在同一时刻只能和一个客户端建立连接。如果项目里有上位机、触摸屏、另一台PLC都想同时读这个从站,就必须自己做转发或轮询,否则第二路连接会一直处于等待状态,表现为“时通时不通”。

4.2 主站(客户端)MB_Client 配置

MB_Client是Modbus TCP主站(客户端)指令。使用前需要用指令向导配置一条通信任务,指定目标IP、端口、功能码、数据长度和映射地址。

我的配置习惯是:功能码用03H(读保持寄存器)和10H(写多个寄存器)。读操作把对方的数据读到本地V区,写操作把本地的数据写到对方。如果双向互传,那就配置两条任务,一条读一条写。

MB_Client不像开放式通信那样需要单独处理连接建立,它内部会管理TCP连接。但有个重要限制:同一时刻只能执行一条MB_Client指令,如果程序里有两条MB_Client同时调用,后一条会直接报错。解决方法是做轮询,用一个定时器或者状态机轮流触发读任务和写任务,每个任务之间至少间隔50ms到100ms。

我早期做多任务轮询时犯过一个错,把两条MB_Client的EN脚都接常ON,结果第二路任务一直不执行。后来改成100ms脉冲轮流触发,两路任务才稳定交替工作。这个“单任务”限制是S7-200 SMART的软肋,用它做Modbus TCP时心里一定要有数。

4.3 两种方案怎么选:一张表给你答案

针对双PLC互传,我做过多次对比测试,结论非常明确:如果只做西门子与西门子之间的数据交互,优先用开放式TCP;如果后续要介入第三方设备、上位机或者触摸屏,用Modbus TCP更省事。

对比项开放式TCPModbus TCP
报文格式完全自定义,灵活但需自己设计标准化Modbus报文,无需设计
接线/硬件CPU自带以太网口CPU自带以太网口
连接数量可配置多个连接同一时刻一个主站任务
第三方兼容性需对方按自定义协议解析几乎所有设备原生支持
编程难度中等,需理解连接管理简单,向导生成即可
调试工具Wireshark按自定义协议分析Modbus Poll等现成工具

我的项目经验是:只要通信双方都是S7-200 SMART,而且未来没有接上位机的计划,就选开放式TCP,灵活度和可控性都更好。需要和WinCC、力控、组态王或者第三方控制器通信时,再上Modbus TCP。

5. 联调测试与疑难排查

5.1 用 PC 模拟通信端点验证网络链路

把两台PLC程序都写好后,别急着直接互连,先用PC验证一下网络链路和报文格式是否正确。这种“单端模拟”的调试方式能帮你快速区分问题出在PLC程序里还是出在网络链路上。

最简单的办法是找一台电脑,用网线连到其中一台PLC上,把电脑IP设成和PLC同网段的地址,例如PLC是192.168.2.2,PC就设192.168.2.100。然后打开一个TCP调试助手软件,比如NetAssist或者HHD Free Serial Port Monitor,建一个TCP客户端连接到192.168.2.2的2000端口。

如果PLC服务器端程序已经下载,调试助手上会看到“连接成功”。这时你按设置好的报文格式发送一帧数据,比如“AA 01 04 00 00 00 0A B3”(0xAA异或0x01异或0x04等于0xAF,你按实际算出来的校验填),PLC端如果收到,接收块对应的V区数据会实时变化。这就验证了“PC—PLC”这条链路是通的,下一步再测PLC对PLC时,问题就缩小到客户端PLC的建连和发送逻辑上。

反过来,如果PC连接都失败,问题一定在网络层:检查IP是否同网段,网线是否插好,PLC的IP是否被系统块覆盖掉,交换机端口是否有特殊策略。

5.2 Wireshark 抓包:三次握手与数据报文怎么看

对PLC工程师而言,学会看Wireshark能让通信调试效率翻倍。Wireshark是免费开源的抓包工具,安装后在连接PLC的电脑网卡上开启抓包,过滤条件写tcp.port == 2000,就能看到两台设备之间的所有TCP交互。

第一次看抓包你会对“三次握手”有直观感受。客户端发一个SYN包,服务器回一个SYN+ACK包,客户端再回一个ACK包,这就是典型的TCP三次握手。三次握手成功意味着连接已经建立。如果只看到SYN而没有后续,说明服务器端根本没有程序监听这个端口,或者设置端口不一致。

数据传输阶段,你会看到客户端发的PSH+ACK报文,里面带着你的自定义数据帧。服务器回应的ACK报文每收到一帧就会自动返回一个确认。如果看到大量TCP重传(Retransmission),说明链路质量差或者接收缓冲区太小,这时候要检查网线、交换机以及接收块的最大长度设置。

Wireshark还有一个容易被忽略的作用是看TCP的“四次挥手”,也就是连接关闭过程。当一方PLC断电或程序复位时,会看到FIN包。如果你发现连接断开后没有正常四次挥手,而是直接RST包,说明程序中有异常终止连接的操作,一般来说不影响使用,但如果频繁发生,就要检查连接复位标志的逻辑。

5.3 高频故障速查表与避坑心得

下面是我做S7-200 SMART TCP通信项目时遇到最多的问题,整理成速查表,直接对照排查。

故障现象可能原因排查与解决
连接建立失败IP不在同网段用MicroWIN SMART查找CPU确认IP,PC或PLC端改到同网段
连接建立失败端口不一致服务器和客户端端口必须完全一致,且避免和系统端口冲突
连接建立失败固件低于V2.2升级固件到V2.2以上,否则向导和指令不存在
数据收不到接收块最大长度小于报文长度将接收缓冲长度设为报文长度上限,并留2字节余量
数据收不到接收触发条件是常ON用定时脉冲触发接收,避免单个扫描周期重复触发
数据一直不对报文数据结构不一致双方核对帧格式,尤其是字节顺序和长度字段
通信几秒后中断服务器端PLC重启客户端增加连接状态检测,异常时自动重连
重连不生效连接复位标志没有置位确认连接块的R引脚在断线时被置1并保持一个扫描周期以上
两台PLC和PC同时连接失败同一IP被占用用“查找CPU”扫描网段,确认每个PLC的IP唯一
MB_Client第二路任务不执行单条MB_Client限制用定时器做任务轮询,每条任务间隔至少50ms以上

有几个心得是常规手册里不太会写的,我在这里多说几句。

第一,PLC程序的扫描周期会直接影响TCP收发的实时性。S7-200 SMART一个扫描周期通常在几毫秒到十几毫秒之间,如果程序比较复杂,建议把通信发送放在定时中断子程序中,不要放在主程序里依赖SM0.5。定时中断的周期设置为200ms或500ms比较稳妥,太短会频繁消耗通信资源,太长会显得响应迟钝。

第二,TCP通信的接收块触发不能简单地用“常ON”加上升沿理解。我实际调试中发现,接收块完成标志往往会连续置位两个周期,如果不做边缘处理,同一帧数据会被当成两帧处理,导致数据重复写入V区。务必使用上升沿指令(EU)去捕捉完成标志,保证一帧只处理一次。

第三,也是最重要的一条:现场调试时先不要接负载,用两个PLC的输入点或内部M变量做测试。例如客户端把M0.0到M0.7这8个位的状态打包成一个字节发过去,服务器端解包后驱动一个输出点。这样你能在不上电的情况下,很直观地看到数据是否真的从一端流到了另一端,比去看寄存器数值变化简单可靠得多。

这个项目做完之后,我又在这套TCP链路上扩了一场应用:一台SMART做数据采集端,把温度、压力、流量打包发送到中控室的上位机;另一台SMART做控制端,接收上位机下发的设定参数。整个过程没有增加任何硬件成本,只是把报文功能码扩展了一下。所以一旦把TCP基础链路跑通,后面的想象空间是很大的。对我个人而言,最大的收获不是写了多少行梯形图,而是真正把“连接”这个概念从书本里搬进了脑子——连接是会断的,程序必须要能识别断、自动修,这才是工业通信的稳定之道。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询