電子カム 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に副軸の座標を入力してください。

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となります。それ以外の時は、追従動作を行っていません。 電子カムの副軸が動作しないときはこちらを確認してください。

コメント

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