Vai al contenuto

Passaggio parametri VAR_IN_OUT su blocchi funzione

Home Forum Informazioni ambiente di sviluppo LogicLab Passaggio parametri VAR_IN_OUT su blocchi funzione

Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Autore
    Post
  • #36105
    Marco
    Partecipante

    Ho 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 10

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

    #39841
    Sergio Bertana
    Amministratore del forum

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

    #39842
    Sergio Bertana
    Amministratore del forum

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

    #39862
    Marco
    Partecipante

    Utilizzando 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 ?

    #39863
    Sergio Bertana
    Amministratore del forum

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

Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Devi essere connesso per rispondere a questo topic.