Vai al contenuto

Indicizzare indirizzamento variabili

Home Forum Programmazione IEC 61131 (LogicLab) Indicizzare indirizzamento variabili

Stai visualizzando 6 post - dal 1 a 6 (di 6 totali)
  • Autore
    Post
  • #81581
    Paolo
    Partecipante

    In un programma avrei la necessità di indirizzare delle variabili tramite un’altra variabile, mi spiego meglio, esempio

    %MW100.10:= VELOCITA[1];
    %MW100.20:= VELOCITA[2];
    %MW100.30:= VELOCITA[3];
    %MW100.40:= VELOCITA[4];
    %MW100.50:= VELOCITA[5];
    %MW100.60:= VELOCITA[6];

    Invece di scrivere %MW100.10 vorrei scrivere %MW100.xx dove xx è un valore ad esempio nel caso sopra (xx=indice dell’array VELOCITA moltiplicato per 10)

    E’ possibile ?

    Inoltre se non dichiaro la variabile %MW100.10 è una word un INT  oppure  UINT o cosa ?

    #81584
    Sergio Bertana
    Amministratore del forum

    Accidenti non capisco la tua domanda… Magari se spieghi la tua nessità vediamo se c’è una soluzione.

    Intanto perchè devi utilizzare variabili allocate in DB100, le devi forse accedere da Modbus? perchè inb caso contrario puoi semplicemente dichiarare variabili con un nome in allocazione automatica e quindi puoi definire un array utilizzando come indice il valore di velocità.

    In merito al tipo di variabile una variabile MW è intesa come WORD.

    #81588
    Ufficio Tecnico
    Partecipante

    Sono variabili che poi utilizzo in un pannello Weintek, invece di scrivere le varie righe farei un ciclo FOR da 1 a 6 dove scrivo

    yy:= xx*10
    %MW100.yy:= VELOCITA[xx];

    Dovrei indirizzare 5 variabili per 25 dispositivi in Modbus RTU e poi vederle su un pannello Weintek cosi’ potrei scrivere 5 righe piu’ qualcun’altra riga invece di 125

    Inoltre è possibile dare un nome “dinamico” ai valori evidenziati con le frecce (Immagine)?

    Esempio su indirizzo

    ADR("10.0.4.111") scrivere ADR("10.0.4.xx") e
    ADR(INGRESSI_111) scrivere ADR(INGRESSI_xx)
    dove xx=111 oppure 110 oppure 109  fare un ciclo FOR che mi varia il valore xx
    #81612
    Sergio Bertana
    Amministratore del forum

    Comincio ad intuire anche se non ho una visione esatta di quello che desideri… Mi sembra di capire che stai gestendo 25 dispositivi in Modbus ognuno dei quali ha 5 variabili.

    Devi gestire una connessione TCP ai 25 indirizzi IP dei dispositivi ma non mi dici se le 5 variabili che acquisisci dai dispositivi in Modbus sono in registri contigui (Quindi puoi fare un’unica acquisizione di n registri, oppure se sono ad indirizzi distanti tra di loro e quindi devi eseguire 5 acquisizioni in cascata da ogni dispositivo).

    Se le variabili che acquisisci per ogni dispositivo puoi definire una struttura dati con le 5 variabili e definire un array di strutture nell’area DB100. Non ti preoccupare dell’indirizzamento perchè puoi utilizzare l’indirizzamento simbolico con il convertitore di simboli globali.

    Per la gestione delle acquisizioni Modbus di ogni dispositivo ti consiglio di utilizzare il FB ACModbus, che tiene già conto degli errori.

    Io creerei un mio FB (Magari in linguaggio ST) che gestisce 1 dispositivo, lo devi realizzare con la tecnica batch poi potrai iterare sulla esecuzione del FB a cui devi passare l’IP del dispositivo e l’indice dell’array di strutture dati.

    Purtroppo sapendo bene quello che devi fare mi sembra più facile farlo che spiegarlo…

    #81618
    Sergio Bertana
    Amministratore del forum

    Per la risposta alla domanda sul nome dinamico alle variabili prova a dare una occhiata a questo programma FBD.

    Come vedi ho immaginato di avere i valori in array (Se segui il mio consiglio avrai un array di strutture) ma in pratica dovrai passare nella variabile Nr l’indice dell’array (Nel tuo caso il numero del dispositivo).

    Per le variabili in ingresso al FB se  devi passare un indirizzo utilizzi l’operando ADR() se invece devi passare un valore puoi utilizzare la funzione eGetWORD (O quella relativa al tipo di variabile da pasare).

    Per le variabili in uscita dal FB devi utilizzare la funzione eSetDWORD (O quella relativa al tipo di variabile da pasare).

    #81623
    Paolo
    Partecipante

    Nel pannello WEINTEK ho delle macro che mi settano delle memorie in base agli orari programmati di funzionamento e poi c’e’ questa macro

    for OROLOGIO = 0 to 24
    POSIZIONE = (OROLOGIO * 100 + 11) * 10    //MOLTIPLICATO PER 10 PERCHE’ PUNTIAMO UN BIT
    GetData(RELE_1, “HMI”, RW_A_Bit, POSIZIONE, 1) //LETTURA RELE 1 DA HMI
    
    POSIZIONE = (OROLOGIO * 100 + 61) * 10    //MOLTIPLICATO PER 10 PERCHE’ PUNTIAMO UN BIT
    GetData(RELE_2, “HMI”, RW_A_Bit, POSIZIONE, 1) //LETTURA RELE 2 DA HMI
    
    POSIZIONE = (40000 + OROLOGIO * 10 + 1)    //POSIZIONE USCITA 1
    SetData(RELE_1, “ELSIST”, %MW, POSIZIONE, 1) //SCRITTURA RELE 1 SU ELSIST
    
    POSIZIONE = (40000 + OROLOGIO * 10 + 2)    //POSIZIONE USCITA 2
    SetData(RELE_2, “ELSIST”, %MW, POSIZIONE, 1) //SCRITTURA RELE 2 SU ELSIST
    next OROLOGIO

    Quindi le variabili che io passo al plc ad esempio per l’orologio 15 sono

    %MW (40000 + OROLOGIO * 10 + 1) cioe' (40000 + 15 * 10 + 1) ---> %MW40151 che corrisponde a %MW100.302 per Slimline
    %MW (40000 + OROLOGIO * 10 + 2) cioe' (40000 + 15 * 10 + 2) ---> %MW40152 che corrisponde a %MW100.304 per Slimline

     

    Non posso usare gli array del plc perche’ poi devo lo stesso copiarli su delle %MW40xxx

     

     

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