第二章:工业以太网基础

各位同学,今天我们聊聊工业以太网。说实话,很多刚入行的朋友觉得这东西就是「网线插上就能用」——嗯,我以前也这么想,直到在现场被狠狠上了一课。

2.1 TCP/IP协议栈回顾

先简单回顾一下TCP/IP协议栈。它分四层:应用层、传输层、网络层、网络接口层。每一层各司其职,就像工厂里的流水线。

核心要点:工业以太网和办公以太网在底层用的是同一套东西。区别在于上层协议和实时性要求。

我个人习惯把TCP/IP协议栈比作「快递系统」:

  • 应用层:你填写的快递单(比如Modbus报文)
  • 传输层:快递公司的分拣规则(TCP保证不丢件,UDP只管送)
  • 网络层:快递路线规划(IP地址决定送到哪个城市)
  • 网络接口层:快递员和交通工具(网线、交换机、无线)

我在项目中遇到过一个问题:一台PLC和上位机通信,数据偶尔会丢包。查了半天,发现是上位机的TCP窗口设置太小,导致发送方频繁等待确认。你想想看,这种问题在办公网络里可能只是网页加载慢一点,但在产线上就是设备停机。

小技巧:调试TCP/IP通信时,我习惯先用Wireshark抓包看看。三次握手有没有完成?序列号对不对?这些细节往往能快速定位问题。

2.2 工业以太网标准

工业以太网不是一种技术,而是一堆技术的总称。目前主流的有三种:Profinet、EtherCAT、Modbus TCP。它们各有各的脾气。

标准 实时性 典型应用 我的评价
Profinet RT: 1-10ms
IRT: <1ms
西门子生态、汽车产线 配置稍复杂,但生态完善
EtherCAT <100μs 运动控制、机器人 速度极快,调试要细心
Modbus TCP 10-100ms SCADA、能源管理 简单可靠,入门首选

2.2.1 Profinet

Profinet是西门子力推的标准。它分两种模式:RT(实时)和IRT(等时实时)。RT模式走标准TCP/IP,IRT模式则通过硬件加速实现微秒级同步。

我记得第一次配置Profinet IRT时,被那个「同步域」的概念绕晕了。说白了,就是让所有设备共享一个时钟。你想想看,如果两台伺服驱动器的时间不同步,那运动轨迹肯定对不上。

注意:Profinet IRT需要专用交换机。普通交换机不支持IRT的硬件转发,用了反而会出问题。我曾经见过有人用普通交换机跑IRT,结果整个网络直接瘫痪。

2.2.2 EtherCAT

EtherCAT是另一种思路。它采用「飞读飞写」技术——数据帧经过每个从站时,从站直接读取或写入数据,然后转发给下一个。整个过程几乎零延迟。

我曾经调试一个EtherCAT系统,发现某个从站总是报错。查了半天,原来是网线质量不行。EtherCAT对线缆要求很高,尤其是屏蔽和绞距。嗯,这里要注意:别用那种几块钱一根的网线。

关键点:EtherCAT的拓扑结构很灵活。你可以用线型、树型、星型,甚至环形。但环形需要主站支持冗余协议,否则断一根线整个网络就挂了。

2.2.3 Modbus TCP

Modbus TCP是最简单的工业以太网协议。它直接把Modbus RTU的报文封装在TCP包里。你甚至可以用Python的socket库直接读写。

# 一个简单的Modbus TCP读取示例
import socket

def read_holding_registers(ip, port, start_addr, count):
    # 构建Modbus TCP请求报文
    transaction_id = 0x0001
    protocol_id = 0x0000
    length = 6
    unit_id = 1
    function_code = 0x03  # 读取保持寄存器
    
    # 组装报文
    request = (transaction_id.to_bytes(2, 'big') +
               protocol_id.to_bytes(2, 'big') +
               length.to_bytes(2, 'big') +
               unit_id.to_bytes(1, 'big') +
               function_code.to_bytes(1, 'big') +
               start_addr.to_bytes(2, 'big') +
               count.to_bytes(2, 'big'))
    
    # 发送并接收
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(5)
    sock.connect((ip, port))
    sock.send(request)
    response = sock.recv(1024)
    sock.close()
    
    return response

# 使用示例
data = read_holding_registers('192.168.1.100', 502, 0, 10)
print(data.hex())

避坑指南:我曾经用这个脚本去读一个老款PLC,结果死活读不到数据。后来发现是PLC的Modbus TCP实现不标准——它要求报文里的单元ID必须为0。所以,遇到问题先看设备手册,别盲目相信标准。

2.3 交换机与路由器配置基础

工业网络里,交换机和路由器是核心设备。但很多人把它们搞混了。

  • 交换机:工作在二层(数据链路层),根据MAC地址转发数据。适合局域网内部通信。
  • 路由器:工作在三层(网络层),根据IP地址转发数据。适合连接不同网段。

在工业现场,我建议优先用管理型交换机。为什么?因为你可以配置VLAN、QoS、端口镜像这些功能。普通交换机虽然便宜,但出了问题你连查都没法查。

2.3.1 VLAN配置

VLAN(虚拟局域网)可以把一个物理网络切成多个逻辑网络。比如,你可以把PLC网络和摄像头网络分开,避免视频流量影响控制信号。

配置VLAN时要注意:交换机端口要设置成Access或Trunk模式。Access端口只属于一个VLAN,Trunk端口可以承载多个VLAN。我记得第一次配置时,把Trunk端口设成了Access,结果两个VLAN的设备互相看不见——嗯,这种低级错误犯过一次就不会再犯了。

2.3.2 QoS配置

QoS(服务质量)用来保证重要数据的优先级。在工业网络里,控制指令的优先级应该高于视频流或文件传输。

配置QoS时,我习惯把Profinet或EtherCAT的数据帧标记为高优先级(DSCP值设为46或更高)。这样即使网络拥堵,控制指令也能优先通过。

警告:QoS不是万能的。如果网络带宽已经饱和,QoS只能保证高优先级数据不丢,但低优先级数据可能会被完全丢弃。所以,网络规划时还是要留足余量。

2.3.3 端口镜像

端口镜像是调试利器。你可以把某个端口的流量复制到另一个端口,然后用Wireshark抓包分析。我每次排查网络问题时,第一件事就是配置端口镜像。

举个例子:有一次产线频繁报错,我怀疑是某个设备在发送垃圾数据。通过端口镜像抓包,发现是一台老款变频器在广播ARP请求,频率高达每秒100次。嗯,找到问题就好办了——直接把它隔离到一个单独的VLAN里。

小结

工业以太网不是玄学,它是有章可循的。TCP/IP协议栈是基础,Profinet、EtherCAT、Modbus TCP是工具,交换机和路由器是骨架。把这些搞懂了,你就能搭建一个稳定可靠的工业网络。

下一章,我们会聊聊如何用Python写一个简单的Modbus TCP客户端。到时候我会分享一些我在现场踩过的坑——嗯,保证让你少走弯路。