Vai al contenuto
PLC Forum


richiamo funzione


ottoz

Messaggi consigliati

SCL
(*Richiamo in un'assegnazione di valore, per "MyFC" è stato definito un
valore della funzione*)
#MyOperand := "MyFC" (MyInput1 := 3, MyInput2 := 2, MyInput3 := 8.9,
MyInOut := "Tag1");

è fattibile questa funzione?  , #MyOperand  che tipo di dati deve avere (INT) o altro? a me sembra strano mettere i valori di una funzione in uno operando  anzi credo che non si possa fare

 

Link al commento
Condividi su altri siti


Sì, certo che è possibile.
Il tipo di dati di ritorno, come tutti gli altri dati, lo definisci nell'interfaccia delle variabili della funzione, come valore di ritorno che, di default, non è usato ed è quindi impostato come "Void".

 

Ma, una sola domanda: non fai più presto a provare che a chiedere e attendere risposta?

Link al commento
Condividi su altri siti

ho provato la funzione ma di da errore

quindi dove ce il void devo mettere operando  proverò anche se non so cosa è iltipo di dati ritorno

Link al commento
Condividi su altri siti

Se scrivi:

#MyOperand := "MyFC" (MyInput1 := 3, MyInput2 := 2, MyInput3 := 8.9, MyInOut := "Tag1");

significa che vuoi assegnare il valore di ritorno della funzione alla variabile #MyOperand .

