目次次へ番外編 Chap.1 命令語インタプリタをつくる(1)

番外編は、気楽な読み物としてご覧ください。

1.1 なにをしようか
ラダーで趣味のプログラミングするにあたって「リレーと押ボタンスイッチをそれぞれ30個ずつ用意してください」といっても、費用と配線に要する時間を考えると現実的でありません。
そこで代案として、ラダーをコンピュータ上で実行する処理系を作ってみましょう。
実は、これも可能ですが、結構面倒です。
そこで、もう1歩妥協して、手始めとしてパソコン上で走る命令語インタプリタを作ることとします。これなら簡単そうです。

1.2 命令語、それって何?
ここで、突然登場した命令語ですが、これは簡単に言うとPLC(プログラマブルコントローラ)の機械語みたいなものです。
それでは、PLCとは?
これは、リレー回路をエミュレーションする電子機器です。工場へ行くと大抵の(?)制御盤に入っています。
現在では、リレー回路のロジックの大半はPLCのソフトウェアに置き換わっています。
実は、今回作る命令語インタプリタは、パソコン上で走るPLCに他なりません。

話が、だんだん横道に外れてきたので、ここらへんで元に戻りましょう。

1.3 命令語インタプリタの仕様
とりあえず、手始めとして非常に機能の限定された最小仕様の命令語インタプリタをつくることとします。
どのくらい最小かというと、タイマ・カウンタなし、母線制御なし、回路ブロックの結合なしです。
(後者の2つは、プログラミングの工夫で何とかなります。)
表1.1が命令語インタプリタの命令セットです。この表で、Regは1ビットのレジスタ、(n)はアドレスnの1ビットデータを意味します。

表1.1 命令語インタプリタ命令セット(最小仕様)
命令語 意味 動作
LD n
アドレスnのデータを、レジスタにロードする。
Reg ← (n)
LDNOT n
アドレスnのデータの論理否定を、レジスタにロードする。
Reg ← not(n)
AND n
アドレスnのデータとレジスタのデータとのAND演算結果を、レジスタにロードする
Reg ← Reg and (n)
ANDNOT n
アドレスnのデータの論理否定とレジスタのデータとのAND演算結果を、レジスタにロードする。
Reg ← Reg and not(n)
OR n
アドレスnのデータとレジスタのデータとのOR演算結果を、レジスタにロードする。
Reg ← Reg or (n)
ORNOT n
アドレスnのデータの論理否定とレジスタのデータとのOR演算結果を、レジスタにロードする。 Reg ← Reg or not(n)
OUT n
レジスタのデータを、アドレスnにストアする。 n ← Reg
END
プログラム先頭にジャンプする。 プログラム先頭にジャンプ

気の早い人は、このロジックを作って動かしてみましょう。

1.4 ラダー図を命令語に変換する
ところで、作った命令語インタプリタが、実行するプログラムはどうやって書けばいいのでしょうか?
ここでは、手作業でラダーを命令語に変換することにします。
変換方法は表1.2の通りです。

表1.2 手作業でラダーを命令語に変換する方法
(1)回路の最初の接点には、LDまたはLDNOT命令を使う
回路の最初の接点がa接点ならLD命令、b接点ならLDNOT命令を使います。
(2)回路の途中の接点には、AND、ANDNOT、OR、ORNOT命令を使う
現在までの回路全体に対して、a接点を直列につなぐ場合はAND命令を、b接点を直列につなぐ場合はANDNOT命令を使います。
また、現在までの回路全体に対して、a接点を並列につなぐ場合はOR命令を、b接点を並列につなぐ場合はORNOT命令を使います。
(3)コイルには、OUT命令を使う
コイルには、OUT命令を使います。

この規則で、図1.1のラダー図を手作業で命令語に変換してみます。
(@〜Cの順番に変換します。)

図1.1 ラダー図を命令語に変換

変換の結果、命令語プログラムは、次のようになります。

LD M000
OR M100
ANDNOT M001
OUT M100
END

命令語インタプリタにこの命令語を実行させると、M100は、表1.3の真理値表の動作を行なうはずです。
頭の中で、図1.1の動作を(繰り返し)実行できる人は実行してみてください。

表1.3 M100の真理値表
(図1.1の回路)
M000\M001 0 1
0 以前の値を保持 0
1 1 0

ところでこの真理値表、見覚えありませんか?

1.5 まとめ
プログラミングを多少とも経験したことのある方は、表1.1の仕様のインタプリタを作って命令語を実行できると思います。ロジック自体はとても単純です。
開発言語は、なんでも結構です。
なお、入出力をどうやって与えるかをまだ説明していませんが、END命令のジャンプの直前におこなうといいと思います。
このことについては、次回解説したいと思います。

目次次へ