open62541开源库包含了一个运行在TSN网络上的demo。
demo的功能是一个发布,一个进行loopback,然后用接收到的时间减去发送的时间,再除以2就得到网络上数据传输和处理的时间。
一、open62541的编译
如果要使用以太网进行pub/sub选择
cmake 的参数为 -DUA_ENABLE_PUBSUB_ETH_UADP=ON
如果使用UDP进行pub/sub, 选择
cmake 参数 -DUA_ENABLE_PUBSUB_ETH_UADP=OFF (默认是OFF)
如果机器资源紧张,编译慢,可以只编译所需的两个程序。
make -j4 pubsub_TSN_loopback_single_thread
make -j4 pubsub_TSN_publisher_multiple_thread
在examples/pubsub_realtime这个目录下还有pubsub_TSN_publisher.c和pubsub_TSN_loopback.c 这两个程序源码,这两个程序不支持udp的pub/sub,在我的运行过程中有些问题,不太清楚与上面2个程序的区别是什么。具体的参数与上面的2个程序也有一点区别。
#Clone the open62541 stack from GitHub
git clone https:///open62541/open62541.git
#Fetch the pull request and create a new branch
#This pull request contains the latest version of the TSN application required for our setup
cd open62541
#Create a build directory
mkdir build && cd build/
#Build the open62541 application with the cmake options
cmake -DUA_BUILD_EXAMPLES=ON -DUA_ENABLE_PUBSUB=ON -DUA_ENABLE_PUBSUB_ETH_UADP=ON ..
# if use UDP to pub/sub use this line
cmake -DUA_BUILD_EXAMPLES=ON -DUA_ENABLE_PUBSUB=ON ..
#Compile the open62541 application
make -j$(nproc)
编译时可能会遇到找不到sys/io.h的问题,可以在.c里面把这一个引用给注释掉。
examples/pubsub_realtime/pubsub_TSN_loopback_single_thread.c
注释掉下面这一行:
//#include <sys/io.h> // <---就这一行
pubsub_TSN_publisher_multiple_thread.c也一样的啦:
参考:pubsub_TSN_publisher.c:70:10: fatal error: sys/io.h: No such file or directory · Issue #4345 · open62541/open62541 · GitHub
二、TSN网络设置相关
要接入TSN网络主要需要设置vlan网卡等等。
ip link add link eth0 name eth0.8 type vlan id 8
ip link set dev eth0.8 up
ip addr add 192.168.8.100/24 dev eth0.8
for j in `seq 0 7`; do ip link set eth0.8 type vlan egress $j:$j; done
for j in `seq 0 7`; do ip link set eth0.8 type vlan ingress $j:$j; done
ip route add 224.0.0.0/24 dev eth0.8
系统添加一个VLAN 网卡,名为eth0.8, 从这个虚拟网卡过的包都会自动加上vlan标签,vlan id为8.
IP地址可以单独设置,此处设置为192.168.8.100
egress这条命令 设置 socket 优先级到 vlan优先级的映射关系,此处是0:0 1:1 ... 7:7
ip route 将udp的广播地址 路由到eth0.8这个vlan 网卡上。
在TSN交换机上,需要设置对vlan id为8的数据包进行放行, 对于特定的VLAN 优先级设置 Qbv,Qbu规则等。(此处选择的优先级是3,见后面命令)
三、以太网层发布和订阅
2台主机接入TSN网络,node1 和 node2, IP分别设为192.168.8.100和192.168.8.100
参照上面TSN网络的设置。
下面是opcua程序的运行:
1.运行loopback
puburi使用对方的mac地址,
suburi使用本机的mac地址。
./bin/examples/pubsub_TSN_loopback_single_thread -interface eth0 -enableBlockingSocket \
-pubUri opc.eth://c8-f7-50-f8-3e-0e:8.3 \
-subUri opc.eth://6c-cf-39-00-00-4c:8.3 \
-enableCsvLog \
-pubSubAppCore 1 \
-socketPriority 3 \
-enableconsolePrint
2.运行publish
./bin/examples/pubsub_TSN_publisher_multiple_thread -interface eth0 -enableBlockingSocket \
-enableCsvLog \
-pubUri opc.eth://6c-cf-39-00-00-4c:8.3 \
-subUri opc.eth://c8-f7-50-f8-3e-0e:8.3 \
-pubAppCore 3 -subAppCore 4 \
-socketPriority 3 -cycleTimeInMsec 1000 \
-enableconsolePrint
四、UDP发布和订阅
2台主机接入TSN网络,node1 和 node2, VLAN 网卡的IP分别设为192.168.8.100和192.168.8.101
参照上面TSN网络的设置。
编译时,要把UA_ENABLE_PUBSUB_ETH_UADP设置为OFF
cmake -DUA_BUILD_EXAMPLES=ON -DUA_ENABLE_PUBSUB=ON \
-DCMAKE_BUILD_TYPE=Debug \
-DUA_ENABLE_PUBSUB_ETH_UADP=OFF ..