Beckhoff#TwinCAT3でOMRONサーボを動かしてみよう

こちらの記事ではBeckhoff TwinCAT環境OMRON R88Dシリーズ サーボを動かす方法を説明します。EtherCAT接続から、AxisRefのPLCリンク設定、MC_PowerによるサーボON/OFFの制御、HMI画面連携まで、初めての人でも迷わず進めると思います。

さ、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

OMRON# R88D-1SN_Part01_サーボシステムを立ち上げよう
Pixsys#Web Panel WP615 Part01_立ち上げ編
こちらは新しい記事シリーズでイタリアのPixsys社のWEBパネルを使用し様々な検証を行います。最初にOPEN-BOXしたあとの初期設定な...

Implementation

OMRON Side

最初にオムロンのR88シリーズServo側から設定します。

wiring

こちらはオムロンのR88D-1SNシリーズの配線例になります。

USB connection to the servo

USBケーブルを使ってPCとオムロンのR88D-1SNを接続します。

Sysmac Studioを起動し、Online>Connect to Deviceをクリックします。

Connec to deviceの設定画面が表示され、Drop-listから”Drive”を設定します。

次はDirect connect via USBを選択し、ConnectでServo Driveと接続しましょう。

Done!

Sysmac Studioが自動的に設定と試運転画面に切り替わります。

Initialize

OMRONのサーボを初期化するため、サーボを右クリック>Initializeでデバイスをリセットしましょう。

こちらはサーボの初期化設定画面になります。

  • Area to restoreはParameters and Safetyを設定し、すべてのパラメータをリセットします。
  • Drive restartをYesにするとサーボを自動的に再起動します。

TwinCAT Side

次はTwinCAT側です。

Install ESI FILE

下記のLinkから今回記事で使用したオムロンのR88シリーズServoのESI FILEをDownloadしてください。

https://industrial.omron.eu/en/products/R88D-1SN04H-ECT#ddf

Update ESI

次はTwinCATにESI Fileを更新します。

C:\TwinCAT\3.1\Config\Io\EtherCAT のDirectoryにアクセスします。

そのDirectoryに先程DownloadしたESI Fileに貼り付けます。

TwinCATがもうすでに起動してる場合、TwinCAT>EtherCAT Devices>Reload Device DescriptionsでDevice description Fileを更新します。

EtherCAT Configuration

Add EtherCAT Master

I/Oツリー内の「Devices」を右クリックし、「Add New Item…」を選択して新しいデバイスを追加する準備をしている。この操作により、EtherCATやProfinetなど任意の通信プロトコルデバイスをTwinCATプロジェクトに追加できる。

「Insert Device」ダイアログが開き、使用するデバイスの通信プロトコルを選択できるようになっている。今回は「EtherCAT Master」が選ばれている。右側では対象のデバイス種別(PC/CX/BXなど)を選ぶこともできる。

TwinCATが使用するネットワークアダプタを指定する画面が表示されており、複数のNIC(ネットワークインターフェースカード)が一覧になっている。「TwinCAT3 RT(Real-Time)」Driverをインストールしたアダプターを選ぶことで、リアルタイム制御が可能な構成が確立される。

Scan Network

「Device 1(EtherCAT)」を右クリックし、「Scan」を選択することで、接続されているすべてのEtherCATスレーブデバイスを自動検出する処理が実行される。これにより、物理的に接続されている各ターミナルの構成が自動的にTwinCATに取り込まれる。

今回使用するOMRON R88シリーズはCiA402に対応するタイプなので、TwinCATが自動的にNCに軸を追加しますか?って決めます。OKで進みましょう。

Done!これだけで3軸のOMRON R88 Servoが追加されました。

NC Configuration

TwinCATプロジェクトの「MOTION」構成にすでに3軸分のOMRON R88シリーズSERVOが追加されています。

Link To IO

