TSNの時刻同期の仕組み。IEEE 802.1QBVを試してみた

本サイトはアフィリエイト広告を利用しています。
FPGA

TSNの時刻同期の仕組みの重要なポイントである、IEEE 802.1QBVを試してみました。

通信トラフィックをスケジューリングする仕様を確認しています。

実際の通信テストから、解析方法まで紹介します。

 

スポンサーリンク

TSNの時刻同期の仕組み。IEEE 802.1QBVを試してみた

TSN(Time Sensitive Networking)の時刻同期の仕組みを調べてみました。

IEEE 802.1QBVには通信トラフィックをスケジューリング・時分割する仕様があります。

実際にTSN通信のパケットまで解析して確認しています。

 

TSNの中にある(優先順位が高い)パケットのリアルタイム性を確保できていました。

実際に行った通信テストから解析方法まで紹介します。

 

TSNの通信環境

今回のテスト環境は「PTP対応のLANカード(NIC)」と「TSNに対応のFPGAボード」です。

PTP対応のLANカード(NIC)の詳細については下記記事で紹介しています。

IEEE-1588/PTP対応のLANカード(NIC)を動かしてみた

IEEE-1588/PTP対応のLANカード(NIC)を動かしてみた
IEEE-1588/PTP対応のLANカード(NIC)を購入してみました。 実際にPCにカードを取り付けて、PTPの動作確認まで実施しています LANカード(NIC)の選定から、PTP通信までの内容を紹介します。

 

またTSNに対応のFPGAボード(KR260)に関しては下記記事で紹介しています。

KR260を購入してUbuntuを動かすまでのメモ

KR260を購入してUbuntuを動かすまでのメモ
XilinxのKria KR260のロボティクス スターター キットを買ってみました。 Digi-Keyから個人で購入しています。 Ubuntuを動かすまでの流れを紹介します。

 

Wiresharkをインストール・起動する

通信テストをする前にパケット解析するソフトをインストールします。

「Wireshark」です。TSN通信のマスターであるLinuxのPCに入れました。

sudo apt install wireshark

 

インストール時にスーパユーザー以外でも使えるかはYesとしておきました。

 

インストール後にはアプリケーションの欄からWiresharkを選択できます。

 

初期状態だと、インターフェース(増設したLANカード(NIC))が選択できませんでした。

下記記事を参考にさせていただき、使えるようになりました。この場を借りてお礼申し上げます。

WiresharkのInterface ListにNICが表示されない場合

sudo dpkg-reconfigure wireshark-common
sudo usermod -a -G wireshark <username>

 

筆者の環境では、TSNのマスターになるLANカードが「enp4s0」です。

インターフェースを選択すれば、あとはサメの尾ひれ(開始)を押すだけで通信解析が可能です。

 

TSNのPTP通信を解析してみる

TSNの最初の通信テストであるPTPのメッセージを確認してみます。

通信テストの内容は下記記事で紹介した内容です。下記テスト実施時に解析しました。

TSN Ethernetの実装をFPGA(KR260)で試してみた

TSN Ethernetの実装をFPGA(KR260)で試してみた
TSN(Time Sensitive Networking)のイーサネット環境を作ってみました。 KR260というTSN対応のFPGAボードを使ってテストしています。 TSNの環境構築から実装・通信テストまで一連の流れを紹介します。

 

マスターのLANカードが「Shenzhen_52:9d:82」、スレーブのKR260が「Xilinx_00:01:2e」です。

下記PTPV2のメッセージにより、遅延時間・オフセットを計算して時刻同期がとれています。

  • マスター側からSync Message
  • スレーブ側からDELAY_REQ Message
  • マスター側からDelay_Resp Message
