EU_ZERI Inserito: 11 giugno 2013 Segnala Share Inserito: 11 giugno 2013 Buonasera a tutti. Non so se è questa la categoria giusta e mi scuso in anticipo. Perdonatemi l'ignoranza ma ho elaborato un FC che ha come funzione: IN Indice (INT) value (real) reset (bool) OUT Out_val1 (real) Out_val2 (real) Out_val3 (real) Out_val4 (real) Out_val5 (real) Al variare del valore "indice" deve variare all'Out_valx deve essere trasferito il valore in ingresso "value" ES. se indice =3 e Value =14,45 Out_val3 = 14.45 io ho tradotto questa funzione in awl cosi ma non funziona aggiorna i valori random e il primo valore è in continua scrittura O #Reset SPB Zero L #indice L 1 -D SPZ Tr01 SPA Ta02 Tr01: L #Value T #Out_01 SPA End Ta02: L #indice L 2 -D SPZ Tr02 SPA Ta03 Tr02: L #Value T #Out_02 SPA End Ta03: L #indice L 3 -D SPZ Tr03 SPA Ta04 Tr03: L #Value T #Out_03 SPA End Ta04: L #indice L 4 -D SPZ Tr04 SPA Ta05 Tr04: L #Value T #Out_04 SPA End Ta05: L #indice L 5 -D SPZ Tr05 SPA End Tr05: L #Value T #Out_05 SPA End Zero: L 0.0 T #Out_01 T #Out_02 T #Out_03 T #Out_04 T #Out_05 End NOP 0 Dove sbaglio? Grazie in anticipo Link al commento Condividi su altri siti More sharing options...
bleny Inserita: 12 giugno 2013 Segnala Share Inserita: 12 giugno 2013 (modificato) Ad una prima occhiata dovrebbe funzionare anche se più complicata di così non potevi scriverla. Quello che non so è se nella FC le variabili siano state dichiarate nell'interfaccia con il tipo giusto; inoltre le variabili out che dichiari (out_val1... ecc.) non sono quelle che usi nella FC (out_01... ecc.), questo però penso sia solo un errore di trascrizione perchè altrimenti l'FC ti segnalerebbe che stai usando una variabile non dichiarata. Un'altra cosa che ho notato è che l'indice è un INT a 16 bit , mentre per la sottrazione usi un'istruzione a 32 bit (-D); in realtà, però, se i numeri sono sempre positivi (e piccoli) anche questo non dovrebbe crearti problemi. Una cosa che non dici è se, una volta variato l'indice, l'FC deve essere elaborato una volta sola o deve continuare a lavorare; per come hai scritto l'FC l'indice viene valutato sempre e quindi è normale che il valore indirizzato venga scritto sempre (anche se non dovrebbe ovviamente essere sempre e solo il primo valore). Io proverei a scriverla così (in questo modo i valori vengono comunque aggiornati sempre): U #Reset SPB Zero L #indice SPL END SPA Tr00 SPA Tr01 SPA Tr02 SPA Tr03 SPA Tr04 SPA Tr05 END: BEA Tr01: L #Value T #Out_00 BEA Tr01: L #Value T #Out_01 BEA Tr02: L #Value T #Out_02 BEA Tr03: L #Value T #Out_03 BEA Tr04: L #Value T #Out_04 BEA Tr05: L #Value T #Out_05 BEA Zero: L 0.000000e+000 T #Out_00 T #Out_01 T #Out_02 T #Out_03 T #Out_04 T #Out_05 L'unica differenza con la tua FC è che in questo modo i valori dell'indice utilizzati cominciano da zero anzichè da uno, ma questo è un problema facilmente aggirabile (basta non utilizzare mai la variabile Out_00). Tieni anche presente che, scritta in questo modo (ma è lo stesso anche per come l'hai scritta tu), la routine non fa niente se l'indice non è compreso tra 0 e 5 e quindi sulle variabili d'uscita resta memorizzato il risultato dell'ultima chiamata con indice valido. Inoltre non so come utilizzi i valori delle variabili di uscita, ma se prima di variare l'indice non usi un reset ovviamente i valori delle variabili restano "sporchi". Ciao. Massimo Modificato: 12 giugno 2013 da bleny Link al commento Condividi su altri siti More sharing options...
batta Inserita: 12 giugno 2013 Segnala Share Inserita: 12 giugno 2013 (modificato) Concordo con quanto detto da Bleny, ed aggiungo che io passerei ad una soluzione con l'utilizzo di puntatori. Se c'è la possibilità di usare l'SCL diventa facilissimo, ma anche in AWL non è per niente difficile. Modificato: 12 giugno 2013 da batta 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