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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: WinCC-Variabelen in S7 über Rohdaten

  1. #1
    Registriert seit
    24.05.2006
    Beiträge
    20
    Danke
    5
    Erhielt 1 Danke für 1 Beitrag

    Beitrag


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi community,

    die Werte aus Rohdaten in Variabelen krieg ich mittlerweile ja raus. Hier nochmal vielen Dank an Donnerkeil. Jetzt versuche ich gerade Intergerwerte in die SPS zurückzuschreiben, es kommt aber nur in jedem 2. Byte etwas an. Hat da jemand einen Vorschlag?
    Zu guter letzt muss ich INT, DINT und REAL schreiben. Ich bin für jede Unterstützung dankbar.
    Zitieren Zitieren WinCC-Variabelen in S7 über Rohdaten  

  2. #2
    mortontower ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.05.2006
    Beiträge
    20
    Danke
    5
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo nochmal,

    ich versuche es mit folgendem code:

    Code:
    ub OnClick(ByVal Item)                                                                    
     
    ' Deklaration Rohdaten-Variable ( Wort 0-199 ) 
    Dim dw0_199 
     
    'lokale VB-Variable als Variant 
    Dim db0 
    Dim dw0(800) 'As Int 
     
    Dim index 
    Dim Errorlevel 
     
    Set dw0_199 = HMIRuntime.Tags("RoheDaten") 
     
    ' Variabelenwerte in Array kopieren 
    dw0(0) = HMIRuntime.Tags("Wert_1").read 
    dw0(1) = HMIRuntime.Tags("Wert_2").Read 
    dw0(2) = HMIRuntime.Tags("Wert_3").Read 
    dw0(3) = HMIRuntime.Tags("Wert_4").Read 
    dw0(4) = HMIRuntime.Tags("Wert_5").Read 
     
    'Array nach Rohdatenvariabele kopieren 
    For index = 0 To 4 
    dw0_199.Value = dw0_199.Value + Chr(dw0(index)) 
    Next 
    'Rohdaten in SPS schreiben 
    Errorlevel = dw0_199.write 
          
          
    End Sub
    allerdings wird in der SPS nur jedes 2. Byte beschrieben. was ist falsch dran?

    gruss

    mortontower
    Zitieren Zitieren Rohdaten mit Werten versorgen  

  3. #3
    Registriert seit
    18.05.2005
    Beiträge
    12
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    die Zeile in der For-Schleife sollte wie folgt lauten:

    dw0_199.Value = dw0_199.Value + Chr(dw0(index)\&h100) + Chr(dw0(index) And &hff)

    Für DINT funktioniert es in gleicher Weise, beginnend mit dem Term:

    ddw(index)\&h1000000 And &hff + ...

    Auf VBS-Ebene muß man REALs IMHO zusammen "basteln". Für nicht denormalisierte Gleitkommazahlen habe ich eine Funktion geschrieben,
    aber noch nicht vollständig getestet. Bei Bedarf kann ich sie posten.

  4. #4
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.849
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    Zitat Zitat von Ulri
    Auf VBS-Ebene muß man REALs IMHO zusammen "basteln".
    ne.
    du kannst im script ohne probs sowas schreiben
    Code:
    VAR_200=3.1415
    
    wobei var_200 an der steuerung hängt und vom typ: real ist. (z.b. MD200)
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  5. #5
    mortontower ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.05.2006
    Beiträge
    20
    Danke
    5
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Danke für den Vorschlag, funktioniert allerdings nur bedingt. ich habe für die Variabele Wert1 = 1025 eingegeben, Wert2 ist 2. Heraus kommt in der SPS folgendes:

    Byte0=4
    Byte1=0
    Byte2=1
    Byte3=0
    Byte4=0
    Byte5=0
    Byte6=2
    Byte7=0
    Es wird immer ein Byte mit 0 zwischendurch belegt. ich habe versucht den String zu trimmen usw, aber ohne ergebnis. Rohdaten sind ja ein Array von Bytes, aber es kommt mir so vor als ob immer Wörter beschrieben würden. So, what the hell could this be? Oder Chr macht noch'n byte leer hinten dran.
    Zitieren Zitieren Rohdaten mit Werten versorgen,  

  6. #6
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.849
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    Zitat Zitat von mortontower
    Oder Chr macht noch'n byte leer hinten dran.
    nah dran.

    Code:
    STRING 
    Definiert eine Gruppe von maximal 254 Zeichen (Datentyp CHAR).
    Der Standardbereich, der für einen Zeichenkette reserviert ist,
    besteht aus 256 Bytes. Dies ist der Platz, der benötigt wird,
    um 254 Zeichen und einen Kopf von 2 Bytes zu speichern. 
    Sie können den Speicherplatz für eine Zeichenkette verringern, 
    indem Sie auch die Anzahl der Zeichen definieren, die in der 
    Zeichenkette gespeichert werden sollen (z. B. : string[9] ‘Siemens’).
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  7. #7
    mortontower ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.05.2006
    Beiträge
    20
    Danke
    5
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Schlaumeier, mal lesen worums geht. selbst folgender code

    Code:
    dw0_199.Value = "HAllo"
    liefert in der SPS

    Byte0=48
    Byte1=00
    Byte2=41
    Byte3=00
    Byte4=6C
    Byte5=00
    Byte6=6C
    Byte7=00
    Somit kanns ja nicht am String liegen. Man schreibt bytes die Wortweise übergeben werden. kann man ein Byte-Array explizit anlegen? Ist also mit der Deklaration der Rohdatenvariabele etwas nicht Richtig?

  8. #8
    Registriert seit
    18.05.2005
    Beiträge
    12
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    folgendes Programmfragment funktioniert in mehreren Anlagen.
    Hier wird ein Textstring von max. 30 Bytes an Byteoffset 5 der Rohdatenvariablen geschrieben:

    Dim partNo : PartNo = "xyz"
    Dim arrSend, strSend
    Dim i, l

    ' ' '

    ' Bytearray via Rohdatenvariable synchron lesen
    arrSend = HMIRuntime.Tags(strSend).Read (1)
    If VarType(arrSend) < vbArray Then
    ' Hier erfolgt eine Fehlerbahandlung
    Exit Sub
    End If



    l = Len (PartNo)
    If l > 0 Then
    If l > 30 Then l = 30
    For i=1 To l
    arrSend(i+5) = Asc (Mid (PartNo, i, 1))
    Next
    End If

    If l < 30 Then
    For i=l+1 To 30
    arrSend(i+5) = &h20
    Next
    End If

    ' Bytearray via Rohdatenvariable asynchron schreiben
    HMIRuntime.Tags(strSend).Write arrSend, 0

    ' ' '

  9. #9
    mortontower ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.05.2006
    Beiträge
    20
    Danke
    5
    Erhielt 1 Danke für 1 Beitrag

    Daumen hoch

    Alles supergut. Danke Ulri für den support. mit folgendem Code kann man auf tastendruck (oder was auch immer) Rohdaten mit integer versorgen:

    Code:
    SubOnClick(ByValItem)                                                                                                        
    ' Integerwerte an Rohdatenblock übergeben und in SPS-Schreiben
    ' von mortontower, mit freundlicher Unterstützung von Ulri
    ' es werden die in Anz angegebenen Variabelen geschrieben
    ' WINCC:TAGNAME_SECTION_START
    Const TagNameInAction = "RoheDaten"
    ' WINCC:TAGNAME_SECTION_END
    
    'lokale VB-Variablen deklarieren als Variant
    Dim dw0(800)
    Dim arrSend, strSend
    Dim i, Anz, Prefix
    
    ' konstanten vorbesetzen
        Anz = 4                 'Anzahl von Variabelen
        Prefix = "Wert_"        'Prefix für die Variabelen aus denen gelesen wird
        strSend = "RoheDaten"    'Name der Rohdatenvariable
    
    ' Bytearray via Rohdatenvariable synchron lesen
        arrSend = HMIRuntime.Tags(strSend).Read (1)
    
    'Prüfen ob Ergebnis auch ein Array ist
    If VarType(arrSend) < vbArray Then
           ' Hier erfolgt eine Fehlerbahandlung
           MsgBox " kein Array in der Variable"
           Exit Sub
    End If
    
    ' Variabelenwerte aus WinCC in Array vorbereitend einlesen
    HMIRuntime.Trace "---------geschriebene Werte------------ "& vbCrLf
    For i = 0 To Anz
        dw0(i) = HMIRuntime.Tags(prefix & i).read
        HMIRuntime.Trace "Wert_" & i &" : " & dw0(i) & vbCrLf
    Next    
    
    ' Temporäres Array an Rohdaten übergeben 
        For i = 0 To anz
            arrSend(i*2)  = dw0(i)\&h100
            arrsend(i*2+1) = dw0(i) And &hff
        Next
    
    ' Bytearray via Rohdatenvariable asynchron schreiben
    HMIRuntime.Tags(strSend).Write arrSend, 0
    
    End Sub

    Die Schwierigkeit lag wohl in der Definition des Arrays. Der vorherige versuch war keins. Wenn mans so indirekt macht klappts. bleibt noch die Umwandlung von Gleitkommazahlen (123.456) in 4 bytes IEEfloat. Wenn jemand ne Idee hat, immerzu.

    Danke nochmal an Ulri
    Zitieren Zitieren Rohdaten mit Werten versorgen  

  10. #10
    Registriert seit
    18.05.2005
    Beiträge
    12
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    die folgende q&d Funktion (incl. Testumgebung für Test außerhalb von WinCC) soll Gleitkommazahlen einfacher Genauigkeit in ein 4-Byte-Array mit Motorola-Byteorder wandeln.
    Die Funktion ist allerdings kaum getestet und untestützt nur normalisierte Zahlen. Aber vielleicht hilfts ein wenig?

    Code:
    Option Explicit
    
    Const Sng = -123.456
    
    Dim arrBin : arrBin = Sng2Bin(Sng)
    Dim i, strTmp :    strTmp = "arrBin=" & vbCrLf
    
    For i=0 To 3 :    strTmp = strTmp & Hex(arrBin(i)) & " ":    Next
    MsgBox strTmp
    
    '==============================================================================
    ' IEEE 754 Single (Float32) in ein Byte-Array entspr. der internen
    ' PLC-Darstellung wandeln.
    '
    ' BEACHTE! Denormalisierte Zahlen werden (noch) nicht unterstützt.
    '
    '    Parameter:
    '        BYVAL sng        Variant mit Gleitkommazahl
    '    Rückgabe:
    '        arrBin(3)        4-Byte-Array mit binärem Image der Zahl (Motorola)
    '
    '    Hist.:
    '    31.05.06    Ri    preliminary
    '==============================================================================
    Public Function Sng2Bin (BYVAL sng) 'As Array(3)
    
        Dim i, j
        Dim sign :    sign = 0                ' Vorzeichen 
        Dim exp :    exp = 127                ' Offset für Single entspr. IEEE 754
        Dim dblFract :    dblFract = 1
        Dim arrResult :    arrResult = Array (0,0,0,0)
        
        If sng <> 0 Then
            If sng < 0 Then    sng = sng * -1 :    sign = 1
    
            ' Normalisieren
            Do While sng >= 2 :    sng = sng / 2 :    exp = exp + 1 :    Loop
            Do While sng < 1 :    sng = sng * 2 :    exp = exp -1 :    Loop
    
            If (exp And 1) = 0 Then sng = sng - 1
            arrResult(0) = sign * 128 + exp \ 2
            
            For i=1 To 3
                For j=7 To 0 Step -1
                    If sng > dblFract Then
                        arrResult(i) = arrResult(i) + 2^j
                        sng = sng - dblFract
                    End If
                    dblFract = dblFract/2
                Next
            Next
    
        End If
        
        Sng2Bin = arrResult
    End Function
    Geändert von Ulri (28.06.2006 um 19:33 Uhr)

Ähnliche Themen

  1. WinCC VB Rohdaten
    Von Raydien im Forum HMI
    Antworten: 9
    Letzter Beitrag: 15.10.2010, 10:57
  2. WinCC String als Rohdaten...
    Von Jochen Kühner im Forum HMI
    Antworten: 0
    Letzter Beitrag: 04.06.2008, 15:20
  3. WinCC Rohdaten
    Von Jochen Kühner im Forum HMI
    Antworten: 0
    Letzter Beitrag: 16.07.2007, 12:58
  4. Antworten: 1
    Letzter Beitrag: 06.05.2007, 21:19
  5. Antworten: 1
    Letzter Beitrag: 08.04.2006, 19:56

Lesezeichen

Berechtigungen

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