質問

この質問は派生しています 私の以前のSO質問は賞賛しています.

私は、PLCのBCDと小数に関する解釈と混同しています。 PLCドキュメントでは、どういうわけかBCD = 10進数を意味します。

enter image description here

命令は、BCDとしてD300、0100の内容を読み取ります。参照 サイバーSlueth Omegaの答えオンラインBCD-HEXコンバーター, 、0100(BCD)= 4(10進)= 4(16進)が、ドキュメントは0100(BCD)= 100(小数)を示しています。

なんで?

役に立ちましたか?

解決

  • BCDは16進数です
  • BCDはバイナリではありません
  • ヘックスはバイナリではありません
  • BCDとHEXは、バイナリ情報の表現です。

唯一の違いは、数字を解釈する方法にあることです。いくつかのPLCの指示は一言のメモリを取り、それを教えてくれます 「私は、ティムの指導であり、D300の生データをBCDデータとして扱うことを約束します」。 それはまだ六角形のデータですが、それは異なって解釈されます。

d300 = [x2486] - >タイマー(例として)は248.6秒待ちます。 HEX 2486 = 9350 10進数であっても。ヘックスデータを何でも扱うことができます。ヘックスデータをエンコードされたBCDとして扱うと、1つの答えが得られます。あなたがそれを単純に署名したバイナリ番号として扱うならば、あなたは別のものを取得するなどを取得します。

d300 = [x1a3d] - > timは、非BCD 16進数が含まれているため、エラーフラグをスローします。

さらに、上記の例には、バイナリ数字ではなく、六角形が表示されています。 [x0100]を例として選択したため、混乱しています - ゼロとそれのみのみです。これをオンラインコンバーターに差し込むと、バイナリ0100を10進数に変換しています。ヘキサデシマルはバイナリではありません-HEXは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メモリの場所は、小数桁のみを使用できます。 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

もう1つの方法では、小数値をメモリ位置に渡し、純粋な16進数(BCDヘックスではなく!)として保存する場合は、 '&'シンボルを使用します。

たとえば - > [MOV #123 D300]

これにより、hex値x0123がメモリロケーションD300に移動します。これを16進数として解釈する将来の操作でD300を使用すると、小数値は291です。BCD値として解釈する命令で使用すると、123の小数値があります。

代わりにそうする場合 [MOV &123 D300]

これにより、小数値123をD300に移動し、16進数 - > [x007b]として保存します。これを16進数として解釈する将来の操作でD300を使用すると、123の小数値があります。BCD値として解釈する命令で使用しようとすると、[x007b]のためにエラーが発生します。有効なbcd桁ではない16進数「b」が含まれています。

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top