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

Ergebnis 1 bis 10 von 10

Thema: Lesen von Bool mit lebnodave

  1. #1
    Registriert seit
    10.05.2010
    Beiträge
    28
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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:

    Code:
    
    publicbool ReadDbBool(int dbNumber, int address, int speicherbereich = 0)
    {
    if (speicherbereich == 0) speicherbereich = libnodave.daveDB;
    byte[] buffer = newbyte[1];
    int errorCode = dc.readBits(speicherbereich, dbNumber, address, 1, buffer);
    if (errorCode != 0)
    {
    ThrowSpsException("ReadDbBool", errorCode: errorCode);
    }
    returnBitConverter.ToBoolean(buffer, 0);
    }
    
    Zitieren Zitieren Lesen von Bool mit lebnodave  

  2. #2
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    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
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  3. #3
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Oder du probierst's mit meiner Wrapper Lib für libnodave...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  4. #4
    tflueckiger ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.05.2010
    Beiträge
    28
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Jochen

    Wenn ich deinen wrapper verwende, dann muss ich ja für die Abfrage ein LibnoDaveValue erzeugen. Ich mache das jeweils so:
    Code:
    
    LibNoDaveValue value = newLibNoDaveValue
    {
    LibNoDaveDataSource = LibNoDaveDataSource.Datablock,
    DatablockNumber = dbNummer,
    ByteAddress = address
    };
    
    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?

  5. #5
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Es gibt noch Bit Adress! Und auch Bool als Typ musst du noch festlegen...
    Geändert von Jochen Kühner (17.08.2010 um 10:03 Uhr)
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  6. #6
    Registriert seit
    27.11.2005
    Ort
    im Osten
    Beiträge
    1.183
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Standard

    Zitat Zitat von tflueckiger Beitrag anzeigen
    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:

    Code:
    
    publicbool ReadDbBool(int dbNumber, int address, int speicherbereich = 0)
    {
    if (speicherbereich == 0) speicherbereich = libnodave.daveDB;
    byte[] buffer = newbyte[1];
    int errorCode = dc.readBits(speicherbereich, dbNumber, address, 1, buffer);
    if (errorCode != 0)
    {
    ThrowSpsException("ReadDbBool", errorCode: errorCode);
    }
    returnBitConverter.ToBoolean(buffer, 0);
    }
    
    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
    Geändert von MW (23.07.2010 um 17:17 Uhr)
    Es ist nicht schwierig, mit noch nicht erreichten Zielen zu Leben; schwierig ist, ohne Ziele zu Leben !
    (Günther Kraftschik)

  7. #7
    tflueckiger ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.05.2010
    Beiträge
    28
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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 :
    Code:
    
    byte[] buffer = newbyte[4];
    int errorCode = dc.readBytes(libnodave.daveDB, 50, 12, 4, buffer);
    
    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.

  8. #8
    Registriert seit
    27.11.2005
    Ort
    im Osten
    Beiträge
    1.183
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Standard

    Zitat Zitat von tflueckiger Beitrag anzeigen
    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)
    Es ist nicht schwierig, mit noch nicht erreichten Zielen zu Leben; schwierig ist, ohne Ziele zu Leben !
    (Günther Kraftschik)

  9. #9
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Warum denn Überhaupt nur Bits lesen, und nicht das Byte?
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren Ja  

  10. #10
    tflueckiger ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.05.2010
    Beiträge
    28
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Ähnliche Themen

  1. Byte to Bool in SCL
    Von paula23 im Forum Simatic
    Antworten: 22
    Letzter Beitrag: 04.05.2017, 11:46
  2. BOOL to WORD
    Von giro im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 10.07.2011, 16:49
  3. Bool und Byte
    Von Anaconda55 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 09.09.2008, 20:21
  4. Verwendung von BOOL
    Von Lipperlandstern im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 13.03.2008, 13:09
  5. BOOL-Zugriff auf ein BIT im DB
    Von noeppkes im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 02.10.2007, 11:51

Lesezeichen

Berechtigungen

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