電子カムとは
高速で複雑なタイミング制御を行うときに使用します。主軸の座標に対して、副軸が指定した位置に自動的に移動するモーション動作になります。ソフト制御のため、軌跡の変更が容易です。
いつどんな時に使うの?
直線補間で複数の軸を動かしているときに、ある軸のみ指定の軌跡で動かすとき。 円弧動作中のある軸に追従して、副軸を同期させて動かす必要があるときに使えます。
電子カムをWMXで使えるようにする
デフォルトの状態では、ECAM関数が使用できる状態ではありません。WMXのAdvancedMotionモジュールに含まれる機能を有効にする必要があります。
変更方法
C:\ProgramFiles\SoftServo\WMX3 の Module.iniファイルを開きます。

ファイル内のDllName = AdvancedMotion の下にある項目で
disable = 0 に変更します。

書き換え時の注意
そのままでは上書きができないので、いったんデスクトップなどに保存してから、C:\Program Files\SoftServo\WMX3へ上書きを行ってください。
電子カムがデフォルトで無効になっている理由
リソース消費量を減らすために、Module.iniにて無効にしてあります。不要なモジュールを読み込まないようになっています。
プログラム実行時にエラーが出てしまう場合
C#コード実行時に、エラー番号”304″(関数はサポートされていません)が出る

RTSSのC++コード実行時に、エラー番号”304″(関数はサポートされていません)が出る

原因はModule.iniファイル内のDllName = AdvancedMotionをdisable = 1になっていることが原因です。
C#コンパイルエラー
C# 必用DLL
プロジェクトに、AdvancedMotionApi_CLRLib.dllの参照が必要となります。
サンプルコード
軸0の座標に対応した位置へ軸1を追従させるコードです。
pECAMData.NumPoints でプロット設定数を指定します。
pECAMData.MasterPosに主軸の座標を入力します。この座標に対する副軸の座標を指定することになります。
pECAMData.SlavePosに副軸の座標を入力してください。※WMX3.6で検証したコード
using WMX3ApiCLR;
static void Main(string[] args)
{
WMX3Api API;
API = new WMX3Api();
//CMotion = new CoreMotion(API);
API.CreateDevice("C:\\Program Files\\SoftServo\\WMX3\\", DeviceType.DeviceTypeNormal, 0xFFFFFFFF); // WMXに接続
API.StartCommunication(0xFFFFFFFF); // 通信開始
// サーボON
CoreMotion CMotion;
CMotion = new CoreMotion(API);
CMotion.AxisControl.SetServoOn(0, 1); // サーボON
CMotion.AxisControl.SetServoOn(1, 1); // サーボON
// 何か押されるまで待機
//Console.ReadKey();
// 【電子カム動作】
// E-CAM制御は、スレーブ軸の指令位置がマスター軸の位置によって制御される機能です
// ・マスター励磁をOFF→ONにすると電子カムは有効のままです
// ・スレーブの励磁をOFF→ONにすると電子カムは無効になります
// ・マスターがテーブル外で、スレーブがテーブル外のとき、E-CAMオンでスレーブは不動です。
// ・マスターがテーブル内で、スレーブがテーブル外のとき、E-CAMオンでスレーブは移動します。
/// <summary>電子カム制御クラス</summary>
WMX3ApiCLR.AdvancedMotion am;
/// <summary>電子カム制御データ</summary>
WMX3ApiCLR.AdvSync.ECAMData pECAMData;
/// <summary>電子カム番号</summary>
const int _ECAMNo = 1;
am = new WMX3ApiCLR.AdvancedMotion(API);
// 電子カムパラメータ
pECAMData = new AdvSync.ECAMData();
am.AdvSync.GetECAM(_ECAMNo, ref pECAMData);
pECAMData.Options.Type = AdvSync.ECAMType.Normal; // E-CAMの特性(Normal=マスターがテーブルの範囲外のとき、スレーブは不動です)
pECAMData.Options.Source.Type = AdvSync.ECAMSourceType.MasterCommandPos; // マスター入力は、マスター軸の指令位置
pECAMData.Options.Clutch.Type = AdvSync.ECAMClutchType.SimpleCatchUp; // E-CAM制御が開始されたときにスレーブ軸が最初にマスター軸とどのように同期するかを決定します。
pECAMData.Options.Clutch.SimpleCatchUpAcc = 1000; // マスターとスレーブのE-CAM位置曲線に追従するために使用する速度
pECAMData.Options.Clutch.SimpleCatchUpVelocity = 1000; // マスターとスレーブのE-CAM位置曲線に追いつくために使用する加速度と減速度
pECAMData.NumPoints = 4; // E-CAMテーブルの点数。この値は最低2
pECAMData.MasterAxis = 0; // 主軸
pECAMData.MasterPos[0] = 0;
pECAMData.MasterPos[1] = 100;
pECAMData.MasterPos[2] = 200;
pECAMData.MasterPos[3] = 300;
pECAMData.SlaveAxis = 1; // 制御するスレーブ軸
pECAMData.SlavePos[0] = 20;
pECAMData.SlavePos[1] = 200;
pECAMData.SlavePos[2] = 150;
pECAMData.SlavePos[3] = 50;
// 追従開始
var IsErr = am.AdvSync.StartECAM(_ECAMNo, pECAMData); // E-CAM制御を開始
if (IsErr != ErrorCode.None)
{
Console.WriteLine("Failed to StartECAM(). Error=" + IsErr);
// 304=関数はサポートされていません(関数が見つかりません)
// 65581=1つ以上の速度の引数が範囲外です
}
// 外部アプリで軸を動かしてください
// 何か押されるまで待機
Console.ReadKey();
am.AdvSync.StopECAM(_ECAMNo); // E-CAM制御を停止
API.StopCommunication(0xFFFFFFFF); // サーボネットワークとの通信を停止
API.CloseDevice(); // 制御を停止
}サンプルコードの実行結果
横方向が主軸で、縦方向が副軸のグラフになります。 ソースコードの「// 外部アプリで軸を動かしてください」の部分で軸0(主軸)のみを動作させたモーションが下の図になります。

