• 締切済み

シーケンサのサブルーチンについて

シーケンサのサブルーチンについて 三菱FXシリーズで勉強中です。 命令解説書によると、サブルーチンや割込みルーチン内でONさせたデバイスは、ルーチンを終了した後も保持されている。なお、リセット命令を実行するとリセット状態も保持される。従って、これらのデバイスは、ルーチン終了後メインプログラムの中でリセットするか、ルーチン内にリセット命令やOFF実行のためのシーケンスをプログラムしなさい。となっています。 このこと自体が相当に違和感があって、即座に納得しずらい内容ですが、それでもPLCとはこういうものかと無理やり納得しようとしています。 それでもどうにも納得できないのが、「OFF実行のためのシーケンスをプログラムしなさい」と言って、M8001にリセット命令(B命令の部分)を入れた点です。 もし、B命令が無ければX001の4~7パルスの間C0はゼロのままだそうです。 そもそもセット/リセット命令はそれを実行した時点で値を設定すれば終わりで、効果が持続する概念が理解できません。更にもっと不思議なのが、B命令です。M8001は常時OFFですから、Bのリセット命令は実行されないが、これが存在することによってリセット効果が継続するのを終わらせる意味があるという。これが全く納得できません。私の常識外の概念です。 PLCにはロード、アンド、アウトなどと機械語らしいニーモニックコードがありますが、機械語としてCPUが実行する言語ではなくて、インタープリターが理解するデータだろうと想像しています。 各デバイスは現在値と次の時間に持つ値の二つの入れ物を持って、それを順次歩進していると解釈すると、リセット状態が継続するなどの概念は入る余地も無いのです。 このあたりのことについて、私の非常識な頭を、仕組みから説き起こして納得させていただけるととてもありがたいのですが。 よろしくお願いします。

みんなの回答

回答No.5

僕はこのチップを弄った事が無いので組み込み一般の話しとして記述します。 まずPLCに記述するコードは機械語ですらない低レベルコマンド郡です。 乱暴に言ってしまうと、配線などのロジックを変更させる為の低レベル手順の情報。 そもそもチップのパターンを起こすと高価格なので、少し変更すれば転用可能だと言うような使い方をされます。 なので、コアチップの状態や性質に寄って動作手法がかなり変わると言う性質のものです。 例えば、コードでデバイスの状態を 0 -> 1 に変化させると、デバイスはその状態を保持します。 保持しないデバイスも有りますが、その場合はデバイスが 1 -> 0 に誰が何時するのかの設計が別途必要です。 パルスなどフリップするようなデバイスでは、スタートとパルス間隔などが別途組み込まれた設計が必要です。 PLCのコード記述はこれら設計と同レベルのコードを製造後に変更可能にしたものです。 リセット信号などは各デバイスへのシグナリングに利用されますが、UP/DOWN共に何らかの意味を持つ事が一般的です。 ですから、そこでこそPLCのコードの新価が発揮される場所で。 いつUPし、いつDOWNするのか、そのタイミングを調整するのがPLCのコードの出番です。 なので、どーしてコードでUP/DOWN両方させないといけないのか? と聞かれてしまうと、そう言う物なんだ、そう言う意図で設計されているんだ、としか答えようが無くなる気がします。

uran2048
質問者

お礼

投稿ありがとうございます。 文面を拝見していて、CPLDについて書かれているのではないかと感じます、あるいはPLC(シーケンサー)もそのような側面があるかも分かりませんが、ちょっとずれている感じがします。 私の誤解なら申し訳ありません。

noname#194317
noname#194317
回答No.4

