Cancer777 Inserito: 16 marzo 2020 Segnala Share Inserito: 16 marzo 2020 Ciao a tutti, qualcuno ha già utilizzato la funzione Swap con Schneider? ( In dettaglio con ambiente di sviluppo E.S.M.E o SoMachine Motion) purtroppo l'. schneider su questa funzione non è molto chiara se non per dire quasi assente…! Nello specifico il mio problema è il seguente: Leggo dei valori derivanti da un convertitore Modbus/EthIP esterno sottoforma di BYTE, devo elaborare questo BYTE andando a riordinarlo dal bit meno significativo a quello più significativo. Spero di aver esposto il mio problema nel modo più chiaro possibile Vi ringrazio anticipatamente per l'aiuto che potrete darmi Link al commento Condividi su altri siti More sharing options...
Mattia Musu Inserita: 19 marzo 2020 Segnala Share Inserita: 19 marzo 2020 Ciao, Se non sbaglio SoMachine Motion dovrebbe essere su piattaforma codesys; per cui potresti semplicemente usare le istruzioni SHL e SHR. Sostanzialmente è una funzione a cui gli passi una variabile in ingresso e gli indichi quanti bit shiftare a destra (SHR) o sinistra (SHL). Ti allego un immagine presa dalla documentazione relativa al tuo ambiente. Spero di essere stato utile. Link al commento Condividi su altri siti More sharing options...
batta Inserita: 19 marzo 2020 Segnala Share Inserita: 19 marzo 2020 Scusate se mi intrometto, pur non conoscendo Schneider, ma mi pare impossibile che non ci sia un'istruzione swap. In ogni caso, lo shift non va bene, perché i bit spostati a sinistra oltre il 16° bit, e quelli spostati a destra oltre il 1° bit vengono persi. Casomai, servirebbe un'istruzione di rotazione. Con una rotazione di 8 bit, in una variabile da 16 bit, di fatto vengono scambiati i due byte. Nel caso di una variabile a 32 bit però non andrebbe più bene, perché si dovrebbero scambiare tra loro il byte 0 con il byte 3, e il byte 1 con il byte 2. Si potrebbe fare una cosa simile: #myDWord_out.%B0 := #myDWord_in.%B3; #myDWord_out.%B1 := #myDWord_in.%B2; #myDWord_out.%B2 := #myDWord_in.%B1; #myDWord_out.%B3 := #myDWord_in.%B0; Però, ripeto: mi risulta difficile credere che non ci sia l'istruzione SWAP. Link al commento Condividi su altri siti More sharing options...
Mattia Musu Inserita: 20 marzo 2020 Segnala Share Inserita: 20 marzo 2020 Buongiorno Batta, E' vero la rotazione è anche una soluzione valida, ma come hai detto tu per dati oltre i 16 bit non può andare bene. Questo mondo è bello anche perché si possono trovare molteplici soluzioni a un problema. Lo shift può andare bene se usato con intelligenza, ad esempio: DATA TYPE - WORD Trasformiamo il dato in un array in DataInputWord[0..1] of BYTE, poi shiftiamo i singoli byte _TmpWord := SHL(DataInputWord[0],8) OR DataInputWord[1]; questo ti permette di swappare i due byte della word. DATA TYPE - DWORD Trasformiamo il dato in un array in DataInputDWord[0..3] of BYTE, poi shiftiamo i singoli byte _TmpDword := SHL(SHL(SHL(DataInputDWord[0],8) OR DataInputDWord[1],8) OR DataInputDWord[2],8) OR DataInputDWord[3]; Questo workaround lo uso spesso e lo trovo molto comodo. Ad ognuno il suo metodo! 🙂 Ad ogni modo le funzioni di swap, almeno su codesys, esistono ma serve scaricare delle librerie da importare nel progetto. Ciao! Link al commento Condividi su altri siti More sharing options...
batta Inserita: 20 marzo 2020 Segnala Share Inserita: 20 marzo 2020 10 ore fa, Mattia Musu ha scritto: Lo shift può andare bene se usato con intelligenza, ad esempio: Non è più semplice così? #myDWord_out.%B0 := #myDWord_in.%B1; #myDWord_out.%B1 := #myDWord_in.%B0; E comunque insisto sul fatto che credo che in codesys la funzione swap ci sia. Link al commento Condividi su altri siti More sharing options...
Mattia Musu Inserita: 21 marzo 2020 Segnala Share Inserita: 21 marzo 2020 Dichiarando una variabile di tipo WORD non hai l'accesso ai singoli BYTE ma solo ai singoli bit, in codesys. Perciò bisogna comunque convertire la word in un array di byte e poi, come giustamente suggerisci tu, swappare i byte nella mappatura dati di uscita. Come ho detto ci sono molteplici modi per farlo. Per chiarezza di codice all'interno di una funzione che mi restituisce un dato pulito, io preferisco usare il metodo suggerito in precedenza. Ad ogni modo, ho anche detto che, all'interno del repository librerie, si può importare sicuramente una libreria che esegue tali conversioni di dati. Ho appena fatto una ricerca e forse nel caso di Cancer777 potrebbe andare bene la seguente: la quale contiene alcune function Block per lo swap delle word e dword. Di seguito il link della documentazione relativa: https://www.overdigit.com/data/Products/Target-CoDeSys-Reference-Manual_EN.pdf Buon weekend! 🙂 Link al commento Condividi su altri siti More sharing options...
batta Inserita: 21 marzo 2020 Segnala Share Inserita: 21 marzo 2020 (modificato) 54 minuti fa, Mattia Musu ha scritto: Dichiarando una variabile di tipo WORD non hai l'accesso ai singoli BYTE ma solo ai singoli bit, in codesys. Io non conosco codesys. Rimango un po' basito nell'apprendere che non permette di accedere al byte di una word, e che non ha un'istruzione swap, se non importando librerie. Certo, ci vuole poco per crearsi una funzione ma, per me, l'istruzione SWAP, in operazioni a parole, è come un AND o un OR. Come può mancare? Ma come, codesys viene spesso spacciato per il non plus ultra per la programmazione dei plc, e non permette operazioni così elementari? Persino con il testo strutturato di Siemens (spesso accusata di essere scarna di istruzioni e funzioni) l'accesso al byte è consentito, ed esiste l'istruzione swap. Chiedo scusa, io sono nella sezione sbagliata, e la mia non vuole essere una critica a codesys o a SoMachine, o un'entrata a gamba tesa, ma apprendere quanto sopra mi ha sorpreso non poco. Modificato: 21 marzo 2020 da batta Link al commento Condividi su altri siti More sharing options...
zanellatofabio Inserita: 23 marzo 2020 Segnala Share Inserita: 23 marzo 2020 (modificato) Ciao a tutti, le cose dette da Batta sono sostanzialmente tutte giuste al 100%. Purtroppo in codesys non si può scrivere miaWord.%B0 in quanto accetta solo di "puntare a bit" e si scrive senza il %. Usando un ROL di 8 posizioni si scambiano i byte di una word. Per una dword bisogna usare altre soluzioni. Ma restando al primo post l'utente chiedeva Il 16/3/2020 alle 08:57 , Cancer777 ha scritto: devo elaborare questo BYTE andando a riordinarlo dal bit meno significativo a quello più significativo. Io così capisco che voleva scambiare i bit all'interno del byte anche se mi sembra molto strano. Siccome parla di modbus allora si leggono i registri che sono word quindi sarebbe utile che spiegasse da dove saltano fuori i byte. Sarebbe poi utile che indicasse anche il modello del plc che usa. Purtroppo codesys varia da target a target e poi meglio non chiamare in causa le librerie di altri target perche non sono utilizzabili per altri. Il 21/3/2020 alle 15:39 , Mattia Musu ha scritto: a quale contiene alcune function Block per lo swap delle word e dword. Di seguito il link della documentazione relativa: https://www.overdigit.com/data/Products/Target-CoDeSys-Reference-Manual_EN.pdf Overdigit mi sembra poi che sia codesys 2.3 mentre per schneider parliamo di codesys 3.5 e i due ambienti hanno ben poco da spartire. Modificato: 23 marzo 2020 da zanellatofabio Link al commento Condividi su altri siti More sharing options...
zanellatofabio Inserita: 23 marzo 2020 Segnala Share Inserita: 23 marzo 2020 Per completezza elenco anche la libreria CAA_memory ( standard dentro a codesys 3.5 ) per lo swap swap di byte in una word swap di byte in una dword Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora