Vai al contenuto
PLC Forum


"concatenare" Due Variabili Nel Plc


sperimento

Messaggi consigliati

Salve,

scusate la consueta banalità delle mie domande.

Avendo una variabile INT con Value 12

Avendo un'altra variabile INT con Value 30

Sono alla ricerca di un modo per unirle e ottenere la variabile 1230, quest'operazione dovrà essere fatta dal PLC.

In sostanza ho necessità di "concatenare" due variabili.

Non riesco davvero a capire come fare un'operazione del genere.

Grazie come sempre!

Link al commento
Condividi su altri siti


Dipende dal tipo di plc. Se il tuo PLC supporta le variabili in DW copi i due interi nelle locazioni di memoria a cui corrisponde la DW.

Cerco di chiarire con un esempio.

Ammettiamo che la tua DW sia allocata ai bytes 255, 254, 253, 252; int1 (V = 12) corrisponda ai bytes 127, 126 mentre int2 (V = 30) corrisponda ai bytes 111, 110.

Copy i bytes 127,126 in 255, 254 ed i bytes 111, 110 in 253,252.

Attenzione a come sono organizzate le variabili nei differenti PLC. Alcuni hanno il byte più significativo all'indirizzo più alto, altri all'indirizzo più basso.

Se il PLC lo permette puoi, in sede di definizione delle variabili, arrangiare gli indirizzi delle due variabili Intere in modo da formare un intero lungo o DW.

Link al commento
Condividi su altri siti

Salve,

se le variabili di esempio da concatenare somo sempre composte da due cifre (decine-unità) allora ti è sufficiente fare:

12*100+30=1230

Nel caso in cui le variabili contengano più o meno di due cifre , allora devi fare degli opportuni controlli per determinare la costante moltiplicativa da usare (che nell'esempio è = 100).

Non hai specificato il PLC che usi, potrebbe anche darsi che questo abbià già nel suo set di istruzioni o funzioni di biblioteca qualcosa che faccia al caso tuo.

Altra cosa.....per evitare overflow etc. etc. è il caso di impiegare variabili a 32bit.

Modificato: da cagliostro
Link al commento
Condividi su altri siti

Ciao Livio, credo di aver trovato un escamotage per risolvere.

Qualora qualcuno si trovi nella mia stessa situazione con un Elsist Slimline spiego brevemente come ho risolto:

Navigando nelle librerie del PLC (quelle aggiunte: ePLCUtyLib) ho trovato le funzioni ByteToWord e WordToByte.

Dando come Byte1 '13' e come Byte2 '30" ottengo la Word '3358'. La procedura inversa WordToByte funziona allo stesso modo, da 3358 ottengo '13' e '30'. Ho verificato con un po' di prove che il numero che ottengo è sempre univoco e crescente, quindi nella logica di ciò che devo fare queste funzioni mi vanno bene.

Mi pare di aver capito che con il primo numero ottengo un multiplo di 256 (1 + 1 = 256, 1 + 2 = 257, 2 + 1 = 513, 2 + 2 = 514), il secondo invece è un semplice addizionale.

Infatti (3358 - 30) / 256 = 13.

Con un po' di lavoro credo di poterla ripetere anche con il code builder di WinLog, così da usarla anche per l'invio di una singola variabile al PLC contenente Ore:Minuti.

In questo modo dimezzo il numero di tags che vado ad usare lato SCADA e risparmio qualche eurino sul runtime :) :)

Ciao e grazie.

EDIT: Cagliostro, grazie anche a te.

Modificato: da sperimento
Link al commento
Condividi su altri siti

Errata corrige in quanto ho scritto, che è chiaramente sbagliato:

Sommando due byte 1 + 1 ottengo una Word 257, 1 + 2 = 258, etc. :rolleyes:

Allo stesso modo splittando una Word 257 mi ritorna due byte, 1 + 1

Link al commento
Condividi su altri siti

La situazione si complica...............

Ora mi trovo a costruire un blocco funzione dove devo concatenare tre variabili dove le più alte possono essere

31 - 12 - 2099

Ipotizzando che quest'impiantino resti su per ottant'anni :lol:

Devo ottenere una variabile unica 31122011, visto che devo specificare un tot di date predefinite in cui l'out resta spento, ad esempio capodanno, natale, 1° maggio, etc.

Volevo fare una serie:

festivita.png

Dove Var1 è dataodierna composta come ho indicato, mentre Var2 è data di spegnimento composta nello stesso modo.

