Home › Forum › Programmazione IEC 61131 (LogicLab) › Definizione parametri in funzione e in blocco funzione
- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 2 mesi, 1 settimana fa da
Sergio Bertana.
-
AutorePost
-
Febbraio 6, 2021 alle 4:50 pm #58965
Rubox
PartecipanteFaccio una domanda da principiante, e mi scuso se la risposta sta scritta nel manuale di programmazione o di LogicLab ma non l’ho trovata.
Blocco funzione: posso definire come variabili in ingresso e come variabili interne al blocco funzione qualsiasi tipo di dato, anche quelli definiti da me come struttura.
Funzione: posso definire come variabili di ingresso e come variabili interne alla funzione solo i tipi di base.
E’ corretto? Chiedo questo perché volevo scrivere una funzione che accettasse una mia struttura come variabile in ingresso ma LogicLab continua a dirmi che il tipo di dato non è valido. Se metto un REAL invece funziona tutto. La struttura che uso è rappresentativa di un numero complesso, quindi due real.
Febbraio 6, 2021 alle 4:59 pm #58973Sergio Bertana
Amministratore del forumNelle funzioni non viene allocata memoria, i parametri in ingresso, uscita e le variabili interne sono tipicamente appoggiati su registri e non su aree di memoria, quindi ci sono limitazioni sulla dimensione e sul riferimento agli stessi all’interno della funzione. Cito ad esempio l’impossibilità di utilizzare lo statement ADR riferito ad un parametro o variabile.
Nei FB invece viene allocata memoria per l’appoggio dei parametri e delle variabili e questo permette di utilizzare qualsiaso tipo di dato. Inoltre nei FB possono essere usati riferimenti a variabili globali di programma con la keyword EXTERN.
Ma se vuoi defire come parametro in ingresso da una funzione parametri di tipo definito da te, puoi passare il parametro come riferimento e non come valore indicando come tipo l’indirizzo della tua variabile. Ecco la definizione della funzione.
FUNCTION MyFun: BOOL VAR_INPUT In : @MYSTRUCT; END_VAR @In.V2:[email protected]; MyFun:=TRUE;
Ecco il programma dove viene eseguita.
PROGRAM MyProgram VAR MyVar : MYSTRUCT; Res : BOOL; END_VAR MyVar.V1:=LREAL#10.0; Res:=MyFun(ADR(MyVar));
Febbraio 8, 2021 alle 8:11 am #58974Rubox
Partecipante… e Rubox dovrebbe ricordarsi che il Modo simulazione è molto utile, ma certe funzioni, come ad esempio SysVsnprintf non vengono eseguite e danno errore…
Mi son collegato ad una CPU e funziona correttamente la funzione che avevo preparato e che manipola le stringhe.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.