
先说我为什么写这篇东西。这几年在现场碰到的项目里两台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.51秒时钟脉冲的上升沿或者定时器控制这样每秒发送一帧数据。发送数据缓冲区和长度要确保和服务器端约定一致长度填的是实际有效数据长度不要填整块缓冲区长度否则会把没用的空字节一起发过去。3.4 数据帧设计从 0 开始定义报文TCP是流式协议本身不负责“分帧”也就是说接收方收到的是一串没有边界的字节流。两台PLC要互传数据就必须在应用层自己定义报文格式否则接收方根本不知道哪几个字节代表产量、哪几个字节代表状态。我常用的报文格式是“帧头 功能码 数据长度 数据区 校验字”总共8到16字节。举一个具体例子客户端发给服务器的数据帧字节0: 帧头 0xAA 字节1: 功能码 0x010x01表示写数据 字节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对应40001VW2对应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.2PC就设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包服务器回一个SYNACK包客户端再回一个ACK包这就是典型的TCP三次握手。三次握手成功意味着连接已经建立。如果只看到SYN而没有后续说明服务器端根本没有程序监听这个端口或者设置端口不一致。数据传输阶段你会看到客户端发的PSHACK报文里面带着你的自定义数据帧。服务器回应的ACK报文每收到一帧就会自动返回一个确认。如果看到大量TCP重传Retransmission说明链路质量差或者接收缓冲区太小这时候要检查网线、交换机以及接收块的最大长度设置。Wireshark还有一个容易被忽略的作用是看TCP的“四次挥手”也就是连接关闭过程。当一方PLC断电或程序复位时会看到FIN包。如果你发现连接断开后没有正常四次挥手而是直接RST包说明程序中有异常终止连接的操作一般来说不影响使用但如果频繁发生就要检查连接复位标志的逻辑。5.3 高频故障速查表与避坑心得下面是我做S7-200 SMART TCP通信项目时遇到最多的问题整理成速查表直接对照排查。故障现象可能原因排查与解决连接建立失败IP不在同网段用MicroWIN SMART查找CPU确认IPPC或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基础链路跑通后面的想象空间是很大的。对我个人而言最大的收获不是写了多少行梯形图而是真正把“连接”这个概念从书本里搬进了脑子——连接是会断的程序必须要能识别断、自动修这才是工业通信的稳定之道。