此问题源自my previous SO question's commends。
我对PLC对BCD和十进制的解释感到困惑。 在PLC文档中,它以某种方式暗示BCD =十进制:
指令读取D300,0100的内容为BCD。参考Cyber Slueth Omega's answer和online BCD-Hex converter,0100(BCD)= 4(十进制)= 4(十六进制),但文档指示0100(BCD)= 100(十进制)。
为什么?
答案 0 :(得分:2)
Binary-coded decimal被编码为十六进制数字,其范围限制为0-9。这意味着当表示BCD时,0x0100应该被读为100。从A到F的十六进制数字的数字不是有效的BCD编号。
答案 1 :(得分:2)
唯一的区别在于你决定如何解释这些数字。一些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数字。