No.	Time	Source	Destination	Protocol	Length	Info
1	0.000000000	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	78	Announce Message
2	0.051688055	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	58	Sync Message
3	0.051732768	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	90	Follow_Up Message
4	0.176882752	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	58	Sync Message
5	0.176921665	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	90	Follow_Up Message
6	0.302044930	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	58	Sync Message
7	0.302107473	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	90	Follow_Up Message
8	0.427316528	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	58	Sync Message
9	0.427362502	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	90	Follow_Up Message
10	0.552548720	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	58	Sync Message
11	0.552623854	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	90	Follow_Up Message
12	0.595690650	Xilinx_00:01:2e	LLDP_Multicast	PTPv2	68	Peer_Delay_Req Message
13	0.595835718	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	68	Peer_Delay_Resp Message
14	0.595898969	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	68	Peer_Delay_Resp_Follow_Up Message
15	0.677817497	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	58	Sync Message
16	0.677892100	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	90	Follow_Up Message
17	0.802900149	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	58	Sync Message
18	0.802960149	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	90	Follow_Up Message
19	0.820467155	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	68	Peer_Delay_Req Message
20	0.820789475	Xilinx_00:01:2e	LLDP_Multicast	PTPv2	68	Peer_Delay_Resp Message
21	0.820789686	Xilinx_00:01:2e	LLDP_Multicast	PTPv2	68	Peer_Delay_Resp_Follow_Up Message
22	0.928175213	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	58	Sync Message
23	0.928242152	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	90	Follow_Up Message
24	1.053348708	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	58	Sync Message
25	1.053424713	Shenzhen_52:9d:82	LLDP_Multicast	PTPv2	90	Follow_Up Message

 

実際にWiresharkでキャプチャした写真です。下記のようにTSNの通信解析できます。

 

今回のテストで試したTSNの通信設定に関しては下記記事で紹介しています。

TSNとPTPの違いは?通信テストの設定・ログから確認してみた

TSNとPTPの違いは?通信テストの設定・ログから確認してみた
TSNの環境構築して、PTPの通信テストを行いました。 そしてテストしたPTPの設定が、TSNの規格に適応しているのか確認してみました。 設定・ログを見直しながら、PTPとTSNの違いを確認した内容を紹介します。

 

IEEE 802.1QBVのトラフィックのスケジューリング

次はIEEE 802.1QBVのトラフィックのスケジューリングを入れたパターンでテストします。

この箇所の内容は下記XilinxのKR260の公式サンプル手順の内容です。

 https://xilinx.github.io/kria-apps-docs/kr260/build/html/docs/ros2_multinode_communication_via_tsn/docs/app_deployment.html#id3

 

テスト内容

前の通信テストに連続する形で、下記スクリプトを実行します。

ubuntu@kria:~$ source /opt/xilinx/tsn-examples/bin/start_qbv_test.sh -tx
Please enter the password for sudo access
Deleting CAM entry
Dest mac- e0:e0:e0:e0:e0:e0, vlanid- 10
[2]+  Killed                  tail -f ~/.local/log/ptplog
Adding CAM entry
Dest mac- e0:e0:e0:e0:e0:e0, vlanid- 10, port- swp1
Deleting CAM entry
Dest mac- e0:e0:e0:e0:e0:e0, vlanid- 20
Adding CAM entry
Dest mac- e0:e0:e0:e0:e0:e0, vlanid- 20, port- swp1
Setting: ep :
cycle_time: 1000000
list 0: gate_state: 0x4 gate_time: 700000 nS
list 1: gate_state: 0x1 gate_time: 300000 nS
selected /dev/ptp2 as PTP clock
Setting: ep :
cycle_time: 1000000
list 0: gate_state: 0x4 gate_time: 700000 nS
list 1: gate_state: 0x1 gate_time: 300000 nS
selected /dev/ptp2 as PTP clock
tsn_talker: no process found
ST PCP:4
Two instances of talker configured, one to generate Scheduled traffic with Vlan 10
packet length 900 at full rate continuously and another to generate BE traffic with Vlan ID 20,
packet length 800 at full rate continuously.


Using following arguments:
Interface: ep
Ethertype: 0x8100
Dest Mac: E0:E0:E0:E0:E0:E0
Src Mac: A0:A0:A0:A0:A0:A0
VLAN: 10
PCP: 4
txlen: 900
seq off: 0
pkt_limit: -1
duration: 0
ratelimit: 0
Trigger Enabled: true
Trigger Type: Publisher
Trigger Mode: HW
Using UIO device for Test PMOD controller:
        /sys/class/uio/uio4
PysicalBase = 0x80030000
Map Size = 0x1000
TPMod Cntrl Virt Addr: 0xffffa75df000
Using following arguments:
Interface: ep
Ethertype: 0x8100
Dest Mac: E0:E0:E0:E0:E0:E0
Src Mac: A0:A0:A0:A0:A0:A0
VLAN: 20
PCP: 1
txlen: 800
seq off: 0
pkt_limit: -1
duration: 0
ratelimit: 0
Trigger Enabled: false