軸の設定画面で「Settings」タブを開き、「Link to I/O…」ボタンをクリックします。ここで、EtherCAT経由で接続されたOMRONサーボのI/O信号と軸をリンクします。

(例:CANopen DS402 プロファイルを使っている場合は、正しいPDOを選択していきましょう)

「Link to I/O」ボタンを押すと、使用可能なデバイス一覧が表示されます。ここでは、CANopen DS402、 EtherCAT CoEタイプのOMRONサーボ(R88D-1SN01L-ECT)が検出されています。使いたい軸(例:Axis1)を選択し、「OK」をクリックして割り当てます。

Enc

各軸の中にある「Enc」をクリックすると、OMRONサーボエンコーダとの位置情報のやり取りに関する設定画面が開きます。

「Enc」設定内で、エンコーダの単位変換(スケーリング)を行います。

  • Scaling Factor Numerator(分子):10.0
  • Scaling Factor Denominator(分母):8388608.0

つまり10mmは8388608.0 Countであり、その8388608.0はオムロンのR88シリーズのServo モーター側にあるエンコーダー仕様になります。

パラメータ「Reference System」を ‘ABSOLUTE’(絶対値エンコーダ) に設定します。この設定により、TwinCATはOMRONサーボの絶対位置エンコーダから直接現在位置を取得します。

Axis3だけは減速機がついていますので、こちらのEnc設定を変更します。

今回の記事では5倍の減速機がついています。なので、先程の8388608.0を5倍かけてここに設定しましょう。

Program

Add Library

TwinCATでサーボを動かすには、Motion Control関係のライブラリを使います。ここでは MC_Power などのブロックを使うために、Tc2_MC2 ライブラリを選択して「OK」をクリックしています。

DUT‐dutAxisData

次は1つの軸に関する状態・命令・パラメータをまとめて扱えるように、構造体を定義します。

TYPE dutAxisData :
STRUCT
stAxisStatus:ST_AxisStatus;
xServoON :BOOL;
xReset :BOOL;
xJogFW,xJogBw :BOOL;
rPosition :REAL;
rRelDistance,rAbsPosition:REAL;
rRelexe,rAbsExe:BOOL;
rVelocity :REAL;
xError :BOOL;
xBusy :BOOL;
strAxisName :STRING(30);
xServoEnabled :BOOL;
END_STRUCT
END_TYPE

Interface‐ITF_Axis

INTERFACE を使うと、構造体やクラスに共通の操作インターフェースを持たせることができます。

Property

PROPERTY を使えば、読み取り専用/書き込み専用などの制御ができる変数を定義できます。

PROPERTY AxisStatus : ST_AxisStatus‐Get

軸の状態(標準構造体)

PROPERTY Busy : BOOL‐Get

軸がビジー状態かどうか

PROPERTY Error : BOOL‐Get

エラー状態

PROPERTY Position : Lreal‐Get

現在位置

PROPERTY rAbsPosition : REAL‐GET

絶対位置決めの位置(読み)

PROPERTY rAbsPosition : REAL‐SET

絶対位置決めの位置(更新)

PROPERTY rRelDistance : REAL‐GET

相対位置決めの位置(読み)

PROPERTY rRelDistance : REAL‐SET

相対位置決めの位置(更新)

PROPERTY ServoEnabled : BOOL‐GET

実際のサーボON状態(ステータス)

PROPERTY Velocity : LREAL‐GET

移動速度(現在値)

PROPERTY Velocity : LREAL‐SET

移動速度(命令)

Method

METHOD を使うことで、軸の動作処理を1つの関数として独立させられ、たとえば moveAbs() に移動処理をまとめておけば、どのプログラムからでも「このメソッドを呼ぶだけ」で動作できます。

METHOD Jog 

ジョグ動作(正転/逆転)

METHOD Jog : BOOL
VAR_INPUT
xJogFw,xJogBw:BOOL;
END_VAR
METHOD moveAbs

絶対位置コマンド発行

