今回の記事ではB2G78-EP1のAnywire Ethernet/IP Gatewayを使用し、Ethernet/IPネットワーク経由でBeckhoff TwinCAT3 のTF6281とデータ交換します。
さ、FAを楽しもう!

前書き
いつも私の技術ブログとYouTubeチャンネルをご覧いただき、心より感謝申し上げます。また、いまFullさん(full@桜 八重 (@fulhause) / X)と共に毎週水曜日の夜にお届けしている「高橋クリス」ラジオ番組を運営しています。
技術は独り占めせず、届けるもの
私たちは工場の生産技術や制御に関する技術情報を、ブログや動画などで無料公開しています。「知識は誰でもアクセスできるべき」という信念のもと、現場で役立つ具体的なノウハウやトラブル事例などを発信してきました。すべて無料で続けているのは、「知らなかったせいで困る人」を少しでも減らしたいからです。
また、もしあなたの現場で…
- 「このPLCとデバイスの組み合わせ、ちゃんと動くのかな?」
- 「EtherCAT通信でうまくいかない部分を検証してほしい」
- 「新しいリモートI/Oを試したいけど社内に検証環境がない」
など、困っている構成や試してみたいアイデアがあれば、ぜひお知らせください。機器の貸出や構成の共有が可能であれば、検証し、記事や動画で発信します(ご希望に応じて匿名対応も可能です)。
支援のかたち
現在、私達の活動はほぼ無償で続けており、記事や動画の制作には、時間と検証環境の整備が必要です。この活動を継続的にコンテンツを提供するためには、皆様の温かいご支援が大変重要です。
メンバーシップ(ラジオの応援)
Fullさんとのラジオをより充実させるための支援プランです。
https://note.com/fulhause/membership/join
Amazonギフトリスト
コンテンツ制作に必要な機材・書籍をリストにしています。
https://www.amazon.co.jp/hz/wishlist/ls/H7W3RRD7C5QG?ref_=wl_share
Patreon(ブログ・動画活動への応援)
月額での小さなご支援が、記事の執筆・検証環境の充実につながります。
https://www.patreon.com/user?u=84249391
Paypal
小さな支援が大きな力になります。
https://paypal.me/soup01threes?country.x=JP&locale.x=ja_JP
知ってたら助かること、届けたいだけです
あなたの応援が、知識の共有をもっと自由で持続可能なものにしてくれます。これからもどうぞよろしくお願いします。
soup01threes*gmail.com
技術はひとりじゃもったいない。
Reference Link
http://soup01.com/ja/category/beckhoff/twincat3/tfxxx/tf6281/
http://soup01.com/ja/category/protocol/anywire/
B2G78-EP1
B2G78-EP1はEtherNet/IPとAnyWireASLINKのゲートウェイユニットです。本ユニットを使用することで、EtherNet/IPネットワークにAnyWireASLINKシステムを接続できます。

コネクタ端子台
DC24V 電源、AnyWireASLINK 伝送線(DP,DN)を接続するコネクタ端子台です。
端子配置を以下に示します。

システム構成
AnyWireASLINK は、ゲートウェイ、リモートユニット、その周辺機器で構成されます。

リモートユニットの種類
リモートユニットには次の種類があります。

接続台数
AnyWireASLINK システム 1 ラインに接続できるリモートユニットは最大 128 台です。
接続形態
AnyWireASLINK システムは T 分岐、マルチドロップ、ツリー分岐、スター分岐など、さまざまな接続が可能です。

Implementation
B2G78-EP1側
最初にはB2G78-EP1を設定します。

Web サーバーアクセス
B2G78-EP1は出荷のIP設定は192.168.0.36です。また、Login情報は以下になります。
- Username:anywire
- Password:anywire


言語
言語メニューからWeb Serverの表示言語を切り替えます。

点数
ビット点数設定のメニューからEthernet/IP経由で交換するビット数を定義できます。

IP設定
B2G78-EP1のIPアドレスを変更するには、本体設定→IPアドレス設定でIPアドレスをネットワークに合わせて設定しましょう。

次はB2G78-EP1を再起動します。

入出力データ設定
今度は入出力データ設定メニューをアクセスしEthernet/IP経由で交換するデータを設定します。

下図のようにすべてのInput Dataエリアにチェックを入れてください。チェックが入っていないエリアがあると、その分のメモリが詰められてしまい、プログラム上でアドレスがずれる可能性があります。

EDS Fileダウンロード
EDS FILEをDownloadします。

Done!

Beckhoff 側
次はBeckhoff TwinCAT3側を設定します。

EDSファイルをインストールする
今回記事で使用するのは4026なので、先程DownloadしたEDS FILEを下図のDirectoryに格納してください。

