lupusimprobus Inserito: 1 dicembre 2011 Segnala Inserito: 1 dicembre 2011 Buongiorno a tutti.Ho un pannello operatore MultiPanel277 connesso in Profinet con un PLC S7300 (CPU 315-2 PN/DP).Voglio realizzare uno script sul pannello che legga tutte le word all'interno di un DB e le scriva in un file di testo.La scrittura su file la faccio senza problemi.Il problema è che non voglio scrivere 200 righe di codice per copiare il valore di 200 word in un file di testo.Ho pensato di realizzare un semplice ciclo "FOR Next" per copiare le singole word in altrettante righe del file.Le variabili da copiare hanno il nome tipo: "Pressione_Avanti_001", "Pressione_Avanti_002", ..., "Pressione_Avanti_020", ecc.Come da codice riportato di sotto:fFileWrite.LinePrint "Pressione_Avanti_"&addZero(i)&"="&SmartTags("Pressione_Avanti_"&addZero(i)) Nota: la funzione "addZero()" aggiunge solo, quando necessario, gli zeri iniziali al contatore in modo che sia sempre composto da tre caratteri. "1" diventa "001", "12" diventa "012" e così via. La compilazione avviene senza errori ma nel file di testo esportato, tutte le variabili hanno valore "0" (zero) La cosa strana, è che se utilizzo in modo esplicito la variabile in un punto precedente, ad esempio: Dim a a = Pressione_Avanti_001 ..... oppure in questo altro modo: fFileWrite.LinePrint "Pressione_Avanti_001="&Pressione_Avanti_001 fFileWrite.LinePrint "Pressione_Avanti_002="&Pressione_Avanti_002 Dopo, anche le variabili nel ciclo FOR vengono lette in modo corretto (solo le variabili che ho utilizzato, non tutte quelle del DB). La mia domanda è: Vi è un modo per far leggere e scrivere il valore di una varibile in un DB senza doverl per forza utilizzare in modo esplicito prima? Ho oltre 200 variabili e andarle a scrivere una alla volta mi sembra davvero una cosa assurda. Al fondo del post ho riportato lo script completo. Grazie per l'attenzione, Valerio. ' Gestione errori On Error Resume Next ' Definisco le caratteristiche di visualizzazione della clessidra ' Dati della pagina Dim hmio ' Oggetto posizionato sulla pagina Dim screenName ' Nome della pagina ' Lavoro sulla pagina 450 (il numero è da modificare in caso si ' modifichi il numero di pagina) screenName = "450 SV File" ' Rendo visibile la clessidra Set hmio = HmiRuntime.Screens(screenName).ScreenItems("clessidra") hmio.Visible = True ' Determino da quale sorgente devo leggere i dati Dim strMMC, strUSB1, strUSB2 strMMC = "\Storage Card MMC" ' Scheda di memoria MMC strUSB1 = "\Storage Card USB" ' Chiavetta USB strUSB2 = "\Storage Card USB2" ' Chiavetta USB2 ' In base al supporto scelto, carico la cartella di destinazione Dim filePath Select Case SmartTags("DB451 SV File e Dir.sorgenteDati") Case 1 ' MMC filePath = strMMC Case 2 ' USB filePath = strUSB1 Case 3 ' USB2 filePath = strUSB2 Case Else ' Rete filePath = SmartTags("DB451 SV File e Dir.path") End Select ' Definisco il nome del file in cui esportare i dati Dim fileNameExport fileNameExport = SmartTags("DB451 SV File e Dir.fileNameData") ' File completo di percorso Dim fileNameExportFull fileNameExportFull = filePath&"\"&fileNameExport ' Verifico se la cartella esiste Dim fSystem Set fSystem = CreateObject("FileCtl.FileSystem") If(fSystem.Dir(filePath)="") Then ' La cartella non esiste ' Scrivo la segnalazione appropriata Select Case SmartTags("DB451 SV File e Dir.sorgenteDati") Case 1 ' MMC SmartTags("DB451 SV File e Dir.message1") = "Storage card MMC not found!" ShowSystemAlarm ("Storage card MMC not found!") Case 2 ' USB SmartTags("DB451 SV File e Dir.message1") = "Storage card USB not found!" ShowSystemAlarm ("Storage card USB not found!") Case 3 ' USB2 SmartTags("DB451 SV File e Dir.message1") = "Storage card USB2 not found!" ShowSystemAlarm ("Storage card USB2 not found!") Case Else ' Rete SmartTags("DB451 SV File e Dir.message1") = "Directory '"&filePath&"' not found!" ShowSystemAlarm ("Directory '"&filePath&"' not found!") End Select Else ' La cartella esiste ' Verifico la presenza del file If(fSystem.Dir(fileNameExportFull)<>"") Then ' Il file esiste già: lo cancello SmartTags("DB451 SV File e Dir.message2") = "Cancello '"&fileNameExportFull&"'" fSystem.Kill fileNameExportFull SmartTags("DB451 SV File e Dir.message2") = "File '"&fileNameExportFull&"' cancellato" End If ' Il file non esiste: lo creo e vi scrivo dentro SmartTags("DB451 SV File e Dir.message2") = "Apro il file '"&fileNameExportFull&"' in scrittura" Dim fFileWrite Set fFileWrite = CreateObject("FileCtl.File") fFileWrite.Open fileNameExportFull, 2 ' 2=Apertura file in lettura/scrittura Dim data Dim i Dim str1, str2 str1 = "# ******************************************************" str2 = "# * Pressioni avanti generatori *" fFileWrite.LinePrint str1 fFileWrite.LinePrint str2 fFileWrite.LinePrint str1 Dim a a = Pressione_Avanti_001 a = Pressione_Avanti_002 a = Pressione_Avanti_003 a = Pressione_Avanti_004 a = Pressione_Avanti_005 a = Pressione_Avanti_006 'fFileWrite.LinePrint "Pressione_Avanti_001="&Pressione_Avanti_001 'fFileWrite.LinePrint "Pressione_Avanti_002="&Pressione_Avanti_002 'fFileWrite.LinePrint "Pressione_Avanti_003="&Pressione_Avanti_003 'fFileWrite.LinePrint "Pressione_Avanti_004="&Pressione_Avanti_004 'fFileWrite.LinePrint "Pressione_Avanti_005="&Pressione_Avanti_005 'fFileWrite.LinePrint "Pressione_Avanti_006="&Pressione_Avanti_006 fFileWrite.LinePrint str1 For i=1 To 20 fFileWrite.LinePrint "Pressione_Avanti_"&addZero(i)&"="&SmartTags("Pressione_Avanti_"&addZero(i)) SmartTags("DB451 SV File e Dir.message2") = (i)&"/20" Next ' Chiudo il file fFileWrite.Close End If ' Rendo invisibile la clessidra Set hmio = HmiRuntime.Screens(screenName).ScreenItems("clessidra") hmio.Visible = False If Err.Number <> 0 Then ' Rendo invisibile la clessidra Set hmio = HmiRuntime.Screens(screenName).ScreenItems("clessidra") hmio.Visible = False SmartTags("DB451 SV File e Dir.message2") = Err.Number&" - "&Err.Description&" - "&Err.Source Err.Clear End If Funzione "addZero(var) Dim s If val >= 100 Then s = val Else If val >= 10 Then s = "0"&val Else s = "00"&val End If End If addZero = s
dott.cicala Inserita: 1 dicembre 2011 Segnala Inserita: 1 dicembre 2011 Non so, la butto là, non conoscendo il tuo scopo...Hai provato ad usare una ricetta, crei il set di dati con le variabili online e usi la funzioneEsportaSetDatiConSommaDiControllola quale genera un file csv?....Oppure usare gli archivi e le relative funzioni.Prova a vedere nelle funzioni già disponibili.Magari fai uno script per lanciare la funzione di esportazione invece che creare tutta la routine.
lupusimprobus Inserita: 2 dicembre 2011 Autore Segnala Inserita: 2 dicembre 2011 (modificato) Grazie per la risposta. Il mio scopo è quello di salvare su file il valore di un certo numero di variabili. I modi per farlo suppongo siano più di uno, quello che ho scelto io è il realizzare uno script che crea un file in una cartella di rete e vi salva dentro i valori di queste variabili. La cosa curiosa è che avendo una serie di variabili che si chiamano:Pressione_US_001 Pressione_US_002 Pressione_US_003 ... Pressione_US_200 Non ho voglia di scrivere 200 righe di codice ed ho quindi optato per un ciclo For Next che scrive una riga alla volta all'interno del file. For i=1 To 200 fFileWrite.LinePrint "Pressione_US_"&addZero(i)&"="&SmartTags("Pressione_US_"&addZero(i)) Next Quello che ho trovato strano è che lo script funziona, il file viene scritto ma il valore delle variabili è zero. Ho pensato che, utilizzando una concatenazione di stringhe all'interno della funzione SmartTags(), il pannello non andasse a leggere i dati nella memoria del PLC e mi restituisse sempre zero. La cosa curiosa è che se in un punto precedente dello script, ho utilizzato la variabile in questione, anche solo per assegnarne il valore ad un'altra variabile, allora quando eseguo il ciclo For Next, nel file di testo viene scritto non più zero ma il valore corretto. Ora ho creato una sub con il seguente codice: sub loadVar() Dim a a = Pressione_Avanti_001 a = Pressione_Avanti_002 ... a = Pressione_Avanti_200 loadVar = 0 Richiamando la funzione all'inizio dello script, quando chiamo le variabili anche all'interno del loop, in modo indiretto, sia in lettura che in scrittura, il funzionamento risulta corretto. E' una cosa che mi ha fatto perdere un po' di tempo ed ho voluto renderla pubblica in caso servisse ad altri oltre che, ovviamente, sentire se qualcun altro avesse avuto la mia stessa esperienza ed avesse adottato soluzioni diverse. Grazie ancora per l'attenzione, Valerio. Modificato: 2 dicembre 2011 da lupusimprobus
pigroplc Inserita: 7 dicembre 2011 Segnala Inserita: 7 dicembre 2011 Allora, io indicizzo con for-next e non ci sono problemi, non vorrei che si trattasse solamente dell'impostazione della dichiarazione dei tag come lettura continua, mentre te hai impostato qualcosa di diverso.pigroplc
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora