VB mehfach Split

emilio20

Level-1
Beiträge
835
Reaktionspunkte
20
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
ich bin grade dabei Philips HUE Lampen in eine Wicc TIA V13 Script mit einzubinden. Das Schalten der Lampen Funktioniert soweit. Ich möchte gerne die Aktuelle Farbe der Lampen über ein Script auslesen. Dies funktioniert auch schon soweit. Allerdings habe ich noch das Probleme den result zu zuerspliten.

Ich möchte den result in einem 2 Dimensionalen Array zerlegen. Wobei der Split nach"," in die i Ebene und der Split ":" in die j Ebene des Array zerleget werden soll.

Kann mir jemand helfen wie ich den weiterenn Split durchführen kann ?




Code:
    field = Split(result,",")
    
    For i=0 To 1
        field(i) = Replace(field(i), "{", "")
        field(i) = Replace(field(i), "}", "")
        field(i) = Replace(field(i), " ", "")
        
        HiField(j, i) = field(i)
        
    
    Next


Ergeniss result ohne Split
Code:
{"state": {"on":false,"bri":100,"hue":32000,"sat":79,"effect":"none","xy":[0.3595,0.4516],"alert":"none","colormode":"hs","reachable":true}, "type": "Color light", "name": "LivingColors 1", "modelid": "LLC011","uniqueid":"00:17:88:01:00:c0:8a:e8-0b", "swversion": "66013452", "pointsymbol": { "1":"none", "2":"none", "3":"none", "4":"none", "5":"none", "6":"none", "7":"none", "8":"none" }}



Ergebniss: Split nach ","
Code:
"state":"on":false
"bri":100
"hue":32000
"sat":79
"effect":"none"
"xy":[0.3595
0.4516]
"alert":"none"
"colormode":"hs"
"reachable":true
"type":"Colorlight"
"name":"LivingColors1"
"modelid":"LLC011"
"uniqueid":"00:17:66:02:00:c0:8c:e8-0b"
"swversion":"66013452"
"pointsymbol":"1":"none"
"2":"none"
"3":"none"
"4":"none"
"5":"none"
"6":"none"
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Ich möchte den result in einem 2 Dimensionalen Array zerlegen. Wobei der Split nach"," in die i Ebene und der Split ":" in die j Ebene des Array zerleget werden soll.
Also bevor du deinen Beitrag nicht um das Beispiel für deinen String erweitert hast hatte ich keine Ahnung was der Satz heißen sollte...

Hier ein Vorschlag... (nicht ausgetestet, nur runtergetippt)
Sind sicher noch Fehler drin, aber vielleicht reicht das schon um dich auf eine Spur zu bringen.
Ich bin mir aber auch nicht sicher ob ich deinen Satz richtig verstanden habe.
Code:
Dim result
Dim field_K, field_D
Dim i, j
Dim x
DIM Cnt1, Cnt2
Dim HiField()


field_K = Split(result,",")			'Split nach ","

Cnt1 = 0					'Finde Größenparameter für das Array
For i = 0 To Ubound(field_K)			'Finde größte Anzahl an Substrings für ":"
	
	x = field_K(i)
	Cnt2 = Len(x) - Len(Replace(x, ":", ""))  + 1 	'Anzahl der Zeichen ":" + 1
	If Cnt2 > Cnt1 Then				'Gerade "uniqueid" besteht aus vielen Teilen
		Cnt1 = Cnt2
	End If
Next

Redim HiField(Ubound(field_K),Cnt1)		'HiField neu dimensioneren

For i=0 To Ubound(field_K)
	
	x = field_K(i)
	x = Replace(x, "{", "")			'Entfernen nicht gewünschter Zeichen
        x = Replace(x, "}", "")
        x = Replace(x, " ", "")

	field_D = Split(x,":")			'Split nach ":"

	For j=0	TO UBound(field_D)		'Teile des Split ":" in das Array kopieren
		
		HiField(i,j) = field_D(j)

	Next

Next

Sollte (möglicherweise :cool:) ein Array HiField(19,8 )ergeben...
j0j1j2j3j4j5j6j7j8j
i00"state""on"false
i01"bri"100
i12"uniqueid""0017660200c08ce8-0b"
 
Zuletzt bearbeitet:
@RONIN genau das was ich wollte. Funktioniert. Vielen Dank :)*ACK*

Jetzt möchte ich ja ach was dazulernen zu VB.
Was hat es mir den neu Dimensionieren auf sich ?

Könnstes du mir diesen Teil noch mal genauer erklären ?

