Script programmierung

zloyduh

Level-1
Beiträge
226
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute!

Möchte aus einem DB die eingetragenen Werte mittels VBScript auslesen und als csv Datei ausgeben.
Der Hacken ist ich muss auf "ARRAY of STRUCT" zugreifen und zwar möchte ich nur bestimmte Daten aus dem STRUCT auslesen.


Habe bis jetzt folgendes gemacht: (nur ein Ausschnitt)

Code:
Dim rDsl

For i = 1 To 30 'Daten in die Tabelle eintragen
    Dat_Nr = i
    rDsl=CStr("PROG_DATEN_AUFTRAG.DATEN[")&(i)& CStr("].ABSCHNITTLÄNGE")
    ts.WriteLine(Dat_Nr & ";" & CStr(rDsl))
Next



Nur hat dies nicht das gewünschte Ergebnis. Es wird nur der Variablenname ausgegeben, möchte aber den Wert auslesen.
Bin allerdings auch kein Profi was die Script-Programmierung angeht..:confused::confused:

Kann mir jemand ein Tipp geben wie so etwas zu realisieren ginge!:TOOL:
 
Sind die Daten den im Script vorhanden und wo schreibst du die hin?

Schön wäre wenn dein Auschnitt das ganze script beinhalten würde.

Du weißt schon das man auf eine script externe Variablen nur als SmartTag zugreifen kann.
 
Nein, die Daten befinden sich in der SPS, diese möchte ich auslesen und als eine csv-Datei auf einen USB-Stick abspeichern. Und es soll auch andersherum funktionieren, also von USB-Stick die Daten in den DB schreiben (das aber später)

Code:
Sub DB_Daten_Senden_PROG()
'Tip:
' 1. Verwenden Sie die Tastenkombination <CTRL+SPACE> oder <CTRL+I>, um eine Liste aller Objekte und Funktionen zu öffnen
' 2. Schreiben Sie den Code unter Verwendung des HMI Runtime Objekts.
'  Beispiel: HmiRuntime.Screens("Screen_1").
' 3. Verwenden Sie die Tastenkombination <CTRL+J>, um eine Objektreferenz zu erstellen.
'Schreiben Sie den Code ab dieser Position:


 
'Declaration of local tags - Deklaration von lokalen Variablen 
Dim fso, f, ts, path, i, j, Dat_Nr
Dim stKennung, rVc, rKm, rAnz,rMh, rDsl, rDsw1, rDsw2




'Definition of local tags - Definition von lokalen Variablen 
i=1
j=1




'Definition of file extension - Definition der Datei-Extension
path= "f:\daten_saege.csv" '"\Storage Card USB\daten_saege.csv" 


 
'Error Routine - Fehlerroutine 
On Error Resume Next 
 
'Create object - Objekt erstellen 
Set fso = CreateObject("Scripting.FileSystemObject") 
 
If Err.Number <> 0 Then 
      ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description 
      Err.Clear 
      Exit Sub 
End If 
 
'if no file exist a text file will be created – Datei erstellen, wenn keine vorhanden 
If Not fso.FileExists(path) Then    
      fso.CreateTextFile path               
End If  
 
Set f = fso.GetFile(path)     
 
If Err.Number <> 0 Then 
      ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description 
      Err.Clear 
      Exit Sub 
End If 
 
Set ts = f.OpenAsTextStream(2, -2)  
 
If Err.Number <> 0 Then 
      ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description 
      Err.Clear 
      Exit Sub 
End If 


 


'Varialblen zuweisen
stKennung=SmartTags("PROG_DATEN_AUFTRAG.PROG_NAME")
rVc=SmartTags("PROG_DATEN_AUFTRAG.BANDGESCHWINDIGKEIT")
rMh=SmartTags("PROG_DATEN_AUFTRAG.MAT_HÖHE")
rKm=SmartTags("PROG_DATEN_AUFTRAG.KÜHLEN")
rAnz=SmartTags("PROG_DATEN_AUFTRAG.n_SOLL")




