
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が扱われるのかについても教えていただけると幸いです。
A 回答 (9件)
- 最新から表示
- 回答順に表示
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 とは異なる処理であることを理解してください。
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-engineerin …
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/ …
http://www.fa.omron.co.jp/products/family/1651/l …
蛇足
正式な理解ではなくて、簡略的理解する方法
「BCDとは16進数からA~Fを取り除いたもの」
このように書くとマイコン屋さんから怒られるけど
PLC屋にはこれで十分である
最近のPLCにはBCD以外に浮動小数点やら余計な物が増えたし
浮動小数点を人に解説するのは難しい
マイナスデータ2の補数表現の解説も困難
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)
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進数について基本的な知識を積んでください。
機器間のデータ通信でアセンブリ言語(ニーモニック)等を使う場合は特に注意が必要でしょう。
この回答への補足
>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進数に変換したことによるものです。
→すみません、ちょっとよく理解できないのですが、どういうことでしょうか?
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. …
http://www.yamaha-motor.co.jp/robot/lineup/flipx/
計量器や距離、流量等のアナログ系センサ
http://www.aandd.co.jp/adhome/products/index_wei …
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 …
それらのデータをPLCへ入力する為にBCDを使う場合があります
現代では所謂ネット通信等でのIFが増えたので
BCDでIFする事例は減りましたが
昔は通信系オプションが高価だったからと言うのが最大の理由
タッチパネルも昔は大変高価だったので、
デジSWや7SEGを多数並べた方が安かったが
現代では人件費の方が高くなったので、
デジSWを多数並べると配線工数が高くなって、タッチパネルの方が安価になる
とどのつまり、現代ではBCDを使わなければならない事例は減った
この回答への補足
デジSWなどは各桁ごとに分かれていて、0~9までしか表現できない
つまり、BCDデータにするしかPLCに読ませる方法がないってことなんですかね?
デジタルのタッチパネルなんかだと、そのまま63をBINデータでCPUに転送できるけど、
デジスイッチは63をそのまま表現できないので、しかたなく6と3に分けなければならないということなんですかねぇ??
最近は使わなくなったんですね!?
知らなかった・・・学習ページなどを見てるとさも当たり前のように使われていたので今でも現役なのかと思っていました・・・。
デジSWでの使用理由はわかりますが、単軸ロボなどで使われるのはなんかメリットあるんでしょうか?
単軸ロボで使うときにはどんな構成で使われるのでしょうか?
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/ITBASI …
プログラム言語では金融計算によく使われていたCOBOLはBCDが扱えますし、もっと身近な物では電卓も内部ではBCD値で計算している物が多いそうです。
No.3
- 回答日時:
BCDは2進数的な10進数でしかないので16進数的な発想は忘れてください
63→0110 0011とするか63→00111111とするかによって
戻すときのロジックも変わってきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- UNIX・Linux bash環境でのエラー対応をお願い致します。 1 2022/11/26 17:41
- 数学 数学の質問です。 cos∠BCD=−1/6とします。 「∠BCD=θと置いて、cosθ=-1/6」 5 2023/04/19 18:27
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) Excelにの以下の設定方法について教えてください! C列にデータ入力の設定をしています。(出、入を 3 2022/06/22 01:33
- システム 質問です。 仮分数はどういう状態ですか? プログラムについてです。 例えば、とあるプログラムで、アイ 1 2023/07/24 01:39
- 数学 数学の質問です。 cos∠BCD=−1/6とします。 「∠BCD=θと置いて、cosθ=-1/6」 2 2023/04/19 18:17
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
風俗店へ行く前のご飯
-
値が入っているときだけ計算結...
-
検便についてです。 便は取れた...
-
精液の落とし方を教えてください
-
ワードのページ番号をもっと下...
-
検便についてです。質問が二つ...
-
2つの数値のうち、数値が小さい...
-
Excel 数値の前の「 ' 」を一括...
-
勃起する時って痛いんですか? ...
-
彼女のことが好きすぎて彼女の...
-
腕を見たら黄色くなってる部分...
-
【Excelで「正弦波」のグラフを...
-
ある範囲のセルから任意の値を...
-
Excel 0目標に対して数字があ...
-
EXCELで条件付き書式で空白セル...
-
病院側から早く来てくださいと...
-
VLOOKUP関数を使用時、検索する...
-
精子に血が・・・
-
イタリアから帰国する際、肉製...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
尿検査前日に自慰行為した時の...
-
至急!尿検査前日にオナニーし...
-
検便についてです。 便は取れた...
-
彼女のことが好きすぎて彼女の...
-
値が入っているときだけ計算結...
-
リンク先のファイルを開かなく...
-
EXCELで条件付き書式で空白セル...
-
2つの数値のうち、数値が小さい...
-
VLOOKUP関数を使用時、検索する...
-
尿検査の前日は自慰控えたほう...
-
MIN関数で空白セルを無視したい...
-
小数点以下を繰り上げたものを...
-
風俗店へ行く前のご飯
-
エクセルで空白セルを含む列の...
-
Excel 数値の前の「 ' 」を一括...
-
【Excelで「正弦波」のグラフを...
-
納豆食べた後の尿の納豆臭は何故?
-
EXCELで式からグラフを描くには?
-
ある範囲のセルから任意の値を...
おすすめ情報