# WinCC VB Rohdaten



## Raydien (23 Januar 2007)

Hallo werte Gemeinde, eins vorweg im VB bin ich absoluter Neuling und hänge mit meiner aufgabe grade fest.

Folgendes. ich will einen Rohdatenblock als Integer lesen und es auf Ein/ausgabe felder ausgeben. 

Als ich soweit war habe ich herausgefunden das WinCC den Rohdatenblock als Byte liest. irgendwo hier im Forum habe ich einen Code gefunden das er das Format auf Int wandelt.
ich habe versuch den Code einzubinden doch irgendwie bekomme ich den nicht ans laufen. ich habe das gefühl das ich was vo nder Setzung der Ausgabe was falsch gemacht habe, denn wenn ich den Code einfüge kann ich noch nicht mal mehr eine Constante am Ausgabefeld defieren.

Zusätzlich wollte ich euch fragen, wo es gute Literatur darüber gibt, ich habe mir zwar nen Buch "Windows Scripting VBS" gekauft dennoch habe ich festgestellt das das Müll und für das WinCC nicht zu gebrauchen ist.

Ich hoffe ihr könnt mir weiterhelfen

Hier mein Code:

Option Explicit
Function action
'Deklaration Rohdaten Variabel (Wort 0-199)
Dim dw0_199
'lokale Variable als Variant
Dim db0
Dim dw0(800)
Dim index
'Deklaration Ein/Ausgabe Felder
Dim Wert01_1
Set Wert01_1 = HMIRuntime.Tags("Wert01_1")
Dim Wert01_2
Set Wert01_2 = HMIRuntime.Tags("Wert01_2")
Dim Wert01_3
Set Wert01_3 = HMIRuntime.Tags("Wert01_3")
Dim Wert01_4
Set Wert01_4 = HMIRuntime.Tags("Wert01_4")

Set dw0_199 = HMIRuntime.Tags("Rohdaten")
'Rohdaten Lesen
dw0_199.Read

db0 = dw0_199.Value

'Wandel nach Int
For index = 0 To 4 
dw0_199.Value = dw0_199.Value + Chr(dw0(index)\&h100) + Chr(dw0(index) And &hff)
Next

Wert01_1.Write dw0(0)
Wert01_2.Write dw0(1)
Wert01_3.Write dw0(3)
Wert01_4.Write dw0(4)


Gruß

Raydien


----------



## Ulri (23 Januar 2007)

Hallo, 
das Skript bricht nach dem ersten Fehler ab. Deshalb wird das Schreiben der Ausgabewerte nicht ausgeführt.
Um die Fehlermeldungen zu sehen, solltest du das Tool  ...\Siemens\WinCC\uTools\apdiag.exe starten und "Output Window" aktivieren.
In dieses Fenster kannst du auch Debug-Ausschriften nach folgendem Muster ausgeben:HMIRuntime.Trace "Beliebiger Text oder (String-)Variable" & vbCrLf​Wenn ich es richtig verstanden habe, möchtest du 200 Integerwerte (400 Bytes) von S7 in ein (Integer-)Array transferieren. Bis zur Zeiledb0 = dw0_199.Value​sollte es funktionieren, auch wenn das Array dw0(800) etwas reichlich dimensioniert ist. Ein maximaler Index von 199 (200 Werte) würde reichen.

Da bei Integer-Werten mit Motorola-Byteorder das H-Byte zuerst steht, befinden sich in dem Array db0 abwechselnd H- und L-Bytes. Um die Integer-Werte zu rekonstruieren, könnte die For-Schleife wie folgt aussehen:For index=0 To 4
    dw0(index) = 256*db0(2*index) + db(2*index+1)
Next​Damit würden 5 Integer-Werte im Array dw0 gespeichert.