Code:
For i = 0 To Ubound(field_K)            'Finde größte Anzahl an Substrings für ":"
    
    x = field_K(i)
    Cnt2 = Len(x) - Len(Replace(x, ":", ""))  + 1     'Anzahl der Zeichen ":" + 1
    If Cnt2 > Cnt1 Then                'Gerade "uniqueid" besteht aus vielen Teilen
        Cnt1 = Cnt2
    End If
Next
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wundert mich eigentlich dass das so ohne weiteres funktioniert....

Zum Neu-Dimensionieren des Array. Ich weiß am Anfang noch nicht wie groß die beiden Ebenen des Array sein müssen. Daher wird es zunächst als unspezifiziert deklariert und sobald die richtigen Werte bekannt sind, neu dimensioniert.

Zum korrekten dimensioneren des Arrays muss ich im Vorhinein schon herausfinden wie hoch die größte Anzahl an Substrings nach dem Split-":" ist.

Bei einem eindimensionalen Array kann man das Array on the fly mit "Redim Preserve" nachdimensionieren. Bei mehrdimensionalen Array geht das nur mehr schwer. Daher finde ich vorher schon heraus wie groß das Array jeweils sein muss.

Zum von angesprochenen Teil:
Es wird jeder Substring aus dem Split-", " durchgegangen und bestimmt in wieviele Teile dieser String nach dem Split-":" zerfallen wird. Die größte Anzahl ist die Dimensionierung für das Array.

Len(x) - Len(Replace(x, ":", ""))
Dieser Teil gibt zurück wie oft ":" im String enthalten war. Dieser Wert + 1 ist gleich der Anzahl der Substrings die man mit Split-":" bekommen würde. Ich hätte hier auch mit Split und Ubound arbeiten können, aber mir gefiehl das besser.

Das ist jetzt halt nur eine Lösung für das was du wolltest, wahrscheinlich gibst noch bessere.
 
Zuletzt bearbeitet:
Hallo
ich möchte gerne 1 wert in die Funktion übergeben und 3 werte aus dem Script zurückgeben. Leider Funktioniert dies nicht. Ich habe gelesen das ich hierfür eine Funktion verwenden muss keinen Sub. Ändere ich den Sub in ein Funktion kommt der Fehler

,Die Funktion Hue_Farbe_read wurde fehlerhaft übersetzt. Wenn Sie die Funktion im Editor übersetzen, erhalten Sie detaillierte Informationen.,1,0,00:44:30


Code:
Function Hue_Farbe_read(ByRef light, ByRef bri, ByRef hue, ByRef sat)


Dim IP, Username
Dim result
Dim field_K, field_D
Dim i, j
Dim x
Dim Cnt1, Cnt2
Dim fso, f, ts, Path
Dim ausgabe
Dim ausgabedatei
Dim MyURL , postData 
Dim winHttpReq 
Dim HiField()
Set winHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")

i=0
j=0


IP=SmartTags("DB59 PHILIPS HUE_IP")
Username=SmartTags("DB59 PHILIPS HUE_username")

MyURL = "http://"&IP&"/api/"&Username&"/lights/" & light &""


winHttpReq.Open "GET", MyURL, False
winHttpReq.Send 

result = winHttpReq.ResponseText


field_K = Split(result,",")            'Split nach ","

Cnt1 = 0                    'Finde Größenparameter für das Array
For i = 0 To UBound(field_K)            'Finde größte Anzahl an Substrings für ":"
    
    x = field_K(i)
    Cnt2 = Len(x) - Len(Replace(x, ":", ""))  + 1     'Anzahl der Zeichen ":" + 1
    If Cnt2 > Cnt1 Then                'Gerade "uniqueid" besteht aus vielen Teilen
        Cnt1 = Cnt2
    End If
Next

ReDim HiField(UBound(field_K),Cnt1)        'HiField neu dimensioneren

For i=0 To UBound(field_K)
    
    x = field_K(i)
    x = Replace(x, "{", "")            'Entfernen nicht gewünschter Zeichen
        x = Replace(x, "}", "")
        x = Replace(x, " ", "")

    field_D = Split(x,":")            'Split nach ":"

    For j=0    To UBound(field_D)        'Teile des Split ":" in das Array kopieren
        
        HiField(i,j) = field_D(j)
        
    Next

Next


 bri= HiField(1, 1)
 hue= HiField(2, 1)
 sat= HiField(3, 1)



End Function
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
Function Hue_Farbe_read(ByRef light, ByRef bri, ByRef hue, ByRef sat)[/COLOR]
...
End Function
Ich kenne TIA-VBS nicht - kennt das tatsächlich Function-Deklaration, End Function und ByRef??? :confused:
Zumindest fehlt in Deinem Skript die Zuweisung eines Rückgabewertes an den Funktionsname.

