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



## poppycock (9 Juni 2009)

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


----------



## doublecee (10 Juni 2009)

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|


----------



## poppycock (10 Juni 2009)

doublecee schrieb:


> 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.*


```
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


----------



## doublecee (10 Juni 2009)

```
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?


----------



## poppycock (10 Juni 2009)

doublecee schrieb:


> ```
> 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?


----------



## Ruud (10 Juni 2009)

Dim buffer(2) As Byte
buffer(0) = cbyte(iValue)

dc.writeBytes(libnodave.daveDB, 50, 96, 2, buffer(0))


----------



## poppycock (10 Juni 2009)

Danke,

aber irgendwas haut noch immer nicht hin. Ich habs jetzt so:

```
[...]
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
	
	



```
CByte(TextBox6.Text)
```
falsch behandle?

Mal ne Frage nebenbei: Mit 96 beschreibe ich doch einen DB ab Adresse +12.0 ?


----------



## Human (10 Juni 2009)

> Mal ne Frage nebenbei: Mit 96 beschreibe ich doch einen DB ab Adresse +12.0 ?


Nö, da schreibst du auf das Byte 96, das ist nur bei writeBits so!


----------



## Ruud (10 Juni 2009)

Probier mal Tmax ohne die hacken


----------



## poppycock (10 Juni 2009)

Ich hab's dank euch hinbekommen!


```
[...]
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

```
Tmax([B]1[/B]) = TextBox6.Text
```
anstatt

```
Tmax(0) = CByte(TextBox6.Text)
```
schreiben!

Trotzdem vielen Dank! *THUMPS UP*


----------



## poppycock (11 Juni 2009)

Mir ist etwas komisches aufgefallen...

Schreibe ich

```
[...]
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

```
[...]
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...


----------



## Ralle (11 Juni 2009)

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!


----------



## MW (13 Juni 2009)

Hi, poppycock, ich geb da jetzt auch mal noch meinen Senf dazu 

hab leider grad nix zum testen hier, deshalb alles ungetestet

folgender kleiner Einzeiler sollte funktionieren

```
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

```
dc.writeBytes(libnodave.daveDB, 50, 12, 2, BitConverter.GetBytes(libnodave.daveSwapIed_16(CInt(TextBox6.Text))))
```


----------



## poppycock (13 Juni 2009)

*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:

```
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


----------



## Human (13 Juni 2009)

Und was passiert wenn da mal einer in die Textbox abc reinschreibt?


----------



## Rainer Hönle (13 Juni 2009)

Human schrieb:


> Und was passiert wenn da mal einer in die Textbox abc reinschreibt?



Das gibt dann wahrscheinlich eine Exception ..


----------



## doublecee (13 Juni 2009)

das haben "wir" mit keypress.event abgesichert 

ich war ja für 
	
	



```
Throw New Exception(DAU)
```
 

greetz m3nd|


----------



## poppycock (13 Juni 2009)

doublecee schrieb:


> das haben "wir" mit keypress.event abgesichert


*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!


----------



## doublecee (14 Juni 2009)

das würd ich so aber auch nich abnehmen 

dann doch lieber ne exeception werfen oder einfach ne msgbox mit "nicht erlaubter eingabe"


----------



## Human (14 Juni 2009)

Also die .NET-Exceptions sind schon immer wieder interessant... hat da eigentlich mal einer den kompletten Text gelesen? *ROFL*


----------



## doublecee (14 Juni 2009)

hab ich ma gemacht *ROFL*


...naja wers braucht


----------

