Почему BCD = десятичное число в ПЛК? - PullRequest
1 голос
/ 21 февраля 2012

Этот вопрос является производным от комментариев моего предыдущего SO .

Меня смущает интерпретация ПЛК BCD и десятичной дроби.В документации ПЛК это как-то подразумевает BCD = десятичное число:

enter image description here

Инструкция читает содержимое D300, 0100 как BCD.Ссылаясь на ответ Cyber ​​Slueth Omega и онлайн BCD-шестнадцатеричный преобразователь , 0100 (BCD) = 4 (десятичное число) = 4 (шестнадцатеричное), но в документации указано 0100 (BCD) = 100(Десятичный).

Почему?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012
  • BCD является HEX
  • BCD не является двоичным
  • HEX не является двоичным
  • BCD и HEX являются представлениями двоичной информации.

Единственная разница в том, как вы решили интерпретировать числа.Некоторые инструкции ПЛК занимают часть памяти слов и сообщают вам, что «Я, инструкция TIM, обещаю обрабатывать необработанные данные в D300 как данные BCD». Это все еще данные HEX, но они интерпретируютэто по-другому.

Если D300 = [x2486] -> таймер (как пример) будет ждать 248,6 секунды.Это даже при том, что HEX 2486 = десятичный знак 9350.Вы можете обрабатывать шестнадцатеричные данные как угодно.Если вы рассматриваете шестнадцатеричные данные как кодированные BCD, вы получите один ответ.Если вы рассматриваете его как простое двоичное число без знака, вы получаете другое и т. Д.

Если D300 = [x1A3D] -> TIM выдаст флаг ошибки, поскольку D300 содержит шестнадцатеричные цифры не-BCD

Кроме того, в приведенном выше примере показаны шестнадцатеричные цифры, а не двоичные цифры.Это сбивает с толку, потому что они выбрали [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).В ячейке D-памяти, которая используется для хранения значений BCD, могут использоваться только десятичные цифры.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

Если вы хотите передать десятичное значение в ячейку памяти и сохранить его в чистом шестнадцатеричном виде (не в шестнадцатеричном шестнадцатеричном формате!)) вы используете символ '&'.

Например -> [MOV #123 D300]

Это перемещает значение HEX x0123 в ячейку памяти D300.Если вы будете использовать D300 в будущей операции, которая будет интерпретировать это как шестнадцатеричное число, тогда у него будет десятичное значение 291. Если вы используете его в инструкции, которая интерпретирует его как значение BCD, тогда у него будет десятичное значение 123.

Если вместо этого вы сделаете [MOV &123 D300]

Это переместит десятичное значение 123 в D300 и сохранит его как шестнадцатеричное число -> [x007B]!Если вы используете D300 сейчас в будущей операции, которая интерпретирует это как шестнадцатеричное число, у него будет десятичное значение 123. Если вы попытаетесь использовать его в инструкции, которая интерпретирует его как значение BCD, вы получите ОШИБКУ, потому что [x007B]содержит шестнадцатеричную цифру «B», которая не является действительной цифрой BCD.

2 голосов
/ 21 февраля 2012

Двоичное двоичное кодирование кодируется в виде шестнадцатеричных цифр, которые имеют ограниченный диапазон 0-9. Это означает, что 0x0100 следует читать как 100, когда подразумевается BCD. Числа с шестнадцатеричными цифрами от A до F не являются действительными числами BCD.

...