電子カムが動かないときの確認方法
WMX Consoleを使用して座標が確認できます。スレーブのop 表示はECAMとなります。それ以外の時は、追従動作を行っていません。 電子カムの副軸が動作しないときはこちらを確認してください。

ECAMパラメータの詳細説明
サンプルコードに登場する主要パラメータの意味を整理します。設定値を変えるだけで動作の挙動が大きく変わるため、各項目を理解してから適用してください。
ECAMType(Type)
Normal:マスター座標がテーブル範囲外のとき、スレーブは不動です。主軸が一定範囲内でのみ副軸を制御したい場合に使います。
Cyclic:マスター座標がテーブルの終端に達すると、先頭に折り返してサイクル動作を繰り返します。ロータリーテーブルや繰り返し搬送に適しています。
ECAMSourceType(Source.Type)
MasterCommandPos:マスター軸の指令位置(上位から与えた目標座標)を入力として使います。フィードバックより先行するため応答が速い反面、追従誤差の影響を受けません。
MasterFeedbackPos:マスター軸の実際のフィードバック位置を使います。エンコーダの実測値に忠実に追従させたい場合に選択します。
ECAMClutchType(Clutch.Type)
E-CAM開始時にスレーブがどのようにマスターと同期を取るかを決めます。
SimpleCatchUp:指定した速度・加速度でスレーブが現在位置からテーブル上の対応位置まで追いつきます。装置が動作中でもスムーズにE-CAMを開始できます。
Immediate:即座にE-CAM制御へ切り替えます。スレーブが急移動することがあるため、停止状態で使用するのが安全です。
カムテーブル作成のコツ
- 点数は最低2点:NumPoints の最小値は2です。点数を増やすほど滑らかな曲線を表現できます。
- マスター座標は昇順で設定:MasterPos[] は必ず小さい値から大きい値の順で入力してください。逆順だとE-CAMが正常に機能しません。
- 点と点の間は線形補間:デフォルトではテーブルの各点間は直線補間になります。滑らかな動きが必要な場合は点数を増やしてS字に近い曲線を作るか、Spline補間オプションを検討してください。
よくある失敗パターン
エラーコード 65581 が出る
“1つ以上の速度の引数が範囲外です”というエラーです。SimpleCatchUpVelocity または SimpleCatchUpAcc に 0 以下の値が入っているときに発生します。必ず正の値を設定してください。
スレーブが追従せず止まったまま
WMX Consoleでスレーブ軸のop列が「ECAM」以外(例:STOPやIDLE)の場合、E-CAM制御が有効になっていません。StartECAM() の戻り値がNone(0)であることを確認した上で、マスター軸座標がテーブルのMasterPos範囲内に入っているかをチェックしてください。NormalタイプではテーブルのMasterPos範囲外だとスレーブは動きません。
AdvancedMotionモジュールが有効なのにエラー304が続く
Module.ini を書き換えた後、WMXエンジンを再起動していない場合に起こります。Agentアプリのエンジン再起動、もしくはPC再起動を行ってから再度お試しください。


コメント