こちらの記事では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
技術はひとりじゃもったいない。
Reference Link
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
こちらの動画で動作確認できます。