Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: VB mehfach Split

  1. #1
    Registriert seit
    10.08.2010
    Beiträge
    769
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard


    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"
    Geändert von emilio20 (31.12.2014 um 12:29 Uhr)
    Zitieren Zitieren VB mehfach Split  

  2. #2
    Registriert seit
    10.08.2010
    Beiträge
    769
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Kein VB Experte hier der eine Lösung weiß ?

  3. #3
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.268
    Danke
    439
    Erhielt 661 Danke für 498 Beiträge

    Standard

    Zitat Zitat von emilio20 Beitrag anzeigen
    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 ) ein Array HiField(19,8 )ergeben...
    j0 j1 j2 j3 j4 j5 j6 j7 j8 j
    i00 "state" "on" false
    i01 "bri" 100
    i12 "uniqueid" "00 17 66 02 00 c0 8c e8-0b"
    Geändert von RONIN (03.01.2015 um 01:13 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  4. #4
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.730
    Danke
    208
    Erhielt 419 Danke für 336 Beiträge

    Standard

    vlt. kann ja das verwendet werden: https://code.google.com/p/vba-json/i...nlib.cls&token

  5. #5
    Registriert seit
    10.08.2010
    Beiträge
    769
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    @RONIN genau das was ich wollte. Funktioniert. Vielen Dank

    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
    Geändert von emilio20 (03.01.2015 um 20:23 Uhr)

  6. #6
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.268
    Danke
    439
    Erhielt 661 Danke für 498 Beiträge

    Standard

    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.
    Geändert von RONIN (04.01.2015 um 09:22 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  7. #7
    Registriert seit
    11.12.2010
    Ort
    nähe Bamberg
    Beiträge
    40
    Danke
    1
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Hallo!
    evtl .split().split()... Probieren oder regex... Ansonsten mal bei vb-paradise.de vorbeischaun
    gruss

  8. #8
    Registriert seit
    10.08.2010
    Beiträge
    769
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    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

  9. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    10.762
    Danke
    884
    Erhielt 3.158 Danke für 2.559 Beiträge

    Standard

    Zitat Zitat von emilio20 Beitrag anzeigen
    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???
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #10
    Registriert seit
    17.10.2007
    Beiträge
    263
    Danke
    5
    Erhielt 52 Danke für 48 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    Geändert von faust (06.01.2015 um 09:30 Uhr)

  11. Folgende 2 Benutzer sagen Danke zu faust für den nützlichen Beitrag:

    PN/DP (06.01.2015),RONIN (06.01.2015)

Ähnliche Themen

  1. Temperaturregelung eines Exruders (Split-Range)
    Von JensO im Forum Sonstige Steuerungen
    Antworten: 3
    Letzter Beitrag: 27.08.2011, 09:36
  2. split range regler und step 7
    Von WIX im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 15.04.2011, 22:27

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •