Sergio Bertana
Risposte nei forum create
-
AutorePost
-
Aprile 5, 2013 alle 10:26 am in risposta a: Comunicazione modbus master con serie di HMI Weintek #37626
Sergio Bertana
Amministratore del forumIl blocco funzione ModbusRTUMaster_v1 come molti altri blocchi funzione è stato pensato per poter essere facilmente eseguito in cascata, per cascata intendo condizionare l’esecuzione di una altra istanza del FB al termine della esecuzione di quella precedente. Come si vede nella stampa di questo programma, 4 istanze della FB sono poste in cascata.
La prima esegue lettura di 16 coils, terminata l’esecuzione (sia con esito positivo che su errore) viene attivata l’esecuzione della seconda che esegue la scrittura di 16 coils, poi viene eseguita la terza con la lettura di 8 registri e poi la quarta con la scrittura di 8 registri. Terminata la quarta attivando Done[3] si disattiva la prima e di conseguenza cadono tutti i Done facendo ripartire il ciclo. Impostando un tempo nella variabile Delay puoi ritardare l’esecuzione di una FB rispetto all’altra.
Qui nel mio programma di esempio (Download programma) comunico sempre con lo stesso terminale ma tu puoi mettere tante FB quante te ne servono indicando come indirizzo di nodo l’indirizzo dei vari terminali della tua applicazione.
Da quanto espresso è evidente perchè non funziona il tuo programma, non puoi utilizzare un fronte per attivare la FB, l’abilitazione deve essere attiva almeno per tutto il tempo di esecuzione comando. Togliendo l’abilitazione la FB termina il suo funzionamento.
Aprile 5, 2013 alle 9:46 am in risposta a: Comunicazione modbus master con serie di HMI Weintek #37624Sergio Bertana
Amministratore del forumStavo preparandoti un esempio, ma vengo alla tua domanda il codice 16#01 è corretto ma devi tenere presente che modbus ha come offset 1 quindi per leggere la variabile LB 0 devi indicare indirizzo 1.
Nel mio esempio (Ecco la stampa del programma PLC) ho gestito la lettura di 16 variabili bit (Da LB 0 a LB 15), nel programma del pannello ho gestito 8 pulsanti toggle da LB 0 a LB 8. Ti allego programmi SlimLine e HMI per il download.
Aprile 5, 2013 alle 6:20 am in risposta a: Comunicazione modbus master con serie di HMI Weintek #37622Sergio Bertana
Amministratore del forumIn attesa di prepararti un esempio, vedo cha hai definito DTRManagement a 0 (DTR_OFF), è questo è sicuramente un errore, dovendo gestire una comunicazione multidrop in RS485 su 2 fili, il segnale DTR è usato come “Commutatore” della direzione dati.
In pratica quando il modulo CPU deve trasmettere verso i terminali il segnale DTR deve essere attivo, e poi quando deve ricevere indietro la risposta il segnale DTR deve essere disattivo. Questo scambio sul segnale DTR viene eseguito automaticamente dal driver seriale dello SlimLine ma devi impostare DTR management a 2 (DTR_AUTO_WO_TIMES).
Credo che sia questo errore la fonte dei tuoi problemi, intanto di rimando anche alla lettura di questi due posts (Post 1) e (Post 2).
Sergio Bertana
Amministratore del forumNon mi dici che modulo CPU utilizzi, il driver USB RNDIS non è disponibile sulle versioni CPU ARM7 Versione A. Se sul tuo modulo è gestito ed utilizzi Windows XP, 7 oppure 8 come detto precedentemente non vi è nessun driver da cercare perchè è nativo nel sistema Windows.Una volta installata la scheda di rete RNDIS devi assegnarle l’indirizzo IP appartenente alla stesa rete del modulo CPU SlimLine (Di default 192.168.1.122), segui quanto riportato nel post precedente.
Sergio Bertana
Amministratore del forumHo contattato il fornitore in merito alla tua domanda sulla possibilità di resettare i valori massimi. La risposta è che il HWg-PWR si limita a leggere tramite M-Bus i dati dai contatori, quindi anche il valore massimo viene letto dal contatore.
Quindi un eventuale reset dello stesso deve essere eseguito a livello contatore (Se il contatore ne è provvisto).
Sergio Bertana
Amministratore del forumPer rispondere nello specifico alla tua domanda ti ricordo che da pannello operatore non puoi accedere direttamente agli I/O reali dello SlimLine, ma puoi accedere solo a variabili mappate nella DB100. Quindi per gestire gli I/O devi definire variabili BOOL in DB100 a partire da indirizzo MB100.16, il terminale agirà su queste variabili.
Ho realizzato un semplice dimostrativo definendo una variabile di appoggio ingresso Inp00 allocata a MB100.16 (Indirizzo Modbus 40016), ed una variabile di appoggio uscita Out00 allocata a MB100.17 (Indirizzo Modbus 40017). Come vedi dalla stampa del programma SlimLine ho semplicemente eseguito un appoggio delle variabili negli I/O reali (Nell’esempio uso gli I/O del modulo CPU).
Sul pannello operatore ho inserito un oggetto lampada bit che ho legato alla variabile 0x 40016 dello SlimLine ed un oggetto ToggleSwitch che ho legato alla variabile 0x 40017 dello SlimLine (Vedi screenshot).
L’oggetto ToggleSwitch permette di definire due variabili, la variabile in lettura viene utililizzata per visualizzare lo stato mentre la variabile in scrittura viene impostata agendo sull’oggetto. Le due variabili normalmente coincidono come nell’esempio. Allego il file sorgente sia del programma su SlimLine che del programma terminale (Download).
Sergio Bertana
Amministratore del forumIl pannello operatore può dialogare con i moduli CPU SlimLine sia tramite una connessione seriale con protocollo Modbus RTU (Di default 115200, e, 8 nodo Modbus 1), che con protocollo modbus over IP (Di default porta 502 nodo Modbus 1). Naturalmente tu disponendo di una versione 6050i che non ha la porte ethernet puoi solo dialogare in seriale.
I comandi Modbus supportati sono il comando 0x per accedere a variabili BOOL ed il comando 3x per accedere a variabili numeriche, sono supportati tutti i tipi di variabili INT, UINT, DINT, UDINT e REAL. Dai una occhiata a questi posts per maggiori informazioni (1), (2). Ma cercando nel forum ne troverai molti altri.
In questo post è riportato un programma di esempio con relativi files sorgenti che ti aiutano nella comprensione di come operare tra pannello HMI e SlimLine.
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.
-
AutorePost