Ethernet/IP ドライバー追加
Etherent/IP Driverを追加するために、Devices→右クリック→Add New Itemします。

Ethernet/IP→Ethernet/IP Scannerをクリックします。

Done!Ethernet/IP Scannerが追加されました。

Ethernet Adapter設定
次はEthernet/IPを稼働するEtherent Driverを設定するために、Adapterをクリックします。

Ethernet/IP Scannerとして使用するEtherent インタフェースを設定します。

Done!

タスク設定
次はSync Task Tabを開き、Special Sync Taskを選択し→Create new I/O Taskします。

タスク名を設定します。

Done!Ethernet/IP用のタスクが追加されました。

ネットワーク設定
次はEthernet/IP Scannerのネットワーク設定を行い、Settings Tabを開きます。そして下図にあるIP AddressとNetwork Maskを設定しましょう。

Done!

B2G78-EP1追加
次は今回記事で使用するAnyWireASLINK システムEtherNet/IP Gateway B2G78-EP1を追加するために、Device1→右クリック→Add New Itemします。

EtherNet/IP Gateway B2G78-EP1を選択し、OKで進みます。

Done!EtherNet/IP Gateway B2G78-EP1が追加されました。

Change IP
次はそのEtherNet/IP Gateway B2G78-EP1のIPアドレスを変更するために、右クリック→Change IP addressをクリックします。

IPアドレスをEtherNet/IP Gateway B2G78-EP1の設定に合わせて設定します。

Done!

Connections設定
EtherNet/IP Gateway B2G78-EP1と接続するIO Connectionを追加するために、右クリック→Append IO Connection→Exclusive ownerをクリックします。

はいで進みます。

Done!

次はConnectionの設定画面を開きます。

InputとOutputのサイズを設定します。TwinCAT3のTF6281は最大502バイトまでしか対応していないため、EDSファイル上の設定が600バイト以上になっているとInputsとOutputsのデータ長がすべて0に変わってしまいます。そのため、赤枠の箇所をクリックして手動で設定する必要があります。

502を入力し、Applyをクリックします。

このように入力データ502Bytes、出力データ332Bytesに設定しましょう。

構造体
次はB2G78-EP1の取説に合わせて構造体を作成します。

dut_B2G78EP1_001_BitInputs
ARRAY[0..31] OF WORD は 32ワード = 512ビット分の入力を格納できます。ASLINKのリモートユニットであれば、最大512点のビット入力に対応する大きさです。
TYPE dut_B2G78EP1_001_BitInputs :
|
|---|

dut_B2G78EP1_002_Error
AnyWireASLINKのエラーフラグを格納するための構造体です。PLCの入力エリアから取得した1ワード(16bit)のエラー情報を、ビットごとに名前付きでアクセスできるように定義しています。
TYPE dut_B2G78EP1_002_Error ://2
|
|---|

こちらは各BITの意味になります。

dut_B2G78EP1_003_ErrorID
AnyWireASLINKで発生した異常のIDを格納するための構造体です。合計34バイト(17ワード)で構成されています。
TYPE dut_B2G78EP1_003_ErrorID :
|
|---|

dut_B2G78EP1_004_ConnectID
AnyWireASLINKに接続されているリモートユニットのIDを格納するための構造体です。合計258バイト(129ワード)で構成されています。
TYPE dut_B2G78EP1_004_ConnectID :
|
|---|

dut_B2G78EP1_005_DuplicateID
AnyWireASLINKでアドレスが重複しているリモートユニットのIDを格納するための構造体です。合計24バイト(12ワード)で構成されています。
TYPE dut_B2G78EP1_005_DuplicateID :
|
|---|

dut_B2G78EP1_005_DuplicateID_1
dut_B2G78EP1_005_DuplicateIDと対になる構造体で、重複アドレスが検出されたリモートユニットの個数のみを格納します。合計2バイト(1ワード)で構成されています。
TYPE dut_B2G78EP1_005_DuplicateID_1 :
|
|---|

dut_B2G78EP1_006_CommFlag
AnyWireASLINKの通信状態を示すフラグを格納するための構造体です。1ワード(16bit)をBIT型で展開しており、各ビットに意味のある名前でアクセスできます。
TYPE dut_B2G78EP1_006_CommFlag ://2
|
|---|

こちらは各BITの意味になります。


dut_B2G78EP1_007_Status
AnyWireASLINKマスタモジュールの総合ステータスを格納するための構造体です。3ワード(6バイト)で構成され、Word0のステータスフラグ16bitとWord1のエラー情報16bitをまとめて管理します。
TYPE dut_B2G78EP1_007_Status : //3
|
|---|

