本文へ移動
サポートシェアリングソリューション
OKWAVE Plus

このQ&Aは役に立ちましたか?

ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:IF文のよる瞬停)

IF文による瞬停の解決方法とは?

2023/10/19 01:49

このQ&Aのポイント
  • MORISEIKIのNV5000(制御盤FUNUC MSX-501)にて、IF文による瞬停現象が起こります。
  • 同プログラムで三菱(MELDAS)の制御盤MCではスムーズに動作するのに対して、FUNUCでは厳しいようです。
  • プログラムの記憶容量が128KBのため、コンパクトなIF文を作成したいです。
※ 以下は、質問の原文です

IF文のよる瞬停

2012/02/18 15:17

MORISEIKIのNV5000(制御盤FUNUC MSX-501)にてカスタムマクロを使用していますが、
下記のIF文で瞬停の現象が起こりスムーズに動きません。
同プログラムで三菱(MELDAS)の制御盤MCではスムーズに動くのですが、、、

G08P1 先行制御をマクロ前に指令しても変わりません。


IF[[[#22/2]-#18]GE#29]THEN#33=0
IF[[[#22/2]-#18]LT#29]THEN#33=[#29-[[#22/2]-#18]]
IF[[#29*2]GE#22]GOTO123

IF文が3行続くとFUNUCでは厳しいのでしょうか?
プログラム記憶容量(メインファイル)が標準の128KBなのでできるだけ
コンパクトにしたいのですが、、、、
宜しくお願い致します。

IF文による瞬間停止の間違いです。

瞬時停電とは違います。(誤使用で申し訳ありません)

質問者が選んだベストアンサー

ベストアンサー
2012/02/18 16:33
回答No.1

N123はこのIF文よりも前にあったり、若しくは遠い位置だったりしますか?
構文的な問題ではなく、単にジャンプ先の検索に時間掛かってるだけの様に思います。
これが原因であれば対策としてはジャンプ先を出来るだけ近い所にするくらい。
どうしても戻らないといけない場合にはDO~ENDで組むと大分速くなります。


あと、マクロ文の処理に関して先行制御は恐らく何も寄与しないはずです。


# しいて言えば[]が冗長ですが、それで目立って遅くなるという事はありません。が、コンパクトにしたいなら外すべし。

# しかし、全体を見ないと何とも言えませんが、ちょっと不思議な事をしているような気が...

「出来るだけコンパクトに」とあったのでもうちょっとだけ。

#22/2-#18
という演算が3回も出てきているので、別変数に入れてしまった方がスッキリ。

#1=#22/2-#18
IF[#1GE#29]THEN#33=0
IF[#1LT#29]THEN#33=#29-#1
IF[#29*2GE#22]GOTO123

で、更に良く見ると
IF[#1GE#29]
IF[#1LT#29]
この2つのIF文は排他的。
ELSEがあると直感的に書けるけどFANUCには無いので、この場合

#33=0
IF[#1LT#29]THEN#33=#29-#1

でも良く無いですか?

以上、若干ですが文字数&演算回数削減

念のため確認しますが、GOTOをWHILE~ENDに置き換えて改善出来るのは、GOTOで後ろ(=戻る方向)に飛ばしている部分だけです。

18i世代までのNCでは、GOTOの検索があまり速くないんですが、ENDからWHILE(DO)に戻る時には行数関係無く、殆ど時間を要しません。
(因みにWHILEの条件式が偽となってENDに飛ぶ時はGOTOと一緒です)

またGOTOはその場から順方向(下方向)にジャンプ先を探すので、GOTO先が後ろにあると、グルっと1周してくるので遅くなりがちです。
(まあそれも順方向に数えていった時の行数次第ですが)

GOTOの検索が遅いと言っても、流石に十数行程度ならそう時間を食うわけじゃないので、改善の余地はそう無いかも。

現役世代の31iとかですとそもそもGOTOの検索がだいぶ速いので何も考える必要は無いのですが...


あとは上手く先読み生かしてNC文の実行中にマクロ文の処理が進むようにするくらい。
バッファリングを止めるMコードなどを使っている場合にはマクロを処理させるタイミングに注意。

すみません。
前とか後ろとか、何だかごっちゃになってしまってますね。
何パターンか例を載せるので、それで読み取って下さいw;

------------------------------------------

N100 IF[#0EQ#0] GOTO200
;
;
N200



N100 WHILE[#0NE#0] DO1
;
;
N200 END1

は同じ時間で N100から N200にジャンプします。

------------------------------------------

N100
;
;
N200 GOTO100



N100 DO1
;
;
N200 END1

では END→DOの方が速くN100に戻ります。

------------------------------------------

ループを数回繰り返してから抜ける様な場合、

N100 #1=0
N101 WHILE[#1LT#2] DO1
;
;
N199 #1=#1+1.
N200 END1
N201

よりも

N099 #1=0
N100 IF[#1GE#2] GOTO202
N101 DO1
;
;
N199 #1=#1+1.
N200 IF[#1GE#2] GOTO202
N201 END1
N202

の方が“最後のループから抜ける時の処理時間”が短いです。
ループの中身が比較的長く、また抜ける際の処理時間が
問題となる様な場合には使えるんじゃないかと思います。

ただ、バグの潜みやすい書き方なのであまりオススメしません...

お礼

2012/02/19 09:05

ありがとうございます。
やはりG08は意味がないのですね、、

弊社約20台のMCがあり、森・オークマで制御盤はFUNUC,MELDAS,OSPとバラバラで(オークマFUNUCもあり)20年戦士も数台あり、今回加工内容が統一された
マクロを作成すべくこのような内容になってしまいました。。
(事前に説明がなくすいません)

変数置き換えは#33まで使い切っているので、#100~に踏み込んだ方が
よさそうですね。
IF文の排他的アドバイス活用させていただきます。
最終的に[]で行を囲わないとアラームがでたり、論理演算が使用できない機種もあり、そもそも統一事態が厳しいのかもしれませんね。

N123は近いとこに置いてあるのですが、WHILEに変えてみます。
しかし同世代のMELDASはかなりスムーズなのに、、、

解りやすい解説有難うございます。
予備知識として勉強になりました。

質問者

このQ&Aは役に立ちましたか?

この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。

質問する

その他の回答 (4件中 1~4件目)

2012/02/19 10:59
回答No.4

  IF[[[#22/2]-#18]LT#29]THEN#33=[#29-[[#22/2]-#18]]
THEN は昔のマニュアルには無い隠し構文で、使い方として変数への単純代入だけは問題無さそうというのが参考書に出ていて知りました。
機械メーカ作成のM指令でも、THEN を使わず GOTO のみで書かれているのを見ました。

括弧は4重までという制約は、使いすぎると構文解析作業でスタックメモリを消費するのを防ぐという理由からで、そのせいでもTHEN 以下を複雑にし過ぎるのは動作に危うさがあると思います。

CPUが古いFANUCなら問題有りで、パソコンCPUを使いハード指標ではダンチの能力を有するMELDASなら難なく通すというのも納得できる話です。

>指令先を近場に置いていればたいして処理速度に変化はなしってことですね

実験したことあるけど、この違いも大きいです。NC共通だろうけど、都度シーケンスNo.をアタマから探す単純作業を繰返しますから。

>メーカーにより一長一短ってことですかね

ハード的にもコスト的にも性能低いCPUが使える、業界ダントツな特権ですね。

お礼

2012/02/20 10:00

メーカーにより一長一短ってことですかね。
そうなるとGOTOからWHILEに変えたとしても、
指令先を近場に置いていればたいして処理速度に変化はなしってことですね。

有難うございます。
その辺りは全く考慮しておらず浅はかでした。
少し反れますが、MELDASのタップ戻し機能にはビックリしました。

質問者
2012/02/19 09:12
回答No.3

うーんと
私の読んだ感じは

先読みにより変数が変化する前により
if 文内が評価されてしまう

まあ、よくあることだと思ってましたが

お礼

2012/02/20 09:55

つまり先読みされてないってことですよね。

質問者
2012/02/18 21:08
回答No.2

(1)さんの完璧な回答/追記の内容に100%賛同いたします。
(素晴らしいです)

IF文3連発で、機械(NC)がしゃっくりを起こすのは、制御装置の
ランクによっては考えられる現象でしょう。
(1)さんが言及されている通り「IF」文よりも「WHILE DO ~ END」文
を上手に活用することを強くお勧めします。

下記
>変数置き換えは#33まで使い切っているので、
>#100~に踏み込んだ方がよさそうですね。
ですが、加工位置決めや加工回数のカウンタを司る値など、
プログラム途中でリセットしてしまった場合の途中再開時
の手がかりになる変数を、#100~のコモン変数に変更され
れば良いと考えます。

お礼

2012/02/19 08:30

ありがとうございます。
我流ですのでWHILEに変更していきたいと思います。

質問者

お礼をおくりました

さらに、この回答をベストアンサーに選びますか?

ベストアンサーを選ぶと質問が締切られます。
なおベストアンサーを選びなおすことはできません。