open62541开源库包含了一个运行在TSN网络上的demo。
原文链接: https://www.kalycito.com/how-to-run-opc-ua-pubsub-tsn/
但是这个链接好像访问不了了。只能去archive里面看了。
http://web.archive.org/web/20220320043744/https://www.kalycito.com/how-to-run-opc-ua-pubsub-tsn/
里面包含一个demo的脚本,原链接已经失效,现在上传到csdn上,供学习借鉴。
https://download.csdn.net/download/v6543210/86511343
其实里面也就是3个脚本,下载open62541,设置环境等,运行Ptp4l时钟同步,运行opcua 的demo。
demo的功能是一个发布,一个进行loopback,然后用接收到的时间减去发送的时间,再除以2就得到网络上数据传输和处理的时间。

如果要使用以太网进行pub/sub选择 -DUA_ENABLE_PUBSUB_ETH_UADP=ON
如果使用UDP进行pub/sub, 选择-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://github.com/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中注释掉下面这一行:
pubsub_TSN_publisher_multiple_thread.c也一样的啦:
//#include
要接入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
2台主机接入TSN网络,node1 和 node2, VLAN 网卡的IP分别设为192.168.8.100和192.168.8.100
参照上面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 ..
下面是opcua程序的运行:
1.运行loopback
- ./bin/examples/pubsub_TSN_loopback_single_thread -enableBlockingSocket \
- -interface 192.168.8.101 \
- -pubUri opc.udp://224.0.0.32:4840/ \
- -subUri op