Sergio Bertana

Risposte nei forum create

Stai visualizzando 15 post - dal 1,306 a 1,320 (di 4,507 totali)
  • Autore
    Post
  • in risposta a: Come utilizzare il FB Average #58916
    Sergio Bertana
    Amministratore del forum

    Settando il valore di Coefficent a “0” l’uscita Average assume valore di Value.

    Dopodichè settando il valore di Coefficent corretto si riprende ad eseguire la media.

    in risposta a: Realizzare una connessione Modbus TCP/IP #58914
    Sergio Bertana
    Amministratore del forum

    Da quello che dici c’è un problema di endianness sui dati acquisiti via Modbus, è strano che tu debba usare la funzione BEArrayToVar, perchè questo vuol dire che è scambiato l’endianness anche nei singoli registri oltre che tra i registri. Mentre il protocollo Modbus indica chiaramente l’endianness dei registri (Dai una occhiata a questo post).

    Bene leggere i 36*2 registri consecutivi (Se gli altri 4 non sono molto distanti come indirizzi puoi anche leggerne di piu eliminando i registri vuoti nel mezzo). Poi come dici tu tutti i registri letti saranno appoggiati in ArrayA, di tipo BYTE lungo 144 bytes. E dovrai creare l’ArrayB da 36 REAL per contenere il valore convertito.

    Dovrai poi eseguire 36 volte la funzione BEArrayToVar, indicando come Type un REAL e passando come Source l’indirizzo di ArrayA e come Destination l’indirizzo di ArrayB opportunamente offsettati.

    in risposta a: Realizzare una connessione Modbus TCP/IP #58908
    Sergio Bertana
    Amministratore del forum

    Non mi dici se i valori sono in registri consecutivi oppure no. Se  sono in registri consecutivi puoi eseguire un unico comando di lettura di tutti i valori (40 valori float corrispondono a 80 registri modbus, 160 bytes). Il comando Modbus può acquisire fino a 250 bytes.

    Se invece sono allocati ad indirizzi molto distanti tra di loro occorre per forza eseguire più comandi di lettura.

    Ora assumendo che per sistemare l’endiannes dei dati occorra eseguire la funzione VarSwap su ogni valore letto, ti consiglio di appoggiare i valori letti in variabili di memoria di appoggio e poi eseguire lo swap su un’altra variabile che sarà quella che effettivamente utilizzerai.

    Se utilizzi il FB ACModbus e vuoi ottimizzare il programma puoi appoggiare il valore letto da ogni comando sempre nella stessa variabile, poi con l’uscita COk, attivo per un loop se comando Modbus eseguito correttamente, sincronizzandosi con AIDx puoi eseguire lo swap del valore letto nella tua variabile.

    in risposta a: Supporto a mouse esterno USB #58902
    Sergio Bertana
    Amministratore del forum

    Il mouse USB è supportato da tutti i terminali.

    Utilizzando im mouse è possibile muovere il cursore sullo schermo ed agendo sul pulsante del mouse effettuare il click sull’oggetto puntato proprio come toccandolo sullo schermo con il dito.

    in risposta a: Comunicazione Modbus RTU con Energy meter SDM120 #58898
    Sergio Bertana
    Amministratore del forum

    Un pò di ordine tra le idee… e una occhiata a questo post potrebbe essere utile.

    I dati in lettura e scrittura sul meter sono sempre in float 32 bit IEE754, che in IEC61131 si identificano con il formato REAL. Quindi con la funzione VarSwap non fai nessuna conversione. Usi questa funzione perchè essendo il valore espresso su 32 bits si utilizzano 2 registri Modbus per la lettura/scrittura e siccome il protocollo Modbus non specifica l’endiannes sui valori multiregistro ognuno fà come vuole.

    La funzione VarSwap sistema proprio l’endiannes dei dati quindi puoi usarla sia per convertire i dati in lettura che quelli in scrittura. Quindi per scrivere un valore sul meter appoggi il dato REAL nel buffer del FB ModbusMaster (Che definirei di tipo DWORD) utilizzando la funzione VarSwap.

    in risposta a: Definizione valore NaN su variabili REAL #58891
    Sergio Bertana
    Amministratore del forum

    Si passa per un puntatore per “fregare” il compilatore, se assegnassi il valore 16#7F8FFFFF (Decimale 2.140.143.615) ad una variabile REAL essa assumerebbe il valore 16#4EFF2000 (Come puoi verificare con un convertitore come questo).

    Per poter impostare un valore esadecimale devo avere una variabile di tipo DWORD, nel linguaggio ST non c’è il costrutto UNION che permette di unire variabili di tipo diverso, quindi l’unico escamotage che ho trovato è utilizzare un puntatore.

    Ma magari nel forum c’è qualcuno che ha una idea migliore.

    in risposta a: Acquisire SDM120 in Modbus da PC con Toolly #58888
    Sergio Bertana
    Amministratore del forum

    Come vedi nello screenshot devi configurare un nuovo dispositivo MODBUS RTU (Hex Addressing), configurato sulla porta seriale RS485 con i parametri di comunicazione 2400, n, 8, 1 e nodo Modbus 1.

    Siccome devi gestire variabili REAL a 32 bits devi sincronizzare l’endiannes sull’acquisizione, attiva con il tasto Data Conversion e metti il tick sulla voce corrispondente.

    Ora puoi nella finestra del terminale inserire un oggetto di visualizzazione numerica, definendo l’origine dei dati da protocollo Modbus indicando il modo 3x_Double con indirizzo 0. E nel formato dati il formato 32-bit Float.

    in risposta a: Acquisire SDM120 in Modbus da PC con Toolly #58883
    Sergio Bertana
    Amministratore del forum

    Ho ricreato la prova in laboratorio, vediamo intanto le connessioni Modbus:

    • Il segnale RS485- và collegato con il morsetto 9 dello strumento
    • Il segnale RS485+ và collegato con il morsetto 10 dello strumento
    • I parametri di comunicazione di default sono 2400, n, 8, 1

    Utilizzando Toolly menù Utilities -> Modbus master, ecco come si presenta la prova (Screenshot). Come si vede ho eseguito la lettura con il comando 04 Read Input Registers di 2 registri partendo da indirizzo 0 (Ricordo che Modbus ha offset 1 ecco spiegata la discordanza tra il manuale SDM120 che cita indirizzo 1).

    Tutti i dati letti dallo strumento sono espressi in float IEE754 a 32 bit, il valore letto è quindi 0x4368333 che in decimale (Puoi utilizzare un convertitore on-line come questo) equivale a 232.199 Volts.

    in risposta a: Simulazione programma dimostrativo pagine web #58879
    Sergio Bertana
    Amministratore del forum

    Il PTP128 è un vecchio dimostrativo, per prendere pratica con le pagine web ti rimando a questo articolo dove puoi eseguire il download di alcuni esempi.

    Ricordo che il simulatore su PC permette di eseguire programmi logici e matematici, non è gestito dal simulatore tutto quello che riguarda la comunicazione sia seriale che TCP.

    Inoltre il simulatore non ha un server HTTP attivo, quindi per provare le pagine web devi necessariamente utilizzare un modulo CPU SlimLine.

    in risposta a: Definizione valore NaN su variabili REAL #58874
    Sergio Bertana
    Amministratore del forum

    La definizione NaN è un acronimo che indica “Not A Number”. I valore NAN per una variabile REAL in formato IEE754 è un valore che ha tutti gli 8 bit di esponente a “1” e la mantissa diversa da “0”, il segno non importa.

    Quindi se lo rappresentiamo in esadecimale sarà un numero del tipo 16#7F8FFFFF, ma qualsiasi altro numero che mantenga tutti gli 8 bit di esponente a “1” e la mantissa diversa da “0” verrà indicato cone un NaN. Risulta quindi evidente che non c’è un numero univoco per rappresentare il NaN, se vuoi settare una variabile a NaN puoi utilizzare una definizione del tipo:

    VAR
        APtr : @DWORD;
        RVars : ARRAY[0..3] OF REAL;
    END_VAR
    
        // Definizione valori REAL in esadecimale. Vedi sito:
        // https://www.binaryconvert.com/convert_float.html
    
        APtr:=ADR(RVars[0]);
        @APtr:=16#41280000; //10.5
    
        APtr:=ADR(RVars[1]);
        @APtr:=16#42C80000; //100.0
    
        APtr:=ADR(RVars[2]);
        @APtr:=16#7F8FFFFF; //NaN (Not a number)
    
        APtr:=ADR(RVars[3]);
        @APtr:=16#7F800001; //NaN (Not a number)

    Come vedi dall’esempio sia il valore 16#7F8FFFFF che 16#7F800001 sono riconosciuti come NaN. Da quanto espresso si deduce che non è possibile fare comparazioni sul valore NaN, e certamente potrebbero servire due cose:

    • Una definizione di NaN per settare il valore in una variabile.
    • Una funzione di verifica se un numero REAL e NAN. La funzione deve verificare se il numero ha gli 8 bit di esponente a “1” e la mantissa diversa da “0”.
    in risposta a: Collegamento termoresistenze Pt100/Pt1000 #58869
    Sergio Bertana
    Amministratore del forum

    La lettura delle termoresistenze viene effettuata con una corrente (Generata da IExc) di 200uA, che su una resistenza da 100 Ohm danno una tensione di 20mV. La corrente è mantenuta così bassa per non riscaldare l’elemento resistivo, ma è evidente che eseguendo la lettura di valori di tensionre dell’ordine di mV è molto facile acquisisre anche i disturbi a 50Hz captati dai cavi.

    Il firmware della scheda acquisisce gli ingressi alla massima velocità possibile quindi può succedere che lasciando gli ingressi “appesi” vengano acquisiti anche i disturbi.

    Come suggerimento posso dirti di controllare l’uscita di Fault e utilizzando un timer considerare il valore acquisito corretto solo se l’uscita è disattiva per un tempo.

    in risposta a: Allocazione in memoria delle variabili strutturate #58864
    Sergio Bertana
    Amministratore del forum

    Il problema è dovuto ad un errore nella libreria eLLabXTargetAdjLib, è errata la definizione di eNULL, ho provveduto a creare la nuova versione di libreria si può scaricare dal sito.

    in risposta a: HMI Master collegato a rete di HMI slave #58856
    Sergio Bertana
    Amministratore del forum

    Si puoi farlo e sul pannello cMT puoi aggiungere i pannelli MT80(5/7)1IP quindi il PLC come remoto cosi da poter prelevare direttamente i dati con le nomenclature del PLC e poi passarli in OPC UA.

    in risposta a: Utilizzo protocollo DMX, errore in compilazione #58852
    Sergio Bertana
    Amministratore del forum

    Mi cospargo il capo di cenere…

    Ho commesso un errore nella copia dell’esempio, mi sono dimenticato di definire il file pointer (Stream di comunicazione) che deve utilizzare il FB SysDMXMng. Ho corretto l’esempio, in pratica sulla chiamata del FB devi definire il file pointer.

    FBDMX(File:=Sp.File); //DMX manager
    in risposta a: Gestire un controllo motore NTT460 #58849
    Sergio Bertana
    Amministratore del forum

    Se utilizzi Modbus RTU puoi utilizzare un MPS054, comunicando a 57600 puoi trasferire oltre 5000 caratteri al secondo. Quindi il tempo di rinfresco dei dati dipenderà da quanti caratteri devi trasmettere per la richiesta e ricevere per la risposta Modbus.

    Se invece vuoi utilizzare CANOpen devi utilizzare un modulo MPS055 dove puoi configurare i PDU da ricevere e probabilmente sei più veloce rispetto al Modbus ma è un po più complesso da configurare.

Stai visualizzando 15 post - dal 1,306 a 1,320 (di 4,507 totali)