- 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.