- 締切済み
BCD出力で表示されたものをBINに変換すると
PLC制御を学び始めた初心者です。 BCD出力とBIN出力について勉強している中で、たとえばヒーターの温度設定を行うことを想定して、BCD出力をするタッチパネルを用いて行った温度設定を場合について疑問があります。 たとえば、表示パネル上で63℃と設定したとします。 BCDなので、各桁それぞれを2進数で表して 6→0110 3→0011 つまり 63 = 0110 0011 ということになりますよね。 さらに、データをCPUやPLCに取り込むときにBINデータに変換する必要があると思うのですが、これをBINデータに変換する場合、上記のBCDデータを通常の2進数と見て、一度10進数に戻し、それを再度2進数に戻す作業になると思います。 具体的には、 01100011 =1+2^1+2^5+2^6=102 したがって、10進数の102という数値になりますよね? これを再度2進数化したものがBIN変換した数値ということになると思いますので、 102 = 01100110 (2進数) という風になるかと思います。 つまりPLCの内部ではこの2進数をデータとして取り扱うことになるかと思いますが、 さて、ここでよくわからないのですが、 タッチパネル上では63℃として入力していたのに、内部に入ったら102(℃?単位はわかりませんが・・・)として扱われています。 ここがよくわかりません。63℃のはずが102に変換されてしまっています。 だったら最初から変換などせずにそのままでいいのではないかとも思うのですが?? どなたがご教授いただけませんでしょうか。 なぜBINとBCDが扱われるのかについても教えていただけると幸いです。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- bunjii
- ベストアンサー率43% (3589/8249)
回答No.7の追加説明です。 BCDの2桁をBINの16bitに変換するには次の2通りの方法があります。 加算法 10進数の場合を想定すると次のようになります。 6+6+6+6+6+6+6+6+6+6+3=63 2進数の場合(元の値は4bitとしましたがレジスターは8bitとします) 0110+0110+0110+0110+0110+0110+0110+0110+0110+0110+0011=00111111 シフト法と加算法の併用 2進数の場合 00000110 を左へ3回シフト 00110000 (10進数の48) 00000110 を左へ1回シフト 00001100 (10進数の12) 00000011 はそのまま 00000011 (10進数の3) 00110000+00001100+00000011=00111111 これらの演算はPLCの内部で実行されるようになっているはずですから一般的には気にしなくて良い範囲です。 質問の 0110 と 0011 を直接繋げた 01100011 とは異なる処理であることを理解してください。
- lumiheart
- ベストアンサー率47% (1142/2410)
回答(5)です よくよく読み返したら回答(1)さんが正解してるじゃないですか ただ、貴殿がその意図を理解せず否定してるだけ キーエンスKVシリーズリファレンスマニュアル 368/894ページ TBIN BCD-BIN変換命令 回答(1)さんはこの変換命令がやってる中身を解説してます その逆がBCD-BIN変換命令 TBCD 366/894ページ それをを更に懇切丁寧に解説してるのが回答(6)、(7)さん >学習ページなどを見てるとさも当たり前のように使われていたので今でも現役なのかと思っていました・・・。 学習ページではちゃんとBCD-BIN変換命令使ってるでしょ? >単軸ロボで使うときにはどんな構成で使われるのでしょうか? 良くあるのは、単軸ロボ1台のみで移動座標も固定位置で数点だけとか 所謂、ピックアンドプレースユニット http://jp.misumi-ec.com/maker/machine-engineering/mech/tech/pick_and_place_units/ http://www.ea-thk.com/?q=node/1289 移動座標は固定値なので座標データはロボット側に記憶しておくだけ 座標1番はワーク取出位置 座標2番はワーク排出位置1 座標3番はワーク排出位置2 座標4番はワーク排出位置3 所謂、多品種対応で品種によって座標が変わる このような事例は少なく無い 座標数点しかないならBCD1桁で十分ではある このタイプが標準装備してるのはBCD入力ポートだけと言う事例は多い PLCだって通信ユニットは標準装備してない(プログラミングポート以外で) 安くなったとは言え通信ユニットは高価 http://www.mitsubishielectric.co.jp/fa/products/cnt/plcq/items/information/index.html http://www.fa.omron.co.jp/products/family/1651/lineup.html 蛇足 正式な理解ではなくて、簡略的理解する方法 「BCDとは16進数からA~Fを取り除いたもの」 このように書くとマイコン屋さんから怒られるけど PLC屋にはこれで十分である 最近のPLCにはBCD以外に浮動小数点やら余計な物が増えたし 浮動小数点を人に解説するのは難しい マイナスデータ2の補数表現の解説も困難
- bunjii
- ベストアンサー率43% (3589/8249)
>結局のところ、BCDで入力するタッチパネルで63℃と入力したらPLCの中ではどのように処理されて温度制御を行ってくれるのでしょうか? 私は設計者じゃないので設定値と測定値の差をどのような処理で出力値を算出するかは分かりません。 BCDは人間に対するインターフェースと考えれば良いでしょう。 人間は2進数で装置に指示を与えることが困難のためBCDを仲立ちにして装置との意思疎通を図ります。 >質問文の中にも書いたように63℃を6と3に分けてそれぞれを2進表現して書いたつもりですが、この理解でよろしいでしょうか? その部分は良いのですが、装置内から読み取った2進数が 0110 0011 であれば4桁と4桁の間の空白は何を意味しているでしょうか? 「4桁毎に区切って10進数に置き換えてください」と言う意味のように受け取れます。 8桁の2進数として 01100011 のように連結したら全く異なる値になって10進数の 99 になります。 01100011 =1+2^1+2^5+2^6=102(再計算すると99です) 102 = 01100110 (2進数) → 99 = 01100011 >BCDをBINに変換するんですよね?63をBINにしたら結局のところCPU内ではどう扱われるのですか? CPUの種類によってレジスターのbit数が異なりますので一概に言えません。 BCDの入力値は人間の目で10進数に読めて、メモリー上には2進数の4桁区切りで格納されていると思います。 測定値もモニターへ表示されている値に相当する2進数がメモリーに格納されているはずです。 CPUの中では全て2進数の演算を行っていることは理解して頂いていると思います。 モニターに表示されている値は人間が理解できるようにBCDの数値(10進数)やグラフでアナログ表示する方法がとられているでしょう。 >すみません、ちょっとよく理解できないのですが、どういうことでしょうか? 上記のようにあなたの計算違いで値が変化したかのように見えています。 しかし、計算違いを訂正して2進数の4桁ずつを10進数に復元して2桁の10進数に戻せは元の63になります。 0110 → 6 (10の位が6) 0011 → 3 (1の位が3)
- bunjii
- ベストアンサー率43% (3589/8249)
>たとえば、表示パネル上で63℃と設定したとします。 >BCDなので、各桁それぞれを2進数で表して >6→0110 >3→0011 >つまり 63 = 0110 0011 >ということになりますよね。 2進数を4桁ずつで連結しても10進数の63と同じと言えません。 2進数の4桁で表せる10進数の値は0~15なので連結して8桁にしたものを10進数に戻せば大きな誤差が生じます。 正しい値を2進数の8桁で表すには63を2進数に変換しなければ辻褄が合いません。 従って、「ここがよくわかりません。63℃のはずが102に変換されてしまっています。」と言う結果になります。 あなたがタッチパネルの内部データを正しく読んでいないことになるのではないでしょうか。 BCDの値は2進数を4桁ずつ読んで10進数に変換した値を連結するのが基本です。 誤りの原因は2進数を8桁読んで、それを10進数に変換したことによるものです。 >だったら最初から変換などせずにそのままでいいのではないかとも思うのですが?? 10進数と2進数について基本的な知識を積んでください。 機器間のデータ通信でアセンブリ言語(ニーモニック)等を使う場合は特に注意が必要でしょう。
- lumiheart
- ベストアンサー率47% (1142/2410)
>なぜBINとBCDが扱われるのかについても教えていただけると幸いです。 タッチパネルのデータ表示、データ入力は基本的にバイナリのままです 何故なら、タッチパネルはバイナリデータを使えるから 所謂、デジスイッチ http://www.fa.omron.co.jp/products/family/356/ 7SEG表示器 http://www.fa.omron.co.jp/products/family/1143/ それらを使うときにBCDを使います 尚、BCDを使うのは上記のような操作表示器だけでなく 所謂、単軸ロボット http://www.iai-robot.co.jp/product/single/index.html http://www.yamaha-motor.co.jp/robot/lineup/flipx/ 計量器や距離、流量等のアナログ系センサ http://www.aandd.co.jp/adhome/products/index_weighing.html http://www.fa.omron.co.jp/products/family/1432/ http://www.keyence.co.jp/appli/#1 http://www.onosokki.co.jp/HP-WK/products/keisoku/tach/tm3100.html それらのデータをPLCへ入力する為にBCDを使う場合があります 現代では所謂ネット通信等でのIFが増えたので BCDでIFする事例は減りましたが 昔は通信系オプションが高価だったからと言うのが最大の理由 タッチパネルも昔は大変高価だったので、 デジSWや7SEGを多数並べた方が安かったが 現代では人件費の方が高くなったので、 デジSWを多数並べると配線工数が高くなって、タッチパネルの方が安価になる とどのつまり、現代ではBCDを使わなければならない事例は減った
お礼
最近は使わなくなったんですね!? 知らなかった・・・学習ページなどを見てるとさも当たり前のように使われていたので今でも現役なのかと思っていました・・・。 デジSWでの使用理由はわかりますが、単軸ロボなどで使われるのはなんかメリットあるんでしょうか? 単軸ロボで使うときにはどんな構成で使われるのでしょうか?
補足
デジSWなどは各桁ごとに分かれていて、0~9までしか表現できない つまり、BCDデータにするしかPLCに読ませる方法がないってことなんですかね? デジタルのタッチパネルなんかだと、そのまま63をBINデータでCPUに転送できるけど、 デジスイッチは63をそのまま表現できないので、しかたなく6と3に分けなければならないということなんですかねぇ??
- yama1718
- ベストアンサー率41% (670/1618)
>なぜBINとBCDが扱われるのかについても教えていただけると幸いです。 それは、人間と表示パネルの都合ですね。 表示パネルが、1桁ずつ4ビットで0~9の値にしてデータをやり取する仕様(つまりBCD値)なのですね。 その方が計算しなくても回路やロジックが簡単になったりします。 変換や計算など難しい事は賢い方(CPUとプログラム)で対応して下さいと言う事ですね。 他にBCD値が使われるのは整数値なら問題ないのですが、少数の値を扱う時に誤差が問題になります。 2進数の少数では0.1でさえ割り切れない値になり、0.1を10回加算しても0.99999…という結果になる事もあります。 それを防ぐ方法の1つに面倒で計算速度が落ちてもBCD値を使って計算する事もあります。 http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20010719/3/ プログラム言語では金融計算によく使われていたCOBOLはBCDが扱えますし、もっと身近な物では電卓も内部ではBCD値で計算している物が多いそうです。
お礼
小数についてはまだ考えたこともなかったので添付いただいたURLを参考に考えてみたいと思います。 ありがとうございました。
- yambejp
- ベストアンサー率51% (3827/7415)
BCDは2進数的な10進数でしかないので16進数的な発想は忘れてください 63→0110 0011とするか63→00111111とするかによって 戻すときのロジックも変わってきます。
- t_ohta
- ベストアンサー率38% (5241/13712)
01100011 を10進数に変換すると 99 じゃないですか? > 一度10進数に戻し、それを再度2進数に戻す これをした場合、元の数値に戻るはずです。 10進数の99を2進数に変換して再度10進数に戻したら値が違うというのは、どこかで計算間違いをしています。
お礼
すみません、途中で気づきましたw おっしゃる通り99ですね
- kngj1740
- ベストアンサー率18% (197/1052)
違います。63の意味は6x10+3です。2進数に変換するには0110を10倍して00111100という2進数を得ます。それに0011という3を足して00111111となります。これが63の2進数表現です。プログラミングの基礎です。
お礼
回答ありがとうございます。 おっしゃっているのは、普通に10進数の63を2進数にするときの変換方法ですよね? 今回は、BCDをBINに変換する際の話をしていまして・・・せっかく回答いただいたのですがちょっと質問の意図からはずれているのではないでしょうか。
補足
>2進数を4桁ずつで連結しても10進数の63と同じと言えません。 >2進数の4桁で表せる10進数の値は0~15なので連結して8桁にしたものを10進数に戻せば大きな誤差が生じます。 >正しい値を2進数の8桁で表すには63を2進数に変換しなければ辻褄が合いません。 →おっしゃる通りで、これについては理解しているつもりです。 >従って、「ここがよくわかりません。63℃のはずが102に変換されてしまっています。」と言う結果になります。 →結局のところ、BCDで入力するタッチパネルで63℃と入力したらPLCの中ではどのように処理されて温度制御を行ってくれるのでしょうか? 「63℃にしてほしい」とパネルから打ち込んで、その通りにCPUが考えて温度を制御する仕組みを知りたいです。 BCDをBINに変換するんですよね?63をBINにしたら結局のところCPU内ではどう扱われるのですか? 63はBINにしても63として扱われますか? >BCDの値は2進数を4桁ずつ読んで10進数に変換した値を連結するのが基本です。 →質問文の中にも書いたように63℃を6と3に分けてそれぞれを2進表現して書いたつもりですが、この理解でよろしいでしょうか? >誤りの原因は2進数を8桁読んで、それを10進数に変換したことによるものです。 →すみません、ちょっとよく理解できないのですが、どういうことでしょうか?