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:

entrez la description de l'image ici

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top