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

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

Thema: Libnodave Strings schreiben/lesen

  1. #1
    Registriert seit
    05.08.2009
    Beiträge
    69
    Danke
    14
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Ich versuche mit Libnodave Strings in einen Datenbaustein zu schreiben und zu lesen.
    Habe diesen Code unten gefunden.
    Wie verknüpft man das mit den DavePut, DaveWrite Befehlen?!

    Habe das natürlich schon selbst versucht, doch bei mir scheitert es an den einfachsten Dingen schon. Ich weis schon mal nicht, wie ich dieser Funktion den String aus der Textbox zukommen lasse, geschweige denn wie ich das Byte Array in den DavePut Befehl schreiben soll..


    Würde Je eine Textbox nehmen für:
    a) den zu übermittelten String (textboxWert)
    b) die Länge dieses Strings (textboxLänge)

    Den Kopf würde ich dann aus
    Byte (1) = immer 254
    Byte (2) = texboxwert.text

    verwenden...

    Komme aber nicht weiter, hoffe wer kann mir helfen...

    Übertragen an S7

    Code:
    PrivateSub Button2_Click_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    'Hier sollte dann ber Button 2 der String aus der Textbox an die S7 bertragen werden
    res = davePut32(Buffer(0), Array)
    res = daveWriteBytes(dc, daveDB, 12, 0, 254, Buffer(0))
     
    EndSub
    


    Quelle: SPS-Forum
    Code:
    PublicSharedFunction SetS7String(ByVal [String] AsString, ByVal MaxS7Length AsInteger, ByRef [Array] AsByte(), ByVal Address AsInteger) AsInteger
    If [String].Length > 254 ThenThrowNew ArgumentException("Die Lnge von Parameter '[String]' darf nicht grer als 254 sein", "[String]")
    If MaxS7Length < 0 ThenThrowNew ArgumentException("Parameter 'MaxS7Length' darf nicht kleiner als 0 sein", "MaxS7Length")
    If MaxS7Length > 254 ThenThrowNew ArgumentException("Parameter 'MaxS7Length' darf nicht grer als 254 sein", "MaxS7Length")
    Try
    If [String].Length > MaxS7Length Then
    [String] = [String].Remove(MaxS7Length - 1)
    EndIf
    'Den betreffenden Bereich erstmal initialisieren
    For i AsInteger = 0 To MaxS7Length - 1
    [Array].SetValue(CByte(0), Address + i)
    Next
    'Den String in ein ASCII-kodiertes Array wandeln
    Dim TextArray AsByte() = 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
    EndTry
    EndFunction
    
    Zitieren Zitieren Libnodave Strings schreiben/lesen  

  2. #2
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Welche programmiersprache willst du verwenden??

    VB6 oder VB.NET?

    Wenn Vb.Net, kann Ich dir vorschlagen es mit meiner LibNoDave Connection Library zu versuchen. Ich versuche da eine etwas Highlevel Library zu erstellen welche einfachere Funktionen als LibNoDave direkt bietet, und dir auch die Verbindungskonfiguration abnimmt. Dort ist auch ein einfaches VB.NET Demo enthalten!

    siehe: http://jochensserver.dyndns.org/wordpress/?page_id=55

    Zu deinem Code:
    Die Verbindung zur SPS ist schon aufgebaut?
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  3. #3
    Registriert seit
    05.08.2009
    Beiträge
    69
    Danke
    14
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo, danke für den Tipp
    Werde mir die Library bei gelegenheit anschauen!

    nur leider brauch ich zweck eines Projekts (Techniker Schule) hilfe bei dieser Anwendung. Verbindung und alles ist top, kann INT Bytes etc. alle laden. Nur Strings eben nicht.

    Verwende VB.NET

    Ist ehrlich gesagt so, dass ich mit dem Code den ich da habe nicht so klar komme. Verstehe halt nicht, wie ich den String der Textbox in meiner Form in diese Function hereinbekomme, damit die gewandelt wird. Danach müsste die ja raus kommen und mit daveput weiter benutzt werden können, aber auch da weis ich nicht wie..

    Hoffe du verstehst was ich meine?

  4. #4
    Registriert seit
    05.08.2009
    Beiträge
    69
    Danke
    14
    Erhielt 0 Danke für 0 Beiträge

    Standard

    EDIT:

    Es ist ja unsinn noch extra eine Textbox nur für die Länge des zu schreibenden bzw. lesenden Strings zu verwenden, oder? man kann doch einfach die Strings in der Box lesen lassen und dann Byte 0 und 1 automatisch erstellen lassen, oder?

    Also ich versuche es auf diese Art und weise:
    Dann geht das Prog aber in Keine Rückmeldung und stürzt ohne debugging ab...

    Code:
    
    PrivateSub Button2_Click_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim [String] AsString
    Dim MaxS7Length AsInteger
    Dim Address AsInteger
    Dim [Array] AsByte()
    [String] = TextBox5.Text
    MaxS7Length = TextBox6.Text
    Address = TextBox7.Text
     
     
    If [String].Length > 254 ThenThrowNew ArgumentException("Die Lnge von Parameter '[String]' darf nicht grer als 254 sein", "[String]")
    If MaxS7Length < 0 ThenThrowNew ArgumentException("Parameter 'MaxS7Length' darf nicht kleiner als 0 sein", "MaxS7Length")
    If MaxS7Length > 254 ThenThrowNew ArgumentException("Parameter 'MaxS7Length' darf nicht grer als 254 sein", "MaxS7Length")
     
    If [String].Length > MaxS7Length Then
    [String] = [String].Remove(MaxS7Length - 1)
    EndIf
    'Den betreffenden Bereich erstmal initialisieren
    For i AsInteger = 0 To MaxS7Length - 1
    [Array].SetValue(CByte(0), Address + i)
    Next
    'Den String in ein ASCII-kodiertes Array wandeln
    Dim TextArray AsByte() = System.Text.Encoding.ASCII.GetBytes([String])
    MsgBox("1:" & TextArray([String].Length))
    '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)
     
    res = davePut32(Buffer(0), [Array](MaxS7Length))
    res = daveWriteBytes(dc, daveDB, 400, 0, 254, Buffer(0))
     
    EndSub
    
    Geändert von Hocheck (15.06.2010 um 13:18 Uhr)

  5. #5
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Also einen String mit 254 Byte kannst du auch nicht so einfach schreiben, das musst du auf mehrere PDUs aufteilen, da in einer PDU max PDULenght -32 Bytes übertragen werden können. Dazu kommen aber noch 12 Byte pro WriteRequest!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  6. #6
    Registriert seit
    05.08.2009
    Beiträge
    69
    Danke
    14
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Oha, danke für die Info

    Also das heißt man hat die möglichkeit 34 Bytes Nutzdaten auf einmal zu "transportieren"?!

    das heißt ich muss erstmal überlegen wie ich in mehrere PDUs aufteile?!
    Geändert von Hocheck (15.06.2010 um 14:53 Uhr)

  7. #7
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    34 bytes gehen natürlich auf einmal aber nur wenn Sie nicht in zu vielen variablen sitzen. Du musst pro Variable beim schreiben 12 Bytes und beim lesen 6 Bytes dazurechnen. Kannst auch in meiner Lib schauen, da teile Ich das in mehrere PDUs auf wenn es nicht reicht....
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  8. #8
    Registriert seit
    05.08.2009
    Beiträge
    69
    Danke
    14
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Jochen für die Antwort,

    Also wie ich sehe habe ich da ein wichtiges Detail nicht beachtet...
    Ich werde mir morgen in der Schule deine Library samt programme anschauen..

    wäre super wenn jemand eine Antwort auf die Frage mit den String variablen hätte...

  9. #9
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von Hocheck Beitrag anzeigen
    Danke Jochen für die Antwort,

    Also wie ich sehe habe ich da ein wichtiges Detail nicht beachtet...
    Ich werde mir morgen in der Schule deine Library samt programme anschauen..

    wäre super wenn jemand eine Antwort auf die Frage mit den String variablen hätte...
    Also dein WriteBytes kann nicht gehen, da du über der PDU Size liegst. Versuchs mal mit writeManyBytes.

    Wie gesagt, meine Bibliothek ist keine eigenständige, Sie nutzt auch LibNoDave, abstrahiert nur einen höheren Level, d.h. der Programmierer muss sich nicht mit Kleinigkeiten wie PDU größe, maximal Variablenanzahl, usw herumärgern.
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  10. #10
    Registriert seit
    05.08.2009
    Beiträge
    69
    Danke
    14
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo jochen,

    Habe nun auf writemanybytes gewechselt. Das funktioniert bei den anderen Variablen und ich kann mehr als 20 Byte an Daten auf einmal übertragen.

    Aber einen String habe ich bisher immer noch nicht übertragen bekommen.

    was ist an dem code oben noch alles falsch?!

Ähnliche Themen

  1. Libnodave C# - WORD und STRING aus S7 lesen/schreiben
    Von dolo280 im Forum Hochsprachen - OPC
    Antworten: 10
    Letzter Beitrag: 13.01.2011, 12:04
  2. Merkerwörter mit C# und Libnodave aus SPS lesen und schreiben
    Von Red-Sh4nks im Forum Hochsprachen - OPC
    Antworten: 14
    Letzter Beitrag: 04.06.2010, 15:10
  3. LibNoDave-Komponente DATE_AND_TIME lesen/schreiben
    Von marcengbarth im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 28.10.2009, 17:16
  4. Libnodave in SPS schreiben, ganze DB's lesen
    Von AirKlaus im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 17.05.2009, 23:06
  5. Libnodave Daten lesen/schreiben
    Von Acidic im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 02.06.2008, 08:32

Lesezeichen

Berechtigungen

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