キーエンスPLCで2次元配列

今回はキーエンスPLCでの変数機能を使った2次元配列プログラムを紹介する。

例えばPLCでのパレタイジング処理(箱などに物をぶつからないように順番に積んでいく制御)で、現在の箱詰め状態をタッチパネルに表示したいとする。

そのとき変数機能を使った2次元配列が便利だ。最近のPLCはどのメーカーもデバイス番号(デバイスメモリ)のみならず変数が使用できる。今関わっている案件でも変数を多用している。

例えばキーエンスのタッチパネルVTでは変数を割り当てることができる。(画像のようにVARを指定する。)

パレタイジング状態を示す各セル部分を2次元配列(縦×横)の変数にして設定しておく。

そしてPLC側で変数を登録する。(今回はキーエンスKVスタジオで紹介する。)

今回は8行×7列(添え字は[0~7]×[0~6])の2次元配列を使う。

後はPLC側でKVスクリプトやST言語で2次元配列を使って表示する。今回の案件では各ロボット移動座標も8×7の56ポイント対応を行ったが、2次元配列を使ったため、連日の終電残業の中、疲れた頭脳でも簡潔にプログラムを組むことができた。

今のPLCは変数のみでプログラムを組むことも可能だ。ただそれはやりすぎなのかなあと思ったりもする。変数が使えなかった時代の古いプログラムの改修も我々には大事な仕事であり、デバイス番号と変数のいいところを折衷して、ファンクションブロックも含めて、これから模索していくことになるだろう。

三菱サーボで押当て制御

今回は三菱PLCのユニットRD77MS4でサーボ押当て制御を紹介する。

例えばサーボZ軸を下降させながら、ネジ締めなどを行う場合に使用される。

具体的には位置決め動作中(Z軸ネジ締め開始位置の少し手前まで位置決め動作で下降させる)に、モータを停止させずにトルク制御に切換える方法として使用される。

「押当て制御モード」といわれる。

ラダーは以下となる。

・バッファアドレス#4390(目標トルク指定)→今回は10%指定
・バッファアドレス#4393(押当てモード切換え条件)→今回は「送り現在値」
・バッファアドレス#4394(押当て切換え条件パラ)→今回は送り現在値が20mmでトルク制御に切り替える。

・バッファアドレス#4375(制御モード指定)→今回は30(押当て制御モード)指定

制御モード指定は以下となる。
 0: 位置制御モード
 10: 速度制御モード
 20: トルク制御モード
 30: 押当て制御モード

