# Libnodave - writebits - Verständnisproblem



## MW (13 Juni 2008)

Ich hab da (mal wieder) ein kleines Problem

folgender Code

```
Dim a As Integer = 1
                    Dim aa(0) As Byte
                    aa(0) = 1
                    res = dc.writeBits(libnodave.daveDB, 123, 4, 1, aa)
                    res = dc.writeBits(libnodave.daveDB, 123, 3, 1, BitConverter.GetBytes(libnodave.daveSwapIed_32(a)))
```
liefert mir bei beiden Schreibbefehlen eine 0 zurück, doch gesetzt wird nur das bit 0.4 in dem DB. 
Der zweite Schreibbefehl steht so in der testMPI.cs und sollte ja funktionieren.

Könnte mir jemand sagen welche die richtige schreibweise ist, den scheinbar funktioniert ja nur die erste und die die im Beispiel in der TestMPI.cs aufgeführt ist nicht.

wenn bei der startadresse eine 4 steht ist doch das Bit 0.4 gemeint oder lieg ich da falsch ?

Sprache ist übrigens VB.net


----------



## Zottel (14 Juni 2008)

MW schrieb:


> Ich hab da (mal wieder) ein kleines Problem
> 
> folgender Code
> 
> ...


Echt? So und nicht anders? Das wäre ein bischen skandalös!
Wenn du auf einer little endian Maschine
Dim a As Integer = 1
schreibst und dein Compiler mit 32 Bit Integer arbeitet, steht im Speicher:
0x01 0x00 0x00 0x00
Jetzt macht 
daveSwapIed_32(a) daraus:
0x00 0x00 0x00 0x01
writebits setzt das Bit auf 1 wenn das erste Byte im Puffer ungleich 0 (oder war es >0) ist. Hier ist es jedenfalls 0.


MW schrieb:


> Könnte mir jemand sagen welche die richtige schreibweise ist, den scheinbar funktioniert ja nur die erste und die die im Beispiel in der TestMPI.cs aufgeführt ist nicht.


Die Schreibweise ist schon in Ordnung. Dein Problem ist, daß du einen 32-Bit-Wert übergibst, wo nur ein Byte erwartet wird.
Im 1. Fall
res = dc.writeBits(libnodave.daveDB, 123, 4, 1, aa)
funktioniert es, weil du von dem glücklichen Zufall profitierst, daß in little endian Zahlen verschiedener Länge mit dem gleichen Bitmuster beginnen:
0x01 0x00 0x00 0x00 = 1(32bit)
0x01 0x00 = 1(16bit)
0x01 = 1(8bit)


MW schrieb:


> wenn bei der startadresse eine 4 steht ist doch das Bit 0.4 gemeint...


Ja. Und bevor noch wer fragt: Das Bit 47.1 würde durch die Startadresse 47*8+1 = 377 adressiert.


----------



## MW (14 Juni 2008)

Danke Zottel



Zottel schrieb:


> Echt? So und nicht anders? Das wäre ein bischen skandalös!


 
hier ca. Zeile 500

```
[SIZE=2]a=1;[/SIZE]
[SIZE=2][COLOR=#008080]Console[/COLOR][/SIZE][SIZE=2].WriteLine([/SIZE][SIZE=2][COLOR=#800000]"Trying to set single bit E0.5\n"[/COLOR][/SIZE][SIZE=2]);[/SIZE]
[SIZE=2]res=dc.writeBits(libnodave.daveOutputs, 0, 5, 1, [/SIZE][SIZE=2][COLOR=#008080]BitConverter[/COLOR][/SIZE][SIZE=2].GetBytes(libnodave.daveSwapIed_32(a)));[/SIZE]
```
 




Zottel schrieb:


> Wenn du auf einer little endian Maschine
> Dim a As Integer = 1
> schreibst und dein Compiler mit 32 Bit Integer arbeitet, steht im Speicher:
> 0x01 0x00 0x00 0x00
> ...


 
MIST !!!, und wieder war der Fehler vor dem PC zufinden, wie kamm ich eigentlich darauf, dass das erste Byte rechts steht ??? vermutlich weils bei der SPS so ist (zumindest bei den Zahlen) ?? :sad: 



Zottel: kannst du die beiden kleinen Funktionen "daveclrbit" und "davesetbit" bei einer der nächsten Versionen von Libnodave auch noch in die Net.DLL reinnehmen ??


----------



## Ruud (15 Juni 2008)

Mann Kann das auch direct in vb.net machen.
Ohne die net.dll

Beispiel:
Private Declare Function daveClrBit Lib "libnodave.dll" (ByVal dc As Integer, ByVal area As Integer, ByVal areaNumber As Integer, ByVal start As Integer, ByVal bitAddress As Integer) As Integer

Private Declare Function daveSetBit Lib "libnodave.dll" (ByVal dc As Integer, ByVal area As Integer, ByVal areaNumber As Integer, ByVal start As Integer, ByVal bitAddress As Integer) As Integer

gruss Ruud


----------



## rebbi (1 Oktober 2008)

Hi zusammen! 

Trotz aller Erklärungen von Zottel in diesem Thread ists mir nicht gelungen, das Bit an Stelle 100.1 zu setzen.

Ich versuchs mit folgendem Befehl:


```
result = dc.writeBits(libnodave.daveDB, 50, 801, 1, BitConverter.GetBytes(libnodave.daveSwapIed_32(readyStored)));
```
Wobei ich's jeweils schon mit

```
int readyStored = 0x01;
int readyStored = 1;
byte readyStored = 1;
```
probiert hab. 

Und leider findet sich weder in der Doku noch in den Testprogrammen (ausser eben TestMPI) näheres dazu.

Irgendwie hab ich glaub ich die Vorgehensweise noch nicht ganz verstanden, sonst müsst ich von selbst drauf kommen - oder? 


mfG Andi


----------



## Zottel (1 Oktober 2008)

Laß mal den BitConverter-Stuß und swapIed() weg! Hier gibt's eh nur ein Bit! Und wo das beim swappen hinswappt habe ich weiter oben ausgeführt!

result = dc.writeBits(libnodave.daveDB, 50, 801, 1, 1);
oder auch:
result = dc.writeBits(libnodave.daveDB, 50, 801, 1, 127);
und vielleicht auch:
result = dc.writeBits(libnodave.daveDB, 50, 801, 1, 128 );
 result = dc.writeBits(libnodave.daveDB, 50, 801, 1, 255);
solten dein Bit setzen, während:
 result = dc.writeBits(libnodave.daveDB, 50, 801, 1, 0);
Es löschen sollte.


----------



## rebbi (2 Oktober 2008)

Wunderbar, Danke für deine Hilfe & Geduld! 


*Tante Edith meint:

Hier noch die "komplette" Lösung, falls später noch jemand das selbe Problem und ebenfalls n Brett vorm Kopf hat:


```
byte[] readyStored = new byte[1];
readyStored[0] = 1;
result = dc.writeBits(libnodave.daveDB, 50, 801, 1, readyStored);
```


----------

