Vai al contenuto
PLC Forum


Domanda Su Awl


EU_ZERI

Messaggi consigliati

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


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: da bleny
Link al commento
Condividi su altri siti

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: da batta
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...