横槍失礼します。 確かにトリッキーな方法に見えますね。でもこのラダーの動作としては「RST命令が常時Off接点の下にある=そのRST命令の効力を無効化する」という意味である、と考えるしかありません。ラダーはメカリレーで作るシーケンス回路をソフト的に記述したもので、普通のソフトとは全く違うものですが、今回に限っては普通のプログラミング言語としてもリレーシーケンスの延長としても、理解しにくいものであるという印象です。 RST命令がワンショット動作であれば、そもそもサブルーチンP0のへんてこなラダーを組む必要がないはずですが(これだと多分1ステップ実行時間の間だけRSTが動作する)、何かPLCの命令を実装する時に制約があったのかも知れません。なぜRST命令をこんな混乱するような実装にしたかは、三菱の設計者に聞くしかないでしょうね。オムロンやキーエンスなどのPLCでは、また違ったことになる可能性もあります。とりあえず今回は、RSTが効いている期間をユーザーがラダーで設定できると思って納得しましょう。PLC上のラダーは、上または左にあるものから必ず順番どおりに実行されるので、それに依存したある意味賢いやり方とも言えます。

uran2048
質問者

お礼

なんだか自分がダダをこねているのかなと思ってしまいます。確かに、 >「RST命令が常時Off接点の下にある=そのRST命令の効力を無効化する」という意味である、 と、説明書に書かれています。 そう考えるしかないですかね。なぜなの?って疑問がどうしても払拭できないのですが。 (ほとんど、そう考えるしかないかなって気持ちになりかかってはいますが) 折角仲裁に入っていただいたようですが、もう少し多くの方の目に触れるのを期待して待つことにします。 ありがとうございました。

回答No.3

ANo.2です。先程の回答に間違えがありました。 やはり、メインルーチンなり、サブルーチンなりで、A命令を実行しない条件(B命令)を記述(実行)しないと、いつまでもA命令は実行し続けます(つまりC0はリセットされ続けます)。サブルーチンから抜けると、M8000がOFFされ、A命令は実行されないのではなく、あくまでもA命令を実行しない条件を実行しないとA命令は停止(OFF)しません。

uran2048
質問者

お礼

何だか動作確認までしていただいたようで、ありがとうございます。 たとえM8000でなくても、サブルーチン内でリセットしたらその効果はずっと継続するようですね。 それは、そういうものだと思うしかないですかね。 しかし、 >やはり、メインルーチンなり、サブルーチンなりで、A命令を実行しない条件(B 命令)を記述(実行)しないと、いつまでもA命令は実行し続けます。 で、言われている・・・B命令を記述(実行)しないと・・・の箇所は、B命令を記述しなさいと言っているのか、それともB命令を実行しなさいと言っているのかどちらでしょうか。 M8001配下ですから、B命令は記述はしてあるが、実行はされないリセット命令ですよね。 実行しなくても、記述するだけで意味があるという概念が私にはどうしても納得できないのです。 そのことについてもう少し突っ込んだご説明が伺えるとありがたいのですが。

回答No.2

私はC言語とラダー言語の両方をいじっていて、BASICはあまり知りませんが。  シーケンサのプログラムは、デバイスは基本すべてC言語で言うグローバル変数です。  またサブルーチンと言っても、基本的にすべてメインルーチン(メインプログラム)に書かれているのと同じです。シーケンサのサブルーチンはC言語のように、処理単位(スタック)から抜けるとその状態はリセットされるのではなく、同じ処理を繰り返し記述しなくてすむ程度のものです。  参考例でわかりにくいのは、M8000(常時ON)を使っているところにあります。M8000の代わりに、これがもしA命令の前にONし、ルーチンから抜ける前後でOFFする接点ならB命令は要りません。ラダーは「ある条件がそろったとき、その命令をONし、条件が不成立のときその命令をOFFする」ことが基本で、たとえサブルーチン内でも、一旦A命令を実行してしまえば、A命令を実行しない条件が成立しない限りA命令は実行し続けます(それがB命令です)。  うまく説明できていませんが参考までに。

回答No.1

http://ich.tutkie.tut.ac.jp/thesis/papers/grad/2006/thesis-akinaka-2006.pdf このサイト(PDFファイルです。)の最初の数ページを読んでみた感じです。 このシーケンサーの処理の仕組みは、イメージメモリに読み込んでから一括処理を行っているようです。 インタプリタというよりコンパイラのような処理のイメージだと思います。 ハードウェアとして近いのは、Dフリップフロップのように、イネーブル(クロック)が入らない限り、データは保持し続ける、というところが似ていると思います。 このページにも書いてありましたが、インタプリタのような処理だと、入力してすぐ出力すれば速度は速いけども、途中でON/OFFが変化してしまうと、プログラムが中断してしまうという欠点があるからだそうです。このため速度は遅くなるけど、コンパイラのように一括変換して出力する方式になっているそうです。

