Vai al contenuto
PLC Forum


Mp277 Leggere/scrivere Variabili Da File .txt A Plc E Viceversa


Messaggi consigliati

Inserito:

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


Inserita:

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 funzione

EsportaSetDatiConSommaDiControllo

la 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.

Inserita: (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: da lupusimprobus
Inserita:

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

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...