Jump to content
PLC Forum

Giuseppe Signorella

Esportare Dati Di Produzione Con Wincc Advanced

Recommended Posts

Giuseppe Signorella

Ho la necessità di esportare, in un qualunque formato (csv, txt, doc, pdf) dei dati di produzione di un impianto.

Sapete se è presente una funzione che faccia già questo con wincc advanced, oppure tocca crearla?

Grazie

Link to post
Share on other sites

pigroplc

La domanda è alquanto generica, io penso che se WinCC Advanced è un mix fra il Flexible e WinCC (come avevo visto in passato) la funzione te la devi creare tramite script.

A suo tempo ricordo di aver già affrontato questo argomento, prova a cercare sempre in questo forum HMI

Link to post
Share on other sites
dott.cicala

io per farla facile creo un set di dati e poi lo esporto in csv con la relativa funzione. La funzione la attivi al verificarsi di un qualsiasi evento.

Link to post
Share on other sites
Giuseppe Signorella

io per farla facile creo un set di dati e poi lo esporto in csv con la relativa funzione. La funzione la attivi al verificarsi di un qualsiasi evento.

Ti riferisci alla funzione archivi o qualche altra cosa?

Se ti riferisci alla funzione archivi, il problema è che non consente la gestione delle stringhe.

Io ho la necessità di poter esportare anche il nome del cliente che in quel momento è stato processato e i nomi dei componenti realizzati (con una serie di dati).

I nomi dei componenti lavorati cambiano in funzione del cliente.

Grazie

Link to post
Share on other sites
dott.cicala

No, mi riferisco alle ricette

Ti crei una ricetta che contiene un set di dati, nel set di dati puoi salvare anche le stringhe.

crei due eventi:

uno per salvare/aggiornare i dati nel set di dati

un'altro per esportarlo.

Ci sono due funzioni specifiche, compreso esporta set dati in csv. Non sarà una finezza, ma è a costo zero e tempo minimo di sviluppo...il set di dati può anche essere salvato/esportato su un qualsiasi percorso di rete.

Le funzioni le puoi attivare con gli "ordini del controllore" e danno un valore di ritorno.

Se l'operazione non è a ciclo continuo, ma ogni tot tempo, va bene, altrimenti bisogna pensare a qualcosa di un po' più complesso.

Gli archivi ...sono un po' scomodi e hanno vari limiti.

Link to post
Share on other sites
pigroplc
Dim fso, MyFile, today_string
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
today_string = CStr(Year(Now))&"_"& CStr(Month(Now))&"_"& CStr(Day(Now))
Set MyFile = fso.GetFile("C:\Storage Card\production.xls") ' source file
MyFile.Copy ("C:\Storage\" & today_string & "_" & "production" & ".xls") 'copy to destination file
MyFile.Delete 'then delete the old one

Dim objFileSystem, blank, fs 'dichiara le variabili
Set objFileSystem = CreateObject("Scripting.FileSystemObject")'dichiara le proprietà del file
Set fs = objFileSystem.CreateTextFile ("C:\Storage Card\production.xls",True) 'file create, eventually overwritten and ascii default
blank=" "
'fs.WriteLine("Report day" + ";" + "Report hour" + ";" + "Operator name" + ";" + "Program number" + ";" + "Program description" + ";" + "Quantity set point" + ";" + "Elapsed" + ";" + "Produced" + ";" + "Total Production"):
fs.WriteLine("Report day" + ";" + "Report hour" + ";" + "Operator name" + ";" + "Program number" + ";" + "Program description" + ";" + ";" + "Produced" + ";" + "Total Production"):
fs.Close 'chiudi il file
Dim objFileSystem, fs, fso, a, f, objFileSize, operatore, blank, trigger, strNomeFile  'dichiara le variabili
trigger=0
SmartTags("DB_HMI_Variabili_Globali.iarchivio1")=trigger 'azzera il trigger di memorizzazione report
operatore = SmartTags("nome_login_record") 'aggiorna il nome dell'operatore
'costruzione dell'header se il file non esiste
strNomeFile= "C:\Storage Card\production.xls"
	' Verifica che il file esista
	If S_blnEsisteFile(strNomeFile) = True Then 'il file esiste
		Set objFileSystem = CreateObject("Scripting.FileSystemObject")
		Set objFileSize = objFileSystem.GetFile ("C:\Storage Card\production.xls")
		f = objFileSize.Size 'lettura delle dimensioni del file
	Else ' il file non esiste
		Call Header()'prepara header
	End If
		


   	Set fso = CreateObject("Scripting.FileSystemObject")
   	Set fs = fso.OpenTextFile ("C:\Storage Card\production.xls",8) 'apre il file e scrive alla fine file (comando=8) ascii default
 	blank=" "
 	fs.WriteLine ( " "+ CStr (Date)+ ";" + CStr(Time) + ";" + operatore + ";" + CStr(SmartTags("FC_hmi.u64minuti")) + ";" + CStr(SmartTags("DB_HMI_Variabili_Globali.nomeprogramma"))+ ";" + CStr(SmartTags("DB_HMI_Variabili_Globali.i32totalesequenza1")) + ";" + CStr(SmartTags("DB_HMI_Variabili_Globali.i32totaleproduzione"))+ " "):
	fs.Close 'chiudi il file
		
	Call ShowSystemAlarm("Prodution.xls Report di produzione aggiornato correttamente")

If (f <= 10150000) Then 'controlla la lunghezza prima di scrivere
	
Else 'rinomina il file nella cartella C:\Storage Card\ e non perdi il record!!!!!!!!!!
	Call S_rename_1
End If

Questo è un esempio di come gestire un report di produzione. Il primo rinomina il file S_Rename , il secondo è la creazione del file con intestazione Header, il terzo compila il file.

più facile di così .......

Link to post
Share on other sites
Giuseppe Signorella

Grazie per l'esempio.
Ma fammi capire meglio:

il secondo è la creazione del file con intestazione Header,

Eseguo lo script e genero il file,

Il primo rinomina il file S_Rename

Perchè rinominarlo? se posso crearne un'altro con un nuovo nome?

E' solo un esempio nel caso volessi rinominare un file esistente?

Grazie

Edited by Giuseppe Signorella
Link to post
Share on other sites
Giuseppe Signorella

Ora ho compreso, Prima viene creato il file sempre con lo stesso nome,poi viene aperto e scritto, ed infine viene rinominato utilizzando la data di creazione.

Link to post
Share on other sites
pigroplc

Si, in genere preferisco frammentare i files, verificata una dimensione che mi sono dato come massimo, rinomino il file in modo da avere una serie di files che poi ogni xxx mesi si autocancellano, così prevengo anche la più remota ipotesi di riempimento dell'HD.

Lo script Header non fa altro che creare la prima riga con le descrizoni che mi interessano e se lo vedi su Excel vedi il significato delle tabelle.

Il trigger che fa partire lo script principale è su evento ed è settato in lettura continua. Se il valore del tag è maggiore di 1 io eseguo lo script. Da Simotion invece il tag viene settato = 2 quando il ciclo automatico termina il ciclo, quindi esegue l'incremento dei contatori. Cerca di aggiornare sempre PRIMA i contatori, e quando sei sicuro che il controllore ha acquisito il valore aggiornato lanci lo script. Io utilizzo di solito un timer di un paio di secondi.

Link to post
Share on other sites
Giuseppe Signorella

Ho testato il tuo script e funziona bene. L'unico inconveniente che ho riscontrato è stato l'allineamento. Tutti i dati della medesima riga vengono inseriti in una sola cella.

Sarà per via del formato dell'estensione che è xsl e per il fattore di separazione dei dati. (la virgola).

Alla fine ho utilizzato questo metodo:

Riporto per semplicità solo parte del codice:

'Dichiarazione delle variabili           
           Dim oExcel 
	   Dim oBook 
	   Dim oSheet 
	   Dim today_string
	   Dim File_name
	
	   
	   Set oExcel = CreateObject("Excel.Application")
	   Set oBook = oExcel.Workbooks.Add

	  'Assemblo la data per utilizzarla come parte del nome del file
	   today_string = CStr(Year(Now))&"_"& CStr(Month(Now))&"_"& CStr(Day(Now))
	
	  
	   Set oSheet = oBook.Worksheets(1)
           'Stampo un testo a mio piacimento nella cella n° A1
	   oSheet.Range("A1").Value = "Cliente"
           'Stampo nella cella A2 un valore contenuto all'interno di una variabile utilizzata nel progetto 
	  .
	  .
	  ' Evidenzio in grassetto il valore contenuto in un certo numero di caselle
 
           oSheet.Range("A1:A11").Font.Bold = True
	   .
	   .
           . 
	   'Salvo il tutto in un file di formato xlsx 
	   'Il file prende il nome del cliente che ho lavorato con la data precedentemente rilevata
	   oBook.SaveAs "C:\Storage\" & today_string & "_" & HmiRuntime.SmartTags("Generico_Ricetta_Name client")& ".xlsx"
	   oExcel.Quit
End Sub

Molto semplice e funzionale. Sopratutto perchè viene salvato con il formato xlsx che è quello utilizzato da excel 2010-2013.

L'allineamento è perfetto in quanto si scrive direttamente nella casella selezionata.

Se il file esiste, o qualche cosa non va a buon fine è proprio la classica finestra di windows ad informarci che il file esiste.

Volendo anche il percorso con cui salvare il file può essere selezionato mediante variabile.

Link to post
Share on other sites
pigroplc

L'inconveniente di avere tutto in una cella l'avevo risolto selezionando il punto e virgola come separatore delle celle, in fase di apertura.

Non sapendo esattamente quanto tu dovevi fare, ho messo quanto era funzionante nei miei applicativi come esempio.

Se uno invece vuole comporre un file excel esistono degli esempi sul sito Siemens che si rifacevano ancora a Protool che facilmente potevano essere migrati su WinCC Flex, quindi adesso al tuo Advanced.

A suo tempo avevo fatto un po' di esempi qualora mi fossero serviti. Tutta roba relegata in qualche cartella inutilizzata perché nessuno me la chiese.

Link to post
Share on other sites
tommyengeneer

scusate, volevo capire anche io come risolvere il mio problema.

 

Quello che voglio fare io è aprire un file excel e tramite un tasto di start iniziare a registrare le variabili I/O del PLC S7-300 Siemens ed interrompere la stessa tramite il tasto Stop.

 

Qualcuno può suggerirmi come fare?

 

Grazie Mille

Link to post
Share on other sites
pigroplc

 Excel_2008.zip 

Ho allegato il file di prove che avevo fatto a suo tempo ovviamente depurato di altre cose a me riconducibili.

C'è ovviamente da lavorarci su, prende spunto da un esempio Siemens sopra menzionato.

Edited by pigroplc
Link to post
Share on other sites
simonegr

Buongiorno,

Sto guardando gli script che ha creato per fare un report di produzione su Excel, non sono molto esperto di programmazione Visual Basic per winccadvaced, ho fatto copia e incolla degli script che lei pubblicò su PLC Forum e li ho chiamati:

 

Header

S_Rename_1

E l'altro con un nome generico, però ho un errore nella riga If S_blnEsisteFile(strNomeFile) = True Then 'il file esiste dove il S_blnEsisteFile non so cosa sia mi può aiutare ?

 

Grazie mille

Link to post
Share on other sites
pigroplc
15 ore fa, simonegr ha scritto:

opia e incolla degli script che lei pubblicò su PLC Forum

darsi del tu nel forum come prima regola.... 😃

 

15 ore fa, simonegr ha scritto:

riga If S_blnEsisteFile(strNomeFile) = True

è lo script che verifica se il file esiste o no.

Siccome la sintassi cambia col tipo di windows devi stare molto attento a errori di runtime come prima cosa.

quindi:

1) che pannello hai

