本記事では、Inovance Easy PLCで標準のMotion FB群(MC_Power、MC_MoveAbsolute、MC_ReadStatusなど)を1つの自作FBにまとめることで、プログラム全体を簡潔かつ見通しよく整理する方法を紹介します。
fbAxisという自作FBを使い、3軸制御の構造をスマートに設計。EtherCATの状態監視からサーボON、移動指令、Busy/Done/位置モニタまでを1つのFBにまとめて扱うことで、MAINプログラムもスッキリとした構成に。
複雑になりがちな多軸制御こそ、自作FBでシンプルに。
さ、FAを楽しもう!

Reference Link
http://soup01.com/ja/category/inovance/
Implementation
STプログラムをラダーに挿入
最初にラダープログラムにST実行ブロックを追加します。ラダープログラムにSTブロックを追加したい場合に右クリック>Insert ST Programします。
STブロックが追加されました!
構造の追加
AutoShopでは一般のPLCと同じく構造体の作成が可能です。構造体の作成により、プログラムの可読性アップになるだけではなく、再利用も簡単になります。
Global Variable>右クリック>Structure>New Data Structureします。
今回の記事ではudtAxis・udtAxisIN・udtAxisOUT3つの構造体を作成します。
udtAxisOUT
こちらはサーボ軸から必要なデータを洗い出し、構造体としてまとめます。
udtAxisIN
こちらはサーボ軸を制御するには必要なコマンドを洗い出し、構造体としてまとめます。
配列を定義したい場合はData Type欄にあるDrop-listをクリックしてください。
udtAxis
構造体udtAxisは先程定義したudtINとudtOUTをまとめます。
変数定義
Variableテーブルで先ほど作成した構造体を軸数分に定義します。
新しいFBを追加
AutoShopではFunction Blockの使用も可能です。Programming>Function Block(FB)を右クリック>Newで新しいFBを追加できます。
FBの新規追加画面が表示され、FB名を入力しFBを追加しましょう。
新しいFBが追加されました。
次はFBを開き、プログラムを作成しましょう。
Interface
FBにIN・OUT・INOUT変数を定義します。
Net2
Function Block fbAxis の内部ラダーでは、入力された軸番号 iAxisNumber を内部変数 viAxisNumber にコピーしています。
Net3
このラダーでは、EtherCATの通信状態を監視し、内部フラグ vEtherCATOK を更新しています。
Net4
こちらは複数の条件を満たしたときに vAxisEnabled をONにしています。
- EtherCAT通信がOK(vEtherCATOK)
- 軸の出力データが有効(ioutAxis.udtOut.xValid)
- 軸が無効化されていない(xDisabled がFALSE)
- エラーストップ状態でない(xErrorStop がFALSE)
Net5
このラダーでは、以下の全条件を満たすと vCmdEnb がONになり、指令が許可される状態になります。
- vAxisEnabled=TRUE、軸が使用可能状態である
- ioutAxis.udtOut.diRelStatus.1 =False、相対位置決め中ではない
- ioutAxis.udtOut.diAbsStatus.1=False、絶対位置決め中ではない
- ioutAxis.udtOut.xStandstill=TRUE、 軸が停止中
Net6
こちらはエラー情報の読出しのためにMC_ReadAxisErrorを使用します。
Net7
このステップでは、MC_ReadStatus を使用して軸のあらゆる状態を読み出し、それを ioutAxis.udtOut 構造体に格納します。
Net8
こちらは MC_ReadActualPosition ブロックを使って、リアルタイムな位置データを ioutAxis に格納します。
Net9
こちらは MC_ReadActualVelocity ブロックを使って、リアルタイムな速度データを ioutAxis に格納します。
Net10
MC_PowerFBを使用し、入力 xAxisEnable がONになると、指定された viAxisNumber のサーボをONにします。
Net11
MC_MoveAbsoluteを使用し、軸の絶対位置決めコマンドを発行します。
Net12
MC_MoveRelaiveを使用し、軸の相対位置決めコマンドを発行します。
MAIN
Net5
各軸の状態は udtAxis[i].udtOut.xStandstill で読み出し全ての軸が Standstill = TRUE(=完全停止)になって初めて、xAllAxisSTOP がTRUEになり、「全軸完全停止の確認フラグ」として使用します。
Net6
こちらは各軸に移動パラメータを一括設定する FOR文ループ処理プログラムです。
初回起動時(xInit = FALSE のとき)に、3軸分(Index 0〜2)の
- 絶対移動パラメータ rAbsParameters[]
- 相対移動パラメータ rRelParameters[]
- サーボON指令 xAxisEnable
を一括初期化します。
Net7
こちらは全軸一括絶対移動トリガーするプログラムです。ハードボタン入力 X0 がONかつ xAllAxisSTOP = TRUE(全軸停止状態)のときに有効になります。
Net8
こちらは全軸一括相対移動トリガーするプログラムです。ハードボタン入力 X1 がONかつ xAllAxisSTOP = TRUE(全軸停止状態)のときに有効になります。
Net9
これが 1軸分(今回は udtAxis[0])のFunction Block呼び出しで、FB内のロジックをMAIN側から動します。
Net10
これが 2軸分(今回は udtAxis[1])のFunction Block呼び出しで、FB内のロジックをMAIN側から動します。
Net11
これが 3軸分(今回は udtAxis[2])のFunction Block呼び出しで、FB内のロジックをMAIN側から動します。
Net12
こちらは全軸の Busy 状態確認ロジックになります。
- 3軸それぞれが 相対移動中か? → xRelBusy
- 3軸それぞれが 絶対移動中か? → xAbsBusy
Net13
こちらは全軸の動作完了判定ロジックで、各軸の 絶対移動/相対移動の完了フラグ(Done) をAND条件でまとめています。
Net14
こちらのラダーでは相対移動完了時のY1=ONし、移動中は点滅します。
Net15
こちらのラダーでは相対移動完了時のY0=ONし、移動中は点滅します。
ダウンロード
最後はPLC>DownloadでプロジェクトをCPUにDownloadしましょう。
結果
こちらの動画で動作を確認してください。