1

この質問は、私の前のSO質問の表彰から派生しています。

PLCのBCDと小数の解釈と混同しています。PLCのドキュメントでは、BCD=10進数を意味します。

ここに画像の説明を入力してください

この命令は、D300、0100の内容をBCDとして読み取ります。Cyber​​ Slueth Omegaの回答オンラインBCD-Hexコンバーターを参照すると、0100(BCD)= 4(Decimal)= 4(Hex)ですが、ドキュメントには0100(BCD)= 100(Decimal)と記載されています。

なんで?

4

2 に答える 2

2

2進化10進数は、0〜9の範囲に制限された16進数としてエンコードされます。これは、BCDを意味する場合、0x0100を100として読み取る必要があることを意味します。AからFまでの16進数の数字は、有効なBCD番号ではありません。

于 2012-02-21T10:42:01.053 に答える
2
  • BCDはHEXです
  • BCDはバイナリではありません
  • HEXはバイナリではありません
  • BCDとHEXは、バイナリ情報の表現です。

唯一の違いは、数字の解釈方法にあります。一部のPLC命令は、ワードメモリの一部を取り、「I、TIM命令は、D300の生データをBCDデータとして扱うことを約束します」と通知します。 それはまだHEXデータですが、解釈が異なります。

D300 = [x2486]->の場合、タイマー(例として)は248.6秒待機します。これは、HEX 2486=9350の10進数ですが。16進データは何でも扱うことができます。16進データをエンコードされたBCDとして扱う場合、1つの答えが得られます。単純な符号なし2進数として扱うと、別の2進数などが得られます。

D300 = [x1A3D]->の場合、D300にはBCD以外の16進数が含まれているため、TIMはエラーフラグをスローします。

さらに、上記の例は、2進数ではなく16進数を示しています。彼らが例として[x0100]を選んだので、それは混乱を招きます-ゼロと1だけです。これをオンラインコンバータに接続すると、間違った処理をします。バイナリ0100を10進数4に変換します。16進数はバイナリではありません。16進数はバイナリのbase16表現です。

Dメモリの場所の構造はこれです

16 Bits     | xxxx | xxxx | xxxx | xxxx |  /BINARY/
   --->        |      |      |      |
4 bits/digit   D4     D3     D2     D1     /HEX/

example 
D300 = 1234 | 0001 | 0010 | 0011 | 0100 |
   ---->       1      2      3       4

example 
D300 = 2F6B | 0010 | 1111 | 0110 | 1011 |
   ---->       2      F      6       B

example (OP!)
D300 = 0100 | 0000 | 0001 | 0000 | 0000 |
   ---->       0      1      0       0

Dメモリの場所には、x0000-> xFFFF(10進数の0〜65535)の値を格納できます。ただし、BCD値を格納するために使用されるDメモリの場所では、10進数しか使用できません。A->Fは許可されていません。これにより、16ビットメモリ位置の範囲が0000->9999に減少します。

あなたが行くだろうカウントアップ:

Decimal    BCD      HEX
1         0001      0001
2         0002      0002     
3         0003      0003
4         0004      0004
5         0005      0005
6         0006      0006
7         0007      0007
8         0008      0008
9         0009      0009
10        0010      000A
11        0011      000B
12        0012      000C
13        0013      000D
14        0014      000E
15        0015      000F
16        0016      0010
17        0017      0011
18        0018      0012
19        0019      0013
20        0020      0014
...etc

逆に、10進値をメモリ位置に渡し、それを純粋な16進数(BCD 16進数ではありません!)として格納する場合は、「&」記号を使用します。

例-> [MOV #123 D300]

これにより、HEX値x0123がメモリ位置D300に移動します。これを16進数として解釈する将来の操作でD300を使用する場合、10進値は291になります。BCD値として解釈する命令で使用する場合、10進値は123になります。

代わりにあなたがするなら[MOV &123 D300]

これにより、10進数の123がD300に移動し、16進数として格納されます-> [x007B]!これを16進数として解釈する将来の操作でD300を使用すると、10進数の値は123になります。BCD値として解釈する命令でD300を使用しようとすると、[x007B]が原因でエラーが発生します。有効なBCD桁ではない16進数字「B」が含まれています。

于 2012-02-21T11:05:09.803 に答える