METHOD moveAbs : BOOL
VAR_INPUT
xExe:BOOL;
END_VAR
METHOD moveRel

相対距離で移動

METHOD moveRel : BOOL
VAR_INPUT
xExe:BOOL;
END_VAR
METHOD Reset

エラーリセット命令

METHOD Reset : BOOL
VAR_INPUT
xExe:BOOL;
END_VAR
METHOD ServoON

サーボON命令

METHOD ServoON : BOOL
VAR_INPUT
xExe:BOOL;
END_VAR

Function Block‐fbAxis

さっき定義した ITF_Axis と構造体に対応したFB(ファンクションブロック)を作成します。

FUNCTION_BLOCK fbAxis IMPLEMENTS ITF_Axis
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR_IN_OUT
ioAxis :AXIS_REF;
END_VAR

VAR
_MC_Power :MC_Power;
_MC_Reset :MC_Reset;
_MC_ReadActualPosition :MC_ReadActualPosition;
_MC_ReadActualVelocity :MC_ReadActualVelocity;
_MC_MoveRelative:MC_MoveRelative;
_MC_MoveAbsolute:MC_MoveAbsolute;
_rPosition,_rVelocity :REAL;
_rRelDistance,_rAbsPosition:REAL;
_MC_Jog:MC_Jog;
_MC_ReadStatus:MC_ReadStatus;
END_VAR
Property

Propertyのプログラムを実装します。

PROPERTY AxisStatus : ST_AxisStatus‐Get

MC_ReadStatus 関数ブロックを使って軸の状態を読み取ります。

_MC_ReadStatus(Axis:=ioAxis,Enable:=TRUE,Status=>AxisStatus);
PROPERTY Busy : BOOL‐Get

どれか1つでも軸制御が進行中なら Busy = TRUE を返します。

PROPERTY Error : BOOL‐Get

どれか1つでも軸制御がエラー発生なら Error = TRUE を返します。

PROPERTY Position : Lreal‐Get

MC_ReadActualPosition FBを使って、TwinCATが持つモーション軸(AXIS_REF)から現在の実際位置を読み取って、Position プロパティとして外部に返します。

_MC_ReadActualPosition(
Axis:=ioAxis
,Enable:=TRUE
,Position=>Position
);
PROPERTY rAbsPosition : REAL‐GET

このプロパティでは、内部変数 _rAbsPosition に保存された値をそのまま返しています。

rAbsPosition:=_rAbsPosition;

PROPERTY rAbsPosition : REAL‐SET

このプロパティは、ユーザーやPLCプログラム側から「移動したい絶対位置」を設定するために使われます。

_rAbsPosition:=rAbsPosition;
PROPERTY rRelDistance : REAL‐GET

このプロパティは、ユーザーが設定した相対移動の距離(量)を参照できるようにするためのものです。

rRelDistance:=_rRelDistance;

PROPERTY rRelDistance : REAL‐SET

このプロパティは、ユーザーやPLCプログラム側から「移動したい相対位置」を設定するために使われます。

_rRelDistance:=rRelDistance;
PROPERTY ServoEnabled : BOOL‐GET

このプロパティでは、MC_Powerブロックの状態を使ってサーボが現在有効(ON)状態で、かつエラーがないかを判定し、その結果を ServoEnabled として返します。

ServoEnabled:=_MC_Power.Status AND NOT _MC_Power.Error;
PROPERTY Velocity : LREAL‐GET
_MC_ReadActualVelocity(
Axis:=ioAxis
,Enable:=TRUE
,ActualVelocity=>Velocity
);
PROPERTY Velocity : LREAL‐SET

このプロパティでは、TwinCAT標準の MC_ReadActualVelocity を使って、モーション軸の現在速度を取得します。

_rVelocity:=Velocity;
Method

Methodのプログラムを実装します。

METHOD Jog 

