Vai al contenuto
PLC Forum


Conversione 32bit 16 Bit - SLC500


a.fava

Messaggi consigliati

:lol::lol:

Ho la necessità di risolvere il seguente problema:

Utilizzando una CPU 5/03 vado a leggere un valore a 32 bit da un posizionatore.

Per utilizzare questo valore con il PLC ho la necessità di convertirlo in due Word a 16 bit, in modo da ottenere

un valore HIGH WORD e LOW WORD.

La difficoltà sta nel fatto che la CPU accetta solo word il cui contenuto va -32768 a 32767.

Qualcuno mi può aiutare ?

Ringrazio sin d'ora e porgo cordiali saluti.

Alessandro

Link al commento
Condividi su altri siti


Gabriele Corrieri

Ciao Alessandro,

premetto che non so nemanco che faccia ha quel plc, e non so nemanco usare il software Rockwell, però se ben ci fai caso

1111.1111.1111.1111 (bin) = -32768 (dec) = FFFF (hex)

0111.1111.1111.1111 (bin) = +32767 (dec) = 7FFF (hex)

Ciao

Link al commento
Condividi su altri siti

Ciao, sono Luca.

Non ho ben capito cosa vuoi fare, ma nel SCL 500 5/03 i file a 32 bit sono floating point.

Quello che nuoi fare tu e separare la parte a sx della virgola dalla parte dx della virgola? o cosa?

Facci sapere.

Saluti, Luca Nazari

Link al commento
Condividi su altri siti

Ciao a tutti,

Devo essere più chiaro.

Il PLC in questione è collegato ad un inverter vettoriale con scheda di posizionamento a bordo.

Il valore di posizione che l'inverter trasmette al PLC è un intero a 32 bit e quindi posso tranquillamente caricarlo in una variabile del file F ad esempio F8:0.

Il set point che devo mandare dal PLC all'inverter lo posso mandare solamente con due Word a 16 bit con segno dove una è la parte alta del valore (con segno) e la seconda è la parte bassa(con segno).

Non capisco il perchè non sia possibile inviare il set point mediante un intero a 32 bit ma purtroppo è così.

Lo stesso problema esiste anche quando devo visualizzare la quota, trasmessa dall'inverter, su un Panel View che ragiona anche lui a 16 bit però senza segno. (Qui è più semplice)

Spero di essere stato più chiaro.

Cordiali saluti.

Alessandro

Link al commento
Condividi su altri siti

Premetto che non conosco A-B, anche se in azienda lo utilizziamo... Ho sempre cercato di tenermene alla larga!!! :D

Comunque, non capisco dove sia il problema, non puoi accedere alla memoria F a word invece che a doppia word?

Se non puoi farlo, allora dovresti avere delle funzioni di conversione da doppia word a singola che, integrate con operazioni di shiftaggio dei bit della doppia parola, dovrebbero risolvere il problema.

Comunque, ricorda che, di solito, il negativo di un numero binario corrisponde al complemento a due del valore assoluto, e che il complemento a due corrisponde al risultato del complemento a 1 (funzione NOT) aumentato di 1.

Ciao!

Link al commento
Condividi su altri siti

Il set point che devo mandare dal PLC all'inverter lo posso mandare solamente con due Word a 16 bit con segno dove una è la parte alta del valore (con segno) e la seconda è la parte bassa(con segno).

i casi possono essere 2:

Caso 1. nelle word in arrivo dell'inverter la word bassa va (per esmpio) da 1 a 10000 nella word alta ci sono le decine di migliaia (cosa che mi sembra molto strana). Allora scomponi il tuo valore (divisione per 10000, ecc)

Caso2. Le due word delll'inverter sono una word a 32 scomposta (non mi ricordo bene come viene scomposto il valore). In questo caso fai un Copy per esempio: Cop (Source) F8:0 (Dest) N7:0 (Lentgh)1. Se hai un Plc per provare in N7:0 ed N7:1 trovi un valore che è il float 32 bit scomposto. E' da provare se la lunghezza deve essere di 1 o 2.

