この機能を使う理由
一方向に長時間同じ方向に動かし続けたとき、座標が非常に大きくなってしまいます。通常のモードでは定期的に座標を0クリアする必要があります。その処理を便利にしてくれる機能がシングルターンモードです。
シングルターンの仕様
座標がマイナスになることはありません。最大値から引いた値が座標になります。
公式ドキュメントによると
速い速度では、指令位置が大きくなることによりdoubleの浮動小数点型で表現できる有効桁数に制限されて指令位置の精度が低下したり、フィードバック位置がAccumulated Encoder Feedbackの制限範囲(2^63-1と-(2^63))に到達して更新しなくなることがあります。
シングルターンモードの設定方法
WMX3 Consoleでどのような挙動になるかを確認していきましょう。アプリの使い方はこちら
“Config”ボタンを押し、軸の設定変更画面を出します。指定軸のシングルターンモードを有効にし、最大のエンコーダカウントを設定します。設定後はApplyボタンで確定になります。

例では、移動量が設定値5000になったときにエンコーダ座標が0に書き換わります。
電子ギヤを入れて、上位側からは少数点ありの角度で制御するのも直感的でいいと思います。360.0の指令で軸の終端が1回転する。部材の供給であれば供給量を上位から指定すれば、それに対応した分モーターが回るなど。
シングルターンモードで相対位置移動
部材の供給軸などは今の位置から指定量送り出したいので、相対位置移動を行います。”Pos Cmd”画面を開きます。モードを”Relative”に変更し、移動を行います。

C#コードで設定を行う方法
関数名はSetSingleTurnになります。
第1引数が軸番号。第2引数がtrueならシングルターンが有効。第3引数はエンコーダの最大カウント値です。
const int _シングルターンモータNo = 0;
private void btnシングルターンモードON_Click(object sender, EventArgs e)
{
//// 起動のおまじない
//var API = new WMX3Api();
//var CMotion = new CoreMotion(API);
//API.CreateDevice("C:\\Program Files\\SoftServo\\WMX3\\", DeviceType.DeviceTypeNormal, 0xFFFFFFFF); // WMXに接続
int err = CMotion.Config.SetSingleTurn(_シングルターンモータNo, true, 5000);
if (err != ErrorCode.None)
{
Console.WriteLine("Failed to set single turn. Error=%d (%s)", err, CoreMotion.ErrorToString(err));
}
}
private void btnシングルターンモード解除_Click(object sender, EventArgs e)
{
//シングルターンモードを設定する
int err = CMotion.Config.SetSingleTurn(_シングルターンモータNo, false, 0);
if (err != ErrorCode.None)
{
Console.WriteLine("Failed to set single turn. Error=%d (%s)", err, CoreMotion.ErrorToString(err));
}
}エンコーダ座標の現在位置を座標0にする方法
軸の位置はそのままで、位置を0にする方法したいときがあります。
現在座標が以下の状態として、

以下の原点復帰コードを実行すると、
private void シングルターン_現在位置のゼロクリア()
{
int 操作したいモータ番号 = 5; // 0からはじまります
var homeParam = new Config.HomeParam(); // 原点復帰パラメータ
CMotion.Config.GetHomeParam(操作したいモータ番号, ref homeParam); // 現在の値を取得
homeParam.HomeType = Config.HomeType.CurrentPos; // 軸の現在のフィードバック位置を原点とします
CMotion.Config.SetHomeParam(操作したいモータ番号, homeParam); // 原点復帰パラメータのセット
var err = CMotion.Home.StartHome(操作したいモータ番号); // 原点復帰開始
}座標が0になります。原点復帰の方式をHomeType.CurrentPosにすれば、実際の軸が回転することはありません。

最大エンコーダカウント値の計算方法
SetSingleTurn の第3引数(最大エンコーダカウント)には、モーター1回転分のエンコーダパルス数を設定するのが基本です。たとえばエンコーダ分解能が131072 pulse/rev(17bit)のサーボを使う場合、最大カウント値は 131072 になります。
電子ギヤを使って「360.0 = 1回転」という単位系で動かす場合は、単位変換後の1回転に相当する指令値(例:360)を設定します。指令単位と最大カウントを合わせることで、座標が自然に0→360→0と循環します。
典型的な用途
- ロータリーテーブル:インデックスや回転搬送で無限回転が必要なとき。座標が際限なく増加するのを防ぎ、「現在の角度」が常に0〜359.9で表示される。
- 送り出し軸(材料供給):フィルムや線材などを一定量ずつ送り続ける装置。累積距離ではなく「1ショットの送り量」だけを管理すればよい。
- コンベア同期:エンコーダのオーバーフロー(2^63-1に到達)を防ぎ、長時間連続運転でも安定動作させる。
よくあるミスとトラブル
最大カウント値を誤って設定してしまう
最大カウント値がエンコーダの実分解能と一致していないと、折り返し位置がモーターの物理的な1回転とズレます。たとえば131072パルスのエンコーダに対して100000を設定すると、「0.76回転したところで座標が0に戻る」という挙動になり混乱の原因になります。必ずエンコーダ分解能(仕様書のPulse/Rev値)を確認してから設定してください。
シングルターン有効のまま絶対位置移動を使う
シングルターンモード中に絶対位置指令(MoveAbsolute)を使うと、目標座標が最大カウント値を超えた場合に予期しない動作になることがあります。無限回転用途では相対位置移動(MoveRelative)を使うのが安全です。
おわりに
終わりを気にせず、どこまででも回せるようになりました。シングルターン機能がない制御コントローラだと、定期的に座標をゼロクリアしていましたが、WMXでは簡単に実現できます。

コメント