Beckhoff# TwinCAT3でAMAX-5074 EtherCATカプラと接続してみよう

今回の記事では、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

https://x.com/3threes2

技術はひとりじゃもったいない。

Reference Link

http://soup01.com/ja/category/beckhoff/

http://soup01.com/ja/category/protocol/ethercat/

Beckhoff#Tc2_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:
STRUCT
deviceState :BYTE;
linkState :BYTE;
END_STRUCT
END_TYPE

名前

タイプ

説明

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してください。

https://www.advantech.com/en-us/support/details/firmware-?id=1-1X2NUUH

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 :
STRUCT
xBit00 :BIT;
xBit01 :BIT;
xBit02 :BIT;
xBit03 :BIT;
xBit04 :BIT;
xBit05 :BIT;
xBit06 :BIT;
xBit07 :BIT;
END_STRUCT
END_TYPE

udt16Bits

こちらは16ビット(2バイト)のデータを個別のビットとしてアクセスするためのユーザー定義データ型(UDT)です。

TYPE udt16Bits :
STRUCT
xBit00 :BIT;
xBit01 :BIT;
xBit02 :BIT;
xBit03 :BIT;
xBit04 :BIT;
xBit05 :BIT;
xBit06 :BIT;
xBit07 :BIT;
xBit08 :BIT;
xBit09 :BIT;
xBit10 :BIT;
xBit11 :BIT;
xBit12 :BIT;
xBit13 :BIT;
xBit14 :BIT;
xBit15 :BIT;
END_STRUCT
END_TYPE

GVL追加

Global Variables Listを追加します。GVLs→右クリック→Add→Global Variables Listします。

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

こちらはEtherCATスレーブデバイス(AMAX-5074等)のI/Oデータをマッピングするためのグローバル変数定義です。

{attribute ‘qualified_only’}
VAR_GLOBAL
xarrSt01Inputs AT %I* :udt16Bits;
xarrSt02Out1putsPort0 AT %Q* :udt08Bits;
xarrSt02Out1putsPort1 AT %Q* :udt08Bits;
uiArrState AT %I* :ARRAY[0..63]OF UINT;
END_VAR

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
VAR
FB_EcSetSlaveState:FB_EcSetSlaveState;
amsID :T_AmsNetID;
bExecute:BOOL;
reqState:WORD;
bBusy : BOOL;
bError : BOOL;
nErrId : UDINT;
currState : ST_EcSlaveState;
fbTON:TON;
fbTONs :ARRAY[0..1]OF TON;
controlbyte :BYTE;
fbR_TRIG :R_TRIG;
xTriggertoOP :BOOL;
xTriggertoPreOP :BOOL;
END_VAR




reqState:=0;
IF gIOs.uiArrState[1] = 8 THEN
FB_EcSetSlaveState.nSlaveAddr:=1003;
IF gIOs.xarrSt01Inputs.xBit00 THEN
reqState:=16#08;
ELSIF gIOs.xarrSt01Inputs.xBit01 THEN
reqState:=16#04;
END_IF
ELSE
;
END_IF;

IF xTriggertoPreOP THEN
reqState:=16#02;
FB_EcSetSlaveState.nSlaveAddr:=1002;
END_IF
IF xTriggertoOP THEN
reqState:=16#08;
FB_EcSetSlaveState.nSlaveAddr:=1002;
END_IF

fbTON(
IN:=reqState <>0
,PT:=T#1S
);
bExecute:=fbTON.Q;

FB_EcSetSlaveState(
sNetId:=’192.168.251.47.2.1′
,bExecute:=bExecute
,reqState:=reqState
,bBusy=>bBusy
,bError=>bError
,nErrId=>nErrId
,currState=>currState
);

IF FB_EcSetSlaveState.bBusy THEN
xTriggertoOP:=FALSE;
xTriggertoPreOP:=FALSE;
END_IF

fbTONs[0](IN:=NOT fbTONs[1].Q,PT:=T#0.1S);
fbTONs[1](IN:=fbTONs[0].Q,PT:=T#0.1S);

MEMCPY(
destAddr:=ADR(gIOs.xarrSt02Out1putsPort0)
,srcAddr:=ADR(controlbyte)
,n:=SIZEOF(BYTE)
);

IF controlbyte = 0 THEN
controlbyte:=1;
END_IF;

fbR_TRIG(CLK:=fbTONs[0].Q);
IF fbR_TRIG.Q THEN
controlbyte:= SHL(controlbyte,1);
END_IF

IF controlbyte.7 THEN
controlbyte:=1;
END_IF

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していきましょう。

結果

下記の動画から動作確認できます。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする