• 締切済み

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が扱われるのかについても教えていただけると幸いです。

みんなの回答

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.9

回答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
  • ベストアンサー率48% (1103/2297)
回答No.8

回答(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/8248)
回答No.7

>結局のところ、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/8248)
回答No.6

>たとえば、表示パネル上で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進数について基本的な知識を積んでください。 機器間のデータ通信でアセンブリ言語(ニーモニック)等を使う場合は特に注意が必要でしょう。

stamp_dr
質問者

補足

>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進数に変換したことによるものです。 →すみません、ちょっとよく理解できないのですが、どういうことでしょうか?

  • lumiheart
  • ベストアンサー率48% (1103/2297)
回答No.5

>なぜ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を使わなければならない事例は減った

stamp_dr
質問者

お礼

最近は使わなくなったんですね!? 知らなかった・・・学習ページなどを見てるとさも当たり前のように使われていたので今でも現役なのかと思っていました・・・。 デジSWでの使用理由はわかりますが、単軸ロボなどで使われるのはなんかメリットあるんでしょうか? 単軸ロボで使うときにはどんな構成で使われるのでしょうか?

stamp_dr
質問者

補足

デジSWなどは各桁ごとに分かれていて、0~9までしか表現できない つまり、BCDデータにするしかPLCに読ませる方法がないってことなんですかね? デジタルのタッチパネルなんかだと、そのまま63をBINデータでCPUに転送できるけど、 デジスイッチは63をそのまま表現できないので、しかたなく6と3に分けなければならないということなんですかねぇ??

  • yama1718
  • ベストアンサー率41% (670/1618)
回答No.4

>なぜ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値で計算している物が多いそうです。

stamp_dr
質問者

お礼

小数についてはまだ考えたこともなかったので添付いただいたURLを参考に考えてみたいと思います。 ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

BCDは2進数的な10進数でしかないので16進数的な発想は忘れてください 63→0110 0011とするか63→00111111とするかによって 戻すときのロジックも変わってきます。

  • t_ohta
  • ベストアンサー率38% (5081/13278)
回答No.2

01100011 を10進数に変換すると 99 じゃないですか? > 一度10進数に戻し、それを再度2進数に戻す これをした場合、元の数値に戻るはずです。 10進数の99を2進数に変換して再度10進数に戻したら値が違うというのは、どこかで計算間違いをしています。

stamp_dr
質問者

お礼

すみません、途中で気づきましたw おっしゃる通り99ですね

  • kngj1740
  • ベストアンサー率18% (197/1052)
回答No.1

違います。63の意味は6x10+3です。2進数に変換するには0110を10倍して00111100という2進数を得ます。それに0011という3を足して00111111となります。これが63の2進数表現です。プログラミングの基礎です。

stamp_dr
質問者

お礼

回答ありがとうございます。 おっしゃっているのは、普通に10進数の63を2進数にするときの変換方法ですよね? 今回は、BCDをBINに変換する際の話をしていまして・・・せっかく回答いただいたのですがちょっと質問の意図からはずれているのではないでしょうか。

関連するQ&A

  • BCD・HEX・BINについて

    設備のタッチパネルでBCD入力にて100をいれました。HEXに変換した値はいくらでしょうか?

  • EXCELで10進数表記をBCD表示にしたい

    あるソフトのCSVデータがあり、 その中に4664という数値があります。 実際この数値をBCDデータの1234と変換したいです。 変換後のデータは0000~9999までの4桁で、 元データもその範囲外のデータはありません。 関数を探しても、9桁以上のものは変換できないようです。 A1セルの数値をE10セルに表示できる方法を教えてください 変換途中で、他のセルで2進数に変換して、とかでもいいです。 マクロより、単に関数がいいです。 宜しくお願いします。

  • タッチパネル数値データの読取りについて

    外部機器からタッチパネルにシリアル通信で数値データを読取ったのですが、数値データのアドレスが大きくて(4097ch)PLCで読取れません。データの変換が必要かと思い、いろいろ試したのですが上手く行きません。ご存知の方いましたら御指導をお願い致します。PLCはオムロンです。

  • 教えてください

    PLCを使って電卓のような物を作りたいと思っています。 サムロータリースイッチ、タッチパネルを使わず、テンキー、4桁の表示器を使用することになっています。 理論上出来るような気がするのですが、一般に機械に常設する為のテンキーがあるのでしょうか。パソコン用のテンキーの出力方法もよく分かりません。 そしてラダー図なのですが、どのようにBCDデータをPLCデータメモリに構築するの方法、特に入力ごとに桁を繰り上げる方法がよく分かりません。 昨今はタッチパネルが主流かと思われますが、もしお分かりのようでしたら教えて頂きたく宜しく御願い致します。

  • 2進数からBCDコードへの変換

    今,2進カウンタを作り,これから7セグメントLEDへ出力する回路を作りたいのですが,1桁の場合は,デコーダICでそのまま変換可能なのですが,10進数に直したときに2桁以上になるものは,デコーダの前で各桁ごとのBCDコードに分けてあげないといけなくなります。ここが分からないのです。 回路の構成としては,カウンタ部分をアナログで構成し,そこで8個のスイッチをつけて,それぞれ2進数の各桁の入力としています。これと,3個のデコーダICと7セグメントLEDで2^8=255までを表示させたいのですが,どのような回路構成だとシンプルに作れるのでしょうか。また,そのようなICは存在するのでしょうか。

  • phpMyAdminでutf8_binを使う

    MySQL+phpMyAdmin+PHPで開発を行っています。 テーブル項目の照合順序をutf8_binで使いたいと思っています。 PHPでのデータのやり取りでは文字化けは発生しないですが、唯一、phpMyAdminの表示でデータを見た時だけ、日本語が文字化けというか16進数の数値がズラズラと表示されます。テーブル項目をutf8_unicode_ci に変更すれば、日本語の文字化けは発生しません。 phpMyAdminの一般設定で照合順序をutf8_binにしても同じです。 utf8_binで定義した場合、phpMyAdminで日本語化け(16進数の数値がズラズラ)が発生しない方法はないのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 三菱サボモータの軸モニタデータに関して

    PLCとGOTの設定で困っています。 モータ回転数をタッチパネルに表示させたいので、シンプルモーションユニットのマニュアルでモータ回転数のバッファメモリアドレスを確認しました。 バッファメモリアドレスが2つありまして、下位バッファメモリと上位バッファメモリを並べ換えて、その次10進数に変換することで回転数になります。2つの16ビットのデータを1つに結合する話みたいですが、具体的にPLC側とGOT側でどういう設定をすればいいか悩んでいます。 是非ご教示戴きたく、よろしくお願いいたします。

  • エクセル DEC2BIN 範囲外数値の演算

    エクセルの2進数変換関数の「DEC2BIN」について、 -32768から32767の範囲の数値を符号付の16bitへ変換したく、 調べたところDEC2BIN関数にたどり着いたのですが、 -512から511の範囲外では、使用できず、エラーが返ってきます。 何か良い解決策は、ないでしょうか? 初めての質問となりますが、よろしくお願いいたします。

  • javaで16進数のバイナリデータ4バイトを10進数に変換する方法

    今私が行なおうとしていることは、char型とbin型が混ざり合ったファイル(1レコード301バイト)から固定バイト部分(bin型の部分4バイト分)を切り取り、 テキストファイルで読み取れる数値(int、又はbouble)に変換・出力するという作業です。 FileInputStreamとDataInputStream.read()を使用し、全データをbyte[]で取得、対象固定バイト部分のbyte[]取得までは出来ました。 取得したbyte[]の値を見ると、16進数表記になっていました。ここで、1バイト分(byte[1])をintValueでintに変換する事はできましたが、 4バイト分(byte[4])の値を一気に10進数表記にしてint型で出力する方法がわかりません。 誰かわかる方はいらっしゃいますか?そもそもできないのでしょうか? またはもっと良い方法があれば教えていただきたいです。 補足としてですが、BufferedReaderでファイルを読込まなかったのは、bin型データ部分がたまたま改行コードになってしまうことがあり、readLine()で1行データ(301バイト分)を取得できないからです。 こちらの方法でも読込み・変換できるのでしょうか? 誰かわかる方がいらっしゃったらぜひ教えて下さい!

    • ベストアンサー
    • Java
  • カメラが接続できるPLC表示器を探しています

    PLCの操作/表示が行える表示器にカメラ機能が搭載出来る装置を 探しています。 情報をお持ちの方、教えて下さい。 表示器の操作(タッチパネル)機能は必須では無く、表示機能のみで 構いません。 つまり、PLCからの情報とカメラからの画像データの両方を切替えて 表示出来るものであれば構いません。