'Write values into the file - Werte in die Datei schreiben
ts.WriteLine("Auftrag-Kennung; " & stKennung & ";") 'Auftrag Kennung
ts.WriteLine("Materialhöhe [mm]; " & rMh & ";")
ts.WriteLine("vc[m/min]; " & rVc & ";") 'Bandgeschwindigkeit in [m/min]
ts.WriteLine("Kühlmittel; " & rKm & ";")
ts.WriteLine("Stück; " & rAnz & ";") 'Stückzahl 
ts.WriteLine("") 'leer Zeile
ts.WriteLine("") 'leer Zeile
ts.WriteLine("") 'leer Zeile


'Kopfzeile Datensatz
ts.WriteLine("Datensatz-Nr.:; " & "Länge [mm]; " & "Winkel 1 [°]; " & "Winkel 2 [°]; ")


For i = 1 To 30 'Daten in die Tabelle eintragen
    Dat_Nr = i
    rDsl=CStr("PROG_DATEN_AUFTRAG.DATEN[")&(i)& CStr("].ABSCHNITTLÄNGE")
    ts.WriteLine(Dat_Nr & ";" & CStr(rDsl) & ";" & SmartTags("rWinkel_a_s") & ";" & SmartTags("rWinkel_b_s"))
Next




If Err.Number <> 0 Then 
      ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description 
      Err.Clear 
      Exit Sub 
End If 




  
'Close file - Datei schließen 
ts.Close 
 
Set ts  = Nothing 
Set f   = Nothing 
Set fso = Nothing 
 
ShowSystemAlarm "Datenübertragung war Erfolgreich!" 'Storage of the data was successful!
'// EOS ///////////////////////////////////////////////////////// 




End Sub
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Du holst dein Feld aber nicht als SmartTag rein.

Vielleicht könnte es eher so aussehen, dazu müsste man genau wissen
wie dein Feld Deklariert ist. Übrigens ein String in Gänsefüßchen muß
nicht in ein String mit CStr gewandelt werden.
Code:
Dim rDsl

For i = 1 To 30 'Daten in die Tabelle eintragen
    Dat_Nr = i
    rDsl="PROG_DATEN_AUFTRAG.DATEN[" & i & "].ABSCHNITTLÄNGE"
    ts.WriteLine(Dat_Nr & ";" & SmartTag(rDsl))
Next
 
Guten Morgen,
den Code habe ich wie folgt geändert:

Code:
For i = 1 To 30 'Daten in die Tabelle eintragen
 rDsl="PROG_DATEN_AUFTRAG.DATEN[" & i & "].ABSCHNITTLÄNGE"
 rDsw1="PROG_DATEN_AUFTRAG.DATEN[" & i & "].WINKEL.A1"
 rDsw2="PROG_DATEN_AUFTRAG.DATEN[" & i &"].WINKEL.B1"
 
 ts.WriteLine(i & ";" & SmartTags(rDsl) & ";" & SmartTags(rDsw1) & ";" & SmartTags(rDsw2)) 
Next

Leider bekomme ich ständig beim Übertragen in csv eine Fehlermeldung. Ist es überhaupt möglich einzelne Werte aus einer STRUCT auszulesen?

Meldung.png
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Es kann tatsächlich sein (habe ich noch nie ausprobiert, bin mir aber ziemlich sicher, es mal gelesen zu haben), dass du auf die Einzelelemente einer als Struktur deklarierten Variablen nur in einem Bildbaustein zugrefen kannst - nicht aber sie im Script auflösen kannst ...

Gruß
Larry
 
Unter V13 Advanced kann man im script auf UDT´s zugreifen, allerdings nur, wenn man die Variable absolut adressiert, bsp:

Code:
dim scripttag

scripttag=Smarttags("struct.structvar1")

Indirekte Adressierung geht, wenn die Variable im selben script einmal absolut referenziert wurde:
Code:
dim scripttag, i, var
i=1
var="struct.structvar"& cstr(i)
scripttag=Smarttags(var)

if false then
smarttags("scruct.structvar1")=1
end if
 