Was für ein WinCC TIA V13 programmierst Du eigentlich? Advanced oder Professionell? Bzw. in welchem System läuft Dein VB-Skript?

Harald
 
Hallo emilio,

grundsätzliches zu Scripten (ob WinCC Advanced oder VBS generell):
1. Die Rückgabe von Werten kann nur durch eine Funktion (Function) erfolgen.
2. Eine Funktion kann prinzipiell nur EINEN Wert zurückgeben.
3. Dieser Rückgabewert kann auch ein (mehrdimensionales) Array sein.
4. Die von dir beim Funktionsaufruf angegebenen Variablen sind Parameter, die an die Funktion ÜBERGEBEN werden.
5. Den Rückgabewert muss man wie folgt behandeln:
<Funktionsname> = result (wobei result dein Rückgabewert/-array ist, wie auch immer dies deklariert ist. Es kann auch anders benannt werden)

@Harald:
Siemens schreibt seit TIA das komplette Script samt Aufruf und Prozedurende in den Editor. Auch können Parameter nun wahlweise als Wert oder Referenz übergeben werden, wobei lt. Siemens bei Scriptaufrufen aus einem anderen Script heraus INTERN ByRef verwendet wird, auch wenn ByVal angegeben ist!!??:???:

Gruß, Fred
 
