自動機では、移載・組付・検査工程など様々な装置でサーボモータや電動アクチュエータを用いた軸制御が必要になります。
単軸制御で足りるケースもあれば、2次元(XY・XZ軸等)での制御、さらには3次元(XYZ軸)での制御が必要になることも多くあります。
複数の軸を制御する際には「現在位置と目標位置が直線距離に換算するとどの程度ズレているか」「現在位置から最短のポジションはどこか」といった情報が必要になる場面があります。
このような場合に役立つのが、XY座標系等の2次元平面における2点間の距離計算です。距離として評価することで、平面的な位置ズレの定量化や最近傍ポイントの判定など、実用的なプログラムを構築できます。
この記事では、キーエンスKV-X500/X300シリーズで作成するXY軸の2点間の距離を求めるラダープログラム、ST言語の例について解説します。
目次
1.【例題①】XY軸のポイント2点の直線距離を求める
下記仕様のラダープログラム、STを解説します。
ポイント1の座標値をPX1・PY1、ポイント2の座標値をPX2・PY2とする。
ポイント1の座標値をPX1・PY1、ポイント2の座標値をPX2・PY2とすると、ポイント1と2の直線距離Distanceは以下の式で求めることが出来ます。
\(Distance=\sqrt{\mathstrut(PX1-PX2)^2+(PY1-PY2)^2}\)
タッチパネルの動作イメージ
タッチパネルの動作イメージは以下のようになります。

ポイント1の座標値PX1・PY1とポイント2の座標値PX2・PY2のXY平面上の直線距離をDistanceに格納します。
使用する変数
使用する変数は以下になります。
| 変数 | データ型 | コメント |
|---|---|---|
| PX1 | DINT | PX1座標値(×0.01mm) |
| PY1 | DINT | PY1座標値(×0.01mm) |
| PX2 | DINT | PX2座標値(×0.01mm) |
| PY2 | DINT | PY2座標値(×0.01mm) |
| PX_Diff | DINT | PX1-PX2 |
| PY_Diff | DINT | PY1-PY2 |
| PX_DiffPow | DINT | PX_Diffの2乗 |
| PY_DiffPow | DINT | PY_Diffの2乗 |
| PXPY_Add | DINT | PX_DiffPow+PY_DiffPow |
| Distance | DINT | 直線距離(×0.01mm) |
電動アクチュエータで高いシェアを持つIAI製のロボシリンダや、一般的なサーボモータでは「現在位置」や「指令位置」のデータとして、2ワード符号あり整数型を用いることが一般的です。
例えばIAI製のRCONやPCON等の現行機種で直値モードを使用した場合、位置データは×0.01mm単位で表現されることが多いです。(1mmの場合は100となります)
今回は扱う位置データは全て2ワード符号あり整数(DINT)型を使用して、単位は×0.01mmとします。
ラダープログラム
ラダープログラムは以下のようになります。

直線距離Distanceを求める下記の式に則り、演算を実施します。
\(Distance=\sqrt{\mathstrut(PX1-PX2)^2+(PY1-PY2)^2}\)
今回は解説のため、途中の演算結果は全て別々のローカル変数に格納します。(デバイス点数や変数の数を節約するため、途中演算の結果を使い回すケースがあります。)
【1行目】減算(SUB)FUNを用いて\(PX1-PX2\)の演算結果をPX_Diff、\(PY1-PY2\)の演算結果をPY_Diffに格納します。
【2行目】べき乗(EXPT)FUNを用いてPX_Diffの2乗をPX_DiffPow、PY_Diffの2乗をPY_DiffPowに格納します。
【3行目の左側】加算(ADD)FUNを用いてPX_DiffPowとPY_DiffPowを加算した結果をPXPY_Addに格納します。
【3行目の右側】最後に平方根(SQRT)FUNを用いてPXPY_Addの平方根をDistanceに格納します。
演算に使用したファンクションについては以下のページで解説しております。
ST言語
ST言語は以下のようになります。
//ポイント1の座標値(PX1・PY1)とポイント2の座標値(PX2・PY2)の距離を算出
Distance := SQRT(EXPT(PX1 - PX2, UINT#2) + EXPT(PY1 - PY2, UINT#2));ラダープログラムとは異なり、途中の演算結果であるローカル変数は使用せずに1つの式で算出しています
2.【例題②】目標位置と現在位置を比較して残移動量を求める
下記仕様のラダープログラム、STを解説します。
現在の座標値をPX0・PY0、ポイント1の座標値をPX1・PY1とする。
考え方や演算方法は【例題①】と同様です。今回は現在の座標値とポイント1を比較することで、XY平面上の残移動量を求めることが可能です。
現在の座標値をPX0・PY0、ポイント1の座標値をPX1・PY1とすると、現在値とポイント1の直線距離Distanceは以下の式で求めることが出来ます。
\(Distance=\sqrt{\mathstrut(PX0-PX1)^2+(PY0-PY1)^2}\)
タッチパネルの動作イメージ
タッチパネルの動作イメージは以下のようになります。

現在の座標値PX0・PY0とポイント1の座標値PX1・PY1のXY平面上の直線距離をDistanceに格納します。
仕様の対象外ですが、スイッチ緑を押すとポイント1に対して位置決めを開始します。現在の座標値がポイント1に近づくと残移動量が減少していき最終的には0になります。※位置決めについてはラダープログラム、ST言語で解説はしていません。
使用する変数
使用する変数は以下になります。
| 変数 | データ型 | コメント |
|---|---|---|
| PX0 | DINT | PX0座標値(×0.01mm) |
| PY0 | DINT | PY0座標値(×0.01mm) |
| PX1 | DINT | PX1座標値(×0.01mm) |
| PY1 | DINT | PY1座標値(×0.01mm) |
| PX_Diff | DINT | PX0-PX1 |
| PY_Diff | DINT | PY0-PY1 |
| PX_DiffPow | DINT | PX_Diffの2乗 |
| PY_DiffPow | DINT | PY_Diffの2乗 |
| PXPY_Add | DINT | PX_DiffPow+PY_DiffPow |
| Distance | DINT | 直線距離(×0.01mm) |
ラダープログラム
ラダープログラムは以下のようになります。

ラダープログラムの構成は【例題①】と同様です。PX2・PY2をPX0・PY0に代替したイメージです。
タッチパネルの動作イメージの「スイッチ緑を押すと位置決めを行う」ラダープログラムは入っていませんが、このラダープログラムを用いることで位置決め時にポイント1までの残移動量がリアルタイムでモニタすることが可能です。
ST言語
ST言語は以下のようになります。
//現在の座標値(PX0・PY0)とポイント1の座標値(PX1・PY1)の距離を算出
Distance := SQRT(EXPT(PX0 - PX1, UINT#2) + EXPT(PY0 - PY1, UINT#2));ラダープログラム同様、PX2・PY2をPX0・PY0に代替したイメージです。こちらもタッチパネルの動作イメージのスイッチ緑を押すと位置決めを行うプログラムは入っていません。
3. おわりに
キーエンスKV-X500/X300シリーズで作成するXY軸の2点間の距離を求めるラダープログラム、ST言語の例を解説しました。


