1

这个问题来自我之前的 SO question's 的表扬

我对 PLC 对 BCD 和十进制的解释感到困惑。在 PLC 文档中,它以某种方式暗示 BCD = 十进制:

在此处输入图像描述

指令读取 D300、0100 的内容为 BCD。参考Cyber​​ Slueth Omega 的回答在线 BCD-Hex 转换器,0100 (BCD) = 4 (Decimal) = 4 (Hex),但文档显示 0100 (BCD) = 100 (Decimal)。

为什么?

4

2 回答 2

2

二进制编码的十进制被编码为具有 0-9 有限范围的十六进制数字。这意味着当表示 BCD 时,应将 0x0100 读取为 100。从 A 到 F 的十六进制数字不是有效的 BCD 数字。

于 2012-02-21T10:42:01.053 回答
2
  • BCD 是十六进制
  • BCD 不是二进制的
  • 十六进制不是二进制
  • BCD 和 HEX 是二进制信息的表示。

唯一的区别在于您决定如何解释这些数字。有些PLC指令会占用一块字存储器,并会告诉您“我,TIM指令,承诺将D300中的原始数据视为BCD数据”。 它仍然是 HEX 数据,但它的解释不同。

如果 D300 = [x2486] --> 计时器(例如)将等待 248.6 秒。即使 HEX 2486 = 9350 十进制也是如此。您可以将十六进制数据视为任何内容。如果您将十六进制数据视为编码的 BCD,您会得到一个答案。如果你把它当作一个普通的无符号二进制数,你会得到另一个,等等。

如果 D300 = [x1A3D] --> TIM 将抛出错误标志,因为 D300 包含非 BCD 十六进制数字

此外,上面的示例显示 HEX 数字 - 而不是 BINARY 数字。这很令人困惑,因为他们选择了 [x0100] 作为他们的例子——只有零和一。当您将其插入在线转换器时,您做错了 - 您将二进制 0100 转换为十进制 4。十六进制不是二进制 - 十六进制是二进制的 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(十进制 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

反过来,如果您希望将十进制值传递到内存位置并将其存储为纯十六进制(而不是 BCD 十六进制!),则使用“&”符号。

例如 -> [MOV #123 D300]

这会将 HEX 值 x0123 移动到内存位置 D300。如果您在将来的操作中使用 D300,将其解释为十六进制数,则其十进制值为 291。如果您在将其解释为 BCD 值的指令中使用它,则其十进制值为 123。

相反,如果你这样做[MOV &123 D300]

这会将十进制值 123 移动到 D300 并将其存储为十六进制数 -> [x007B]!如果您现在在将来的操作中使用 D300,将其解释为十六进制数,它将具有十进制值 123。如果您尝试在将其解释为 BCD 值的指令中使用它,您将收到错误,因为 [x007B]包含不是有效 BCD 数字的十六进制数字“B”。

于 2012-02-21T11:05:09.803 回答