このメソッドでは、TwinCATの標準FB MC_Jog を使って軸を正転または逆転方向に手動で動かすジョグ動作を実装しています。

  • JogForward-xJogFw がTRUEかつ逆転でないとき
  • JogBackwards -xJogBw がTRUEかつ正転でないとき
  • Mode-連続動作モード(押してる間だけ動く)
  • Velocity-2.0 mm/s(ジョグ速度)
  • Acceleration-1.0 mm/s²(加速)
  • Deceleration-1.0 mm/s²(減速)
METHOD Jog : BOOL
VAR_INPUT
xJogFw,xJogBw:BOOL;
END_VAR

_MC_Jog(
Axis:=ioAxis
,JogForward:=xJogFw AND NOT xJogBw
,JogBackwards:=xJogBw AND NOT xJogFw
,Mode:=E_JogMode.MC_JOGMODE_CONTINOUS
,Velocity:=2.0
,Acceleration:=1.0
,Deceleration:=1.0
);
METHOD moveRel

このメソッドは、TwinCATの MC_MoveRelative を使用して、

あらかじめ設定された _rRelDistance だけ、現在位置から相対的に移動させる処理です。

  • Execute-移動実行トリガー(xExe)
  • Distance-移動距離(_rRelDistanceから取得)
  • Velocity-移動速度
  • Acceleration-加速(速度×0.7)
  • Deceleration-減速(速度×0.7)
METHOD moveRel : BOOL
VAR_INPUT
xExe:BOOL;
END_VAR



_MC_MoveRelative(
Axis:=ioAxis
,Execute:=xExe
,Distance:=_rRelDistance
,Velocity:=_rVelocity
,Acceleration:=_rVelocity*0.7
,Deceleration:=_rVelocity*0.7
);
METHOD Reset

こちらはサーボ軸に発生したエラーをリセットするためのプログラムです。

METHOD Reset : BOOL
VAR_INPUT
xExe:BOOL;
END_VAR

_MC_Reset(
Axis:=ioAxis
,Execute:=xExe
);
METHOD ServoON

こちらはサーボON(パワーON)を制御するプログラムです。

METHOD ServoON : BOOL
VAR_INPUT
xExe:BOOL;
END_VAR
METHOD moveAbs

このメソッドは、TwinCATの MC_MoveAbsolute を使用して、

事前に設定された絶対位置 _rAbsPosition に軸を移動させる処理を実装しています。

  • Execute-実行トリガー(1サイクルTRUEで移動開始)
  • Position-移動先の絶対位置(_rAbsPosition)
  • Velocity-移動速度(_rVelocity)
  • Acceleration-加速(速度×0.7)
  • Deceleration-減速(速度×0.7)
METHOD moveAbs : BOOL
VAR_INPUT
xExe:BOOL;
END_VAR


_MC_MoveAbsolute(
Axis:=ioAxis
,Execute:=xExe
,Position:=_rAbsPosition
,Velocity:=_rVelocity
,Acceleration:=_rVelocity*0.7
,Deceleration:=_rVelocity*0.7
);

Function Block‐fbAxisBaseType

このFBは、fbAxis を内部で使いながら、TwinCATの軸情報と自作の構造体 dutAxisData を橋渡しする役割を持っています。

FUNCTION_BLOCK fbAxisBaseType
VAR_INPUT

END_VAR
VAR_OUTPUT
END_VAR
VAR
_fbAxis :fbAxis;
END_VAR
VAR_IN_OUT
ioAxis:AXIS_REF;
ioAxisData:dutAxisData;
END_VAR

下図は、fbAxisBaseType の中で、内部FB _fbAxis と構造体 ioAxisData を連携させるCFC処理の一例です。構成は3段階に分かれています。

  • 命令部-ServoON, Reset, Jog, moveAbs, moveRel などの命令を _fbAxis に伝える
  • 状態取得部-_fbAxis の各種プロパティ値(Position、Velocity、Errorなど)を ioAxisData に書き戻す
  • MOVEブロック-プロパティ値を ioAxisData に転送するための命令

Parameter List

