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

Ergebnis 1 bis 10 von 10

Thema: S7 Datum von VB.NET nach SPS...

  1. #1
    Registriert seit
    11.03.2009
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ich habe wiedermal ein Problem mit meinen libnodave Funktionen.

    Nach dem erfolgreichen schreiben von strings in die SPS muss ich nun ein datum in die SPS schreiben.

    Dazu habe ich mir mit der Funktion DateDiff die Tage zwischen dem zu schreibenden Datum un 1.1.1990 berechnen lassen und versucht damit zu schreiben:!

    Code:
    Public Function SetVal(ByVal nDBnumber As Integer, ByVal Datetype As String, _
                               ByVal nStart As Integer, ByVal nVal2Write As String) As Boolean
    
            Dim res As Integer
            Dim buf(1000) As Byte
            Dim nArea As Integer
            Dim temp As Integer
            Dim sValue As String
            Dim test() As Integer
            Dim nBytes2Write As Integer
            Dim datum As UShort
    
    
            If (nDBnumber >= 0) Then     ' Wenn der Wert aus der combobox >= 0 ist suche nach dem DB!
    
                nArea = libnodave.daveDB
            Else
                Return True 'Ansonsten gebe den Wert "nUll" Wieder!
            End If
    
    
            'Try
            If Not _CONNECTEION_STATUS_OK Then
                MsgBox("keine Verbindung")
                Exit Function
            End If
    
            Select Case Datetype
                Case "Byte"
                    nBytes2Write = 1
                    temp = CByte(nVal2Write) 'CShort(nVal2Write)
                    buf = GetBytes(temp)
                Case "Integer"
                    nBytes2Write = 2
                    temp = libnodave.daveSwapIed_16(CInt(nVal2Write)) 'CShort(nVal2Write)
                    buf = GetBytes(temp)
                Case "Float"
                    nBytes2Write = 4
                    temp = libnodave.daveToPLCfloat(CSng(nVal2Write))
                    buf = GetBytes(temp)
                Case "String"
                    nBytes2Write = 8
                    buf = stringToByteArray(nVal2Write)
                Case "Longint"
                    nBytes2Write = 8
                    temp = CInt(nVal2Write)
                    buf = GetBytes(temp)
                Case "Date"
                    nBytes2Write = 2
                    datum = CUShort(nVal2Write)
                    buf = GetBytes(datum)
    
                Case "Bit"
    
                    Return Nothing
                Case Else
                    Return Nothing
            End Select
    
            res = dc.writeBytes(nArea, nDBnumber, nStart, nBytes2Write, buf)
            If res = 0 Then
                Return True
            Else
                Return False
            End If
    
        End Function
    Das zu schreibende datum ist der 1.1.2000 und geschreiben wird der 13.09.2034

    Ich weis net woran das liegt!
    Hoffe von euch kann mir jemand helfen!

    Vielen Dank im voraus!
    Zitieren Zitieren S7 Datum von VB.NET nach SPS...  

  2. #2
    Registriert seit
    01.03.2007
    Beiträge
    262
    Danke
    26
    Erhielt 33 Danke für 28 Beiträge

    Standard

    Hast du vielleicht auch noch den Auruf der Funktion und wo soll das auf die SPS geschrieben werden?

    Ein Bytedreher ist es auf jeden Fall schonmal nicht.
    Hast du schonmal mit dem Debugger geschaut, ob DateDiff 3652 oder 16323 herausgibt?
    Den Bereich, in der das Datum geschrieben wird vor dem Funktionsaufruf (Haltepunkt setzen) mal mit Nullen überschrieben und dann geschaut, ob das dann nach dem Funktionsaufruf drinnen steht oder vielleicht wo anders?

  3. #3
    Registriert seit
    03.10.2005
    Beiträge
    160
    Danke
    17
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Hallo,
    warum schreibst du das Datum nicht direkt in die SPS?? Also Datentyp Date_And_Time ??
    Falls es in der SPS ein Date ist könnte es möglicherweise doch ein Bytedreher sein?!

    Gruß Ronnie
    Geändert von ronnie.b (05.06.2009 um 21:33 Uhr) Grund: was vergessen

  4. #4
    Registriert seit
    01.03.2007
    Beiträge
    262
    Danke
    26
    Erhielt 33 Danke für 28 Beiträge

    Standard

    01.01.2000 = 0x0E44 = 3652
    13.09.2034 = 0x3FC6 = 16326
    08.06.2159 = 0xF1BC = -3652

    Wird IMHO kein Byte-Dreher sein und falschherum gerechnet wahrscheinlich auch nicht!

  5. #5
    Registriert seit
    03.10.2005
    Beiträge
    160
    Danke
    17
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Na das stimmt natürlich

  6. #6
    paddy_cmd ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.03.2009
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Also meine Funktion

    _date = DateDiff(DateInterval.Day, #1/1/1990#, CDate(Format(CDate(binReader.ReadString), "dd/MM/yyyy")))

    liefert mir 3652 für datum 1.1.2000

    und aufgerufen wird das ganze hiermit:

    com.SetVal(cas.DBOffset + index, "Date", 62, CStr(_date))

    cas.DBoffset= 2102
    index = 0
    Date ist bytes to write=2
    62 ist die adresse
    _date der wert = 3652

  7. #7
    Registriert seit
    01.03.2007
    Beiträge
    262
    Danke
    26
    Erhielt 33 Danke für 28 Beiträge

    Standard

    Und wo willst du das in der SPS genau hinschreiben?

  8. #8
    paddy_cmd ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.03.2009
    Beiträge
    16
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich möchte das in das Word 62 in den DB 2102 das vom typ DAte ist !

  9. #9
    Registriert seit
    01.03.2007
    Beiträge
    262
    Danke
    26
    Erhielt 33 Danke für 28 Beiträge

    Standard

    Also so aus dem Bauch heraus würde ich mal sagen, dass du das auf die richtige Adresse schreibst.

    Und jetzt nimmst du am besten mal deinen Debugger zur Hand:

    Code:
    Public Function SetVal(ByVal nDBnumber As Integer, ByVal Datetype As String, _
                               ByVal nStart As Integer, ByVal nVal2Write As String) As Boolean
    
            Dim res As Integer
            Dim buf(1000) As Byte
            Dim nArea As Integer
            Dim temp As Integer
            Dim sValue As String
            Dim test() As Integer
            Dim nBytes2Write As Integer
            Dim datum As UShort
    
    
            If (nDBnumber >= 0) Then     ' Wenn der Wert aus der combobox >= 0 ist suche nach dem DB!
    
                nArea = libnodave.daveDB
            Else
                Return True 'Ansonsten gebe den Wert "nUll" Wieder!
            End If
    
    
            'Try
            If Not _CONNECTEION_STATUS_OK Then
                MsgBox("keine Verbindung")
                Exit Function
            End If
    
            Select Case Datetype
                Case "Byte"
                    nBytes2Write = 1
                    temp = CByte(nVal2Write) 'CShort(nVal2Write)
                    buf = GetBytes(temp)
                Case "Integer"
                    nBytes2Write = 2
                    temp = libnodave.daveSwapIed_16(CInt(nVal2Write)) 'CShort(nVal2Write)
                    buf = GetBytes(temp)
                Case "Float"
                    nBytes2Write = 4
                    temp = libnodave.daveToPLCfloat(CSng(nVal2Write))
                    buf = GetBytes(temp)
                Case "String"
                    nBytes2Write = 8
                    buf = stringToByteArray(nVal2Write)
                Case "Longint"
                    nBytes2Write = 8
                    temp = CInt(nVal2Write)
                    buf = GetBytes(temp)
                Case "Date"
                    nBytes2Write = 2
                    datum = CUShort(nVal2Write) //in dieser Zeile den Haltepunkt setzen schauen, was in nVal2Write steht, Einzelschritt vor
                    buf = GetBytes(datum) // dann stehst du hier und schaust mal, was in Datum drinsteht, Einzelschritt vor und dann schaust du was in deinem buf drinsteht!
    
                Case "Bit" 
    
                    Return Nothing
                Case Else
                    Return Nothing
            End Select
    
            res = dc.writeBytes(nArea, nDBnumber, nStart, nBytes2Write, buf)
            If res = 0 Then
                Return True
            Else
                Return False
            End If
    
        End Function
    Und wenn du das so machst siehst du was für Werte wo stehen und dann müsstest du auch sehen was da schiefläuft!

  10. #10
    Registriert seit
    20.05.2009
    Beiträge
    32
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Code:
    Public Shared Function DateTimeToS7DateTime(ByVal DatumUhrzeit As Date) As Byte()
    ' Kleinste Zeitauflsung 1 Sekunde
    ' kleinere Auflsung bisher noch nicht programmiert
    Try
    Dim Bytefeld(7) As Byte
    Dim AndMask As Integer = &HFF
    With DatumUhrzeit
    Bytefeld(0) = CType(IntegerToS7BCD(.Year) And AndMask, Byte)
    Bytefeld(1) = CType(IntegerToS7BCD(.Month), Byte)
    Bytefeld(2) = CType(IntegerToS7BCD(.Day), Byte)
    Bytefeld(3) = CType(IntegerToS7BCD(.Hour), Byte)
    Bytefeld(4) = CType(IntegerToS7BCD(.Minute), Byte)
    Bytefeld(5) = CType(IntegerToS7BCD(.Second), Byte)
    End With
    Return Bytefeld
    Catch ex As Exception
    ReturnNothing
    EndTry
    EndFunction
    
    Public Shared Function IntegerToS7BCD(ByVal Wert AsInteger) As Integer
    Try
    Dim s As String = Wert.ToString
    Dim FeldIndex As Integer = s.Length - 1
    Dim c(FeldIndex) As Char
    Dim d(FeldIndex) As Integer
    s.CopyTo(0, c, 0, s.Length)
    Array.Reverse(c)
    For i AsInteger = 0 To FeldIndex
    d(i) = Val(c(i))
    IntegerToS7BCD = IntegerToS7BCD Or (d(i) << i * 4)
    Next
    Catch ex As Exception
    ReturnNothing
    EndTry
    EndFunction
    
    Hatte ich mir mal für VB.NET geschrieben.

    VG, Manni
    Wenn die Klügeren immer nachgeben, geschieht nur das, was die Dummen wollen
    Zitieren Zitieren Du kannst es auch mal damit versuchen:  

Ähnliche Themen

  1. Format Datum C# nach MySQL
    Von alexa3 im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 21.01.2011, 16:16
  2. Schaltuhr nach Datum
    Von Andy258 im Forum Simatic
    Antworten: 19
    Letzter Beitrag: 19.10.2010, 13:01
  3. S7 Datum auflösen nach Monat Tag
    Von Guste im Forum Programmierstrategien
    Antworten: 7
    Letzter Beitrag: 03.11.2007, 00:25
  4. Antworten: 2
    Letzter Beitrag: 04.12.2006, 09:11
  5. Antworten: 2
    Letzter Beitrag: 12.01.2005, 13:26

Lesezeichen

Berechtigungen

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