为什么BCD = PLC中的十进制?

时间:2012-02-21 10:33:15

标签: decimal plc bcd

此问题源自my previous SO question's commends

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

enter image description here

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

为什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

  • BCD是HEX
  • BCD不是二进制
  • HEX不是二进制
  • BCD和HEX是二进制信息的表示。

唯一的区别在于你决定如何解释这些数字。一些PLC指令将采用一段字存储器,并告诉您“I,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-memory位置可以存储来自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。 / p>

如果您执行[MOV &123 D300]

这将十进制值123移动到D300并将其存储为十六进制数 - > [x007B]!如果你现在在将来的操作中使用D300,将其解释为十六进制数,则它的十进制值为123.如果你试图在一个将它解释为BCD值的指令中使用它,你将得到一个错误,因为[x007B]包含十六进制数字'B',它不是有效的BCD数字。