Wert in einer Textbox per Buttonklick mit libnodave an SPS senden (VB.net 2008 E.E.)

poppycock

Level-1
Beiträge
253
Reaktionspunkte
21
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

nun klappt es schon prima mit dem Setzen der einzelnen Bits via "writeBits" unter Verwendung von libnodave.
Allerdings will ich nun einen Integerwert an die SPS schicken.
Bei libnodave müsste ich dafür "writeBytes" verwenden, aber darum geht es mir noch nicht.

Also:
Ich habe Textboxen, die ich mit einem Wert (Zahlen) füllen kann.
Wenn ich auf den dazugehörigen Button klicke, soll dieser Wert an die SPS geschickt werden.
Soweit wird das garantiert kein Problem sein, nur ich weiß nicht, wie ich den Inhalt der Textbox in eine Variable bekomme, die ich per "writeBytes" verschicken kann.
Habe schon so einiges probiert, aber bin immer wieder gescheitert.

Hat jemand ein kleines Beispiel dafür? Ich benutze VB.net 2008 Express Edition.

Anbei ein Bild. Die weißen Textfelder können mit Zahlen gefüllt werden, die grau hinterlegten Textfelder zeigen den aktuellen Wert an, der im DB in der SPS hinterlegt ist.

Vielen Dank schonmal,
poppycock
 

Anhänge

  • textbox.jpg
    textbox.jpg
    6,6 KB · Aufrufe: 43
dim var1 as integer(oder as double wenn du kommastellen brauchst)
textbox1.text = var1
und weiter mit writebytes

hoffe ich hab dich richtig verstanden und konnte dir helfen...


greetz m3nd|
 
Zuviel Werbung?
-> Hier kostenlos registrieren
dim var1 as integer(oder as double wenn du kommastellen brauchst)
textbox1.text = var1
und weiter mit writebytes

Danke, du hast mich richtig verstanden!
Jetzt hab ich aber ein Problem, denn ich bekomme nun folgende Fehlermeldung:
Der Wert vom Typ "Integer" kann nicht in "1-dimensionales Array von Byte" konvertiert werden.

Code:
Dim Tmax As Integer
[...]
TextBox6.Text = Tmax
dc.writeBytes(libnodave.daveDB, 50, 96, 2, Tmax)
Ich will den Inhalt der TextBox6 in den DB50 ab Adresse +12.0 (zwei Byte, also ein Integer) schreiben.
Der DB ist natürlich schon vorbereitet!

Wie wandle ich den Integerwert nach zwei Byte um?
Macht das libnodave nicht automatisch?
Oder verstehe ich die Fehlermeldung falsch?

Gruß,
poppycock
 
Code:
Dim Tmax As Integer
[...]
TextBox6.Text = Tmax
dc.writeBytes(libnodave.daveDB, 50, 96, 2, Tmax)

bin mir jetz nich sicher aber ich behaupte mal das liegt an deiner syntax.
haste ma

Tmax = dc.writeBytes(libnodave.daveDB, 50, 96, 2)

probiert?
 
Code:
Tmax = dc.writeBytes(libnodave.daveDB, 50, 96, 2)

Wenn ich das so mache, bekomme ich folgendes:
Für den Parameter "buffer" von "Public Function writeBytes(area As Integer, DBnumber As Integer, start As Integer, len As Integer, buffer() As Byte) As Integer" wurde kein Argument angegeben.

D.h. ich muss Tmax mit in writeBytes nehmen, da ein Byte erwartet wird.
Daran lag es leider nicht.

Die Syntax sollte korrekt sein, da ich bereits Bits in der SPS setzen kann!
Aber ein Integer bekomme ich partout nicht in die SPS...

Bin ich der Einzige, der dieses Problem hat?
 
Danke,

aber irgendwas haut noch immer nicht hin. Ich habs jetzt so:
Code:
[...]
Dim Tmax(2) As Byte
[...]
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
 Tmax(0) = CByte(TextBox6.Text)
 dc.writeBytes(libnodave.daveDB, 50, 96, 2, Tmax(0))
End Sub
[...]
Fehlermeldung:
Der Wert vom Typ "Byte" kann nicht in "1-dimensionales Array von Byte" konvertiert werden.

Kann es sein, dass ich
Code:
CByte(TextBox6.Text)
falsch behandle?

Mal ne Frage nebenbei: Mit 96 beschreibe ich doch einen DB ab Adresse +12.0 ?
 
Ich hab's dank euch hinbekommen!

