# Lesen von Bool mit lebnodave



## tflueckiger (23 Juli 2010)

Hallo allerseits

Ich versuche gerade bit Werte (boolean) mit libnodave aus einer Samatic S7 zu lesen. Hier ein Ausschnitt aus der Deklarationssicht:










Wenn ich nun einen Wert, wie Notöffnung_Wehrklappe (10.0) lesen will, dann scheint das zu klappen. Sobald das aber z.B. Licht_Ein (9.7) sein soll, so klappt dies nicht mehr. In der Methode ReadBits wird folgendes erwartet:
- int area: hier setze ich den Wert libnodave.daveDB, da ich aus den Datenbausteinen lesen will
- int DBNummer: hier gebe ich 50 mit, da es sich offenbar um die DB50 handelt (sihe Screenshot)
- int start: hier gebe ich den Wert vor dem Komma (Punkt) aus der ersten Tabellenspalte an.
- int len: hier gebe ich immer 1 mit. Könnte mir vorstellen, dass hier der Hund begraben liegt.
- byte[] buffer: hier gebe ich folgenden byte Array mit: byte[] buffer = new byte[1] bzw. new byte[4] bei REAL.


Wenn nach dem Komma nun eine 0 ist, wie in den Fällen mit REAL, dann kann ich den Wert auslesen. Was muss ich jedoch machen, wenn ich hiter dem Komma noch Werte habe? Wo muss ich diese angeben, bzw. wie muss ich readyBits aufrufen, damit ich auch Addressen mit Kommawerten auslesen kann.
Ich entwickle übrigens mit C#. Hier meine Methode:


```
[FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]
[SIZE=2][FONT=Consolas][COLOR=#0000ff]public[/COLOR][/FONT][/SIZE][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]bool[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] ReadDbBool([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] dbNumber, [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] address, [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] speicherbereich = 0)[/SIZE][/FONT]
[SIZE=2][FONT=Consolas]{[/FONT][/SIZE]
[/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] (speicherbereich == 0) speicherbereich = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]libnodave[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].daveDB;[/SIZE][/FONT]
[/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]byte[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][] buffer = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]byte[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][1];[/SIZE][/FONT]
[/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] errorCode = dc.readBits(speicherbereich, dbNumber, address, 1, buffer);[/SIZE][/FONT]
[/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] (errorCode != 0)[/SIZE][/FONT]
[SIZE=2][FONT=Consolas]{[/FONT][/SIZE]
[SIZE=2][FONT=Consolas]ThrowSpsException([/FONT][/SIZE][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"ReadDbBool"[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2], errorCode: errorCode);[/SIZE][/FONT]
[SIZE=2][FONT=Consolas]}[/FONT][/SIZE]
[/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]BitConverter[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].ToBoolean(buffer, 0);[/SIZE][/FONT]
[SIZE=2][FONT=Consolas]}[/FONT][/SIZE]
[/SIZE][/FONT]
```


----------



## Jochen Kühner (23 Juli 2010)

Normal liest man immer ein Byte und maskiert dann das Bit das man braucht! Da ein Bit lesen genausoviel komunkiationslast verursacht wie ein byte


----------



## Jochen Kühner (23 Juli 2010)

Oder du probierst's mit meiner Wrapper Lib für libnodave...


----------



## tflueckiger (23 Juli 2010)

Hallo Jochen

Wenn ich deinen wrapper verwende, dann muss ich ja für die Abfrage ein LibnoDaveValue erzeugen. Ich mache das jeweils so:

```
[FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]
LibNoDaveValue[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] value = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]LibNoDaveValue
[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]{
LibNoDaveDataSource = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]LibNoDaveDataSource[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].Datablock,
DatablockNumber = dbNummer,
ByteAddress = address
};
[/SIZE][/FONT][/SIZE][/FONT]
```
In meinem Beispiel ist dbNummer wieder 50 und ByteAdress verlangt einen Integer. Wie soll ich aber aus der Adresse 9.7 (siehe erstes Posting) einen Integer erzeugen?


----------



## Jochen Kühner (23 Juli 2010)

Es gibt noch Bit Adress! Und auch Bool als Typ musst du noch festlegen...


----------



## MW (23 Juli 2010)

tflueckiger schrieb:


> Wenn nach dem Komma nun eine 0 ist, wie in den Fällen mit REAL, dann kann ich den Wert auslesen. Was muss ich jedoch machen, wenn ich hiter dem Komma noch Werte habe? Wo muss ich diese angeben, bzw. wie muss ich readyBits aufrufen, damit ich auch Addressen mit Kommawerten auslesen kann.
> Ich entwickle übrigens mit C#. Hier meine Methode:
> 
> 
> ...



Welchen Wert ergibst du deiner Funktion bei "address" ?
Wenn ich es richtig in erinnerung habe, muss man bei der readbits Funktion die Startadresse als Bitwert übergeben, also musst du wenn du die Addresse 10.0 auslesen willst die Zahl 80 übergeben bzw. bei der Addresse 9.7 eine 79 (Byteadresse *8 + Bitaddresse). 
Dann sollte deine Funktion auch funktionieren


----------



## tflueckiger (23 Juli 2010)

Hallo MW
Danke für den Input. Tönt eigentlich logisch. Problem ist nur, dass ich den Wert an z.B. Adresse 12.0 (siehe Screenshot "Leistung") auslesen kann, indem ich einfach folgendes aufrufe (ohne Multiplikation mit 8):

```
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]byte[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][] buffer = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]byte[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][4];
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] errorCode = dc.readBytes([COLOR=#2b91af]libnodave[/COLOR][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].daveDB[/SIZE][/FONT][/SIZE][/FONT], 50, 12, 4, buffer);
[/SIZE][/FONT][/SIZE][/FONT]
```
Oder gibt es einen Unterschied zwischen ReadBites und ReadBytes?

Wobei wenn ich so überlege könnte das natürlich genau der Unterschied sein... Wäre irgendwie noch logisch. Werde das nächste Woche mal versuchen.


----------



## MW (23 Juli 2010)

tflueckiger schrieb:


> Wobei wenn ich so überlege könnte das natürlich genau der Unterschied sein... Wäre irgendwie noch logisch. Werde das nächste Woche mal versuchen.



Ja, genau das ist der Unterschied ;-)


(Bei int-, Real- Werten usw. muss man ja keine Bit-Adressen adressieren, den diese beginnen immer mit ??.0, also wäre es da auch unlogisch wenn man diese erst umrechnen müsste)


----------



## Jochen Kühner (23 Juli 2010)

*Ja*

Warum denn Überhaupt nur Bits lesen, und nicht das Byte?


----------



## tflueckiger (17 August 2010)

So hallo zusammen

Wollte mich nun kurz rückmelden. Hat also geklappt mit dem Lesen der Bits und der Multiplikation der Adresse. Vielen Dank MW!

Gruss Thomas


----------

