1. 项目缘起与整体设计思路
1.1 为什么要在S7-200SMART上折腾GET/PUT
搞工控的兄弟都清楚,S7-200SMART这块PLC在小型自动化项目里出镜率极高,性价比摆在那儿,编程软件也友好。但很多人用它的通信功能,基本停留在“下载程序”和“连触摸屏”这两个层面,一旦遇到两台PLC之间要交换数据,第一反应就是“加硬线”或者“上Modbus”。硬线IO交换数据量小、接线繁琐;Modbus虽然通用,但需要轮询编程,实时性和代码量都不太理想。
GET/PUT指令就是西门子给S7-200SMART准备的一套“轻量级”以太网通信方案。它基于S7通信协议,不需要你写任何轮询逻辑,配置好之后PLC自己就在后台把数据搬来搬去。你可以把它理解成:两台PLC之间拉了一根“隐形的数据管道”,一端负责放数据,另一端负责取数据,管道本身不需要你维护。
这个项目要解决的核心问题很明确:两台(或多台)S7-200SMART之间,通过交换机组成局域网,用GET/PUT指令实现周期性数据交换,替代传统的硬线连接和Modbus轮询方案。适合已经会用STEP 7-Micro/WIN SMART做基本编程、但对以太网通信还没底的朋友。看完你至少能搞清楚三件事:GET/PUT到底怎么配、交换机怎么选怎么接、出了问题从哪儿查。
1.2 方案选型的几个关键考量
在动手之前,先把方案逻辑理清楚。S7-200SMART支持的通信方式有好几种:PPI、自由口、Modbus RTU、Modbus TCP、S7通信(GET/PUT)、开放式用户通信等。为什么偏偏选GET/PUT?
第一,编程量最小。GET/PUT是“配置型”指令,不是“编程型”指令。你不需要写发送缓冲区管理、不需要处理接收超时、不需要做数据校验,这些底层的事情西门子已经在固件里帮你做完了。对比Modbus TCP,你得自己组功能码、自己解析返回帧,代码量差着一个数量级。
第二,实时性可控。GET/PUT的通信周期由你设定,最快可以做到几十毫秒级别。对于大多数设备间的状态同步、联锁信号传递,这个速度完全够用。而且它是周期性的,不像Modbus轮询那样受轮询周期影响。
第三,硬件成本低。S7-200SMART本体自带以太网口,你只需要加一个普通的工业交换机就能组网。不需要额外的通信模块,不需要RS485布线。交换机选型后面会细说,但基本上几百块钱的工业级交换机就能搞定。
当然,GET/PUT也不是万能的。它只能用于西门子S7系列PLC之间的通信,如果你要跟变频器、仪表、第三方设备通信,还是得走Modbus或者自由口。另外,GET/PUT的数据量有限制,单次最多222字节(取决于固件版本),大数据量传输需要分多次配置。
注意:S7-200SMART的GET/PUT是基于S7通信的,属于西门子私有协议。这意味着通信双方都必须是西门子的PLC,且固件版本要支持。V2.0以上的固件基本都没问题,但如果你手头有很老的V1.0版本,建议先升级固件。
1.3 网络拓扑怎么规划
最典型的场景是两台PLC之间做GET/PUT。拓扑很简单:两台PLC的网口分别接到交换机的两个端口上,电脑也接到交换机上用于编程和调试。IP地址规划上,建议把两台PLC放在同一个网段,比如192.168.2.1和192.168.2.2,子网掩码255.255.255.0。
如果是三台以上的PLC,拓扑依然是星型——所有PLC都接到交换机上。但这时候要注意:GET/PUT是点对点的,每两台之间如果要交换数据,都需要单独配置。比如A、B、C三台PLC,A要取B的数据、B要取C的数据、C要取A的数据,那就需要配置三组GET/PUT。每台PLC既是服务端(被取数据)又是客户端(取别人数据),角色可以同时存在。
交换机在这个拓扑里的作用就是“数据中转站”。它不关心你跑的是什么协议,只负责把以太网帧从源端口转发到目的端口。所以选交换机的时候,不需要什么“PLC专用交换机”,普通的工业级非网管交换机就够用。但“够用”和“好用”之间还是有差距的,后面会专门讲交换机选型的坑。
2. 核心细节解析与实操要点
2.1 GET/PUT指令的本质是什么
先把这个概念说透。GET和PUT是STEP 7-Micro/WIN SMART软件里的两条指令,但它们跟普通的梯形图指令不太一样——它们不是放在程序里每个扫描周期都执行的,而是“配置”在向导里,由PLC的操作系统在后台周期性执行。
你可以这样理解:普通梯形图指令是你写的“程序”,PLC每个扫描周期从头到尾跑一遍;GET/PUT是你填的“表格”,PLC的操作系统按照你填的表格,在后台开了一个独立的任务去执行。这个任务跟你的主程序是并行运行的,互不干扰。
GET的意思是“取”——从远程PLC读取数据到本地。PUT的意思是“写”——把本地数据写到远程PLC。两条指令的方向是相反的,但配置逻辑类似。
配置GET/PUT需要填几个关键参数:
- 远程PLC的IP地址:你要跟谁通信,就填谁的IP。
- 本地数据区:本地PLC里哪块地址用来存放要发送或接收的数据。
- 远程数据区:远程PLC里哪块地址用来被读取或写入。
- 通信周期:多久执行一次,单位是毫秒。
这里有个容易搞混的地方:GET指令里,“本地数据区”是接收区,“远程数据区”是源数据区;PUT指令里,“本地数据区”是源数据区,“远程数据区”是目标数据区。方向别搞反了,否则数据会写错地方。
2.2 数据区规划与地址映射
数据区规划是GET/PUT配置里最需要动脑子的一步。S7-200SMART的数据区有几种:I区(输入)、Q区(输出)、M区(位存储)、V区(变量存储)、DB区(数据块,仅部分固件支持)。GET/PUT主要用V区和M区,因为这两个区是可读写的,而且地址范围大。
我的习惯是:专门划出一块V区作为通信缓冲区。比如V1000~V1999这1000个字节,专门用来跟其他PLC交换数据。本地程序要发送的数据,先写到V1000开始的区域;从远程读回来的数据,也放在V1000开始的区域(或者另划一块)。这样做的目的是把通信数据和程序内部数据隔离开,避免地址冲突。
具体规划的时候,建议画一张表:
| 数据方向 | 本地地址 | 远程地址 | 数据长度 | 说明 |
|---|---|---|---|---|
| A→B | VB1000 | VB2000 | 20字节 | A的状态字和参数 |
| B→A | VB2000 | VB1000 | 20字节 | B的状态字和参数 |
| A→C | VB1100 | VB2100 | 10字节 | A给C的联锁信号 |
| C→A | VB2100 | VB1100 | 10字节 | C给A的反馈信号 |
这张表填清楚之后,配置的时候照着填就行,不会乱。表格里“本地地址”和“远程地址”是站在配置方视角写的。比如你在A的PLC里配置PUT指令,把A的VB1000写到B的VB2000,那“本地地址”就是VB1000,“远程地址”就是VB2000。
实操心得:V区地址尽量用偶数开头,比如VB1000、VB2000,不要用VB1001这种奇数地址。虽然S7-200SMART支持字节级寻址,但通信数据块用偶数地址对齐,排查问题的时候看着舒服,也方便后续扩展。
2.3 通信周期与超时设置
通信周期这个参数,填多少合适?这取决于你的数据实时性要求。如果只是传一些状态指示灯、按钮信号,500ms甚至1000ms都够用。如果是联锁信号、急停信号,那就要快,100ms甚至50ms。
但周期不是越短越好。周期太短,网络负载高,如果交换机性能跟不上或者网络里有其他大流量设备,反而容易丢包。而且GET/PUT本身有重试机制,周期设得太短,重试还没完成下一次又来了,会造成任务堆积。
我的经验值是:普通状态同步用200~500ms,联锁信号用100ms,再快就要评估网络质量了。如果确实需要更快的响应,建议改用硬线或者PROFINET IRT(但S7-200SMART不支持IRT,那是1200/1500的活儿)。
超时设置方面,GET/PUT向导里有一个“通信超时”参数,默认好像是500ms。这个值的意思是:如果一次通信请求在500ms内没有得到响应,就认为这次通信失败,触发错误位。超时值一般设成通信周期的2~3倍比较合理。比如周期200ms,超时设500ms;周期500ms,超时设1500ms。
2.4 交换机到底怎么选
交换机是GET/PUT通信的物理基础,选不好会出各种玄学问题。先明确一个原则:工业现场用工业级交换机,不要用商用交换机。商用交换机在办公室环境没问题,但到了车间里,电磁干扰、温度变化、振动,随便哪个都能让它罢工。
工业交换机选型看几个参数:
- 端口数量:至少比你的PLC数量多2个。比如3台PLC,选8口交换机,留出余量给电脑、未来扩展。
- 工作温度:工业级一般是-40~75℃,商用级只有0~50℃。车间里夏天控制柜内温度轻松上50℃,商用交换机很容易过热死机。
- 电源:工业交换机一般是24V DC供电,跟PLC共用开关电源就行。商用交换机是220V AC,还得单独拉线。
- 导轨安装:工业交换机是DIN导轨安装,直接卡在控制柜里。商用交换机是桌面式,还得找地方放。
- 冗余电源:好一点的工业交换机支持双电源输入,一路坏了另一路顶上。这个功能在关键场合很有用。
品牌方面,西门子的SCALANCE系列、赫斯曼、摩莎、三旺这些都不错。如果预算有限,国产的工业交换机品牌也能用,但一定要选带“工业级”认证的,别买成商用改装的。
踩过的坑:有一次图便宜用了一个商用千兆交换机,实验室测试一切正常,到了现场跑了三天开始随机丢包。查了半天以为是程序问题,最后发现是交换机在控制柜里被烤到60多度,芯片降频了。换工业交换机之后问题消失。这个教训值几百块钱。
2.5 网线和水晶头也不能马虎
网线看起来简单,但现场很多通信问题都出在网线上。工业环境建议用屏蔽双绞线,水晶头用金属屏蔽壳的,屏蔽层要可靠接地。非屏蔽网线在变频器、伺服驱动器旁边很容易受干扰,表现为通信时断时续。
网线长度方面,单段不要超过100米,这是以太网的标准限制。超过100米要么加交换机中继,要么用光纤。车间里如果有拖链、运动部件,要用拖链专用网线,普通网线在拖链里弯折几次就断了。
水晶头压接的时候,线序按T568B标准:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕。压完之后用测线仪测一下,8根线全通才行。我见过只通了4根线也能通信的情况,但那是百兆模式,千兆必须8根全通。而且只通4根线的话,抗干扰能力差很多。
3. 实操过程与核心环节实现
3.1 硬件连接与网络搭建
先做物理连接。假设你有两台S7-200SMART,一台作为A站,一台作为B站,外加一台工业交换机。
第一步,给交换机接24V电源。工业交换机一般有专门的电源端子,注意正负极不要接反。接好之后看交换机的电源指示灯亮不亮。
第二步,用网线把A站PLC的网口接到交换机的任意一个端口,B站PLC的网口接到另一个端口。电脑也接一个端口。如果交换机端口不够,电脑可以临时接,配置完再拔掉。
第三步,检查指示灯。交换机上对应端口的Link灯应该亮起,Activity灯在通信时会闪烁。PLC本体的网口指示灯也会亮。如果Link灯不亮,检查网线和水晶头。
第四步,设置电脑的IP地址。把电脑的本地连接IP设成跟PLC同网段,比如192.168.2.100,子网掩码255.255.255.0。然后用ping命令测试:ping 192.168.2.1(A站)和ping 192.168.2.2(B站)。能ping通说明物理层和网络层都通了。
注意:S7-200SMART出厂默认IP是192.168.2.1。如果你有两台全新的PLC,它们IP是一样的,直接接上去会冲突。正确做法是先单独连接一台,把IP改成192.168.2.2,再连接第二台。
3.2 在STEP 7-Micro/WIN SMART中配置GET/PUT
打开STEP 7-Micro/WIN SMART软件,先分别连接两台PLC,把IP地址设好。A站设为192.168.2.1,B站设为192.168.2.2。
然后在A站的程序里,打开“向导”菜单,找到“GET/PUT”向导。点击进入配置界面。
第一步,选择“添加”一条PUT指令。远程PLC的IP地址填192.168.2.2(B站的IP)。本地数据区填VB1000,长度20字节。远程数据区填VB2000,长度20字节。通信周期填200ms。
第二步,再添加一条GET指令。远程PLC的IP地址还是192.168.2.2。本地数据区填VB2000(接收区),长度20字节。远程数据区填VB1000,长度20字节。通信周期填200ms。
这里解释一下:A站的PUT指令把A的VB1000写到B的VB2000;A站的GET指令把B的VB1000读到A的VB2000。这样A和B之间就实现了双向数据交换。
第三步,分配错误位。向导会让你指定一个地址来存放通信错误状态,比如VB3000。这个地址里的每一位对应一条GET/PUT指令的错误状态。程序里可以监控这个字节,判断通信是否正常。
第四步,点击“生成”按钮,向导会自动生成一段代码,你把它放到主程序里调用就行。生成的代码是一个子程序,需要在主程序里用SM0.0一直调用它。
同样的步骤,在B站的程序里也要配置一遍。但注意方向要反过来:B站的PUT指令把B的VB1000写到A的VB2000,B站的GET指令把A的VB1000读到B的VB2000。这样两边配置是对称的,数据流向才正确。
3.3 数据映射与程序编写
GET/PUT配置好之后,通信是后台自动跑的,但你的程序还得知道数据放在哪儿。比如A站要把一个电机的运行状态发给B站,你需要在A站的程序里把这个状态写到VB1000开始的区域。
假设VB1000是状态字,VB1001是速度设定值,VB1002~VB1003是实际速度(整数)。A站的程序里这样写:
// A站发送数据到通信缓冲区 LD SM0.0 MOVB #MotorStatus, VB1000 // 电机状态字 MOVW #SpeedSetpoint, VW1002 // 速度设定值 MOVW #ActualSpeed, VW1004 // 实际速度B站接收数据后,从VB2000开始的区域读取:
// B站从通信缓冲区读取数据 LD SM0.0 MOVB VB2000, #RemoteMotorStatus // 读取A站电机状态 MOVW VW2002, #RemoteSpeedSetpoint // 读取A站速度设定 MOVW VW2004, #RemoteActualSpeed // 读取A站实际速度这样数据就从A站“流”到了B站。反过来B站发给A站的数据也是同样的逻辑,只是地址不同。
实操心得:通信缓冲区的数据更新和读取最好放在主程序的开头或结尾,不要放在中断里。因为GET/PUT是后台任务,跟主程序是异步的,放在中断里容易读到“半更新”的数据。如果对数据一致性要求高,可以加一个“数据有效”标志位,发送方更新完数据后置位标志,接收方检测到标志才读取。
3.4 下载与调试
配置和程序都写好之后,分别下载到两台PLC。下载的时候注意:如果PLC正在运行,下载会导致停机。建议在设备停止状态下下载。
下载完成后,把两台PLC都打到RUN模式。观察PLC上的通信指示灯(如果有的话),以及交换机的Activity灯。正常情况下,Activity灯应该以你设定的周期频率闪烁。
然后在软件里监控错误字节(比如VB3000)。如果通信正常,这个字节应该是0。如果非0,说明有错误。GET/PUT向导里有一个错误代码对照表,可以查每个位的含义。
常见的错误代码:
| 错误位 | 含义 | 排查方向 |
|---|---|---|
| 位0 | 通信超时 | 检查网线、交换机、IP是否通 |
| 位1 | 远程PLC未响应 | 远程PLC是否在RUN模式 |
| 位2 | 数据区地址错误 | 检查远程数据区是否存在 |
| 位3 | 连接被拒绝 | 远程PLC的GET/PUT配置是否正确 |
| 位4 | 协议错误 | 固件版本是否兼容 |
调试的时候,可以先用电脑ping一下两台PLC,确认网络层没问题。然后用软件的“通信”功能分别连接两台PLC,确认都能连上。最后再看GET/PUT的错误字节。
3.5 交换机连接技巧与网络优化
交换机连接这块,有几个实操技巧值得分享。
端口选择:如果交换机有千兆口和百兆口,PLC尽量接千兆口。虽然S7-200SMART的网口是百兆的,但千兆口的交换芯片性能更好,内部转发延迟更低。而且千兆口通常支持自动MDI/MDIX,网线直连交叉线都能用。
级联方式:如果PLC数量多,一台交换机端口不够,需要级联两台交换机。级联的时候,用交换机的普通端口对接就行,现代交换机都支持自动翻转。但要注意级联带宽——如果两台交换机之间只有百兆链路,而下面挂了很多PLC,通信数据都挤在这条百兆链路上,可能会拥塞。有条件的话用千兆口级联,或者做端口聚合。
VLAN划分:如果网络里除了PLC还有摄像头、办公电脑等大流量设备,建议用支持VLAN的交换机,把PLC通信隔离到一个独立的VLAN里。这样广播风暴和无关流量不会影响PLC通信。S7-200SMART本身不支持VLAN,但交换机支持就行。
广播抑制:工业网络里如果有设备频繁发广播包,会占用PLC的CPU资源。好的工业交换机支持广播风暴抑制功能,可以限制广播包的转发速率。这个功能在调试阶段特别有用,能帮你快速定位是哪个设备在发广播。
端口镜像:如果通信出了问题,需要抓包分析,可以用交换机的端口镜像功能,把PLC的端口流量镜像到电脑上,然后用Wireshark抓包。这个功能在排查复杂通信问题时非常有用。不过S7通信是私有协议,Wireshark只能看到TCP层的交互,应用层数据解析不了,但至少能看出连接是否建立、是否有重传。
4. 常见问题与排查技巧实录
4.1 通信完全不通怎么办
这是最常见的问题,现象是错误字节一直非0,或者PLC的通信指示灯不闪。
排查顺序从下往上:物理层→网络层→应用层。
物理层:检查网线是否插好,交换机端口灯是否亮。换一根网线试试,换一个交换机端口试试。如果换了还不行,用测线仪测网线。
网络层:电脑ping两台PLC,看是否通。如果不通,检查IP地址是否在同一网段,子网掩码是否一致。如果ping不通但网线没问题,可能是IP冲突——网络里有另一台设备用了相同的IP。把电脑接到交换机上,用arp -a命令查看局域网内的IP和MAC对应关系,看是否有冲突。
应用层:如果网络层通了,但GET/PUT还是报错,检查向导里的配置。远程PLC的IP是否填对,数据区地址是否存在,通信周期是否设得太短。还有一个容易忽略的点:两台PLC的GET/PUT配置必须匹配。比如A站配置了PUT到B站的VB2000,但B站没有在VB2000区域做任何处理,那数据虽然写过去了,但B站的程序读不到,看起来就像“通信没成功”。
4.2 通信时断时续怎么查
这个问题比完全不通更烦人,因为它是间歇性的,不好复现。
首先怀疑网线。工业环境里网线被踩、被拉、被老鼠咬都是常事。换一根质量好的屏蔽网线试试。
其次怀疑交换机。如果交换机温度过高,或者电源不稳,会导致间歇性丢包。摸一下交换机外壳,如果烫手,说明散热有问题。换一个通风位置,或者换工业级交换机。
再次怀疑电磁干扰。如果网线跟变频器输出线走同一个线槽,变频器工作时的高频干扰会耦合到网线上。把网线跟动力线分开走,间距至少20cm。如果必须交叉,垂直交叉,不要平行走。
最后怀疑网络负载。如果网络里有设备在大量发广播包或者做视频传输,交换机的缓冲区会被占满,PLC的通信包被丢弃。用交换机的端口统计功能查看各端口的流量和错误计数。如果某个端口错误计数增长很快,说明那个端口有问题。
独家技巧:在GET/PUT的错误字节里,如果“通信超时”位偶尔置1又自动恢复,基本可以判定是网络间歇性丢包。这时候可以在程序里加一个计数器,统计超时次数。如果超时次数在可接受范围内(比如每小时几次),可以忽略;如果频繁超时,就要按上面的步骤排查。
4.3 数据对不上是什么原因
通信显示正常,错误字节是0,但读回来的数据跟发送的数据不一致。
第一个可能:数据区重叠。比如A站的发送区是VB1000~VB1019,接收区是VB2000~VB2019,但程序里不小心把某个数据写到了VB1000~VB1019之外,或者两个区域有重叠。检查地址规划表,确保发送区和接收区不重叠。
第二个可能:数据更新不同步。发送方正在更新一个多字节数据(比如32位整数),更新到一半的时候,GET/PUT把数据读走了,接收方拿到的是“半新半旧”的数据。解决办法是加一个“数据有效”标志位,或者用双缓冲区机制——发送方写缓冲区A,写完后切换标志,GET/PUT读缓冲区B,下次再交换。
第三个可能:字节序问题。S7-200SMART的数据存储是“大端模式”还是“小端模式”?实际上S7-200SMART的V区存储是“小端模式”——低字节在低地址,高字节在高地址。但如果你用MOVW指令把一个字写到VW1000,VW1000的低字节在VB1000,高字节在VB1001。GET/PUT传输的是字节流,接收方如果按字节读取再拼装,要注意字节序。不过如果你两边都是S7-200SMART,用同样的MOVW指令读写,字节序自然一致,不用额外处理。
第四个可能:通信周期不匹配。A站的PUT周期是200ms,B站的GET周期是500ms。A站每200ms更新一次数据,B站每500ms读一次。如果B站读的时候A站正好在更新,就可能读到中间状态。建议两边的通信周期设成一样,或者接收方的周期略大于发送方。
4.4 多台PLC通信时的注意事项
两台PLC通信相对简单,三台以上就要注意了。
连接数限制:S7-200SMART的GET/PUT连接数有限制,具体数量取决于固件版本。V2.0以上好像是8个连接(包括GET和PUT)。如果你有5台PLC,每台都要跟其他4台通信,那就是4个连接,还在限制内。但如果每台都要跟其他4台做双向GET/PUT,那就是8个连接,刚好到上限。再多就不行了。
网络负载:N台PLC全互联的话,连接数是N×(N-1)。4台PLC就是12个连接,网络里的通信包数量是单台的两倍以上。如果通信周期设得短,网络负载会很高。建议多台PLC通信时,采用“主从”结构——一台主PLC跟其他从PLC通信,从PLC之间不直接通信。这样连接数从N×(N-1)降到N-1,网络负载大幅降低。
数据一致性:多台PLC通信时,数据在不同PLC之间的传播有延迟。比如A站的数据先传到B站,B站再传给C站,C站拿到的数据比A站的实际数据晚了一个通信周期。如果对数据实时性要求高,尽量让需要同步的数据直接从源PLC获取,不要经过中间转发。
4.5 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 通信完全不通 | 网线故障 | 测线仪测网线 | 更换网线 |
| 通信完全不通 | IP冲突 | arp -a查看 | 修改IP |
| 通信完全不通 | 配置不匹配 | 检查两边向导 | 统一配置 |
| 时断时续 | 电磁干扰 | 检查走线 | 分开布线 |
| 时断时续 | 交换机过热 | 摸外壳温度 | 换工业交换机 |
| 时断时续 | 网络拥塞 | 看端口统计 | 划分VLAN |
| 数据对不上 | 地址重叠 | 检查地址表 | 重新规划 |
| 数据对不上 | 更新不同步 | 加标志位 | 双缓冲机制 |
| 数据对不上 | 周期不匹配 | 检查周期设置 | 统一周期 |
| 多台通信异常 | 连接数超限 | 查固件手册 | 改主从结构 |
4.6 几个容易被忽略的细节
PLC的固件版本:GET/PUT功能在不同固件版本上行为可能有差异。建议两台PLC的固件版本一致,至少大版本号相同。如果一台是V2.0,另一台是V2.5,虽然基本功能兼容,但某些边界情况可能出问题。升级固件用西门子的SD卡或者软件里的固件更新功能。
交换机的MAC地址表:交换机通过学习MAC地址来转发数据。如果网络里设备经常换端口,MAC地址表会频繁更新,影响转发效率。工业环境里设备位置固定,这个问题不大。但如果调试阶段频繁插拔网线,可以等网络稳定几分钟后再测试。
PLC的通信资源:S7-200SMART的CPU除了跑你的程序,还要处理通信任务。如果程序扫描周期很长(比如有大量浮点运算),通信任务的响应可能会变慢。在“PLC”菜单里可以查看CPU的通信负载率,如果超过50%,建议优化程序或者降低通信频率。
接地问题:控制柜里所有设备的接地要良好。PLC的接地端子、交换机的接地端子、开关电源的接地端子都要接到柜体的接地排上。接地不好会导致通信接口的共模电压异常,表现为通信不稳定甚至烧毁网口。这个坑我踩过,烧了一个PLC的网口,换PLC花了两千多。
网口的防护:车间环境里粉尘、油污多,PLC的网口容易积灰。不用的时候用防尘塞堵上。如果网口已经氧化发黑,用电子清洁剂喷一下,或者用橡皮擦轻轻擦触点。不要用砂纸,会磨掉镀金层。
5. 进阶技巧与性能优化
5.1 如何缩短通信响应时间
GET/PUT的响应时间由几个因素决定:通信周期、网络延迟、PLC扫描周期。通信周期是你设定的,网络延迟取决于交换机性能,PLC扫描周期取决于你的程序。
要缩短响应时间,首先把通信周期设到最小。S7-200SMART的GET/PUT最小周期好像是10ms,但实际能不能跑到10ms取决于网络和PLC负载。你可以逐步减小周期,观察错误字节,找到一个稳定的最小值。
其次优化程序扫描周期。把跟通信无关的耗时逻辑放到子程序里,用条件调用,不要每个扫描周期都执行。比如PID运算、浮点计算这些,可以每10个扫描周期执行一次。
最后优化网络。用千兆交换机替代百兆交换机,用屏蔽网线替代非屏蔽网线,减少网络里的其他流量。如果网络里有多个PLC在做GET/PUT,考虑用支持QoS的交换机,给PLC通信包更高的优先级。
5.2 通信数据的打包与解包
GET/PUT传输的是原始字节流,没有数据类型的概念。你传一个浮点数,接收方拿到的也是4个字节,需要自己拼装成浮点数。
打包的时候,建议按数据类型对齐。比如:
| 偏移量 | 数据类型 | 说明 |
|---|---|---|
| +0 | BYTE | 状态字 |
| +1 | BYTE | 控制字 |
| +2 | INT | 速度设定 |
| +4 | INT | 实际速度 |
| +6 | REAL | 位置反馈 |
| +10 | DINT | 累计产量 |
这样接收方按同样的偏移量解析就行。注意REAL和DINT是4字节的,要放在偶数地址上,否则S7-200SMART访问会报错。
打包的时候用BLKMOV指令效率最高。比如把VB100~VB109这10个字节打包到VB1000开始的通信缓冲区:
LD SM0.0 BLKMOV VB100, VB1000, 10解包的时候反过来:
LD SM0.0 BLKMOV VB2000, VB200, 10BLKMOV比逐个MOV快得多,而且代码简洁。
5.3 通信中断的应急处理
通信中断了,设备不能停。程序里要有应急逻辑。
在接收方,如果GET回来的数据超过一定时间没更新(比如3个通信周期),就把数据标记为“无效”,用本地默认值替代。比如速度设定值,如果通信正常就用远程的值,通信中断就用本地预设的安全值。
在发送方,如果PUT连续失败,可以触发一个报警,提示操作员检查网络。但不要因为通信失败就停机,除非是安全相关的信号。
错误字节的处理也有讲究。不要一有错误就报警,因为偶尔的超时是正常的。可以加一个计数器,连续N次错误才报警。N的值根据通信周期定,比如周期200ms,N=5,就是连续1秒错误才报警。
5.4 用交换机镜像做通信分析
如果通信问题实在查不出来,可以用交换机的端口镜像功能抓包分析。
把PLC的端口镜像到电脑的端口,电脑上装Wireshark。抓包之后,过滤S7通信的端口(一般是102端口)。看TCP连接是否建立,是否有重传,是否有RST包。
如果看到大量TCP重传,说明网络丢包严重,查网线和交换机。如果看到连接建立后很快被RST,说明远程PLC拒绝了连接,查远程PLC的配置。如果看到连接根本建立不起来,说明网络层不通,查IP和路由。
S7通信的应用层数据Wireshark解析不了,但TCP层的交互足够定位大部分问题。这个方法比盲目换硬件高效得多。
实操心得:端口镜像会占用交换机资源,抓包的时候尽量选在设备停机或者低负载时段。抓包时间不要太长,几分钟就够,否则数据量太大不好分析。抓完包记得关掉镜像功能,否则交换机一直复制流量,影响性能。
5.5 从GET/PUT迁移到PROFINET
如果项目规模扩大,GET/PUT的连接数和数据量不够用了,可以考虑迁移到PROFINET。S7-200SMART不支持PROFINET,但S7-1200/1500支持。迁移的时候,数据区规划可以复用,但配置方式完全不同——PROFINET是组态式的,在TIA Portal里拖拽配置,不需要写GET/PUT指令。
迁移的代价是硬件成本上升(1200比200SMART贵),软件也要换成TIA Portal。但如果你的项目有几十台PLC、上千个数据点,PROFINET的组态效率和诊断能力是GET/PUT比不了的。
对于大多数小型项目,GET/PUT已经够用了。它的优势就是简单、便宜、够用。不要为了“先进”而过度设计,适合的才是最好的。
6. 个人实操体会与建议
我在多个项目里用过S7-200SMART的GET/PUT,从两台PLC的小系统到八台PLC的中型系统都做过。踩过的坑不少,总结几条实在的建议。
第一,地址规划要留余量。我习惯把通信缓冲区设在V1000以后,前面V0~V999留给程序内部使用。通信缓冲区的长度按实际需求的1.5倍规划,比如实际需要100字节,就划150字节。多出来的50字节用来做扩展,或者做双缓冲区。
第二,交换机不要省钱。一个工业交换机几百块,一个商用交换机几十块,差价不大,但稳定性差很多。我见过太多因为交换机问题导致的通信故障,最后换交换机解决。与其花时间排查,不如一开始就买好的。
第三,网线要用好的。屏蔽网线比非屏蔽贵不了多少,但抗干扰能力强很多。水晶头用金属壳的,压接的时候确保屏蔽层跟金属壳接触良好。网线两端都要做好,不要一端屏蔽一端不屏蔽,那样屏蔽层反而成了天线。
第四,程序里要有通信状态监控。不管项目多小,都要在触摸屏或者上位机上显示通信状态。操作员看到通信正常,心里有底;通信断了,能第一时间知道。不要等设备出问题了才发现通信早就断了。
第五,调试的时候耐心点。通信问题不像逻辑问题那么直观,有时候需要反复试。先确保物理层通,再确保网络层通,最后调应用层。一层一层来,不要跳步。我见过有人一上来就改程序,改了半天发现是网线没插好。
第六,文档要写清楚。GET/PUT的配置、数据区规划、IP地址分配,这些都要写进文档。过半年再来看,没有文档你根本记不住当时怎么配的。文档不用很正式,一个Excel表格加几张截图就行,关键是信息完整。
最后说一个真实案例。有个项目,两台PLC做GET/PUT,调试的时候一切正常,到了现场跑了半个月开始偶尔报通信超时。查了网线、交换机、程序,都没问题。最后发现是控制柜里加了一个变频器,变频器的输出线跟网线走同一个线槽。把网线移开之后问题消失。这个案例告诉我,工业现场的电磁环境比实验室复杂得多,布线规范不是纸上谈兵,是血泪教训。
GET/PUT是个好东西,用好了能省很多事。但它不是万能的,该用硬线的地方用硬线,该用PROFINET的地方用PROFINET。工具选对了,事情就成了一半。