全体からアクセスできる共通の変数を定義したい場合は、Global Variable List(GVL) を使います。「Add」→「Global Variable List…」を選択し、任意の名前(例:gvlSystem, gvlAxisCommon など)を入力して作成しましょう。

iAxisNumberという変数を定義し、プロジェクト内の軸数を決めます。

{attribute ‘qualified_only’}
VAR_GLOBAL CONSTANT
iAxisNumber:INT:=3;
END_VAR

GVL

複数の軸をTwinCAT上で管理する場合、GVL(Global Variable List) に以下のような配列を用意することで、構造的にスマートな制御設計が実現できます。

{attribute ‘qualified_only’}
VAR_GLOBAL
Axis: ARRAY[1..GlobalParameters.iAxisNumber]OF AXIS_REF;
AxisData:ARRAY[1..GlobalParameters.iAxisNumber]OF dutAxisData;
END_VAR

MAIN

この構成では、MAINプログラム内でfbAxisBaseType のインスタンスを配列化し、

各軸に対応した AXIS_REF / dutAxisData を紐づけて制御しています。それにより、

  • 軸数が増えても コピー&ペースト or ループで拡張可能
  • 各軸の状態が GVL.AxisData[] に集約されていて、HMI連携もラクラク
  • FBの処理を fbAxis[] に任せる構造なので、保守性・再利用性が高い
PROGRAM MAIN
VAR
fbAxis :ARRAY[1..GlobalParameters.iAxisNumber]OF fbAxisBaseType;

END_VAR

GVL.AxisData[1].strAxisName:=’Axis1′;
fbAxis[1](
ioAxis:=GVL.Axis[1]
,ioAxisData:=GVL.AxisData[1]
);

GVL.AxisData[2].strAxisName:=’Axis2′;
fbAxis[2](
ioAxis:=GVL.Axis[2]
,ioAxisData:=GVL.AxisData[2]
);

GVL.AxisData[3].strAxisName:=’Axis3′;
fbAxis[3](
ioAxis:=GVL.Axis[3]
,ioAxisData:=GVL.AxisData[3]
);

Screen

最後は操作画面を作成します。

Add Web Visualization

今回の記事ではWEB パネルからTwinCAT Runtimeの画面を操作するので、WebVisulizationを追加してください。

Template

軸の状態・命令・フィードバックをシンプルかつ機能的に可視化します。Template作成するより、画面の流用も可能です。そのために画面のVAR_IN_OUT欄で先程定義したdutAxisDataを宣言します。

例えばLABELに軸名を表示したい場合、Text Variable欄で先程定義したIOパラメータを指定すればOKです。

Operation

Tab部品を使用し、複数のSub画面を1つのメイン画面に表示します。

Tools boxからTab Controlを追加できます。

次はTab Controlを右クリック>Frame Selectionします。

Frame Configuration画面で必要なSCREENを追加しましょう。

最後はIOパラメータにプログラムで定義したAxisData配列と紐つけます。

Link to PLC

TwinCATでは、Motion軸をPLCプログラムから操作するために、AXIS_REF 型の変数とNC軸を接続(Link To PLC)する必要があります。

下図の例では GVL.AxisRef[1] に対して軸 Axis1 をバインドしました。これにより、PLCプログラム側から標準FB(例:MC_PowerやMC_MoveAbsolute)を使って、軸を制御する準備が整いました。

Active Configuration

Active Configurationをクリックし、一回プロジェクトをRuntimeにDownloadします。

OKで進みます。

OKでTwinCAT RuntimeをRun Modeにソフトします。

Login

LoginでプログラムをDownloadします。

Yesで進みましょう。

Start

最後はStartボタンでRuntimeのプログラムを実行します。

WP615 Webパネル側

最後はPixsysのWP615 Webパネルの設定を行います。

WP Setting>URLをBeckhoff TF1800のURLに設定してください。

Result

こちらの動画で動作確認できます。

シェアする

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

フォローする