Vai al contenuto

Visualizzare variabili indicizzate su pagina modello

Home Forum Terminali operatore (Weintek) Visualizzare variabili indicizzate su pagina modello

Stai visualizzando 15 post - dal 1 a 15 (di 15 totali)
  • Autore
    Post
  • #69682
    P91T
    Partecipante

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

    #69686
    Sergio Bertana
    Amministratore del forum

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

    #70100
    Chiara
    Partecipante

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

    #70107
    Sergio Bertana
    Amministratore del forum

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

    #70114
    Chiara
    Partecipante

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

    #70132
    Sergio Bertana
    Amministratore del forum

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

    #70140
    Chiara
    Partecipante

    Grazie, 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.

    #70151
    Chiara
    Partecipante

    Sto 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

    #70218
    Chiara
    Partecipante

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

    #70263
    Stefano
    Partecipante

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

    #70301
    Chiara
    Partecipante

    Grazie 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)

    #70303
    Stefano
    Partecipante

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

    #70304
    Chiara
    Partecipante

    Grazie 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 🙂

    #70394
    Chiara
    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.

    #77339
    Alessandro
    Partecipante

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

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