• 运行open62541基于TSN网络的pub/sub示例(ETH+ UDP)


    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就得到网络上数据传输和处理的时间。

    一、open62541的编译

    如果要使用以太网进行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个程序也有一点区别。

    1. #Clone the open62541 stack from GitHub
    2. git clone https://github.com/open62541/open62541.git
    3. #Fetch the pull request and create a new branch
    4. #This pull request contains the latest version of the TSN application required for our setup
    5. cd open62541
    6. #Create a build directory
    7. mkdir build && cd build/
    8. #Build the open62541 application with the cmake options
    9. cmake -DUA_BUILD_EXAMPLES=ON -DUA_ENABLE_PUBSUB=ON -DUA_ENABLE_PUBSUB_ETH_UADP=ON ..
    10. # if use UDP to pub/sub use this line
    11. cmake -DUA_BUILD_EXAMPLES=ON -DUA_ENABLE_PUBSUB=ON ..
    12. #Compile the open62541 application
    13. make -j$(nproc)

    编译时可能会遇到找不到sys/io.h的问题,可以在.c里面把这一个引用给注释掉。

    examples/pubsub_realtime/pubsub_TSN_loopback_single_thread.c中注释掉下面这一行:

    pubsub_TSN_publisher_multiple_thread.c也一样的啦:

    //#include   // <---就这一行

    参考:pubsub_TSN_publisher.c:70:10: fatal error: sys/io.h: No such file or directory · Issue #4345 · open62541/open62541 · GitHub

    二、TSN网络设置相关

    要接入TSN网络主要需要设置vlan网卡等等。

    1. ip link add link eth0 name eth0.8 type vlan id 8
    2. ip link set dev eth0.8 up
    3. ip addr add 192.168.8.100/24 dev eth0.8
    4. for j in `seq 0 7`; do ip link set eth0.8 type vlan egress $j:$j; done
    5. for j in `seq 0 7`; do ip link set eth0.8 type vlan ingress $j:$j; done
    6. 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地址。

    1. ./bin/examples/pubsub_TSN_loopback_single_thread -interface eth0 -enableBlockingSocket \
    2. -pubUri opc.eth://c8-f7-50-f8-3e-0e:8.3 \
    3. -subUri opc.eth://6c-cf-39-00-00-4c:8.3 \
    4. -enableCsvLog \
    5. -pubSubAppCore 1 \
    6. -socketPriority 3 \
    7. -enableconsolePrint

    2.运行publish

    1. ./bin/examples/pubsub_TSN_publisher_multiple_thread -interface eth0 -enableBlockingSocket \
    2. -enableCsvLog \
    3. -pubUri opc.eth://6c-cf-39-00-00-4c:8.3 \
    4. -subUri opc.eth://c8-f7-50-f8-3e-0e:8.3 \
    5. -pubAppCore 3 -subAppCore 4 \
    6. -socketPriority 3 -cycleTimeInMsec 1000 \
    7. -enableconsolePrint

    四、UDP发布和订阅

    2台主机接入TSN网络,node1 和 node2, VLAN 网卡的IP分别设为192.168.8.100和192.168.8.100

    参照上面TSN网络的设置。

    编译时,要把UA_ENABLE_PUBSUB_ETH_UADP设置为OFF

    1. cmake -DUA_BUILD_EXAMPLES=ON -DUA_ENABLE_PUBSUB=ON \
    2. -DCMAKE_BUILD_TYPE=Debug \
    3. -DUA_ENABLE_PUBSUB_ETH_UADP=OFF ..

    下面是opcua程序的运行:

    1.运行loopback

    1. ./bin/examples/pubsub_TSN_loopback_single_thread -enableBlockingSocket \
    2. -interface 192.168.8.101 \
    3. -pubUri opc.udp://224.0.0.32:4840/ \
    4. -subUri op
  • 相关阅读:
    ---线程3续
    Cyberdog GPTS建立过程笔记
    作为所有类的顶层父类,没想到Object的魔力如此之大!
    【C++练级之路】【Lv.26】类型转换
    VHDL硬件描述语言(三)VHDL语言要素
    R语言绘制时间序列的自相关函数图:使用acf函数可视化时间序列数据的自相关系数图、分析是否存在自相关性以及显著相关的个数
    从零开始实现一个分布式RPC框架
    C++ 特殊类设计
    labelme做标注
    AI模型训练参数
  • 原文地址:https://blog.csdn.net/v6543210/article/details/126748830