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

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

Thema: LibNoDave Strings auslesen (VB.net)

  1. #1
    Registriert seit
    13.05.2013
    Beiträge
    81
    Danke
    29
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich versuche nun schon seit einiger zeit, aus meiner test sps eine string variable (32 Byte Länge) mittels libnodave (VB-Version) auszulesen.
    (Real, Int etc. lesen/schreiben funktioniert problemlos) nur leider komme ich nicht darauf, wie es bei strings funktioniert

    sonst habe ich das Lesen immer so gemacht: (DB: 70, Startadresse:0, Länge: 32 Bytes)
    res = dc.readManyBytes(libnodave.daveDB, 70, 0, 32, buf)
    textbox.text = dc.getU32

    wobei es klar ist, dass es hier mit 'getU32' wohl kaum funktionieren kann, nur leider habe ich auch keinen passenden befehl für diesen fall gefunden...
    es werden nur irgendwelche zahlen angezeigt, bzw. habe ich gelesen, dass ich die ersten beiden Bytes sowieso 'abziehen' muss, da hier nur die längeninfo und so drinnen steht...aber nur die startadresse um 2 bytes zu erhöhen hilft wohl nicht wirklich..

    falls ich irgendwas zu undeutlich beschrieben habe, bitte ich um entschuldigung (bin noch blutiger anfänger beim programmieren).

    vielen Dank im Voraus
    Zitieren Zitieren LibNoDave Strings auslesen (VB.net)  

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

    Standard

    Hallo!
    Die Stringvariable mit 32Byte enthält im ersten Byte die Stinglänge und im zweiten Byte die länge des eingetragenen Textes. Danach folgend die ASCII-Codes der Buchstaben aus denen der Text besteht. Variablentabelle-->Anzeigeformat Zeichen/Dez.
    Der Beispieltext "Test" würde so im DB eingetragen (Dezimal): 20 4 84 101 115 116 wobei die zweite Zahl(4) selbst eingetragen werden muss.

    Somit: textbox.text+=chr(dc.getu für jedes einzelne Byte ab Byte 2

    Gruß

  3. Folgender Benutzer sagt Danke zu wolfi_by für den nützlichen Beitrag:

    Jennsy (14.05.2013)

  4. #3
    Jennsy ist offline Benutzer
    Themenstarter
    Registriert seit
    13.05.2013
    Beiträge
    81
    Danke
    29
    Erhielt 1 Danke für 1 Beitrag

    Standard

    So, das hat natürlich wunderbar geklappt, dankeschön wolfi_by!

    Nur leider stecke ich nun beim Schreiben des Strings
    Ich habe gelesen, dass es hilfreich sein könnte eine Funktion wie 'stringToByteArray' zu erstellen/verwenden, jedoch scheitere ich hier immer, da diese Funktionen, die ich mir aus diversen Internetseiten zusammengesucht habe, (habe wirklich schon einige durchprobiert ) irgendwie damit enden, dass sich mein Programm aufhängt und nichts mehr funktioniert

    Für REAL, bzw. auszudrehende Bytes bei INT verwende ich den BitConverter, nur leider habe ich auch hier nichts gefunden, dass ich irgendwie für einen String verwenden könnte...
    würde mich sehr über eine Antwort freuen

    vielen Dank im Voraus schon mal

  5. #4
    Registriert seit
    21.10.2010
    Beiträge
    158
    Danke
    21
    Erhielt 29 Danke für 17 Beiträge

    Standard

    Ich hab das jetzt noch nie gemacht oder gebraucht, aber ich würde 'getU8' verwenden ind die einzelnen Bytes bzw. Chars dann zusammensetzen.


    Edit: Sorry, hab gerade gesehen, dass schon ein zweiter Thread mit Antworten existiert.
    Geändert von funkey (14.05.2013 um 07:38 Uhr)

  6. Folgender Benutzer sagt Danke zu funkey für den nützlichen Beitrag:

    Jennsy (14.05.2013)

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

    Standard

    Hallo!
    Beim String schreiben einfach umgedreht:
    teststring="abcde"
    dim chararray() as char=teststring.tochararray
    dim laenge as integer=chararry.lenth

    Dann ein array aus bytes anlegen, zuerst die gesammtlänge(byte 0), dann die Stringlänge (byte 1) und dann alle elemente aus chararray in byte umwandeln(=asc(chararray(i)) und dann mit writebytes senden. Habs selber allerdings noch nicht probiert.

    Gruß

  8. Folgender Benutzer sagt Danke zu wolfi_by für den nützlichen Beitrag:

    Jennsy (16.05.2013)

  9. #6
    Jennsy ist offline Benutzer
    Themenstarter
    Registriert seit
    13.05.2013
    Beiträge
    81
    Danke
    29
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    Ich habe mit etwas Herumprobieren jetzt auch noch eine andere Lösung gefunden (und schon ausprobiert), falls jemand einmal dasselbe Problem haben sollte:

    Dim Text(0) As Byte
    Text = System.Text.Encoding.Default.GetBytes(TextBox.Text)
    res = dc.writeBytes(libnodave.daveDB, DB_Nr, Startadresse, Länge, Text)

  10. #7
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Jennsy Beitrag anzeigen
    Hallo,

    Ich habe mit etwas Herumprobieren jetzt auch noch eine andere Lösung gefunden (und schon ausprobiert), falls jemand einmal dasselbe Problem haben sollte:

    Dim Text(0) As Byte
    Text = System.Text.Encoding.Default.GetBytes(TextBox.Text)
    res = dc.writeBytes(libnodave.daveDB, DB_Nr, Startadresse, Länge, Text)
    Ich glaube nicht, daß das eine "Lösung" ist, auch wenn es (scheinbar?) funktioniert:
    - Du aktualisierst nicht das Byte, was die tatsächliche Länge angibt.
    - Du respektierst nicht den zur Verfügung stehenden Platz.
    Nimm den Fall, das im Speicher steht: 20 4 'k' 'u' 'r' 'z'
    Nun schreibst du
    Text = System.Text.Encoding.Default.GetBytes('länger")
    res = dc.writeBytes(libnodave.daveDB, DB_Nr, Startadresse, Länge (4?, 6?, 7?), 'länger') // hast du die Länge bestimmt? sind Strings in VB 0-terminiert?
    Jetzt steht im Speicher: 20 4 'l' 'ä' 'n' 'g' ? ? ?
    oder
    Jetzt steht im Speicher: 20 4 'l' 'ä' 'n' 'g' 'e' 'r'
    oder
    Jetzt steht im Speicher: 20 4 'l' 'ä' 'n' 'g' 'e' 'r' 0
    Aber für die Stringfunktionen der SPS ist das alles 'läng'
    Nun kommt Hans Hacker und gibt in die Textbox 'einen viel zu langen sinnlosen Text ein'.
    Du schreibst ihn in deinen DB und überschreibst damit die auf den String folgenden Bytes. Da stand sonst die maximale Drehzahl deiner Ultrazentrifuge...

  11. #8
    Jennsy ist offline Benutzer
    Themenstarter
    Registriert seit
    13.05.2013
    Beiträge
    81
    Danke
    29
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo Zottel,
    Danke für deine Anmerkungen, jedoch verstehe ich leider nicht ganz, was du damit meinst?
    als 'Länge' gebe ich die Länge des zu schreibenden/lesenden Strings in Byte an...und diese ist ja unabhängig davon, was eingegeben wird, gleich lang...und als Startadresse gebe ich den tatsächlichen Startwert +2 an, so wie eben beim Lesen auch...in meinem Fall handelt es sich um einen 32 Byte langen String-Wert, also STRING[30]...und ich kann sowohl 30 Zeichen lesen, als auch schreiben,
    deshalb is mir leider auch nicht aufgefallen, dass meine 'Lösung' wohl doch nicht ganz richtig ist...werde mir das in dem Fall nochmal anschauen müssen

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

    Standard

    Hallo Jennsy!
    Das Problem ist, dass der zu schreibende String auf dessen länge überprüft werden muss bevor er geschrieben wird. Diese könnte ja auch 40 Zeichen lang sein. Wenn Du nun 40 Zeichen überträgst, werden die folgenden Datenfelder im DB überschrieben, da hier in der SPS keine Überprüfung stattfindet.
    Beispiel:
    dbb0 [32]: zu speichernder String
    dbw32: maximale Drehzahl Ultrazentrifuge (INT)
    dbw34: irgendeinwert1 (INT)
    dbw36: irgendeinwert2 (INT)
    dbd38: noch en Wert (DWORD)

    Würde hier nun ein String geschrieben werden, welche 40 Zeichen hat würden auch die Einträge irgendeinwert1,2 und ein Teil von noch ein Wert überschrieben werden.
    Somit muss vor dem Schreiben des String im VB-Programm die Länge bestimmt und gegebenenfalls auf die maximale Länge von 30 gekürzt werden.
    Zusätzlich muss in das Byte1 im String die tatsächliche Länge eingetragen werden, im maximalfall der wert welcher im Byte0 steht.

  13. #10
    Jennsy ist offline Benutzer
    Themenstarter
    Registriert seit
    13.05.2013
    Beiträge
    81
    Danke
    29
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo wolfi_by,
    Danke für die Erklärung.
    Auch wenn ich es mir damit vielleicht etwas zu einfach mache...ich habe die maximale Eingabelänge im Textfeld selbst begrenzt, so stelle ich sicher, dass niemand mehr als 30 Zeichen eingeben kann.

Ähnliche Themen

  1. Libnodave Strings schreiben/lesen
    Von Hocheck im Forum Hochsprachen - OPC
    Antworten: 14
    Letzter Beitrag: 04.12.2017, 15:09
  2. Libnodave Strings auslesen (VB.net)
    Von Jennsy im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 13.05.2013, 15:52
  3. Antworten: 0
    Letzter Beitrag: 12.05.2011, 13:58
  4. ÄÖnderungen am libnodave.net.cs File von libnodave
    Von Jochen Kühner im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 12.05.2010, 16:56
  5. LibNoDave unter VB.Net ohne libnodave.net.dll
    Von Earny im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 09.03.2010, 18:57

Stichworte

Lesezeichen

Berechtigungen

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