Passaggio parametri VAR_IN_OUT su blocchi funzione
Home › Forum › Informazioni ambiente di sviluppo LogicLab › Passaggio parametri VAR_IN_OUT su blocchi funzione
- Questo topic ha 4 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 8 anni, 1 mese fa da
Sergio Bertana.
-
AutorePost
-
Febbraio 9, 2017 alle 8:30 am #36105
Marco
PartecipanteHo creato due FB diversi (non due istanze, anche se sospetto che il problema sarebbe analogo) ma proprio due FB diversi, questi dialogano tra di loro e con altri componenti tramite un array di struct (anche se in realtà mi pare di aver verificato che il problema lo da anche con un array di interi), dato che ognuna di queste componenti FB deve modificare/leggere i dati all’interno di questo array ho passato l’array come VAR_IN_OUT.
Fin tanto che utilizzo un solo FB, il tutto funziona più o meno correttamente (poi spiego come mai dico “più o meno”), quando cerco di utlizzare i due FB allora tutto va a ramengo. In sostanza, sembra che al posto di passare all’FB l’indirizzo dell’array gli passi l’intero array, e che il risultato delle operazioni effettuate dall’FB venga poi inserito in questo nuovo array che è la copa dell’origiane con le modifiche. Supponendo quindi di avere un array di 5 interi che è istanziato nelle variabili globali e di assegnargli un valore, es:
prova[0] := 5;
FBProva(arr := prova);Supponendo che all’interno di FBProva abbiamo
arr[0] := 10;avremo dppo l’esecuzione dell’fb:
prova[0] che vale 5
e FBProva.prova[0] che vale 10mentre di norma dovrei avere che prova[0] e FBProva.prova[0] dovrebbero avere lo stesso identico valore! chiaramente se a questo aggiungo qualcosa tipo
prova[0] := 5;
FBProva(arr := prova);
FBProva2(arr := prova);i risultati sono ancora più sconclusionati. Come devo fare quindi a passare un array per indirizzo? senza chiaramente dover impazzire eccessivamente?
Considerato che chiaramente non è un array di interi che passo ma un array di struct, il che rende più difficile qualsiasi gioco sui puntatori (non impossibile, chiaro, ma difficile al livello che mi conviene tirare fuori il codice dall’FB e inserirlo nella POU).
Febbraio 11, 2017 alle 7:14 am #39841Sergio Bertana
Amministratore del forumPremesso che non ho mai utilizato variabili di tipo VAR_IN_OUT, quello che tu vuoi fare è qualcosa che faccio normalmente nei miei programmi utilizzando i puntatori ed è una cosa semplicissima, sia che siano puntatori ad array di variabili che ad array di strutture dati. Per cercare di spiegarti come, ecco lo screenshot del programma StructArray che ti ho fatto di esempio.
Come vedi passo al MyFB l’indirizzo di allocazione dell’array di strutture, al suo interno mi calcolo l’indirizzo del puntatore all’elemento dell’array a cui voglio riferirmi (Nel mio esempio il secondo). Come vedi purtroppo non è possibile scrivere SIZEOF(MYSTRUCTURE), quindi utilizzo un workaround, mi creo la variabile SData al solo scopo di calcolare il SIZEOF.
Nota: Nel calcolo della dimensione degli elementi dell’array meglio usare SIZEOF, altrimenti occorre stare molto attenti al calcolo, essendo lo SlimLine basato su architettura ARM il compilatore alloca le variabili al giusto offset aggiungendo bytes vuoti per l’allineamento, qesto argomento è trattato in altri topic.
Allego il programma di esempio che può essere testato anche sul simulatore su PC (Download programma).
Febbraio 11, 2017 alle 8:23 am #39842Sergio Bertana
Amministratore del forumSe vuoi semplificarti la vita puoi anche utilizzare le VAR_EXTERNAL, in questo caso il tuo array di strutture và definito nelle variabili GLOBALS ma l’FB si semplifica, ecco lo screenshot. Ti allego il programma dimostrativo per il download.
Febbraio 17, 2017 alle 11:03 am #39862Marco
PartecipanteUtilizzando VAR_EXTERNAL chiaramente ora tutto funziona, per i miei scopi per ora è accettabile. Mi confermi che l’implementazione di VAR_IN_OUT ha un bug per cui non funziona come dovrebbe o che è stata implementata in LogicLab in modo differente dallo standard ?
Marzo 3, 2017 alle 2:15 pm #39863Sergio Bertana
Amministratore del forumIl VAR_IN_OUT in LogicLab funziona esattamente in accordo alle specifiche della IEC61131-3. Come vedi dal programma di esempio (Screenshot) il passaggio dei parametri viene sempre eseguito per copia, quindi devi copiare la variabile all’ingresso del FB e poi ricopiarla in uscita. Allego il progetto InOutVars di esempio per il download.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.