• 締切済み

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

シーケンサのサブルーチンについて 三菱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