Rohdaten in Variablen schreiben!?

Deyn

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich verwende folgendes VB-Script in WinCC 7.0 SP1 um den Wert einer Rohdatenvariablen in interne Variablen zuschreiben.
Das Script wird über einen Button gestartet.

Code:
Dim monat, wert_byte, tag(30), out(30)
Dim byte1, byte2, byte3, byte4
Dim k, n 
Set monat = HMIRuntime.Tags("akt_01_Januar_Roh")
monat.Read
wert_byte = monat.Value
For n = 0 To 30
k = n * 4
[COLOR=red]byte1 = wert_byte(k)[/COLOR]
byte2 = wert_byte(k+1)
byte3 = wert_byte(k+2)
byte4 = wert_byte(k+3)
Set tag(n) = HMIRuntime.Tags("akt_Januar_"&n+1)
out(n) = Real2Single(byte1, byte2, byte3, byte4) 
tag(n).Write out(n)
Next

Nun zum eigentlichen Problem:

Die Werte der Rohdatenvariablen werden erst beim 2ten drücken in die internen Variablen geschrieben. Hab das ganze dann mal mit apdiag laufen lassen und beim ersten drücken erhalte ich die Fehlermeldung,

Line: 34 (rot markiert)
Error: Typen unverträglich: 'wert_byte'

beim zweiten drücken erscheint diese nicht mehr!

Was mache ich falsch? Kann ich irgendwie den Typ der Variablen genau festlegen?
Hab auch schon Probiert die Variable 'wert_byte' als Array zu definieren aber der Fehler ist der selbe.

Komisch ist nur, dass es beim zweiten drücken immer funktioniert!

Danke für jede Hilfe
 
Hallo

Ich verwende folgendes VB-Script in WinCC 7.0 SP1 um den Wert einer Rohdatenvariablen in interne Variablen zuschreiben.
Das Script wird über einen Button gestartet.

Code:
Dim monat, [SIZE=4]wert_byte[/SIZE], tag(30), out(30)
Dim byte1, byte2, byte3, byte4
Dim k, n 
Set monat = HMIRuntime.Tags("akt_01_Januar_Roh")
monat.Read
wert_byte = monat.Value
For n = 0 To 30
k = n * 4
[COLOR=red]byte1 = wert_byte(k)[/COLOR]
byte2 = wert_byte(k+1)
byte3 = wert_byte(k+2)
byte4 = wert_byte(k+3)
Set tag(n) = HMIRuntime.Tags("akt_Januar_"&n+1)
out(n) = Real2Single(byte1, byte2, byte3, byte4) 
tag(n).Write out(n)
Next

Nun zum eigentlichen Problem:

Die Werte der Rohdatenvariablen werden erst beim 2ten drücken in die internen Variablen geschrieben. Hab das ganze dann mal mit apdiag laufen lassen und beim ersten drücken erhalte ich die Fehlermeldung,

Line: 34 (rot markiert)
Error: Typen unverträglich: 'wert_byte'

beim zweiten drücken erscheint diese nicht mehr!

Was mache ich falsch? Kann ich irgendwie den Typ der Variablen genau festlegen?
Hab auch schon Probiert die Variable 'wert_byte' als Array zu definieren aber der Fehler ist der selbe.

Komisch ist nur, dass es beim zweiten drücken immer funktioniert!

Danke für jede Hilfe

ohne den sinn zu sehen auf die schnelle du musst
Dim wert_byte(30)

gruss
 
Zuletzt bearbeitet:
Hallo,
hast du denn mal kontrolliert, ob zum Zeitpunkt der Script-Ausführung in deinem Rohdaten sinnvolle (verwertbare) Inhalte stehen ? Möglicherweise enthalten diese in dem Moment (ggf. auch teilweise) noch keine aktuellen oder überhaupt sinnvolle Daten.

Gruß
LL
 
@Larry: Danke, genau das ist das Problem!

Es ist wohl so, dass beim ersten drücken die Rohdaten nicht eingelesen werden. Aber warum ist das so?
Muss ich, um den Fehler zu umgehen die Rohdaten zu beginn einmal einlesen und den Fehler ignorieren? Ist glaub ich nicht so sinnvoll, da dies nicht die einizigste Variable ist die ich einlesen möchte.

