今回の記事では、Beckhoff社のTwinCAT3を使用してAdvantech社製EtherCATカプラ「AMAX-5074」と接続し、基本的なI/O制御からスレーブ状態の動的制御まで、ゼロから構築していきます。
EtherCATシステムを運用する上で、スレーブデバイスの状態遷移を理解することは非常に重要です。本記事ではFB_EcSetSlaveStateファンクションブロックを活用し、OP / Pre-OP / Safe-OP各状態の違いと使い分けについても解説します。
さ、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/
http://soup01.com/ja/category/protocol/ethercat/
FB_EcSetSlaveState
このファンクションブロックを使用すると、スレーブを指定されたEtherCATステートに設定できます。要求されたEtherCATステートは、reqState変数で転送されます。このファンクションブロックはステート変更コマンドを送信し、ファンクションブロックFB_EcRegSlaveStateとは異なり、EtherCATスレーブが新しいステートに到達するか、最大時間tTimeoutを超過するまでアクティブ状態を維持します。現在のステータスはcurrState変数に出力されます。

VAR_INPUT
名前 | タイプ | 説明 |
|---|---|---|
sNetId | T_AmsNetId | EtherCATマスタデバイスのAMSネットワークIDを含む文字列 |
nSlaveAddr | UINT | EtherCATスレーブのFilterCATステートを設定する固定アドレス |
bExecute | BOOL | このファンクションブロックは、この入力の立ち上がりエッジによって有効化されます |
tTimeout | TIME | ファンクションブロックの実行に許容される最大時間 |
reqState | WORD | スレーブを設定するEtherCATステート |
VAR_OUTPUT
名前 | タイプ | 説明 |
|---|---|---|
bBusy | BOOL | この出力は、ファンクションブロックがアクティブ化されているときに設定され、フィードバックを受信するまで設定されたままになります |
bError | BOOL | この出力は、コマンドの送信でエラーが発生した場合、またはエラーがコマンドの送信でリセットされた場合に設定されます |
nErrid | UDINT | bError出力が設定されている場合、最後に実行されたコマンドに関連するADSエラーコードを提供します |
currState | ST_EcSlave<br>State | スレーブの現在のEtherCATステート |
ST_EcSlaveState
こちらはEtherCAT Slaveの状態を示す構造体です。
TYPE ST_EcSlaveState:
|
|---|
名前 | タイプ | 説明 |
|---|---|---|
deviceState | BYTE | スレーブのEtherCATステート |
linkState | BYTE | EtherCATスレーブのリンクステート |
EtherCATステータスは以下のいずれかの値を取ることができます:
定数 | 値 | 説明 |
|---|---|---|
EC_DEVICE_STATE_INIT | 0x01 | Initステート |
EC_DEVICE_STATE_PREOP | 0x02 | Pre-operationalステート |
EC_DEVICE_STATE_BOOTSTRAP | 0x03 | Bootstrapステート |
EC_DEVICE_STATE_SAFEOP | 0x04 | Safe-operationalステート |
EC_DEVICE_STATE_OP | 0x08 | Operationalステート |
さらに、以下のビットを設定できます:
定数 | 値 | 説明 |
|---|---|---|
EC_DEVICE_STATE_ERROR | 0x10 | EtherCATスレーブのステートマシンエラー |
EC_DEVICE_STATE_INVALID_VPRS | 0x20 | 無効なベンダーID、製品コード、リビジョン番号またはシリアル番号 |
EC_DEVICE_STATE_INITCMD_ERROR | 0x40 | 初期化コマンド送信中のエラー |
EC_DEVICE_STATE_DISABLED | 0x80 | スレーブは無効化されています |
AMAX-5074 EtherCATカプラ
このモジュールは、IDスイッチスライスI/OモジュールのEtherCATカプラで、EtherCAT IOモジュールを100BASETX EtherCATネットワークに結合する機能を提供します。イーサネット/EtherCATケーブル(最小Cat. 5)のシールド付きケーブルを使用し、ステーション間の最大距離は100m(100BASETX)です。2つの16ビットIDスイッチにより、256個の設定可能なIDを提供します。バスインターフェースは2つのRJ45(入力1つ、出力1つ)を備えています。

モジュール側面
こちらはAMAX-5074 EtherCATカプラの側面です。

モジュール配線例
こちらはAMAX-5074 EtherCATカプラの配線例です。

モジュールLED意味合い
こちらはAMAX-5074 EtherCATカプラのLEDの意味合いです。

