Pourquoi BCD= Decimal dans PLC?
Question
Cette question est dérivée de les félicitations de ma précédente question SO .
Je suis confus avec l'interprétation de PLC du BCD et du décimal. Dans une documentation PLC, cela implique en quelque sorte BCD= decimal:
L'instruction lit le contenu du D300, 0100, sous forme de BCD.En vous référant à réponse de Cyber Slueth Omega et convertisseur BCD-Hex en ligne , 0100 (BCD)= 4 (Decimal)= 4 (Hex), maisla documentation indique 0100 (BCD)= 100 (décimal).
Pourquoi?
La solution
- BCD est HEX
- Le BCD n'est pas binaire
- HEX n'est pas binaire
- BCD et HEX sont des représentations d'informations binaires.
La seule différence réside dans la manière dont vous décidez d'interpréter les nombres. Certaines instructions PLC prendront un morceau de mémoire de mots et vous diront que "Je, l'instruction TIM, promets de traiter les données brutes du D300 comme des données BCD". Ce sont toujours des données HEX, mais elles l'interprète différemment.
Si D300= [x2486] -> la minuterie (comme exemple) attendra 248,6 secondes. Ceci même si HEX 2486= 9350 décimal. Vous pouvez traiter les données hexadécimales comme n'importe quoi. Si vous traitez les données hexadécimales comme des BCD encodés, vous obtenez une réponse. Si vous le traitez comme un nombre binaire non signé, vous en obtenez un autre, etc.
Si D300= [x1A3D] -> TIM lancera un indicateur d'erreur car D300 contient des chiffres hexadécimaux non BCD
De plus, l'exemple ci-dessus montre des chiffres HEX et non des chiffres BINARY. C'est déroutant car ils ont choisi [x0100] comme exemple - seulement des zéros et des uns. Lorsque vous branchez ceci dans votre convertisseur en ligne, vous le faites mal - vous convertissez le binaire 0100 en décimal 4. L'hexadécimal n'est pas binaire - l'hex est une représentation base16 du binaire.
Voici l'anatomie d'un emplacement de mémoire 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
Un emplacement de mémoire D peut stocker des valeurs de x0000 -> xFFFF (décimal 0-65535). Un emplacement de mémoire D utilisé pour stocker les valeurs BCD, cependant, ne peut utiliser que des chiffres décimaux. A-> F ne sont pas autorisés. Cela réduit la plage d'un emplacement mémoire 16 bits à 0000-> 9999.
En comptant, vous iriez:
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
Dans l'autre sens, si vous souhaitez passer une valeur décimale à un emplacement mémoire et la stocker en hexadécimal pur (pas en hexadécimal BCD!), vous utilisez le symbole '&'.
Par exemple -> [MOV #123 D300]
Cela déplace la valeur HEX x0123 vers l'emplacement de mémoire D300. Si vous utilisez D300 dans une opération future qui l'interprète comme un nombre hexadécimal, alors il aura une valeur décimale de 291. Si vous l'utilisez dans une instruction qui l'interprète comme une valeur BCD, alors il aura une valeur décimale de 123.
Si à la place vous faites [MOV &123 D300]
Cela déplace la valeur décimale 123 vers D300 et la stocke sous forme de nombre hexadécimal -> [x007B]! Si vous utilisez D300 maintenant dans une opération future qui l'interprète comme un nombre hexadécimal, il aura une valeur décimale de 123. Si vous essayez de l'utiliser dans une instruction qui l'interprète comme une valeur BCD, vous obtiendrez une ERREUR car [x007B] contient le chiffre hexadécimal 'B' qui n'est pas un chiffre BCD valide.
Autres conseils
décimal codé en binaire est codé sous forme de chiffres hexadécimaux dont la plage est limitée à 0-9.Cela signifie que 0x0100 doit être lu comme 100 lorsque BCD est destiné.Les nombres avec des chiffres hexadécimaux de A à F ne sont pas des nombres BCD valides.