基于VXLAN实现EtherCAT数据帧无线传输

问题描述

目前EtherCAT主站、从站间的通信方式为:通过网线直连后使用层二的EtherCAT数据帧通信。但在云化PLC工控场景中,伴随PLC上云,EtherCAT主站也需要在云端部署,云端与本地使用移动无线网络通信,如5G、WiFi。在这种情况下,层二的EtherCAT数据帧如何在层三网络传输成为问题。

解决方案

使用VxLAN隧道技术,直接在EtherCAT主站与从站间建立层二虚拟隧道,传输EtherCAT数据帧。

本文以Wi-Fi网络为例,设备A代表部署EtherCAT主站的设备,设备B代表从站侧前置设备,方案架构图如下。

实施步骤

设备A代表部署EtherCAT主站的设备,设备B代表从站侧前置设备

设备A配置

创建虚拟网络设备

创建veth,将其配置为EtherCAT主站网卡设备。在后续需要加入虚拟网桥中,这样veth0发出的EtherCAT数据帧会由虚拟网桥发送给VxLAN隧道端点进行封装。

1
2
3
4
5
6
// 创建
ip link add veth0 type veth
ip link add veth0 type veth peer name veth1

// 开启接口,一般默认开启,但保险起见还是用命令开启一下
ip link set dev veth0 up

配置EtherCAT网卡

1
2
// 使用vim打开ethercat配置文件
vim $ethercat-path/etc/sysconfig/ethercat
1
2
// 找到下方内容,将双引号内改为veth0的MAC地址
MASTER0_DEVICE=""

创建vetp

VTEP(VXLAN Tunnel Endpoints)是VXLAN隧道的端点,在两个设备上都要创建。vetp(vxlan0)后续要与veth0加入到同一虚拟网桥中,这样veth0发出的EtherCAT帧会由vxlan0接收,由vxlan0对EtherCAT数据帧封装上vxlan头后再封装udp头,使其成为层三数据帧,最后由设备A上实际的网卡(wlan0)发送出去。相应的其接收到上行的数据帧后也会从中解封装出EtherCAT数据帧,再发送给veth0。

1
2
3
4
5
6
7
// remote后指定对端设备用于接收vxlan帧的网卡的IP,dev后指定本设备用于发送vxlan帧的网卡名
// id指定vxlan隧道ID,在设备B上创建时要指定为相同的ID
// dstport为封装vxlan帧的UDP头中的端口号
ip link add vxlan0 type vxlan id 42 dstport 4789 remote 192.168.31.20 dev wlan0

// 开启vxlan0
ip link set vxlan0 up

创建虚拟网桥

创建虚拟网桥br0,并将veth1和vxlan0加入其中,使两者能互相收发EtherCAT数据帧。

1
2
3
4
5
6
7
8
9
// 创建虚拟网桥br0
brctl addbr br0

// 将vxlan0和veth1加入br0
brctl addif br0 vxlan0
brctl addif br0 veth0

// 开启br0
ifconfig br0 up

设备B配置

创建vxlan

创建设备B上的VXLAN隧道的端点。

1
2
3
4
ip link add vxlan0 type vxlan id 42 dstport 4789 remote 192.168.31.10 dev wlan0

// 开启vxlan0
ip link set vxlan0 up

创建虚拟网桥

将vxlan0和设备B连接EtherCAT从站的网口加入虚拟网桥br0。

1
2
3
4
5
6
7
8
9
// 创建虚拟网桥br0
brctl addbr br0

// 将vxlan0和eth0加入br0
brctl addif br0 vxlan0
brctl addif br0 eth0

// 开启br0
ifconfig br0 up

到此,EtherCAT主站与从站间的vxlan通道建立完成,EtherCAT主站并不会察觉底层网络的改变,使用和之前无异。但EtherCAT主从间的通信会受网络性能影响,在使用网线时能正常工作,但使用Wi-Fi时系统稳定性较差。

其他命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 查看vxlan
ip -d link show dev vxlan名称
ip -d link show dev vxlan0

// 删除vxlan
ip link delete vxlan名称
ip link delete vxlan0

// 查看虚拟网桥
brctl show
brctl show 网桥名称

// 从虚拟网桥中删除网卡
brctl delif 网桥名称 网卡名称
brctl delif br0 eth0

// 删除虚拟网桥
brctl delbr 网桥名称
brctl delbr br0

// 删除veth
ip link delete veth0
// 删除一端后另一端自动删除