Sergio Bertana
Risposte nei forum create
-
AutorePost
-
Sergio Bertana
Amministratore del forumMa per rispondere alla tua domanda ecco lo screenshot di un programma LogicLab che illustra l’uso della funzione SysVarsnprintf per la conversione in stringa di una variabile REAL.
Come si vede dalla finestra di Watch alla variabile Var ho impostato il valore 5.67, la stringa StrOut assume il valore “Value: 5.67” e 11 caratteri sono stati trasferiti in StrOut.
La formattazione %5.2f indica di convertire in stringa una variabile REAL con 5 minimo cifre totali di cui 2 cifre decimali (Nelle cifre totali è compreso il punto). Da notare che siccome il valore della variabile è composto al massimo di 4 cifre 5.67, davanti alla 1a cifra intera è posto uno space.
Sergio Bertana
Amministratore del forum(Da Wikipedia) Molti linguaggi di programmazione implementano una funzione printf, per visualizzare sullo standard output una stringa costruita in base ad un formato specificato. Tale funzione ha origine dal linguaggio C, dove ha un prototipo simile al seguente: int printf(const char *format, …)
Il parametro format è una stringa che descrive il formato da seguire nell’output e che utilizza delle sequenze segnaposto, introdotte dal simbolo percentuale (“%”), per specificare la posizione relativa e il tipo dei dati con cui comporre la stringa.
Nella libreria delle funzioni embedded di SlimLine abbiamo introdotto le due funzioni:
SysVarfprintf, per inviare la stringa sullo stream (eFILE) di uscita.
SysVarsnprintf, per trasferire la stringa in un buffer di memoria.Rimandiamo al manuale Manuale programmazione IEC61131-3 su sistema SlimLine per una spiegazione dettagliata delle due funzioni.
Marzo 28, 2013 alle 10:00 am in risposta a: Calcolo potenza istantanea da lettura impulsi contatore #37611Sergio Bertana
Amministratore del forumAggiungo una nota, al primo impulso il valore di potenza è errato in quanto è evidente che non avendo il sistema memorizzato il tempo di arrivo impulso precedente la differenza dei tempi genera un valore errato.
Per sistemare il problema bisognerebbe aggiungere una variabile BOOL inizializzata a FALSE che verrà settata a TRUE dopo il primo impulso. Con variabile a FALSE il calcolo della potenza non viene eseguito ma si esegue solo il salvataggio dei tempi.
Marzo 28, 2013 alle 9:48 am in risposta a: Calcolo potenza istantanea da lettura impulsi contatore #37610Sergio Bertana
Amministratore del forumL’errore che hai commesso è il più classico, nei calcoli in REAL hai omesso il “.0” nella dichiarazione delle costanti numeriche REAL. Quando scrivi TO_REAL((myTimer-PwrTimeCalc)/(1000000)) tu vorresti eseguire i calcoli in REAL ma in realtà i calcoli sono eseguiti in UDINT e quindi si perdono le parti decimali della divisione.
Per scrivere in forma corretta il calcolo dovresti scrivere TO_REAL(myTimer-PwrTimeCalc)/1000000.0. Cioè converto prima in REAL il risultato della differenza dei tempi e poi eseguo la divisione per 1000000.0 (Nota il .0 finale).
Ho scritto un semplice programma che dimostra come eseguire correttamente il calcolo, ti allego la stampa ed il programma sorgente. Come noti ho definito come costante Impulsi/Kwh del contatore 3600.0 quindi se arriva un impulso al secondo la potenza istantanea è di 1000 Wh.
Marzo 26, 2013 alle 9:03 am in risposta a: Come rendere ritentivo valore quota della FB IOEncoder #37609Sergio Bertana
Amministratore del forumPer semplificarti il lavoro e come aiuto propedeutico allo sviluppo di FB da parte dei clienti, ho convertito l’esempio precedente utilizzando un blocco funzione FBEncoderOnIO costruito ad hoc (Di cui riporto il codice sorgente). Come vedi nel programma (Stampa e Download sorgente), il programma ladder si è enormemente semplificato, in pratica viene eseguito il solo blocco funzione.
Per poter gestire la variabile di Quote con attributo RETAIN ho passato allla FB come input l’indirizzo della variabile, in questo modo il blocco funzione può operare su di essa sia in lettura che in scrittura.
Anche in questo esempio puoi azzerare o presettare il valore di Quote semplicemente con istruzioni MOVE.
Marzo 26, 2013 alle 7:54 am in risposta a: Come rendere ritentivo valore quota della FB IOEncoder #37608Sergio Bertana
Amministratore del forumHai fatto un po di confusione… Intanto la variabile Quote è una variabile di output del blocco funzione, pertanto non la puoi valorizzare con istruzioni di MOVE. E se in uscita tu la appoggi su di una variabile di tipo retain, l’FB alla accensione azzera sempre il valore di Quote, e quindi di conseguenza azzererà anche il valore della variabile di appoggio.
Il giusto approccio per soluzionare il tuo problema è di utilizzare come valore di quota una variabile UDINT di tipo RETAIN (Oppure una variabile allocata a partire da MD100.2048) e di utilizzare il valore Quote in uscita dalla FB per calcolare lo spostamente dell’encoder. Con il valore di spostamento calcolato potrai poi aggiornare il valore della variabile di quota, che in questo caso manterrà il suo valore allo spegnimento.
Per spiegare il concetto ho realizzato un semplice programma di esempio che utilizza i due I/O di un modulo SlimLine per gestire il conteggio di quota da un encoder (Stampa e Download programma).
Nell’esempio il valore di quota da utilizzare è quello presente nella variabile RETAIN Quote, ti ricordo che per azzerare il valore di quota devi utilizzare una istruzione di MOVE scrivendo il valore “0” nella variabile. In questo modo è anche possibile utilizzando l’istruzione MOVE presettare il valore di quota.
Sergio Bertana
Amministratore del forumPer completezza riporto il significato del codice operatore numerico, si compone di 6 cifre:
Le prime 3 si riferiscono al MCC:Mobile Country Code (222 per l’Italia).
Le seconde 2 si riferiscono al MNC:Mobile Network Code e cambiano in funzione dell’operatore.
01: Tim
10: Omnitel
88: Wind
98: Blu
99: 3 ItaliaMarzo 25, 2013 alle 7:41 am in risposta a: Informazioni su bus I2C, possibilità utilizzo moduli custom #37605Sergio Bertana
Amministratore del forumEcco in questo post come realizzare un sistema per la gestione di motori passo/passo utilizzando IC direttamente connessi al bus I2C di estensione.
Marzo 25, 2013 alle 7:26 am in risposta a: Come gestire motori passo/passo con i vostri prodotti #37604Sergio Bertana
Amministratore del forumAggiungo una serie di informazioni su quali potrebbero essere i componenti da utilizzare, preciso che ho solo fatto una veloce ricerca su internet ed ho trovato:
AMIS-30622: Stepper Motor Driver and Controller with I2C Bus, Micro-stepping Features and Stall Detection, prodotto dalla ON-Semiconductor (Datasheet).
PCA9629: I2C-bus stepper motor controller, prodotto dalla NXP (Datasheet).
TMC222: Micro Stepping Stepper Motor Controller/Driver with Two Wire Serial Interface della TRINAMIC (Datasheet).
Tutti i prodotti sono interfacciabili al bus I2C e permettono la gestione completa del motore passo/passo gestendo il posizionamento con le relative rampe di accelerazione e decelerazione. I prodotti AMIS-30622 e TMC222 hanno anche la potenza integrata e gestiscono motori di piccola potenza, mentre il prodotto NXP richiede l’impiego di mosfet di potenza esterni e quindi permette di gestire anche motori di elevata potenza.
Marzo 25, 2013 alle 7:16 am in risposta a: Come gestire motori passo/passo con i vostri prodotti #37603Sergio Bertana
Amministratore del forumNella versione SlimLine compact non vi sono moduli con uscita in frequenza, ma visto che mi dici che vorresti costruire un circuito stampato ad hoc per la gestione della potenza dello stepping motor, allora pensavo di indirizzarti verso l’utilizzo di circuiti integrati realizzati appositamente per il controllo di stepping motors che grazie alla interfaccia I2C possono essere gestiti direttamente dalla CPU SlimLine da programma IEC 61131 (Vedi post).Potresti così utilizzare un modulo CPU OEM che fissato sul tuo circuito stampato formerebbe un blocco unico ottimizzando i costi e realizzando un prodotto custom specifico per la tua applicazione che manterrebbe tutta la flessibilità di programmazione offerta dalla linea SlimLine.
Sergio Bertana
Amministratore del forumNelle nostre librerie di funzioni e blocchi funzioni abbiamo solo il blocco funzione master per il protocollo modbus RTU, e lo slave Ascii. In attesa di aggiungere anche l’FB per il modbus Ascii master prendo spunto dalla tua richiesta per realizzare un semplice blocco funzione che gestisce il comando di lettura Holding registers (0x03) di un registro con modbus Ascii.
Il blocco funzione è realizzato in ST e può essere propedeutico per realizzare altri blocchi funzioni di gestione comunicazione, ecco la stampa del programma. Come si vede un program in Ladder apre la porta di comunicazione, ne imposta i parametri, e poi viene seguita la chiamata sequenziale di due istanze della FB ModbusAsciiMaster, una esegue la lettura del registro 16#1234 e l’altra la lettura del registro 16#5678. Il valore letto è ritornato in Value e può poi essere appoggiato nella propria variabile.
Il blocco funzione ModbusAsciiMaster in linguaggio ST è gestito a sequenze con lo statement CASE, le sequenze biniziano con la compilazione e l’invio del frame di comando e poi l’attesa del frame di risposta. Nella FB è gestito sia il calcolo che il controllo dell’LRC del frame modbus, ed al termine della ricezione della risposta è gestito un tempo di attesa parametrizzabile. Allego programma sorgente per il download.
Marzo 19, 2013 alle 1:23 pm in risposta a: Utilizzo di ProfilabExpert con moduli CPU SlimLine #37598Sergio Bertana
Amministratore del forumAggiungo che informazioni sull’indirizzamento variabili Modbus nei sistemi SlimLine sono reperibili in vari posts del nostro forum, (Vedi post).
Lo stesso dicasi per esempi di programmazione dei nostri sistemi, nel forum troverai una ampia disponibilità di programmi sorgente che si possono scaricare ed utilizzare come base per lo sviluppo dei proprii programmi.
Per l’apprendimento di base della programmazione dei nostri sistemi SlimLine ti rimando alla sezione videocorsi.
Marzo 19, 2013 alle 1:02 pm in risposta a: Utilizzo di ProfilabExpert con moduli CPU SlimLine #37597Sergio Bertana
Amministratore del forumCome riportato nel post precedente ProfilabExpert supporta sia il modbus RTU che TCP/IP se utilizzi il modbus RTU puoi connetterti tramite porta seriale con tutti i moduli CPU serie SlimLine, se invece utilizzi il modbus TC/IP devi utilizzare un modulo con interfaccia ethernet.
Ho realizzato un semplice progetto ProfilabExpert che tramite il modbus TCP/IPO esegue la visualizzazione dello stato dei due ingressi e l’attivazione delle due uscite di un modulo CPU ARM7. Come vedi dallo screenshot del progetto ho utilizzato due oggetti modbus.
ReadCoils: Esegue la lettura di 4 variabili booleane, utilizzato per la lettura degli ingressi logici.
Write Multiple Coils: Esegue la scrittura di 4 variabili booleane, utilizzato per la scrittura delle uscite logiche.I due oggetti sono eseguiti ciclicamente tramite un clock ed agli oggetti sono connessi i pulsanti e le lampade di visualizzazione posti sul pannello frontale. Per il funzionamento dovrai definire il corretto indirizzo IP nei due oggetti (Vedi properties).
Nel modulo CPU occorre caricare un semplice programma che appoggia le variabili Modbus in scambio con ProfilabExpert sui reali I/O del modulo (Vedi stampa). Come vedi gli ingressi logici sono appoggiati nell’array ProfilabInp allocato ad indirizzo %MX100.32 (Indirizzo modbus 40032). Lo stato dell’array ProfilabOut allocato ad indirizzo %MX100.16 (Indirizzo modbus 40016) è appoggiato sulle uscite logiche. Allego file con programmi sorgenti LogicLab e ProfilabExpert (Download).
Sergio Bertana
Amministratore del forumGli I/O logici dei moduli CPU della famiglia SlimLine Compact sono stati mappati in memoria nella DB indirizzata a 255, questa mappatura in memoria è stata effettuata anche per i 2 I/O del modulo CPU ARM 7 a parire dalla versione B. Quindi puoi riferirti a loro direttamente indicando %IX255.0 per l’ingresso DI00, %IX255.1 per lingresso DI01 e così via. %QX255.0 per l’uscita DO00, %QX255.1 per l’uscita DO01 e così via.
Per quanto riguarda gli ingressi analogici presenti sul modulo CPU compact, per eseguirne l’acquisizione devi utilizzare il blocco funzione SysGetAnInp definendo Address:=255 e Channel:=0 per l’ingresso 0 e Channel:=1 per l’ingresso 1.
Ho realizzato un semplice programma che gestisce gli I/O logici ed esegue l’acquisizione del valore analogico da 0-10 volts sui due ingressi analogici, allego la stampa ed il programma sorgente.
Sergio Bertana
Amministratore del forumAllego alla mia risposta la stampa del programma che mi hai inviato così da potermi riferire per la risposta. Come si vede nella FB per valorizzare la stringa di uscita Buffer hai utilizzato una sintassi del tipo:
Buffer[0]:=’$02′; (* STX *)
Il linguaggio IEC61131 non prevede l’indicizzazione che è invece tipica del C. Quando tu accedi con le parentesi quadre il compilatore suppone che stai accedendo alla stringa [0] di un array di stringhe. Quindi non fà quello di cui tu hai bisogno, cioè di copiare il valore 16#02 nel primo byte della stringa.
Se vuoi utilizzare l’indice devi definire un array di USINT al posto di una stringa, in alternativa per utilizzare una stringa devi usare un pointer per riferirti ai suoi singoli bytes. Allego la stampa ed il programma sorgente corretto.
-
AutorePost