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

Ergebnis 1 bis 10 von 10

Thema: [Libnodave] String ind SPS schreiben...

  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 leute,
    ich habe da ein kleines Problem!

    Ich versuche einen String von 5 Zeichen in die SPS in einen DB zu schreiben!
    das ganze soll über libnodave und TCP/IP gehen!

    verbindung bekomme ich einwandfrei hin, aber nicht das schreiben!

    Kann mir jemand irgendwie ne Funktion zukommen lassen die einen string an eine bestimmte adresse schreibt.
    Mein Programm wird mit VB.net 2008 erstellt!

    Danke im Voraus!
    Zitieren Zitieren [Libnodave] String ind SPS schreiben...  

  2. #2
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.224
    Danke
    630
    Erhielt 955 Danke für 769 Beiträge

    Standard

    Einen String oder einen S7-String?
    Beim S7-String berücksichtigen, dass wenn dieser 5 Bytes lang ist, 7 Bytes geschrieben werden müssen. Und zwar befindet sich im ersten Byte die Maximallänge und im zweiten Byte die Aktuallänge. Bei Schreiben muss natürlich speziell das erste Byte zuvor gelesen (wenn nicht fix und bekannt) und das zweite Byte unter dessen Berücksichtigung angepasst werden.
    Rainer Hönle
    DELTA LOGIC GmbH

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  3. #3
    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

    naja ich habe in meinem Vb einen normalen string und der muss in einen S7 String geschreiben werden!

  4. #4
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.224
    Danke
    630
    Erhielt 955 Danke für 769 Beiträge

    Standard

    Da fehlen dann sicher die ersten beiden Bytes bzw. du schreibst an die Adresse der Längeninformationen.
    Rainer Hönle
    DELTA LOGIC GmbH

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  5. #5
    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

    hmmm momentan schreibe ich noch nichts!
    Ich weis net mit welcher funktion ich das machen soll!

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Ich würde die Bytes schreiben. Funktion wäre daveWriteBytes. Im Prinzip ist es doch egal ob man Strings, Int, Dint, Real schreibt, es sind immer einige Bytes, die halt zusammen einen bestimmten Wert ergeben. Bei String sind es 2 Byte Kopf und dann die Charcodes der einzelnen Zeichen.

    Hier noch aus Zottels Hilfe:

    daveWriteBytes
    Write a sequence of bytes from a buffer to PLC memory.

    int daveWriteBytes(daveConnection * dc, int area, int DB, int start, int len, void * buffer);

    Parameters:
    # dc: A pointer to a daveConnection structure representing an established connection.
    # area: A constant that specifies a memory area in the PLC.
    # DB: The number of a data block. Only meaningful if area is daveDB. Use 0 oterwise.
    # start: The address of the first byte in the block.
    # len: The number of bytes to read.
    # buffer: A pointer to some memory space where you want the result to be copied too.
    Hints:
    len:
    Note that timer, counters and the analog input/output words of the 200 family are allways words (2 bytes). To read n of them, you have to specify 2xn bytes as len.
    buffer:
    You may call daveWriteBytes() without a buffer specifying NULL (C) or nil (Pascal). There is, however, an internal buffer that is part of the daveConnection structure. This internal buffer allways holds the result from the last read operation.
    Maximum length:
    The maximum size of a block in S7-Communication is limited by the size of a message structure calledPDU. Each call to daveReadBytes causes a the exchange of a request and a response PDU. The result data must fit into the "payload" area of a response PDU. This means a maximum block length is PDU size -18 bytes for read. A typical PDU size is 240 Byte, limiting read calls to 222 byte result length. If you need more data, you need to use multiple calls to daveReadBytes().
    Efficiency:
    Each call to daveWriteBytes() causes a the exchange of a request and a response PDU together with prefixes, ackknowledges and what else the transport layer requires. Therefore you should try to write as much as possible in a single call. Example:

    daveWriteBytes(dc, daveDB, 5, 68, 14, appBuffer);

    writes DBD68 and DBD78 and everything in between from the range appBuffer+4 to appBuffer+9 with 6 unwanted bytes, but it is much faster than:

    daveWriteBytes(dc, daveDB, 5, 68, 4, appBuffer);
    daveWriteBytes(dc, daveDB, 5, 78, 4, appBuffer+4);
    Also einen passenden Buffer anlegen, den Kopf und die einzelnen Zeichen in den Buffer (Array) kopieren und dann schreiben, fertig.
    Geändert von Ralle (04.06.2009 um 14:17 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

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

    Standard

    ...die einen String in ein S7-kompatibles ByteArray wandelt. Brauchst Du nur noch an die entsprechende Stelle in Deinen SendeBuffer kopieren.

    Code:
    Public Shared Function StringToS7String(ByVal Wert As String, ByVal MaxS7Length As Integer) As Byte()
    If Wert.Length > MaxS7Length Then Throw New ArgumentException("Die Lnge von Parameter 'Wert' darf nicht grer als Parameter 'MaxS7Length' sein", "Wert, MaxS7Length")
    If Wert.Length > 254 Then Throw New ArgumentException("Die Lnge von Parameter 'Wert' darf nicht grer als 254 sein", "Wert")
    If MaxS7Length < 0 Then Throw New ArgumentException("Parameter 'MaxS7Lenght' darf nicht kleiner als 0 sein", "MaxS7Length")
    If MaxS7Length > 254 Then Throw New ArgumentException("Parameter 'MaxS7Lenght' darf nicht grer als 254 sein", "MaxS7Length")
    Try
    Dim b(MaxS7Length + 1) As Byte
    Dim text As Byte() = System.Text.Encoding.ASCII.GetBytes(Wert)
    b(0) = CType(MaxS7Length, Byte)
    b(1) = CType(Wert.Length, Byte)
    System.Array.Copy(text, 0, b, 2, text.Length)
    Return b
    Catch ex As Exception
    Return Nothing
    End Try
    End Function
    
    Viele Grüße, Manni
    Wenn die Klügeren immer nachgeben, geschieht nur das, was die Dummen wollen
    Zitieren Zitieren Hier eine .NET-Funtion....  

  8. #8
    Registriert seit
    11.06.2004
    Beiträge
    100
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo

    evt kann mir jemand erklären wie man mit libnodave einzelne Bits in einen S7 DB schreiben kann
    z.b. Db100.dbx0.0 mit 1 oder 0 beschreiben

    lesen bekomme ich hin
    verbindung von pc (excel) zur S7 über TCP/IP aufbauen
    daten aus DB lesen und in Excel zellen schreiben alles kein Problem


    nur umgekehrt geht es einfach nicht.

    also mit einem butten in excel das bit db100.dbx0.0 mit 0 oder 1 zu schreiben

    Gruss uz
    Zitieren Zitieren Einzelne Bits in S7 Db screiben  

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

    Standard

    Als Ergänzung hier nochmal 2 .NET-Funktionen:

    S7-String schreiben:
    Code:
    ''' <summary>
    ''' Konvertiert einen String in das S7-Stringformat und kopiert ihn in ein Bytearray
    ''' </summary>
    ''' <param name="String">Der zu konvertierende String</param>
    ''' <param name="MaxS7Length">Die maximale Lnge des Strings in der S7</param>
    ''' <param name="Array">Das Array in das der konvertierte String kopiert werden soll</param>
    ''' <param name="Address">Die Startadresse, ab der der konvertierte Wert in das Bytearray kopiert werden soll</param>
    ''' <returns>0 wenn ok, -1 wenn Fehler</returns>
    ''' <remarks></remarks>
    Public Shared Function SetS7String(ByVal [String] As String, ByVal MaxS7Length As Integer, ByRef [Array] As Byte(), ByVal Address As Integer) As Integer
    If [String].Length > 254 Then Throw New ArgumentException("Die Lnge von Parameter '[String]' darf nicht grer als 254 sein", "[String]")
    If MaxS7Length < 0 Then Throw New ArgumentException("Parameter 'MaxS7Length' darf nicht kleiner als 0 sein", "MaxS7Length")
    If MaxS7Length > 254 Then Throw New ArgumentException("Parameter 'MaxS7Length' darf nicht grer als 254 sein", "MaxS7Length")
    Try
    If [String].Length > MaxS7Length Then
    [String] = [String].Remove(MaxS7Length - 1)
    End If
    'Den betreffenden Bereich erstmal initialisieren
    For i As Integer = 0 To MaxS7Length - 1
    [Array].SetValue(CByte(0), Address + i)
    Next
    'Den String in ein ASCII-kodiertes Array wandeln
    Dim TextArray As Byte() = System.Text.Encoding.ASCII.GetBytes([String])
    'Setzen der maximalen Lnge
    [Array](Address) = CType(MaxS7Length, Byte)
    'Setzen der tatschlichen Lnge
    [Array](Address + 1) = CType([String].Length, Byte)
    'Den Text in das ByteArray kopieren
    System.Array.Copy(TextArray, 0, [Array], Address + 2, TextArray.Length)
    Return 0
    Catch ex As Exception
    Return -1
    End Try
    End Function
    
    S7-String lesen:
    Code:
    ''' <summary>
    ''' Konvertiert aus einem Bytearray einen S7-String in einen String
    ''' </summary>
    ''' <param name="Array">Das Array, von dem der String konvertiert werden soll</param>
    ''' <param name="Address">Die Startadresse, ab der der String konvertiert werden soll</param>
    ''' <returns>Bei Erfolg der konvertierte String, sonst Nothing</returns>
    ''' <remarks></remarks>
    Public Shared Function GetS7String(ByVal Array As Byte(), ByVal Address As Integer) As String
    If Address < 0 Then Throw New ArgumentException("Parameter 'Address' darf nicht kleiner als 0 sein", "Address")
    If Address > Array.Length Then Throw New ArgumentException("Parameter 'Address' darf nicht grer sein als die Lnge des Arrays", "Address")
    Try
    Dim AktLnge As Integer = Array(Address + 1)
    Return System.Text.Encoding.ASCII.GetString(Array, Address + 2, AktLnge)
    Catch ex As Exception
    Return Nothing
    End Try
    End Function
    
    VG, Manni
    Wenn die Klügeren immer nachgeben, geschieht nur das, was die Dummen wollen
    Zitieren Zitieren Neue VB.NET-String-Funktionen  

  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
    Hier noch VB.NET Funktionen für Bit-Operationen:
    Code:
    ''' <summary>
    ''' Setzt ein Bit in einem Byte
    ''' </summary>
    ''' <param name="Byte">Das Byte welches bearbeitet wird</param>
    ''' <param name="BitNr">Die Nummer des Bit's (0-7)</param>
    ''' <returns>0 wenn ok, sonst -1</returns>
    ''' <remarks></remarks>
    Public Shared Function SetBit(ByRef [Byte] As Byte, ByVal BitNr As Integer) As Integer
    If BitNr > 7 Then Return -1
    [Byte] = [Byte] Or CByte(&H1 << BitNr)
    Return 0
    End Function
    ''' <summary>
    ''' Rcksetzt ein Bit in einem Byte
    ''' </summary>
    ''' <param name="Byte">Das Byte welches bearbeitet wird</param>
    ''' <param name="BitNr">Die Nummer des Bit's (0-7)</param>
    ''' <returns>0 wenn ok, sonst -1</returns>
    ''' <remarks></remarks>
    Public Shared Function ResetBit(ByRef [Byte] As Byte, ByVal BitNr As Integer) As Integer
    If BitNr > 7 Then Return -1
    [Byte] = [Byte] And CByte(&HFF Xor (&H1 << BitNr))
    Return 0
    End Function
    ''' <summary>
    ''' Fragt ein Bit in einem Byte ab
    ''' </summary>
    ''' <param name="Byte">Das Byte welches bearbeitet wird</param>
    ''' <param name="BitNr">Die Nummer des Bit's (0-7)</param>
    ''' <returns>Zustand des Bit's wenn ok, sonst -1</returns>
    ''' <remarks></remarks>
    Public Shared Function GetBit(ByRef [Byte] As Byte, ByVal BitNr As Integer) As Integer
    If BitNr > 7 Then Return -1
    Return CInt((([Byte] And &H1 << BitNr) >> BitNr) And &H1)
    End Function
    VG, Manni
    Wenn die Klügeren immer nachgeben, geschieht nur das, was die Dummen wollen
    Zitieren Zitieren Funktionen zum Setzen/Rücksetzen von Bits  

Ähnliche Themen

  1. Mit Applicom String in S7 schreiben
    Von reini69 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 17.10.2011, 23:57
  2. Libnodave C# - WORD und STRING aus S7 lesen/schreiben
    Von dolo280 im Forum Hochsprachen - OPC
    Antworten: 10
    Letzter Beitrag: 13.01.2011, 12:04
  3. Konstante String in Variable String schreiben
    Von sailor im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 07.12.2009, 18:01
  4. String in Datenbaustein schreiben (S7)
    Von erwin36 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 30.11.2009, 16:53
  5. Texte aus SPS als string schreiben
    Von nonguru im Forum HMI
    Antworten: 5
    Letzter Beitrag: 03.02.2008, 22:08

Lesezeichen

Berechtigungen

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