Domanda

Questa domanda deriva da la mia precedente domanda SO è lodata.

Sono confuso con l'interpretazione del PLC di BCD e decimale.In una documentazione PLC, in qualche modo implica BCD = decimale:

enter image description here

L'istruzione legge il contenuto di D300, 0100, come BCD.Riferito a La risposta di Cyber ​​Slueth Omega E convertitore BCD-Hex online, 0100 (BCD) = 4 (Decimale) = 4 (Hex), ma la documentazione indica 0100 (BCD) = 100 (Decimale).

Perché?

È stato utile?

Soluzione

  • BCD è HEX
  • BCD non è binario
  • HEX non è binario
  • BCD e HEX sono rappresentazioni di informazioni binarie.

L’unica differenza sta nel modo in cui decidi di interpretare i numeri.Alcune istruzioni del PLC prenderanno un pezzo di memoria di parole e te lo diranno "Io, l'istruzione TIM, prometto di trattare i dati grezzi in D300 come dati BCD". Sono ancora dati HEX, ma li interpretano diversamente.

Se D300 = [x2486] --> il timer (come esempio) attenderà 248,6 secondi.Questo anche se HEX 2486 = 9350 decimale.Puoi trattare i dati esadecimali come qualsiasi cosa.Se tratti i dati esadecimali come BCD codificati ottieni una risposta.Se lo tratti come un semplice numero binario senza segno ne ottieni un altro, ecc.

Se D300 = [x1A3D] --> TIM genererà un flag di errore perché D300 contiene cifre esadecimali non BCD

Inoltre, l'esempio sopra mostra cifre esadecimali, non cifre binarie.È fonte di confusione perché hanno scelto [x0100] come esempio: solo zero e uno.Quando lo colleghi al tuo convertitore online stai sbagliando: stai convertendo il binario 0100 in decimale 4.L'esadecimale non è binario: esadecimale è una rappresentazione base16 del binario.

L'anatomia di una posizione della memoria D è questa

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

Una posizione di memoria D può memorizzare valori da x0000 -> xFFFF (decimale 0-65535).Una posizione di memoria D utilizzata per memorizzare valori BCD, tuttavia, può utilizzare solo cifre decimali.A->F non sono ammessi.Ciò riduce l'intervallo di una posizione di memoria a 16 bit a 0000->9999.

Contando diresti:

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

Viceversa, se desideri passare un valore decimale a una posizione di memoria e memorizzarlo come puro esadecimale (non esadecimale BCD!), utilizza il simbolo "&".

Ad esempio -> [MOV #123 D300]

Questo sposta il valore HEX x0123 nella posizione di memoria D300.Se in un'operazione futura utilizzi D300 che lo interpreta come un numero esadecimale, avrà un valore decimale di 291.Se lo usi in un'istruzione che lo interpreta come valore BCD, avrà un valore decimale pari a 123.

Se invece lo fai [MOV &123 D300]

Questo sposta il valore decimale 123 in D300 e lo memorizza come numero esadecimale -> [x007B]!Se si utilizza D300 ora in un'operazione futura che lo interpreta come un numero esadecimale, avrà un valore decimale di 123.Se provi a usarlo in un'istruzione che lo interpreta come valore BCD, otterrai un ERRORE perché [x007B] contiene la cifra esadecimale 'B' che non è una cifra BCD valida.

Altri suggerimenti

Decimale con codice binario è codificato come cifre esadecimali con un intervallo limitato da 0 a 9.Ciò significa che 0x0100 dovrebbe essere letto come 100 quando si intende BCD.I numeri con cifre esadecimali dalla A alla F non sono numeri BCD validi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top