第二章:工业以太网基础
各位同学,今天我们聊聊工业以太网。说实话,很多刚入行的朋友觉得这东西就是「网线插上就能用」——嗯,我以前也这么想,直到在现场被狠狠上了一课。
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客户端。到时候我会分享一些我在现场踩过的坑——嗯,保证让你少走弯路。