2009年12月9日水曜日

ラダーで乱数ランランラン♪

シーケンサを使ってとあるプログラムを作っておりました。
このプログラムは、実際の機器と合わせて使わないと何がどうなってるか分からんので、ソフトウェアで動作するシミュレータを組み込んでしまうことにしたのだぁ。

で、組み込んだシミュレータは、何となく動くようにはなったのだけれど、実際の機器のように入力信号が程よく動いてくれる方が何かと嬉しい。この「程よく動く」と言うプログラムには、"乱数"を使ったりするのだけれど、シーケンサを動かすラダー言語には、CやVBの様に乱数の関数なんて物は用意されちゃぁいない。でも、乱数で動かす方が何となくそれっぽい筈。

webで探し回るも、ラダーで乱数を組んだ回路なんて見当たらない。誰も使う人おらんのかなぁ。正確・精確なシーケンサの用途じゃぁ、乱数を使うなんてシチュエーション自体が無いのかもぉ。

で、"乱数とは何ぞや"と言うところから始まるのだけれど、面倒なので割愛して、近似乱数として使い易そうな
"平方採中法"なる方法を試すことにしてしまった。方法は読んで字の如しで、"自乗した数字の真ん中を取り出しましょう"って安易な発想。でも、こんなんで乱数ができてしまうんだよね。

色々試して出来上がりましたぁ。


簡単に解説すると
1-3行目:先ず、初期値を決めます。0や1だと自乗してもそのままなので例外処理付きです。
4-5行目:シーケンサのオリジナルクロックを使って矩形波(クロックパルス)を作ります。
6行目:自乗します。
7行目:自乗した値をレジスタからリレーに移します。
8-9行目:自乗値がオーバーフローするとマイナスの値になるので、そのときはプラスに戻します。
10行目:リレーの真ん中からデータを抜き出して元のレジスタに乱数を返します。
 →また6行目から出来上がった乱数を自乗して新しい乱数を発生させます。

プロの目からすると、他愛の無い回路かも知れないのだけれど、"良い仕事しましたぁ"って感覚。
こんな、回路を持ってるとちょっと便利かも。

めでとし、めでとし。

2 件のコメント:

匿名 さんのコメント...

大変参考になりました。
私もラダーで乱数を求めることに苦労しました。まずは「乱数の定義って?」ところから。やはり平均採中法が簡単そうですね。ところで質問です。お使いのPLCの機種はなんですか?

風楽法師 さんのコメント...

ご参考にしていただけたようで、大変嬉しく存じます。
今回、ご覧頂いた回路は、YOKOGAWA製PLCであるFA-M3を動かすために用意されたWideField2と言う開発ツールで組んだ物です。
個人的なホビー用途では、連枝と言うPIC用のラダーを使う機会のほうが多いですね。