Perché BCD = Decimal nel PLC?
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:
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é?
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.