LED | 色 | 表示 | 動作 |
|---|---|---|---|
PWR | 緑 | ON | 電源オン |
オレンジ | ON | モジュール位置特定中 | |
Run | 緑 | ON | EtherCAT接続済み |
点滅 | EtherCAT接続中 | ||
BUS | 緑 | ON | BUS電源オン |
OC | 赤 | ON | BUS過電流(2A) |
OV1 | 赤 | ON | V1過電圧(28.8V) |
OV2 | 赤 | ON | V2過電圧(28.8V) |
UV1 | 赤 | ON | V1低電圧(19.2V) |
UV2 | 赤 | ON | V2低電圧(19.2V) |
ID Switch
こちらのIDスイッチでAMAX-5074 EtherCATカプラのIDを設定できます。

スイッチ番号 | 倍数 | 範囲(HEX) |
|---|---|---|
SW2 | X16 | 0~F |
SW1 | X1 | 0~F |
例 | (SW2, SW1) = (4, C)の場合、ID = 4×16 + 12×1 = 76 |
AMAX-5052 16-ch デジタル入力モジュール
AMAX-5052は、16チャンネルのデジタル入力(シンク/ソース)チャンネルを備えています。デジタル入力チャンネルには、デジタルステータスを示すLEDが搭載されています。このモジュールは、データバスとI/Oチャンネル間に2,000 VDCの光絶縁を提供しますが、チャンネル間の絶縁は提供しません。高電圧または高電流によってチャンネルが損傷した場合でも、すでに絶縁されているため、システム全体(他のモジュールおよび制御ユニットを含む)は影響を受けません。ただし、I/O電源がシステムと同じ電源を使用している場合、絶縁機能は動作しません。

モジュール側面
こちらはAMAX-5052 16-ch デジタル入力モジュールの側面です。

モジュール配線例
こちらはAMAX-5052 16-ch デジタル入力モジュールの配線例です。

モジュールLED意味合い
こちらはAMAX-5052 16-ch デジタル入力モジュールのLEDの意味合いです。

LED | 色 | 表示 | 動作 |
|---|---|---|---|
PWR | 緑 | ON | 電源オン |
Run | 緑 | ON | EtherCAT接続済み |
点滅 | EtherCAT接続中 | ||
DI0~7 | 緑 | ON | ドライ/ウェットロジック “1” |
OFF | ドライ/ウェットロジック “0” | ||
DI8~15 | 黄 | ON | ドライ/ウェットロジック “1” |
OFF | ドライ/ウェットロジック “0” |
AMAX-5057SO 16-ch ソース型デジタル出力
AMAX-5057SOモジュールは、16チャンネルのデジタル出力(ソース)チャンネルを備えています。デジタル出力チャンネルには、デジタルステータスを示すLEDが搭載されています。このモジュールは、データバスとI/Oチャンネル間に2,000 VDCの光絶縁を提供しますが、チャンネル間の絶縁は提供しません。高電圧または高電流によってチャンネルが損傷した場合でも、すでに絶縁されているため、システム全体(他のモジュールおよび制御ユニットを含む)は影響を受けません。ただし、I/O電源がシステムと同じ電源を使用している場合、絶縁機能は動作しません。

モジュール側面
こちらはAMAX-5057SO 16-ch ソース型デジタル出力モジュールの側面です。

モジュール配線例
こちらはAMAX-5057SO 16-ch ソース型デジタル出力モジュールの配線例です。

モジュールLED意味合い
こちらはAMAX-5052 16-ch デジタル入力モジュールのLEDの意味合いです。


Implementation
ここからネットワーク構築からプログラム作成まで詳しく説明します。
AMAX 側
最初にAdvantech側から始めます。

ESIファイルをダウンロード
下記のLinkAMAXシリーズのESI FILEをDownloadしてください。

ID設定
実際のアプリケーションに合わせてIDを設定しましょう。

Beckhoff 側
次はBeckhoff側です。

ESI Fileをインストールする
先程DownloadしたESI Fileを下記のPathに格納します。
C:\Program Files (x86)\Beckhoff\TwinCAT\3.1\Config\Io\EtherCAT

EtherCAT マスター追加
TwinCATプロジェクトの「I/O」ツリー上で右クリックし、コンテキストメニューから「Add New Item…」を選択することで、新しいI/Oデバイス(EtherCAT Masterなど)を手動で追加することができます。

「Add New Item…」を選択すると、「Insert Device」ウィンドウが開きます。ここでは追加するデバイスのタイプを選択できます。今回はBeckhoffのEtherCATマスターを使用するため、EtherCAT → EtherCAT Masterを選択します。

EtherCAT Masterを追加すると、自動的にPC上のEtherCATデバイスを検索し、「Device Found At」ダイアログが表示されます。
ここでは、見つかったEtherCAT通信カードや仮想デバイスを一覧から選択し、使用するスロットを指定します。