Code:
[...]
Dim Tmax(1) As Byte
[...]
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
 Tmax(1) = TextBox6.Text
 dc.writeBytes(libnodave.daveDB, 50, 12, 2, Tmax)
End Sub
[...]
@Ruud: Tmax ohne die Klammer in writeBytes war schon mal ein guter Ansatz.
Ich musste noch
Code:
Tmax([B]1[/B]) = TextBox6.Text
anstatt
Code:
Tmax(0) = CByte(TextBox6.Text)
schreiben!

Trotzdem vielen Dank! *THUMPS UP*
 
Mir ist etwas komisches aufgefallen...

Schreibe ich
Code:
[...]
Dim Tmax(1) As Byte
[...]
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
 [B]Tmax(1)[/B] = TextBox6.Text
 dc.writeBytes(libnodave.daveDB, 50, 12, 2, Tmax)
End Sub
[...]
so wird nur maximal ein Byte behandelt.
D.h. wenn ich in meine Textbox einen Wert größer 127 schreibe, dann bricht das Programm mit der Fehlermeldung "Division durch 0 unzulässig." ab.

Schreibe ich stattdessen
Code:
[...]
Dim Tmax(1) As Byte
[...]
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
 [B]Tmax(0)[/B] = TextBox6.Text
 dc.writeBytes(libnodave.daveDB, 50, 12, 2, Tmax)
End Sub
[...]
wird bei einer "1" in der Textbox der Wert 256 an den DB geschickt.
Bei einer "2" der Wert 512 etc.

Meine Lösung funktioniert zwar, aber die ist nicht zufriedenstellend.
Ich denke, ich muss den Integerwert aus der Textbox in zwei einzelne Byte aufteilen, oder sehe ich das falsch?
Wenn ja, dann wie? Ich bin kein VB.net-Experte...

Ich glaube nicht, dass ich der einzige mit diesem Problem sein werde.
Aber irgendwie drehe ich mich im Kreis...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Möglichkeit besteht darin, den Text aus der Textbox zu nehmen, in eine Int zu wandeln (ist ja eigentlich String oder?).

1. die Int div 256, das Ergebnis in Tmax(0)
2. die Int mod 256, dadurch erhältst du den Rest, diesen dann in Tmax(1) eintragen.

PS: Könnte sein, daß du Tmax(0) und Tmax(1) vertauschen mußt.

Es gibt auch noch wesentlich elegantere Lösungen, aber ich weiß nicht, ob VB.Net das mitmacht!
 
Hi, poppycock, ich geb da jetzt auch mal noch meinen Senf dazu :ROFLMAO:

hab leider grad nix zum testen hier, deshalb alles ungetestet

folgender kleiner Einzeiler sollte funktionieren
Code:
dc.writeBytes(libnodave.daveDB, 50, 12, 2, BitConverter.GetBytes(CInt(TextBox6.Text)))

wenn dann nur Müll in der SPS ankommt, musst du die Bytes nochmal vertauschen, was folgendermassen aussehen könnte
Code:
dc.writeBytes(libnodave.daveDB, 50, 12, 2, BitConverter.GetBytes(libnodave.daveSwapIed_16(CInt(TextBox6.Text))))
 
F u n k t i o n i e r t !

Hi MW,

vielen Dank für den erstklassigen Tipp!

Ich musste die Bytes tauschen, funktioniert prima mit deinem Codeschnippsel:
Code:
dc.writeBytes(libnodave.daveDB, 50, 12, 2, BitConverter.GetBytes(libnodave.daveSwapIed_16(CInt(TextBox6.Text))))
Dieser Code (Einzeiler, ohne zusätzliche Definitionen) ist getestet und funktioniert!

Gruß und danke,
poppycock
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das haben "wir" mit keypress.event abgesichert :cool:
*ACK* Jepp, das haben "wir"!

Aber ich habe das trotzdem für Human getestet und im Anhang ist das Ergebnis.
Das Programm bricht mit einem Fehler ab!
Klickt man aber auf Weiter, wird abc nicht übernommen!
 

Anhänge

  • abc_int.JPG
    abc_int.JPG
    45,3 KB · Aufrufe: 21
das würd ich so aber auch nich abnehmen ;)

dann doch lieber ne exeception werfen oder einfach ne msgbox mit "nicht erlaubter eingabe"
 
Also die .NET-Exceptions sind schon immer wieder interessant... hat da eigentlich mal einer den kompletten Text gelesen? *ROFL*
 
Zurück
Oben