Se lasci "Void", significa che la funzione non avrà un valore di ritorno, quindi se vuoi assegnare un valore di ritorno (che non c'è) ad una variabile, chiaro che ti dà errore.
Il valore di ritorno della funzione lo devi scrivere all'interno della funzione stessa.
Non è molto diverso da un parametro di uscita.
Il valore di ritorno, solitamente, si usa per restituire un codice di errore, oppure il risultato di un calcolo.
Potrebbe anche essere una variabile booleana, che assume lo stato TRUE se sono state rispettate certe condizioni.
Si usa moltissimo in altri linguaggi (esempio, nel C e suoi derivati), molto meno nella programmazione dei PLC.

Sempre per restare nell'esempio del C, potresti scrivere:

if (myFunction(a, b, c)) {

...

...

}
Se la funzione restituisce un valore diverso da zero, vengono eseguite le istruzioni all'interno dell'IF.
 

Oppure:

if (myValret = myFunction(a, b, c)) {

...

...

...

}

In un colpo solo, assegni il valore di ritorno della funzione a myValret, e crei la condizione per eseguire l'IF.

 

Nei linguaggi soliti dei plc, non lo puoi fare, nemmeno in testo strutturato.
In strutturato, dovresti scrivere qualcosa del genere:
myValret := myFunction(a, b, c);

IF myValret THEN

...;

,,,;

END_IF;

A questo punto, se myValret lo colleghi ad un parametro di uscita della funzione piuttosto che rilevarlo come valore di ritorno, poco cambia.

Link al commento
Condividi su altri siti

Ciao Batta sono un po duro di comprendonio  non è che puoi farmi sue righe di esempio?  non so il #MyOperand lo devo mettere nell interfaccia dove mi trovo la funzione return?

 

Link al commento
Condividi su altri siti

2 ore fa, ottoz ha scritto:

non so il #MyOperand lo devo mettere nell interfaccia dove mi trovo la funzione return?

#MyOperand, che ho ripreso dal tuo esempio, è una qualsiasi variabile, che deve essere dello stesso tipo della variabile restituita dalla funzione che richiami.
 

Nell'interfaccia delle variabili di una FC, ti trovi le seguenti voci:

- Input

- Output

- InOut

- Temp

- Constant

- Return

 

Come Return ti trovi il nome stesso della FC, e come tipo di dati, di default, ti trovi Void.

Void significa che la FC non restituisce nessun valore di ritorno.

 

Se chiedi come usare il valore di ritorno, immagino tu abbia un motivo e, in base a questo motivo, deciderai che formato (tipo di dati) assegnare al valore di ritorno.
Se, come tipo di dati, imposti INT, significa che la funzione ti restituirà un valore in formato INT.

Quale sarà questo valore? Quello che tu assegnerai nel codice all'interno della FC.

Tanto che, se nella FC non scrivi da nessuna parte che valore assegnare, il compilatore ti dà errore.

 

E come si usa il valore di ritorno?
In testo strutturato:

Supponiamo di avere una FC con due parametri in Input e un parametro in Output, senza valore di ritorno.
Avrai qualcosa simile a questo:

"myFc"(In_1 := 123,
       In_2 := 456,
       Out_1 => #OutValue);

Ai parametri di tipo Input puoi collegare sia variabili che costanti, mentre ai parametri Output, ovviamente, non puoi collegare costanti.
Vediamo ora cosa succede se la stessa funzione ha un valore di ritorno:

#ValoreDiRitorno := "myFc"(In_1 := 123,
                           In_2 := 456,
                           Out_1 => #OutValue);

Quindi, quello che la funzione restituisce come valore di ritorno, viene assegnato alla variabile #ValoreDiRitorno.

 

In ladder si presenta così:

immagine.png.607ae9686c64a935ee6431ab3e8d4197.png

Ovvero, si presenta come se fosse un parametro in uscita. E, in effetti, da un punto di vista pratico, è un valore in uscita.

 

Allora, perché usare il valore di ritorno di una FC?
Come ti ho già detto, nei PLC non è che si usi moltissimo. Tanto per fare un esempio, potremmo voler creare una FC per il calcolo di due resistenze in parallelo:

Rp = (R1 * R2) / (R1 + R2)

Sia chiaro, è solo un esempio, data la banalità del calcolo.
Potresti creare una FC senza valore di ritorno, ed il richiamo in testo strutturato sarebbe così:

immagine.png.cae365abe709db292a7836528d38e694.png

 

Nel caso invece di FC con valore di ritorno, sarebbe così:

immagine.png.5e51c47518c85962e2dbf0d98e060fa9.png

 

 


 

 

 

 

 

 

Link al commento
Condividi su altri siti

Il 23/4/2020 alle 19:22 , batta ha scritto:

Se lasci "Void", significa che la funzione non avrà un valore di ritorno, quindi se vuoi assegnare un valore di ritorno (che non c'è) ad una variabile, chiaro che ti dà errore.

Il valore di ritorno della funzione lo devi scrivere all'interno della funzione stessa.

Scusami batta ma dove si definisce se la Funzione ha valore di ritorno nella Funzione? Definisci le varibili di ingresso e Uscita etc. ma la variabile di ritorno dove viene definita e come, scusami ma sono abituato a usare direttamente i parametri In e Out della funzione ma non capisco dove assegnare direttamente la variabile di Ritorno perchè così puoi assegnare direttamente a una variabile esterna magari il risultato di una funzione

Link al commento
Condividi su altri siti

Mattia Spoldi

lo dichiari nel box dove dichiari le variabili IN-OUT-TEMP, devi andare verso il basso e vedrai il nome del tuo fc con scritto void di fianco, ti basta cambiare il void in int,real,bool ecc

Link al commento
Condividi su altri siti

2 ore fa, leleviola ha scritto:

Scusami batta ma dove si definisce se la Funzione ha valore di ritorno nella Funzione? Definisci le varibili di ingresso e Uscita etc. ma la variabile di ritorno dove viene definita e come, scusami ma sono abituato a usare direttamente i parametri In e Out della funzione ma non capisco dove assegnare direttamente la variabile di Ritorno perchè così puoi assegnare direttamente a una variabile esterna magari il risultato di una funzione

 

@leleviola se usi Mitsubishi avrai forse usato qualche volta una 'funzione' al posto di un FB. Sostanzialmente simili ma la funzione è priva di istanza e può avere solo un valore di ritorno che definisci quando crei la funzione:

 

IMG_5700.jpg.58f07cffb38f9e90d4c9540ac732f327.jpg

 

Definisci gli input:

 

IMG_5702.jpg.597099fcc65a6e97fe15c8fed4185d40.jpg

 

il codice, dove il valore di uscita si chiama come la funzione:

 

IMG_5703.jpg.28fd9037dbdf491e1147f41cb3666b89.jpg

 

IMG_5704.jpg.536aa205d1121514141b1b8903f20257.jpg

 

 

 

Modificato: da step-80
Link al commento
Condividi su altri siti

immagine.png.631e747e1412b3fe42b5b54642a3afd5.png

Il valore di ritorno lo trovi solo nelle FC. Nelle FB non c'è.

Di default, quando crei una nuova FC, c'è Void, quindi la FC non restituisce un valore di ritorno.
Se vuoi avere un valore di ritorno, ti basta definire il tipo di dato al posto di Void.

Link al commento
Condividi su altri siti

1 ora fa, il toby ha scritto:

lo dichiari nel box dove dichiari le variabili IN-OUT-TEMP, devi andare verso il basso e vedrai il nome del tuo fc con scritto void di fianco, ti basta cambiare il void in int,real,bool ecc

Infatti io mi riferivo a una DB d'istanza di una funzione FB per il calcolo di una funzione matematica, il valore di ritorno lo si ha ha con una FC non con una DB d'istanza, nella DB d'istanza il risultato di una funzione matematica lo hai nella variabile output che definisci a seconda degli operandi che hai in ingresso, credevo fosse possibile anche con le DB d'istanza

Link al commento
Condividi su altri siti

Si @step-80 in Mitsubishi lo so, quello è con GX-Works2 poi con GX-Works3 ancora meglio, puoi crearti FB d'istanza con varie uscite sia in FBD che il Ladder che in ST, credevo che il ritorno in Siemens fosse possibile pure con DB d'istanza è che con FC non ho l'abitudine di usarlo, le FC spesso io le creo solo per il richiamo da OB1 per suddividere il programma nei vari sottoprogrammi non per questa funzionalità a quel punto meglio l'uscita/e predisposta/e nel FB e nella relativa DB d'istanza

Link al commento
Condividi su altri siti

1 ora fa, leleviola ha scritto:

credevo che il ritorno in Siemens fosse possibile pure con DB d'istanza

Non mi è chiaro cosa intendi.

Link al commento
Condividi su altri siti

6 ore fa, batta ha scritto:

Non mi è chiaro cosa intendi.

Credevo che nelle FB come nelle FC fosse possibile impostare il valore di ritorno della funzione in realtà ciò è possibile solo nelle FC, nelle FB hai l'uso delle DB d'istanza con le variabili che hai impostato nella FB ma non il ritorno

Link al commento
Condividi su altri siti

5 ore fa, leleviola ha scritto:

il valore di ritorno della funzione in realtà ciò è possibile solo nelle FC

Sì, non so per quale motivo, ma è così.
Immagino sia perché il valore di ritorno risulta comodo per un uso come quello che ho descritto nell'esempio del calcolo del parallelo di due resistenze, ovvero nelle situazioni in cui passi dei parametri, e ti aspetti solo un valore di ritorno. Difficilmente una FB viene usata in questo modo.
Personalmente, faccio uso raramente del valore di ritorno.

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...