Wenn Du mit Lokaler Struktur eine lokale Struktur im VB-Script meinst, nein. Strukturen im VB-Script gibt es nicht.
Wie viele Variablen hat Deine Struktur denn?
Du kannst den Umweg nutzen, den ich unten genannt habe, wenn Du aus bestimmten Gründen über eine Indexierung durch eine Laufvariable benötigst.
Das ist natürlich doppelt gemoppelt, wenn es nur ums Umkopieren geht, kannst Du auch einfach deine Struktur per Drag&Drop aus der Variablentabelle ins Script ziehen und dort händisch die Variablen zuweisen.
 
Die Struktur besteht aus 3 Parameter (Länge, Winkel 1, Winkel 2)
Allerdings wird diese Struktur als Array [1..30] aufgerufen.
Ergibt eine ganze Menge Daten :oops:

Also muss ich (wenn ich alles richtig Verstanden habe) jede Variable einzeln aufrufen

So in etwa?

Code:
Var1= SmartTags(DB.mySTRUCT[1].Var1
Var2=SmartTags(DB.mySTRUCT[1].Var2
Var3=SmartTags(DB.mySTRUCT[1].Var3

Var4= SmartTags(DB.mySTRUCT[2].Var1
Var5=SmartTags(DB.mySTRUCT[2].Var2
Var6=SmartTags(DB.mySTRUCT[2].Var3
 
Zuletzt bearbeitet:
hier der Inhalt meines DB:
(die Daten sollen aus dem DB in eine csv-Datei eingetragen werden und nach der Bearbeitung auch wieder zurück in den DB importiert werden (das aber später))


Der Bediener der Maschine bekommt einen USB-Stick wo der Auftrag in vorn einer csv_Datei abgelegt ist diese muss er importierern. Es muss aber auch anders herum funktioneren (das wo ich jetzt dran bin) also die Einträge aus dem DB in eine csv-Detei exportieren.

DB.jpg
 
Zuletzt bearbeitet:
Du musst unterscheiden zwischen PLC-Datatype in der PLC und UDT (UserDataType) in WinCC.
Das ist nicht dasselbe.
Du hast jetzt einen Screenshot von der PLC Seite gemacht.
Diese verbindest Du ja in WinCC mit Externen WCC-Variablen.

Diese kannst Du entweder als UDT anlegen oder einzeln.

Bis Update 3 oder 4 war es nicht möglich in einem Script die Elemente eines UDT indiziert zu adressieren, wenn man dem Script diese nicht wenigstens einmal absolut beigebracht hat.
Ob dies immer noch so ist, weiß ich nicht.
Einzelne Variablen lassen sich über Smarttags indiziert adressieren, da ist dann die PLC-Anbindung unkomfortabel.

Wenn ich hier Mist erzähle, möge bitte jemand bescheid geben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also jetzt bin ich komplett aus dem Konzept :wink:

Muss ich eine interne Struktur in WinCC anlegen und diese mit der Steuerung verbinden?
Und in dem Script mit der intern angelegten Struktur arbeiten?


Fragen über Fragen :ROFLMAO:
 
Ich kann es mich nicht vorstellen.
So, wie ich es sehe, mußt du dir jede Variable (der Struktur und des Array's) einzeln anlegen.
Danach kannst du dann darauf zugreifen wie in deinem Code-Beispiel ...

Gruß
Larry
 
Muss ich eine interne Struktur in WinCC anlegen und diese mit der Steuerung verbinden?
Und in dem Script mit der intern angelegten Struktur arbeiten?
Du kannst eine Struktur in WinCC anlegen und diese mit der Struktur in der PLC verbinden. Dies geht allerdings nicht symbolisch, sondern nur absolut adressiert. Sprich du adressierst das erste Bit der PLC-Struktur auf das erste Bit der WinCC-Struktur.
Dann ist allerdings die Scriptbearbeitung umständlich.

Für die Scriptbearbeitung ist es einfacher wenn du die Variablen einzeln anlegst.
Unter TIA ist es möglich, Die PLC-Variablen per Drag and Drop in WinCC hineinzuziehen. Dann musst Du nicht jede Variable händisch anlegen.

Dann kannst du diese im Script indexiert adressieren.
 
Zurück
Oben