この質問は、私の前のSO質問の表彰から派生しています。
PLCのBCDと小数の解釈と混同しています。PLCのドキュメントでは、BCD=10進数を意味します。
この命令は、D300、0100の内容をBCDとして読み取ります。Cyber Slueth Omegaの回答とオンラインBCD-Hexコンバーターを参照すると、0100(BCD)= 4(Decimal)= 4(Hex)ですが、ドキュメントには0100(BCD)= 100(Decimal)と記載されています。
なんで?
この質問は、私の前のSO質問の表彰から派生しています。
PLCのBCDと小数の解釈と混同しています。PLCのドキュメントでは、BCD=10進数を意味します。
この命令は、D300、0100の内容をBCDとして読み取ります。Cyber Slueth Omegaの回答とオンラインBCD-Hexコンバーターを参照すると、0100(BCD)= 4(Decimal)= 4(Hex)ですが、ドキュメントには0100(BCD)= 100(Decimal)と記載されています。
なんで?
2進化10進数は、0〜9の範囲に制限された16進数としてエンコードされます。これは、BCDを意味する場合、0x0100を100として読み取る必要があることを意味します。AからFまでの16進数の数字は、有効なBCD番号ではありません。
唯一の違いは、数字の解釈方法にあります。一部の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」が含まれています。