Spero di esserti stato d'aiuto, se hai problemi chiedi pure.

Saluti, Luca Nazari

Link al commento
Condividi su altri siti

Vorrei rispondere a TRUNC.

Fai male a startene alla larga.

Ricorda che, se posso esprimere la mia opinione dopo almeno 20 anni di programmazione, il tempo di sviluppo di un programma con SLC500, risulta di un 40% inferiore allo sviluppo di un programma con PLC della concorrenza e dello stesso livello di potenzialità.

Inoltre la sua configurazione risulta essere notevolmente più intuitiva e rapida di qualunque altro da me utilizzato.

Questo problema è nato perchè ho voluto utilizzare un inverter, sempre Allen Bradley e che il cliente mi ha espressamente richiesto, di una serie che raramente viene richiesto sul mercato Italiano.

Ad essere sincero non ho ben capito del perchè abbiano utilizzato questo sistema, ma probabilmente una ragione deve esserci e naturalmente anche la soluzione del problema.

Nel sistema operativo del PLC esiste una funzione che simula questa conversione, che utilizza i registri S:13 e S:14,ma purtroppo non è completamente accessibile all'utente.

Ora vedrò di scaricare i manuali di questo inverter, 16 Mbyte in PDF, e se riuscirò a leggerne tutte le pagine, ovviamente in Inglese Americanato, probabilmente troverò anche la soluzione.

In tal caso vi farò sapere.

Nel frattempo se qualcuno ha qualche idea ..... (Però penso che debba conoscere a fondo SLC500).

Grazie a tutti quelli che anno e che vorranno rispondere.

Saluti

Alessandro

Link al commento
Condividi su altri siti

:rolleyes:

Per Luca,

purtroppo il tuo suggerimento non funziona.

Ho trovato una soluzione, anche se un pò empirica, però funziona.

Portare a livello alto il Flag S:2/14

Utilizzando i registri matematici della CPU, eseguire una istruzione MOV

Sorgente F8:0 e destinazione S:13.

In questo modo la parte bassa della variabile floating F8:0 viene correttamente trasferita nel registro matematico S:13 .

Nel registro matematico S:14 andrà inserito il valore dei multipli di 65535 contenuti nella F8:0 calcolandoli con una CPT.

In fondo al segmento di programma azzerare la Flag di Overflow S:5/0

Il tutto l'ho provato e funziona.

Non è detto che sia l'unica soluzione, qualcuno potrà risolvere il problema in modo più elegante, ma data l'urgenza mi può andare bene.

Spero che ritorni utile ad altre persone.

Cordiali saluti.

Alessandro

Link al commento
Condividi su altri siti

Ho trovato che sul manuale Pubblicazione 1747-6.15it.pdf (reperibile all'indirizzo: http://www.ab.com/manuals/it/cp/slc500/174...m008a-it-p.pdf) spiega l'utilizzo dei registri S:13 e S:14.

Spero che ti possa servire.

Non ho però ben capito come è il formato dei dati (word alta, worda bassa) che devi passare all'inverter.

Saluti, Luca Nazari

Link al commento
Condividi su altri siti

Ciao Luca,

il formato con cui devo inviare i dati all'inverter, non è nient'altro che lo stesso spiegato nel post precedente.

Una volta ricavato il valore nei registri S:13 e S:14, le trasferisci in una word N7:0 e N7:1 che automaticamente vengono lette dall'inverter, il quale , a sua volta, era stato programmato in modo da leggere la quota a cui deve posizionarsi nella word N7:0 (Low Word) e N7:1 (High Word).

Purtroppo non c'è nessun altro modo per poter impostare la quota.

Ho chiesto il motivo di questo strano modo di funzionamento ai tecnici Rockwell, ed è emerso che la ragione, presunta, è garantire la compatibilità di numerose schede di interfaccia a 16 bit ancora disponibili per SLC500.

Grazie ancora per l'interessamento.

Saluti

Alessandro

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...