Indicizzare indirizzamento variabili
Home › Forum › Programmazione IEC 61131 (LogicLab) › Indicizzare indirizzamento variabili
- Questo topic ha 4 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 1 giorno, 18 ore fa da
Paolo.
-
AutorePost
-
Aprile 16, 2025 alle 8:50 pm #81581
Paolo
PartecipanteIn 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 ?
Aprile 17, 2025 alle 8:11 am #81584Sergio Bertana
Amministratore del forumAccidenti 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.
Aprile 17, 2025 alle 3:46 pm #81588Ufficio Tecnico
PartecipanteSono 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
Aprile 17, 2025 alle 4:07 pm #81612Sergio Bertana
Amministratore del forumComincio 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…
Aprile 17, 2025 alle 5:52 pm #81618Sergio Bertana
Amministratore del forumPer 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).
Aprile 17, 2025 alle 9:47 pm #81623Paolo
PartecipanteNel 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
-
AutorePost
- Devi essere connesso per rispondere a questo topic.