【问题标题】:Why is BCD = Decimal in PLC?为什么BCD = PLC中的十进制?
【发布时间】:2013-03-07 20:13:24
【问题描述】:

这个问题来自my previous SO question's commends

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

指令读取D300,0100的内容,为BCD。参考Cyber Slueth Omega's answeronline BCD-Hex converter,0100(BCD)= 4(十进制)= 4(十六进制),但文档表明 0100(BCD)= 100(十进制)。

为什么?

【问题讨论】:

  • 如果解释为 bits0100 变为 4。如果解释为 nibbles,则 0100 变为 100,与 0000 0001 0000 0000 的位相同。

标签: decimal plc bcd


【解决方案1】:
  • BCD 是 HEX
  • BCD 不是二进制
  • HEX 不是二进制
  • 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-memory 位置的剖析是这样的

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”。

【讨论】:

  • PLC 中的字地址为十进制。 D300 中的 300 是十进制的,D100 中的 100 也是十进制的。 0100(BCD)如何最终成为相同的 100(十进制)? BCD也是十进制吗?所以 BCD = 十六进制 = 十进制?
  • 是的。 BCD 是“二进制编码的十进制” - 一种使用 bin/hex 数字来表示二进制数字的方式。 BCD 的唯一、唯一、唯一目的是使十六进制数字更易于阅读。而不是将十进制数 100 编码为纯十六进制为 [x0064] 它被编码为 [x0100]。这样,当您盯着寄存器中的数字时,您可以立即将其值识别为 100,而不必计算它。如果您想要一个 3 秒的计时器,您可以将 [x0030] 弹出到一个 100 毫秒 BCD 计时器中,并且不必为基于十六进制的计时器将其计算到 [x001E] 中。
  • ^ 抱歉 - 第一行编辑:“...表示 十进制 数字”
【解决方案2】:

Binary-coded decimal 被编码为 0-9 范围内的十六进制数字。这意味着当表示 BCD 时,0x0100 应该读为 100。从 A 到 F 的十六进制数字不是有效的 BCD 数字。

【讨论】:

  • 这是我的问题:首先,0100(十六进制)= 256(十进制)= 000100000000(二进制)。将256(十进制)转换回BCD得到0010 0101 0110。其次,指向内容0100的指针是BCD类型,所以我应该直接将0100作为BCD而不是十六进制,0100 BCD = 4(十进制)
  • 但是 0100(十六进制)= 256(十进制)。和 256(十进制)!= 100(BCD)。我的脑袋疼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2012-07-25
  • 2018-12-30
相关资源
最近更新 更多