Inovance# Easy PLC第5話:Motion FBをまとめ、自作FBで多軸制御をスッキリしよう

本記事では、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しましょう。

結果

こちらの動画で動作を確認してください。

シェアする

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

フォローする