uran2048
質問者

お礼

早速のレスポンスありがとうございます。 私が想定していたのは、各デバイスは二つの入れ物を持っていて、すべての現在値はすべてのデバイスの次の時刻の値を計算し終えるまで変化させないで、すべての計算が終了してから一斉に次の時刻の値を現在値にするものと考えていました。 そうではなくて、各デバイスの値が計算されるとすぐ書き換えて、次のデバイスがその値を参照していれば更新した値を適用するようですね。その点は新しい知識です。 実際のラダーの動きをみると、たしかにそのように感じさせる時があって、1サイクルの遅れを挿入して辻褄を合わせることがありました。 ところで、本筋のリセット効果が持続する件ですが、Dフリップフロップに例えるなら、現在値の入れ物の他に、クリアー端子状態を持つ入れ物を各デバイスに持たせないとできないことですね。 更に、M8001(常時OFF)配下のリセット命令が、実行されないのに(常時OFFだから実行されないと考えています)存在するだけでリセット効果の継続を打ち切る効果があることについてはこの資料からは読み取ることができません。 最初に仕組みと要求しましたが、仕組みに拘らなくてもかまいません。 自分を納得させて理解したいのです。更にアドバイスを頂戴できれば幸いです。

関連するQ&A

  • 三菱シーケンサのデバイスについて教えて下さい。

    三菱シーケンサのデバイスについて教えて下さい。 三菱シーケンサ(PCタイプ:Q06(H))のデバイスで内部リレー(M)について教えて下さい。 シーケンサの電源断時に内部リレー(M)の値は保持されるでしょうか? マニュアルを見ると以下の様に書かれています。 ======= マニュアル内容 ======= (a) 内部リレーは,QCPU内部で使用するラッチ(停電保持)のできない補助リレーです。 下記操作を行うと内部リレーは,すべてOFFします。 ・電源OFFの状態から電源を投入したとき ・QCPUをリセットしたとき ・QCPUをラッチクリアしたとき ============================= 上記内容から、電源断時には内部リレー(M)の値はクリア(OFF)されそうですが、CPUユニットに電池を実装していたら、クリアされず保持されるものでしょうか? デバイスにはラッチリレー(L)やデータレジス(D)、リンクリレー(B)など、色々ありますが、ラッチ(停電保持)対象でないデバイスは、電池を実装してもデータは保持されないものなのでしょうか。 ご存知の方、教えて下さい。宜しくお願い致します。

  • オムロン PLC 自己保持

    オムロンPLC CJ2Mシリーズを使用しています 自己保持回路を電源がOFFしても保持したままにしたいです なにかいい方法、命令はありますか?

  • 三菱電機 Q02H SORT命令

    教えて下さい。三菱電機PLC(Q02H)を使い回路を作っているのですが、今回、SORT命令を使うことになりました。非常に便利なのですがイマイチ上手くいきません。シュミレータにてプログラミングマニュアルに書いてあるプログラム例を実行すると、格納されている数を上手く並べ替えてくれるのですが、現在、使用しているPLC(Q02H)を使う為、プログラム例にあるデバイスは使用できません。空きデバイスを確認し使用していないデバイスで試すのですがダメです。状態としては回路にてSM703をONしたのち、SORT回路を実行すると格納されている数を値の大きい順に並べ替えてデバイスの一番上まで送ってくれるのですが、SM703をOFFした状態でSORT回路を実行すると値が小さい順に並べ替えてくれるのですが、一番上まで値を移動してくれず、一番小さい値の格納デバイスからスタートしてしまいます。どこがいけないのでしょうか。 プログラミングマニュアルに書いてあるプログラム例 0  LD X0 1  OUT SM703 2  LD x10 3  SORT D0 K4 K1 M0 D10 4  END 私が実行したプログラム 0  LD X0 1  OUT SM703 2  LD X10 3  SORT D151 K11 K1 M1010 D430 4  END

  • ラダーにてセットリセットを使わない方がいい?

    PLCラダープログラム、初級者です。 先日、セットリセットモジュール(セットリセットフリップフロップ)、或いは、リセットセットモジュールを用いてラダープログラムを行っていたのですが、ある人から、セットリセットモジュールを使うのではなく、自己保持回路を使った方がいい、とのアドバイスを受けました。 理由を説明して貰ったのですが、よく理解できませんでした。 なぜ、同じ機能なのに、自己保持回路を使った方がいいのでしょうか? すみませんが、よろしくお願いします。

  • fortran 外部サブルーチンの読み込みについて

    c c main.f c dimension x(2) x(1)=1 x(2)=2 y=5 call sub(x,y,z) write(*,*)'x1=',x(1) write(*,*)'x2=',x(2) write(*,*)'y=',y write(*,*)'z=x1+x2+y=',z stop end c---------------------------------- c sub.f c subroutine sub(a,b,c) dimension a(2) c=a(1)+a(2)+b write(*,*)'b=',b return end  以上のようなプログラムをmain.fとsub.fに分離して、別々にコンパイル。最後にそれぞれの実行ファイルをつなげるといったことがしたいのですが、どのようにすればいいのでしょうか。 サブルーチンをメインプログラムが参照するといったことがしたいです。

  • device netを使用したインバータ制御に関…

    device netを使用したインバータ制御に関して device netを初めて使用する者です 今回、海外での仕事でdevice netで接続されている 三菱製インバータ(A700シリーズ)をシーメンス製インバータ(MICROMASTER440)に 交換された機械のシーケンスプログラムの変更を行なってくる予定です 現在シーケンスプログラムを記述した担当者がいないので、詳細に関しては わからない状況ですが、プログラムを見る限り運転/停止/周波数設定 のみしか行なっていないと思われます(三菱のdevice netのマニュアルから判断) シーメンス製インバータの場合、どのようにプログラムを記述したら良いのか わかる方がおりましたら教えて頂ければ幸いです (ちなみにPLCはキーエンス製です)

  • バイナリ指定で複数レジスタを順次リセットするラダ…

    バイナリ指定で複数レジスタを順次リセットするラダーシーケンス ラダー(シーケンス)回路の組み方を教えてください。 入力が1点:リセットPB 出力が4点:リセット入力 :レジスタ#1 :レジスタ#2 :レジスタ#3 出力先(相手機器)は7ヶのレジスタを持っており レジスタ#1~レジスタ#3の 3ビットでレジスタを指定し同時に リセット入力 をonすることによって所定のレジスタがリセットされます。 1回 リセットPB を押すだけで複数のレジスタをリセットする回路を作らなければいけません。話しを簡単にするために7ヶすべてのレジスタを1プッシュでリセットする回路と考えてけっこうです。 順次指定を変えてリセットを繰り返す方法がわかりません。 失礼しました。入力がもう1点 リセット確認:RSTACKがありました, レジスタは1ビットと考えてください。 入力: XO:PB押しボタン X1:RSTACK 出力: Y0:RST Y1:#1(2-0) Y2:#2(2-1) Y3:#3(2-2) 途中まで考えてみましたが M2~M7 をたてる方法がわかりません。 RSTACKは1個のレジスタをリセットするごとに1パルス同一信号が返ってきます。 X0 --||----------[PLS M0] X1 --|/|---------(M99) | M0 M99 --||--+--|/|---(M1) M1 | --||--+ M1 --||-----------(Y0) M2 | --||--+ M3 | --||--+ M4 | --||--+ Mn | --||--+ ** M5~M7 すべてパラ M1 --||--+--------(Y1) M3 | --||--+ M5 | --||--+ M7 | --||--+ M2 --||--+--------(Y2) M3 | --||--+ M5 | --||--+ M7 | --||--+ M4 --||--+--------(Y3) M5 | --||--+ M7 | --||--+ レジスタとの表現が誤解を招きました。外部機器(カウンタ)です。 カウンタを255ヶ持っており。そのカウントのリセットのための入力が,リセット信号:1ビット,カウンタ指定信号:8ビットです。リセット完了応答が"RSTACK"1ビットです。 PLC側はmov命令他たいていのコマンドは使えます。ラダー表記の他にニモニックでもプログラムできますがラダーの方が解釈しやすいです。 タイミングパルスとカウンタを使う等して順次作動する回路は作れそうな気がしますがいかにも複雑です。もっと単純スマートな方法がありそうな気がします。 "PB"入力を保持して, ラダー図上段から1かたまり(1段)ずつ作動し(2回以上作動しない), 最下段が作動完了で保持を解除でよいと思うのですが。 応答が"RSTACK"1本なので・・?。 1段目は"RSTACK"でリセットするとして, 2段目は PB(M0)and"RSTACK(a)" でonしてよいか,保持offを"RSTACK(b)"でよいか(a),(b)が同ブロックに存在? 最終段リセット完了(M99)はどうやって作るか?

  • VBのEXEから他のVBのEXEのファンクションを実行したい

    メインルーチンからサブルーチンを呼ぶような イメージで VBののEXE‥(1)(メインプログラム)から 他のVBののEXE‥(2)のファンクションを呼び出して値を返したいのですが どうすればよいでしょうか? (1)はバッチファイルのような感じで コマンドライン引数が○○のとき(2)の××と△△を実行するという内容のもの (2)はマスタを更新するプログラムがマスタごとに いくつかのファンクションにわかれたものです。 説明不足で伝わりにくいかとおもいますが、 よろしくおねがいいたします。

  • ハイパースレディングのレジスタについて

    ハイパースレディングのレジスタについて ハイパースレッデイングのCPUで2つのスレッドA,Bを動かすとする。 このときAの実行状態を示す汎用レジスタやプログラムカウンタと     Bの実行状態を示す汎用レジスタやプログラムカウンタの扱いはどうなのでしょうか。 次の2つの方法が考えられる。 (1) レジスタのロード、実行、レジスタのセーブを繰り返す方法。     CPU内に高速なメモリを持ち、実行前にレジスタに値をロードして、命令を実行して、レジスタの値を保存を繰り返して、A,Bのスレッドを実行する方法。 (2) A用のレジスタとB用のレジスタを2組用意して、相互に切り替えながら実行する方法。     Aを実行するときはA用のレジスタを使用して、Bを実行するときはB用のレジスタを使用する方法。 の2つが考えられるが、それとも他の方法があるのでしょうか。 それに関連して、1度に実行する機械語命令の個数はいくつなのでしょうか。 スレッドAの機械語命令を実行して、切り替えてBの機械語命令を実行するときに、 Aの1命令を実行してから、Bの1命令を実行する。1命令毎に切り替えるのでしょうか、 それともAの数個の命令を実行してから、Bの数個の命令を実行するのでしょうか。 このときスレッドを切り替える際に1度に実行する機械語命令の個数はいくつでしょうか。 ご存知の方がおりましたら、教えて下さい。

  • シーケンス ラダー図と配線について

    簡単なセンサー制御をしたいのですが、素人でなかなかうまくいかないので教えてください。 やりたいこと センサーAにワークが通過している間に、センサーBがONするか否かを判定し、ONしない場合に警報装置が作動する。 そして、リセットボタンを押すまでは警報して、リセットボタンを押したら再度検査を再開する。 A B リセットSW      出力500 ------||------||-------|/|----------------○--               |    出力500            | ------||---------- ---------------------------------------END-- ---------------------------------------ENDH- このように組みました。 PLCは、キーエンスのKV-24DRです。 自己保持してワークの検出はできたのですが、リセットスイッチを押してもリセットされません。 端子の配線がまちがってるのでしょうか? わからないので教えてください。