今回は、CODESYS SoftMotionを使って、マスター軸とスレーブ軸をCAM(電子カム)で同期制御する方法を解説します。「CAMTABLEの作成」から「プログラムへの実装」、そして「スレーブ軸の変化を可視化するHMI画面」まで、ひと通りの流れを丁寧にまとめました。
さ、FAを楽しもう。

codesys-cam-control-2axis-camtable-to-hmi
Reference Link
http://soup01.com/ja/2025/06/14/post-12073/
前書き
いつも私の技術ブログと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
技術はひとりじゃもったいない。
電子CAM(Electronicカム)とは?
CAMは「電子カム(Electronic CAM)」のことを指していて、本来の「カム機構(メカ的なやつ)」をソフトウェア的に再現する制御手法です。
- CAM(カム):卵みたいな変形ディスク
- FOLLOWER(フォロワ):カムの形状に合わせて上下に動く部品
- カムが回転することで、フォロワーが規則的な高さ運動をする
CAM活用できるところ…
使用シーン | 内容 |
包装機 | 主軸の動きに合わせて、カッターや折り機を動かす |
ロール搬送 | 回転するローラーに合わせて、切断タイミングを一致させる |
ラベラー | 缶やボトルが一定の位置に来たときだけ、ラベルを貼る |
プレス機 | 送り軸とプレスの打ち抜きを完全に同期させる |
ロボット連携 | ロボットと搬送ラインをCAMで同期して「追従させる」 |
メカ式CAMと電子CAMの違い?
メカ式CAM | ソフト式(電子)CAM |
CAM形状で動きを制御 | データ(CAMテーブル)で動きを制御 |
実際にカム部品を使う | サーボモータ+PLCで再現 |
精度・調整は機械でやる | 精密制御や切替もソフトで自由に! |
MC_CamIn とは?
マスター軸とスレーブ軸をカムプロファイルで同期させるためのFB(Function Block)で、
つまり「この動きに合わせて、この動きにぴったり追従させて」って命令を発行します。
インタフェース
INPUT
名前 | 型 | 説明 |
Execute | BOOL | 実行トリガ(立ち上がりで処理開始) |
CamTable | SMC_CAMTable | CAMプロファイル(カムテーブル) |
MasterOffset | LREAL | マスター軸のオフセット位置(位置補正) |
SlaveOffset | LREAL | スレーブ軸のオフセット位置(位置補正) |
StartMode | MC_CamStartMode | CAM開始のタイミング設定(自動/即時など) |
BufferMode | MC_BufferMode | CAMの割り込み/バッファモードの指定 |
OUTPUT
名前 | 型 | 説明 |
Done | BOOL | CAM開始処理が正常に完了したらTRUE |
Busy | BOOL | 実行中(処理中)であればTRUE |
Active | BOOL | CAM制御が現在アクティブであればTRUE |
CommandAborted | BOOL | 他の命令により中断された場合にTRUE |
Error | BOOL | エラー発生時にTRUE |
ErrorID | UDINT | エラーの詳細コード(識別用) |
INOUT
名前 | 型 | 説明 |
Master | AXIS_REF | マスター軸の参照(CAMの基準になる軸) |
Slave | AXIS_REF | スレーブ軸の参照(CAMで制御される軸) |
Example
こちらはMC_CamInの使用例です。
VAR fbCamIn : MC_CamIn; axisMaster : Axis_Ref; axisSlave : Axis_Ref; camProfile : SMC_CAMTable; END_VAR fbCamIn( Execute := bStartCam, Master := axisMaster, Slave := axisSlave, CamTable := camProfile, StartMode := MC_CamStartMode.Automatically, BufferMode := MC_BufferMode.Buffered ); |
MC_CamTableSelect とは?
CAM制御で「どのカムテーブルを使うか?」を選択・適用するための、すごく重要なファンクションブロックです。それはマスター軸とスレーブ軸をCAMでつなぐ前に、どのカムパターンを使うかを準備・選択する処理をします。
インタフェース
INPUT
名前 | 型 | 説明 |
Execute | BOOL | テーブル切替の実行トリガ(立ち上がり) |
CamTable | SMC_CAMTable | 適用したいカムテーブルデータ |
Periodic | BOOL | TRUE:周期カム、FALSE:非周期カム |
MasterAbsolute | BOOL | TRUEでマスター軸を絶対位置で扱う |
SlaveAbsolute | BOOL | TRUEでスレーブ軸を絶対位置で扱う |
OUT
名前 | 型 | 説明 |
Done | BOOL | 切替完了時TRUE |
Busy | BOOL | 実行中TRUE |
Error | BOOL | エラー発生時TRUE |
ErrorID | UDINT | エラー内容のIDコード |
CamTableID | UINT | 適用中のCAMテーブルID(管理用) |
INOUT
名前 | 型 | 説明 |
Master | AXIS_REF | マスター軸への参照(同期元) |
Slave | AXIS_REF | スレーブ軸への参照(同期対象) |
MC_CamOut とは?
MC_CamIn と対して、「CAM同期を終了する」ためのファンクションブロックです。例えば、MC_CamIn で、主軸の回転に合わせて切断軸を同期させ、カットが終わったら 、MC_CamOut で同期解除し、スレーブ軸を MC_MoveHome で初期位置に戻したいとき、CAM解除が必要になります。
インタフェース
INPUT
名前 | 型 | 説明 |
Execute | BOOL | CAM解除のトリガ(立ち上がりで処理開始) |
Slave | AXIS_REF | CAM同期を解除するスレーブ軸 |
OUTPUT
名前 | 型 | 説明 |
Done | BOOL | CAM解除処理が完了したらTRUE |
Busy | BOOL | 実行中(解除処理中)でTRUE |
Error | BOOL | エラーが発生したらTRUE |
ErrorID | UDINT | エラーの詳細コード |
INOUT
名前 | 型 | 説明 |
Slave | AXIS_REF | スレーブ軸の参照(CAMで制御される軸) |
Example
こちらはMC_CamOutの使用例です。
VAR fbCamOut : MC_CamOut; END_VAR fbCamOut( Execute := bReleaseCam, Slave := axisSlave ); |
Implementation
CAMテーブル追加
CodesysでCAMを使用するにはCAM テーブルを追加する必要があり、Application>右クリック>Add Object>Cam Tableします。
Done!新しいCAM Tableが追加されました。こちらはCAM テーブルにある各図の意味合いを説明します。
① 最上段(黒):スレーブ位置 vs マスター位置
このグラフがCAMの本体で、マスターがどれだけ動いたときに、スレーブはどこにいるべきかを示しています。下図では緩やかに上昇しているので、スレーブがなめらかに上昇するプロファイルになっています。
軸 | 内容 |
横軸 | master position(マスター軸の位置) |
縦軸 | slave position(スレーブ軸の位置) |
② 2段目(青):スレーブ速度
ここではスレーブのマスター軸に対する速度変化を確認できます。最初と最後に山がある → 加速・減速してることあり、また真ん中はフラットであることは、一定速度で動いています。
軸 | 内容 |
横軸 | master position |
縦軸 | slave velocity(スレーブの速度) |
③ 3段目(緑):スレーブ加速度
ここでは「スレーブの動きがどれだけ速く変化してるか(加減速)」を示しています。上下にうねる波形 → 加速→減速→一定→また加速→減速…って動きがわかります。また、中央で 0 は安定区間(定速運転)です。
軸 | 内容 |
横軸 | master position |
縦軸 | acceleration(スレーブの加速度) |
④ 最下段(オレンジ):スレーブのジャーク(加加速度)
Jerkは「加速度の変化速度」で、急激な動きの変化があるとき、ここを大きく設定してください。下図の波形が滑らかで小さい ので、 機械に優しい動きになります。注意するのは急な山があると振動や衝撃の原因になります。
軸 | 内容 |
横軸 | master position |
縦軸 | jerk(加加速度) |
Program
こちらは今回記事で追加したプログラムです。
こちらはMC_CamTableSelect FBを使用し、適切なCAMテーブルを取得します。
CAMテーブルを取得したあと、そのデータをMC_CamINに渡します。同時に、MasterとSlave軸を設定します。
Visu
最後はCodesysのMC_CamIN・MC_CamOut・MC_CamTableSelectテンプレートを使用し、画面を作成します。
Result
こちらはマスターがCAMで0→360に移動するとき、スレーブ軸の動きになります。
こちらはマスターがCAMで360→0に移動するとき、スレーブ軸の動きになります。