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

Reference Link
減速機(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 | 同期開始地点までの距離(=同期の予告距離) |
BufferMode | Aborting/Buffered/BlendingPrevious |
AvoidReversal | TRUEなら、スレーブの逆転は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動く」的なギア比になります。

パラメータ設定
パラメータ | 値 | 単位 | 説明 |
MasterSyncPosition | 500.0 | mm | マスターがこの位置に来たときに同期が完了してる状態にしたい |
SlaveSyncPosition | 200.0 | mm | 同期完了時にスレーブがこの位置にいればOK |
MasterStartDistance | 100.0 | mm | つまり「500.0 – 100.0 = 400.0mm」から同期開始(加速・減速含めて) |
RatioNumerator | 1 | – | 速度比(1:1) |
RatioDenominator | 1 | – | |
BufferMode | MC_BUFFER_MODE .Aboring | – | 今回は即実行(Aborting) |
AvoidReversal | FALSE | – | 今回は正逆転気にしない一般軸 |
タイミング
時間ベースから実際GearInPosの動きは以下になります(時間は仮に設定したものでご了承ください)。
タイミング | 動作 | 信号 |
t = 0 | マスターが走り始める(例:MC_MoveVelocity) | |
t = 1s | マスター位置 ≈ 400mm | MC_GearInPos.Execute := TRUEをON! |
t = 1.2s | StartSync = 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 に来ています。
項目 | 値 | 説明 |
RatioNumerator | 1 | ギア比:1 |
RatioDenominator | 1 | 同上(1:1) |
MasterSyncPosition | 50.0 | このときに同期完了する |
SlaveSyncPosition | 30.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にいる」ということで、 これを基準点として、以降はギア比に従って一緒に動きます。
項目 | 値 |
MasterSyncPosition | 50.0 |
SlaveSyncPosition | 30.0 |
Ratio | 1: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はもう使われないんです。