モーション処理を行う前に、これから動かす軸はどのような動きをするのかを知ることが出来ます。この記事では、実際に動作させ求められた結果がどのような値になるかを図を使って説明します。
モーション動作の時間を求める
この波形をシミュレーション関数で情報を求めます。 具体的には、Motion.SimulatePosCommandクラスに速度情報をセットし、Motion.SimulatePos()関数で情報を得ることが出来ます。
検証プロファイル
座標0から1000まで以下の速度で動作させた波形が以下の図になります。
ProfileType.Trapezoidal; // 台形プロファイル
Profile.Velocity = 800; // 最高速度
Profile.Acc = 1600; // 加速
Profile.Dec = 1400; // 減速

赤が絶対位置で、オレンジが指令速度です。
検証結果
実行した結果は以下の通り。

シミュレーションで得られた時間と同じでした。

検証コード
// <summary>
/// 軸を動かすことなく、位置指令をシミュレート
/// </summary>
private void btnSimulatePos_Click(object sender, EventArgs e)
{
// 検証させるプロファイル(実際の移動とシミュレーションで共用できます)
Motion.SimulatePosCommand pSimulatePosCommand = new Motion.SimulatePosCommand(); // シミュレートされる位置指令
pSimulatePosCommand.StartPos = 0; // 開始位置
pSimulatePosCommand.PosCommand.Axis = 0; // 制御対象軸
pSimulatePosCommand.PosCommand.Profile.Type = ProfileType.Trapezoidal; // 台形プロファイル
pSimulatePosCommand.PosCommand.Profile.Velocity = 800; // 最高速度
pSimulatePosCommand.PosCommand.Profile.Acc = 1600; // 加速
pSimulatePosCommand.PosCommand.Profile.Dec = 1400; // 減速
pSimulatePosCommand.PosCommand.Target = 1000;
// シミュレーションで仮想的に軸を動かすコード
double peakVelocity = 0; // シミュレートされる位置指令中に軸が移動する最高絶対速度[ユーザー単位 / s]
double totalTimeMilliseconds = 0; // モーション指令の合計の実行時間[ms]
double accelerationTimeMilliseconds = 0; // モーション指令中に軸が加速に費やす時間[ms]
double cruiseTimeMilliseconds = 0; // モーション指令中に軸が目標速度で費やす時間[ms]
double decelerationTimeMilliseconds = 0; // モーション指令中に軸が減速に費やす時間を格納する[ms](モーション指令中に軸が方向を変える場合、方向を変える前に減速に費やされた時間は減速時間に含まれません)
CMotion.Motion.SimulatePos(pSimulatePosCommand, ref peakVelocity, ref totalTimeMilliseconds, ref accelerationTimeMilliseconds, ref cruiseTimeMilliseconds, ref decelerationTimeMilliseconds);
// UIに表示(デバック用)
lblpeakVelocity.Text = peakVelocity.ToString("0.0");
lbltotalTimeMilliseconds.Text = totalTimeMilliseconds.ToString();
lblaccelerationTimeMilliseconds.Text = accelerationTimeMilliseconds.ToString();
lblcruiseTimeMilliseconds.Text = cruiseTimeMilliseconds.ToString();
lbldecelerationTimeMilliseconds.Text = decelerationTimeMilliseconds.ToString();
// 絶対位置移動(実際に装置で使用するコード)
int IsErr = CMotion.Motion.StartPos(pSimulatePosCommand.PosCommand);
if (IsErr != ErrorCode.None)
{
return; // エラー発生
}
}
モーションに必要な時間を取得することが出来ました。
モーションを開始し、ある時点での軸の情報を取得
SimulatePosAtTime関数では、移動を開始してから指定時間後の進んだ距離と速度を求めることができます。
検証結果
検証プロファイルはSimulatePosの時と同じにしています。

経過時間での移動した位置と速度を求めることが出来ました。

