WinCC flexible: Indirekte Adressierung innerhlab eines Skriptes / Schleife

Zuviel Werbung?
-> Hier kostenlos registrieren
@LL:
Deshalb habe ich meine Erklärung auch sehr einfach gehalten.
Und wenn 200 Reals schneller gelesen werden als 10 Einzelwerte, dann sitzt entweder der falsche Treiber unter der Visu oder der Visu-Programmierer kennt dessen Möglichkeiten nicht.
 
@LL:
Deshalb habe ich meine Erklärung auch sehr einfach gehalten.
Und wenn 200 Reals schneller gelesen werden als 10 Einzelwerte, dann sitzt entweder der falsche Treiber unter der Visu oder der Visu-Programmierer kennt dessen Möglichkeiten nicht.

also gut - ich bin der visuprogrammierer :ROFLMAO:

ist der teiber von wincc flex falsch oder ich kann ich nicht damit umgehen? :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich hatte erst Kontakt mit Siemens. Der gute Mann sitzt tief in der WCF Materie.
Er meinte lieber ein Array mit 2000 (Maximalwert von Einträgen) als 100 einzelne Variablen die irgendwo im Projekt verstreut sind.
Und da gibt's ja noch nen Punkt - PowerTags :)
 
Also ich hatte erst Kontakt mit Siemens. Der gute Mann sitzt tief in der WCF Materie.
Er meinte lieber ein Array mit 2000 (Maximalwert von Einträgen) als 100 einzelne Variablen die irgendwo im Projekt verstreut sind.
Und da gibt's ja noch nen Punkt - PowerTags :)

ja, PowerTags, wie ist das wird dann das Array als ein Element bzw.
Power Tag gewertet?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
und kann ich den jetzt irgendwie udts bzw. types machen in vb skript bei wincc flex?


also mein array of udt aus der sps dort abbilden?
 
