コンピューターやPLC(シーケンサー)内部での数の表現方法ですが、整数について分類すると大きくわけて、HEX(16進),BIN(10進表示(binary)),BCD(2進化10進表示(binary coded decimal notation)),OCT(8進),BIN(2進(binary))等があります。
このうちHEX(16進)とBIN(2進)は問題にはなりませんが、10進表記にする際にBINとBCDのふたつの形式があるのが厄介なところです。
どのような表記になるかといいますと、例えばビット列"1000 0000"を例にすると、BINでは「128」です。BCDでは「80」となります。BCDでは1桁に4ビットづつ割り振ります。従ってBCDでは16ビットで4桁表示となります。9999=1001 1001 1001 1001です。
普通16ビットでは1111 1111 1111 1111=65535までですが、BCDは9999までしか扱えません。大抵の機器は当然BINで表記していますが、一部のPLCメーカーはBCDを採用している例があるので注意が必要です。
これは外部デバイス(表示器やデジスイッチ)などに接続する場合は、1桁づつ入出力できる方が有利だったことの名残りですが、外部デバイスなどに入出力する際に、BCD変換してやれば済むことだったのですが、内部デバイスでもBCDに固執したメーカーがあった為、多少の混乱を招いています。
なお現在BCDからBINに移行中の大手PLCメーカーがありますが、移行中のためか、HEX,BIN,BCDが混在しているため、命令によってBINで扱われるもの(BSET等)とBCDで扱われるもの(TIM等)と両方が使われているので注意が必要です。
しかも定数表記はBCD,BINとも#だけです。せめて最大手メーカーのようにKは10進,Hは16進とか明示的に表記していただけると大変助かるのですが...
ちなみKとHはインテル系CPUのアセンブラ定数表記です。モトローラ系MPUは10進は#,16進は$と表記していました(昔の話なので現在はわかりません...)
いずれにせよ今後はBINに統一されると思いますが、移行中の間は多少の混乱がでそうです。 特にPLCのラダー屋さんはお気を付け下さい。
なお参考までに同じビット列でどのように表示されるかとまとめてみました。(なお全て符号無し(unsigned)です)
BIT列 | HEX | BIN | BCD | OCT |
---|---|---|---|---|
"0001 0010 0011 0100" | 1234 | 4660 | 1234 | 11064 |
"1010 1011 1100 1101" | ABCD | 43981 | error | 125715 |
"0000 0011 1110 1000" | 03EB | 1000 | error | 1750 |
これでおわかりかと思いますが、HEXとBCDはA〜Fまで含まないだけで、同一内容となります。逆にいうとA〜Fまで使用不能にされたHEXがBCDと言うこともできます。ただしBIN表記とまるで違う数字になることにご注意ください。
なおOCT(8進数)は教科書に載っているだけで、現在ではほとんど使われていません。
2001/09/09