今回の記事では、IFM製のIO-Link対応RFIDリーダ(DT1515)を用いて、Beckhoff TwinCAT環境からのUID読み取り・データ自動書き込みの制御を実装していきます。
独自に定義したFBを活用し、Read UIDモード、Auto Read/Writeモードの使い方と、Cmd制御・ステータス判定・プロセスデータ構造のポイントを丁寧に解説します。
さ、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
RFID read/write head HF DTI515
IFM社のDT1515ワークピースや製品のIDタグを確実に識別 RFID HF リード/ライトヘッド フラットデザインで、取り付けスペースが限られたアプリケーションに対応 厳しい産業環境の要件に対応する高い保護等級 RFIDアンテナアダプタとの使用に適しており、範囲を拡大可能です。
使用目的
- 読み書きヘッドは非接触で ID タグを読み書きします。
- データは IO-Link インタフェース経由でプロセスデータとして利用できます。
ID tags
IDタグはバッテリーなしで受動的に作動し、動作に必要なエネルギーは読み書きヘッドから供給される。ISO 15693に準拠したIDタグをサポートしています。
センシング・フェイス
こちらはDT1515のRFID検知エリアです。
Status bit
こちらはDT1515のProcess入出力データMappingです。
入力データ
ビット名 | 値 | 説明 |
Antenna deactivated | 0 | アンテナ有効・受信準備OK |
1 | アンテナ無効・受信不可 | |
Tag present | 0 | タグなし |
1 | タグあり(RFIDタグが検出された) | |
Cmd End | 0 | 読み書き処理がまだ開始されていないか、実行中 |
1 | 読み書き処理が完了 | |
Cmd Start Acknowledge | 0 | 読み書きの開始がまだACKされていない |
1 | デバイスが読み書きの開始を認識した(ACK受信済) |
出力データ
ビット名 | 値 | 説明 |
Cmd Antenna deactivate | 0 | アンテナ有効化(通常状態) |
1 | アンテナ無効化(RFID通信を止める) | |
Cmd Start | 0 | リセット状態(読み書き未実行) |
1 | トリガ状態(読み書きを開始する) |
動作モード
こちらは ifm RFIDデバイス(例:DT1515) のコマンドモード仕様と、それぞれの動作内容の解説です。
コマンド名 | 値 (16進) | 動作内容 | 備考 |
Read UID | 0x00 | タグのUIDを読み取る | デフォルト |
Auto-read data | 0x01 | タグ内のデータを自動読み取り | |
Auto-write data | 0x02 | タグにデータを自動書き込み | |
Read data | 0x03 | 明示的にデータを読み取る | |
Write data | 0x04 | 明示的にデータを書き込む |
動作モード 読み取り UID
「Read UID」モードは、IFM RFIDリーダがIDタグのUID(ユニークID)を読み取るための基本的な動作モードです。このモードが有効な状態では、タグがリーダの通信範囲内に入ると、自動的にそのUIDが**プロセスデータ入力(Input Process Data)**領域に転送されます。
タグが検出されていない場合、UIDが格納されるバイト(通常は arrIn[2] ~ arrIn[6] など)には 0x00 が格納され、「タグなし」の状態を示します。
一度UIDが検出されると、デバイスはそれを一定時間(データホールドタイム)維持して転送を継続します。この間に別のタグが新たに通信範囲内に入ると、新しいタグのUIDへと自動的に更新され、転送が切り替わります。
本モードは、デバイス起動時のデフォルト設定として動作しており、特別なコマンドを送信しなくてもタグのUID読み取りがすぐに可能です。
動作モード Auto read data
「Auto Read Data」モードでは、IDタグのメモリ領域のデータが自動的に読み取られ、プロセスデータ入力領域(input image)に格納されます。また、指定されたデータが入力領域に格納され、残りのバイトは 0x00 で埋められます。
動作モード Auto write data
「Auto Write Data」モードは、IDタグに自動でデータを書き込むための動作モードです。PLCなどから出力イメージ(Process Data Output Image)に書き込みデータを格納し、タグが装置の検出範囲に入った時点で、自動的に書き込みが開始されます。
また、出力イメージのバイト0〜27 に格納された最大28バイトのデータが書き込まれます。
データ長が28バイト未満の場合、残りのバイトは無視され、タグには書き込まれません。
BYTE_TO_HEXSTR
この関数は、10進数を16進文字列(ベース16)に変換します。
VAR_IN
変数名 | データ・タイプ | 説明 |
in | BYTE | 変換する10進数 |
iPrecision | INT | 最小表示桁数 |
bLoCase | BOOL | 変換に小文字と大文字のどちらを使うかを決定する。FALSE => “ABCDEF”, TRUE => “abcdef”. |
BYTE_TO_HEXSTR 2: Return value
変数名 | データ・タイプ | 説明 |
BYTE_TO_HEXSTR | T_MaxString | 変換結果 |
Implementation
Beckhoff Side
それでは実際プロジェクトを構築していきましょう。
ESIファイルのダウンロード
EtherCATスレーブ機器をTwinCATで使用するには、その機器のESIファイル(EtherCAT Slave Information)が必要になります。これはスレーブの機能定義ファイルであり、TwinCAT上で正しく認識・設定するために欠かせません。IFMのHPからAL1330のESI ファイルをダウンロードしてください。
今回記事で使用したのは4024なので、ダウンロードしたESIファイルを下記のDirectoryに格納してください。
C:\TwinCAT\3.1\Config\Io\EtherCAT\ |
新しいデバイスの追加
TwinCATプロジェクトの「I/O」ツリー上で右クリックし、コンテキストメニューから「Add New Item…」を選択することで、新しいI/Oデバイス(EtherCAT Masterなど)を手動で追加することができます。
「Add New Item…」を選択すると、「Insert Device」ウィンドウが開きます。
ここでは追加するデバイスのタイプを選択できます。今回はBeckhoffのEL6631-0010を使用するため、EtherCAT → EtherCAT Masterを選択します。この設定により、TwinCATプロジェクト内にEtherCATマスターデバイスが追加され、そこにEL6631-0010(PROFINET Device)をスレーブとして接続できるようになります。
EtherCAT Masterを追加すると、自動的にPC上のEtherCATデバイスを検索し、「Device Found At」ダイアログが表示されます。
ここでは、見つかったEtherCAT通信カードや仮想デバイスを一覧から選択し、使用するスロットを指定します。
たとえば:
- X001 (X001) や X000 (X000) はオンボードアダプタなどのデバイス
- PCI Bus/Slot 3/0、 Slot 7 (0x91620000) は、PCIeスロットに接続された通信カードなどを指します。
今回はPCI Bus/Slot 3/0, Slot 7 (0x91620000):PCIスロットに装着されたリアルなEtherCAT通信カードを指定します。
EtherCATマスターの追加と割り当てが完了すると、TwinCATプロジェクトの「I/O → Devices」配下に「Device 1 (EtherCAT)」としてマスター構成が表示されます。
オートスキャン
EtherCATマスター(Device 1)を右クリックすると、表示されるメニューの中に「Scan」があります。この「Scan」をクリックすることで、TwinCATが実際に接続されたEtherCATスレーブ機器を自動検出し、構成に追加してくれます。この機能は、複数のI/O端子や通信モジュールがEtherCATラインに接続されているときに非常に便利で、機器のE-Bus順に正確に取り込むことが可能です。
AL1330が表示されました。
AL1330がスキャンされると、その下にはModule 1〜4が表示されます。これはIO-Linkマスタの各ポートに対応しており、それぞれのポートで4バイトのIN/OUT通信領域が利用可能であることを示しています(=IOL_4/4_I/O-Bytes)。
Slot
「Slots」タブでは各IO-Linkチャネルのスロット構成が表示されます。デフォルトでは、すべてのチャネル(Ch.1〜Ch.4)が IOL_4/4_I/O-Bytes モジュール(4バイトIN / 4バイトOUT)として初期設定されています。この構成は、例えばRFIDや小型センサといったバイナリまたは小規模なデータ通信を行うデバイスに適しています。
初期状態では、AL1330の各IO-Linkチャネルは IOL_4/4_I/O-Bytes(4バイトIN・4バイトOUT)として構成されていますが、より大きなデータをやり取りしたい場合(例:今回の記事でRFIDタグを使用する場合)は、構成を手動で変更することが可能です。
この例では、IO-Link Ch.1 に「IOL_32/32_I/O-Bytes」 モジュールが設定されており、32バイトのプロセスデータ通信が可能な状態となっています。
PLC追加
I/OやPROFINETの構成がすべて完了したあとは、PLC制御プログラムの追加に進みます。PLCを右クリックし>Add New Itemします。
「Add New Item」画面では、TwinCATで使用するPLCプロジェクトテンプレートを選択します。Standard PLC Projectを選び>Addで進みます。
ITF_IFMDT1515
PROPERTY AntennaDeactivated : BOOL -GET
アンテナの状態確認
PROPERTY AntennaDeactivated : BOOL -SET
アンテナのON/OFF制御
PROPERTY AutoWriteStr : STRING-GET
書き込み用のデータを取得
PROPERTY AutoWriteStr : STRING-SET
書き込み用のデータをセット
PROPERTY Tagpresent : BOOL-GET
タグが検出されているか確認
METHOD AutoRead : STRING
自動読み取りの実行(結果を文字列で返す)
METHOD AutoWrite : BOOL
自動書き込みを実行、成功したらTRUE
METHOD ReadUID : STRING
UIDのみ読み取る(AutoReadとは別)
fbIFMDT1515
IFM社のDT1515を読み取るためのFBを定義します。
FUNCTION_BLOCK fbIFMDT1515 IMPLEMENTS ITF_IFMDT1515 VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR arrIn AT %I*:ARRAY[0..31]OF BYTE; arrOut AT %Q*:ARRAY[0..31]OF BYTE; strUID:STRING; strAutoWrite: STRING(20); strAutoRead :STRING(20); strWrite: STRING(20); strRead :STRING(20); iCounter :INT; iStatus,iCmd :BYTE; iStatus2,iCmd2 :BYTE; END_VAR |
PROPERTY AntennaDeactivated : BOOL -GET
このプロパティは、IO-Link RFIDリーダー(DTI515/DTI516)の内蔵アンテナの有効/無効状態を取得するために使用されます。
AntennaDeactivated:=arrIn[1].3; |
PROPERTY AntennaDeactivated : BOOL -SET
このプロパティは、IO-Link RFIDリーダー(DTI515/DTI516)の内蔵アンテナの有効/無効を制御するために使用されます。出力プロセスデータのByte2の**ビット3(0x08)**に対して、指定されたブール値をセットします。
arrOut[2].3:=AntennaDeactivated; |
PROPERTY AutoWriteStr : STRING-GET
このプロパティは、RFIDタグに対して自動書き込みを行う際に使用する書き込みデータ(文字列)を取得するために使用されます。
AutoWriteStr:=strAutoWrite; |
PROPERTY AutoWriteStr : STRING-SET
このプロパティは、RFIDタグに自動書き込みを行うための書き込みデータ(文字列)を設定するために使用されます。外部から受け取った文字列 AutoWriteStr を、内部変数 strAutoWrite に格納します。
strAutoWrite:=AutoWriteStr; |
PROPERTY Tagpresent : BOOL-GET
このプロパティは、RFIDリーダー(DTI515/DTI516)の読み取り範囲内にタグが存在するかどうかを確認するために使用されます。
Tagpresent:=arrIn[1].2; |
METHOD AutoRead : STRING
このメソッドは、RFIDタグに格納されたデータをIO-Link経由で自動読み出しし、文字列として返す処理を実装しています。
- xExe が TRUE のときに読み出しを実行
- arrOut[0] := 1 により、コマンド 0x01(Auto Read Data) をデバイスへ送信
- 入力プロセスデータの Byte2 以降(arrIn[2]~)を strAutoRead にコピー
- 結果を AutoRead 戻り値として返す
コピー処理には Tc2_System.MemCpy() を使用しており、
これはバイト列(RFIDタグからのデータ)を PLCの STRING 型変数にそのまま格納するための関数です。
METHOD AutoRead : STRING VAR_INPUT xExe : BOOL; END_VAR IF xExe THEN arrout[0]:=1; strAutoRead:=”; Tc2_System.MemCpy( destAddr:=ADR(strAutoRead) ,srcAddr:=ADR(arrIn[2]) ,n:=SIZEOF(strAutoRead) ); AutoRead:=strAutoRead; END_IF |
METHOD AutoWrite : BOOL
このメソッドは、PLC内に保持している文字列データ(strAutoWrite)を、RFIDタグへIO-Link経由で自動書き込みする処理を行います。
- xExe が TRUE のときに書き込み処理が実行される
- arrOut[0] := 2 により、コマンド 0x02(Auto Write Data) をデバイスに送信
- 書き込み対象の文字列(strAutoWrite)を arrOut[2] 以降へ転送(最大28バイト)
- 書き込みはタグが読み取り範囲内に入ったときに自動的に行われる
- MemCpy() により、STRING 型の中身をバイト列としてそのまま出力配列にコピーします。
METHOD AutoWrite : BOOL VAR_INPUT xExe : BOOL; END_VAR IF xExe THEN arrOut[0]:=2; Tc2_System.MemCpy( destAddr:=ADR(arrOut[2]) ,srcAddr:=ADR(strAutoWrite) ,n:=SIZEOF(strAutoWrite) ); END_IF; |
METHOD ReadUID : STRING
このメソッドは、RFIDタグの**UID(ユニーク識別番号)**を読み取り、16進文字列形式で返すための処理です。タグ固有の情報を使った識別やトレーサビリティの起点として活用できます。
- xExe = TRUE のとき、コマンド 0x00(Read UID)をデバイスに送信
- 入力データの Byte 2 ~ Byte 9 に格納されているUID(8バイト)を順に読み出す
- 各バイトを BYTE_TO_HEXSTR() で16進2桁表記に変換
- 変換した文字列を連結して strUID とし、戻り値として返す
METHOD ReadUID : STRING VAR_INPUT xExe : BOOL; END_VAR IF xExe THEN arrOut[0]:=0; strUID:=”; FOR iCounter:=2 TO 9 DO strUID:=CONCAT( STR1:=strUID ,STR2:= BYTE_TO_HEXSTR(in:=arrIn[iCounter],iPrecision:=2,bLoCase:=FALSE) ); END_FOR ReadUID:=strUID; END_IF; |
MAIN
MAIN プログラムでは、fbIFMDT1515(IO-Link RFIDアクセス用のFB) を1つインスタンス化し、3つの操作モード(UID読取 / 自動読取 / 自動書込)を排他的に選択して処理実行しています。
PROGRAM MAIN VAR fbIFMDT1515_1:fbIFMDT1515; xReadUID,xAutoRead,xAutoWrite:BOOL; strUID,strAutoRead,strAutoWrite:STRING; END_VAR strUID:= fbIFMDT1515_1.ReadUID(xExe:=xReadUID AND NOT xAutoRead AND NOT xAutoWrite); strAutoRead:= fbIFMDT1515_1.AutoRead(xExe:=xAutoRead AND NOT xReadUID AND NOT xAutoWrite); fbIFMDT1515_1.AutoWriteStr:=strAutoWrite; fbIFMDT1515_1.AutoWrite(xExe:=xAutoWrite AND NOT xAutoRead AND NOT xReadUID); |
Link
入力データをMappingします。
EtherCATスレーブデバイス(ここでは ifm AL1330)からの入力データは、TxPDO input byte 0~31に格納されてTwinCATに届きます。
- Module 1 > TxPDO を開き、input byte 0 ~ input byte 31 をすべて選択
- 右クリック → 「Change Multi Link…」 を選択
- 表示されるウィンドウで、MAIN.fbIFMDT1515_1.arrIn を指定
出力データをMappingします。
EtherCAT経由でfbIFMDT1515 から出力されるデータは、TwinCATの output byte 0 ~ 31 を通じてスレーブ側に送られます。これらの出力データを、FB内部の arrOut[0] ~ arrOut[31] にリンクさせることで、PLCプログラムからのコマンドがデバイスに正しく届くようになります。
- Module 1 > RxPDO(または TxPDO 逆方向)内の output byte 0 ~ 31 を全選択
- 右クリック → 「Change Multi Link…」 を選択
- MAIN.fbIFMDT1515_1.arrOut を指定し、
Result
このタイミングでは、ReadUID() 処理のみ実行され、UID E0040150E4 が読み取られました。
この状態ではタグ内のデータ ‘1234444’ を正常に読み取ることができました。
AutoRead() のフラグ制御が機能しており、排他的に ReadUID() や AutoWrite() が無効化されている状態での読み取り成功を確認しました。
AutoWrite() 実行により、指定された ‘abcdfff’ が正しく出力バッファ arrOut にコピーされ、IO-Link通信を通じてデバイスへ送信されました。
先ほど書き込んでた情報を読み取れました。
Download
こちらのLinkで今回の記事のプロジェクトをDownloadしてください。
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT_IFM_AL1330_DT1515.tnzip