Hallo Markus,
soweit ich sehen konnte kann man in VB-Script (bei Siemens) keine TYPE's deklarieren. Es geht also nur mit ARRAY's gleichen Datentyp's - hier möglicherweise (das habe ich noch nie probiert) mit eindimensionalen ARRAY's ... Sorry ... :(

... wie ich schon geschrieben habe ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da muss ich Dich enttäuschen. Du bist der Visu-Anwender. Die Visu-Programmierer sitzen beim großen S.

gut - dann hätten wir schonmal den wichtigesten punkt geklärt in bezug auf probleme in die ich verwickelt bin: ICH BIN NICHT SCHULD! :ROFLMAO:

aber was soll ich denn jetzt machen?

array direkt zuweisen wird nicht gehen, weil:
1. vb skript in wincc flex keine TYPE kann
2. mein UDT aus variablen unterschiedlicher typen besteht

Zugriff auf die SPS Variablen im Skript kostet massig Zeit bzw. Verbindungsresourcen.

Eine Schleife vor meiner Schleife die die Variablen auf lokale Variablen umkopiert würde dann eigentich auch nicht wirklich was bringen, oder leige ich da falsch?

Was macht Fladi da genau? er weißt die variable einem objekt zu?
bringt aber in punkto zugriff eigentlich auch nichts.
 
@LL:
Deshalb habe ich meine Erklärung auch sehr einfach gehalten.
Und wenn 200 Reals schneller gelesen werden als 10 Einzelwerte, dann sitzt entweder der falsche Treiber unter der Visu oder der Visu-Programmierer kennt dessen Möglichkeiten nicht.

Also meine Erfahrungen mit zumindest mit der PC-Runtime und Anbindung über TCP/IP sind so, dass der Treiber bei WinCC flexible keine Optimierung der Zugriffe macht.
Bei Variablen die auf "zyklisch bei Verwendung" stehen sieht das an einem Beispiel folgendermaßen aus:
Ich lege 16 Bitvariablen DB1.DBX0.0 bis DB1.DBX1.7 an, zusätzlich eine Integervariable DB1.DBW0. Was macht der Treiber? Er stellt insgesamt 17 Anfragen an die SPS, obwohl eine reichen würde.

Die einzige Möglichkeit Zugriffe zu optimieren ist die Daten als Array anzulegen. Dann holt WCflex die Daten en block.

Bei Variablen die auf "zyklisch fortlaufend" stehen sieht das etwas anders aus, da dort die Zyklusbildung in der SPS geschieht.
 
Schleife für das erstellen von Variablen

Hallo zusammen!

Ich schlage mich schon eine ganze Weile mit dem nachstehenden Code herum. Da ich eher VB-Neuling habe ich als Vorlage ein Skript zur Erstellung von Archivdateien von Siemens genommen. Ziel ist es eine grosse Anzahl Variablen (Druckwerte, Messpunkte) zu speichern. Da die Anzahl einfach änderbar sein soll wollte ich das ganze mit einer For Schleife organisieren.
Nun wollte ich die Variable aus dem Namen der Variable (Drucksammlung1.Druck) und dem Index zusammen zusammensetzen um daraus nachher die entsprechende Ausgabe generieren zu können. Die Variable wird korrekt zusammengesetzt (wird mit CStr(Druckzwischenspeicher1) ausgegeben), nur mit welchem Befehl, kann ich mit der in Druckzwischenspeicher1 gespeichten Variablen den Wert ausgeben? Eigentlich müsste es ja der SmartTags Befehl sein, aber wie krieg ich da die Skriptvariable rein das die nachher die Variable von WinCC ausgibt?


Code:
Dim fso, f, ts, DataSet, Header, FName, Druckzwischenspeicher1, Druckzischenspeicher2, i

' Archivierungspfad (Eingangsparameter) und Dateiname zusammensetzen 
' Combine archivepath (input parameter) an filename
FName = StoragePath & "\" & CStr(SmartTags("Auftragsnummer")) & "_" & CStr(DatePart("d",Date)) & CStr(DatePart("m",Date)) & "_" & CStr(DatePart("yyyy",Date)) & ".csv"

' Tabellenkopf zusammenstellen (Spalten Tag_10; Tag_11 usw.)
' Create table header (Column for Tag_10; Tag_11 and so on)
 Header = "Storage Time;Anlagenbediener;Auftragnummer;Artikelnummer;Artikelbezeichnung;Losgrösse;Druck0;Druck1" & Chr(10)'Char (10) entspricht Zeilenvorschub

' FileSystemObject erstellen
' Create FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")


' Wenn Datei noch nicht vorhanden ist, dann wird eine Datei erzeugt
' if the file does not exist, then create a file
If Not fso.FileExists(FName) Then   

   fso.CreateTextFile FName              
   Set f = fso.GetFile(FName)         
' Datei dem Skript als Objekt zur Verfügung stellen
' File as Object available for script

   Set ts = f.OpenAsTextStream(8, -2)
' Datei öffnen
' open file

   ts.WriteLine(FName)                 
   ts.WriteLine(Header)                 
   ts.Close
' Pfad- & Dateiname und Tabellenkopf in die Datei schreiben
' write path- & filename and table header into file
' Datei schließen
' close file

End If 

 Set f = fso.GetFile(FName)            
' Die Archivdatei dem Skript als Objekt zur verfügung stellen 
' Archive file as object available for script

 Set ts = f.OpenAsTextStream(8, -2) 
' Die Datei öffnen 
' Open file

' Werte der Variablen in die Archivdatei schreiben
' Write values of variables in archive file
 
ts.Write(CStr(Now) & ";" & CStr(SmartTags("Anlagenbediener_Name")) & ";" & CStr(SmartTags("Auftragsnummer"))& ";" & CStr(SmartTags("Artikelnummer")) & ";" & CStr(SmartTags("Artikelbezeichnung"))& ";" & CStr(SmartTags("Losgroesse"))& ";" & CStr(SmartTags("Drucksammlung1.Druck0")))


For i=0 To 20 Step +1
     Druckzwischenspeicher1="Drucksammlung1.Druck"&CStr(i)
     [COLOR=Red]ts.Write(";" & CStr(Druckzwischenspeicher1))[/COLOR]
     

    
Next
ts.WriteLine()

' Datei wieder schließen
' Close file
 ts.Close

' Verwendeten Speicher wieder freigeben
' Used storage will be freed
Set ts  = Nothing
Set f   = Nothing
Set fso = Nothing
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich bin mir jetzt nicht 100% sicher, ob ich die Frage korrekt verstanden habe ... mein Vorschlag wäre aber :
Code:
[COLOR=#ff0000]ts.Write(";" & [COLOR=green][B]SmartTags[/B][/COLOR](Druckzwischenspeicher1))[/COLOR]
Gruß
Larry
 
Schleife für das erstellen von Variablen

Danke für Deine Antwort.
In die Richtung hätte ich auch tendiert, wenn ich es mit dem Befehl mache gibt er mir einfach 20 mal 0 zurück, was nicht den Variablen entspricht. Irgendwie habe ich die Vermutung das es an den Anführungszeichen liegt.
Normalerweise sieht ja der Aufruf einer WinCC Variable so aus (SmartTags("Drucksammlung1.Druck0") [die Zahl null wollte ich eigentlich mit der Schleife hochzählen und so die Variablen ausgeben], wenn ich nun aber meine Variable zusammensetze mit Druckzwischenspeicher1="Drucksammlung1.Druck"&CStr(i) dann habe ich ja beim einfügen mit (SmartTags(Druckzwischenspeicher1)) die Anführungszeichen nicht mehr drinn. Wenn ich den obigen Aufruf mit einer direkten (nicht zusammengesetzten) Variable ohne Anführungszeichen realisiere[(SmartTags(Drucksammlung1.Druck0)], dann gibt mir der Compiler einen Fehler aus...
Ich hoffe ich habs einigermassen verständlich erkärt :lol::lol:
 
Hallo,
du mußt bei dem CStr(i) beachten, dass der als String sehr wahrscheinlich ein " 1" und nicht "1" wenn i=1 zurückgibt. Es wird vor der eigentlichen zahl möglicherweise ein Leerzeichen mit eingefügt. Hast du das mal kontrolliert ?

Es gibt aber außerdem noch etwas hier zu beachten :
Innerhalb des Flex-Projektes muss noch unter "Geräte-Einstellungen\Geräte-Einstellungen" und dort in der Rubrik "Einstellungen für Runtime" die Funktion "Namensinformation freigeben" aktiviert sein. das könntest du noch checken ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schleife für das erstellen von Variablen

Hallo Larry
die Einstellung habe ich kontrolliert. Auch habe ich schon verschiedene Sachen ausprobiert.
u.a.:
Code:
ts.WriteLine(CStr(Now) & ";" & CStr(SmartTags("Anlagenbediener_Name")) & ";" & CStr(SmartTags("Auftragsnummer"))& ";" & CStr(SmartTags("Artikelnummer")) & ";" & CStr(SmartTags("Artikelbezeichnung"))& ";" & CStr(SmartTags("Losgroesse"))& ";" & CStr(SmartTags("Drucksammlung1.Druck0")& ";" & CStr(SmartTags("Drucksammlung1.Druck1"))))



For i=0 To 20 Step +1
     Druckzwischenspeicher1="Drucksammlung1.Druck"&CStr(i)
     ts.WriteLine(SmartTags(("Drucksammlung1.Druck5")))
     ts.WriteLine(SmartTags(Druckzwischenspeicher1))
     ts.WriteLine(CStr(Druckzwischenspeicher1))

Zum einen habe ich beim ersten Teil (ohne Schleife) zwei Variablen fest reingeschrieben. In die Schleife habe ich eine Feste Variable, danach den Ausdruck der das machen sollte was ich eigentlich will und danach der mir den Zwischenspeicher einfach als String ausgibt. Wenn ich das Textfile anschaue (siehe Anhang), dann führt er die Zeile vor der Schleife Problemlos aus. Die Fixe Variable in der Schleife und die Ausgabe des Zwischenspeichers funktioniert auch Problemlos. Bei den änderdenden Variablen gibt er die ersten zwei (Druck0 und Druck1) die auch schon oben definiert sind den Wert richtig aus, bei den restlichen aber 0. Kannst Du Dir darauf einen Reim machen?

Gruss
Dani
 

Anhänge

  • 5011_15_7_2011.txt
    777 Bytes · Aufrufe: 12
Hallo Dani,

an der Ausgabedatei kann man sehen, daß Dein Script richtig funktioniert. Es wird lediglich bei allen Variablen außer Druck0, Druck1 und Druck5 0 als Wert ausgegeben.

Stehen alle Deine Druckx-Variablen auf zyklisch lesen?
Sind die Druckx-Variablen eventuell Variablen aus einer Rezeptur?
Ich würde folgendes probieren: für alle Druckx-Variablen ein Ausgabefeld in ein Bild machen und das Script aus diesem Bild aufrufen.

Harald
 
Hallo Harald

Heureka
zyklisch lesen war das Stichwort. Ich hatte den Erfassungszyklus in der Tabelle auf 100ms eingestellt und ging davon aus das dies Ausreichend ist, vorallem da ja die Variablen die ich fest im Skript eingetragen habe, auch geloggt wurden. Aber wieder was gelernt... wollte schon fast aufgeben und das ganze von Hand eintragen.

Vielen Dank an Euch beide.

Gruss
Daniel
 
Zurück
Oben