Mit Literatur zu den Siemens-Spezifischen Objekten (HmiRuntime, Screens etc.) sind wir auf die Siemens-Hilfe und den Support angewiesen.
Das MS-VBScript-Tutorium (VBSCRIP5.CHM), welches mit WinCC installiert wird , sollte als Sprachreferenz ständig in Reichweite sein. Für darüber
hinaus gehende Anforderungen ist das ScriptCenter von Microsoft eine gute Adresse: http://www.microsoft.com/technet/scriptcenter/default.mspx


----------



## Bender25 (23 Januar 2007)

gehts auch in C#?


----------



## Raydien (23 Januar 2007)

Astrein!!!

Danke, wenn ich dich ma treffe gibts nen bier 

hat funktioniert.

Wenn ich das wieder in Byte zurückschreiben und dann senden möchte (gleiche funktion nur in Send)
sollte ich die Formel einfach nur umdrehen
dh.

For index=0 To 4
dw0(index) = 256/db0(2/index)-db0(2/index-1)
Next

Müsste doch klappen oder?


----------



## Ulri (23 Januar 2007)

Fast ...

Eine Möglichkeit wäre:For index=0 To 4db0(2*index) = Int(dw(index)/256) AND &hFF
db0(2*index+1) = dw(index) AND &hFF
​Next
​Der ganzzahlige Divisionsoperator "\" ist als Ersatz für Bitverschiebung mit Vorsicht zu geniessen. Der Term Int(x/y) ist berechenbarer.


----------



## santero (15 September 2010)

moin,

dachte meine frage passt zum thema.

ich hab in einem DB in der SPS ein array angelegt sagen wir mal Temperatur[0..9].Ich möchte dieses Array jetzt in Win CC flex über ein VB script beschreiben.Das möchte ich mit einem variablen index machen z.b. 

Temperatur_ so in der Art.

Aber irgendwie scheint das mit VBS nicht möglich.mit alt + ->  krieg ich das nur so hin : smarttags("DB X.Temperatur[0]")  also feste indices.

weiss jmd wie man das hinbiegen kann oder ist das nicht möglich_


----------



## PN/DP (15 September 2010)

Irgendwo in der Online-Hilfe zum SmartTag-Objekt steht sinngemaß geschrieben:
Zum Zugreifen auf den Wert eines Array-Elements schreiben Sie: SmartTags("Array-Variable")(Index), z.B.  *SmartTags("DB X.Temperatur")(0)*

Harald


----------



## Jochen Kühner (15 September 2010)

santero schrieb:


> moin,
> 
> dachte meine frage passt zum thema.
> 
> ...


_

also da es im Thema um WinCC ging und nicht um flexible, denke Ich wäre ein neues sinvoller gewesen!_


----------



## Hotsch (15 Oktober 2010)

Ulri schrieb:


> Hallo,
> das Skript bricht nach dem ersten Fehler ab. Deshalb wird das Schreiben der Ausgabewerte nicht ausgeführt.
> Um die Fehlermeldungen zu sehen, solltest du das Tool ...\Siemens\WinCC\uTools\apdiag.exe starten und "Output Window" aktivieren.
> In dieses Fenster kannst du auch Debug-Ausschriften nach folgendem Muster ausgeben:
> ...


 
Auch wenn das Thema schon etwas älter ist greife ich es jetzt mal auf. Ich habe die Lösung mit Integerwerten soweit am laufen. Nun möchte ich dies aber auch noch mit DINT machen und bin da etwas am verzweifeln. Wie muss da die Konvertierungszeile aussehen?


----------



## Hotsch (15 Oktober 2010)

Hab gerade eine Lösung gefunden:

```
For index=0 To 9 Step 2
dw0(index) = 256*db0(2*index) + db0(2*index+1)
dw0(index+1)= 256*db0(2*index+2) + db0(2*index+3)
DINTValue =CLng("&H" & (Hex(dw0(index))+Hex(dw0(index+1))))
 
HMIRuntime.Trace  DINTValue &vbCrLf
Next
```


----------

