Datenbaustein auslesen und in csv schreiben

Earny

Level-1
Beiträge
422
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich versuche gerade einen Datenbaustein auszulesen. Das Ganze läuft unter der Testumgebung PLCSim und Runtime für PC(128).
Im DB1 sind 1000 Integerwerte. Flex scheint das schon erkannt zu haben. In Variablen ist bei Adresse DB1DBW0 und bei Array-Elemente 1000 eingetragen.
Dann habe ich ein Variablenarchiv angelegt und bei Anzahl der Datensätze pro Archiv den Wert 1000 eingetragen.
Dann habe ich mir noch eine Schaltfläche ins Bild1 gelegt, mit der ich den Archivierungsvorgang starten will. Dem Ereignis "Klicken" will ich das Lesen des DB1 zuordnen. Das geht aber nicht!?

Gruß
Earny
 
Das läuft über ein Script. Hier mal ein Beispiel, wie das unter ProTool aussehen würde. Unter Flex sollten die Unterschiede nicht so gravierend sein ...
Code:
[SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] fs , CSV_Dat , i , Ziel , Datei , Verzeichnis[/SIZE]
[SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] Werte_String_1 , Werte_String_2[/SIZE]
[SIZE=2][COLOR=#0000ff]Const[/COLOR][/SIZE][SIZE=2] ForReading = 1, ForWriting = 2, ForAppending = 8[/SIZE]
[SIZE=2]Verzeichnis = [/SIZE][SIZE=2]"c:\Mess-Daten\" [/SIZE]
[SIZE=2]Datei = "Messung[/SIZE][SIZE=2].csv"[/SIZE]
[SIZE=2]Ziel = Verzeichnis + Datei[/SIZE]
 
[SIZE=2][COLOR=#0000ff]Set[/COLOR][/SIZE][SIZE=2] fs = CreateObject ("Scripting.FileSystemObject")[/SIZE]
[SIZE=2][COLOR=#008000]' Ziel-Verzeichnis schon vorhanden ?[/COLOR][/SIZE]
[SIZE=2][COLOR=#008000]' ... wenn nein, dann erst erzeugen ...[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]If [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Not[/COLOR][/SIZE][SIZE=2] fs.FolderExists (Verzeichnis) [/SIZE][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
[SIZE=2]  fs.CreateFolder (Verzeichnis)[/SIZE]
[SIZE=2][COLOR=#0000ff]End [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
[SIZE=2][COLOR=#008000]' Ziel-Datei schon vorhanden ?[/COLOR][/SIZE]
[SIZE=2][COLOR=#008000]' ... wenn nein, dann erst erzeugen ...[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]If [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Not[/COLOR][/SIZE][SIZE=2] fs.FileExists (Ziel) [/SIZE][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]  Set[/COLOR][/SIZE][SIZE=2] CSV_Dat = fs.OpenTextFile(Ziel , ForWriting, [/SIZE][SIZE=2][COLOR=#0000ff]true[/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]  CSV_Dat.WriteLine "Messdaten Anlage xyz"[/SIZE]
[SIZE=2][COLOR=#0000ff]Else[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]  Set[/COLOR][/SIZE][SIZE=2] CSV_Dat = fs.OpenTextFile(Ziel , ForAppending)[/SIZE]
[SIZE=2][COLOR=#0000ff]End [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
[SIZE=2][COLOR=#008000]' Werte-Tabelle übernehmen[/COLOR][/SIZE]
[SIZE=2]Werte_String_1 = "" : Werte_String_2 = "" [/SIZE]
[SIZE=2][COLOR=#0000ff]For[/COLOR][/SIZE][SIZE=2] i = 1 [/SIZE][SIZE=2][COLOR=#0000ff]To[/COLOR][/SIZE][SIZE=2] 128[/SIZE]
[SIZE=2]  Werte_String_1 = Werte_String_1 + CStr([/SIZE][SIZE=2][COLOR=#ff0000]Kurve_Messwerte_Federkraft[/COLOR][/SIZE][SIZE=2] (i)) +";"[/SIZE]
[SIZE=2]  Werte_String_2 = Werte_String_2 + CStr([/SIZE][SIZE=2][COLOR=#ff0000]Kurve_Messwerte_Weg[/COLOR][/SIZE][SIZE=2] (i)) +";"[/SIZE]
[SIZE=2][COLOR=#0000ff]Next[/COLOR][/SIZE]
[SIZE=2]CSV_Dat.WriteLine Werte_String_1 & "0"[/SIZE]
[SIZE=2]CSV_Dat.WriteLine Werte_String_2 & "0"[/SIZE]
[SIZE=2]CSV_Dat.Close [/SIZE]
Vielleicht kannst du damit ja etwas anfangen ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry L.,
vielen Dank für den Skript. Ich denke, ich habe den größten Teil verstanden. Trotzdem bin ich nicht in der Lage, den DB1 auszulesen. Schon im VB-Skript werden die entscheidenden Stellen mit roter Wellenlinie unterstrichen.
Ich vermute, dass die Werte in der FOR-Schleife eingelesen werden.
Ich ersetze das "Kurve_Messwerte_Federkraft (i)" durch "Messwerte.Wert (i)". So ist der Name meiner "Variable". Genaugenommen steht "Messwerte" für den DB1 und "Wert" für das DBW0. Mein Datenbaustein hat 1000 Integerwerte also müsste ich die FOR-Schleife von 1 bis 1000 laufen lassen.
Wie geseagt, es kommt nicht so weit, weil "Messwerte.Wert (i)" bereits eine rote Wellenlinie hat.

Gruß
Earny
 
punkte im variablennamen scheint flex irgendwie nicht zu mögen, wenn es ein array ist. hatte letzte woche so ein problem wo das script partou die var nicht lesen wollte.

versuchen kannst du mal folgendes smarttags("Messwerte.Wert" (i))

ansonsten nenn die variable um in z.b. Messwerte_Wert (i)
 
Hallo volker,
hallo Larry L.,
ich habe den VB-Skript von Larry am Ende etwas abgeändert. Er sieht jetzt so aus:

Code:
Dim fs , CSV_Dat , i , Ziel , Datei , Verzeichnis
Dim Werte_String_1 , Werte_String_2
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Verzeichnis = "f:\Mess-Daten\" 
Datei = "Messung.csv"
Ziel = Verzeichnis + Datei
 
Set fs = CreateObject ("Scripting.FileSystemObject")
' Ziel-Verzeichnis schon vorhanden ?
' ... wenn nein, dann erst erzeugen ...
If Not fs.FolderExists (Verzeichnis) Then
  fs.CreateFolder (Verzeichnis)
End If
' Ziel-Datei schon vorhanden ?
' ... wenn nein, dann erst erzeugen ...
If Not fs.FileExists (Ziel) Then
  Set CSV_Dat = fs.OpenTextFile(Ziel , ForWriting, True)
  CSV_Dat.WriteLine "Messdaten Anlage xyz"
Else
  Set CSV_Dat = fs.OpenTextFile(Ziel , ForAppending)
End If
For i = 0 To 999
Werte_String_1 = Messwerte(i)
CSV_Dat.WriteLine Werte_String_1
Next
CSV_Dat.Close

Es ist sonderbar, gelegentlich werden die 1000 Werte aus dem Datenbaustein übernommen und dann werden wieder nur 1000 Nullen in die csv-Datei geschrieben.
Nach der Empfehlung von Volker habe ich den Namen der "Variablen" von "Messwert.Wert" geändert in "Messwerte". Damit kommt VBS zurecht. Weshalb aber das Einlesen der 1000 Integerwerte aus dem DB1 nicht zuverlässig funktioniert, ist mir unklar. Es gibt keine Fehlermeldungen, auch nicht zur Laufzeit.
Vielleicht wird an der falschen Stelle gelesen oder die Verbindung zu PLCSim ist nicht i.O oder der Erfassungszyklus ist zu kurz, oder, oder, oder...

Gruß
Earny
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Earny,
ich könnte mir vorstellen, dass deine "1000 Integerwerte" durch die Visu überhaupt nicht "gepollt" werden. Das würdest du auf jeden Fall dadurch erreichen, dass du das ARRAY auf "zyklisch lesen" setzt (Variablen-Parameter). Das hätte allerdings zur Folge, dass dein Datenaustausch mit der Visu ständig durch die 1000 INT-Werte belastet wird. In meinen Programmen sind es i.d.R. Kurvenwerte, die ich auf diese Weise speichere. Kurven-Aktualisierungen kannst du durch die entsprechenden Kurvenbits erzwingen (geht bei Flex genau wie bei ProTool). Bei Kurven ist allerdings die Grenze des ARRAY's auf 900 Werte begrenzt. Ich würde aber grundsätzlich auch versuchen, in den Bereich von weit kleineren Zahlen zu kommen (100 bis 300 z.B.).
Vielleicht habe ich dir eine weitere Anregung geliefert ...

Gruß
LL
 
Hallo Larry L.,
ich komme leider nicht mehr dazu, Deinen Vorschlag auszutesten.
Irgendwie hat sich da was ausgerenkt.
Es ist nicht möglich, die Variable "Messwerte", die aus einem Array mit 1000 Integerwerten besteht, in Flex einem Variablenarchiv zuzuordnen.
Wenn ich nur einen einzelnen Wert aus dem DB1, also z.B. den DB1.DBW0 als Variable festlege, dann kann ein vorhandenes Variablenarchiv für die Variable ausgewählt werden. Wenn ich aber Flex soweit bringe, dass es das ganze Array im DB1 erkennt, dann kann ich kein Variablenarchiv mehr auswählen. Beim Punkt "Variablenarchiv" steht dann nur noch <undefiniert> ausgegegraut.

Gruß
Earny
 
... wenn ich das von einem vergangenen Thread richtig in Erinnerung habe, dann musst du als Variable das erste Element des Array's nehmen und dann bei "Anzahl Elemente" dann die 1000 eingeben (wobei ich der nach wie vor der Meinung bin, dass du mit 1000 Werten Stress bekommst). Das kannst du dann auch im Script indexieren.
Leider :)ROFLMAO:) bin ich nicht der Flex-Man, aber so wie beschrieben deckt es sich auch am Ehesten mit ProTool (das ich eigentlich gut kenne).

Gruß
LL
 
Zurück
Oben