電子カム ECAMを使用する方法

コーディング

電子カムとは

 高速で複雑なタイミング制御を行うときに使用します。主軸の座標に対して、副軸が指定した位置に自動的に移動するモーション動作になります。ソフト制御のため、軌跡の変更が容易です。

いつどんな時に使うの?

 直線補間で複数の軸を動かしているときに、ある軸のみ指定の軌跡で動かすとき。 円弧動作中のある軸に追従して、副軸を同期させて動かす必要があるときに使えます。

電子カムを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再起動を行ってから再度お試しください。

コメント

タイトルとURLをコピーしました