そして制御モード切換え要求フラグ(バッファアドレス#4374の0ビット)をONにする。

ちなみにRD78G4のPLCopenでプログラムを組むときは、MC_TorqueControlのOptionsで押当て制御モードを指定する。

三菱サーボで自動生成カム

今回は三菱PLCのユニットRD77MS4で自動でカムデータを生成する方法について紹介する。

カムデータは、三菱シンプルモーションユニット設定で自分で作成するほかに、複雑な曲線は自動生成することができる。次の自動生成カム種別がある。

1.ロータリーカッター
2.ロータリーカッター(中央基準)
3.簡易ストローク比カム
4.詳細ストローク比カム

例えば、ロータリーカッター(回転しながら切断するサーボモーター)の同期カム動作は複雑だが、自動生成できる。

自動生成は以下のようにラダーを組んで行う。

1.バッファアドレス#53201→自動生成するカム番号を格納する。
2.バッファアドレス#53202→自動生成カム種別(上記)を格納する。
3.バッファアドレス#53204→カム分解能を格納する。
4.バッファアドレス#53206→シート長を格納する。
5.バッファアドレス#36472→1サイクル長を格納する。
6.バッファアドレス#53208→シート同期幅を格納する。
7.バッファアドレス#53210→同期長軸を格納する。

8.バッファアドレス#53212→同期開始位置を格納する。
9.バッファアドレス#53214→同期区間増速率を格納する。

そしてカム自動生成要求フラグ(バッファアドレス#53200の0ビット)をONにする。

三菱シンプルモーションユニット設定に自動生成されたカムデータが表示される。

三菱サーボ同期中にマーク検出

今回は三菱PLCのユニットRD77MS4でサーボ同期中に回転サーボコンベアの現在位置をマークセンサーで検出する方法について紹介する。

例えば、ロータリーカッター(回転しながら切断するサーボモーター)で切断するシートに印刷されたレジマーク(=切断シート長の中に1か所だけマークする)をセンサーで検出し、もしシートがずれていればサーボ補助軸(サーボ仮想軸)で位置補正するのに使用される。

※マークセンサーで検出した回転サーボコンベアの現在位置からマーク間の長さを算出し、切断シート長とずれていれば、その差分をサーボ仮想軸で同期させ移動させる。

ではマークセンサーで回転サーボコンベアの現在位置をどのように検出するかだが、マークセンサー入力をPLCの汎用入力(X番)にいれてラダーで回転サーボコンベアの現在位置を取得するのはNGだ。

ラダーのスキャン時間によって正確にデータ取得できないためである。

割り込みプログラムを組む手もあるが、今回は三菱シンプルモーションユニット設定で用意されているマーク検出機能について紹介したい。

まずRD77MS4の三菱シンプルモーションユニット設定でマーク検出設定を行う。

そしてマークセンサーをどこに配線するかだが、RD77MS4の外部入力接続用コネクタ(DSUBコネクタ)のDI1の端子に配線する。
※DI1をどのSINピンにするか割付け任意に変更可。

そして以下のようにラダーを組む。D4にマーク検出幅が格納される。

マーク検出回数(バッファアドレス#54960)、マーク検出データ(バッファアドレス#54962)を前回値と比較し、(今回値)-(前回値)でマーク検出幅を取得する。

キーエンスサーボで同期中にカムデータ切り替え

今回はキーエンスMECHATROLINK-IIIのユニットKV-XH16MLで同期中にカムデータを切り替える方法について紹介する。

例えば同期中に外部エンコーダによって直線カムでサーボ同期していたものを、ある時点で同期したままバックさせるカムデータに切り替えるとき、利用される。

サーボ走行切断のときは、切断後一旦サーボ同期を解除して位置決めでゼロ点位置まで戻す方法もある。
※実際、この方式でうまくいっているものもある。

しかしこの方法は繰り返しになるが、一旦サーボ同期を解除しなければならない。
※サーボ同期したまま、クラッチをOFFにしてもサーボは単独で位置決めできない。クラッチOFFは同期から離れるだけ。
 
同期中にカムデータを切り替えるプログラムを以下に示す。

同期カム切替番号(バッファアドレス軸1なら#40050)、
同期カム切替位置(バッファアドレス軸1なら#40052)を指定して、
同期カム切替要求リレーをONするだけである。

同期カム切替番号はカム番号を入れればいいだけだが、同期カム切替位置は制御点番号を指定しなければならない。
制御点番号とはカム分解能のうち、どの位置かを示すものである。

オムロンタッチパネルNSでのDMインデックス設定

タッチパネルで品種ごとのレシピ設定を行うときに、品種が200個あれば200ページの画面を作らず、1ページで書込表示データメモリのインデックスを切り替えて対応することが多い。

したがって各社タッチパネルにデータメモリのインデックス設定がある。

  • キーエンスタッチパネルVTでは間接参照
  • 三菱タッチパネルGOTではオフセット
  • シュナイダー(旧デジタル)GPでは演算用ワードアドレス
  • 富士電機(発紘電機)Vではオフセット

上記タッチパネルはプログラムレスでインデックス設定が実現できる。

しかしながらオムロンタッチパネルNSは、上記メーカーのようなインデックス設定がない。

ただオムロンタッチパネルNSでも書込表示データメモリのインデックスを切り替える方法があるので、今回紹介したい。

オムロンタッチパネルNSは、CX Designerとよばれるアプリを使用して作成する。
※CX Oneをインストールすればインストールされているが、最新版にアップデートしておくとよい。

数値表示&入力部品をダブルクリックし、インデックス修飾したい通信アドレス(例ではEM10000)の後ろにi0~i9(例ではi0)を加えるとインデックス修飾したことになる。

このi0~i9はタッチパネル内の変数である$SW27~$SW36に該当しており、$SW27~$SW36にインデックス番号を格納すると、書込表示データメモリのインデックスが切り替わる。

ただし、インデックス番号はBCD形式で格納しないといけない。

インデックス番号をPLCデバイスと紐づけするにはNSマクロと呼ばれるプログラムをCX Designerで書かないといけない。
今回は品種編集ボタンを押したときPLCデバイスDM10126(PLCラダー内でBCDに変換済み)からインデックス番号を取得し$SW27に書き込む例を示す。

ボタンをダブルクリックし、「マクロ」タブのマクロ実行条件でタッチON時のマクロ編集を行う。ここで書いたプログラムのREADCMEM($SW27,[SERIALA:DM10126],1);というのは、
DM10126の値を$SW27に読み込んでいる意味である。

文字列表示&入力部品でも同様に設定可能だ。

オムロンCJ2でのシリアル通信

オムロンPLC CJ2ではPLC本体あるいはCJ1W-SCU**のシリアル通信ユニットで温調器などとシリアル通信するが、基本的には無手順のときはTXD(U)命令(=送信)、RXD(U)命令(=受信)を使用してシリアル通信を行う。

しかしながらキーエンスPLCのプロトコルスタジオのようにプログラムレスで送受信データの組み立てや切り分けを行いたい。

そこでオムロンにもプロトコルマクロと呼ばれる機能があるので今回紹介する。
ただし、細かい設定はここでは触れない。
※細かい設定はオムロンFAサイトから「CX-Protocol Ver. 2.0 オペレーションマニュアル」をダウンロードし3-5章を参照されたい。

まずプロトコルマクロの送受信データ定義はCX-Protocolと呼ばれるアプリを使用する。
※CX Oneをインストールすればインストールされているが、最新版にアップデートしておくとよい。

ここでシーケンスを新規作成する。今回の例では送信メッセージE5Z_read、受信メッセージE5Z_recvを定義しており、リピートカウンタに8を指定することで、1シーケンス実行時に8回送受信を行う定義にしている。

送信メッセージE5Z_readの定義である。
ヘッダやターミネータもプログラムレスで設定できる。
またラダーで書くと大変手間のかかるチェックコードもプログラムレスで設定できるのがありがたい。
アドレスのR(1)は後で述べるPMCR命令のパラメータ指定送信データメモリ+1ワードのデータを表している。

受信メッセージE5Z_recvの定義である。
データのW(2N+1)はPMCR命令のパラメータ指定受信データメモリ+(2N+1)ワードのデータを表している。
Nは上記で紹介したシーケンス定義のリピートカウンタ数である。
送受信を最大8回繰り返すたびに値が変化する。

この定義をCX-ProtocolでPLCへ転送する。
またCJ1W-SCU**のシリアル通信モードをプロトコルマクロにしておく。

ラダーではPMCR命令を書くだけである。
例では定義したシーケンスNo.0を実行している。
送信データD700に送信データCH数、D701~送信データを格納する。
受信データD800に受信データCH数が格納され、D801~受信データ本体が格納される。

富士電機PLCの更新

富士電機のPLCは古いFシリーズと現行のSXシリーズがある。

今回はF→SXに更新する際に注意しないといけないことについて紹介する。

ちなみに富士電機のPLCが使われている設備は関西ではほとんど見ることはないが、関東のプラントや船舶関係の電気設備では一定の無視できないシェアがある。

富士電機のPLC通信ネットワークにはPリンク(他PLCでいうPLC間リンク)、Tリンク(他PLCでいうCCリンクみたいなもの)という独特の通信方式が使われており、関東の大規模プラント設備では追加電気設備を入れる際、富士電機のPLCであることが求められる。

F→SXに更新する際に注意しないといけないことだが、更新することでIOのビット位置が全て反転することである。

例えば0ビット目の信号がSXでは15ビット目に、1ビット目の信号がSXでは14ビット目にといった具合に1ワード(=16ビット)単位でIOのビット位置が全て反転する。

ハードのIOについてはリニューアルツールNP8RE70A-401、NP8RE70A-402を使うことでソフト変更しなくても救える。但し、コネクタを挿す方向が180度反転する。

問題はPリンクのIOだ。これはソフト変更しないと救えないが、全てラダーで変換するのは大変な労力である。

そこでファンクションブロックBIT_CHGNが用意されている。下の例ではWL0からWM0分のワードデータを変換してWL100からWM0分のワードデータに格納する。

ちなみに(2回目)、富士PLCのSX-ProgrammerではファンクションブロックもST言語もサポートされており、シーメンスや三菱電機、オムロン、キーエンス(最近ST言語をサポートした)とも共通だ。

IAIのSEL言語

IAIロボシリンダのPCON,SCONやRCONはPLCからCC-LINKやETHERNET/IPで
割り当てられた信号やデータを読み書きすれば制御できるが、
ASELシリーズはいくらPLCから指令しても、
内部にSEL言語でプログラムを組まないと動作しない。

以下SEL言語のプログラム例だ。
※PPUT(位置データ設定)は、No.199箱から読み出す。
 INBはNo.99箱へ読み出す。

No. B E N Cnd Cmnd Operand1 Operand2 Pst Comment
1 TAG 1 Main
2 TAG 2 動作開始動作
3 INB 64 8 (移動量 0.1mm)
4 LET 199 *99
5 DIV 199 10
6 PPUT 1 1 目標位置設定
7 INB 96 8 (速度 1mm/sec)
8 LET 1 *99
9 PVEL *1 1 移動速度設定
10 BTOF 302 位置決め完了OFF
11 MOVL 1 ポジション1 動作開始
12 BTON 302 位置決め完了ON
13 GOTO 1 Mainへ戻る
14 EXIT