Ora sì che si accettano volentieri suggerimenti, cercherò comunque di fare come ha detto Livio, setacciando le aree di memoria interessate.

Link al commento
Condividi su altri siti

Mi pare di aver capito che con il primo numero ottengo un multiplo di 256 (1 + 1 = 256, 1 + 2 = 257, 2 + 1 = 513, 2 + 2 = 514), il secondo invece è un semplice addizionale.

Sperimento prima di sperimentare ci vorrebbe un minimo di studio!

Devi sapere che i PLC basano il loro funzionamento sul sistema binario. Da questo si comprendono tutte le cose che stai "sperimentando". Un byte è formato da 8 bit; ogni bit può valere 1 o 0. Dalla combinazione di questi 8 bit otterrai (in decimale) numeri da 0 a 255. Mettendo due byte vicini (concatenandoli) otterrai una word a 16bit. Dalla combinazione di 16bit otterrai in decimale numeri da 0 a 65535. Concatenando due word formerai una doppia word a 32bit.....idem come prima.

Secondo me ti stai complicando la vita con le trasformazioni che vuoi ottenere per "risparmiare" poche tag.

Cercando di seguire la tua filosofia, tu vorresti ottenere in decimale un numero che rappresenti (codificato opportunamente) una data.

Credo che come ti ha indicato cagliostro debba sfruttare la moltiplicazione per multipli di 10 per spostare il numero desiderato asinistra per tante posizioni quante bastano

Nel tuo esempio 31 - 12 - 2099:

31*1000000+12*10000+20*100+99 ed il risultato lo trasferisci in una doppia word ( per esempio identificata come MD o %MD o altro)

In definitiva devi sfruttare semplicemente le proprietà del sistema con cui vuoi lavorare (binario, decimale, ottale, esadecimale)

Dopo di che farai le opportune logiche di comparazione

sapendo che

MD0 = data attuale

MD4 = natale

MD8 = 1 maggio

MD12 = 2 giugno

MD16 = 15 agosto

se MD0<>MD4 and MD0<>MD8 and MD0<>MD12 and MD0<>MD16 allora (fa qualcosa/non fa nulla)

MD0 (data attuale) <> MD4 and

Link al commento
Condividi su altri siti

Ciao Diego,

ognuno ha il proprio approccio, certamente il mio non è il migliore ma è l'unico che riesco ad usare.

Ammetto che ho sempre avuto difficoltà ad applicare gli studi teorici alla pratica e mi sono sempre trovato meglio con l'approccio inverso (scoprire la teoria mediante la soluzione pratica delle problematiche), non per niente davanti al mio nome non ci sarà mai scritto "Ing."

Ed è con una certa amarezza che lo dico.

Premesso comunque che tutto quello che sto facendo è solo per me e non devo venderlo a nessuno, se ci sarà qualche abominio nei programmi non avrò fortunatamente da renderne conto a terzi.

Quanto al resto: ti ringrazio per la spiegazione, oggi tornando in macchina da lavoro e ripensando alla spiegazione di cagliostro ero arrivato alla conclusione che effettivamente con i giusti moltiplicatori potevo comporre la variabile di cui avevo bisogno anche per quel che riguarda la data. Me ne hai dato ulteriore conferma.

Mi rendo conto che il mio approccio empirico possa essere mal digerito in un forum di professionisti del settore o comunque di persone che hanno dedicato il giusto tempo allo studio, ma mi auguro possiate continuate a tollerarlo e a imboccarmi sulla giusta strada.

Del resto non chiedo, come ho visto fare, di risolvere i problemi al posto mio, è solo che ho un modo di risolverli che non riesco a scrollarmi di dosso.

Anche solo mettere le cose su carta prima di realizzarle, prendere appunti, annotarmi le logiche man mano che le scoprivo, per me è stata una grossa novità.

Vi (e mi) prometto che cercherò di passare più tempo sulle 456 pagine del Bergamaschi, su cui Venerdì sono riuscito finalmente a mettere le mani, e meno davanti al computer.

Ciao e grazie ancora.

Link al commento
Condividi su altri siti

A quest'ora non ho voglia di leggere attentamente, comunque quando si tratta di una data a volte conviene convertire in BCD, per ogni 2 cifre ti basta 1 byte, quindi per gg/mm/aaaa ti bastano 4 bytes.

Non conosco quel plc, di solito l'istruzione di conversione c'è sempre, e quello scada/hmi, anche lì di solito è possibile visualizzare un byte in bcd (o esadecimale facendo un po' di attenzione).

Spero di essere stato di aiuto... notte.

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...