Codesys# GearInPosで位置同期!OMRONサーボでタイミングばっちりの多軸制御をやってみよう

今回はEtherCAT通信を使って、CMZ製コントローラ「FCT641」とOMRONサーボドライバ(R88D-1SN01L-ECT)を3軸構成で接続します。「MC_GearInPos」を使って、マスター軸とスレーブ軸を特定の位置関係でぴったり同期させる方法を紹介します。
それによって、 速度比だけでなく、「この位置でここに合わせたい」というタイミング制御が可能になるのがGearInPosの魅力です。

さ、FAを楽しもう。

Reference Link

OMRON# R88D-1SN_Part01_サーボシステムを立ち上げよう
CMZ#FC641_Part01_コントローラーを立ち上げよう
Codesys#SoftMotionを使ってみよう
Codesys# CMZ FCT641とOMRONサーボをつないで2軸制御してみよう

減速機(Gear Reducer)ってなに?

簡単にいいますと、モーターの回転数を下げて、そのぶんトルクを増やすための装置です。モーターは高速でクルクル回るのが得意ですが、実際の機械(搬送・加工機など)では、ゆっくり力強く回したいことが多いんです。そんなときに減速機でスピードを落として、そのぶんトルク(力)を上げることができます。

基本用語

用語意味
減速比「モーター回転数 ÷ 出力回転数」 例:1000rpm→100rpmなら10:1
トルク回す力の強さ(Nm)。減速するとトルクが増えるよ💪
バックラッシギア間の「遊び(がたつき)」、精密な制御では超重要!

仕組み(原理)

減速機は中にいろんな歯車(ギア)が入っていています。

  • 入力側(モーター)の速い回転を
  • 出力側(負荷)**にゆっくり回るように変換してくれます

MC_GearInPos

マスター軸とスレーブ軸を「ある位置関係」で同期させるためのファンクションブロック(FB)で、通常の MC_GearIn が「速度比のみ」で連結するのに対して、MC_GearInPos は「このマスター位置で、このスレーブ位置に来ててね」って位置ペア指定できます。

注意

  • MasterStartDistance をマイナス or 0にしないと Buffered/Blending モードでは使えない
  • モジュロ(360°リピート系)軸で AvoidReversal=TRUE にすると逆転NGな設計ができる
  • 事前に MC_MoveAbsolute などでマスター軸が走っていることが前提

今回使用するのはNidecのVRB-042C-5-K3-S8ZG8なので、減速比はシングルの5になります。

インタフェース

IN

パラメータ意味
Execute上昇エッジで処理開始
RatioNumerator / Denominatorギア比(例:2:1)
MasterSyncPositionマスター軸がこの位置に来たら同期が完了する
SlaveSyncPositionスレーブ軸はこの位置に来るように追従する
MasterStartDistance同期開始地点までの距離(=同期の予告距離)
BufferModeAborting/Buffered/BlendingPrevious
AvoidReversalTRUEなら、スレーブの逆転はNGとする(Modulo軸限定)

IN/OUT

パラメータ意味
Master / Slaveそれぞれの軸参照(AXIS_REF_SM3)

OUT

パラメータ意味
StartSync同期開始が始まった瞬間にTRUE
InSync同期完了後にTRUE
Busy実行中フラグ
Error / ErrorIDエラー発生情報
CommandAborted他のFBで中断されたとき=TRUE

具体的な同期動作例

こちらはGearInPosの同期動作例です。

  • マスター軸:搬送ベルト、一定速度で動いてる
  • スレーブ軸:ローラー、決まった位置でぴったり同期開始してラベルを貼る
  • 要求:
    • マスターが 位置500.0mm に到達したら、
    • スレーブが 位置200.0mm にちょうど来るように、
    • マスター位置400.0mmあたりから同期開始したい

なので、MasterStartDistance を短くすれば反応が早く、長くすれば滑らかな同期になります。また、Ratio を 1:2 にすれば、「マスターが2倍動いたらスレーブが1動く」的なギア比になります。

パラメータ設定

パラメータ単位説明
MasterSyncPosition500.0mmマスターがこの位置に来たときに同期が完了してる状態にしたい
SlaveSyncPosition200.0mm同期完了時にスレーブがこの位置にいればOK
MasterStartDistance100.0mmつまり「500.0 – 100.0 = 400.0mm」から同期開始(加速・減速含めて)
RatioNumerator1速度比(1:1)
RatioDenominator1
BufferModeMC_BUFFER_MODE
.Aboring
今回は即実行(Aborting)
AvoidReversalFALSE今回は正逆転気にしない一般軸

タイミング

時間ベースから実際GearInPosの動きは以下になります(時間は仮に設定したものでご了承ください)。

タイミング動作信号
t = 0マスターが走り始める(例:MC_MoveVelocity)
t = 1sマスター位置 ≈ 400mmMC_GearInPos.Execute := TRUEをON!
t = 1.2sStartSync = TRUE(400mm通過時点)
t = 2.0sマスターが500mm、スレーブも200mm到達InSync = TRUE(ぴったり同期!)

実装例

Axis_GearInPos(
    Master := MasterAxis,
    Slave := SlaveAxis,
    Execute := TRUE,
    RatioNumerator := 1,
    RatioDenominator := 1,
    MasterSyncPosition := 500.0,
    SlaveSyncPosition := 200.0,
    MasterStartDistance := 100.0,
    BufferMode := MC_BUFFER_MODE.Aboring,
    AvoidReversal := FALSE
);

OMRONサーボエンコーダ画面

OMRONのR88サーボにはエンコーダのプロパティ画面があり、中にその2つのITEMがあります。

  • Encoder Resolution per Rotation = 8388608、1回転あたりのパルス数(理論値):8388608 で固定になります(仕様)。
  • One-rotation Dataは実際の「0°〜360°」に対して現在マッピングされてる回転単位あたりのデータ長になります。