Hat jemand nen Tipp wie ich das Problem lösen könnte?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
nun ist WinCC nicht so mein Thema - so ganz allgemein aber :
Bei Siemens ist es sehr üblich, dass Variablen erst bei Verwendung aktualisiert werden (zu Verwendung gehören allerdings NICHT Scripte).
Möglicherweise gibt es aber auch bei deiner Visu eine Option (der Variablen), die diese ständig (und nicht nur bei Verwendung) aktualisiert ...

Gruß
LL
 
Ok danke für die Antworten.

Habe es nun so gelöst, dass ich beim Start der Visu alle Rohdatenvariablen einmal aufrufe mit dem Befehl "On Error Resume Next" damit auch alles ausgeführt wird.
Somit ist wird beim Drücken des Buttons die Variable zum zweiten mal aufgerufen und alle internen Variablen werden korrekt beschrieben.
Ist zwar vielleicht nicht die beste Lösung aber was anderes ist mir nicht eingefallen.

Gruß Deyn
 
Aber ist die Rohdatenvariable dann auch wirklich die aktuelle, wenn du den Button betätigst oder enthält sie die, beim "letzten" Mal eingelesene Werte?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber ist die Rohdatenvariable dann auch wirklich die aktuelle, wenn du den Button betätigst oder enthält sie die, beim "letzten" Mal eingelesene Werte?

Daran habe ich noch garnicht gedacht, dass muss ich noch prüfen.
Mir ist bis jetzt noch nichts aufgefallen, aber liegt wohl daran, dass die Daten nur einmal am Tag von der SPS in den DB geschrieben werden. ;)

Gruß Deyn
 
Danke!

Read mit ,1 aufrufen. Ist wie readtagwait im c script!

Danke funktioniert ohne Probleme!

Hier nochmal der endgültige Code: ;)
Code:
Dim monat, wert_byte, tag(30), out(30)
Dim byte1, byte2, byte3, byte4
Dim k, n 
 
Set monat = HMIRuntime.Tags("akt_01_Januar_Roh")
[COLOR=red]monat.Read(1)[/COLOR]
wert_byte = monat.Value
 
For n = 0 To 30
    k = n * 4
[COLOR=black]   byte1 = wert_byte(k)[/COLOR]
    byte2 = wert_byte(k+1)
    byte3 = wert_byte(k+2)
    byte4 = wert_byte(k+3)
 
    Set tag(n) = HMIRuntime.Tags("akt_Januar_"&n+1)
    out(n) = Real2Single(byte1, byte2, byte3, byte4) 
 
    tag(n).Write out(n)
Next

Gruß Deyn
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich weiß nicht in wie weit das Problem gelöst wurde.
Wir benutzen für Analogwerte einen FB den wir in WinCC komplett Parametrieren. Dieser enthält 4 Grenzwerte (alle Ein/Ausschaltbar ) MBA MBE, PEW Verzögerungszeit für Alarme (min Max Messwertüberschreitung-/Ausfall usw.)

Den Instanz DB lese ich über Rohdaten aus und schreibe über die gleiche weiße auch wieder die werte zurück, indem ich im Button "Übernehmen" die aktuellen werte noch einmal einlese die geänderten Werte dann dazu schreibe und dann gleich wieder in die SPS schreibe.
 
Funktioniert bei mir nicht.Was mach ich falsch

Sorry, das ich das Thema aufwärme.
Bei mir geht das nicht.
hab einfach mal ne Variable dazugeschrieben, um zu sehen ob das Script bearbeitet wird.
Aber die Rohdatenvariable "SG2" mit 8 Floatvariablen wird einfach nicht in die internen Varablen Test_1 bis Test_8 geschrieben.
Option Explicit
Function action

Dim objTag
Set objTag = HMIRuntime.Tags("TEE")
objtag.Read
objTag.Value = 2.2
objtag.Write
HMIRuntime.Trace "TEE"

Dim monat, wert_byte, Tag(8), out(8)
Dim byte1, byte2, byte3, byte4
Dim k, n
Set monat = HMIRuntime.Tags("SG2")
monat.Read
wert_byte = monat.Value
For n = 0 To 8
k = n * 4
byte4 = wert_byte(k)
byte3 = wert_byte(k+1)
byte2 = wert_byte(k+2)
byte1 = wert_byte(k+3)
Set Tag(n) = HMIRuntime.Tags("Test_1"&n+1)
out(n) = Real2Single(byte1, byte2, byte3, byte4)
Tag(n).Write out(n)
Next
 
Zuletzt bearbeitet:
Zurück
Oben