S7-200SMART GET/PUT通讯实战:配置、交换机选型与调试避坑指南
1. 为什么S7-200SMART的GET/PUT值得单独拿出来讲如果你手头有几台S7-200SMART又恰好需要它们之间交换数据那你大概率绕不开GET/PUT这对指令。很多人第一次接触这两个指令时会觉得它们跟普通的读写指令差不多配置一下地址就完事了。但真正上手之后才发现事情没那么简单——连接资源怎么分配、数据一致性怎么保证、交换机选型有没有讲究、轮询周期设多少合适这些问题一个比一个具体。我在一个包装线改造项目里第一次用GET/PUT做三台S7-200SMART之间的数据同步当时踩的坑到现在还记得两台PLC直连网线能通中间加了一台普通家用交换机就开始丢包后来换成工业级交换机才稳定下来。这件事让我意识到GET/PUT的配置只是第一步底层网络的质量直接决定了通讯的可靠性。这篇内容适合两类人看一类是刚接触S7-200SMART通讯、需要把GET/PUT跑通的初学者另一类是用过GET/PUT但遇到过通讯不稳定、数据错乱等问题的现场工程师。我会从指令原理讲到配置步骤再讲到交换机选型和实际调试中的经验尽量把每个环节的“为什么”说清楚。提示GET/PUT是S7通讯协议下的应用层指令底层走的是以太网。所以网络硬件的质量会直接影响通讯效果这一点在后面会反复提到。2. GET/PUT指令的底层逻辑与适用边界2.1 这两个指令到底在做什么GET和PUT的本质是“跨PLC的数据搬运”。PUT是把本地数据写到远端PLC的指定区域GET是把远端PLC的数据读回本地。它们基于S7通讯协议属于ISO-on-TCP之上的应用层实现。跟Modbus TCP不同的是GET/PUT不需要你手动组包和解包STEP 7-Micro/WIN SMART软件里配置好之后指令会自动处理连接建立、数据打包和应答确认。但这里有个关键点GET/PUT是“客户端主动发起”的模式。也就是说发起方客户端主动去读写被动方服务器的数据。被动方不需要写任何通讯程序只需要把数据放在指定的V存储区或M存储区里等着被读写就行。这个特性非常实用——你不需要在每台PLC上都写通讯代码只需要在一台主控PLC上写GET/PUT指令即可。2.2 连接资源是有限的别浪费S7-200SMART的GET/PUT连接资源不是无限的。CPU本体最多支持8个主动连接和8个被动连接但实际可用的数量还跟CPU型号有关。比如CR40和SR60的连接资源就略有差异。更重要的是每个GET或PUT指令会占用一个连接资源如果你在程序里写了10条GET/PUT指令但CPU只支持8个连接那后面的指令就会报错。我的建议是在规划阶段就把需要交换的数据整理成一张表尽量把同一台PLC的数据合并到一条GET或PUT指令里。比如你需要从远端PLC读20个字节的数据不要分成4条GET指令各读5个字节而是一条GET指令读20个字节然后在本地用MOV指令拆分。这样能大幅节省连接资源。2.3 数据一致性一个容易被忽略的问题GET/PUT在传输数据时并不保证“原子性”。什么意思呢假设你用一条GET指令读取远端PLC的100个字节这100个字节在传输过程中可能被远端PLC的程序修改。如果你读到的数据里前50个字节是旧值后50个字节是新值那数据就不一致了。这个问题在高速生产线上尤其明显。我的做法是对于关键数据在远端PLC里用一个“数据就绪”标志位来同步。具体来说远端PLC先把数据准备好然后置位一个M点本地PLC的GET指令读到这个M点为1时才认为数据有效。虽然S7-200SMART不支持直接读取M点作为GET的触发条件但你可以把M点映射到V存储区里跟数据一起读回来。3. 从零配置一条GET/PUT通讯链路3.1 硬件连接与IP规划先确认硬件。每台S7-200SMART都有一个以太网口用标准RJ45网线连接即可。如果只有两台PLC可以用交叉网线直连不过现在的网口都支持自动翻转直连网线也能通。三台及以上就必须用交换机了。IP规划是第一步。我习惯把PLC的IP地址按功能分区比如主控PLC用192.168.2.10第一台从站用192.168.2.11第二台用192.168.2.12以此类推。子网掩码统一用255.255.255.0。注意S7-200SMART不支持跨网段通讯所有参与GET/PUT的PLC必须在同一个网段内。在STEP 7-Micro/WIN SMART里设置IP地址的路径是系统块 → 通信 → 以太网端口。设置完之后下载系统块断电重启生效。这里有个小细节如果你先下载了程序但没下载系统块IP地址不会改变。3.2 在向导里配置GET/PUTS7-200SMART的GET/PUT配置是通过“GET/PUT向导”完成的不是直接拖指令。打开向导后你需要依次填写以下内容选择操作类型GET读取远端或PUT写入远端远端PLC的IP地址填写目标PLC的IP本地起始地址本地参与交换的数据起始地址比如VB2000远端起始地址远端PLC的数据起始地址比如VB3000数据长度以字节为单位最大212字节受限于S7通讯的PDU大小配置完成后向导会自动生成一段代码包括一个初始化子程序和一个执行子程序。你需要在主程序里调用初始化子程序通常用SM0.1触发一次然后在需要通讯的地方调用执行子程序。注意向导生成的子程序不能重命名也不能修改内部逻辑。如果你需要修改配置必须重新运行向导这会覆盖之前的配置。3.3 轮询触发别用SM0.5很多教程会告诉你用SM0.51Hz时钟脉冲来触发GET/PUT。我一开始也这么用后来发现有问题。SM0.5的周期是1秒意味着每秒触发一次通讯。对于大多数场景够用但如果你有多个GET/PUT指令它们会同时触发造成网络拥堵。更好的做法是用一个定时器做轮询。比如用T37做一个100ms的定时器每次定时器到位后触发下一条GET/PUT指令。这样多条指令会依次执行而不是同时抢占网络资源。具体实现方式用一个计数器记录当前执行到第几条指令定时器每次到位后计数器加1根据计数器的值用比较指令触发对应的GET/PUT。3.4 错误处理别让一条指令卡死整个轮询GET/PUT指令执行后会返回一个错误代码。如果某条指令因为网络问题或远端PLC断电而失败错误代码会非零。如果你不做错误处理轮询可能会卡在这条指令上导致后面的指令永远不执行。我的做法是每条GET/PUT指令执行后检查错误代码。如果错误代码非零记录错误并跳过这条指令继续执行下一条。同时用一个计数器记录连续错误次数如果连续错误超过3次就报警提示检查网络或远端PLC状态。4. 交换机选型与网络稳定性实战4.1 为什么家用交换机不行回到我开头提到的那个坑。当时项目现场用的是某品牌的家用千兆交换机两台PLC直连没问题但经过交换机后就开始丢包。后来分析原因主要是家用交换机的缓存小、背板带宽低而且不支持工业环境的抗干扰设计。在PLC这种周期性通讯的场景下家用交换机的转发延迟不稳定导致GET/PUT的超时错误。工业级交换机的关键指标包括背板带宽、包转发率、缓存大小、工作温度范围、是否支持冗余电源。对于S7-200SMART的GET/PUT通讯我推荐至少选择支持IEEE 802.3x流控的工业交换机端口数量根据PLC数量来定一般8口或16口就够了。4.2 交换机连接的实际技巧交换机连接看起来简单但有几个细节容易忽略。第一网线的质量很关键。我遇到过用劣质网线导致通讯不稳定的情况后来换成超五类屏蔽网线就解决了。第二交换机的电源最好独立供电不要跟变频器、伺服驱动器共用一路电源否则电磁干扰会影响通讯质量。第三如果现场有多台交换机级联要注意级联端口的带宽。比如一台8口交换机上行到另一台交换机的端口如果是百兆的那所有经过这个端口的数据都会受限。我的建议是级联端口用千兆接入端口用百兆就够了因为S7-200SMART的以太网口本身就是百兆的。4.3 网络负载与通讯周期S7-200SMART的以太网口是100Mbps的理论上带宽很充裕。但实际项目中如果你有大量的GET/PUT指令再加上HMI、编程电脑等设备同时通讯网络负载就会上升。我一般会估算一下每条GET/PUT指令传输212字节加上协议开销大约300字节如果每秒触发10条指令那就是3KB/s对100Mbps的网络来说微不足道。但问题在于S7-200SMART的通讯处理能力有限。CPU在处理GET/PUT请求时需要占用扫描周期的时间。如果通讯过于频繁会拖慢主程序的执行。我的经验是对于S7-200SMART每条GET/PUT指令的触发间隔不要低于50ms多条指令之间最好间隔10ms以上。5. 调试过程中最常见的五个问题5.1 连接建立失败现象是GET/PUT指令返回错误代码提示连接无法建立。最常见的原因是IP地址填错、网段不一致、或者远端PLC没有上电。排查步骤先用电脑ping一下远端PLC的IP确认网络层是通的。如果ping不通检查网线、交换机、IP设置。如果ping通了但GET/PUT还是报错检查远端PLC是否在运行状态以及是否已经下载了系统块。还有一个容易被忽略的原因远端PLC的“允许PUT/GET通讯访问”选项没有勾选。在S7-200SMART的系统块里有一个“保护”选项卡里面有一项“允许来自远程对象的PUT/GET通讯访问”默认是勾选的但如果你手动取消过就会导致连接失败。5.2 数据错位或乱码数据错位通常是因为本地和远端的起始地址没有对齐。比如本地从VB2000开始读10个字节远端从VB3000开始写10个字节但如果远端的实际数据是从VB3001开始的那读回来的数据就会整体偏移一个字节。解决方法是在配置向导里仔细核对两边的起始地址最好在程序里用注释标明每个地址的含义。乱码的另一个可能原因是数据类型不匹配。比如远端存的是REAL类型4字节浮点数你按INT类型2字节整数去读就会得到错误的值。S7-200SMART的GET/PUT是按字节传输的不关心数据类型所以类型转换需要你自己在程序里处理。5.3 通讯时断时续这个问题最让人头疼因为不是完全不通而是偶尔断一下。根据我的经验原因通常有三个一是网络中有广播风暴比如某台设备的网卡故障导致大量广播包二是交换机过热或电源不稳三是网线接头松动。排查方法先用交换机的指示灯判断——如果某个端口的指示灯频繁闪烁异常说明该端口有大量数据或错误帧。然后用Wireshark抓包分析看看是否有异常的广播包或重传。如果是交换机问题换一台交换机试试。如果是网线问题重新压接水晶头或更换网线。5.4 轮询卡死前面提到过如果某条GET/PUT指令失败后没有跳过轮询就会卡死。但还有一种情况指令没有失败但执行时间过长导致轮询周期被拉长。比如远端PLC的扫描周期很长GET/PUT请求需要等待远端响应如果远端响应时间超过了你的定时器周期就会出现指令重叠。解决方法是在每条GET/PUT指令执行后检查其“完成位”是否置位。只有完成位置位后才触发下一条指令。不要单纯依赖定时器而是用完成位定时器双重判断。5.5 连接资源耗尽如果你在程序里用了很多GET/PUT指令但CPU的连接资源不够就会报“连接资源不足”的错误。S7-200SMART的主动连接资源是8个但实际可用的可能更少因为HMI、编程电脑等也会占用连接。我的建议是把GET/PUT指令数量控制在4条以内如果数据量大就合并数据区。6. 进阶技巧让GET/PUT跑得更稳6.1 用心跳信号监测通讯状态在远端PLC里做一个心跳信号用一个定时器让某个V存储区的值每秒加1本地PLC用GET指令读回这个值。如果值在变化说明通讯正常如果值不变说明通讯中断。这个方法比单纯看错误代码更直观因为有些通讯中断不会立即报错但心跳信号会立刻停止变化。6.2 数据打包与解包前面提到过为了节省连接资源应该把多个数据合并到一条GET/PUT指令里。但合并之后本地程序需要把读回来的数据拆分到不同的变量里。我的做法是在本地规划一个连续的V存储区作为“通讯缓冲区”GET指令把远端数据读到这个缓冲区然后用MOV指令把缓冲区里的数据分发到各个功能块。写数据时反过来先把数据集中到缓冲区再用PUT指令写出去。6.3 用状态机管理轮询对于多条GET/PUT指令的场景我推荐用状态机来管理轮询。具体来说定义一个整数变量作为“步骤号”每个步骤对应一条GET/PUT指令。步骤号从0开始每条指令完成后步骤号加1到最后一步后回到0。这样逻辑清晰也方便调试——你可以通过监控步骤号来判断当前执行到哪条指令。6.4 网络冗余的考虑如果项目对通讯可靠性要求很高可以考虑网络冗余。S7-200SMART本身不支持冗余网络但你可以用两台交换机做冗余链路。不过对于大多数中小型项目来说这个成本不划算。更实际的做法是用一台质量可靠的工业交换机加上合理的布线和电源设计就能满足大部分场景的需求。7. 一个完整的配置实例假设你有三台S7-200SMART主控PLCIP: 192.168.2.10、从站AIP: 192.168.2.11、从站BIP: 192.168.2.12。主控需要从从站A读取10个字节的数据VB1000~VB1009向从站B写入5个字节的数据VB2000~VB2004。配置步骤如下在从站A的程序里把需要被读取的数据放在VB1000~VB1009不需要写通讯代码。在从站B的程序里把需要被写入的数据区预留出来即VB2000~VB2004同样不需要写通讯代码。在主控PLC的GET/PUT向导里新建一个GET操作远端IP填192.168.2.11本地起始地址填VB3000远端起始地址填VB1000长度10字节。再新建一个PUT操作远端IP填192.168.2.12本地起始地址填VB4000远端起始地址填VB2000长度5字节。在主程序里用SM0.1调用初始化子程序。用T37做100ms定时器定时器到位后触发GET指令GET指令完成后触发PUT指令PUT指令完成后等待下一个定时器周期。在每条指令后检查错误代码如果非零则记录并跳过。这个实例的关键点在于从站不需要任何通讯编程所有逻辑都在主控PLC里。这也是GET/PUT最方便的地方——你只需要在一台PLC上写代码就能读写多台PLC的数据。8. 我踩过的那些坑第一个坑是IP地址冲突。有一次现场调试主控PLC和从站PLC的IP地址设成了同一个结果两台都通讯异常。后来养成习惯每次设置IP后先用电脑ping一遍确认没有冲突再下载程序。第二个坑是交换机电源。有一台交换机跟变频器共用了一个电源插座变频器启动时交换机重启导致通讯中断。后来给交换机单独拉了一路电源问题解决。第三个坑是网线长度。S7-200SMART的以太网口支持100米以内的网线但实际项目中如果网线质量不好50米就可能出问题。我现在的做法是超过30米的网线一律用屏蔽线并且两端做好接地。第四个坑是向导覆盖。有一次我修改了GET/PUT的配置重新运行向导后之前生成的子程序被覆盖了但主程序里的调用还在导致编译报错。后来我养成了习惯修改向导配置后先删除主程序里的旧调用再重新调用新生成的子程序。第五个坑是数据长度超限。S7-200SMART的GET/PUT单次最大传输212字节我一开始没注意配置了300字节结果指令直接报错。后来查手册才知道这个限制。如果你需要传输超过212字节的数据只能分多条指令。9. 关于GET/PUT和Modbus的选择有人会问既然S7-200SMART支持Modbus TCP为什么还要用GET/PUT我的看法是如果是西门子PLC之间的通讯GET/PUT更方便因为不需要写Modbus的组包和解包代码配置也简单。但如果需要跟第三方设备比如变频器、仪表通讯那Modbus TCP更通用。另外GET/PUT的通讯效率比Modbus TCP高因为S7协议的开销比Modbus小。在数据量较大、通讯频率较高的场景下GET/PUT的优势更明显。但GET/PUT的缺点是只能用于西门子设备之间跨品牌就不行了。10. 最后分享几个实用建议第一在项目规划阶段就把通讯数据表整理好明确每台PLC需要交换哪些数据、数据长度是多少、通讯频率要求是多少。这张表会直接影响你的GET/PUT配置和网络设计。第二调试时先用一台PLC直连另一台PLC确认GET/PUT能通之后再接入交换机。这样可以排除网络硬件的问题快速定位故障点。第三在程序里加一个通讯状态指示灯。用GET/PUT的错误代码或心跳信号驱动一个输出点接一个指示灯。这样现场人员一眼就能看出通讯是否正常不用打开编程软件。第四定期检查交换机的温度和电源。工业现场的环境温度可能很高交换机如果散热不好会频繁重启或丢包。我一般会在交换机旁边贴一个温度标签超过50度就加强散热。第五保留一份完整的网络拓扑图和IP地址表。项目交付后这份文档对后续维护非常重要。我见过太多项目因为找不到IP地址表维护时只能一台一台去试。