Implementation

EtherCAT Configuration

今回の記事では3個目のOMRONサーボを追加します。こちらのサーボは減速機に取り付けられています。

減速機の減速比は5:1なので、Scaling/Mapping>Motor turnsのところに5を入力してください。

プログラム

次はプログラムを作成します。

fbAxis

こちらは前回の記事の続きで、fbAxisに絶対位置決めのFB SM3_Basic.MC_MoveAbsoluteを宣言し、AXIS_REF_SM3と接続します。

FUNCTION_BLOCK fbAxis
VAR_IN_OUT
AXIS_REF_SM3: AXIS_REF_SM3;
END_VAR
VAR_OUTPUT
END_VAR
VAR
_mc_power:SM3_Basic.MC_Power;
_mc_jog: SM3_Basic.MC_Jog;
_mc_Reset:SM3_Basic.MC_Reset;
_mc_halt:SM3_Basic.MC_Halt;
_mc_Stop:SM3_Basic.MC_Stop;
_mc_readStatus:SM3_Basic.MC_ReadStatus;
_mc_moveRel: SM3_Basic.MC_MoveRelative;
_MC_HOME: SM3_Basic.MC_Home;
_mc_Readpos: SM3_Basic.MC_ReadActualPosition;
_mc_readVel: SM3_Basic.MC_ReadActualVelocity;
_mc_readAxisError: SM3_Basic.MC_ReadAxisError;
_mc_moveAbs:SM3_Basic.MC_MoveAbsolute;
END_VAR

pAxis

次はpAxisです。こちらの前回の続きを修正します。SM3_Basic.MC_GearInPosのFBを2つ追加し、軸1と軸2に接続します。今回の記事では、マスター軸は軸3になります。

PROGRAM pAxis
VAR

_Axis1: fbAxis;
_Axis2: fbAxis;
_Axis3: fbAxis;
_AxisGear :SM3_Basic.MC_GearIn;
_AxisGearOut:SM3_Basic.MC_GearOut;
_AxisGearInPos :SM3_Basic.MC_GearInPos;
_AxisGearInPos1 :SM3_Basic.MC_GearInPos;
END_VAR

画面

次は前回の記事の画面を修正します。

Visu-Template

前回の画面にMC_HOMEとMC_MOVEAbsolute Templateを追加します。

Visu-Axis1/2/3

そして各軸の画面を修正します。

Visu-GearInPos

こちらはGearInPosの画面になります。軸1と軸2の同期用のGearInPos Templateと絶対位置のコマンド発行のためのTemplateを追加しました。また、トレースで3つの軸の現在値を確認できるようにします。

デバイスへログイン

メニューから: Online > Loginし、デバイスとCODESYS IDEが接続され、アプリケーションをダウンロードします。

実行開始

再生ボタン(F5)をクリックしてPLCアプリケーションをスタートします。

結果

実機の動作確認は、YouTube上にアップロードしたデモ動画にてご確認いただけます。

Codesys.CMZ GearINPos FB with 3 OMRON EtherCAT Servo

マスターを 150 に移動したのに、スレーブは130で止まってる理由?

MC_GearInPosの「SlaveSyncPosition = 30.0」と、ギア比「1:1」が関係してるからです。

いまの設定と結果を比較してみると、つまりマスターが 50.0 に来たら、スレーブが 30.0 に来ています。

項目説明
RatioNumerator1ギア比:1
RatioDenominator1同上(1:1)
MasterSyncPosition50.0このときに同期完了する
SlaveSyncPosition30.0同期完了時にスレーブがこの位置にいるように制御する

ギア比が 1:1 だから、「マスターが100動いたら、スレーブも100動く」ってことです。でも開始時点でスレーブは「30.0」の状態だったから…

スレーブの位置 = SlaveSyncPosition + (マスターの移動量 − MasterSyncPosition)

→ なので、30.0 + (150.0 − 50.0) = 130.0 になります。

結論から言いますと、同期完了時の位置ペアを「基準点」として、その後の動きをギア比で引き継ぐ制御になり、最終目標は「150:130」ではなく、「50:30」を基準とした動き、そこからの増分がギア比に従います。

マスター軸が150→100に位置決めしたら、スレーブ軸はどうなる?

それではまずもう一度設定を見てみましょう。「マスターが50に来たときに、スレーブが30にいる」ということで、 これを基準点として、以降はギア比に従って一緒に動きます。

項目
MasterSyncPosition50.0
SlaveSyncPosition30.0
Ratio1:1(=1)

結果としてはスレーブも「80.0」まで戻るように動作します。

そのときはMasterStartDistanceも関係なくなるのか?

結論から言うと、同期(InSync)成立「後」は MasterStartDistance は関係なくなります。表からまとめますと、

タイミングMasterStartDistance の役割
同期開始前「どこから加速・減速して同期させるか」を決める距離。つまり準備区間
同期開始中マスターが MasterSyncPosition – MasterStartDistance を通過すると StartSync = TRUE になり、スレーブが追いかけ始める
InSync = TRUE(同期完了)以降無関係! → 以降は完全に「ギア比」だけでマスターに追従します(ただの追従状態)

たとえば今の設定だと…

  • MasterSyncPosition = 50.0
  • MasterStartDistance = 20.0

つまりマスターが30.0に来たときからスレーブの同期動作が始まり、 50.0に達したときにInSync = TRUEです。

その後、マスターが150.0 → 100.0に戻っても、スレーブはその動きに ギア比で完全追従するだけで、MasterStartDistanceはもう使われないんです。

シェアする

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

フォローする