電子カムとは
高速で複雑なタイミング制御を行うときに使用します。主軸の座標に対して、副軸が指定した位置に自動的に移動するモーション動作になります。ソフト制御のため、軌跡の変更が容易です。
いつどんな時に使うの?
直線補間で複数の軸を動かしているときに、ある軸のみ指定の軌跡で動かすとき。 円弧動作中のある軸に追従して、副軸を同期させて動かす必要があるときに使えます。
電子カムを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となります。それ以外の時は、追従動作を行っていません。 電子カムの副軸が動作しないときはこちらを確認してください。
コメント