Alessiooo Inserito: 20 febbraio 2008 Segnala Share Inserito: 20 febbraio 2008 ciao a tutti avrei bisogno di una vostra mano per costruire una piccola funzione in grado di contare quanti bit di una word si trovano a 1 , e mettere il risultato dentro un'altra word.esempio contare i bit a 1 di mw50 e depositare il risultato in mw52..grazie mille Link al commento Condividi su altri siti More sharing options...
STEU Inserita: 20 febbraio 2008 Segnala Share Inserita: 20 febbraio 2008 Puoi prendere spunto da questa discussioneNON è la soluzione al tuo problema ma ti puo' aiutare.ciao Link al commento Condividi su altri siti More sharing options...
Luca Bab Inserita: 20 febbraio 2008 Segnala Share Inserita: 20 febbraio 2008 Dipende cosa vuoi fare , se e' una cosa che ti serve una volta e mai piu' e non ti serve indicizzabile ,il sistema migliore e' e piu' stupido e' :metti zero in mw200se m50.0 = 1 add 1 a mw200se m50.1 = 1 add 1 a mw200ecc eccalla fine in MW 200 hai quanti bit sono a 1se lo vuoi parametrizzare , il principio di funzionamento e' uguale ma devi indicizzare m50.0 come m[md300] dove in MD300 hai 50.0 ( 50x8+0)ovviamente devi looppare il sw incrementando md300 di 1 per 16 volte ( partendo da 0 )Luca Link al commento Condividi su altri siti More sharing options...
JumpMan Inserita: 20 febbraio 2008 Segnala Share Inserita: 20 febbraio 2008 Potresti fare anche così: // Azzero word contatore bit L 0 T "wContatoreBit" L 16 L1: T "wIndiceLoop" L "wDaEsaminare" SRW 1 SPP inc SPA L2 // Incremento word contatore bit inc: L "wContatoreBit" L 1 +I T "wContatoreBit" L2: L "wIndiceLoop" LOOP L1 // Esegue 16 loops // In questo punto "wDaEsaminare" contiene il nr. di bit a 1 Link al commento Condividi su altri siti More sharing options...
STEU Inserita: 21 febbraio 2008 Segnala Share Inserita: 21 febbraio 2008 Jumpmannon ho verificato se il tuo programma funzioni oppure no , ma "credo" che tra le istruzioni:L "Wda esaminare" e SRW 1 sia necessario inserire l'istruzione TAW,e dopo che hai fatto lo shift devi risalvare la word da esaminare shiftata altrimenti verifichi solo e sempre lo stesso bit della word. Link al commento Condividi su altri siti More sharing options...
Alessiooo Inserita: 21 febbraio 2008 Autore Segnala Share Inserita: 21 febbraio 2008 ciao rgazzi alla fine ho fatto all'antica.... non tanto bello ma funzionante...cioè con il fronte di salita di ogni singolo bit aggiungo uno e sottraggo uno con il fronte di discesa.....grazie milleeeeee Link al commento Condividi su altri siti More sharing options...
batta Inserita: 21 febbraio 2008 Segnala Share Inserita: 21 febbraio 2008 cioè con il fronte di salita di ogni singolo bit aggiungo uno e sottraggo uno con il fronte di discesa.....Onestamente, di tutti i metodi proposti, questo mi sembra il meno funzionale.Prova a vedere se ti va bene la funzione BITSUM (FC99) della Siemens.La trovi in StandardLibrary --> TI-S7 Converting Blocks.In ingresso si aspetta una DWORD, ma se tu devi contare i bit di una WORD, ti basta appoggiare la WORD a una DWORD (magari locale) prima di darla in pasto alla funzione.Esempio:L MW10T MD12oppure:L MW10T #DW_Appoggio //Variabile locale di appoggio Link al commento Condividi su altri siti More sharing options...
JumpMan Inserita: 21 febbraio 2008 Segnala Share Inserita: 21 febbraio 2008 (modificato) Steu hai ragione, ho scritto in fretta, manca un istruzione dopo lo shift, inoltre è meglio appoggiarsi su un'altra word.Il TAW non sono convinto che serva, perchè SRW shifta tutti i 16 bit verso destra ed ogni volta che "esce" un bit va a 1 il bit di stato A1 condizionando il salto SPP.// Azzero word contatore bit L 0 T "wContatoreBit" // Appoggio la word da esaminare L "wDaEsaminare" T "wAppoggio" L 16 L1: T "wIndiceLoop" L "wAppoggio" SRW 1 T "wAppoggio" SPP inc SPA L2 // Incremento word contatore bit inc: L "wContatoreBit" L 1 +I T "wContatoreBit" L2: L "wIndiceLoop" LOOP L1 // Esegue 16 loops // In questo punto "wContatoreBit" contiene il nr. di bit a 1 Modificato: 21 febbraio 2008 da JumpMan Link al commento Condividi su altri siti More sharing options...
batta Inserita: 22 febbraio 2008 Segnala Share Inserita: 22 febbraio 2008 Se non vuoi usare BIT_SUM, puoi usare la funzione "BitCnt" che ho appena fatto.In ingresso a questa funzione puoi dare una variabile, la prima variabile di un array o di una struttura, l'indirizzo della variabile, o anche la variabile, l'array o la struttura in modo simbolico.La funzione non carica il valore della variabile passata, ma il suo indirizzo.Altro parametro richiesto in ingresso è la lunghezza in byte dell'area di cui si vogliono contare i bit a 1.Restituisce, in formato INT, i bit a 1 contati.Non sono effettuati, all'interno della funzione, controlli sulla validità dei dati passati.Sarà cura del programmatore assicurarsi che tali dati siano corretti.Per esempio, la lunghezza deve essere almeno 1 byte. Più quest'area è grande, più sarà lungo il tempo di elaborazione della funzione.ATTENZIONECompilando il sorgente si genera la funzione FC113.Se tale funzione esiste già nel vostro progetto, verrà irrimediabilmente sovrascritta.Fatene quello che volete. La funzione è completamente libera e ben descritta, utile quindi (almeno così spero) anche per didattica, non solo per un suo eventuale utilizzo sul campo.Come sempre, non mi assumo nessuna responsabilità derivante dal suo utilizzo e, unica cortesia che chiedo, non cambiate il nome dell'autore.Grazie.P.S. anche eventuali commenti, sia buoni che cattivi, sarebbero graditi Link al commento Condividi su altri siti More sharing options...
walter.r Inserita: 22 febbraio 2008 Segnala Share Inserita: 22 febbraio 2008 Fatene quello che volete. La funzione è completamente libera e ben descritta, utile quindi (almeno così spero) anche per didattica, non solo per un suo eventuale utilizzo sul campo.Come sempre, non mi assumo nessuna responsabilità derivante dal suo utilizzo e, unica cortesia che chiedo, non cambiate il nome dell'autore.Flavio, credo che i programmatori del "mondo Siemens" dovrebbero farti un monumento, per come approcci i problemi che vengono presentati.Sei un esempio da seguire...... :clap: Link al commento Condividi su altri siti More sharing options...
batta Inserita: 22 febbraio 2008 Segnala Share Inserita: 22 febbraio 2008 Link al commento Condividi su altri siti More sharing options...
STEU Inserita: 22 febbraio 2008 Segnala Share Inserita: 22 febbraio 2008 giusto per fare un po di didattica , fare lo stesso programma con input un parametro any come si fa? Link al commento Condividi su altri siti More sharing options...
batta Inserita: 22 febbraio 2008 Segnala Share Inserita: 22 febbraio 2008 Il formato ANY occupa10 byte.I byte da 4 a 9 sono identici ai byte da 0 a 5 del formato Pointer.Il byte 0 per S7 contiene sempre 10 HexIl byte 1 contiene il tipo di dati (01Hex = Bool; 02Hex = Byte; 03Hex = Char.....)I byte 2 e 3 contengono quante volte il tipo di dati è ripetuto, cioè la lunghezza dell'area dati.La stessa funzione poteva essere scritta usando anche il tipo ANY, ma questo avrebbe significato scegliere tra:1) una funzione più complicata con tanto di analisi del tipo di dato e con istruzioni diversificate a seconda del tipo di dato, oppure calcoli per convertire i diversi tipi di dati possibili sempre nello stesso formato2) una funzione sostanzialmente uguale a quella già scritta, che obbligava però a passare il parametro in un modo ben preciso, a seconda di come veniva sviluppata la funzione, aumentando le possibilità di errorePersonalmente uso poco il formato ANY. Trovo molto più pratico usare il formato Pointer, più semplice sia da gestire, che come sintassi del parametro da passare.Per esempio, se alla funzione "BitCnt" voglio far contare i bit a uno da DB5.DBX10.0 a DB5.DBX19.7 al parametro IN posso scrivere:1) DB5.DBB102) DB5.DBX10.03) DB5.DBW104) DB5.DBD105) P#DB5.DBX10.0e ancora, se il db ha un nome simbolico e l'area è una variabile, un array o una struttura, posso scrivere:6) "NomeDB".NomeVariabile7) "NomeDB".NomeArray8) "NomeDB".NomeStrutturaIl formato Pointer digerisce praticamente tutto.Con il formato ANY, per non complicare troppo la funzione, avrei dovuto obbligare a scrivere, per esempio:P#DB5.DBX10.0 WORD 5Insomma, ritengo il formato Pointer molto più malleabile. 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