Visualizzare variabili indicizzate su pagina modello
Home › Forum › Terminali operatore (Weintek) › Visualizzare variabili indicizzate su pagina modello
Taggato: weintek easybuilder
- Questo topic ha 14 risposte, 5 partecipanti ed è stato aggiornato l'ultima volta 10 mesi, 3 settimane fa da
Alessandro.
-
AutorePost
-
Gennaio 30, 2023 alle 11:44 am #69682
P91T
PartecipanteDevo realizzare un sw su easybuilder. alcune pagine somo molto ripetitive, nello specifico ho 50 serbatoi dei quali devo mostrare/comandare sempre le stesse cose (temperatura, setpoint, apri/chiudi valvola).
Il PLC è un Siemens e posso gestire come creare i DB, c’è un modo per evitare di fare 50 pagine uguali (con solo indirizzi diversi) e invece crearne una sola con ad esempio un riferimento indiretto ad un indice di un array e poi con questo vado ad indirizzare il serbatoio corretto?
Gennaio 30, 2023 alle 2:18 pm #69686Sergio Bertana
Amministratore del forumDevi utilizzare i registri indice, quando utilizzi una visualizzazione numerica o Ascii puoi definire che la associ ad un registro indice (Screenshot), poi variando l’indice andrai ad utilizzare l’indirizzo della variabile con l’offset definito nel registro indice.
Ora al cambiare del numero di serbatoio dovrai solo impostare il valore del registro indice utilizzato per operare con le variabili del serbatoio.
Febbraio 13, 2023 alle 12:09 pm #70100Chiara
PartecipanteNon esistono dei widget tipo “faceplate” ma ci sono gli oggetti JS. Il progetto JavaScript Robot Control demo sul sito ufficiale non è disponibile e dal manuale non trovo riferimenti a getTag o setTag, posso chiedere se qual è la sintassi per leggere o scrivere le tag da javascript?
Febbraio 13, 2023 alle 4:49 pm #70107Sergio Bertana
Amministratore del forumIl faceplate è un gruppo di oggetti che ne realizzano uno nuovo parametrizzato, è tipico del mondo Siemens, attualmente Weintek non lo gestisce. In una preview hanno annunciato di rendere disponibile qualcosa di simile verso la fine dell’anno 2023.
Nell’esempio che tu citi, la comunicazione con il robot è in Modbus, la parte js è usata per prelevare il dato mousearea cosi da elaborare il valore Modbus da inviare al robot.
Sul sito Weintek ci sono alcune demo js per le gesture js.
Febbraio 14, 2023 alle 8:34 am #70114Chiara
PartecipanteGrazie per le informazioni…
Sul manuale il get e set tag sono nella sezione driver, stò pensando di realizzare un widget in svg e dinamizzarlo con il js, ma mi sfugge come eseguire ciclicamente la lettura dei valori (ora le funzioni vengono eseguite una sola volta all’avvio).
Ad esempio per fare un blocco motore univoco con marcia, arresto, automatico manuale e contaore da replicare con una cinquantina di istanze la via più pratica quale potrebbe essere?
Febbraio 14, 2023 alle 11:14 am #70132Sergio Bertana
Amministratore del forumNon sono esperto di Java, ho chiesto a Weintek che mi dice che se l’oggetto è indicato come sottoscritto e nella funzione si usa “onResponse” viene letto in continuo.
Febbraio 14, 2023 alle 11:47 am #70140Chiara
PartecipanteGrazie, ho provato ad importare un svg nella shape, ma temo i suoi elementi non siano controllabili dal js:
document.getElementById("Mywidget_sfondo").setAttribute("fill", "red");
Ritorna errore non esiste document.
Stò pensando di abbandonare l’idea e creare una pagina con gli elementi nativi di EasyBuilder agganciati a tag interne, poi sul pulsante che richiama la pagina mettere un data transfer e copiare i valori delle tag plc sulle tag interne, in questo caso avrei un solo “widget” (perchè le tag sul plc non le posso modificare per usare gli index).
Attenzione che non è Java ma javascript, per cortesia potrebbe segnalare che sarebbe comodo aggiungere nella console del cMTViewer avere anche l’input oltre che l’output così da evitare riavvii continui del simulatore.
Febbraio 14, 2023 alle 4:58 pm #70151Chiara
PartecipanteSto provando il codice per l’onResponse preso dal sito Weintek JS Object SDK Documentation, al capitolo driver. Subscription metodo onResponse.
Anche coreggendolo così:
driver.Subscription.onResponse((err, data) => { if (err) { console.log('Error:', err.message); } else { console.log("datida subscription js" +data); } });
Ritorna:
TypeError: cannot read property ‘onResponse’ of undefined
Febbraio 15, 2023 alle 1:27 pm #70218Chiara
PartecipanteUltimo tentativo: singola pagina con oggetti agganciati a TAG interne del pannello, i cui valori verranno sostituiti con quelli delle TAG su PLC.
TAG del PLC il cui nome corrisponderà all’indice interno alla macro (no index Weintek perchè se ho diverse DB con diversi datatype l’indice mi scorre sempre di una word 16bit es. valore 1 bit 0 della DB , valore 2 bit 17 della DB ). Per ora sono riuscita a leggere dal PLC e copiare su tag interne:
macro_command main() bool LED = 0 int INDICE = 0 // per ora non è usato char prova_stringa[30] = "PLC.Blocks.UT_Led.01" //GetData(LED, "Siemens S7-1200/S7-1500", "PLC.Blocks.UT_Led.01", 1) // leggo da plc //SetData(LED, "Local HMI", "UTZ_LED", 1) // scrivo su var interna weintek GetData(LED, "Siemens S7-1200/S7-1500", prova_stringa, 1)
Se sostituisco la stringa a mano con la variabile char non compila restituendo l’errore:
C27 errore di sintassi C38 il metodo di codifica del dispositivo non è supportato
Per favore mi dite se è teoricamente fattibile o sono completamente fuori strada?
Febbraio 16, 2023 alle 10:17 am #70263Stefano
PartecipanteNon ho mai usati i dispositivi Siemens ma ho il dubbio che la logica da usare nel tuo caso sia:
GetData(read_data, device_name, device_type, address_offset, 1)
Quindi ricavare l’indirizzo assoluto delle TAG (driver tipo “Absolute Addressing”), creare una matrice device_type/address, usare varie “GetData” con il device_type fisso e scegliere quale usare con un case. Poi mettere l’indirizzo in una variabile posta su address_offset. Se non è permessa la variabile (non ho mai usato questo metodo) allora usare la stessa logica del case impiegando però i registri indice.
Il metodo più “Weintekioniano” per fare una cosa simile a quello che ti serve credo sia uno dei due che ti scrivo seguito:
Metodo A:
In una pagine mettere tutti i controlli appoggiati a variabili locali. Per ogni controllo/tag mettere un data transfer di pagina. Quindi se “Lampada A” è riferita a 10 possibili tag ci saranno 10 data transfer verso l’indirizzo a cui è appoggiato il controllo. Nei vari data transfer utilizzi Sicurezza -> Attiva/Disattiva da registro e con una macro vai ad Attivare/Disattivare a runtime i data transfer che ti interessano.
Metodo B senza macro:
Crei una pagina che ha tutti i controlli appoggiati a variabili locali.
Crei una pagina trasparente per ogni set di tag che ti interessa visualizzare. Nelle impostazioni della pagina metti come “pagina sottostante” la pagina con i controlli (non importa se messa nel campo sopra, centro o sotto). Nella pagina trasparente metti una data transfer di pagina per ogni oggetto relativo al tag che vuoi visualizzare.
Cambiando poi pagina i controlli visualizzati sono sempre gli stessi, ma cambiano gli oggetti data transfer che copiano i valori da PLC a variabile locale dell’oggetto.
Febbraio 17, 2023 alle 11:33 am #70301Chiara
PartecipanteGrazie Stefano, ho optato per il metodo A
AGGIORNAMENTO:
Tramite macro e Js attualmente non supportiamo il puntamento tag con simbolico dinamico.
Per poter usare gli “index” negli oggetti a video con protocollo Siemens assoluto si deve lavorare a word (non gestiamo il puntamento a bit)
Nel caso di protocollo simbolico bisogna creare degli array in modo che l’ index lavori all’interno dell’array)
Per le macro con protocollo assoluto con il siemens si può calcolare il valore della variabile da puntare il fatto del salto X2 è dovuto alla struttura del protocollo siemens (byte e non a word come il resto dei PLC)Febbraio 17, 2023 alle 12:44 pm #70303Stefano
PartecipanteMi viene in mente anche un metodo C che forse ti viene più comodo:
- Pagina con tutti i controlli appoggiati a locazioni sul pannello. Poi una tendina, o un valore numerico, che indica quale set di variabili PLC leggere.
- Una macro in esecuzione ogni X secondi quando la pagina è attiva che:
Con un case che punta al valore di selezione esegue un GetData per tutte le variabili PLC che ti servono e appoggia i dati in variabili locali alla macro.
Dopo il case fai varie SetData dalle variabili locali della macro alle locazioni su cui sono appoggiati i controlli.
Se i controlli hanno tutti lo stesso tipo di dato puoi ottimizzare un pochino: si appoggiano i controlli a tutte locazioni sequenziali (esempio tre controlli rispettivamente su LW-0, LW-1, LW-2). Nella macro si crea un array i 3 elementi. Tre GetData, all’interno delle varie case, scrivono ognuna su un indice dell’array. Alla fine si fa un unico SetData con l’array come dato da scrivere, che punta a LW-0 e con conteggio dati uguale a 3.
Febbraio 17, 2023 alle 1:15 pm #70304Chiara
PartecipanteGrazie per la condivisione, è proprio così che ho risolto: nelle macro weintek lo chiamano Select Case, con “solo” 800 righe di codice posso mantenere l’uso del simbolico e lo stesso programma PLC può essere usato con pannelli operatore multimarca senza modifiche.
Con tre letture al secondo mi sembra un buon compromesso 🙂
Febbraio 21, 2023 alle 10:34 am #70394Chiara
Partecipante[UPDATE]
Spostando la funzionalità della macro su PLC si riesce a fare un ciclo in 13 ms.
Migliorando decisamente i tempi di lettura su pannello.
Giugno 1, 2024 alle 8:43 am #77339Alessandro
PartecipanteQueste soluzioni prevedono però la necessità di attivare dei cicli di lettura e scrittura, che non è il massimo.
Sarebbe più utile riuscire a proporre la modifica, ovvero un suggerimento da applicare alla prossima versione di rendere dinamica l’associazione dei tag ai vari oggetti.
Ad esempio al caricamento della pagina caricare una macro che associa i tag ai rispettivi oggetti. Se i tag sono opportunamente creati, si potrebbe facilmente riassocciare i tag.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.