ドライバの設定
この画面はTwinCATのEtherCATマスター設定におけるAdapter(アダプター)タブで、EtherCAT通信に使用するネットワークアダプターを選択・設定します。
赤枠で囲まれた 「Search…」ボタン をクリックして、システム上の利用可能なEtherCAT対応ネットワークアダプターを検索・選択します。

「Search…」ボタンをクリック後に表示される、システム上で検出されたネットワークアダプターの一覧画面です。その中に適切なネットワークアダプターを選択します。

この設定により、TwinCATはこのネットワークアダプターを通じてEtherCATスレーブデバイスと通信できるようになります。

スキャン
EtherCATマスター(Device 1)を右クリックすると、表示されるメニューの中に「Scan」があります。この「Scan」をクリックすることで、TwinCATが実際に接続されたEtherCATスレーブ機器を自動検出し、構成に追加してくれます。この機能は、複数のI/O端子や通信モジュールがEtherCATラインに接続されているときに非常に便利で、機器のE-Bus順に正確に取り込むことが可能です。

Auto Scanが正常に完了し、EtherCATスレーブ(AMAX-5074)が認識されています。

PLCプロジェクト追加
次はPLC→右クリック→Add New ItemでPLCプロジェクトを追加します。

Standard PLC Projectを選び→Addで進みます。

Done!

DUT
今度は構造体を定義するため、DUTs→右クリック→Add→DUTします。

udt08Bits
こちらは8ビット(1バイト)のデータを個別のビットとしてアクセスするためのユーザー定義データ型(UDT)です。
TYPE udt08Bits :
|
|---|
udt16Bits
こちらは16ビット(2バイト)のデータを個別のビットとしてアクセスするためのユーザー定義データ型(UDT)です。
TYPE udt16Bits :
|
|---|
GVL追加
Global Variables Listを追加します。GVLs→右クリック→Add→Global Variables Listします。

Global Variables List名を入力し、Openします。

こちらはEtherCATスレーブデバイス(AMAX-5074等)のI/Oデータをマッピングするためのグローバル変数定義です。
{attribute ‘qualified_only’}
|
|---|
EtherCATライブラリを追加
Tc2_EtherCATライブラリを使用したいのでReferences→右クリック→Add libraryします。

Tc2_EtherCATを検索し、OKで追加します。

プログラム
次はプログラムを作成します。このプログラムは、TwinCAT EtherCATマスターを使用してスレーブデバイスの状態を動的に制御し、同時にLEDシフト表示を実行するものです。
EtherCATスレーブ状態制御
FB_EcSetSlaveStateファンクションブロックを使用して、EtherCATスレーブの状態遷移を制御します。
- 対象スレーブアドレス: 1002または1003
- AMS NetID: 192.168.251.47.2.1
LEDシフト出力(ナイトライダー)
2つのTONタイマー(各100ms)を交互動作させてクロックを生成します。
- controlbyteを左シフトし、ビット7到達で1にリセット
- 結果をgIOs.xarrSt02Out1putsPort0へMEMCPYで転送
コード
こちらはプログラム本体です。
PROGRAM MAIN
|
|---|
EtherCAT SlaveのState変更するときのパラメータnSlaveAddrは各SlaveのNetIdになります。

Devies→EtherCAT→NetIdから確認できます。今回の例では1002がINPUTモジュールです。

そしてOutputモジュールは1003になります。

EcSetSlaveStateのFBで設定するsNetIdはEtherCATマスターのNetIdになります。

Devies→EtherCAT→NetIdから確認できます。

ビルド
Build→Build Solutionでプロジェクトをコンパイルしましょう。

マッピング
次はプログラムで定義した変数とEtherCATネットワークのProcess IOをMappingさせます。
INPUT
最初はAMAX-5052入力モジュールとプログラム内の変数をMappingします。

すべてのProcess IOを選択し→Change Linkします。

次は適切なプログラム変数を1つずつ割り付けましょう。

Done!

OUTPUT
次はAMAX-5057SOのMapping作業を行います。

TwinCATでは先程1つずつMappingする方法がありますが、下図のようにChange Mulit Linkの一括Mappingも可能です。

データサイズさえ合えばMapping可能です。

State
TwinCAT3ではEtherCATマスターや各SlaveにもStateという変数がInfoDataの中にあり、そのデバイスの状態を取得可能です。

ダウンロード
最後はプロジェクトをTwinCAT3 RuntimeにDownloadしていきましょう。
結果
下記の動画から動作確認できます。