这个问题来自我之前的 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)。
为什么?
这个问题来自我之前的 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)。
为什么?
二进制编码的十进制被编码为具有 0-9 有限范围的十六进制数字。这意味着当表示 BCD 时,应将 0x0100 读取为 100。从 A 到 F 的十六进制数字不是有效的 BCD 数字。
唯一的区别在于您决定如何解释这些数字。有些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”。