こちらは各BITの意味になります。


dut_B2G78EP1_008_RemoteUnitStatus
AnyWireASLINKに接続された最大64台のリモートユニットのステータスをまとめて格納するための構造体です。合計256バイト(128ワード)で構成されています。
TYPE dut_B2G78EP1_008_RemoteUnitStatus : //256
|
|---|

dut_B2G78EP1_008_RemoteUnitStatus_Sub
dut_B2G78EP1_008_RemoteUnitStatusの配列要素として使用される、1台のリモートユニット分のステータスを格納するサブ構造体です。4バイト(2ワード)で構成されています。
TYPE dut_B2G78EP1_008_RemoteUnitStatus_Sub :
|
|---|
こちらは各WORDの意味になります。


こちらは各BITの意味になります。

dut_B2G78EP1_010_BitOutputs
AnyWireASLINKのビット出力データを格納するための構造体で、64バイト(32ワード)で構成されています。
TYPE dut_B2G78EP1_010_BitOutputs :
|
|---|

dut_B2G78EP1_011_RemoteCommandsOutputs
AnyWireASLINKマスタへのコマンド出力を格納するための構造体です。8バイト(4ワード)で構成され、各種指令フラグとパラメータライト用のデータをまとめて管理します。
TYPE dut_B2G78EP1_011_RemoteCommandsOutputs :
|
|---|

dut_B2G78EP1_012_RemoteUnitCommands
AnyWireASLINKに接続された最大64台のリモートユニットへのコマンドをまとめて格納するための構造体です。
TYPE dut_B2G78EP1_012_RemoteUnitCommands :
|
|---|

こちらは各WORDの意味になります。

こちらはS/Rの意味になります。

dut_B2G78EP1_012_RemoteUnitCommands_Sub
dut_B2G78EP1_012_RemoteUnitCommandsの配列要素として使用される、1台のリモートユニット分のコマンドを格納するサブ構造体です。
TYPE dut_B2G78EP1_012_RemoteUnitCommands_Sub :
|
|---|

dut_B2G78EP1_INs
AnyWireASLINKマスタモジュールの全入力データをひとつにまとめたトップレベル構造体です。個別の入力構造体をすべてメンバとして持ち、この1つの変数を宣言するだけでASLINKの全入力データにアクセスできます。
TYPE dut_B2G78EP1_INs :
|
|---|
dut_B2G78EP1_Outs
AnyWireASLINKマスタモジュールの全出力データをひとつにまとめたトップレベル構造体です。
TYPE dut_B2G78EP1_Outs :
|
|---|
GVL
AnyWireASLINKマスタモジュールの入出力データをPLCのI/Oエリアにマッピングするためのグローバル変数定義です。
{attribute ‘qualified_only’}
|
|---|
MAIN
PLCハードウェアが自動更新する生バイト配列arrInの内容を、プログラムからアクセスしやすい入力構造体dut_B2G78EP1_INsにコピーします。コピーサイズはSIZEOF(arrIn)の502バイトを指定しています。
SIZEOF(dut_B2G78EP1_INs)(648バイト)ではなくSIZEOF(arrIn)(502バイト)を使っている点がポイントです。構造体の方が大きいため、SIZEOFに構造体を指定すると配列の範囲を超えた読み出しになってしまいます。SIZEOF(arrIn)を指定することで安全にコピーできます。
MEMCPY(destAddr:=ADR(gvlIO.dut_B2G78EP1_INs)
|
|---|
入力データマッピング
先程追加した接続の入力部分を開きます。

次は右クリック→Change Linkします。

先程定義した入力変数と割り付けます。

出力データマッピング
先程追加した接続の出力部分を開きます。

次はOutputs→右クリック→Change Linkします。

先程定義した出力変数と割り付けます。

結果
まずWiresharkでキャプチャしたパケットから、CIP I/Oデータが正常に交換されていることを確認しました。

入力データからB2G78EP1がReady状態であること確認できました。

現在接続されているAnywireデバイスが3つであることが確認できました。

また、3台目に接続されているBS-H0317-1KのIDについても、正常に認識されていることを確認しました。

次にBS-H0317-1Kの計測値を取得するため、未使用のリモートコマンドエリアに以下の値を書き込みます。
- 16#4220:ID 0x220にBit14をONする(Rフラグ、データ読み出し)
- 0:測定値の取得

これで完了です。3台目のリモートユニットステータスエリアから、BS-H0317-1Kの現在の計測値を正常に取得することができました。

ダウンロード
こちらのLinkから記事のプロジェクトをDownloadしてください。
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT-TestWithAnywireGatewayB2G78-EP1.tnzip