GetTagRaw in VBS

Krumnix

Level-3
Beiträge
1.454
Reaktionspunkte
190
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.

Ich habe eine Rohdatenvariable mit 10.000Byte Inhalt, die ich laut der Siemens-Doku (http://support.automation.siemens.com/WW/view/de/37873547
) eingerichtet habe.
In dem Beispiel wird auf C-Script eingegangen, ich arbeite aber mit VBS, da ich Funktionen hier nutze, die nur in VBS umsetzbar sind (bzw. mit wenig Aufwand).

Nun stellt sich die Frage, wie ich den Befehl GetTagRaw in VBS schreiben kann?

Reicht es, wenn ich
Code:
Dim CrudeData
[/SIZE][SIZE=2]Set CrudeData = HMIRuntime.Tags("_Senden_Puffer")
   CrudeData.Read
   CrudeDataPuffer = CrudeData.Value

schreibe?

Kann ich bei VBS einfach so eine Variable definieren und der 10.000Byte übergeben?

Oder was kann ich hier machen?
 
Nun stellt sich die Frage, wie ich den Befehl GetTagRaw in VBS schreiben kann?

VBS kennt leider keinen entsprechenden Befehl zu GetTagRaw.

Man muss also von Hand die Rohdaten in die entsprechenden S7-Datentypen umrechnen und umgekehrt die S7-Datentypen in die Rohdaten.

Als Programmbeispiel siehe dazu das beigefügte VB-Script für die Umrechnung einer IEEE 754 Single Precision Gleitkommazahl (32-Bit-Gleitkommazahl)
in STEP 7 Rohdaten (4-Byte-Rohdaten).

Gruß Kai
 

Anhänge

  • Sub_Rohdaten.pdf
    12,4 KB · Aufrufe: 45
Zuviel Werbung?
-> Hier kostenlos registrieren

Reicht es, wenn ich
Code:
Dim CrudeData
Code:
[SIZE=2]Set CrudeData = HMIRuntime.Tags("_Senden_Puffer")
   CrudeData.Read
   CrudeDataPuffer = CrudeData.Value
[/SIZE]


schreibe?

Ja, so geht das. Du kannst dann die einzelnen Bytes mit CrudeDataPuffer(Bytenummer) auslesen.



Kann ich bei VBS einfach so eine Variable definieren und der 10.000Byte übergeben?


Im TIA-Portal V11 war bei mir mit ca. 200 Bytes Schluss. Warum, konnte mir keiner erklären.
 
In der folgenden Zeile
Code:
 [SIZE=2]CrudeDataPuffer = CrudeData.Value
meckert mir apdiag an, das der Typ unverträglich ist. Jemand eine Idee, warum und wie ich das beseitigen kann?

->
Code:
 Dim [SIZE=2]CrudeDataPuffer(11000)
[/SIZE]
[/SIZE]
 
Du hast ein Array-Feld aus dem Typ Variant deklariert. Das ist genau nicht was Du willst. Du brauchst einen Variant vom Untertyp Byte-Array.

Nimm mal die Array-Deklaration raus. Einfach nur als Variant deklarieren. Der Variant wird bei der Zuweisung zum Untertyp Byte-Array.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke, das war wohl keine gute Idee von mir :)

Noch eine Frage:

Code:
Dim Puffer, CrudeDataPuffer, CrudeData, j

Set CrudeData = HMIRuntime.Tags("_Senden_Puffer")
   CrudeDataPuffer = CrudeData.Read

For j = 1 To 10000
Puffer = Puffer & Chr(CrudeDataPuffer(j))
Next

Da sagt mir apdiag nun "Typen unverträglich: 'CrudeDataPuffer'" und zwar in der zeile, wo ich die Zuweisung zu Puffer mache.
Warum?
 
Füg mal über der Zeile folgendes ein:

Code:
HMIRuntime.Trace "Byte " & FormatNumber(j,0) & " Wert: " & FormatNumber(CrudeDataPuffer(j),0) & vbcrlf
 
Gleiche Meldung.
Jetzt mal was noch nebenbei. Ich rufe das Script nur in einem Bild auf, nicht als Globales Script.
Und das Script im Bild wird von einer Variable aus der SPS getriggert.

Könnte es vielleicht hierdran liegen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, das ist unerheblich.

Ich denke an 2 Möglichkeiten:
1. Deine Variable ist viel zu lang (z.B. TCP/IP-Verbindung max 208 Bytes)
2. Ein "Byte" ist außerhalb des Bereichs (Datentyp Variant)
 
Das ist aber auch interessant: Soll die SPS das Script nur auslösen können, wenn ein bestimmtes Bild geöffnet ist?
 
Zu 1. Ja, ich habe ja 10.000 Byte, die ich in der Rohdatenvariable drin habe. Daher nutze ich ja die Vorgehensweise dazu, welche Siemens in meinem 1. Post vorgibt.
zu 2. Selbst wenn ich j auf 1 setze kommt das leider.

Wenn ich den .Read Befehl alleine stelle und danach .Value schreibe:

Code:
CrudeDate.Read (1)
CrudeDataPuffer = CrudeData.Value

Sagt er mir "Das Objekt ist keine Auflistung: 'CrudeData.Value' "!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist aber auch interessant: Soll die SPS das Script nur auslösen können, wenn ein bestimmtes Bild geöffnet ist?

Jain. Es läuft nur in einem Bild dieses Script und diese werden auf diesem Bild angezeigt. Ansonst sind auf den anderen Bilder die Daten uninteressant. In der SPS werden die Daten in einen DB geloggt und im
WinCC in einem Logging-Bild angezeigt.
Der DB hat 100 Positionen zu 100Byte gespeichert. Ich wollte mir es ersparen, 100 Variablen anzulegen, mit 100 Byte Länge und alles auf einmal auslesen.

Die Daten liegen als CHAR in der SPS vor.

In dem Bild habe ich dann ein Spreadsheet, in dieses die Daten geschrieben werden sollen. Wenn ich eine Rohdatenvariable mit 100 Byte anlege ohne die Siemensgeschicht, sondern direkt, dann funktioniert es.
Sobald ich aber 10 Variablen anlege, wird diese Seite unheimlich langsam.
 
Zu 1. Ja, ich habe ja 10.000 Byte, die ich in der Rohdatenvariable drin habe. Daher nutze ich ja die Vorgehensweise dazu, welche Siemens in meinem 1. Post vorgibt.
zu 2. Selbst wenn ich j auf 1 setze kommt das leider.

Wenn ich den .Read Befehl alleine stelle und danach .Value schreibe:

Code:
CrudeDate.Read (1)
CrudeDataPuffer = CrudeData.Value

Sagt er mir "Das Objekt ist keine Auflistung: 'CrudeData.Value' "!

Ja klar, Du schreibst einmal CrudeDate und einmal CrudeData
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das mit den "vielen" Rohdatenvariablen lässt sich leider nicht vermeiden, Wenn Du nebenbei auch mit "normalen" Variablen arbeiten willst, also die BSend / BReceive -Methode ausscheidet. Ging mir auch so.

Wegen der Geschwindigkeit, Du darfst halt nicht vergessen, dass die WinCC fast 10kByte an Daten hin und herschaufelt, wenn Du die Variablen benutzt. Wenn Du dann noch einen Aktualisierungszyklus von 1 sec hast, dann Gute Nacht. Nimm mal den Zyklus von den Raw's deutlich nach oben, ich denke, die ändern sich nicht permanent, oder?

Dann ist es nicht gut auch noch synchron zu lesen, mach das asynchron (.Read und nicht .Read(1) )
 
Zurück
Oben