Prozessvariable_16Bit auf 2 interne Variablen_8Bit aufteilen Skript in WinCCflexible

screwdriver

Level-1
Beiträge
36
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo da draußen, ich muss eine Prozessvariable (16Bit,Wort) auf 2 interne Variablen (8Bit,Byte) aufteilen.
Ich brauche also vom Wort das Lowbyte und das Higbyte. Das Wort kommt von einer S5 und ich will die Datenstruktur auf der S5 Seite nicht anfassen. Wir projektieren mit WinCCflexible, dass Problem ist dass
Winccflex aus dem Wort die 2 Bytes nicht anzeigen kann, ProTool konnte dass (Dez,Dez).
Nun muss ich also ein Skript schreiben dass mir die Funktion ausführt.
Siemens hat dass gleiche schon mal beschrieben alerdings mit WinCC. hier der Link

http://support.automation.siemens.c...=standard&viewreg=CH&load=treecontent#A634489

Genau dass bräuchte ich, dass Problem ist nur, dass die Funktionen im Skript vom WinCCflex nicht erkannt werden.
Hat jemand einen Rat?
 
Hm, den Datentyp KY kann man zwar noch anlegen, aber es scheint wirklich keine direkte Möglichkeit zu geben diesen auch byteweise zur Anzeige zu bringen.

Skriptmäßig könnte man das aber auf interne Variablen vom Typ Byte umlegen. Das wird dann allerdings einiges an Arbeit, zumindest wenn du auch Eingaben vom Panel aus an die SPS zurückschicken willst.

Das reine ausmaskieren würde in VB-Skript zumindest so funktionieren:
Code:
Dim hi
Dim lo
Dim wo

wo = SmartTags("wMW10")
lo = (wo And &HFF00) / 256	' Ausmaskieren wegen Rundungsfehler notwendig
hi = (wo And &H00FF)

SmartTags("intern_wMW10_Lo") = lo
SmartTags("intern_wMW10_Hi") = hi

Bei einer S7 steht dann in der Lo-Variable der Wert von MB10, in der Hi der von MB11.
Variable "wMW10" ist das MW10 aus einer S7 mit Datentyp Word.
Die Variablen "intern_wMW10_Lo" und "intern_wMW10_Hi" sind interne Variablen vom Datentyp Byte.

Das Skript könntest du auf Änderung an eine Variable hängen, oder in einem festen Zeitintervall aufrufen.
Nur das Schreiben wird schwierig, aber vielleicht gibt es ja noch eine andere Lösung als meine Idee.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Super, danke das mit dem Aufteilen klappt einwandfrei. Nur das Zusammensetzen krieg ich einfach nicht hin.
Hab das Zusammensetzen so versucht:
Dim hi
Dim lo
Dim wo

wo = SmartTags("DB_105_DW7")
wo = ((lo And &HFF00) * 256) Or = (hi And &H00FF)) ' Ausmaskieren wegen Rundungsfehler notwendig

SmartTags("DB_105_DW7_lo") = lo
SmartTags("DB_105_DW7_hi") = hi
 
Nicht ganz. Die Umkehrung von meinem Beispiel wäre z.B. so:
Code:
Dim hi
Dim lo
Dim wo

lo = SmartTags("intern_wMW10_Lo")
hi = SmartTags("intern_wMW10_Hi")

wo = (lo * 256) + hi

SmartTags("wMW10") = wo
Das sieht zwar mit den beiden Skripten auf den ersten Blick recht einfach aus, in der praktischen Umsetzung wird das aber etwas aufwändiger denn die Skripte müssen ja auch irgendwie aufgerufen werden.
Wenn nur gelesen werden soll ist das kein Problem sowas mit einem zyklischen Skriptaufruf zu machen. Wenn aber auch geschrieben werden soll muss man sich was überlegen damit es nicht zu Kollisionen kommt (z.B. gerade eingegebene Bytes werden durch das gelesene Wort wieder überschrieben). Da musst du dir halt was elegantes einfallen lassen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Muss doch nochmal kurz nerven, möchte die Sache dokumentieren und will nichts falsch aufschreiben.
Deswegen nur kurz die Frage: Stimmt das mit den hi und lo bytes so, oder sind die vertauscht.
Denn im Wort steht doch links das hi byte und rechts das lo byte, oder.

Muss es dann nicht so heissen:


Dim hiDim loDim wolo = SmartTags("intern_wMW10_Lo")hi = SmartTags("intern_wMW10_Hi")wo = (hi * 256) + loSmartTags("wMW10") = woDanke nochmal
 
Ich weiß nicht welche Endianess bei einer S5 gilt. Bei der S7 hast du recht, da müsstest du hi und lo von der Bezeichnung her tauschen. Aber die Endianess ist auch nur interessant wenn du einen Datentyp über mehr als 1 Byte hast. Beim Datentyp KY kann man sogesehen garnicht von Endianess sprechen, da es zwei byteweise Einzelwerte sind. Wenn die S5 wie die S7 auch Big-Endian ist (wahrscheinlich) tauscht du es einfach dann passt es auch wenn du den Datentyp Word/Int oder sonstwas hast.
 
Zurück
Oben