2) se hai un pannello con WinCE puoi anche sostituire la call di un altro script col seguente codice:

 

' Verifica che il file esista	
	Set fs = CreateObject("FileCtl.File") 
	fs.Open "\Storage Card SD\Contaore_text.csv",1  	'1=lettura 2= scrittura
	f=fs.lof
	fs.Close

' se il file non esiste lo crea e gli scrive zero	
	If f = 0  Then 'il file non esiste	
	 	fs.Open "\Storage Card SD\Contaore_text.csv",2 	'1=lettura 2= scrittura
	 	fs.LinePrint 0									'scrivi il campo con zero
	 	fs.Close
	End If

in questo caso vado a gestire un contaore indipendentemente da azzeramenti truffaldini/involontari nel PLC

 

per tua cultura ti consiglio di studiare il manuale da scaricare nel link qui sotto:

https://support.industry.siemens.com/cs/document/109764540/simatic-wincc-wincc-engineering-v15-–-programming-reference?dti=0&dl=en&lc=it-IT

 

 

Edited by pigroplc
Link to post
Share on other sites
simonegr

Grazie mille Pigroplc,

 

è mia abitudine non dare del tu, ma ci provo.

Io ho un PC con Windows 10 che ha la funzione solamente di visualizzare su un monitor grande i dati di produzione e salvare gli stessi in un file excel

 

 

Link to post
Share on other sites
Cialtrone

Tanto per chiarire: negli archivi si possono scrivere anche stringhe se sono abbinate a messaggi di allarme.

Io ho fatto archiviazioni con stringhe creando delle classi di segnalazione apposite e poi archiviando gli allarmi (solo di quella classe).

Questo per chi non avesse dimestichezza con gli script.

Link to post
Share on other sites
stressedbyplc

Buongiorno a tutti, leggo spesso i vostri post ma è la prima volta scrivo.

Scusate se riprendo la discussione dopo diverso tempo ma ho un problema e non trovo una soluzione o quanto meno uno spunto.

Devo archiviare, tramite VBScript, in un file xls o csv tramite un TP700 alcune variabili lette dal PLC e non ho nessun problema fino a quando lo faccio su USB.

Quello che non riesco a fare è scrivere su un file in remoto su un PC (o NAS) che richiede il login utente.

Come posso nello script dopo aver inserito il path inserire anche il nome utente e la password?

Di seguito posto la parte di codice che ho già scritto (Windows 10 Pro; S7-300, TIA V13 SP2).

Ringrazio chiunque possa darmi anche solo un suggerimento

...

'Definizione della cartella destinazione
    FolderWay = "\\192.168.9.213\public\nome_utente\Survey"

 

'Login per l'accesso alla cartella di rete

   ????


    Set ObjectWay = CreateObject ("Scripting.FileSystemObject")
...

Link to post
Share on other sites
pigroplc

è vietato dal regolamento riprendere discussioni vecchie. Dovresti aprire una nuova discussione

 

 

**********

N.d. M.

 

E sempre vietato accodarsi ad un'altra discussione, cfr. punto "s" del regolamento.

 

Edited by Livio Orsini
Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...