APIバッファーを使用した停止確認テクニック

コーディング

装置を早く稼働させるには、移動の停止条件設定が重要となります。 目的位置に移動しても、オーバーシュートで行き過ぎていることがあります。今回は停止についてのコードをご紹介します。

移動後、完全に停止するまで待機する必要があるときは位置決め完了幅を確認

目的位置に限りなく近い位置で次の作業を行う必要があるときは、位置決め完了幅を監視するようにします。 使い方は、事前に位置決め幅を設定し、軸の停止条件を指定し、移動命令を行います。

位置決め完了幅の設定方法

位置決め完了幅は複数個あります。 用途に合わせて切り分けて使用してください。ここのInPosWidthは設定値(フラグ)であり、移動完了命令でこのフラグを指定しない限り意味がありません。※WMX3.6で検証したコード

private void 軸の位置決め完了幅の設定()
{
    CoreMotion CMotion = new CoreMotion(API);

    // 位置決め完了幅の設定
    const int 軸No = 0;
    var FeedbackParam = new Config.FeedbackParam();
    CMotion.Config.GetFeedbackParam(軸No, ref FeedbackParam);       // 現在の値を取得
    FeedbackParam.InPosWidth = 3;                                   // 位置決め完了幅1つ目
    FeedbackParam.InPosWidth2 = 10;                                 // 位置決め完了幅2つ目
    FeedbackParam.InPosWidth3 = 100;                                // 位置決め完了幅3つ目
    CMotion.Config.SetFeedbackParam(軸No, FeedbackParam);           // 書き換えた値の書き込み
}

位置決め完了幅で軸の停止を判定する方法

停止で位置決め完了幅を監視する場合は、ApiBufferConditionで[ApiBufferConditionType.InPos]を指定します。この機能はAPIバッファのみ実装されています。

注意点は、1つの軸しか監視することができません。 複数の軸の停止確認を行うときは、軸番号を変えてmApiBuffer.Wait()を複数記述してください。※WMX3.6で検証したコード

private void APIバッファーを使用した絶対位置移動()
{
    const int 軸No = 0;

    // APIバッファーの登録開始
    uint channel = 1;
    ApiBuffer mApiBuffer = new ApiBuffer(API);
    mApiBuffer.CreateApiBuffer(channel);
    mApiBuffer.StartRecordBufferChannel(channel);                           // 記録開始(記録のみで軸は動きません)

    // 移動パラメータの作成
    Motion.PosCommand CPosCommand = new Motion.PosCommand();                // 1軸の移動コマンド
    CPosCommand.Axis = 軸No;                                                // 軸番号
    CPosCommand.Target = 100;                                               // 移動先
    CPosCommand.Profile.Velocity = 1000;
    CPosCommand.Profile.Acc = 1000;
    CPosCommand.Profile.Dec = 1000;

    // 絶対位置移動
    //WMX3Api API = new WMX3Api();
    CoreMotion CMotion = new CoreMotion(API);
    CMotion.Motion.StartPos(CPosCommand);

    // 待機パラメータ設定(位置決め完了幅に入るまで停止します)
    ApiBufferCondition bufferCondition = new ApiBufferCondition();          // モーションクラス
    bufferCondition.BufferConditionType = ApiBufferConditionType.InPos;     // 位置決め完了待ち
    bufferCondition.Arg_InPos.Axis = 軸No;                                  // 停止の確認軸(Config.GetFeedbackParamで設定してあることが前提です)
    bufferCondition.Arg_InPos.Channel = 0;                                  // 0=InPos 1=InPos2
    mApiBuffer.Wait(bufferCondition);                                       // 移動完了待ち

    mApiBuffer.EndRecordBufferChannel();                                    // APIバッファチャネルへのAPIの記録を終了

    // 軸の動作開始
    mApiBuffer.Execute(channel);
}

干渉物をよけるために、ある軸を遅らせて動作させるときは、移動残り量を確認

[ApiBufferConditionType.DistanceToTarget]を使用します。 複数の軸を確認したい場合は、軸番号を変えて、ApiBuffer.Wait()を複数実行で登録します。

bufferCondition.BufferConditionType = ApiBufferConditionType.DistanceToTarget;  // 終了判定モード(モーションの目標位置までの距離が指定された値より小さい)
bufferCondition.Arg_DistanceToTarget.Axis = 0;
bufferCondition.Arg_DistanceToTarget.Distance = 50;                             // ユーザー単位の残り距離
WMX3Api.ApiBuffer.Wait(bufferCondition);                                        // 移動完了待ち

オーバーシュートが気にならないときの最速移動は指令完了を確認

3軸が移動を行っていない状態になるまで待機するコードは下記になります。 生産に関係ない退避位置に移動などはこちらを推奨します。

    //ApiBuffer mApiBuffer = new ApiBuffer(API);
    //ApiBufferCondition bufferCondition = new ApiBufferCondition();        // モーションクラス    
    bufferCondition.BufferConditionType = ApiBufferConditionType.AxisIdle;  // 指令の実行完了待ち
    bufferCondition.Arg_AxisIdle.AxisCount = 3;                             // 対象軸の個数
    bufferCondition.Arg_AxisIdle.Axis[0] = 0;                               // 停止の確認軸
    bufferCondition.Arg_AxisIdle.Axis[1] = 1;                               // 停止の確認軸
    bufferCondition.Arg_AxisIdle.Axis[2] = 2;                               // 停止の確認軸
    mApiBuffer.Wait(bufferCondition);                                       // 全軸の移動完了待ち

コメント

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