Starting traffic with dest_mac: e0:e0:e0:e0:e0:e0 vlan: 20 pcp: 1 pkt_size: 800
Starting traffic with dest_mac: e0:e0:e0:e0:e0:e0 vlan: 10 pcp: 4 pkt_size: 900
talker start time: sec: 0 ns: 0
***** Running Talker for 30 seconds ******
ubuntu@kria:~$
talker start time: sec: 0 ns: 0

[2]-  Terminated              $SUDO tsn_talker -n $PKT -l $ST_LEN -v $ST_VLAN -p $ST_PCP -T hw
[3]+  Terminated              $SUDO tsn_talker -n $PKT -l $BE_LEN -v $BE_VLAN -p $BE_PCP
ubuntu@kria:~$

 

テスト内容としては簡単に記載すると、通信を2つにスケジューリング・時分割します。

BE_300us+ST_700usとして分割して、サイクルタイム1000us周期で繰り返します。

  • Best Effort (BE)…vlan: 20 pcp: 1 pkt_size: 800    ※優先順位の低い通信
  • Scheduled Traffic (ST)…vlan: 10 pcp: 4 pkt_size: 900   ※優先順位の高い通信

 

PCP(優先順位)をつけることで、リアルタイム性を確保しています。

VLANの値を変えることで、仮想的にネットワークも分割している形となっています。

(パケットサイズ変えているのは、テスト結果を分かりやすくするため?かと思います)

 

Wiresharkの解析結果

テスト通信中にWiresharkを開始して、通信解析をします。

とあるサイクルタイム1回分の周期のログを切り取っています。

設定したBE_300us+ST_700usとなっていました。 →スケジューリング・時分割OKです。

  • Best Effort (BE)…4.560453893-4.560152230 ≒300us    ※Length_800箇所
  • Scheduled Traffic (ST)…4.561184996-4.560513717 ≒700us ※Length_900箇所
No.	Time	Source	Destination	Protocol	Length	Info
6435	4.560152151	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x0992	900	PRI: 0  DEI: 0  ID: 0
6436	4.560152189	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x0993	900	PRI: 0  DEI: 0  ID: 0
6437	4.560152230	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x4d4c	800	PRI: 0  DEI: 0  ID: 0
6438	4.560230797	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x4d4d	800	PRI: 0  DEI: 0  ID: 0
~
6479	4.560447789	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x4e27	800	PRI: 0  DEI: 0  ID: 0
6480	4.560447832	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x4e28	800	PRI: 0  DEI: 0  ID: 0
6481	4.560453893	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x4e29	800	PRI: 0  DEI: 0  ID: 0
6482	4.560513717	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x0994	900	PRI: 0  DEI: 0  ID: 0
6483	4.560513758	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x0995	900	PRI: 0  DEI: 0  ID: 0
~~
6507	4.561105676	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x09ad	900	PRI: 0  DEI: 0  ID: 0
6508	4.561184901	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x09ae	900	PRI: 0  DEI: 0  ID: 0
6509	4.561184952	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x09af	900	PRI: 0  DEI: 0  ID: 0
6510	4.561184996	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x09b0	900	PRI: 0  DEI: 0  ID: 0
6511	4.561185045	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x4e2a	800	PRI: 0  DEI: 0  ID: 0
6512	4.561185091	a0:a0:a0:a0:a0:a0	e0:e0:e0:e0:e0:e0	0x4e2b	800	PRI: 0  DEI: 0  ID: 0

 

PCP(Priority Code Point)の確認

Wiresharkで解析すると通信パケットの中身まで分かります。

PCP(Priority Code Point)の優先順位が設定どおりになっているか確認します。

本来は0~7まで設定できるようですが、今回は1と4を設定していました。

 

Best Effort (BE)は設定・ログ共にPCPが1となっていました。→OKです。

優先順位が低く、遅延が許容される通信トラフィックとなっています。

  • 設定…vlan: 20 pcp: 1 pkt_size: 800  ※優先順位の低いパケット
  • ログ…802.1Q Virtual LAN, PRI: 1, DEI: 0, ID: 20

