prog_jlaw Inserito: 11 agosto 2006 Segnala Share Inserito: 11 agosto 2006 ho la necessita di convertire la posizione di un bit di una Dword in decimale per poterlo usare come indice.ES la DWx....0000010 = 2....0100000 = 6naturalmente nella Dword sara presente un solo bit alto alla volta.A chiunque mi aiutera' ..Questo e' un forum relativo ai plc schneider e quindi mi aspetto soluzioni adatte a questo tipo di plc..( mi e' capitato di creare una discussione e ricevere post dicendo che con il plc omron o simens si faceva cosi... ..)Soluzioni in ST sarebbero l'ideale per ragioni di spazio-memoriaGrazie a chiunque mi aiuteraciao Link al commento Condividi su altri siti More sharing options...
Gigi_mezza Inserita: 11 agosto 2006 Segnala Share Inserita: 11 agosto 2006 è semplice utilizzi le istruzioni di scorrimento a destra (non ricordo in schneider) in un ciclo for che termina con il numero max di bit (int=16) o quando trovi "1" , ciao gigi Link al commento Condividi su altri siti More sharing options...
Claudio Monti Inserita: 16 agosto 2006 Segnala Share Inserita: 16 agosto 2006 Secondo me non puoi sfruttare le funzioni di scorrimento in quanto un parametro NECESSARIO e' appunto il numero di spostamenti che la funzione deve fare, ed invece e' quello che stai cercando.Dovresti usare la funzione che ti ho indicato la volta precedente ma, invece di contare i RESTI dovresti contare le volte che riesci a dividere per 2 e fermarti appena trovi un resto Link al commento Condividi su altri siti More sharing options...
Dario Valeri Inserita: 16 agosto 2006 Segnala Share Inserita: 16 agosto 2006 (modificato) ciaolo scorrimento e' la soluzione piu' semplicecioe' :a=0:inizioesegui scorrimento a destra di un bitil carry e' 1? (allora a=a+1 salta a esci )il carry e' a 0 ? (allora a=a+1)se a=16 salta a escisalta inizio:esciin a trovi cio' che ti interessa Modificato: 16 agosto 2006 da Dario Valeri Link al commento Condividi su altri siti More sharing options...
prog_jlaw Inserita: 18 agosto 2006 Autore Segnala Share Inserita: 18 agosto 2006 con lo scorrimento mi sono trovato bene .... come al solito ... grazie mille ( a tutti ) per i suggerimenti ...bye Link al commento Condividi su altri siti More sharing options...
batta Inserita: 18 agosto 2006 Segnala Share Inserita: 18 agosto 2006 Solo a scopo didattico, dato che sono convinto anch'io che il metodo migliore sia quello dello scorrimento:se si è certi che la word contenga un solo bit alto, si può calcolare il logaritmo base 2 del valore della word.Essendo che di solito un plc non consente di calcolare direttamente il logaritmo base 2, si può risolvere il problema considerando che:log base_x di N = log base_10 di N / log base_10 di xEsempio: calcolare la posizione del bit alto in una variabile che contiene il valore decimale 32 (32 = 2^5, ovvero il logaritmo base 2 di 32 è 5)log_2(32) = log_10(32) / log_10(2) = 5Ripeto: per un plc questo è un calcolo molto pesante. Meglio lo scorrimento. Inoltre il calcolo con i logaritmi darebbe valori errati in caso di word con più di un bit alto. Con lo scorrimento si può decidere di terminare l'operazione appena si individua il primo bit alto e non valutare gli altri. Link al commento Condividi su altri siti More sharing options...
rddiego Inserita: 30 agosto 2006 Segnala Share Inserita: 30 agosto 2006 non ho idea se si risparmia in tempo ciclo ma siccome lo scorrimento verso destra non è altro che una divisione per 2, mi domandavo se fosse meno impegnativo fare per l'appunto tante divisioni per 2 fino ad avere resto =0 e contare il numero di divisioni eseguite. Mah!! Link al commento Condividi su altri siti More sharing options...
batta Inserita: 30 agosto 2006 Segnala Share Inserita: 30 agosto 2006 Una operazione di scorrimento è molto più leggera di una divisione. Link al commento Condividi su altri siti More sharing options...
nibble Inserita: 31 agosto 2006 Segnala Share Inserita: 31 agosto 2006 Se posso essere di aiuto, la seguente routine potrebbe essere uno "spunto" da perfezionare:!(* routine di memorizzazione dell'ultimo bit TRUE in una tabella di bits *)!%M50:160:=D_BIT(%MD100:5,0,5,0); (* copia 5 doppie word in 160 bits *)!IF %MW0<160 THEN (* controllo indice per scrolling bits *) INC %MW0; (* incremento dell'indice di 1 *)ELSE %MW0:=0; (* azzeramento indice quando > 160 *)END_IF;!IF %M50[%MW0] THEN (* verifica dello stato 1 del bit *) %MW1:=%MW0+1; (* cattura del valore indice di scrolling +1 se desidero numerare la posizione da 1 a 160 *)END_IF; Link al commento Condividi su altri siti More sharing options...
nibble Inserita: 31 agosto 2006 Segnala Share Inserita: 31 agosto 2006 Salve, un primo "spunto" (miglioria) potrebbe essere quella di azzerare il valore che riporta l'ultimo bit allo stato uno quando questo ritorna a zero (quindi tutti i 160 bits sono a zero!).Inserire in "testa" alla routine le seguenti righe:!%MD90:=SUM(%MD100:5); (* calcolo la somma delle 5 DW *)! IF %MD90=0 THEN %MW1:=0;END_IF;...ovviamente è ancora "perfettibile/personalizzabile" ! Link al commento Condividi su altri siti More sharing options...
Massimo Vergani Inserita: 1 settembre 2006 Segnala Share Inserita: 1 settembre 2006 personalmente sono per le cose + semplici, contatto aperto di %md0:x0 imposto la mia word a 1 %mw1:=1 ecc per 32 righe, la scrivo in 3 minuti anzichè 1 ma la penso in 30 secondi anziche 15 minuti!!!! ma forse sono io ad essere lento ciao Link al commento Condividi su altri siti More sharing options...
nibble Inserita: 1 settembre 2006 Segnala Share Inserita: 1 settembre 2006 Ciao MAX , si può fare anche così, anche se in questo modo però non si sfrutta un'altra opportunità di scoprire (tempo permettendo!) le funzioni presenti nel PLC.Io continuo a vedere programmi scritti con una "metalità" da programmatore anni 85-90,Kili e Kili di codice convertito e tradotto da un plc di marca XXX verso un plc di marca YYYsenza neanche prendersi la briga di andare a sbirciare nella libreria delle funzioni se esistequalcosa che può soddisfare l'abbisogna!Volevo ancora aggiungere che non è possibile etrarre un bit da una doppia-word tipo %MD100:X0,e che quindi devo scindere la doppia-word nei 2 registri fondamentali che la costituisco, ovvero:%MW100:X0 ---equivalente---> %MD0:X0;%MW100:X1 ---equivalente---> %MD0:X1; .... .... ..... .... .... .....%MW100:X15 ---equivalente---> %MD0:X15;%MW101:X0 ---equivalente---> %MD0:X16;%MW101:X1 ---equivalente---> %MD0:X17; .... .... ..... .... .... .....%MW101:X15 ---equivalente---> %MD0:X31,... per il resto le righe restano sempre 32: un bit ==> una riga....N.B. nel codice da me suggerito, gestisco fino a 160 bit. Link al commento Condividi su altri siti More sharing options...
Massimo Vergani Inserita: 2 settembre 2006 Segnala Share Inserita: 2 settembre 2006 ciao ....... nibble, in effetti anche io mi diverto a cercare scorciatoie e a sfruttare funzioni diciamo avanzate, ma a volte ci metto tanto di quel tempo che forse non ne vale la pena.Poi quando si va in debug si scopre che i metodi più semplici permettono di vedere subito gli intoppi a differenza delle funzioni complesse che devono essere sorvegliate passo passo...... cavolo è già pronto il risotto, devo andare, ciao!!!! 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