Zuletzt bearbeitet:
kennt das tatsächlich Function-Deklaration, End Function und ByRef??? :confused:
Da musste ich jetzt auch nachschauen.
Die Function-Deklaration selbst passiert gleich wie bei WinCCFlex über den Eigenschaftsdialog.
WinCCFlex hat die Deklaration (FunctionName(Parameter1,Parameter2) dann in die Kopf- und Fußzeile des Texteditors geschrieben.
TIA schreibt die Deklaration direkt in den Text-Editor-Bereich. Ist aber auch nicht textlich editierbar.

Die Unterscheidung ByRef/ByVal bei der Parameter-Deklaration ist definitiv neu bei TIA.
Vielleicht kann man jetzt auch endlich Objekte zwischen Skriptfunktionen austauschen, bei Flex ging das ja nicht.

Zum Thema:
Das Skript vom TE kann ich in TIA (bis auf den fehlenden Rückgabewert) problemlos übersetzen.
Die Frage nach der Parameter-Rückgabe hat Faust ja schon erklärt.
Wenn man mehr als einen Wert von der Funktion bearbeitet haben will übergibt man diese üblicherweise ByRef, die ReturnValue kann man dann z.B. als Fehler/Status nehmen.
Insofern hat dass der TE mit "ByRef bri, ByRef hue, ByRef sat" schon richtig gemacht.

Wie genau die ByRef-Übergaben in TIA funktionieren und ob es irgendwo TIA-spezifische Begrenzungen gibt weiß ich allerdings nicht.

wobei lt. Siemens bei Scriptaufrufen aus einem anderen Script heraus INTERN ByRef verwendet wird, auch wenn ByVal angegeben ist!!??:???:
Da hätten wir ja schon das erste Beispiel... :???:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie müsste die Rückgabe im Script aussehen ? Mir ist unklar wie der Array in der Variablendeklaration angelegt wird ?

Code:
Function HUE_Farbe_lesen(ByRef light, ByRef werte)


......Script


 werte(1)= HiField(1, 1)
 werte(2)= HiField(2, 1)
 werte(3)= HiField(3, 1)



End Function
 
Zuletzt bearbeitet:
Hallo emilio
Der prinzipielle Aufbau bei mehreren Werten ist folgender, wenn du kein Array verwenden möchtest:
Code:
Function Hue_Farbe_read(ByVal lightt (as Integer), ByRef bri (as Integer), ByRef hue (as Integer), ByRef sat (as Integer)) (as Boolean)
Ich kann eben nicht prüfen ob TIA die Übergabe von Deklarationen unterstütz. Darum die Klammen.
Dein Wert den du übergeben möchtest übergibtst du mit ByVal. Die Werte die du zurückerhalten möchtest übergibst du eine Referenz.
Den Rückgabewert der Funktion als Bool kannst du zur Überprüfung nutzen, ob alles ok ist.

Code:
Function Hue_Farbe_read(ByVal lightt (as Integer), ByRef bri (as Integer), ByRef hue (as Integer), ByRef sat (as Integer)) as Boolean
Hue_Farbe_read=false
.
.
Script
.
'alles ok
Hue_Farbe_read=true
(Return Hue_Farbe_read)

(Return wieder ungeprüfte Syntax)
Holger
 
Hallo
ich habe das Script abgeändert. Der Fehler ist weg aber ich erhalte keine Rückgabewerte. Return gibt es nicht in TIA

Code:
Function HUE_Farbe_lesen(ByVal lights, ByRef bri, ByRef sat, ByRef hue)

HUE_Farbe_lesen=False

Dim IP, Username
Dim result
Dim field_K, field_D
Dim i, j
Dim x
Dim Cnt1, Cnt2
Dim fso, f, ts, Path
Dim ausgabe
Dim ausgabedatei
Dim MyURL , postData 
Dim winHttpReq 
Dim HiField()
Set winHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")

i=0
j=0


IP=SmartTags("DB59 PHILIPS HUE_IP")
Username=SmartTags("DB59 PHILIPS HUE_username")

MyURL = "http://"&IP&"/api/"&Username&"/lights/"&lights&""


winHttpReq.Open "GET", MyURL, False
winHttpReq.Send 

result = winHttpReq.ResponseText


field_K = Split(result,",")            'Split nach ","

Cnt1 = 0                    'Finde Größenparameter für das Array
For i = 0 To UBound(field_K)            'Finde größte Anzahl an Substrings für ":"
    
    x = field_K(i)
    Cnt2 = Len(x) - Len(Replace(x, ":", ""))  + 1     'Anzahl der Zeichen ":" + 1
    If Cnt2 > Cnt1 Then                'Gerade "uniqueid" besteht aus vielen Teilen
        Cnt1 = Cnt2
    End If
Next

ReDim HiField(UBound(field_K),Cnt1)        'HiField neu dimensioneren

For i=0 To UBound(field_K)
    
    x = field_K(i)
    x = Replace(x, "{", "")            'Entfernen nicht gewünschter Zeichen
        x = Replace(x, "}", "")
        x = Replace(x, " ", "")

    field_D = Split(x,":")            'Split nach ":"

    For j=0    To UBound(field_D)        'Teile des Split ":" in das Array kopieren
        
        HiField(i,j) = field_D(j)
        
    Next

Next

 bri= HiField(1, 1)
 hue= HiField(2, 1)
 sat= HiField(3, 1)


 

HUE_Farbe_lesen=True

End Function
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo emilio,

mehrere Fragen:
1. Wie sieht der Funktionsaufruf aus bzw. welchen Typ haben die Funktions-Parameter 'bri', 'sat' und 'hue?
2. Bist du sicher, dass dein internes Feld 'HiField' mit (korrekten) Werten besetzt ist?

Übrigens: meines Wissens nach kann man mit ReDim nur EINE Dimension eines Feldes verändern, nicht beide/mehrere gleichzeitig.

Gruß, Fred

PS: Schon mal versucht, die Runtime mit den Skript-Debugger zu starten? Zur Fehlersuche wirklich hilfreich.

PPS: Ich muss übrigens meine Aussage bezügl. der Siemens-spezifischen Einschränkungen etwas abmildern:
ByRef und ByVal funktionieren bei mir beim Skriptaufruf aus einem anderen Skript doch. Die Hilfe sagt aber nach wie vor etwas anderes...
 
Zuletzt bearbeitet:
Hallo
1. bri = Int , sat= Int, Hue = DInt.
2. Das Script funktioniert wenn ich eine Feste Variable verwende

Code:
SmartTags("Lampe 1 bri")= HiField(1, 1)
SmartTags("Lampe 1 hue")= HiField(2, 1)
SmartTags("Lampe 1 sat")= HiField(3, 1)

wie geht das mit dem Runtime Skript-Debugger ?
 
Zuletzt bearbeitet:
Hallo emilio,

dir ist hoffentlich klar, dass du Variablentypen in einem Array/Feld nicht mischen kannst, obwohl das hier vielleicht zufälligerweise funktioniert.

Zum Problem:
Kannst du trotzdem mal den genauen Funktionsaufruf posten?

Gruß, Fred

PS: Zum Skript-Debugger siehe dje Hilfe im TIA-Portal.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich weiß nicht genau was du möchtest. Ich starte über einen Button das Script. Möchtest du ein Bild von der Belegung des Buttons ?
 

Anhänge

  • hue1.JPG
    hue1.JPG
    31,4 KB · Aufrufe: 13
  • hue2.JPG
    hue2.JPG
    20,5 KB · Aufrufe: 12
Zuletzt bearbeitet:
Zum Beispiel. Interessant wäre auch, ob es beispielsweise mit internen Variablen ohne Steuerungsanbindung funktionieren würde.

Gruß, Fred
 
Zurück
Oben