802.1Q Virtual LAN, PRI: 1, DEI: 0, ID: 20
    001. .... .... .... = Priority: Background (1)
    ...0 .... .... .... = DEI: Ineligible
    .... 0000 0001 0100 = ID: 20
    Type: 802.1Q Virtual LAN (0x8100)

 

Scheduled Traffic (ST)は設定・ログ共にPCPが4となっていました。→OK

優先順位が高く、比較的重要な通信トラフィックとなっています。(7が一番優先順位が高い)

  • 設定…vlan: 10 pcp: 4 pkt_size: 900   ※優先順位の高いパケット
  • ログ…802.1Q Virtual LAN, PRI: 4, DEI: 0, ID: 10

802.1Q Virtual LAN, PRI: 4, DEI: 0, ID: 10
    100. .... .... .... = Priority: Video, < 100ms latency and jitter (4)
    ...0 .... .... .... = DEI: Ineligible
    .... 0000 0000 1010 = ID: 10
    Type: 802.1Q Virtual LAN (0x8100)

 

tsnのトラフィックを作るスクリプトの中身

今回Xilinxが用意したスクリプトを基にTSNのトラフィックを制御しました。

スクリプトの中身を見ると、tsn_talkerというものが働いていました。

--helpを見ると下記形でした。スクリプトや引数など弄れば色々なTSN通信が試せそうです。

tsn_talker --help
Usage: tsn_talker [OPTION...]
Generate tsn traffic on the specified interface

 Ethernet config:
  -d, --dmac=DST_MAC         Destination MAC Address
                             Default: e0:e0:e0:e0:e0:e0
  -e, --etype=ETH_TYPE       Ethertype. e.g 0x86dd, 0x8100
                             Default: 0x8100
  -i, --iface=ETH_I/F        Interface name. e.g. eth0, eth1, eth2
                             Default: ep
  -l, --len=PKT_LEN          Data length for each packet in bytes.
                             Default: 900
  -n, --count=PKT_CNT        Number of packets to be transmitted
                             Default: 1
  -o, --seq_off=SEQ_OFF      Sequence offset. Default: 0
  -p, --pcp=PCP_VAL          Priority Code Point value. Default: 4
  -r, --ratelimit=RATE_LIMIT Rate Limit. Default : 0
  -s, --smac=SRC_MAC         Source MAC Address
                             Default: a0:a0:a0:a0:a0:a0
  -t, --duration=DURATION    Duration. Default: 0
  -v, --vlan=VLAN_ID         VLAN ID. Default: 10

 Oscilloscope trigger setup:
  -O, --trigger-oneshot=y/n  y : Trigger only for first frame (Default)
                             n : Trigger for all the frames
                             Applicable only for sw trigger
  -T, --trigger=MODE         Set Subscriber Trigger MODE from:
                             hw  : Hardware mode (trigger by hw)
                             sw_1  : Software trigger on subscriber id 1
                             sw_2  : Software trigger on subscriber id 2
                             sw_3  : Software trigger on subscriber id 3
                             n   : Do not configure trigger (default)

 Misc:

  -?, --help                 Give this help list
      --usage                Give a short usage message

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Following table explain the effect of options in combination:
RATE_LIMIT   PKT_CNT  Meaning
 0            N (>0)  N packets are sent and stoped.
 0            -1      Unlimited packets are sent.
 1            N (>0)  N packets are sent in DURATION repeatedly
 1            -1      Illegal

 

まとめ

TSNの時刻同期の仕組みの重要なポイントである、IEEE 802.1QBVを試してみました。

時刻同期の仕組みとして、通信トラフィックのスケジューリング・時分割がされています。

(単純にPTP通信で時刻精度が良いということだけでは無し)

 

是非皆さまもTSNに興味ありましたら、ぜひ同様にテストしてみて下さい。

下記記事にて、筆者個人でTSN通信テストした内容をまとめています。

よろしければ一緒にご覧ください。(リンク先はこちら)

TSN通信の仕組みのまとめ。実際にテスト・調べてみた

TSN通信の仕組みのまとめ。実際にテスト・調べてみた
TSN(Time Sensitive Networking)について、開発・調査してみました。 今までに調べた内容を、一つの記事にまとめて紹介します。 個人でもTSNの環境構築から実装・通信テストまで可能です。

コメント