検証コード
private void btnSimulatePosAtTimeOne_Click(object sender, EventArgs e)
{
// 検証させるプロファイル(実際の移動とシミュレーションで共用できます)
Motion.SimulatePosCommand pSimulatePosCommand = new Motion.SimulatePosCommand(); // シミュレートされる位置指令
pSimulatePosCommand.StartPos = 0; // 開始位置
pSimulatePosCommand.PosCommand.Axis = 0; // 制御対象軸
pSimulatePosCommand.PosCommand.Profile.Type = ProfileType.Trapezoidal; // 台形プロファイル
pSimulatePosCommand.PosCommand.Profile.Velocity = 800; // 最高速度
pSimulatePosCommand.PosCommand.Profile.Acc = 1600; // 加速
pSimulatePosCommand.PosCommand.Profile.Dec = 1400; // 減速
pSimulatePosCommand.PosCommand.Target = 1000;
// シミュレーションで仮想的に軸を動かすコード
int returnTyp = rbSimulatePosAtTime経過した時間.Checked? 0 : 1; // timeMillisecondsのモード(0=経過した時間 1=残り時間)
double timeMilliseconds = (double)nudSimulatePosAtTime.Value; // [指定]経過時間[ms]
double calculatedPos = 0; // [取得]座標
double calculatedVel = 0; // [取得]速度
CMotion.Motion.SimulatePosAtTime(pSimulatePosCommand, returnTyp, timeMilliseconds, ref calculatedPos, ref calculatedVel);
// UIに表示(デバック用)
lblSimulatePosAtTime座標.Text = calculatedPos.ToString("0.0");
lblSimulatePosAtTime速度.Text = calculatedVel.ToString("0.0");
// 絶対位置移動(実際に装置で使用するコード)
int IsErr = CMotion.Motion.StartPos(pSimulatePosCommand.PosCommand);
if (IsErr != ErrorCode.None)
{
return; // エラー発生
}
}
モーションを開始し、ある移動距離での情報を取得
SimulateTimeAtPos関数ではある位置に到達したときの経過時間と残り時間を求める事ができます。
検証結果
検証プロファイルはSimulatePosの時と同じにしています。


検証コード
private void btnSimulateTimeAtPos_Click(object sender, EventArgs e)
{
// 軸が指定された位置に到達したときの経過時間と残り時間が返されます。
// 検証させるプロファイル(実際の移動とシミュレーションで共用できます)
Motion.SimulatePosCommand pSimulatePosCommand = new Motion.SimulatePosCommand(); // シミュレートされる位置指令
pSimulatePosCommand.StartPos = 0; // 開始位置
pSimulatePosCommand.PosCommand.Axis = 0; // 制御対象軸
pSimulatePosCommand.PosCommand.Profile.Type = ProfileType.Trapezoidal; // 台形プロファイル
pSimulatePosCommand.PosCommand.Profile.Velocity = 800; // 最高速度
pSimulatePosCommand.PosCommand.Profile.Acc = 1600; // 加速
pSimulatePosCommand.PosCommand.Profile.Dec = 1400; // 減速
pSimulatePosCommand.PosCommand.Target = 1000;
// シミュレーションで仮想的に軸を動かすコード
double specificPos = (double)nudspecificPos.Value; // [指定]座標
double moveTimeMilliseconds = 0; // [取得]モーション指令の経過時間[ms]
double remainTimeMilliseconds = 0; // [取得]モーション指令の残り時間[ms]
CMotion.Motion.SimulateTimeAtPos(pSimulatePosCommand, specificPos, ref moveTimeMilliseconds, ref remainTimeMilliseconds);
// UIに表示(デバック用)
lblSimulateTimeAtPos経過.Text = moveTimeMilliseconds.ToString("0.0");
lblSimulateTimeAtPos残り.Text = remainTimeMilliseconds.ToString("0.0");
// 絶対位置移動(実際に装置で使用するコード)
int IsErr = CMotion.Motion.StartPos(pSimulatePosCommand.PosCommand);
if (IsErr != ErrorCode.None)
{
return; // エラー発生
}
}
まとめ
1つの軸に対してシミュレーションを行うことが出来ました。 この関数は複数軸でのシミュレーションにも対応しています。 軸を実際に移動させずに、実行時間を求めることが出来るのは便利ですね。
コメント