FANUCロボット×PLCでパレタイズする|シフト量の計算をPLC側にまとめる設計
この記事でわかること
- PLCで計算したシフト量を、グループ入力でロボットに渡す方法
- グループ入力ではマイナスと小数が送れない問題の、実際の逃げ方
- FANUC標準のパレタイズ機能を使わずに、計算方式を選ぶ理由
はじめに
位置レジスタのシリーズも、今回で最後です。
- 1本目:位置レジスタは、座標を入れておく箱
- 2本目:その箱を計算で動かす。基準1点からずらす
- 今回:ずらす量を、PLCから受け取る
先に結論を書きます。今回のロボットのプログラムには、繰り返しが入っていません。
何列目かも、何行目かも、いま何個目かも、ロボットは知りません。ロボットがやるのは「言われた場所へ行って、つかんで、置く」だけです。
考えることは全部PLCに持たせます。今回はPLC側のスクリプトも載せます。 実際に動かして確認したものです。
👉 【補足】本記事の図は、説明のために筆者が作成したイメージ図です。メーカーが公開している資料ではありません。ご使用の機種やバージョンによって表示が異なる場合があります。
1. 今回つくるもの
パレットに、10列 × 6行 = 60個を並べます。
- X方向(列)に10個。ピッチ50mm
- Y方向(行)に6行。ピッチ80mm
- 段積みはしません。平面に並べるだけです
ロボットに教えるのは、1個目を置く場所だけです。 残り59か所は全部計算で出します。
マス目の数字は、PLCが持っているワークカウントです。0から数えて、端まで行ったら次の行へ移ります。
どちらに何をやらせるか
| 担当すること | |
|---|---|
| PLC | いま何個目か。何列目・何行目か。基準から何mmずらすか |
| ロボット | 受け取った数字ぶんだけずれた場所へ行って、置く |
判断はPLC、動作はロボット。 これだけです。
- いま何個目か
- 何列目・何行目か
- 基準から何mmずらすか
- 数字を受け取る
- 基準からずらして計算する
- そこへ行って置く
2. PLC側:カウントを列数で割るだけ
まずPLC側です。使うのはキーエンスのKV STUDIO、書くのはKVスクリプトです。
考え方
「いま何個目か」を列数で割ると、行と列が同時に出ます。
- 余りが「その行の何個目か」= X方向
- 商が「何行目か」= Y方向
これだけです。折り返しの処理を書く必要がありません。 端まで行くと余りが0に戻り、そのとき商が1つ増えるので、勝手に次の行へ移ります。
| カウント | 余り(列) | 商(行) | Xシフト | Yシフト |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 50 | 0 |
| 9 | 9 | 0 | 450 | 0 |
| 10 | 0 | 1 | 0 | 80 |
| 11 | 1 | 1 | 50 | 80 |
| 59 | 9 | 5 | 450 | 400 |
デバイスの割り当て
| デバイス | 内容 |
|---|---|
DM1000 | Xピッチ幅(FLOAT) |
DM1002 | Yピッチ幅(FLOAT) |
DM1004 | 行数 |
DM1005 | 列数 |
DM1006 | ワークカウント(0スタート) |
ピッチ幅をFLOATにしているのがポイントです。 今回は50mmと80mmなので整数ですが、品種によっては62.5mmのような値になります。そこを最初から見込んでおくと、あとでプログラムを作り直さずに済みます。
スクリプト(前半)
'---- 1. 何列目・何行目かを出す ---- DM1010 = DM1006 MOD DM1005 ' 列の位置(余り) DM1011 = DM1006 / DM1005 ' 行の位置(商) '---- 2. 基準位置からのシフト量を出す ---- DM1012.F = DM1010 * DM1000.F ' X方向のシフト量 DM1014.F = DM1011 * DM1002.F ' Y方向のシフト量
4行です。 パレットが何列何行になっても、この4行は変わりません。変わるのは DM1000〜DM1005 の中身だけです。
3. グループ入力で渡すときの2つの壁
計算はできました。次はこれをロボットに渡します。
グループ入力(GI)とは
ロボットの入力信号は、ふつう1本ずつオン・オフを見ます。これだと数字が送れません。
そこで、入力を何本かまとめて1つの数値として扱うのがグループ入力です。読み込む命令は1行だけです。
レジ[1] = GI[1]
FANUCの取扱説明書には「指定したグループ入力信号の2進数の値を10進数に変換して、レジスタに入れる」と書かれています。変換はロボットがやってくれます。
ただし、この仕組みには制約があります。2進数を10進数に変換するだけなので、運べるのは0以上の整数だけです。
✗ 小数(12.5mm など)
パレタイズだと、基準点の取り方によってマイナス方向にずらしたい場面が必ず出ます。 品種が変わればピッチに小数も出ます。ここを最初に決めておかないと、後で作り直しになります。
壁1:マイナスは、符号のビットを別にもらう
「プラスかマイナスか」を伝える信号を、X用とY用に1本ずつもらいます。
| PLC側 | ロボット側 | 内容 |
|---|---|---|
W06.0 | DI[1] | Xがマイナス |
W06.1 | DI[2] | Yがマイナス |
PLC側は、マイナスだったらビットを立てて、値そのものは絶対値にしてから送ります。
'---- 3. X:符号を判定して絶対値にする ---- IF DM1012.F < 0 THEN W06.0 = 1 ' マイナスであることを伝える DM1012.F = DM1012.F * (-1) ELSE W06.0 = 0 END IF
この形にしておくと、画面に出る数字が、そのまま実際のずらし量になります。 トラブルのときに読み替えが要りません。1本目で「ロボットは単純なほうが、後で助かる」と書いたのと同じ考え方です。
壁2:小数は、整数部と小数部を分けて送る
小数はそのまま送れないので、整数の部分と小数の部分を別々のグループ入力で送ります。
| 信号 | 内容 |
|---|---|
GI[1] | Xシフト量の整数部 |
GI[2] | Xシフト量の小数部 |
GI[3] | Yシフト量の整数部 |
GI[4] | Yシフト量の小数部 |
分け方にはコツがあります。小数のままでは分けられないので、先に100倍して整数にしてしまいます。 あとは割り算と余りで分かれます。
'---- 4. X:整数部と小数部に分ける ---- DM1020.D = DM1012.F * 100 ' 100倍して整数にする DM1022 = DM1020.D / 100 ' 整数部 → GI[1] DM1023 = DM1020.D MOD 100 ' 小数第2位まで → GI[2]
今回のピッチは50mmと80mmなので、小数部は常に0です。 それでもこの仕組みを入れているのは、ピッチが62.5mmの品種が来ても同じプログラムのまま動かせるようにするためです。
スクリプト全体
'============================================================== ' パレタイズ シフト量算出 ' 入力 : DM1006(カウント) DM1000/DM1002(ピッチ) DM1005(列数) ' 出力 : DM1022/DM1023(X) DM1032/DM1033(Y) W06.0/W06.1(符号) '============================================================== '---- 1. 何列目・何行目かを出す ---- DM1010 = DM1006 MOD DM1005 ' 列の位置(余り) DM1011 = DM1006 / DM1005 ' 行の位置(商) '---- 2. 基準位置からのシフト量を出す ---- DM1012.F = DM1010 * DM1000.F ' X方向のシフト量 DM1014.F = DM1011 * DM1002.F ' Y方向のシフト量 '---- 3. X:符号を判定して絶対値にする ---- IF DM1012.F < 0 THEN W06.0 = 1 DM1012.F = DM1012.F * (-1) ELSE W06.0 = 0 END IF '---- 4. X:整数部と小数部に分ける ---- DM1020.D = DM1012.F * 100 DM1022 = DM1020.D / 100 ' 整数部 → GI[1] DM1023 = DM1020.D MOD 100 ' 小数第2位まで → GI[2] '---- 5. Y:同じことをする ---- IF DM1014.F < 0 THEN W06.1 = 1 DM1014.F = DM1014.F * (-1) ELSE W06.1 = 0 END IF DM1030.D = DM1014.F * 100 DM1032 = DM1030.D / 100 ' 整数部 → GI[3] DM1033 = DM1030.D MOD 100 ' 小数第2位まで → GI[4]
PLC側はこれで終わりです。ラダーではなくスクリプトで書くと、計算だけをまとめて読めるので後から追いやすくなります。
4. ロボット側:24行だけ
1: レジ[1] = GI[1] ← Xシフト量の整数部 2: レジ[2] = GI[2] ← Xシフト量の小数部 3: レジ[3] = GI[3] ← Yシフト量の整数部 4: レジ[4] = GI[4] ← Yシフト量の小数部 5: レジ[2] = レジ[2] / 100 ← 小数に戻す 6: レジ[4] = レジ[4] / 100 ← 小数に戻す 7: レジ[1] = レジ[1] + レジ[2] ← Xを1つの数値にまとめる 8: レジ[3] = レジ[3] + レジ[4] ← Yを1つの数値にまとめる 9: IF DI[1] = オン THEN ← Xがマイナスなら 10: レジ[1] = レジ[1] * (-1) 11: END IF 12: IF DI[2] = オン THEN ← Yがマイナスなら 13: レジ[3] = レジ[3] * (-1) 14: END IF 15: イチレジ[2] = イチレジ[1] ← 基準を作業用にコピー 16: イチレジ[2,1] = イチレジ[2,1] + レジ[1] ← X方向へずらす 17: イチレジ[2,2] = イチレジ[2,2] + レジ[3] ← Y方向へずらす 18: カクジク イチ[1] 100% イチギメ ← 供給位置へ取りに行く 19: RO[1]=オン ← ワークをつかむ 20: タイマ 0.50(sec) ← つかみ切るまで待つ 21: カクジク イチレジ[2] 100% イチギメ ← 計算した置き場所へ 22: RO[1]=オフ ← ワークを離す 23: タイマ 0.50(sec) ← 離し切るまで待つ 24: [オワリ]
3つのかたまりに分かれています
1〜14行目:受け取る
グループ入力から4つの数字を読んで、小数に戻して、符号を直します。
15〜17行目:計算する
2本目でやったこととまったく同じです。基準をコピーして、XとYにずらし量を足します。違うのは、足す数字がPLCから来ていることだけです。
18〜24行目:動く
取りに行って、つかんで、計算した場所へ行って、置きます。
⚠️ 足し算と割り算は、同じ行に書けません
5〜8行目を見て「4行もいらないのでは」と思われたかもしれません。こう書きたくなります。
レジ[1] = レジ[1] + レジ[2] / 100 ← これは書けません
書けません。 FANUCの取扱説明書に、こう書かれています。
+と-は同じ行に混ぜられる。*と/も混ぜられる。ただし+-と*/を同じ行に混ぜることはできない。
割り算と足し算が同じ行に来るので、必ず分ける必要があります。 これは知らないと詰まります。
ほかにも制約があります。
- 1行に書ける演算子は5つまで
- 数値レジスタは整数も小数も持てる(だから小数に戻す処理が成り立ちます)
いちばん見てほしいのは、ここに無いもの
繰り返しがありません。
2本目では ラベル と ジャンプ で5個ぶん回していました。今回は1個置いたら終わりです。
ロボットは「これが何個目か」を知りません。知らなくていいのです。次にどこへ置くかは、次のサイクルでPLCが数字で教えてくれます。
60個でも600個でも、このプログラムは24行のままです。
ここでは考え方を分かりやすくするため省いています。いきなり目的の高さへ動かすと、すでに置いてあるワークに当たります。
5. 値をいつ読むか
地味ですが、間違えると原因の分かりにくいトラブルになります。
サイクルの先頭で一度だけ読む
私は、1個取りに行く前に、その回で使う数字をまとめて読みます。 プログラムの1〜4行目がそれです。読んだあとは、動作の途中で読み直しません。
PLCが数字を書き換えるのは、1個置き終わったあとだからです。ロボットが動いている間、PLC側の数字は変わりません。
⚠️ やってはいけない書き方
動作命令の直前で読み直すことです。 つかんでいる間にPLC側が値を更新すると、取りに行ったときと置きに行くときで別の数字を使ってしまいます。
しかもこれは、タイミングが合ったときだけ起きます。 100回に1回だけ変な場所へ行く、という一番やっかいな出方をします。
読むのは先頭でまとめて。 これを守るだけで防げます。
6. なぜPLC側で計算するのか
ここからが今回の本題です。列と行の計算はロボット側でも書けます。 2本目でやったとおりです。それでも私はPLC側に寄せています。
理由1:途中から再開しやすい
パレットの途中で止まったとき、DM1006 のカウントを直せば再開できます。 タッチパネルから数字を入れ直すだけです。ロボットのプログラムには触りません。
現場で止まったとき、ロボットのプログラムを開かずに済むのは大きいです。教示操作盤を触れる人は限られています。
理由2:品種が増えても、ロボットは1本のまま
製品が変われば、ピッチも並べ方も変わります。変えるのは DM1000〜DM1005 の5つだけです。ロボットのプログラムは24行のままです。
ロボット側で組んでいると、品種の数だけプログラムが増えていきます。
理由3:あとから見える
PLCの中の数字は、タッチパネルにもパソコンにも出せます。 「何時に何個目でエラーが出たか」を記録として残せます。
ロボットの中のレジスタは、教示操作盤の画面を開かないと見えません。
理由4:教示するのは基準の1点だけ
パレットの位置を直したいとき、基準点を1つ教え直すだけで済みます。2本目で書いた「基準用の番号は絶対に書き換えない」が、ここで効いてきます。
正直に書くデメリット
- 見る場所が2か所に増えます。 トラブルのとき、PLCとロボットの両方を確認する必要があります
- PLC側の作り込みが増えます。 列と行の計算、符号、小数の分割は全部PLCの仕事になります
- ロボット単体で試運転できません。 PLCから数字が来ないと、ロボットは基準点にしか行きません
PLCを触れる人がいない現場なら、この構成は向いていません。 素直にロボット側で組むか、次に書く標準機能を使ってください。
7. FANUC標準のパレタイズ機能との比較
FANUCには、パレタイズ専用の機能が最初から入っています。 1本目で「いずれ比較します」と書いた話です。ここで正直に扱います。
標準機能でできること
まず、できることを認めます。 四隅などの数点を教えるだけで、格子状の積み位置を自動で作ってくれます。教示は圧倒的に楽です。
ここから先はFANUCの取扱説明書(基本操作編)に書かれている内容です。私自身は標準機能で組んだことがないので、実機で確かめたわけではありません。採用する前に、ご自身の機種のマニュアルで確認してください。
私が当初「できない」と思っていたことも、読んでみたら書かれていました。
| できること | 取扱説明書に書かれていること |
|---|---|
| いま何個目を積んでいるか見る | パレタイズレジスタの画面が、現在の値を表示する |
| 積み位置を指定し直す | 画面でカーソルを合わせて値を入力できる。プログラムからも PL[1] = [1,2,1] の形で書き込める |
| 特定の位置だけ飛ばす | パレタイズレジスタを条件にした分岐命令がある |
条件分岐には余り指定という仕組みまであります。「2で割った余りが0」つまり偶数列だけを対象にする、といった指定ができます。
積み位置を指定し直せるということは、積み途中から再開できるということです。「標準機能では途中から再開できない」と説明されることがありますが、少なくとも取扱説明書を読むかぎり、仕組みとしては用意されています。
ただし取扱説明書には、「パレタイズレジスタはプログラムの中で使われている。システムの中でどう使われているかを確認せずに値を変えてはならない」という警告も併記されています。触る前に、そのレジスタがどこで使われているかを必ず確認してください。
それでも私が計算方式を選ぶ理由
できないから使わないのではありません。構成として合わないから使いません。
理由1:積み方の情報が2か所に分かれる
標準機能を使うと、積み方の情報はロボットの中にあります。生産計画や在庫はPLCにあります。同じ「いま何個目か」が2か所に存在することになり、ズレたときに厄介です。
理由2:品種が増えると番号を食う
パレタイズ番号は1〜16です。品種ごとに登録していくと、意外と早く埋まります。
理由3:うちはもともとPLCが全部知っている
生産計画も、在庫も、次に何を作るかも、すでにPLCが持っています。そこにパレタイズの計算を足すのが、いちばん自然でした。
どちらが正しいという話ではありません
パレタイズ単体で完結する設備なら、標準機能のほうが早いです。 教示も楽で、プログラムも短くなります。
生産全体をPLCで管理しているなら、計算方式のほうが後で楽です。
判断の分かれ目は、「いま何個目か」を誰が持つのが自然かだと思っています。設備の作りを見て決めてください。
8. よくあるつまずき
数字は届いているのに、10倍ずれた場所へ行く
小数部の桁数を疑ってください。 PLC側が100倍で送っているのに、ロボット側で10で割っていると合いません。
グループ入力は数字をそのまま渡すだけで、単位という概念がありません。どちらの桁で送るかは、最初に文書で決めておいてください。
マイナス方向にだけ行かない
符号のビットを見ていないか、ビットの割付が合っていません。X用とY用を取り違えていることもあります。
100回に1回だけおかしい
5章のとおりです。動作の途中で読み直していないか確認してください。毎回起きないので、原因にたどり着くまで時間がかかります。
PLCの数え方と実際がズレる
ロボットが置けなかったのにPLCが数えてしまうと、以降ずっとズレます。「置けた」という結果をロボットから返して、それを見てPLCが数えるようにしてください。
電源を入れ直したら変な場所へ行った
2本目に書いたとおり、位置レジスタの中身は電源を切っても残ります。 作業用の番号を使う前に必ずコピーし直してください。プログラム15行目がそれです。
いきなり全速で流さない
計算で座標を作る以上、思っていたのと違う場所に行くことがあります。 PLC連携を組んだ直後は、必ず低速で1サイクル試してください。
特に、PLC側の数字を手で入れて、狙った場所に行くかを先に確かめると安全です。
9. まとめ
今回のこと
- カウントを列数で割るだけで、行と列が同時に出る。折り返しの処理は要らない
- グループ入力の読み込みは
レジ[1] = GI[1]の1行 - ただし0以上の整数しか運べない。 マイナスは符号ビット、小数は整数部と小数部に分ける
- ロボット側では
+-と*/を同じ行に書けない - 値を読むのはサイクルの先頭で一度だけ
- ロボット側に繰り返しは要らない。 判断はPLC、動作はロボット
- 標準パレタイズ機能でも途中再開も飛ばしもできる。それでも計算方式を選ぶのは、情報を1か所にまとめたいから
シリーズ3本を通して
このシリーズで一貫して書いてきたのは、機能の使い方ではなく、どちらを選ぶかという話でした。
- 1本目:教示点で並べるか、位置レジスタにするか
- 2本目:計算でずらすか、位置補正命令にするか
- 3本目:ロボットで計算するか、PLCに任せるか
どれも「標準機能でもできる」ものばかりです。 それでも別の道を選ぶときは、理由を説明できることが大事だと思っています。
後から入った人が「なんでこう組んだんだろう」と悩まないように。設備は、作った人より長く動きます。
関連記事
シリーズ1本目です。位置レジスタとは何かから説明しています。
シリーズ2本目です。今回の15〜17行目は、この記事の内容そのものです。
今回の前提になる記事です。ロボットとPLCをEtherNet/IPでつなぐ設定を説明しています。GI や DI の割り付けは、この設定があって初めて使えます。
お問い合わせ
設備の自動化やロボットの導入でお困りごとがあれば、お気軽にご相談ください。

